texlive[68662] Master/texmf-dist: profmaquette (26oct23)

commits+karl at tug.org commits+karl at tug.org
Thu Oct 26 21:52:45 CEST 2023


Revision: 68662
          https://tug.org/svn/texlive?view=revision&revision=68662
Author:   karl
Date:     2023-10-26 21:52:45 +0200 (Thu, 26 Oct 2023)
Log Message:
-----------
profmaquette (26oct23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.pdf
    trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.tex
    trunk/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty

Modified: trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.tex	2023-10-26 19:52:32 UTC (rev 68661)
+++ trunk/Master/texmf-dist/doc/latex/profmaquette/profmaquette-doc.tex	2023-10-26 19:52:45 UTC (rev 68662)
@@ -120,16 +120,16 @@
     texcsstyle=*\color{black},%pour colorer la contre-oblique
     classoffset=5,
     texcsstyle=*\color{blue},%pour colorer la contre-oblique
-    moretexcs={brm,TikzDM,TikzDMCor,TikzDS,TikzDSCor,TikzIE,TikzIECor,TikzFiche,TikzFicheCor,TikzCours,Competences,TikzParcours,TikzParcoursCor,TikzPdT,TikzPdTCor,PfMCompNA,PfMCompECA,PfMCompA,AfficheParcours,CheminVrai,CheminFaux},
+    moretexcs={brm,TikzDM,TikzDMCor,TikzDS,TikzDSCor,TikzIE,TikzIECor,TikzFiche,TikzFicheCor,TikzCours,Competences,TikzParcours,TikzParcoursCor,TikzPdT,TikzPdTCor,PfMCompNA,PfMCompECA,PfMCompA,AfficheParcours,CheminVrai,CheminFaux,TikzContrat,TikzContratCor,TikzFdR,TikzFdRCor,AfficheContrat,AfficheFdR},
     emph={Maquette,exercice,exercice,Solution,Reponse,Indice},%
     classoffset=1,
-    keywords={DM,DS,IE,Fiche,CorrigeFin,CorrigeApres,PdT,Parcours,ParcoursPerso,Cours},
+    keywords={DM,DS,IE,Fiche,CorrigeFin,CorrigeApres,PdT,Parcours,ParcoursPerso,Cours,FdR,Contrat},
     keywordstyle=\color{OliveDrab},
     classoffset=2,
     keywords={Theme,Niveau,Classe,Date,Calculatrice,Code,Numero,Sujet,Nom,NumSujet,Fichier,Type},
     keywordstyle=\color{BlueViolet},%DarkMagenta},
     classoffset=3,
-    keywords={Pouce,Direct,PasCorrige,BaremeDetaille,BaremeTotal,Source,Titre,Oral,Calculatrice,Competence,Trajet},
+    keywords={Pouce,Direct,PasCorrige,BaremeDetaille,BaremeTotal,Source,Titre,Oral,Calculatrice,Competence,Trajet,Confiance,Route,Stop},
     keywordstyle=\color{DarkGreen},
 %    delim        = **[s][\color{purple}]{$}{$},
 %    moredelim    = **[s][\color{purple}]{\\[}{\\]},
@@ -269,6 +269,22 @@
     \par{\tiny\useKV[PdT]{Code}}\hfill{\scriptsize\useKV[PdT]{Date}}%
   \end{tcolorbox}%
 }
+
+\renewcommand\TikzFdR{%
+  \begin{tcolorbox}[%spread outwards=-1cm,spread inwards=-1cm,
+    colback=gray!5]%
+    \Large\sffamily \useKV[FdR]{Theme}\hfill\useKV[FdR]{Niveau} \useKV[FdR]{Classe}%
+    \par{\tiny\useKV[FdR]{Code}}\hfill{\scriptsize\useKV[FdR]{Date}}%
+  \end{tcolorbox}%
+}
+
+\renewcommand\TikzContrat{%
+  \begin{tcolorbox}[%spread outwards=-1cm,spread inwards=-1cm,
+    colback=gray!5]%
+    \Large\sffamily \useKV[Contrat]{Theme}\hfill\useKV[Contrat]{Niveau} \useKV[Contrat]{Classe}%
+    \par{\tiny\useKV[Contrat]{Code}}\hfill{\scriptsize\useKV[Contrat]{Date}}%
+  \end{tcolorbox}%
+}
 \begin{document}
 \maketitle
 \thispagestyle{empty}
@@ -287,7 +303,7 @@
 \end{Codes}
 C'est lui qui indique :
 \begin{itemize}
-\item le type de document souhaité \metamk{TypeDocument} (Devoir Maison / Devoir Surveillé / Interrogation écrite / Fiche d'exercices / Parcours d'exercices / Parcours personnalisé / Plan de travail / Cours);
+\item le type de document souhaité \metamk{TypeDocument} (Devoir Maison / Devoir Surveillé / Interrogation écrite / Fiche d'exercices / Parcours d'exercices / Parcours personnalisé / Plan de travail / Cours / Contrat de confiance / Feuille de route);
 \item et si ce travail est corrigé \metamk{TypeCorrection} (à la suite d'un exercice ou à la fin du document) ou pas;
 \end{itemize}
 puis il indiquera les caractéristiques \metamk{Caracteristiques} du document souhaité.
@@ -459,6 +475,46 @@
   On considère un triangle $ABC$\dots
 \end{Maquette}
 \clearpage
+\subsection*{Contrat de confiance\footnote{Basé sur une idée de Thomas {\sc Castanet}.}}
+\begin{CadreMP}
+  \begin{Description}
+\item[La clé \Cle{Contrat}]\Defaut{false}
+  \begin{itemize}
+  \item[]La clé \Cle{Theme} modifie le titre du \og cours\fg\Defaut{-}
+  \item[]La clé \Cle{Couleur} modifie la couleur donnée à l'entête\Defaut{Crimson}
+  \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+  \end{itemize}
+\end{Description}
+\end{CadreMP}
+\begin{Codes}[listing only]{0.4}{}
+\begin{Maquette}[Contrat]{}
+  On considère un triangle $ABC$\dots
+\end{Maquette}
+\end{Codes}
+\begin{Maquette}[Contrat]{}
+  On considère un triangle $ABC$\dots
+\end{Maquette}
+\clearpage
+\subsection*{Feuille de route\footnote{Basé sur une idée de Thomas {\sc Castanet}.}}
+\begin{CadreMP}
+  \begin{Description}
+\item[La clé \Cle{FdR}]\Defaut{false}
+  \begin{itemize}
+  \item[]La clé \Cle{Theme} modifie le titre du \og cours\fg\Defaut{-}
+  \item[]La clé \Cle{Couleur} modifie la couleur donnée à l'entête\Defaut{Crimson}
+  \item[]La clé \Cle{Nomexercice} pour modifier le nom des exercices\Defaut{exercice}
+  \end{itemize}
+\end{Description}
+\end{CadreMP}
+\begin{Codes}[listing only]{0.4}{}
+\begin{Maquette}[FdR]{}
+  On considère un triangle $ABC$\dots
+\end{Maquette}
+\end{Codes}
+\begin{Maquette}[FdR]{}
+  On considère un triangle $ABC$\dots
+\end{Maquette}
+\clearpage
 Comme on peut le voir, chaque type de travail est associé à une présentation. Ces présentations sont créées par les commandes associées à des styles prédéfinies.\footnote{Qu'on peut donc redéfinir. Par exemple, c'est ce que j'ai fait dans ce document pour la commande \lstinline!\\TikzFiche! : elle ne commence plus une nouvelle page.} \lstinline!tcolorbox! :
 \begin{itemize}[label=\textbullet]
 \item \lstinline!userdm/userdmcor! pour la clé \Cle{DM};
@@ -467,7 +523,9 @@
 \item \lstinline!userfiche/userfichecor! pour la clé \Cle{Fiche};%*
 \item \lstinline!userparcours/userparcourscor! pour la clé \Cle{Parcours};%*
 \item \lstinline!userpdt/userpdtcor! pour la clé \Cle{PdT};%*
-\item et \lstinline!usercours! pour la clé \Cle{Cours}.
+\item \lstinline!usercours! pour la clé \Cle{Cours};
+\item \lstinline!usercontrat/usercontratcor! pour la clé \Cle{Contrat};%*
+\item et \lstinline!userfdr/userfdr! pour la clé \Cle{FdR};%*
 \end{itemize}
 Par exemple, pour une fiche, le style {\em par défaut} permet d'obtenir :
 
@@ -514,7 +572,9 @@
 \item \lstinline!\TikzFiche/\TikzFicheCor! pour la clé \Cle{Fiche};%*
 \item \lstinline!\TikzParcours/\TikzParcoursCor! pour la clé \Cle{Parcours};%*
 \item \lstinline!\TikzPdT/\TikzPdTCor! pour la clé \Cle{PdT};%*
-\item et \lstinline!\TikzCours! pour la clé \Cle{Cours}.
+\item \lstinline!\TikzCours! pour la clé \Cle{Cours};
+\item \lstinline!\TikzContrat/\TikzContratCor! pour la clé \Cle{PdT};%*
+\item et \lstinline!\TikzFdR/\TikzFdRCor! pour la clé \Cle{PdT}.%*
 \end{itemize}
 Leurs modifications seront facilitées en copiant le code fourni par le fichier \lstinline!ProfMaquette.sty!.
 \clearpage
@@ -868,6 +928,166 @@
   \end{Maquette}
 \end{Codes}
 \clearpage
+\subsection*{Focus sur la maquette \lstinline!Contrat!}
+Dans le cas de cette maquette, l'environnement \lstinline!exercice! dispose de la clé \Cle{Confiance} permettant de construire automatiquement le contrat de confiance. La commande \lstinline!\AfficheContrat{}! représente un schéma associé au contrat proposé par l'enseignant : suivant la réalisation des exercices, l'élève choisit un chemin de remédiation (chemin du bas, repéré par la lettre a), soit un chemin d'approfondissement (chemin du haut, repéré par la lettre b).
+\\Ce schéma se construit seul, automatiquement, après que l'enseignant ait utilisé la clé \Cle{Confiance} dans la création de ses exercices. Il faudra néanmoins deux compilations. \`A noter que ce schéma, avec l'utilisation du package \lstinline!hyperref!, dispose de liens cliquables sur les exercices sélectionnés pour le parcours.
+\begin{Codes}[listing only,listing options={frame=,escapechar=!}]{0.4}{\small}
+\begin{Maquette}[Contrat]{Theme=Calcul mental}
+  \begin{center}
+    \AfficheContrat%
+  \end{center}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+\end{Maquette}
+\end{Codes}
+\clearpage
+\begin{Maquette}[Contrat]{Theme=Calcul mental}
+  \begin{center}
+    \AfficheContrat%
+  \end{center}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+  \begin{exercice}[Confiance={a,b}]
+    
+  \end{exercice}
+\end{Maquette}
+\clearpage
+\subsection*{Focus sur la maquette \lstinline!FdR!}
+Dans le cas de cette maquette, l'environnement \lstinline!exercice! dispose des clés \Cle{Route} et \Cle{Stop} permettant de construire automatiquement une feuille de route. La commande \lstinline!\AfficheFdR{}! représente un schéma associé à la feuille de route construite par l'enseignant : l'élève réalise les exercices de la ligne du bas puis demande la validation de l'enseignant. Une fois la validation acquise, l'enseignant peut lui proposer de faire les exercices de la ligne du haut ou de poursuivre la feuille de route.
+\\Ce schéma se construit seul, automatiquement, après que l'enseignant ait utilisé les clés \Cle{Route} et \Cle{Stop} dans la création de ses exercices. Il faudra néanmoins deux compilations. \`A noter que ce schéma, avec l'utilisation du package \lstinline!hyperref!, dispose de liens cliquables sur les exercices sélectionnés pour le parcours.
+\begin{Codes}[listing only,listing options={frame=,escapechar=!}]{0.4}{\scriptsize}
+\begin{Maquette}[FdR]{Theme=Calcul mental}
+  \begin{center}
+    \AfficheFdR%
+  \end{center}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route,Stop]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+\end{Maquette}
+\end{Codes}
+\clearpage
+\begin{Maquette}[FdR]{Theme=Calcul mental}
+  \begin{center}
+    \AfficheFdR%
+  \end{center}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route,Stop]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[Route]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+  \begin{exercice}[]
+    
+  \end{exercice}
+\end{Maquette}
+\clearpage
 \subsection*{\og Correction\fg{} des exercices}
   Un exercice avec correction pourra\footnote{Dans les faits, seul l'environnement \lstinline!exercice! est nécessaire.}  avoir la forme suivante :
   \begin{Codes}[listing only]{0.4}{}
@@ -1055,7 +1275,7 @@
 \clearpage
 \section*{Historique}
 \begin{description}
-\item[\PfMfiledate{}--v \PfMfileversion] Indépendance vis-à vis du module \lstinline!french! de \lstinline!babel!.
+\item[\PfMfiledate{}--v \PfMfileversion] Création des feuilles de route et contrat de confiance.
 \end{description}
 \end{document}
 %%% Local Variables: 

Modified: trunk/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty	2023-10-26 19:52:32 UTC (rev 68661)
+++ trunk/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty	2023-10-26 19:52:45 UTC (rev 68662)
@@ -2,9 +2,9 @@
 % licence    : Released under the LaTeX Project Public License v1.3c
 % or later, see http://www.latex-project.org/lppl.txtf
 \NeedsTeXFormat{LaTeX2e}%
-\def\filedate{2023/09/09}%
+\def\filedate{2023/10/25}%
 \let\PfMfiledate\filedate%
-\def\fileversion{0.45}%
+\def\fileversion{0.55}%
 \let\PfMfileversion\fileversion%
 \ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]%
 
@@ -30,7 +30,7 @@
 
 %définition des clés
 \RequirePackage{simplekv}
-\setKVdefault[Boulot]{Cours=false,Base=false,BaseHTML=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,ParcoursPerso=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
+\setKVdefault[Boulot]{Cours=false,Base=false,BaseHTML=false,Fiche=false,DM=false,DS=false,IE=false,Kholle=false,RecapBrevet=false,PdT=false,Parcours=false,Contrat=false,FdR=false,ParcoursPerso=false,CorrigeApres=false,CorrigeFin=false,CorrigeAll=false,Brevet=false,BaremeComplet=false,BaremeGlobal=false,CorrectionColonnes=false,Epaisseur=0pt,AllDirect=false,AllPouce=false}%Les deux derniers pour essayer de mettre tous les exercices d'un même fichier en mode Reponse, en mode Indice. Pas implanté, pas testé
 \defKV[Boulot]{Colonnes=\setKV[Boulot]{CorrectionColonnes}}%
 \setKVdefault[Cours]{Couleur=Crimson,Theme=Trace écrite,NomExercice=Exercice}%
 \setKVdefault[DM]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname}%
@@ -37,7 +37,9 @@
 \setKVdefault[DS]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname,Calculatrice=false,Sujet=A}%
 \setKVdefault[Fiche]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
 \setKVdefault[PdT]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
+\setKVdefault[FdR]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
 \setKVdefault[Parcours]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,Vertical=false}%
+\setKVdefault[Contrat]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice,Vertical=false}%
 \setKVdefault[ParcoursPerso]{Fichier={}}%
 \setKVdefault[IE]{Nom=\'Evaluation,Sujets=false,Theme={},Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname,Calculatrice=false}%
 \defKV[IE]{Sujet=\setKV[IE]{Sujets}}%
@@ -44,20 +46,34 @@
 \setKVdefault[RecapBrevet]{Theme=Les nombres décimaux,Date=\today,Code={},NomExercice=Exercice}%
 \setKVdefault[Kholle]{Sujet=1,Numero=1,Date=15,Niveau=TSI-1,Code=\jobname,Lieu=Lycée
   du Hainaut (Valenciennes),NomEleve=Albert Einstein,CR=false}%
-\setKVdefault[ClesExercices]{PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Background=white,Cadre=gray!50,Numerote}%
+\setKVdefault[ClesExercices]{NbQuestions=1,PasTitre=false,AffichageSource=false,BaremeTotal,BaremeDetaille=false,MotPoint=point,AffichageTitre=false,Calculatrice=true,Oral=false,Difficulte=0,AffichageCompetence=false,PasCorrige=false,Direct=false,Pouce=false,Parcours=false,Contrat=false,FdR=false,Routes=false,Stops=false,Background=white,Cadre=gray!50,Numerote}%
 \defKV[ClesExercices]{Source=\setKV[ClesExercices]{AffichageSource}}%
 \defKV[ClesExercices]{Titre=\setKV[ClesExercices]{AffichageTitre}}%
 \defKV[ClesExercices]{Competence=\setKV[ClesExercices]{AffichageCompetence}}%
 \defKV[ClesExercices]{Trajet=\setKV[ClesExercices]{Parcours}}%
+\defKV[ClesExercices]{Confiance=\setKV[ClesExercices]{Contrat}}%
+\defKV[ClesExercices]{Route=\setKV[ClesExercices]{Routes}}%
+\defKV[ClesExercices]{Stop=\setKV[ClesExercices]{Stops}}%
 \setKVdefault[SchemaParcours]{Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=LightSteelBlue,Csv=false}%
+\setKVdefault[SchemaContrat]{Ecart=7mm,Rayon=2.5mm}%
+\setKVdefault[SchemaFdR]{Ecart=7mm,Colonnes=100,Rayon=2.5mm,Largeur=7.5mm,Couleur=LightSteelBlue,Csv=false}%
 % Definition de longueurs
-\newlength\PfMLargeurSchemaParcours
-\newlength{\PfMHauteurAppreciation}
-\setlength{\PfMHauteurAppreciation}{5cm}
-\newlength{\PfMHauteurRemarque}
-\setlength{\PfMHauteurRemarque}{5cm}
-%définition des compteurs
-\newcounter{PfMExo}%Numéro des exercices
+\newlength\PfMLargeurSchemaParcours%
+\newlength\PfMRayonSchemaParcours%
+\newlength\PfMLargeurSchemaContrat%
+\newlength\PfMRayonSchemaContrat%
+\newlength\PfMLargeurSchemaFdR%
+\newlength\PfMRayonSchemaFdR%
+\newlength{\PfMHauteurAppreciation}%
+\setlength{\PfMHauteurAppreciation}{5cm}%
+\newlength{\PfMHauteurRemarque}%
+\setlength{\PfMHauteurRemarque}{5cm}%
+% définition des compteurs
+\newcounter{PfMMaquette}%Pour compter le nombres de "travaux"
+\setcounter{PfMMaquette}{0}%
+\newcounter{PfMSection}%Pour le barème et ne pas faire obstruction à section
+\setcounter{PfMSection}{0}%
+\newcounter{PfMExo}[PfMMaquette]%Numéro des exercices
 \setcounter{PfMExo}{0}%
 \newcounter{PfMExoSol}%Pour repérer les valeurs aléatoires construites automatiquement dans la solution
 \setcounter{PfMExoSol}{0}%
@@ -75,10 +91,6 @@
 \setcounter{RetiensInd}{0}%
 \newcounter{PfMNbLogo}%Pour décaler les logos sur la ligne haute de tcolorbox
 \setcounter{PfMNbLogo}{0}%
-\newcounter{PfMMaquette}%Pour compter le nombres de "travaux"
-\setcounter{PfMMaquette}{0}%
-\newcounter{PfMSection}%Pour le barème et ne pas faire obstruction à section
-\setcounter{PfMSection}{0}%
 \newcount\Orientation%Pour le schéma des parcours
 % couleurs
 \colorlet{PfMColCpt}{gray!50}
@@ -86,6 +98,8 @@
 %\colorlet{PfMCadreFiche}{gray!50}
 \colorlet{PfMCadreDM}{gray!85}
 \colorlet{PfMCadreParcours}{gray!50}
+\colorlet{PfMCadreContrat}{gray!50}
+\colorlet{PfMCadreFdR}{gray!50}
 % Définitions de commandes
 \newcommand\PfMIENom{\dotfill}
 \newcommand\PfMIEPrenom{\dotfill}
@@ -100,25 +114,41 @@
 \newcommand\ChoixSommet[2]{%
   % #1 le nombre de sommets
   % #2 le nom de base des commandes qui sauvegarde les noms
+  % après chgt
+  \stepcounter{PfMAlea}%
+  % fin chgt
   \xdef\CANSGFoo{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}%
   \MelangeListe{\CANSGFoo}{#1}%
-  \ignoreemptyitems
+  \ignoreemptyitems%
   \readlist*\PfMSommet{\faa}%
-  \reademptyitems
+  \reademptyitems%
   \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
-    \setcounter{PfMSommetcount}{##1}
+    \setcounter{PfMSommetcount}{##1}%
     \expandafter\xdef\csname p\Alph{PfMSommetcount}\endcsname{\PfMSommet[##1]}%
-    \expandafter\xdef\csname #2\Alph{PfMExo}\alph{PfMSommetcount}\endcsname{\PfMSommet[##1]}%
+    % avant chgt
+    % \expandafter\xdef\csname #2\Roman{PfMExo}\alph{PfMSommetcount}\endcsname{\PfMSommet[##1]}%
+    % après chgt
+    \expandafter\xdef\csname #2\Roman{PfMExo}\roman{PfMAlea}\alph{PfMSommetcount}\endcsname{\PfMSommet[##1]}%
   }%
 }%
 %%%
 
+\NewDocumentCommand\RestoreSommet{mm}{%
+  % #1 le nombre de sommets
+  % #2 le nom de base utilisé lors de la création des sommets
+  \stepcounter{PfMAlea}%
+  \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
+    \setcounter{PfMSommetcount}{##1}%
+    \expandafter\xdef\csname p\Alph{PfMSommetcount}\endcsname{\csname #2\Roman{PfMExoSol}\roman{PfMAlea}\alph{PfMSommetcount}\endcsname}%
+  }%
+}%
+
 \ifdef{\VariableAlea}{%
   \RenewDocumentCommand\VariableAlea{s m m}{%
     \IfBooleanTF{#1}{%
       \stepcounter{PfMAlea}%
-      \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{#3}}%
-      \expandafter\xdef\csname #2\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+      \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{#3}}%
+      \expandafter\xdef\csname #2\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
     }{%
       \xdef#2{\fpeval{#3}}%
     }%
@@ -127,8 +157,8 @@
   \NewDocumentCommand\VariableAlea{s m m}{%
     \IfBooleanTF{#1}{%
       \stepcounter{PfMAlea}%
-      \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{#3}}%
-      \expandafter\xdef\csname #2\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+      \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{#3}}%
+      \expandafter\xdef\csname #2\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
     }{%
       \xdef#2{\fpeval{#3}}%
     }%
@@ -140,11 +170,11 @@
     \IfBooleanTF{#1}{%
       \stepcounter{PfMAlea}%
       \IfNoValueTF{#2}{%
-        \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{randint(#3,#4)}}%
-        \expandafter\xdef\csname #5\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+        \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{randint(#3,#4)}}%
+        \expandafter\xdef\csname #5\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
       }{%
-        \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{round(randint(#3,#4)+rand(),#2)}}%
-        \expandafter\xdef\csname #5\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+        \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{round(randint(#3,#4)+rand(),#2)}}%
+        \expandafter\xdef\csname #5\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
       }%
     }{%
       \IfNoValueTF{#2}{%
@@ -159,11 +189,11 @@
     \IfBooleanTF{#1}{%
       \stepcounter{PfMAlea}%
       \IfNoValueTF{#2}{%
-        \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{randint(#3,#4)}}%
-        \expandafter\xdef\csname #5\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+        \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{randint(#3,#4)}}%
+        \expandafter\xdef\csname #5\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
       }{%
-        \expandafter\xdef\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname{\fpeval{round(randint(#3,#4)+rand(),#2)}}%
-        \expandafter\xdef\csname #5\endcsname{\csname valeur\Alph{PfMExo}\alph{PfMAlea}\endcsname}%
+        \expandafter\xdef\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname{\fpeval{round(randint(#3,#4)+rand(),#2)}}%
+        \expandafter\xdef\csname #5\endcsname{\csname valeur\Roman{PfMExo}\roman{PfMAlea}\endcsname}%
       }%
     }{%
       \IfNoValueTF{#2}{%
@@ -175,20 +205,68 @@
   }%
 }% 
 
+\NewDocumentCommand\ChoixAleaMultiMix{mmmmm}{%
+  % #1 nombre de valeurs à choisir
+  % #2 valeur minimale
+  % #3 valeur maximale
+  % #4 valeur(s) exclue(s)
+  % #5 Nom de la liste qui récupère les données.
+  \ifx\bla#4\bla%
+    \PackageWarning{ProfMaquette}{Il faut définir au moins une valeur à exclure.}
+  \else%
+    \xdef\PfMMixFoo{#2}%
+    \setsepchar{,}\ignoreemptyitems%
+    \readlist*\ListeValeursExclues{#4}%
+    \xintFor* ##1 in{\xintSeq{\fpeval{#2+1}}{#3}}\do{%
+      \xdef\PfMMixFoo{\PfMMixFoo,##1}%
+    }%
+    \readlist*\ListeValeursRetenues{\PfMMixFoo}%
+    \xintFor* ##1 in{\xintSeq{1}{\ListeValeursExclueslen}}\do{%
+      \xdef\PfMMixFoo{}%
+      \xintFor* ##2 in{\xintSeq{1}{\ListeValeursRetenueslen}}\do{%
+        \xintifboolexpr{\ListeValeursRetenues[##2]==\ListeValeursExclues[##1]}{}{%
+          \xdef\PfMMixFoo{\PfMMixFoo,\ListeValeursRetenues[##2]}%
+        }%
+      }%
+      \ignoreemptyitems%
+      \readlist*\ListeValeursRetenues{\PfMMixFoo}%
+    }%
+    \MelangeListe{\PfMMixFoo}{#1}%
+    \xdef#5{\faa}%
+  \fi%
+}%
+
+\NewDocumentCommand\ChoixAleaMulti{mmmm}{%
+  % #1 nombre de valeurs à choisir
+  % #2 valeur minimale
+  % #3 valeur maximale
+  % #4 Nom de la liste qui récupère les données.
+  \xdef\PfMMixFoo{\fpeval{randint(#2,#3)}}%
+  \xintFor* ##1 in{\xintSeq{1}{\fpeval{#1-1}}}\do{%
+    \xdef\PfMMixFoo{\PfMMixFoo,\fpeval{randint(#2,#3)}}%
+  }%
+  \xdef#4{\PfMMixFoo}%
+}%
+
 \NewDocumentCommand\RestoreChoixAlea{m}{%
   \stepcounter{PfMAlea}%
-  \expandafter\xdef\csname #1\endcsname{\csname valeur\Alph{PfMExoSol}\alph{PfMAlea}\endcsname}
+  \expandafter\xdef\csname #1\endcsname{\csname valeur\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}
 }%
 
-\NewDocumentCommand\RestoreSommet{mm}{%
-  % #1 le nombre de sommets
-  % #2 le nom de base utilisé lors de la création des sommets
-  \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
-    \setcounter{PfMSommetcount}{##1}
-    \expandafter\xdef\csname p\Alph{PfMSommetcount}\endcsname{\csname #2\Alph{PfMExoSol}\alph{PfMSommetcount}\endcsname}
-  }%
+\NewDocumentCommand\ExporteListe{mm}{%
+  %#1 le nom de la liste
+  %#2 le contenu de la liste.
+  \stepcounter{PfMAlea}
+  \expandafter\xdef\csname Liste\Roman{PfMExo}\roman{PfMAlea}\endcsname{#2}%
+  \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExo}\roman{PfMAlea}\endcsname}
 }%
 
+\NewDocumentCommand\RestoreListe{m}{%
+  %#1 le nom de la liste à restaurer
+  \stepcounter{PfMAlea}%
+  \expandafter\xdef\csname #1\endcsname{\csname Liste\Roman{PfMExoSol}\roman{PfMAlea}\endcsname}
+}%
+
 % Définitions pour les compétences
 \NewDocumentCommand\Competences{O{3}m}{%
   \setsepchar[*]{/}\ignoreemptyitems%
@@ -556,6 +634,529 @@
   \endtcolorbox%
 }
 
+%%Contrat
+
+%\makeatletter
+
+%\makeatother
+
+%\makeatletter
+\NewDocumentCommand\AfficheContrat{o}{%
+  \useKVdefault[SchemaContrat]%
+  \setKV[SchemaContrat]{#1}%
+  \setlength{\PfMLargeurSchemaContrat}{\useKV[SchemaContrat]{Ecart}}%
+  \setlength{\PfMRayonSchemaContrat}{\useKV[SchemaContrat]{Rayon}}%
+  %\colorlet{PfMCouleurSP}{\useKV[SchemaContrat]{Couleur}}%
+  \@ifundefined{Op@\Alph{PfMMaquette}-ContratTotalExo}{Recompilez pour obtenir le contrat.}%
+  {%
+    \opexport{\Alph{PfMMaquette}-ContratTotalExo}{\ContratTotalExo}%
+    % Total Exo : \ContratTotalExo
+    \setsepchar{,}\ignoreemptyitems%
+    \xdef\PfCFooListeA{\csname \Alph{PfMMaquette}Contrata\endcsname}%
+    \xdef\PfCFooListeB{\csname \Alph{PfMMaquette}Contratb\endcsname}%
+    \readlist*\ListeA{\PfCFooListeA}%
+    \readlist*\ListeB{\PfCFooListeB}%
+%    Liste A : \showitems\ListeA[]\par
+%    Liste B : \showitems\ListeB[]\par
+    % On écrit en supposant que la liste A est la plus longue
+    \xdef\LongueurA{\ListeAlen}%
+    \xdef\LongueurB{\ListeBlen}%
+    \xdef\Foo{}%
+    \xdef\Decalage{0}%
+    % On change la liste B en ajoutant des 0 où il manque des éléments.
+    \xintFor* ##1 in{\xintSeq{1}{\LongueurB}}\do{%
+      \xdef\Test{0}%
+      \xintFor * ##2 in {\xintSeq{1}{\LongueurA}}\do{%
+        % ListeA vaut \ListeA[##2] et ListeB vaut \ListeB[##1]\par
+        \IfStrEq{\ListeA[##2]}{\ListeB[##1]}{\xdef\Test{\fpeval{\Test+1}}\xdef\Position{##2}}{}%
+      }%
+      \xintifboolexpr{\Test==0}{%pas présent
+        \xdef\Foo{\Foo,\ListeB[##1]}
+      }{%présent
+        \xintifboolexpr{\Position>\fpeval{##1+\Decalage}}{%
+          \xintFor* ##3 in{\xintSeq{\fpeval{##1+\Decalage}}{\fpeval{\Position-1}}}\do{%
+            \xdef\Foo{\Foo,0}%
+          }
+          \xdef\Decalage{\fpeval{\Position-##1-\Decalage}}
+        }{}
+        \xdef\Foo{\Foo,\ListeB[##1]}
+      }%
+    }%
+%    La liste A est \showitems\ListeA[]\par
+    \readlist*\ListeB{\Foo}%
+%    La liste B modifiée est \showitems\ListeB[]\par
+    \xdef\FooNoeuds{}%
+    \foreachitem\compteur\in\ListeA{%
+      \xdef\FooNoeuds{\FooNoeuds,\ListeA[\compteurcnt]/\ListeB[\compteurcnt]}%
+    }%
+    \BuildConfianceTikz{\FooNoeuds}%
+  }%
+}%
+%\makeatother
+
+\NewDocumentCommand\BuildConfianceTikz{m}{%
+  \setsepchar[*]{,*/}\ignoreemptyitems%
+  \readlist*\Noeuds{#1}%
+  \begin{tikzpicture}
+    \coordinate (C-0) at (-\PfMLargeurSchemaContrat,0);%
+    \coordinate (A-0) at (-\PfMLargeurSchemaContrat,-\PfMLargeurSchemaContrat+\PfMRayonSchemaContrat);%
+    \coordinate (B-0) at (-\PfMLargeurSchemaContrat,\PfMLargeurSchemaContrat-\PfMRayonSchemaContrat);%
+    \xintFor*##1 in{\xintSeq{1}{\fpeval{\Noeudslen+1}}}\do{%
+      \coordinate[xshift=\PfMLargeurSchemaContrat] (C-##1) at (C-\fpeval{##1-1});%
+      \coordinate[xshift=\PfMLargeurSchemaContrat] (A-##1) at (A-\fpeval{##1-1});%
+      \coordinate[xshift=\PfMLargeurSchemaContrat] (B-##1) at (B-\fpeval{##1-1});%
+    }%
+    % On place les points
+    \xintFor* ##1 in{\xintSeq{1}{\Noeudslen}}\do{%
+      \xintifboolexpr{\Noeuds[##1,1]==\Noeuds[##1,2]}{%
+        \coordinate (A-##1) at (C-##1);%
+        \coordinate (B-##1) at (C-##1);%
+      }{}%
+    }%
+    % on trace
+    \xintifboolexpr{\Noeuds[1,1]==\Noeuds[1,2]}{\draw[line width=1pt,->] (C-0)--(C-1);%
+    }{%
+      \draw[line width=1pt,->] (A-0)--(A-1);
+      \draw[line width=1pt,->] (B-0)--(B-1);
+    }%
+    \xintFor* ##1 in{\xintSeq{2}{\Noeudslen}}\do{%
+      \draw[line width=1pt] (A-\fpeval{##1-1})--(A-##1);%
+      \draw[line width=1pt] (B-\fpeval{##1-1})--(B-##1);%
+    }%
+    \xintifboolexpr{\Noeuds[\Noeudslen,1]==\Noeuds[\Noeudslen,2]}{\draw[line width=1pt,->] (C-\Noeudslen)--(C-\fpeval{\Noeudslen+1});%
+    }{%
+      \draw[line width=1pt,->] (A-\Noeudslen)--(A-\fpeval{\Noeudslen+1});
+      \draw[line width=1pt,->] (B-\Noeudslen)--(B-\fpeval{\Noeudslen+1});
+    }%
+    % on dessine les cercles
+    \xintFor* ##1 in{\xintSeq{1}{\Noeudslen}}\do{%
+      \xintifboolexpr{\Noeuds[##1,1]==\Noeuds[##1,2]}{%
+        \draw[fill=white] (C-##1) circle (\PfMRayonSchemaContrat) node{\ref{page-\thePfMMaquette-\Noeuds[##1,1]}};%
+      }{%
+        \draw[fill=white] (A-##1) circle (\PfMRayonSchemaContrat) node{\ref{page-\thePfMMaquette-\Noeuds[##1,1]}};%
+        \xintifboolexpr{\Noeuds[##1,2]==0}{}{\draw[fill=white] (B-##1) circle (\PfMRayonSchemaContrat) node{\ref{page-\thePfMMaquette-\Noeuds[##1,2]}};}%
+      }%
+    }%
+  \end{tikzpicture}%
+}%
+
+\NewDocumentCommand\RemplisContrat{m}{%
+  \ifcsname \Alph{PfMMaquette}confiance#1\endcsname
+  \expandafter\xdef\csname \Alph{PfMMaquette}confiance#1\endcsname{\csname \Alph{PfMMaquette}confiance#1\endcsname,\thePfMExo}%
+%  Yes !
+  \else
+%  No !
+  \expandafter\xdef\csname \Alph{PfMMaquette}confiance#1\endcsname{\thePfMExo}%
+  \fi
+  \immediate\write\@auxout{\noexpand\expandafter\gdef\noexpand\csname \Alph{PfMMaquette}Contrat#1\endcsname{\csname \Alph{PfMMaquette}confiance#1\endcsname}}%
+}%
+
+ 
+\newenvironment{exerciceContrat}[1][]{%
+  \setcounter{PfMAlea}{0}%
+  \setcounter{PfMNbLogo}{1}%
+  \useKVdefault[ClesExercices]%
+  \setKV[ClesExercices]{#1}%
+  \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+  \refstepcounter{PfMSection}%
+  \PfMChoixCorrection%
+  \refstepcounter{PfMExo}%
+  \immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Alph{PfMMaquette}-ContratTotalExo}}%
+  % Creation des parcours
+  \ifboolKV[ClesExercices]{Contrat}{%
+    % Remise à zéro de conteneurs des parcours
+    \setsepchar{,}%
+    \xdef\PfMFooListeContrat{\useKV[ClesExercices]{Confiance}}
+    \readlist*\ListeContrat{\PfMFooListeContrat}%
+    \foreachitem\compteur\in\ListeContrat{%
+      \RemplisContrat{\ListeContrat[\compteurcnt]}%
+    }%
+  }{}%
+  %
+  \tcolorbox[%
+  tikzcontrat,
+  label is label,
+  label=page-\thePfMMaquette-\thePfMExo
+  ]
+}{\endtcolorbox%
+}
+
+%%% Contrat %%%
+\tcbset{%
+  usercontrat/.style={%
+    spread upwards=-1cm,colback=gray!5%
+  }%
+}%
+
+\tcbset{%
+  usercontratcor/.style={%
+    spread upwards=-1cm,colback=gray!5%
+  }%
+}%
+
+\NewDocumentCommand\TikzContrat{}{%
+  \begin{tcolorbox}[usercontrat]%
+    \Large\sffamily \useKV[Contrat]{Theme}\hfill\useKV[Contrat]{Niveau} \useKV[Contrat]{Classe}%
+    \par{\tiny\useKV[Contrat]{Code}}\hfill{\scriptsize\useKV[Contrat]{Date}}%
+  \end{tcolorbox}%
+}
+
+\NewDocumentCommand\TikzContratCor{m}{%
+  \clearpage
+  \setKV[Contrat]{#1}%
+  \begin{tcolorbox}[usercontratcor]%
+    \Large\sffamily \useKV[Contrat]{Theme} (Correction) \hfill\useKV[Contrat]{Niveau} \useKV[Contrat]{Classe}
+    \par{\tiny\useKV[Contrat]{Code}}\hfill{\scriptsize\useKV[Contrat]{Date}}
+  \end{tcolorbox}%
+}
+
+\tcbset{%
+  tikzcontrat/.style={%
+    before skip=1em,
+    enhanced,
+    breakable,
+    colback=white,
+    colframe=PfMCadreContrat,
+    overlay unbroken and first={%
+      \node[%
+      name=A,
+      fill=white,
+      anchor=west,
+      xshift=10pt,
+      ] at (frame.north west){\bfseries\sffamily \useKV[Contrat]{NomExercice} \thePfMExo\ifboolKV[ClesExercices]{AffichageTitre}{ : \useKV[ClesExercices]{Titre}}{}};
+      %% 
+      \ifboolKV[ClesExercices]{Calculatrice}{}{\node[fill=white,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\cancel{\faCalculator}};\stepcounter{PfMNbLogo}}
+      \ifboolKV[ClesExercices]{Oral}{\node[fill=white,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\faBullhorn};\stepcounter{PfMNbLogo}}{}
+      %%
+      \ifboolKV[ClesExercices]{AffichageCompetence}{%
+        \node[%
+        fill=white,
+        anchor=east,
+        xshift=-10pt,
+        text=PfMColCpt,%
+        ]
+        at (frame.north east)
+        {\itshape\scriptsize\sffamily Compétence(s) dominante(s) : \useKV[ClesExercices]{Competence}};
+      }{}%
+      %%
+      \ifboolKV[ClesExercices]{AffichageSource}{%
+        \node[%
+        fill=white,
+        anchor=east,
+        xshift=-10pt,
+        text=PfMColSrc,
+        ]
+        at (frame.south east)
+        {\scriptsize\sffamily \useKV[ClesExercices]{Source}};
+      }{}%
+    }%
+  }%
+}%
+%% Fin Contrat %%%
+
+%%FdR
+
+%\makeatletter
+\NewDocumentCommand\AfficheFdR{o}{%
+  \useKVdefault[SchemaFdR]%
+  \setKV[SchemaFdR]{#1}%
+  \setlength{\PfMLargeurSchemaFdR}{\useKV[SchemaFdR]{Ecart}}%
+  \setlength{\PfMRayonSchemaFdR}{\useKV[SchemaFdR]{Rayon}}%
+  \colorlet{PfMCouleurFdR}{\useKV[SchemaFdR]{Couleur}}%
+  \@ifundefined{Op@\Alph{PfMMaquette}-FdRTotalExo}{Recompilez pour obtenir la feuille de route.}%
+  {%
+    \opexport{\Alph{PfMMaquette}-FdRTotalExo}{\FdRTotalExo}%
+    \xdef\PfMListeExerciceFdR{\csname \Alph{PfMMaquette}FdRtrue\endcsname}%
+    \ifcsname \Alph{PfMMaquette}FdRstop\endcsname
+      \xdef\PfMListeExerciceFdRStop{\csname \Alph{PfMMaquette}FdRstop\endcsname}%
+    \else
+      \xdef\PfMListeExerciceFdRStop{}
+    \fi
+    % On ajoute un stop au dernier exercice
+    \xdef\PfMListeExerciceFdRStop{\PfMListeExerciceFdRStop,\FdRTotalExo}%
+%    Liste Exos : \PfMListeExerciceFdR\\
+%    Liste Stop : \PfMListeExerciceFdRStop\\
+    \BuildRouteTikz{\FdRTotalExo}{\PfMListeExerciceFdR}{\PfMListeExerciceFdRStop}%
+  }%
+}%
+%\makeatother
+
+\NewDocumentCommand\BuildRouteTikz{mmm}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \readlist*\ListeRetiensExo{#2}%
+  \readlist*\ListeRetiensStop{#3}%
+  \reademptyitems
+%  Les exos retenus : \showitems\ListeRetiensExo[]\\
+%  Les exos stop : \showitems\ListeRetiensStop[]\\
+  \xdef\LongueurA{\ListeRetiensExolen}%
+  \xdef\LongueurB{\fpeval{\ListeRetiensStoplen-1}}%
+  \xdef\PfMFooExoIncrustes{}
+  \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
+    \xdef\RetiensExclus{0}%
+    \xintFor* ##2 in {\xintSeq{1}{\LongueurA}}\do{%
+      \xintifboolexpr{\ListeRetiensExo[##2]==##1}{\xdef\RetiensExclus{1}}{}%
+    }%
+    \xintifboolexpr{\RetiensExclus>0}{}{\xdef\PfMFooExoIncrustes{\PfMFooExoIncrustes,##1}}%
+  }%
+  \setsepchar{,}\ignoreemptyitems%
+  \readlist*\ListeRetiensExclus{\PfMFooExoIncrustes}%
+  \xdef\LongueurC{\ListeRetiensExcluslen}%
+  % portion 1
+%  Portion 1 :\\
+  \xdef\ListeRoute{}%
+  \xdef\ListeRouteExclus{}%
+  \xdef\NBExo{0}\xdef\NBExoSup{0}%
+  \xintFor* ##1 in{\xintSeq{1}{\LongueurA}}\do{%
+    \xintifboolexpr{\ListeRetiensExo[##1]>\ListeRetiensStop[1]}{%
+      %
+    }{%
+      \xdef\NBExo{\fpeval{\NBExo+1}}\xdef\ListeRoute{\ListeRoute,\ListeRetiensExo[##1]}%
+    }%
+  }%
+  \xintFor* ##1 in{\xintSeq{1}{\LongueurC}}\do{%
+    \xintifboolexpr{\ListeRetiensExclus[##1]>\ListeRetiensStop[1]}{}{\xdef\NBExoSup{\fpeval{\NBExoSup+1}}\xdef\ListeRouteExclus{\ListeRouteExclus,\ListeRetiensExclus[##1]}}%
+  }%
+  \xintifboolexpr{\NBExoSup==\NBExo}{}{%
+    \xintifboolexpr{\NBExoSup>\NBExo}{%
+      \xintFor* ##1 in{\xintSeq{1}{\fpeval{\NBExoSup-\NBExo}}}\do{%
+        \xdef\ListeRoute{\ListeRoute,-1}%0 pour l'écart
+      }%
+    }{%
+      \xintFor* ##1 in{\xintSeq{1}{\fpeval{\NBExo-\NBExoSup}}}\do{%
+        \xdef\ListeRouteExclus{\ListeRouteExclus,-1}%0 pour l'écart
+      }%
+    }%
+  }%
+  \xdef\ListeRoute{\ListeRoute,0}%0 pour le symbole stop
+  \xdef\ListeRouteExclus{\ListeRouteExclus,0}%0 pour le symbole stop
+%  Route Basse : \ListeRoute\\
+%  Route Haute : \ListeRouteExclus\\
+  % portions centrales
+%  Portions centrales :\\
+  \xintifboolexpr{\ListeRetiensStoplen>2}{%
+    \xintFor* ##1 in{\xintSeq{1}{\fpeval{\LongueurB-1}}}\do{%
+      \xdef\NBExo{0}\xdef\NBExoSup{0}
+      \xintFor* ##2 in{\xintSeq{1}{\LongueurA}}\do{%
+        \xintifboolexpr{\ListeRetiensExo[##2]<\fpeval{\ListeRetiensStop[##1]+1} || \ListeRetiensExo[##2]>\ListeRetiensStop[\fpeval{##1+1}]}{}{\xdef\NBExo{\fpeval{\NBExo+1}}\xdef\ListeRoute{\ListeRoute,\ListeRetiensExo[##2]}%
+        }%
+      }%
+      \xintFor* ##2 in{\xintSeq{1}{\LongueurC}}\do{%
+        \xintifboolexpr{\ListeRetiensExclus[##2]<\fpeval{\ListeRetiensStop[##1]+1} || \ListeRetiensExclus[##2]>\ListeRetiensStop[\fpeval{##1+1}]}{}{\xdef\NBExoSup{\fpeval{\NBExoSup+1}}\xdef\ListeRouteExclus{\ListeRouteExclus,\ListeRetiensExclus[##2]}%
+        }%%
+      }%
+      \xintifboolexpr{\NBExoSup==\NBExo}{}{%
+        \xintifboolexpr{\NBExoSup>\NBExo}{%
+          \xintFor* ##3 in{\xintSeq{1}{\fpeval{\NBExoSup-\NBExo}}}\do{%
+            \xdef\ListeRoute{\ListeRoute,-1}%0 pour l'écart
+          }%
+        }{%
+          \xintFor* ##3 in{\xintSeq{1}{\fpeval{\NBExo-\NBExoSup}}}\do{%
+            \xdef\ListeRouteExclus{\ListeRouteExclus,-1}%0 pour l'écart
+          }%
+        }%
+      }%
+      \xdef\ListeRoute{\ListeRoute,0}\xdef\ListeRouteExclus{\ListeRouteExclus,0}%
+    }%
+  }{}%
+  % portion finale
+%  Portion fin \\
+  \xintifboolexpr{\ListeRetiensStoplen>1}{%
+  \xdef\NBExo{0}\xdef\NBExoSup{0}%
+  \xintFor* ##1 in{\xintSeq{1}{\LongueurA}}\do{%
+    \xintifboolexpr{\ListeRetiensExo[##1]>\fpeval{\ListeRetiensStop[\ListeRetiensStoplen-1]}}{\xdef\NBExo{\fpeval{\NBExo+1}}\xdef\ListeRoute{\ListeRoute,\ListeRetiensExo[##1]}{}%
+    }%
+  }%
+  \xintFor* ##1 in{\xintSeq{1}{\LongueurC}}\do{%
+    \xintifboolexpr{\ListeRetiensExclus[##1]>\fpeval{\ListeRetiensStop[\ListeRetiensStoplen-1]}}{\xdef\NBExoSup{\fpeval{\NBExoSup+1}}\xdef\ListeRouteExclus{\ListeRouteExclus,\ListeRetiensExclus[##1]}{}%
+    }%
+  }%
+  \xintifboolexpr{\NBExoSup==\NBExo}{}{
+    \xintifboolexpr{\NBExoSup>\NBExo}{%
+      \xintFor* ##1 in{\xintSeq{1}{\fpeval{\NBExoSup-\NBExo}}}\do{%
+        \xdef\ListeRoute{\ListeRoute,-1}%0 pour l'écart
+      }%
+    }{%
+      \xintFor* ##1 in{\xintSeq{1}{\fpeval{\NBExo-\NBExoSup}}}\do{%
+        \xdef\ListeRouteExclus{\ListeRouteExclus,-1}%0 pour l'écart
+      }%
+    }%
+  }%
+  \xdef\ListeRoute{\ListeRoute,0}%0 pour le symbole stop
+  \xdef\ListeRouteExclus{\ListeRouteExclus,0}%0 pour le symbole stop
+  }{}%
+  \setsepchar{,}\ignoreemptyitems
+  \readlist*\ListeRouteBasse{\ListeRoute}%
+  \readlist*\ListeRouteHaute{\ListeRouteExclus}%
+%  Liste Route : \showitems\ListeRouteBasse[]\\
+%  Liste Exclus : \showitems\ListeRouteHaute[]
+  \begin{tikzpicture}
+    \coordinate (A-0) at (-\PfMLargeurSchemaFdR,0);
+    \coordinate (A-1) at (0,0);%
+    \coordinate (B-1) at (0,1);%
+    \xintFor* ##1 in{\xintSeq{2}{\ListeRouteBasselen}}\do{%
+      \coordinate[xshift=\PfMLargeurSchemaFdR] (A-##1) at (A-\fpeval{##1-1});%
+      \coordinate[xshift=\PfMLargeurSchemaFdR] (B-##1) at (B-\fpeval{##1-1});%
+    }%
+   \coordinate[xshift=\PfMLargeurSchemaFdR] (A-\fpeval{\ListeRouteBasselen+1}) at (A-\ListeRouteBasselen);%
+    %Route haute
+    \xintFor* ##1 in{\xintSeq{1}{\ListeRouteHautelen}}\do{%
+      \xintifboolexpr{\ListeRouteHaute[##1]<0}{%
+        \draw[] (B-##1) to (B-\fpeval{##1+1});
+      }{%
+        \xintifboolexpr{\ListeRouteHaute[##1]==0}{%
+          \draw (B-##1) to (A-##1);%
+        }{%
+          \draw[] (B-##1) to (B-\fpeval{##1+1});
+          \draw[fill=white](B-##1) circle (\PfMRayonSchemaFdR) node{\ref{page-\thePfMMaquette-\ListeRouteHaute[##1]}};%
+        }
+      }%
+    }%
+    % Route basse
+    \foreach\i in{1,...,\fpeval{\ListeRouteBasselen}}{%
+      \draw[line width=1pt] (A-\fpeval{\i-1}) -- (A-\i);%
+    }%
+    \draw[line width=1pt,>=latex,->] (A-\ListeRouteBasselen) to (A-\fpeval{\ListeRouteBasselen+1});%
+    \xintFor* ##1 in{\xintSeq{1}{\ListeRouteBasselen}}\do{%
+      \xintifboolexpr{\ListeRouteBasse[##1]<0}{}{%
+        \xintifboolexpr{\ListeRouteBasse[##1]==0}{%
+          \draw[fill=white,draw=white](A-##1) circle (\PfMRayonSchemaFdR) node{\faCheck};%
+        }{%
+          \draw[fill=PfMCouleurFdR](A-##1) circle (\PfMRayonSchemaFdR) node{\ref{page-\thePfMMaquette-\ListeRouteBasse[##1]}};%
+        }%
+      }%
+    }%
+  \end{tikzpicture}%
+}%
+
+\NewDocumentCommand\RemplisFdR{m}{%
+  \ifcsname \Alph{PfMMaquette}route#1\endcsname
+  \expandafter\xdef\csname \Alph{PfMMaquette}route#1\endcsname{\csname \Alph{PfMMaquette}route#1\endcsname,\thePfMExo}%
+%  Yes !
+  \else
+%  No !
+  \expandafter\xdef\csname \Alph{PfMMaquette}route#1\endcsname{\thePfMExo}%
+  \fi
+  \immediate\write\@auxout{\noexpand\expandafter\gdef\noexpand\csname \Alph{PfMMaquette}FdR#1\endcsname{\csname \Alph{PfMMaquette}route#1\endcsname}}%
+}%
+
+ 
+\newenvironment{exerciceFdR}[1][]{%
+  \setcounter{PfMAlea}{0}%
+  \setcounter{PfMNbLogo}{1}%
+  \useKVdefault[ClesExercices]%
+  \setKV[ClesExercices]{#1}%
+  \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+  \stepcounter{PfMSection}%
+  \PfMChoixCorrection%
+  \refstepcounter{PfMExo}%
+  \immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Alph{PfMMaquette}-FdRTotalExo}}%
+  % Creation des parcours
+  \ifboolKV[ClesExercices]{Routes}{%
+    % Remise à zéro de conteneurs des parcours
+    \setsepchar{,}%
+    % \ifboolKV[ClesExercices]{Stop}{\xdef\PfMFooListeFdR{\useKV[ClesExercices]{Route},0}}{
+    \xdef\PfMFooListeFdR{\useKV[ClesExercices]{Route}}
+ %   % }%
+    \readlist*\ListeFdR{\PfMFooListeFdR}%
+    \foreachitem\compteur\in\ListeFdR{%
+      \RemplisFdR{\ListeFdR[\compteurcnt]}%
+    }%
+  }{}
+  \ifboolKV[ClesExercices]{Stops}{%
+    \setsepchar{,}%
+    % \ifboolKV[ClesExercices]{Stop}{\xdef\PfMFooListeFdR{\useKV[ClesExercices]{Route},0}}{
+    \xdef\PfMFooListeFdR{stop}%
+    % }%
+    \readlist*\ListeFdR{\PfMFooListeFdR}%
+    \foreachitem\compteur\in\ListeFdR{%
+      \RemplisFdR{\ListeFdR[\compteurcnt]}%
+    }%
+  }{}%
+  %
+  \tcolorbox[%
+  tikzFdR,
+  label is label,
+  label=page-\thePfMMaquette-\thePfMExo
+  ]
+}{\endtcolorbox%
+}
+
+%\makeatother
+
+%%% FdR %%%
+\tcbset{%
+  userfdr/.style={%
+    spread upwards=-1cm,colback=gray!5%
+  }%
+}%
+
+\tcbset{%
+  userfdrcor/.style={%
+    spread upwards=-1cm,colback=gray!5%
+  }%
+}%
+
+\NewDocumentCommand\TikzFdR{}{%
+  \begin{tcolorbox}[userfdr]%
+    \Large\sffamily \useKV[FdR]{Theme}\hfill\useKV[FdR]{Niveau} \useKV[FdR]{Classe}%
+    \par{\tiny\useKV[FdR]{Code}}\hfill{\scriptsize\useKV[FdR]{Date}}%
+  \end{tcolorbox}%
+}
+
+\NewDocumentCommand\TikzFdRCor{m}{%
+  \clearpage
+  \setKV[FdR]{#1}%
+  \begin{tcolorbox}[userfdrcor]%
+    \Large\sffamily \useKV[FdR]{Theme} (Correction) \hfill\useKV[FdR]{Niveau} \useKV[FdR]{Classe}
+    \par{\tiny\useKV[FdR]{Code}}\hfill{\scriptsize\useKV[FdR]{Date}}
+  \end{tcolorbox}%
+}
+
+\tcbset{%
+  tikzFdR/.style={%
+    before skip=1em,
+    enhanced,
+    breakable,
+    colback=white,
+    colframe=PfMCadreFdR,
+    overlay unbroken and first={%
+      \node[%
+      name=A,
+      fill=white,
+      anchor=west,
+      xshift=10pt,
+      ] at (frame.north west){\bfseries\sffamily \useKV[FdR]{NomExercice} \thePfMExo\ifboolKV[ClesExercices]{AffichageTitre}{ : \useKV[ClesExercices]{Titre}}{}};
+      %% 
+      \ifboolKV[ClesExercices]{Calculatrice}{}{\node[fill=white,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\cancel{\faCalculator}};\stepcounter{PfMNbLogo}}
+      \ifboolKV[ClesExercices]{Oral}{\node[fill=white,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\faBullhorn};\stepcounter{PfMNbLogo}}{}
+      %%
+      \ifboolKV[ClesExercices]{AffichageCompetence}{%
+        \node[%
+        fill=white,
+        anchor=east,
+        xshift=-10pt,
+        text=PfMColCpt,%
+        ]
+        at (frame.north east)
+        {\itshape\scriptsize\sffamily Compétence(s) dominante(s) : \useKV[ClesExercices]{Competence}};
+      }{}%
+      %%
+      \ifboolKV[ClesExercices]{AffichageSource}{%
+        \node[%
+        fill=white,
+        anchor=east,
+        xshift=-10pt,
+        text=PfMColSrc,
+        ]
+        at (frame.south east)
+        {\scriptsize\sffamily \useKV[ClesExercices]{Source}};
+      }{}%
+    }%
+  }%
+}%
+%% Fin FdR %%%
+
+
 %%Parcours
 
 %\makeatletter
@@ -590,14 +1191,17 @@
   \setsepchar{,}%
   \readlist*\ListeRetiens{#2}%
     \begin{tikzpicture}[remember picture,overlay]
-      % On place les points
-      \coordinate[xshift=-1cm,yshift=-4cm] (A-1) at (current page.north east);%
+      % On place les points%anchor=base,baseline[xshift=-1cm,yshift=-4cm]
+      \coordinate (A-1) at (0,0);%
       \xintFor* ##1 in{\xintSeq{2}{#1}}\do{%
         \coordinate[yshift=-1cm] (A-##1) at (A-\fpeval{##1-1});%
       }%
       \foreach\i in{2,...,#1}{%
-        \draw[dashed] (A-\fpeval{\i-1}) -- (A-\i);%
+        \draw[line width=1pt] (A-\fpeval{\i-1}) -- (A-\i);%
       }%
+      %
+      \draw[line width=1pt,>=latex,->] (A-#1)--(A-\fpeval{#1+1});
+      %
       \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
         \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};%
       }%
@@ -610,11 +1214,11 @@
 \NewDocumentCommand\BuildParcoursTikz{mm}{%
   \setsepchar{,}%
   \readlist*\ListeRetiens{#2}%
-  \begin{tikzpicture}
+  \begin{tikzpicture}[anchor=center,baseline=-1.25mm]
     % On place les points
     \Orientation=1\relax
-    \coordinate (A-1) at (0,0);%
-    \xintFor* ##1 in{\xintSeq{2}{#1}}\do{%
+    \coordinate[anchor=base,baseline=-1.25mm] (A-1) at (0,0);%
+    \xintFor* ##1 in{\xintSeq{2}{\fpeval{#1+1}}}\do{%
       \modulo{##1}{\useKV[SchemaParcours]{Colonnes}}%
       \ifnum\remainder=0\relax%
       \Orientation=\numexpr\Orientation*(-1)\relax%
@@ -624,8 +1228,11 @@
       \fi%
     }%
     \foreach\i in{2,...,#1}{%
-      \draw[dashed] (A-\fpeval{\i-1}) -- (A-\i);%
+      \draw[line width=1pt] (A-\fpeval{\i-1}) -- (A-\i);%
     }%
+    %
+    \draw[line width=1pt,>=latex,->] (A-#1)--(A-\fpeval{#1+1});
+    %
     \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
       \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};%
     }%
@@ -1537,7 +2144,7 @@
   enhanced,%
   overlay unbroken and first={%
     \node[yshift=1em] at (frame.south) {
-      \scriptsize\sffamily-- Calculatrice \ifboolKV[DS]{Calculatrice}{autorisée}{interdite} --
+      \scriptsize\sffamily-- Calculatrice \ifboolKV[IE]{Calculatrice}{autorisée}{interdite} --
       };%
     }%
   }%
@@ -1609,7 +2216,7 @@
   \setcounter{RetiensRep}{0}%
   \setcounter{RetiensInd}{0}%
   % on remet à zéro le compteur des exercices
-  \setcounter{PfMExo}{0}%
+  %\setcounter{PfMExo}{0}%
   \setcounter{PfMSOS}{0}%
   % nouvelles valeurs.
   \stepcounter{PfMMaquette}%
@@ -1620,23 +2227,51 @@
   \useKVdefault[Boulot]%
   \setKV[Boulot]{#1}%
   \IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}{\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}}%
+  \ifboolKV[Boulot]{FdR}{%
+      \setKV[FdR]{#2}\TikzFdR%
+      \let\exercice\exerciceFdR\let\endexercice\endexerciceFdR%
+      \ifboolKV[Boulot]{CorrigeFin}{%
+        \AddToHook{env/Maquette/after}[Correction]{%
+          \setKV[Boulot]{#1}%
+          \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+          \TikzFdRCor{#2}
+          \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+            \PfMAffichageCorrige%
+          \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+        }%
+      }{}%
+   }{%
+  \ifboolKV[Boulot]{Contrat}{%
+      \setKV[Contrat]{#2}\TikzContrat%
+      \let\exercice\exerciceContrat\let\endexercice\endexerciceContrat%
+      \ifboolKV[Boulot]{CorrigeFin}{%
+        \AddToHook{env/Maquette/after}[Correction]{%
+          \setKV[Boulot]{#1}%
+          \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+          \TikzContratCor{#2}
+          \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+            \PfMAffichageCorrige%
+          \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+        }%
+      }{}%
+   }{%
   \ifboolKV[Boulot]{Cours}{%
-      \setKV[Cours]{#2}%
-      \TikzCours%
-      \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche%
-      %\let\Exercice\exerciceFiche\let\endExercice\endexerciceFiche%
-      \ifboolKV[Boulot]{CorrigeFin}{%
-          \AddToHook{env/Maquette/after}[Correction]{%
-            \setKV[Boulot]{#1}%
-                      \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
-            \TikzFicheCor{#2}%
-            \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
-                \PfMAffichageCorrige%
-                \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
-          }%
-        }{}%
+    \setKV[Cours]{#2}%
+    \TikzCours%
+    \let\exercice\exerciceFiche\let\endexercice\endexerciceFiche%
+    % \let\Exercice\exerciceFiche\let\endExercice\endexerciceFiche%
+    \ifboolKV[Boulot]{CorrigeFin}{%
+      \AddToHook{env/Maquette/after}[Correction]{%
+        \setKV[Boulot]{#1}%
+        \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
+        \TikzFicheCor{#2}%
+        \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
+          \PfMAffichageCorrige%
+          \ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
+        }%
+      }{}%
     }{%
-  \ifboolKV[Boulot]{RecapBrevet}{%
+     \ifboolKV[Boulot]{RecapBrevet}{%
     \setKV[RecapBrevet]{#2}%
     \TikzRecapBrevet%
     \let\exercice\ExerciceRecapBrevet\let\endexercice\endExerciceRecapBrevet%
@@ -1775,7 +2410,7 @@
  %                 \let\Exercice\exerciceDS\let\endExercice\endexerciceDS%On garde exerciceDS
                   \ifboolKV[Boulot]{CorrigeFin}{%
                       \AddToHook{env/Maquette/after}[Correction]{%
-                        \setKV[Boulot]{#1}%
+                      \setKV[Boulot]{#1}%
                       \setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
                       \TikzIECor{#2}%
                       \ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
@@ -1806,8 +2441,10 @@
         }%
       }%
     }%
-    }%
   }%
+  }%
+}%
+}%
 }{}%
 %\makeatother
 



More information about the tex-live-commits mailing list.