%% Informations générales
%% Dernière modification le 2025-08-14 at 11:32 
\NeedsTeXFormat{LaTeX2e}[1999/01/01]%
\ProvidesPackage{cahierprof}%
[2025-08-14 v1.3 Les commandes pour le cahier Professeur]%
\def\cahierprofversion{1.3}%
\def\cahierprofdate{14 août 2025}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sommaire
% 0.1. Chargement des extensions
% 0.2. Options
% 0.3. Définition des compteurs
% 0.4. Commandes pour le calendrier
% 0.5. Commandes pour les jours spéciaux (rentrée, fériés, examens)
% 0.6. Commandes pour l'affichage de la semaine
% 1. Commandes pour l'emploi du temps
% 2. Commandes pour les tableaux des classes
% 3. Commandes pour la Liste des élèves
% 4. Au début du document 
% 5. À la fin du document 
% 6. Divers 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.1. Chargement des extensions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{tikz}%
  \usetikzlibrary{math}%  
  \usetikzlibrary{calc}%
\RequirePackage[babel=true,kerning=true]{microtype}%
\RequirePackage{nicematrix}%
\RequirePackage{ifthen}%
% \RequirePackage{xparse}%
\RequirePackage{xstring}%
\RequirePackage{listofitems}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.2. Options 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Option samedi pour un emploi du temps du lundi au samedi 
\newboolean{Samedi}%
\setboolean{Samedi}{false}%
\tikzmath{\LastDay=int(5);}%
\DeclareOption{samedi}{%
  \setboolean{Samedi}{true}%
  \tikzmath{\LastDay=int(6);}%
}%
\ProcessOptions%
% \setSamedi : Déclare le samedi dans l'emploi du temps.
\NewDocumentCommand \setSamedi{ }{%
  \setboolean{Samedi}{true}%
  \tikzmath{\LastDay=int(6);}%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.3. Définitions des compteurs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Compteurs day/month/year pour la date courante
\newcounter{day}%
\newcounter{month}%
\newcounter{year}%
%% Compteurs pour la rentrée
\newcounter{lundiRentree}%
\newcounter{monthRentree}%
\newcounter{yearRentree}%
%% Compteur pour la fin Février
\newcounter{FinFevrier}%
%% Compteurs pour les vacances scolaires
% Toussaint
\newcounter{dayToussaint}%
\newcounter{monthToussaint}%
\newcounter{dayToussaintFin}%
\newcounter{monthToussaintFin}%
% Noel
\newcounter{dayNoel}%
\newcounter{monthNoel}%
% Hiver
\newcounter{dayHiver}%
\newcounter{monthHiver}%
% Printemps
\newcounter{dayPrintemps}%
\newcounter{monthPrintemps}%
%% Compteurs pour les Jours Fériés 
\newcounter{dayPaques}%
\newcounter{monthPaques}%
\newcounter{dayAscension}%
\newcounter{dayAscensionPont}%
\newcounter{monthAscension}%
\newcounter{dayPentecote}%
\newcounter{monthPentecote}%
%% Compteurs pour les Examens
\newcounter{dayDNBDebut}%
\newcounter{dayDNBFin}%
\newcounter{monthDNB}%
\newcounter{dayBacDebut}%
\newcounter{dayBacFin}%
\newcounter{monthBac}%
\newcounter{dayBacPhilo}%
\newcounter{monthBacPhilo}%
\newcounter{dayBacFrancais}%
\newcounter{monthBacFrancais}%
\newcounter{dayGODebut}%
\newcounter{dayGOFin}%
\newcounter{monthGO}%
%% Compteurs pour le dernier jours de classe
\newcounter{dayFin}\setcounter{dayFin}{32}%
\newcounter{monthFin}\setcounter{monthFin}{13}%
%% Définition de compteurs pour gérer l'affichage de la semaine (\getWeek) 
\newcounter{dayRemember}%
\newcounter{monthRemember}%
\newcounter{yearRemember}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.4. Commandes pour le calendrier
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% - \nextday : pour passer au jour d'après
% - \weekend : pour passer les week-ends ou les vacances scolaires
% - \isFerie : Si le jour est férié alors le fond de la colonne est coloré
% - \isExamen: Si le jour est un jour d'examen, alors le fond de la colonne est coloré
% - \getdate : afficher la date au format day/month/year
% - \getWeek : afficher la semaine au format <Du Lundi au Vendredi/Samedi>
%%%% Passer au jour d'après
\NewDocumentCommand \nextday{ }{%
  % Les mois à 30 jours : Avril, Juin, Septembre, Novembre
  % Les mois à 31 jours : Janvier, Mars, Mai, Juillet, Août, Octobre, Décembre
  % Février à \theFinFevrier jours.
  \ifthenelse{%
      \(\theday=30 \and \(\themonth=4 \or \themonth=6 \or \themonth=9 \or \themonth=11\)\)%
  \or \(\theday=31 \and \(\themonth=1 \or \themonth=3 \or \themonth=5 \or \themonth=7 \or%
        \themonth=8 \or \themonth=10 \or\themonth=12\)\) %
  \or \(\theday=\theFinFevrier \and \themonth=2\)}%
  {% Si on est en décembre, on change d'année et month=1, day=1%
    \ifthenelse{\themonth=12}{%
      \stepcounter{year}%
      \setcounter{month}{1}%
      \setcounter{day}{1}%
    }{% Dans les autres cas, on change de mois et on recommence à day=1%
      \stepcounter{month}%
      \setcounter{day}{1}%
    }%
  }{% Sinon, on augmente juste le compteur jour%
    \stepcounter{day}%
  }%
}%
%%%% Gestions des vacances et week-end
\NewDocumentCommand \weekend{ }{%
  \ifthenelse{\theday=\thedayToussaint \and \themonth=\themonthToussaint}{%
    % Vacances de Toussaint : 15 jours de vacances, bien mérités !
    \foreach \jour in {1,...,16}{\nextday}%
    Vacances de la Toussaint%
  }{%
    \ifthenelse{\theday=\thedayNoel \and \themonth=\themonthNoel}{%
      % Vacances de Noël : 15 jours de vacances, bien mérités !
      \foreach \jour in {1,...,16}{\nextday}%
      Vacances de Noël%
    }{%
      \ifthenelse{\theday=\thedayHiver \and \themonth=\themonthHiver}{%
        % Vacances d'Hiver : 15 jours de vacances, bien mérités !
        \foreach \jour in {1,...,16}{\nextday}%
        Vacances d'hiver%
      }{%
        \ifthenelse{\theday=\thedayPrintemps \and \themonth=\themonthPrintemps}{%
          % Vacances de Printemps : 15 jours de vacances, bien mérités !
          \foreach \jour in {1,...,16}{\nextday}%
          Vacances de printemps%
        }{% sinon c'est juste un week-end
          \nextday\nextday%
        }%
      }%
    }%
  }%
}%
%%%% Gestion des jours fériés
\NewDocumentCommand \isFerie{ }{%
  \ifthenelse{% Jour de l'an, 1er janvier
        \(\theday=1 \and \themonth=1\)%
    \or% Lundi de Pâques
        \(\theday=\thedayPaques \and \themonth=\themonthPaques\)%
    \or% Fête du travail, le 1er mai
        \(\theday=1 \and \themonth=5\)%
    \or% Victoire 1945, le 8 mai
        \(\theday=8 \and \themonth=5\)%
    \or% Jeudi de l'ascension
        \(\theday=\thedayAscension \and \themonth=\themonthAscension\)%
    \or% Pont du vendredi de l'ascension
        \(\theday=\thedayAscensionPont \and \themonth=\themonthAscension\)%
    \or% Lundi de Pentecôte
        \(\theday=\thedayPentecote \and \themonth=\themonthPentecote\)%
    \or% Fête Nationale, le 14 juillet
        \(\theday=14 \and \themonth=7\)%
    \or% Assomption, le 15 août
        \(\theday=15 \and \themonth=8\)%
    \or% Toussaint, le 1er novembre
        \(\theday=1 \and \themonth=11\)%
    \or% Armistice 1914-1918, le 11 novembre
        \(\theday=11 \and \themonth=11\)%
    \or% Noël, le 25 décembre
      \(\theday=25 \and \themonth=12\)%
  }{% Si le jour est férié : la colonne est grisée
    % \Block[r]{1-1}{$\star$Ferié$\star$}%
    \columncolor{lightgray}%
  }{}%
}%
%%%% Gestion des jours d'examens 
\NewDocumentCommand \isExamen{ }{%
  \ifthenelse{% Les jours du DNB
    \(\theday=\thedayDNBDebut \or \theday>\thedayDNBDebut\)%
    \and\(\theday<\thedayDNBFin \or \theday=\thedayDNBFin\)%
    \and \themonth=\themonthDNB%
  }{% Couleur du fond de la colonne du DNB
    \bgDNB%
    % \Block[r]{1-1}{$\star$DNB$\star$}%
  }{}%
  \ifthenelse{% Les jours du Bac
    \(\theday=\thedayBacDebut \or \theday>\thedayBacDebut\)%
    \and\(\theday<\thedayBacFin \or \theday=\thedayBacFin\)%
    \and \themonth=\themonthBac%
  }{% Couleur du fond de la colonne du bac
    \bgBac%
    % \Block[r]{1-1}{$\star$Spé$\star$}%
  }{}%
  % Le jour du Bac Philo
  \ifthenelse{\theday=\thedayBacPhilo \and \themonth=\themonthBacPhilo%
  }{% Couleur du fond de la colonne du bac philo
    \bgBacPhilo% 
    % \Block[r]{1-1}{$\star$Philo$\star$}%
  }{}%
  % Le jour du Bac Français
  \ifthenelse{\theday=\thedayBacFrancais \and \themonth=\themonthBacFrancais%
  }{% Couleur du fond de la colonne Bac Français
    \bgBacFrancais%
    % \Block[r]{1-1}{$\star$EAF$\star$}
  }{}%
  % Les jours du GO
  \ifthenelse{%
    \(\theday=\thedayGODebut \or \theday>\thedayGODebut\)%
    \and\(\theday<\thedayGOFin \or \theday=\thedayGOFin\)%
    \and \themonth=\themonthGO%
  }{% Couleur du fond de la colonne du Grand Oral
    \bgGO%
    \Block[r]{1-1}{$\star$GO$\star$}%
  }{}%
}%
%%%% Obtenir la date dans la première ligne du tableau
\NewDocumentCommand \getDate{ }{%
  \theday/\themonth/\theyear% On affiche la date
  \isFerie%  Est-ce que le jour \theday/\themonth est férié?
  \isExamen% Est-ce que le jour \theday/\themonth est un jour d'examen?
}%
%%%% Affichage de la semaine.
\NewDocumentCommand \getWeek{ }{%
  \setcounter{dayRemember}{\theday}%
  \setcounter{monthRemember}{\themonth}%
  \setcounter{yearRemember}{\theyear}%
  Du lundi \theday{}
  \IfStrEqCase{\themonth}{%
    {1}{janvier}%
    {2}{Février}%
    {3}{mars}%
    {4}{avril}%
    {5}{mai}%
    {6}{juin}%
    {7}{juillet}%
    {8}{août}%
    {9}{septembre}%
    {10}{octobre}%
    {11}{novembre}%
    {12}{décembre}%
  }\space\theyear{}
  au 
  \nextday\nextday\nextday\nextday%
  \ifthenelse{\boolean{Samedi}}{samedi\nextday}{vendredi}
  \theday{}
  \IfStrEqCase{\themonth}{%
    {1}{janvier}%
    {2}{Février}%
    {3}{mars}%
    {4}{avril}%
    {5}{mai}%
    {6}{juin}%
    {7}{juillet}%
    {8}{août}%
    {9}{septembre}%
    {10}{octobre}%
    {11}{novembre}%
    {12}{décembre}%
  }\space\theyear
  \setcounter{day}{\thedayRemember}%
  \setcounter{month}{\themonthRemember}%
  \setcounter{year}{\theyearRemember}%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.5. Commandes pour les jours spéciaux (rentrée, fériés, examens)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% - \setLundiRentree   : définir le lundi de rentrée au format DD-MM-YYYY
% - \setDebutToussaint : définir le début (samedi) des vacances de Toussaint
% - \setDebutNoel      : définir le début (samedi) des vacances de Noel
% - \setDebutHiver     : définir le début (samedi) des vacances d'hiver
% - \setDebutPrintemps : définir le début (samedi) des vacances de Printemps
% - \setLundiPaques    : définir le lundi de Pâques au format DD-MM
% - \setJoursFeries    : définir les dates de l'ascension, du pont de
%                        l'ascension et de la Pentecôte à partir de la date
%                        du lundi de Pâques.
% - \setDNB            : Définir les dates de début et fin des épreuves du DNB
% - \setBac            : Définir les dates de début et fin des épreuves du Bac 
% - \setBacPhilo       : Définir le jour du Bac philo
% - \setBacFrancais    : Définir le jour du Bac français
% - \setGO             : Définir les dates de début et fin du Grand Oral
%%%% Définir le lundi de la rentrée
\NewDocumentCommand \setLundiRentree{ m m m }{%
  % #1 = Le jour ;  #2 = Le mois ; #3 = L'année de la rentrée
  \setcounter{lundiRentree}{#1}%
  \setcounter{monthRentree}{#2}%
  \setcounter{yearRentree}{#3}%
  % Gestion des années bissextiles.
  \setcounter{year}{\theyearRentree}%
  % Si la rentrée est après la fin de Février, alors on prend en compte l'année suivante.
  \ifthenelse{\themonthRentree>2}{\stepcounter{year}}{}%
  % Est-ce que l'année est bissextile?%
  \pgfmathparse{int(mod(\theyear,4))}%
  \ifthenelse{\pgfmathresult>0}{%
    % if (year is not divisible by 4) then (it is a common year)%
    \setcounter{FinFevrier}{28}%
  }{% else if (year is not divisible by 100) then (it is a leap year)%
    \pgfmathparse{int(mod(\theyear,100))}%
    \ifthenelse{\pgfmathresult>0}{%
      \setcounter{FinFevrier}{29}%
    }{% else if (year is not divisible by 400) then (it is a common year)%
      \pgfmathparse{int(mod(\theyear,400))}%
      \ifthenelse{\pgfmathresult>0}{%
        \setcounter{FinFevrier}{28}%
      }{% else (it is a leap year)%
        \setcounter{FinFevrier}{29}%
      }%
    }%
  }%
}%
%%%% Définir le début des vacances de Toussaint, de noël, d'hiver et de printemps
\NewDocumentCommand \setDebutToussaint{ m m }{%
  % #1 = Le jour (samedi) des vacances ;  #2 = Le mois des vacances
  \setcounter{dayToussaint}{#1}%
  \setcounter{monthToussaint}{#2}%
}%
%%%% Définir le début des vacances de Noel
\NewDocumentCommand \setDebutNoel{ m m }{%
  % #1 = Le jour (samedi) des vacances ;  #2 = Le mois des vacances
  \setcounter{dayNoel}{#1}%
  \setcounter{monthNoel}{#2}%
}%
%%%% Définir le début des vacances d'hiver
\NewDocumentCommand \setDebutHiver{ m m }{%
  % #1 = Le jour (samedi) des vacances ;  #2 = Le mois des vacances
  \setcounter{dayHiver}{#1}%
  \setcounter{monthHiver}{#2}%
}%
%%%% Définir le début des vacances de Printemps
\NewDocumentCommand \setDebutPrintemps{ m m }{%
  % #1 = Le jour (samedi) des vacances ;  #2 = Le mois des vacances
  \setcounter{dayPrintemps}{#1}%
  \setcounter{monthPrintemps}{#2}%
}%
%%%% Définir le Lundi de Pâques
\NewDocumentCommand \setLundiPaques{ m m }{%
  % #1 = Le jour ;  #2 = Le mois du lundi de Pâques. 
  \setcounter{dayPaques}{#1}%
  \setcounter{monthPaques}{#2}%
}%
%%%% Calculer les dates des jours fériés variables (Pâques, Ascension, Pentecôte)
\NewDocumentCommand \setJoursFeries{ }{%
  \ifthenelse{\thedayPaques=0}{% Si le lundi de Pâques n'est pas défini.
    \setcounter{year}{\theyearRentree}%
    \stepcounter{year}%
    % Calcul du Dimanche de Pâques, par la méthode de Butcher-Meeus.
    \tikzmath{%
      \n=int(mod(\theyear,19));           % cycle de Méton
      \cc=int(div(\theyear,100));         % centaine l'année
      \u=int(mod(\theyear,100));          % rang de l'année
      \s=int(div(\cc,4));                 % siècle bissextile
      \t=int(mod(\cc,4));                 % siècle bissextile
      \p=int(div(\cc+8,25));              % cycle de proemptose
      \q=int(div(\cc-\p+1,3));            % proemptose
      \e=int(mod(19*\n+\cc-\s-\q+15,30)); % épacte
      \b=int(div(\u,4));                  % année bissextile
      \d=int(mod(\u,4));                  % année bissextile
      \LL=int(mod(2*\t+2*\b-\e-\d+32,7)); % lettre dominicale
      \h=int(div(\n+11*\e+22*\LL,451));   % correction
      \m=int(div(\e+\LL-7*\h+114,31));    % mois du dimanche de Pâques
      \j=int(mod(\e+\LL-7*\h+114,31)+1);  % jour du dimanche de Pâques
    }%
    % Dimanche de Pâques
    \setcounter{day}{\j}%
    \setcounter{month}{\m}%
    % lundi de Pâques, immédiatement après le dimanche de Pâques.
    \nextday%
    \setcounter{dayPaques}{\theday}%
    \setcounter{monthPaques}{\themonth}%
  }{}
  % Jeudi de l'ascension = 38 jours après le lundi de Pâques
  \foreach \jour in {1,...,38}{\nextday}%
  \setcounter{dayAscension}{\theday}%
  \setcounter{monthAscension}{\themonth}%
  % Vendredi, pont de l'ascension
  \nextday%
  \setcounter{dayAscensionPont}{\theday}%
  % Lundi de Pentecôte = 10 jours après le vendredi de l'ascension
  \foreach \jour in {1,...,10}{\nextday}%
  \setcounter{dayPentecote}{\theday}%
  \setcounter{monthPentecote}{\themonth}%
  % Remettre la date au jour de la rentrée
  \setcounter{day}{\thelundiRentree}%
  \setcounter{month}{\themonthRentree}%
  \setcounter{year}{\theyearRentree}%
}%
%%%% Définir le début et la fin du DNB 
\NewDocumentCommand \setDNB{ O{lightgray} m m m }{%
  % #1 = couleur du fond ; #2 = jour début ; #3 = jour fin ; #4 = mois
  \def\bgDNB{\columncolor{#1}}%
  \setcounter{dayDNBDebut}{#2}%
  \setcounter{dayDNBFin}{#3}%
  \setcounter{monthDNB}{#4}%
}%
%%%% Définir le jour du Bac Français 
\NewDocumentCommand \setBacFrancais{ O{lightgray} m m }{%
  % #1 = couleur du fond ; #2 = jour ; #3 = mois 
  \def\bgBacFrancais{\columncolor{#1}}%
  \setcounter{dayBacFrancais}{#2}%
  \setcounter{monthBacFrancais}{#3}%
}%
%%%% Définir le jour du Bac Philo 
\NewDocumentCommand \setBacPhilo{ O{lightgray} m m }{%
  % #1 = couleur du fond ; #2 = jour ; #3 = mois 
  \def\bgBacPhilo{\columncolor{#1}}%
  \setcounter{dayBacPhilo}{#2}%
  \setcounter{monthBacPhilo}{#3}%
}%
%%%% Définir le début et la fin du Bac 
\NewDocumentCommand \setBac{ O{lightgray} m m m }{%
  % #1 = couleur du fond ; #2 = jour début ; #3 = jour fin ; #4 = mois
  \def\bgBac{\columncolor{#1}}%
  \setcounter{dayBacDebut}{#2}%
  \setcounter{dayBacFin}{#3}%
  \setcounter{monthBac}{#4}%
}%
%%%%%%% Définir le début et la fin du Grand Oral 
\NewDocumentCommand \setGO{ O{lightgray} m m m }{%
  % #1 = couleur du fond ; #2 = jour début ; #3 = jour fin ; #4 = mois
  \def\bgGO{\columncolor{#1}}%
  \setcounter{dayGODebut}{#2}%
  \setcounter{dayGOFin}{#3}%
  \setcounter{monthGO}{#4}%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 0.6. Commandes pour l'affichage de la semaine
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \Semaine : afficher la première ligne du tableau du cahier de texte de la
% forme Lundi day/month, Mardi day/month, etc.
\NewDocumentCommand \Semaine{ }{%
  & Lundi \getDate\nextday%
  & Mardi \getDate\nextday%
  & Mercredi \getDate\nextday%
  & Jeudi \getDate\nextday%
  & Vendredi \getDate\nextday%
  \ifthenelse{\boolean{Samedi}}{& Samedi\ \getDate}{}%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 1. Commandes pour l'emploi du temps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% - \setNombreSemaines : définir le nombre N de semaines à afficher.
% - \EmploiDuTemps     : afficher N fois le tableau hebdomadaire.
% - \Sem               : Séances bimensuelle.
% - \DeuxH             : Bloc de 2h de cours.
% - \Heures            : Bloc de plusieures heures de cours.
% - \TP                : Bloc de 1h30 de cours.
%%% Nombre de semaine à afficher 
% Par défaut on affiche 36 semaines.
\tikzmath{\NbSem=int(36);}%
% Si on définit \setNombreSemaines, alors on affiche #1 semaine.
\NewDocumentCommand \setNombreSemaines{ m }{%
  \tikzmath{\NbSem=int(#1);}%
}%
%%%% Affichage de l'emploi du temps
\NewDocumentCommand \EmploiDuTemps{ m }{%
  % #1 = Tableau hebdomadaire
  \foreach \n in {1,...,\NbSem}{%
    {\Large\textsc{Semaine \n{} --- \getWeek}}%
    \vfil%
    \begin{NiceTabularX}{\linewidth}{l||*{\LastDay}{X}}[hvlines]%
      \CodeBefore [create-cell-nodes]
      \Body
      \Semaine \\%
      #1%
    \end{NiceTabularX}%
    \vfil%
    \hfil \weekend \hfil%
    \newpage%
  }%
}%
%%%% Séances bimestrielles
\NewDocumentCommand \Sem{ m m }{%
  % #1 = Contenu de la semaine impair ; #2 = contenu de la semaine paire
  \pgfmathparse{int(mod(\n,2))}%
  \ifthenelse{\pgfmathresult=1}{#1}{#2}%
}%
%%%% Heures de cours multiples 
% Bloc de 2h. 
\NewDocumentCommand \DeuxH{ m }{%
  % #1 = Contenu des 2h de cours.
  \Block[t,l]{2-1}{#1}%
}%
% Bloc de plusieurs heures 
\NewDocumentCommand \Heures{ m m }{%
  % #1 = Nombre d'heures du bloc ; #2 = Contenu du bloc.
  \Block[t,l]{#1-1}{#2}%
}%
% Bloc de 1h30
\ExplSyntaxOn%
\cs_new_protected:Nn \__filet_fin:nn{ % Filet au bout de 1h30
  \tikz \draw%
  (\fp_eval:n{#1+1.5} -| #2) -- (\fp_eval:n{#1+1.5} -| \int_eval:n{#2+1});%
}%
\NewDocumentCommand \FiletFin{ }{% Filet au bout de 1h30.
  \tl_gput_right:Nx \g_nicematrix_code_before_tl{%
    \__filet_fin:nn{\arabic{iRow}}{\arabic{jCol}}%
  }%
}%
\cs_new_protected:Nn \__filet_demi:nnn{% Filet au bout de 30 min
  \tikz \draw%
  (\fp_eval:n{#1+.5} -| #2) -- (\fp_eval:n{#1+.5} -| \int_eval:n{#2+1}) ;%
  % Nom de la classe à la demi.
  \tikz \draw (\fp_eval:n{#1+.5} -| #2) node[below=5.5pt,right=2.5pt]{#3};%
}%
\NewDocumentCommand \FiletDemi{ m }{% Filet à 30 min
  % #1 = Nom de la classe.
  \tl_gput_right:Nx \g_nicematrix_code_before_tl{%
    \__filet_demi:nnn{\arabic{iRow}}{\arabic{jCol}}{\exp_not:n{#1}}%
  }%
}%
\ExplSyntaxOff%
\NewDocumentCommand \TP{ s m }{%
  % #1 = star : TP à la demi heure ; #2 = nom de la classe
  \IfBooleanTF{#1}{%
    \Block[t,l]{2-1}{}%
    \FiletDemi{#2}%
  }{%
    \Block[t,l]{2-1}{#2}%
    \FiletFin{}%
  }%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2. Commandes pour les tableaux des classes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% - \setFinCours       : Fixe la fin des cours
% - \setNombreColonnes : Le nombre de colonne par tableau de classe.
% - \Classe            : Afficher les tableaux de classe.
%%%%% Fixer la fin des cours
\NewDocumentCommand \setFinCours{ m m }{%
  % #1 = jour ; #2 = mois de la fin des cours
  \setcounter{dayFin}{#1}%
  \setcounter{monthFin}{#2}%
}%
%%% Commande pour répliquer le nombre de colonnes dans le tableau.
\ExplSyntaxOn%
\newcommand*\replicate{\prg_replicate:nn}%
\ExplSyntaxOff%
%%% Compteur pour la position de la date dans le tableau
\newcounter{ypos}%
%%% Commande Classe.
\makeatletter%
\NewDocumentCommand \Classe{ s O{18} m m m }{%
  % #1 = star : si séance bimestrielle. 
  % #2 = optionnel : nombre de colonne (par défaut = 18).
  % #3 = nom de la classe
  % #4 = - soit un entier qui correspond au nombre de fois où l'on voit la
  %        classe dans la semaine, 
  %      - soit une liste qui correspond aux jours où l'on voit la classe dans
  %        la semaine (par exemple L,L,M pour Lundi, Lundi et Mardi),
  %      - soit une liste Jour/Parité (nécessite l'étoile) qui correspond au
  %        jour et à la parité où l'on voit la classe.
  % #5 = la liste des élèves.
  %%% Nombre de colonnes dans le tableau
  \tikzmath{\NbColonnes=int(#2);}%
  %%% Écrire le nom des élèves dans le fichier ListeEleves.aux_LE :
  \immediate\write\tempfile{\string \subsection*{#3}}% Nom de la classe
  \immediate\write\tempfile{\string \begin{enumerate}}% 
    \foreach \i in {#5}{%
      \immediate\write\tempfile{\string\item\space \i}% Liste des élèves
    }%
  \immediate\write\tempfile{\string \end{enumerate}}%
  %%% Imprimer les tableaux d'appel
  \def\tabledata{}% initialisation du tableau. 
  \foreach[count=\n] \NomPrenom in {#5}{% Corps du tableau avec la liste des élèves
    \protected@xappto\tabledata{{\tiny\n. \NomPrenom} \replicate{\NbColonnes}{&} \\}%
  }%
  %%% Combien de tableaux à imprimer ?
  \IfDecimal{#4}{% Si #4 est un entier, Le nombre hebdo où l'on voit la classe est #4 
    \pgfmathtruncatemacro\NbTableaux{ceil(#4*\NbSem/\NbColonnes)-1}% 
  }{% Sinon #4 est une liste et on compte le nombre de fois où l'on voit la classe
    \IfBooleanTF{#1}{% Si star = liste #4 du type L/1,M/2,W/0.
      \pgfmathsetmacro{\p}{0}%
      \foreach \J/\P in{#4}{% On va calculer Les parités de la liste
        % 0 --> Toutes les semaines ; 1 ou 2 --> 0,5 semaine.
        \ifthenelse{\P=0}{\pgfmathparse{\p+1}}{\pgfmathparse{\p+.5}}%
        \xdef\p{\pgfmathresult}%
      }%
      \pgfmathtruncatemacro\NbTableaux{ceil(\p*\NbSem/\NbColonnes)-1}%
    }{% Sinon liste #4 du type L,M,W
      \readlist{\listeJours}{#4}%
      \pgfmathtruncatemacro\NbTableaux{ceil(\listeJourslen*\NbSem/\NbColonnes)-1}%
    }%
  }%
  \foreach \i in {0,...,\NbTableaux}{% Pour chaque tableau à imprimer
    % Si on imprime les dates, savoir où commencer et où finir.
    \pgfmathtruncatemacro\debut{1+\i*\NbColonnes}%
    \pgfmathtruncatemacro\fin{2+\NbColonnes+\i*\NbColonnes}%
    % La postion de la date est initialisée à 1
    \setcounter{ypos}{1}%
    % Corps du tableau.
    \begin{NiceTabularX}{\linewidth}{l*{\NbColonnes}{X|}}[hvlines]%
      \CodeBefore%
      \rowcolors{2}{lightgray}{}% Alternance des couleurs du tableau blanc/gris.
      \Body%
      \rowcolor{lightgray}{\Large\strut #3} \replicate{\NbColonnes}{&\NotEmpty} \\%
      \tabledata%
      \CodeAfter%
      \IfDecimal{#4}{% Si on veut un tableau sans date, la clé #3 est un entier.
        % Le tableau est fini.
      }{% Si on veut un tableau avec les dates la clé #4 est une liste du type L,M,W
        \IfBooleanTF{#1}{% Si star : la liste des de la forme L/1,M,2,W0
          \foreach \Day/\Parite/\Date in \ListeJours {% On récupère chaque jour de l'année
            \foreach \J/\P in {#4}{% Pour les jours/Parite de la liste #3
              \ifthenelse{% Si ça correspond à un jour de #1
              \equal{\Day}{\J}\AND\(\equal{\P}{0}\OR\equal{\P}{\Parite}\)}{%
              \stepcounter{ypos}% On place la date à la bonne position.
              \ifthenelse{\theypos>\debut\AND\theypos<\fin}{%
                \pgfmathtruncatemacro\position{\theypos-\i*\NbColonnes}%
              \tikz[remember picture,overlay]\path (1-\position) node{\tiny \Date};}{}%
            }{}%
          }%
        }%
      }{% Si pas star : la liste des de la forme L,M,W
        \foreach \Day/\Parite/\Date in \ListeJours {% On récupère chaque jour de l'année
            \foreach \J/\P in {#4}{% Pour les jours/parité de la liste #4
              \ifthenelse{\equal{\Day}{\J}}{% Si ça correspond à un jour de #3
                \stepcounter{ypos}% On place la date à la bonne position.
                \ifthenelse{\theypos>\debut\AND\theypos<\fin}{%
                  \pgfmathtruncatemacro\position{\theypos-\i*\NbColonnes}%
                \tikz[remember picture,overlay]\path (1-\position) node{\tiny \Date};}{}%
              }{}%
            }%
          }%
        }%
      }%
    \end{NiceTabularX}\par%
    \vspace{4ex}%
  }%
}%
\makeatother%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 3. Commandes pour la Liste des élèves
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Écrire la liste des élèves 
\NewDocumentCommand \ListeEleves{ m }{%
  % #1 = le nom du fichier à insérer. 
  \ifthenelse{\equal{#1}{}}{%
    % Si #1 est vide, on insère le fichier ListeEleves.tex
    \IfFileExists{ListeEleves.tex}{\input{ListeEleves.tex}}{}%
  }{% Sinon, on utilise le fichier #1 (s'il existe)
    \IfFileExists{#1}{\input{#1}}{}%
  }%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 4. Au début du document 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AtBeginDocument{% 
  %%% Stocker le nom des élèves dans un fichier externe.
  \newwrite\tempfile%
  \immediate\openout\tempfile=\jobname.aux_LE%
  %%% Création de la liste \ListeJours qui contient les jours de l'année 
  \setJoursFeries% les jours fériés sont définis
  \setcounter{day}{\thelundiRentree}% On fixe les compteurs à la rentrée.
  \setcounter{month}{\themonthRentree}%
  \setcounter{year}{\theyearRentree}%
  %%% Commande locale pour savoir si #3-#4 est un jour ouvré 
  \NewDocumentCommand \isJourOuvre{ m m m m }{% 
    % #1 = jour ; #2 = parité ; #3 = quantième ; #4 = mois.
    \IfStrEqCase{#3-#4}{% Si la date est un jour férié, on ne fait rien.
      {1-1}{}% 1er janvier
      {\thedayPaques-\themonthPaques}{}% Lundi de Pâques
      {1-5}{}% 1er mai
      {1-8}{}% 8 mai
      {\thedayAscension-\themonthAscension}{}% Ascension
      {\thedayAscensionPont-\themonthAscension}{}% Pont de l'ascension
      {\thedayPentecote-\themonthPentecote}{}% Pentecôte
      {14-17}{}% 14 juillet
      {15-8}{}% 15 août
      {1-11}{}% 1er novembre
      {11-11}{}% 11 novembre
      {25-12}{}% 25 décembre
      {\thedayFin-\themonthFin}{}% Jours de la fin des cours
    }% 
    [\ifthenelse{\(\themonthFin<13\) \AND%
      \(% Si la date est après \thedayFin-\themonthFin, on ne fait rien.
      \(#3>\thedayFin \and #4=\themonthFin\) \OR \(#4>\themonthFin \and #4<\themonthRentree\)%
      \)% Sinon, on ajoute le jour à la liste des jours...
    }{}{\xdef\ListeJours{\ListeJours #1/#2/#3-#4,}}]%
  }%
  %%% Définition de \ListeJours 
  \gdef\ListeJours{}%
  \foreach \n in {1,...,\NbSem}{%
    \pgfmathtruncatemacro\parite{2-int(mod(\n,2))}% Calcul de la parité de la semaine
    \isJourOuvre{L}{\parite}{\theday}{\themonth}\nextday% Lundi
    \isJourOuvre{M}{\parite}{\theday}{\themonth}\nextday% Mardi
    \isJourOuvre{W}{\parite}{\theday}{\themonth}\nextday% Mercredi
    \isJourOuvre{J}{\parite}{\theday}{\themonth}\nextday% Jeudi
    \isJourOuvre{V}{\parite}{\theday}{\themonth}\nextday% Vendredi
    \isJourOuvre{S}{\parite}{\theday}{\themonth}% Samedi
    \ifthenelse{% Si on est au samedi de vacances 
      \(\theday=\thedayToussaint \and \themonth=\themonthToussaint\)%
      \OR \(\theday=\thedayNoel \and \themonth=\themonthNoel\)%
      \OR \(\theday=\thedayNoel \and \themonth=\themonthNoel\)%
      \OR \(\theday=\thedayHiver \and \themonth=\themonthHiver\)%
      \OR \(\theday=\thedayPrintemps \and \themonth=\themonthPrintemps\)%
    }{% On avance de 15 jours
      \foreach \m in {1,...,16}{\nextday}%
    }{% Sinon C'est un week-end
      \nextday\nextday%
    }%
  }%
  \StrGobbleRight{\ListeJours}{1}[\ListeJours]% Suppression de la dernière virgule
  \setcounter{day}{\thelundiRentree}% On fixe les compteurs à la rentrée.
  \setcounter{month}{\themonthRentree}%
  \setcounter{year}{\theyearRentree}%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 5. À la fin du document 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\AtEndDocument{%
  \immediate\closeout\tempfile% Close the temp file
  % Copy the temp file to ListeEleves.tex
  \newwrite\copyfile% open the file to write to
  \immediate\openout\copyfile=ListeEleves.tex%
  \newread\file% open the file to read from
  \openin\file=\jobname.aux_LE
  \begingroup\endlinechar=-1%
  \loop\unless\ifeof\file%
    \read\file to\fileline% Read one line and store it into \fileline
    % print the content to copy.txt
    \immediate\write\copyfile{\unexpanded\expandafter{\fileline}}%
  \repeat%
  \endgroup%
  \closein\file%
  \closeout\tempfile%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 6. Divers 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Pas d'indentation des paragraphes
\setlength{\parindent}{0pt}%
% Fin du package.
\endinput
