summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/profmaquette/latex/ProfMaquette.sty')
-rw-r--r--macros/latex/contrib/profmaquette/latex/ProfMaquette.sty1879
1 files changed, 1879 insertions, 0 deletions
diff --git a/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
new file mode 100644
index 0000000000..c18029cbe4
--- /dev/null
+++ b/macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
@@ -0,0 +1,1879 @@
+% Author : Christophe Poulain
+% 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/06/04}%
+\let\PfMfiledate\filedate%
+\def\fileversion{0.15}%
+\let\PfMfileversion\fileversion%
+\ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]%
+
+% packages nécessaires
+\RequirePackage{verbatim}
+
+\RequirePackage{calc}
+
+\RequirePackage{xlop}
+
+\RequirePackage[most]{tcolorbox}
+\RequirePackage{varwidth}
+\RequirePackage{xinttools}
+
+\RequirePackage{listofitems}
+\RequirePackage{array}
+\RequirePackage{datatool}
+
+%définition des clés
+\RequirePackage{simplekv}
+\setKVdefault[Boulot]{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,Brevet=false,BaremeComplet=false,BaremeGlobal=false,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[DM]{Numero=1,Date=\today,Classe={},Niveau=3,Code=\jobname}
+\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=Nairobi,Code={},NomExercice=Exercice}
+\setKVdefault[PdT]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe=Nairobi,Code={},NomExercice=Exercice}
+\setKVdefault[Parcours]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe=Nairobi,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}}
+\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,TitreExo=Exercice,PasCorrige=false,Direct=false,Pouce=false,Parcours=false}%
+\defKV[ClesExercices]{Source=\setKV[ClesExercices]{AffichageSource}}%
+\defKV[ClesExercices]{Titre=\setKV[ClesExercices]{AffichageTitre}}%
+\defKV[ClesExercices]{Competence=\setKV[ClesExercices]{AffichageCompetence}}%
+\defKV[ClesExercices]{Trajet=\setKV[ClesExercices]{Parcours}}
+\setKVdefault[SchemaParcours]{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
+\setcounter{PfMExo}{0}%
+\newcounter{PfMCorrigeParcoursPerso}%affichage des solutions ou pas dans le cadre d'un parcours perso
+\setcounter{PfMCorrigeParcoursPerso}{0}%
+\newcounter{PfMSOS}%Numéro des SOS dans les parcours fléchés
+\setcounter{PfMSOS}{0}%
+\newcounter{PfMAlea}%Pour repérer les valeurs aléatoires construites automatiquement
+\setcounter{PfMAlea}{0}%
+\newcounter{RetiensSol}%Pour l'affichage des solutions
+\newcounter{RetiensRep}%Pour l'affichage des reponses.
+\newcounter{RetiensInd}%Pour l'affichage des indices.
+\setcounter{RetiensSol}{0}%
+\setcounter{RetiensRep}{0}%
+\setcounter{RetiensInd}{0}%
+\newcounter{PfMNbLogo}%Pour décaler les logos sur la ligne haute de tcolorbox
+\setcounter{PfMNbLogo}{0}%
+\newcounter{Maquette}%Pour compter le nombres de "travaux"
+\setcounter{Maquette}{0}%
+\newcount\Orientation%Pour le schéma des parcours
+% couleurs
+\colorlet{PfMColCpt}{gray!50}
+\colorlet{PfMColSrc}{gray!50}
+\colorlet{PfMCadreFiche}{gray!50}
+\colorlet{PfMCadreDM}{gray!85}
+\colorlet{PfMCadreParcours}{gray!50}
+% Définitions de commandes
+\newcommand\PfMIENom{\dotfill}
+\newcommand\PfMIEPrenom{\dotfill}
+\newcommand\PfMIEClasse{\dotfill}
+\newcommand\PfMCompNA{NA}
+\newcommand\PfMCompECA{ECA}
+\newcommand\PfMCompA{A}
+% Définitions pour les compétences
+\NewDocumentCommand\Competences{O{3}m}{%
+ \setsepchar[*]{/*§}\ignoreemptyitems%
+ \readlist*\ListeCompetence{#2}
+ \ifnum#1=3\relax
+ \buildtabcompetences%
+ \else
+ \Buildtabcompetences{#1}{\listlen\ListeCompetence[1]}%
+ \fi
+}
+
+\def\buildtabcompetences{%
+ \[\begin{tabular}{|p{0.70\linewidth}|*{3}{>{\centering\arraybackslash}p{0.05\linewidth}|}}
+ \cline{2-4}
+ \multicolumn{1}{c|}{}&\PfMCompNA&\PfMCompECA&\PfMCompA\\
+ \hline
+ \xintFor* ##1 in {\xintSeq {1}{\ListeCompetencelen}}\do{\ListeCompetence[##1]&&&\\\hline}
+ \end{tabular}
+ \]
+}%
+
+\newlength\PfMLargeurComp
+
+\def\Buildtabcompetences#1#2{%
+ \setlength{\PfMLargeurComp}{\fpeval{0.85-0.05*#2}\linewidth}%
+ \[\begin{tabular}{|p{\PfMLargeurComp}|*{#1}{>{\centering\arraybackslash}p{0.05\linewidth}|}}%
+ \cline{2-\fpeval{1+#1}}%
+ \multicolumn{1}{c|}{}\xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
+ &\ListeCompetence[1,##1]}\\%
+ \hline%
+ \xintFor* ##1 in {\xintSeq {2}{\ListeCompetencelen}}\do{\ListeCompetence[##1]%
+ \xintFor* ##2 in {\xintSeq{1}{#1}}\do{&}%
+ \\\hline%
+ }%
+ \end{tabular}%
+ \]%
+}%
+
+%%%%
+%%% Définitions des environnements pour la correction
+\makeatletter
+\newwrite\verbatim@out
+
+\def\SolutionWrite{%
+ \@bsphack
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.sol" %
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}
+\def\endSolutionWrite{\immediate\closeout\verbatim@out\@esphack}
+
+\def\SolutionWritePP{%
+ \@bsphack
+ \immediate\openout \verbatim@out "\jobname-PPEx\thePfMExo.sol" %
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}
+\def\endSolutionWritePP{\immediate\closeout\verbatim@out\@esphack}
+
+\def\ReponseWrite{%
+ \@bsphack
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.rep" %
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}
+\def\endReponseWrite{\immediate\closeout\verbatim@out\@esphack}
+
+\def\IndiceWrite{%
+ \@bsphack
+ \immediate\openout \verbatim@out "\jobname-Ex\thePfMExo.cdp" %coup de pouce
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}
+\def\endIndiceWrite{\immediate\closeout\verbatim@out\@esphack}
+\makeatother
+
+\def\SolutionNow{\textbf{Correction de l'exercice --}\par\nopagebreak}
+\def\endSolutionNow{\par\goodbreak}
+
+\def\ReponseNow{\textbf{Réponse(s) de l'exercice --}\par\nopagebreak}
+\def\endReponseNow{\par\goodbreak}
+
+\def\IndiceNow{\textbf{Indice(s) --}\par\nopagebreak}
+\def\endIndiceNow{\par\goodbreak}
+
+\NewDocumentEnvironment{Solution}{}{}{}%
+\NewDocumentEnvironment{Reponse}{}{}{}%
+\NewDocumentEnvironment{Indice}{}{}{}%
+
+\NewDocumentCommand\PfMChoixAffichageCorrection{}{%
+ \ifboolKV[Boulot]{ParcoursPerso}{%
+ \let\Solution\SolutionWritePP\let\endSolution\endSolutionWritePP
+ }{%
+ \ifnum\theRetiensSol=1\relax
+ \let\Reponse\comment\let\endReponse\endcomment
+ \let\Indice\comment\let\endIndice\endcomment
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \let\Solution\SolutionWrite\let\endSolution\endSolutionWrite
+ }{\ifboolKV[Boulot]{CorrigeApres}{%
+ \let\Solution\SolutionNow\let\endSolution\endSolutionNow
+ }{}%
+ }%
+ \else
+ \let\Solution\comment\let\endSolution\endcomment
+ \let\Indice\comment\let\endIndice\endcomment
+ \ifnum\theRetiensRep=1\relax
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \let\Reponse\ReponseWrite\let\endReponse\endReponseWrite
+ }{\ifboolKV[Boulot]{CorrigeApres}{%
+ \let\Reponse\ReponseNow\let\endReponse\endReponseNow
+ }{}%
+ }%
+ \else
+ \let\Solution\comment\let\endSolution\endcomment
+ \let\Reponse\comment\let\endReponse\endcomment
+ \ifnum\theRetiensInd=1\relax
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \let\Indice\IndiceWrite\let\endIndice\endIndiceWrite
+ }{\ifboolKV[Boulot]{CorrigeApres}{%
+ \let\Indice\IndiceNow\let\endIndice\endIndiceNow
+ }{}%
+ }%
+ \fi
+ \fi
+ \fi
+ }%
+}%
+
+\NewDocumentCommand\PfMChoixCorrection{}{%
+ \setcounter{RetiensSol}{0}
+ \setcounter{RetiensRep}{0}
+ \setcounter{RetiensInd}{0}
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \setcounter{RetiensSol}{1}%
+ \setcounter{RetiensRep}{0}%
+ \setcounter{RetiensInd}{0}%
+ }{\ifboolKV[Boulot]{CorrigeApres}{%
+ \setcounter{RetiensSol}{1}%
+ \setcounter{RetiensRep}{0}%
+ \setcounter{RetiensInd}{0}%
+ }{}%
+ }%
+ \ifboolKV[ClesExercices]{PasCorrige}{%
+ \setcounter{RetiensSol}{0}
+ \setcounter{RetiensRep}{0}
+ \setcounter{RetiensInd}{0}%
+ }{%
+ \ifboolKV[ClesExercices]{Direct}{%
+ \setcounter{RetiensSol}{0}
+ \setcounter{RetiensRep}{1}
+ \setcounter{RetiensInd}{0}%
+ }{%
+ \ifboolKV[ClesExercices]{Pouce}{
+ \setcounter{RetiensSol}{0}
+ \setcounter{RetiensRep}{0}
+ \setcounter{RetiensInd}{1}%
+ }{}%
+ }%
+ }%
+}%
+
+\NewDocumentCommand\PfMAffichageCorrige{}{%
+ \xintFor* ##1 in{\xintSeq{1}{\thePfMExo}}\do{%
+ \IfFileExists{\jobname-Ex##1.sol}{\textbf{Corrigé de l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ex##1.rep}{\textbf{Réponse(s) seule(s) de l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.rep}\par\goodbreak}{%
+ \IfFileExists{\jobname-Ex##1.cdp}{\textbf{Indice(s) pour l'exercice ##1}\par\nopagebreak\input{\jobname-Ex##1.cdp}\par\goodbreak}{}
+ }%
+ }%
+ }%
+}%
+%%%%%%%% BAREME %%%%%%%%%%%
+%% Bareme
+\newlength{\brouillon}
+
+\newcommand*\FranPt[1]{%
+ \ifboolKV[ClesExercices]{BaremeDetaille}{%
+ \color{gray!75}(\num{#1})%
+ }{}
+}
+
+\makeatletter
+\newcommand\BaremeEspace@Marge{15pt}
+\newcommand\BaremeEspace@MargeCorrection{0pt}
+%\f@size est la taille par défaut de la fonte.
+
+\newcommand*{\brm}[1]{%
+ \ifboolKV[Boulot]{Fiche}{}{%
+ \immediate\write\@auxout{%
+ \string\opadd*{#1}%
+ {total\the\c@section-\the\c@PfMExo}%
+ {total\the\c@section-\the\c@PfMExo}%
+ \string\opcopy{\thePfMExo}{TotalExo}%
+ }%
+ \ifboolKV[ClesExercices]{BaremeDetaille}{%
+ \setlength{\brouillon}{\BaremeEspace@Marge-\linewidth+\textwidth}%
+ \makebox[0pt][r]{\footnotesize\FranPt{#1}\hspace*{\brouillon}}%
+ \ignorespaces%
+ }%
+ }{}%
+}%
+
+\newcommand*{\Brm}[1]{%
+ \ifboolKV[Boulot]{Fiche}{}{%
+ \setlength{\brouillon}{\BaremeEspace@MargeCorrection-\linewidth+\textwidth}%
+ \makebox[0pt][r]{\footnotesize\color{gray!75}(\opprint{#1})\hspace*{\brouillon}}%
+ \ignorespaces%
+ }%
+}%
+
+\newcommand\total[1]{%
+ \@ifundefined{Op@total#1}{recompilez}%
+ {%
+ \opunzero{total#1}% on ne sait jamais
+ \opset{decimalsepsymbol={,}}
+ \opprint{total#1}~%
+ \opset{decimalsepsymbol={.}}
+ \opcmp{total#1}{2}%
+ \ifopge \useKV[ClesExercices]{MotPoint}s\else \useKV[ClesExercices]{MotPoint}\fi
+ }%
+}
+
+\newcommand\NoteFinale{%
+ \@ifundefined{Op@TotalExo}{Recompilez}%
+ {%
+ \opexport{TotalExo}{\TotalExo}%Le total d'exercices est \TotalExo.
+ \xdef\NoteTotale{0}%
+ \xintFor* ##1 in {\xintSeq{1}{\TotalExo}}\do{%
+ \opexport{total##1-##1}{\totalUn}%
+ \xdef\NoteTotale{\fpeval{\NoteTotale+\totalUn}}%
+ }%
+ \NoteTotale%
+ }%
+}%
+
+\newcommand\TableauRecapitulatif{%
+ \@ifundefined{Op@TotalExo}{Recompilez}%
+ {%
+ \opexport{TotalExo}{\TotalExo}%
+ \begin{tabular}{|c|c|}
+ \hline
+ \multicolumn{2}{|c|}{Barème récapitulatif}\\
+ \hline
+ \xintFor* ##1 in {\xintSeq{1}{\TotalExo}}\do{
+ Exercice ##1&\total{##1-##1}\\
+ }
+ \hline
+ \end{tabular}
+ }
+}%
+\makeatother
+%%%%%%%% FIN BAREME %%%%%%%%%%%%%%%%
+%%%Style des différents documents
+\tcbset{%
+ tikzbase/.style={%
+ before skip=1em,
+ enhanced,
+ breakable,
+ bicolor,
+ colback=LightSteelBlue,
+ colbacklower=white,
+ frame hidden,
+ }
+}
+
+\tcbset{%
+ tikzbasehtml/.style={%
+ before skip=1em,
+ enhanced,
+ breakable,
+ frame hidden,
+ }
+}
+
+\makeatletter
+%%% Base des exercices DM
+\tcbset{%
+ BaseDM/.style={%
+ lowerbox=ignored,
+ enhanced,
+ breakable,
+ colback=white,
+ colframe=PfMCadreDM,
+ fonttitle=\bfseries\sffamily,
+ title=Exercice \thePfMExo,
+ attach boxed title to top left={xshift=0.2mm},
+ boxed title size=standard,
+ boxed title style={%
+ empty,
+ rounded corners=north,
+ boxrule=0pt,
+ bottom=0pt
+ },
+ underlay boxed title={%
+ \filldraw[rounded corners, gray!85, line width=.5mm]
+ (title.south east)--++(90:\tcboxedtitleheight)--++(183:\tcboxedtitlewidth)--++(-90:\tcboxedtitleheight)|-cycle;
+ },%
+ overlay unbroken and first={%
+ \ifboolKV[ClesExercices]{AffichageSource}{%
+ \node[%
+ fill=white,
+ anchor=east,
+ xshift=-10pt,
+ text=gray!50,
+ ]
+ at (frame.south east)
+ {\scriptsize\sffamily \useKV[ClesExercices]{Source}};
+ }{}%
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \node[
+ fill=white,
+ anchor=east,
+ xshift=-10pt,
+ text=black,
+ font=\bfseries
+ ]
+ at (frame.north east)
+ {\footnotesize\sffamily \total{\the\c@section-\the\c@PfMExo}};
+ }{}
+ }%
+ }%
+}%
+
+\newenvironment{exerciceDM}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \useKVdefault[ClesExercices]
+ \setKV[ClesExercices]{#1}
+ \refstepcounter{section}
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}
+ \immediate\write\@auxout{%
+ \string\opcopy{\thePfMExo}{TotalExo}%
+ }
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \immediate\write\@auxout{%
+ \string\opcopy{0}{total\the\c@section-\the\c@PfMExo}%
+ }}{}
+ \tcolorbox[%
+ BaseDM,
+ label is label,
+ label=page-\theMaquette-\thePfMExo%
+ ]
+}{%
+ \endtcolorbox%
+}
+
+%%Parcours
+
+%\makeatletter
+\NewDocumentCommand\AfficheParcours{om}{%
+ \useKVdefault[SchemaParcours]%
+ \setKV[SchemaParcours]{#1}%
+ \setlength{\PfMLargeurSchemaParcours}{\useKV[SchemaParcours]{Largeur}}%
+ \colorlet{PfMCouleurSP}{\useKV[SchemaParcours]{Couleur}}%
+ \@ifundefined{Op@ParcoursTotalExo}{Recompilez pour obtenir le parcours.}%
+ {%
+ \opexport{ParcoursTotalExo}{\ParcoursTotalExo}%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeExercicesPA{\csname Parcours#2\endcsname}
+ \reademptyitems%
+ \xdef\PfCFooTestA{\ListeExercicesPA[1]}%
+ \ifnum\ListeExercicesPAlen>1\relax%
+ \xintFor* ##1 in{\xintSeq{2}{\ListeExercicesPAlen}}\do{%
+ \xdef\PfCFooTestA{\PfCFooTestA,\ListeExercicesPA[##1]}%
+ }%
+ \fi%
+ \ifboolKV[Parcours]{Vertical}{%
+ \BuildParcoursTikzV{\ParcoursTotalExo}{\PfCFooTestA}%
+ }{%
+ \BuildParcoursTikz{\ParcoursTotalExo}{\PfCFooTestA}%
+ }%
+ }%
+}%
+%\makeatother
+
+\NewDocumentCommand\BuildParcoursTikzV{mm}{%
+ \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);%
+ \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);%
+ }%
+ \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
+ \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};%
+ }%
+ \foreachitem\compteur\in\ListeRetiens{%
+ \draw[fill=PfMCouleurSP](A-\ListeRetiens[\compteurcnt]) circle (2.5mm) node{\ref{page-\theMaquette-\ListeRetiens[\compteurcnt]}};%
+ }%
+ \end{tikzpicture}%
+}%
+
+\NewDocumentCommand\BuildParcoursTikz{mm}{%
+ \setsepchar{,}%
+ \readlist*\ListeRetiens{#2}%
+ \begin{tikzpicture}
+ % On place les points
+ \Orientation=1\relax
+ \coordinate (A-1) at (0,0);%
+ \xintFor* ##1 in{\xintSeq{2}{#1}}\do{%
+ \modulo{##1}{\useKV[SchemaParcours]{Colonnes}}%
+ \ifnum\remainder=0\relax%
+ \Orientation=\numexpr\Orientation*(-1)\relax%
+ \coordinate[yshift=-1cm] (A-##1) at (A-\fpeval{##1-1});%
+ \else%
+ \coordinate[xshift=\the\Orientation*\PfMLargeurSchemaParcours] (A-##1) at (A-\fpeval{##1-1});%
+ \fi%
+ }%
+ \foreach\i in{2,...,#1}{%
+ \draw[dashed] (A-\fpeval{\i-1}) -- (A-\i);%
+ }%
+ \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
+ \draw[fill=white,dashed](A-##1) circle (2.5mm) node{##1};%
+ }%
+ \foreachitem\compteur\in\ListeRetiens{%
+ \draw[fill=PfMCouleurSP](A-\ListeRetiens[\compteurcnt]) circle (2.5mm) node{\ref{page-\theMaquette-\ListeRetiens[\compteurcnt]}};%
+ }%
+ \end{tikzpicture}%
+}%
+
+\NewDocumentCommand\RemplisParcours{m}{%
+ \ifcsname trajet#1\endcsname
+ \expandafter\xdef\csname trajet#1\endcsname{\csname trajet#1\endcsname,\thePfMExo}%
+% Yes !
+ \else
+% No !
+ \expandafter\xdef\csname trajet#1\endcsname{\thePfMExo}%
+ \fi
+ \immediate\write\@auxout{\noexpand\expandafter\gdef\noexpand\csname Parcours#1\endcsname{\csname trajet#1\endcsname}}%
+}%
+
+\def\exerciceParcoursPerso{%
+ \stepcounter{PfMExo}%
+ \PfMChoixCorrection%
+ \@bsphack%
+ \immediate\openout \verbatim@out "\jobname-PPEx\thePfMExo.tex" %
+ \let\do\@makeother\dospecials%
+ \catcode`\^^M\active%
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}%
+
+\def\endexerciceParcoursPerso{\immediate\closeout\verbatim@out\@esphack}%
+
+\newenvironment{exerciceParcours}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \setcounter{PfMNbLogo}{1}%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+ \refstepcounter{section}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \immediate\write\@auxout{\string\opcopy{\thePfMExo}{ParcoursTotalExo}}%
+ % Creation des parcours
+ \ifboolKV[ClesExercices]{Parcours}{%
+ \setsepchar{,}%
+ \xdef\PfMFooListeParcours{\useKV[ClesExercices]{Trajet}}
+ \readlist*\ListeParcours{\PfMFooListeParcours}%
+ \foreachitem\compteur\in\ListeParcours{%
+ \RemplisParcours{\ListeParcours[\compteurcnt]}%
+ }%
+ }{}%
+ %
+ \tcolorbox[%
+ tikzparcours,
+ label is label,
+ label=page-\theMaquette-\thePfMExo
+ ]
+}{\endtcolorbox%
+}
+
+\newenvironment{exerciceFiche}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \setcounter{PfMNbLogo}{1}%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+ \refstepcounter{section}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \tcolorbox[%
+ tikzfiche,
+ label is label,
+ label=page-\theMaquette-\thePfMExo
+ ]
+}{\endtcolorbox%
+}
+
+\newenvironment{exerciceDS}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \refstepcounter{section}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \immediate\write\@auxout{%
+ \string\opcopy{\thePfMExo}{TotalExo}%
+ }
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \immediate\write\@auxout{%
+ \string\opcopy{0}{total\the\c@section-\the\c@PfMExo}%
+ }}{}
+ \tcolorbox[%
+ tikzds,
+ label is label,
+ label=page-\theMaquette-\thePfMExo
+ ]
+}{\endtcolorbox%
+}
+\makeatother
+%%% Recap Brevet
+% Fiche Exercice Brevet
+\newcommand\TikzRecapBrevet{%
+\begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[RecapBrevet]{Theme}
+ \par{\tiny\useKV[RecapBrevet]{Code}}\hfill{\scriptsize\useKV[RecapBrevet]{Date}}
+ \end{tcolorbox}%
+}
+
+\newcommand\TikzRecapBrevetCor[1]{%
+ \clearpage
+ \setKV[RecapBrevet]{#1}%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[RecapBrevet]{Theme} (Correction)
+ \par{\tiny\useKV[RecapBrevet]{Code}}\hfill{\scriptsize\useKV[RecapBrevet]{Date}}
+ \end{tcolorbox}%
+}
+
+\makeatletter
+\newenvironment{ExerciceRecapBrevet}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \refstepcounter{section}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \immediate\write\@auxout{%
+ \string\opcopy{0}{total\the\c@section-\the\c@PfMExo}%
+ }%
+ }{}%
+ \tcolorbox[%
+ tikzrecapbrevet,
+ label is label,
+ label=page-\theMaquette-\thePfMExo
+ ]
+}{\endtcolorbox%
+}
+
+\tcbset{%
+ tikzrecapbrevet/.style={%
+ before skip=1em,%
+ enhanced,%
+ breakable,%
+ colback=white,%
+ colframe=PfMCadreFiche,%
+ overlay unbroken and first={%
+ \node[%
+ name=A,%
+ fill=white,%
+ anchor=west,%
+ xshift=10pt,%
+ ] at (frame.north west){\bfseries\sffamily \useKV[Fiche]{NomExercice} \thePfMExo\ifboolKV[ClesExercices]{AffichageTitre}{ : \useKV[ClesExercices]{Titre}}{}};%
+ %%
+ \node[%
+ fill=white,%
+ anchor=east,%
+ xshift=-10pt,%
+ text=black,%
+ font=\bfseries%
+ ]
+ at (frame.north east)%
+ {\footnotesize\sffamily \total{\the\c@section-\the\c@PfMExo}};%
+ }%
+ }%
+}%
+\makeatother
+%% PDT
+\tcbset{%
+ tikzpdt/.style={%
+ top=\ifboolKV[ClesExercices]{PasTitre}{0mm}{2mm},bottom=0mm,left=0mm,right=0mm,%
+ before skip=1em,
+ enhanced,
+ breakable,
+ colback=white,
+ colframe=blue!50,
+ remember,
+ overlay unbroken and first={%
+ \coordinate[xshift=2pt,yshift=-2pt] (NO-\thePfMExo) at (frame.north west);%
+ \coordinate[xshift=-2pt,yshift=-2pt] (NE-\thePfMExo) at (frame.north east);%
+ \coordinate[xshift=-2pt,yshift=2pt] (SE-\thePfMExo) at (frame.south east);%
+ \coordinate[xshift=2pt,yshift=2pt] (SO-\thePfMExo) at (frame.south west);%
+ \coordinate (N-\thePfMExo) at (frame.north);
+ \coordinate (S-\thePfMExo) at (frame.south);
+ \coordinate (E-\thePfMExo) at (frame.east);
+ \coordinate (O-\thePfMExo) at (frame.west);
+ \ifboolKV[ClesExercices]{PasTitre}{%
+ \coordinate[xshift=10pt] (A) at (frame.north west);
+ }{%
+ \node[%
+ name=A,
+ fill=white,
+ anchor=west,
+ xshift=10pt,
+ ] at (frame.north west){\bfseries\sffamily \useKV[PdT]{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}};
+ }{}%
+ }%
+ }%
+}%
+
+\NewDocumentCommand\TikzPdT{}{%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[PdT]{Theme}\hfill\useKV[PdT]{Niveau} \useKV[PdT]{Classe}%
+ \par{\tiny\useKV[PdT]{Code}}\hfill{\scriptsize\useKV[PdT]{Date}}%
+ \end{tcolorbox}%
+}
+
+\NewDocumentCommand\TikzPdTCor{m}{%
+ \clearpage
+ \setKV[PdT]{#1}%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[PdT]{Theme} (Correction) \hfill\useKV[PdT]{Niveau} \useKV[PdT]{Classe}
+ \par{\tiny\useKV[PdT]{Code}}\hfill{\scriptsize\useKV[PdT]{Date}}
+ \end{tcolorbox}%
+}
+
+\newenvironment{exercicePdT}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \setcounter{PfMNbLogo}{1}
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+ \refstepcounter{section}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \tcolorbox[%
+ tikzpdt
+ ]%
+}{\endtcolorbox%
+}
+
+\newenvironment{SOS}[1][]{%
+ \stepcounter{PfMSOS}%
+ \tcolorbox[%
+ enhanced,
+ remember,%
+ tikzsos,
+ overlay unbroken and first={%
+ \coordinate[xshift=2pt,yshift=-2pt] (SOS-NO-\thePfMSOS) at (frame.north west);%
+ \coordinate[xshift=-2pt,yshift=-2pt] (SOS-NE-\thePfMSOS) at (frame.north east);%
+ \coordinate[xshift=-2pt,yshift=2pt] (SOS-SE-\thePfMSOS) at (frame.south east);%
+ \coordinate[xshift=2pt,yshift=2pt] (SOS-SO-\thePfMSOS) at (frame.south west);%
+ \coordinate (SOS-N-\thePfMSOS) at (frame.north);
+ \coordinate (SOS-S-\thePfMSOS) at (frame.south);
+ \coordinate (SOS-E-\thePfMSOS) at (frame.east);
+ \coordinate (SOS-O-\thePfMSOS) at (frame.west);
+ }%
+ ]%
+}{\endtcolorbox%
+}
+
+\tikzstyle{cheminPdT}=[-stealth]
+
+\NewDocumentCommand\CheminVrai{m}{%
+ \setsepchar[*]{,*/}%
+ \readlist*\ListeCheminVrai{#1}%
+ \setsepchar{,}%
+ \begin{tikzpicture}[remember picture,overlay]%
+ \foreachitem\compteur\in\ListeCheminVrai{%
+ \draw[cheminPdT] (\ListeCheminVrai[\compteurcnt,1]) to node[midway]{\Large \RKbigsmile}(\ListeCheminVrai[\compteurcnt,2]);%
+ }%
+ \end{tikzpicture}%
+}%
+
+\NewDocumentCommand\CheminFaux{m}{%
+ \setsepchar[*]{,*/}%
+ \readlist*\ListeCheminVrai{#1}%
+ \setsepchar{,}%
+ \begin{tikzpicture}[remember picture,overlay]%
+ \foreachitem\compteur\in\ListeCheminVrai{%
+ \draw[cheminPdT] (\ListeCheminVrai[\compteurcnt,1]) to node[midway]{\Large \RKdevilish}(\ListeCheminVrai[\compteurcnt,2]);%
+ }%
+ \end{tikzpicture}%
+}%
+
+\tcbset{%
+ tikzsos/.style={%
+ left=0pt,right=0pt,top=0pt,bottom=0pt,%
+ colback=Crimson!15,%
+ colframe=Crimson!50,%
+ }%
+}%
+
+%% Kholle
+\tcbset{%
+ tikzkholle/.style={%
+ before skip=1em,
+ enhanced,
+ breakable,
+ colback=white,
+ colframe=gray!50,
+ overlay unbroken and first={%
+ \node[%
+ name=A,
+ fill=white,
+ anchor=west,
+ xshift=10pt,
+ ] at (frame.north west){\ifboolKV[ClesExercices]{AffichageTitre}{%
+ {\bfseries\sffamily\useKV[ClesExercices]{Titre}}%
+ }{\bfseries\sffamily Exercice \thePfMExo}%
+ \xintifboolexpr{\useKV[ClesExercices]{Difficulte}<1}{}{%
+ ~(\foreach \s in {1,...,\useKV[ClesExercices]{Difficulte}}{%
+ $\star$%
+ })%
+ }
+ }
+ ;
+ %%
+ \ifboolKV[ClesExercices]{AffichageSource}{%
+ \node[
+ fill=white,
+ anchor=east,
+ xshift=-10pt,
+ text=gray!50,
+ ]
+ at (frame.south east)
+ {\scriptsize\sffamily \useKV[ClesExercices]{Source}};
+ }{}
+ }
+ }
+}
+
+\newenvironment{CRNote}{%
+ \tcolorbox[colback=white,height=2cm,title=NOTE,fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white,enhanced,%
+ overlay unbroken and first={%
+ \node[%
+ anchor=east,
+ yshift=-8pt,
+ xshift=-10pt,
+ text=black,
+ ]
+ at (frame.north east)
+ {\sffamily\bfseries \useKV[Kholle]{NomEleve}};
+ \node[%
+ anchor=center,
+ yshift=-8pt,
+ text=black,
+ ]
+ at (frame.north)
+ {\sffamily\bfseries \useKV[Kholle]{Date}};
+ }
+ ]%
+ }{%
+ \endtcolorbox%
+}
+
+\newlength{\CRRHauteur}
+\setlength{\CRRHauteur}{10cm}
+
+\newenvironment{CRRemarque}{%
+ \tcolorbox[colback=white,height=\CRRHauteur,title=REMARQUE(S),fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white%
+ ]}
+{%
+ \endtcolorbox%
+}%
+
+\NewDocumentEnvironment{exerciceKholle}{o}{%
+ \useKVdefault[ClesExercices]%
+ \setKV[ClesExercices]{#1}%
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}%
+ \PfMChoixCorrection%
+ \refstepcounter{PfMExo}%
+ \tcolorbox[%
+ tikzkholle,
+ label is label,
+ label=page-\theMaquette-\thePfMExo
+ ]
+}{\endtcolorbox%
+}
+
+\newenvironment{exerciceBase}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \setcounter{PfMNbLogo}{1}
+ \useKVdefault[ClesExercices]
+ \setKV[ClesExercices]{#1}
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}
+ \refstepcounter{PfMExo}
+ \tcolorbox[%
+ tikzbase
+ ]
+}{\endtcolorbox%
+}
+
+\newenvironment{exerciceBaseHTML}[1][]{%
+ \setcounter{PfMAlea}{0}%
+ \setcounter{PfMNbLogo}{1}
+ \useKVdefault[ClesExercices]
+ \setKV[ClesExercices]{#1}
+ \setKV[ClesExercices]{BaremeTotal=false,BaremeDetaille=false}
+ \refstepcounter{PfMExo}
+ \tcolorbox[%
+ standard jigsaw, opacityback=0,
+ lowerbox=ignored,
+ tikzbasehtml
+ ]
+}{\endtcolorbox%
+}
+
+%Alias pour tous les exercices.
+\NewDocumentEnvironment{exercice}{}{}{}%
+
+%%%%%%%%% STyle Kholle%%%%%%%%%%
+% Kholle
+\newcommand\TikzKholle{%
+ \clearpage
+ \begin{tcolorbox}[frame hidden,colback=white,enhanced,%
+ borderline north={3pt}{0pt}{gray!85},
+ borderline north={2pt}{0.5pt}{gray!15},
+ borderline south={3pt}{0pt}{gray!85},
+ borderline south={2pt}{0.5pt}{gray!15},
+ ]%
+ \sffamily Interrogation Orale \no\useKV[Kholle]{Numero}\hfill
+ \ifboolKV[Kholle]{CR}{}{Sujet \useKV[Kholle]{Sujet}\hfill}\useKV[Kholle]{Niveau}%
+ \par\useKV[Kholle]{Lieu}\hfill Le \useKV[Kholle]{Date}%
+ \end{tcolorbox}%
+}
+
+\newcommand\TikzKholleCor[1]{%
+ \clearpage
+ \setKV[Kholle]{#1}
+ \begin{tcolorbox}[colback=white,height=2cm,title=NOTE,fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white,enhanced,%
+ overlay unbroken and first={%
+ \node[%
+ anchor=east,
+ yshift=-8pt,
+ xshift=-10pt,
+ text=black,
+ ]
+ at (frame.north east)
+ {\sffamily\bfseries Nom : \hbox to5cm{}};
+ \node[%
+ anchor=center,
+ yshift=-8pt,
+ text=black,
+ ]
+ at (frame.north)
+ {\sffamily\bfseries \useKV[Kholle]{Date}};
+ }
+ ]%
+ \end{tcolorbox}%
+ \begin{tcolorbox}[colback=white,height=2cm,title=EXERCICE(S),fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white%
+ ]%
+ \end{tcolorbox}%
+ \begin{tcolorbox}[colback=white,height=\textheight-5cm,title=REMARQUE(S),fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white%
+ ]%
+ \end{tcolorbox}%
+}
+
+%%%%%%%%%% Style DM%%%%%%%%%%%%%
+\NewDocumentCommand\TikzDM{}{%
+ \clearpage%
+ \begin{tcolorbox}[frame hidden,colback=white,enhanced,%
+ borderline north={3pt}{0pt}{gray!85},%
+ borderline north={2pt}{0.5pt}{gray!15},%
+ borderline south={3pt}{0pt}{gray!85},%
+ borderline south={2pt}{0.5pt}{gray!15},%
+ ]%
+ \sffamily Devoir en temps libre \useKV[DM]{Numero}\hfill\useKV[DM]{Niveau} \useKV[DM]{Classe}%\no
+ \par{\tiny\useKV[DM]{Code}}\hfill{\scriptsize Pour le \useKV[DM]{Date}}%
+ \end{tcolorbox}%
+}%
+
+\NewDocumentCommand\TikzDMCor{m}{%
+ \clearpage
+ \setKV[DM]{#1}
+ \begin{tcolorbox}[colback=white,height=\PfMHauteurAppreciation,title=APPR\'ECIATION,fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white,enhanced,%
+ overlay unbroken and first={%
+ \node[%
+ inner sep=0pt,
+ fill=white,
+ anchor=east,
+ yshift=-9pt,
+ xshift=-10pt,
+ text=black,
+ ]
+ at (frame.north east)
+ {\scriptsize\sffamily\bfseries \useKV[DM]{Code}};
+ }
+ ]%
+ \end{tcolorbox}%
+ \begin{tcolorbox}[colback=white,height=\PfMHauteurRemarque,title=CONSEIL(S) / REMARQUE(S),fonttitle=\color{black}\bfseries\sffamily,colbacktitle=white%
+ ]%
+ \end{tcolorbox}%
+}
+%%%%%%Style Fiche
+\NewDocumentCommand\TikzFiche{}{%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[Fiche]{Theme}\hfill\useKV[Fiche]{Niveau} \useKV[Fiche]{Classe}%
+ \par{\tiny\useKV[Fiche]{Code}}\hfill{\scriptsize\useKV[Fiche]{Date}}%
+ \end{tcolorbox}%
+}
+
+\NewDocumentCommand\TikzFicheCor{m}{%
+ \clearpage
+ \setKV[Fiche]{#1}%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[Fiche]{Theme} (Correction) \hfill\useKV[Fiche]{Niveau} \useKV[Fiche]{Classe}
+ \par{\tiny\useKV[Fiche]{Code}}\hfill{\scriptsize\useKV[Fiche]{Date}}
+ \end{tcolorbox}%
+}
+
+\tcbset{%
+ tikzfiche/.style={%
+ before skip=1em,
+ enhanced,
+ breakable,
+ colback=white,
+ colframe=PfMCadreFiche,
+ overlay unbroken and first={%
+ \node[%
+ name=A,
+ fill=white,
+ anchor=west,
+ xshift=10pt,
+ ] at (frame.north west){\bfseries\sffamily \useKV[Fiche]{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}};
+ }{}%
+ }%
+ }%
+}%
+%%% Parcours %%%
+\NewDocumentCommand\TikzParcours{}{%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[Parcours]{Theme}\hfill\useKV[Parcours]{Niveau} \useKV[Parcours]{Classe}%
+ \par{\tiny\useKV[Parcours]{Code}}\hfill{\scriptsize\useKV[Parcours]{Date}}%
+ \end{tcolorbox}%
+}
+
+\NewDocumentCommand\TikzParcoursCor{m}{%
+ \clearpage
+ \setKV[Parcours]{#1}%
+ \begin{tcolorbox}[spread upwards=-1cm,colback=gray!5]%
+ \Large\sffamily \useKV[Parcours]{Theme} (Correction) \hfill\useKV[Parcours]{Niveau} \useKV[Parcours]{Classe}
+ \par{\tiny\useKV[Parcours]{Code}}\hfill{\scriptsize\useKV[Parcours]{Date}}
+ \end{tcolorbox}%
+}
+
+\tcbset{%
+ tikzparcours/.style={%
+ before skip=1em,
+ enhanced,
+ breakable,
+ colback=white,
+ colframe=PfMCadreParcours,
+ overlay unbroken and first={%
+ \node[%
+ name=A,
+ fill=white,
+ anchor=west,
+ xshift=10pt,
+ ] at (frame.north west){\bfseries\sffamily \useKV[Parcours]{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 Parcours %%%
+%%% DS %%%
+\newcommand\TikzDS{%
+ \clearpage
+ \begin{tcolorbox}[colback=gray!5,%
+ enhanced,%
+ overlay unbroken and first={%
+ \node[yshift=1em] at (frame.south) {\scriptsize\sffamily-- Calculatrice \ifboolKV[DS]{Calculatrice}{autorisée}{interdite} --};
+ }
+ ]%
+ \sffamily Devoir surveillé \no\useKV[DS]{Numero} (Sujet \useKV[DS]{Sujet})\hfill\useKV[DS]{Niveau} \useKV[DS]{Classe}
+ \par{\tiny\useKV[DS]{Code}}\hfill{\scriptsize\useKV[DS]{Date}}
+ \end{tcolorbox}%
+}%
+
+\newcommand\TikzDSCor[1]{%
+ \clearpage
+ \setKV[DS]{#1}
+ \begin{tcolorbox}[colback=gray!5]%
+ \sffamily Devoir surveillé \no\useKV[DS]{Numero} (Sujet \useKV[DS]{Sujet})\hfill\useKV[DS]{Niveau} \useKV[DS]{Classe}%
+ \par Correction%
+ \end{tcolorbox}%
+}
+
+\makeatletter
+\tcbset{%
+ tikzds/.style={%
+ enhanced,
+ breakable,
+ before skip=2mm,after skip=2mm,
+ colback=white,
+ attach boxed title to top left={xshift=1cm,yshift*=1mm-\tcboxedtitleheight},
+ varwidth boxed title*=-3cm,
+ boxed title style={frame code={
+ \path[fill=tcbcolback!30!black]
+ ([yshift=-1mm,xshift=-1mm]frame.north west)
+ arc[start angle=0,end angle=180,radius=1mm]
+ ([yshift=-1mm,xshift=1mm]frame.north east)
+ arc[start angle=180,end angle=0,radius=1mm];
+ \path[left color=tcbcolback!60!black,right color=tcbcolback!60!black,
+ middle color=tcbcolback!80!black]
+ ([xshift=-2mm]frame.north west) -- ([xshift=2mm]frame.north east)
+ [rounded corners=1mm]-- ([xshift=1mm,yshift=-1mm]frame.north east)
+ -- (frame.south east) -- (frame.south west)
+ -- ([xshift=-1mm,yshift=-1mm]frame.north west)
+ [sharp corners]-- cycle;
+ },interior engine=empty,
+ },
+ fonttitle=\bfseries\sffamily,
+ title=Exercice \thePfMExo \ifboolKV[ClesExercices]{AffichageTitre}{ : \useKV[ClesExercices]{Titre}}{},
+ overlay unbroken and first={%
+ \ifboolKV[ClesExercices]{AffichageSource}{%
+ \node[
+ fill=white,
+ anchor=east,
+ yshift=0.5pt,
+ xshift=-10pt,
+ text=gray!85,
+ ]
+ at (frame.south east)
+ {\scriptsize\sffamily \useKV[ClesExercices]{Source}};
+ }{}
+ \ifboolKV[ClesExercices]{BaremeTotal}{%
+ \node[
+ fill=white,
+ anchor=east,
+ xshift=-10pt,
+ text=black,
+ font=\bfseries
+ ]
+ at (frame.north east)
+ {\footnotesize\sffamily \total{\the\c@section-\the\c@PfMExo}};
+ }{}
+ }%
+ }%
+}%
+\makeatother
+%Interrogations écrites
+\newcommand\TikzIE{%
+ \clearpage
+ \begin{minipage}{0.6\linewidth}
+ \begin{tcolorbox}[colback=gray!5,
+ enhanced,%
+ overlay unbroken and first={%
+ \node[yshift=1em] at (frame.south) {\scriptsize\sffamily-- Calculatrice \ifboolKV[IE]{Calculatrice}{autorisée}{interdite} --};
+ }
+ ]%
+ \sffamily \useKV[IE]{Nom} \no\useKV[IE]{Numero} : \useKV[IE]{Theme} \ifboolKV[IE]{Sujets}{\scriptsize(Sujet \useKV[IE]{Sujet})}{}
+ \vspace{1em}
+ \par{\tiny\useKV[IE]{Code}}\hfill{\scriptsize\useKV[IE]{Date}}
+ \end{tcolorbox}%
+ \end{minipage}\hfill\begin{minipage}{0.35\linewidth}
+ Nom : \PfMIENom\\[0.5em]
+ Prénom : \PfMIEPrenom\\[0.5em]
+ Classe : \PfMIEClasse
+ \end{minipage}
+ \par\bigskip
+}
+
+\newcommand\TikzIECor[1]{%
+ \clearpage
+ \setKV[IE]{#1}
+ \begin{tcolorbox}[colback=gray!5,
+ enhanced,%
+ overlay unbroken and first={%
+ \node[yshift=1em] at (frame.south) {\scriptsize\sffamily-- Calculatrice \ifboolKV[DS]{Calculatrice}{autorisée}{interdite} --};
+ }
+ ]%
+ \sffamily \useKV[IE]{Nom} \no\useKV[IE]{Numero} : \useKV[IE]{Theme} \ifboolKV[IE]{Sujets}{\scriptsize(Sujet \useKV[IE]{Sujet})}{}\hfill Correction%
+ \par{\tiny\useKV[IE]{Code}}\hfill{\scriptsize\useKV[DS]{Date}}
+ \end{tcolorbox}%
+}
+
+\NewDocumentCommand\Recapitulatif{m}{%
+ \DTLforeach*{dataperso}{\Prenom=PrenomEleve,\Nom=NomEleve,\RecapListeExo=ListeExo}{%
+ \begin{Maquette}[Fiche]{#1,Code=\normalsize\Prenom~\Nom}%
+ \readlist*\ListeExercices{\RecapListeExo}%
+ \foreach\i in{1,...,\ListeExerciceslen}{%
+ \begin{exercice}%
+ \input{\jobname-PPEx\ListeExercices[\i].tex}%
+ \end{exercice}%
+ }%
+ \end{Maquette}%
+ }%
+}%
+
+\NewDocumentCommand\RecapitulatifCorrection{m}{%
+ \DTLforeach*{dataperso}{\Prenom=PrenomEleve,\Nom=NomEleve,\RecapListeExo=ListeExo}{%
+ \clearpage
+ \TikzFicheCor{#1,Code=\normalsize\Prenom~\Nom}%
+ \readlist*\ListeExercices{\RecapListeExo}%
+ \foreach\i in{1,...,\ListeExerciceslen}{%
+ \IfFileExists{\jobname-PPEx\ListeExercices[\i].sol}{\textbf{Corrigé de l'exercice \i} : \input{\jobname-PPEx\ListeExercices[\i].sol}\par\goodbreak}{}%
+ }%
+ }%
+}%
+
+%%%%%%%%%%%%%%% Debut Maquette %%%%%%%
+% Environnement englobant le tout.
+%\makeatletter
+\NewDocumentEnvironment{Maquette}{om}{%
+ % on remet à zéro le compteur des exercices
+ \setcounter{PfMExo}{0}%
+ \setcounter{PfMSOS}{0}%
+ % nouvelles valeurs.
+ \stepcounter{Maquette}%
+ % options de boulot
+ \IfHookExistsTF{env/Maquette/after}{\RemoveFromHook{env/Maquette/after}[*]}{}%
+ \IfHookExistsTF{env/exercice/after}{\RemoveFromHook{env/exercice/after}[*]}{}%
+ %\AddToHook{env/exercice/after}[ChoixExo]{\PfMChoixAffichageCorrection}%
+ \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]{RecapBrevet}{%
+ \setKV[RecapBrevet]{#2}%
+ \TikzRecapBrevet%
+ \let\exercice\ExerciceRecapBrevet\let\endexercice\endExerciceRecapBrevet%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzRecapBrevetCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{ParcoursPerso}{%
+ \setKV[ParcoursPerso]{#2}%
+ \DTLloaddb[noheader,keys={PrenomEleve,NomEleve,ListeExo}]{dataperso}{\useKV[ParcoursPerso]{Fichier}.csv}%
+ \let\exercice\exerciceParcoursPerso%
+ \let\endexercice\endexerciceParcoursPerso%
+ \ifboolKV[Boulot]{CorrigeFin}{\setcounter{PfMCorrigeParcoursPerso}{1}}{}%
+ \setcounter{PfMExo}{0}%
+ \AtEndDocument{%
+ \Recapitulatif{#2}%
+ \ifnum\thePfMCorrigeParcoursPerso=1\relax%
+ \RecapitulatifCorrection{#2}%
+ \fi
+ }%
+ }{%
+ \ifboolKV[Boulot]{Parcours}{%
+ \setKV[Parcours]{#2}\TikzParcours%
+ \let\exercice\exerciceParcours%
+ \let\endexercice\endexerciceParcours%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \PfMAffichageCorrige%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{PdT}{%
+ \setKV[PdT]{#2}\TikzPdT%
+ \let\exercice\exercicePdT
+ \let\endexercice\endexercicePdT%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzPdTCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{
+ \ifboolKV[Boulot]{DM}{%
+ \setKV[DM]{#2}\TikzDM%
+ \let\exercice\exerciceDM
+ \let\endexercice\endexerciceDM%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzDMCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{Fiche}{%
+ \setKV[Fiche]{#2}\TikzFiche%
+ \let\exercice\exerciceFiche
+ \let\endexercice\endexerciceFiche%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzFicheCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{DS}{%
+ \setKV[DS]{#2}\TikzDS%
+ \let\exercice\exerciceDS
+ \let\endexercice\endexerciceDS%
+ \ifboolKV[Boulot]{BaremeComplet}{%
+ \begin{center}
+ \TableauRecapitulatif
+ \end{center}
+ }{}%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzDSCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{IE}{%
+ \setKV[IE]{#2}\TikzIE%
+ \let\exercice\exerciceDS\let\endexercice\endexerciceDS%On garde exerciceDS
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzIECor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }{%
+ \ifboolKV[Boulot]{Kholle}{%
+ \setKV[Kholle]{#2}%
+ \TikzKholle%
+ \let\exercice\exerciceKholle\let\endexercice\endexerciceKholle%
+ \ifboolKV[Kholle]{CR}{}{%
+ \ifboolKV[Boulot]{CorrigeFin}{%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \TikzKholleCor{#2}%
+ \TikzKholleCor{#2}%
+ \TikzKholleCor{#2}%
+ \PfMAffichageCorrige%
+ }%
+ }{}%
+ }%
+ }{}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}{}%
+%\makeatother
+
+%D'après JCC
+% pour gérer les nombres pseudo-aléatoires
+\makeatletter
+\input{random}
+
+% Pour toutes les macros de liste, le premier paramètre est le nom de
+% la macro représentant la liste.
+
+% macro pour tester si une liste est vide
+\def\empty@list{}
+
+% Macro pour définir une nouvelle liste
+\newcommand\definelist[2]{\def#1{#2}}
+
+% Macro pour ajouter un élément en fin de liste
+\newcommand\push[2]{%
+ \ifx\\#2\\%
+ \PackageError{randomlist}
+ {You can't push an empty value.}
+ {Arg 2 of \string\pushlist is empty.}%
+ \else
+ \ifx#1\empty@list
+ \def#1{#2}%
+ \else
+ \edef#1{#1,#2}%
+ \fi
+ \fi
+}
+
+% Macro pour retirer le premier élément d'une liste
+\newcommand\pop[2]{%
+ \getwidth{#1}{\RL@temp}%
+ \ifnum\RL@temp = 0
+ % cas de la liste vide
+ \PackageError{randomlist}
+ {You can't pop an empty list.}
+ {There is no value to pull in list #1.}%
+ \else\ifnum\RL@temp = 1
+ % cas de la liste avec un seul élément
+ \edef#2{#1}%
+ \def#1{}%
+ \else
+ % cas de la liste avec au moins deux éléments
+ \expandafter\@@poplist#1,\@nil#1#2%
+ \fi\fi
+}
+\def\@@poplist#1,#2,\@nil#3#4{%
+ \def#4{#1}%
+ \def#3{#2}%
+}
+
+% Macro comptant le nombre d'élément d'une liste.
+\newcount\RL@cnta
+\newcommand\getwidth[2]{%
+ \RL@cnta \z@
+ \unless\ifx#1\empty@list
+ \expandafter\@countlist#1,\@nil,%
+ \fi
+ \edef#2{\the\RL@cnta}%
+}
+\def\@countlist#1,{%
+ \def\RL@arg{#1}%
+ \unless\ifx\RL@arg\@nnil
+ \advance\RL@cnta \@ne
+ \expandafter\@countlist
+ \fi
+}
+
+% Macro d'extraction de la nieme valeur
+\newcommand\extract[3]{%
+ % #1 = liste
+ % #2 = indice
+ % #3 = macro de retour de la nieme valeur
+ % On vérifie si la longueur de la liste est suffisante
+ \getwidth{#1}{\RL@temp}%
+ \ifnum#2>\RL@temp
+ \PackageError{randomlist}
+ {Value number #2 doesn't exist in list #1}
+ {List #1 has only \RL@temp\ values}%
+ \else
+ \RL@cnta #2
+ % On initialise une liste temporaire qui se remplira avec les
+ % éléments non extraits
+ \def\RL@temp{}%
+ % Lancement de la lecture récursive de la liste
+ \expandafter\RL@extract#1,\@nil,%
+ % On met la valeur extraite dans la macro prévue
+ \xdef#3{\RL@return}%cp a remplacé edef par xdef
+ % La liste est celle sans l'élément extrait
+ \let#1\RL@temp
+ \fi
+}
+\def\RL@extract#1,{%
+ % Dans cette étape, on ne peut pas atteindre la fin de la liste, il
+ % faut juste repérer l'élément à extraire
+ \advance\RL@cnta \m@ne
+ \ifnum\RL@cnta = 0
+ % L'élément est atteint, on le sauvegarde
+ \def\RL@return{#1}%
+ % et on appelle la macro récursive de fin de lecture.
+ \expandafter\RL@@extract
+ \else
+ % L'élément n'est pas atteint, on augmente la liste temporaire
+ % on protège d'éventuelles virgule avec des accolades
+ \edef\RL@temp{\RL@temp,{#1}}%
+ % et on réalise l'appel récursif
+ \expandafter\RL@extract
+ \fi
+}
+\def\RL@@extract#1,{%
+ % L'élément a été extrait, on lit le reste de la liste pour mettre à
+ % jour la liste temporaire
+ \def\RL@arg{#1}%
+ \ifx\RL@arg\@nnil
+ % Si la liste est vide, on place une virgule
+ \ifx\RL@temp\empty
+ \def\RL@temp{,}%
+ \fi
+ % La fin de la liste est atteinte, il faut supprimer la virgule
+ % initiale de la liste temporaire
+ \expandafter\RL@@@extract\RL@temp\@nil
+ \else
+ % On n'a pas atteint la fin de liste, on augmente la liste
+ % temporaire avec l'élément lu et on réalise l'appel récursif
+ % l'élément ajouté est protégé avec des accolades au cas où il
+ % contiendrait des virgules.
+ \edef\RL@temp{\RL@temp,{#1}}%
+ \expandafter\RL@@extract
+ \fi
+}
+\def\RL@@@extract,#1\@nil{\def\RL@temp{#1}}
+
+% Extraction de l'élément <n> de la liste. Le choix de <n> étant
+% aléatoire
+\newcount\RL@cntb
+\newcommand\randomextract[2]{%
+ % Le choix aléatoire se fait dans l'intervalle [1,max de la liste]
+ % donc on commence par récupérer l'indice maximum de la liste.
+ \getwidth{#1}{\RL@temp}%
+ % Nombre aléatoire dans le compteur \RL@cntb
+ \setrannum{\RL@cntb}{1}{\RL@temp}%
+ % Appel de la macro d'extraction
+ \extract{#1}{\the\RL@cntb}{#2}%
+}
+%
+% Initialisation du germe en gardant la même valeur toutes les #2
+% compilations. Lors de la première compilation, c'est #1 qui sera le
+% germe (si valeur vide, on laisse faire random)
+\newcommand\initrandomlist[2][]{%
+ \ifdefined\randomlistseed
+ % Si le germe existe, c'est qu'il a été déclaré dans le
+ % fichier .aux avec le compteur de compilation. Le germe et le
+ % compteur de compilation existent et sont à jour.
+ \else
+ % Si le fichier aux n'a pas déclaré de compteur \randomlistseed
+ % on considère qu'on est à la première compilation donc qu'on
+ % compile avec un nouveau germe et un compteur de compilation à
+ % un. Dans ce cas particulier, on laisse random.tex choisir le
+ % germe.
+ \newcount\randomlistseed
+ \ifx\\#1\\
+ % si l'argument optionnel est vide, on laisse faire random
+ \nextrandom
+ \randomlistseed \randomi
+ \else
+ % sinon, on prend cet argument comme germe initial
+ \randomlistseed #1
+ \fi
+ \newcount\randomlistcompile
+ \randomlistcompile \@ne
+ \fi
+ % Utilisation du germe adéquat pour la compilation en cours.
+ \randomi\randomlistseed
+ % Préparation de la compilation suivante (dans le fichier .aux)
+ % On regarde si le nombre de compilations est égale à zéro modulo #2
+ \ifnum\numexpr(\randomlistcompile/#2)*#2-\randomlistcompile=0
+ % Si le nombre de compilations avec le même germe est atteint
+ % on changera le germe à la prochaine compilation.
+ \immediate\write\@mainaux{%
+ \string\newcount\string\randomlistseed
+ }%
+ % modification du germe (sans laisser faire random sinon cela ne
+ % change pas au cours de chaque minute)
+ \ifnum\randomlistseed>2147483646
+ \randomlistseed \z@
+ \else
+ \advance\randomlistseed \@ne
+ \fi
+ \immediate\write\@mainaux{%
+ \string\global\string\randomlistseed=\the\randomlistseed
+ }%
+ \else
+ % Il faut faire encore des compilations avec le même germe, on
+ % sauvegarde le germe et le compteur de compilation dans le
+ % fichier .aux.
+ \immediate\write\@mainaux{%
+ \string\newcount\string\randomlistseed
+ }%
+ \immediate\write\@mainaux{%
+ \string\global\string\randomlistseed=\the\randomlistseed
+ }%
+ \fi
+ % Dans tous les cas, on augmente le compteur de compilation
+ \immediate\write\@mainaux{%
+ \string\newcount\string\randomlistcompile
+ }%
+ \advance\randomlistcompile \@ne
+ \immediate\write\@mainaux{%
+ \string\global\string\randomlistcompile=\the\randomlistcompile
+ }%
+}
+\makeatother
+\newcommand\initEnsemblede{%
+ \definelist{\EnsembleDe}{%
+ {2,4,6,8,10,12},%
+ {1,3,5,7,9,11},%
+ {2,3,5,7,11,13},%
+ }
+}
+
+\newcommand\GetValeurDe[1]{%
+ \extract{\EnsembleDe}{#1}{\DeChoisi}%
+ \randomextract{\DeChoisi}{\NbDeChoisi}%
+}
+
+\newcommand\initpremiers{%
+ \definelist{\listpremiers}{13,17,19,23,29,31,37,41,43,47}%
+}
+
+\newcommand\initPremiers{%
+ \definelist{\listPremiers}{71,73,79,83,89,97,101,103,107,109,113,127,131,137,139}%
+}
+
+\newcommand\getpremier{%
+ \randomextract{\listpremiers}{\NbPremier}
+}%
+
+\newcommand\getPremier{%
+ \randomextract{\listPremiers}{\NBPremier}
+}%
+
+\newcommand\getpytha{%
+ \randomextract{\tripletspythaentier}{\triplet}%
+ \extract{\triplet}{3}{\grand}% le troisième et le plus grand
+ \randomextract{\triplet}{\cote}%
+ \randomextract{\triplet}{\autre}%
+}
+
+\newcommand\initalpha{%
+ \definelist{\alphas}{b,c,d,e,f}
+}
+\newcommand\getalpha{%
+ \randomextract{\alphas}{\alphaA}%
+}%
+
+\newcommand\initsommet{%
+ \definelist{\sommets}{A,B,C,D,E,F,G,H,I,J,K,L,M,% pas d'espace ?
+ N,O,P,Q,R,S,T,U,V,W,X,Y,Z}%
+}
+
+\newcommand\initsommetrep{%
+ \definelist{\sommets}{A,B,C,D,E,F,G,H,I,J,K,L,M,% pas d'espace ?
+ N,P,Q,R,S,T,U,V,W,X,Y,Z}%
+}
+
+\newcommand\gettri{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+}
+
+\newcommand\getquad{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+}
+
+\newcommand\getpenta{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+}
+
+\newcommand\gethexa{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+ \randomextract{\sommets}{\pF}%
+}
+
+\newcommand\gethepta{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+ \randomextract{\sommets}{\pF}%
+ \randomextract{\sommets}{\pG}%
+}
+
+\newcommand\getocto{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+ \randomextract{\sommets}{\pF}%
+ \randomextract{\sommets}{\pG}%
+ \randomextract{\sommets}{\pH}%
+}
+
+\newcommand\getnonna{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+ \randomextract{\sommets}{\pF}%
+ \randomextract{\sommets}{\pG}%
+ \randomextract{\sommets}{\pH}%
+ \randomextract{\sommets}{\pI}%
+}
+
+\newcommand\gettreize{%
+ \randomextract{\sommets}{\pA}%
+ \randomextract{\sommets}{\pB}%
+ \randomextract{\sommets}{\pC}%
+ \randomextract{\sommets}{\pD}%
+ \randomextract{\sommets}{\pE}%
+ \randomextract{\sommets}{\pF}%
+ \randomextract{\sommets}{\pG}%
+ \randomextract{\sommets}{\pH}%
+ \randomextract{\sommets}{\pI}%
+ \randomextract{\sommets}{\pJ}%
+ \randomextract{\sommets}{\pK}%
+ \randomextract{\sommets}{\pL}%
+ \randomextract{\sommets}{\pM}%
+}
+
+\definelist{\quadruplets}{%
+{2{,}8,9{,}6,6,8},%10
+{3{,}2,12{,}6,5,12},%13
+{6{,}6,11{,}2,5,12},%13
+{7{,}8,10{,}4,5,12},%13
+{3{,}2,12{,}6,6{,}6,11{,}2},%13
+{3{,}2,12{,}6,7{,}8,10{,}4},%13
+{6{,}6,11{,}2,7{,}8,10{,}4},%13
+{7{,}8,10{,}4,6{,}6,11{,}2},%13
+{4{,}2,14{,}4,9,12},%15
+{2{,}6,16{,}8,7{,}2,15{,}4},%17
+{8,15,10{,}2,13{,}6},%17
+{2{,}6,16{,}8,8,15},%17
+{2{,}6,16{,}8,10{,}2,13{,}6},%17
+{5{,}6,19{,}2,12,16},%20
+{12,16,5{,}6,19{,}2},%20
+{7,24,8{,}8,23{,}4},%25
+{7,24,15,20},%25
+{8{,}8,23{,}4,15,20},%25
+{6{,}4,25{,}2,10,24},%26
+{6{,}4,25{,}2,13{,}2,22{,}4},%26
+{10,24,13{,}2,22{,}4},%26
+{10,24,15{,}6,20{,}8},%26
+{13{,}2,22{,}4,15{,}6,20{,}8},%26
+{9,40,16{,}8,37{,}4},%41
+{24{,}6,32{,}8,26{,}6,31{,}2},%41
+{9,40,26{,}6,31{,}2},%41
+{24{,}6,32{,}8,16{,}8,37{,}4}%41
+}%
+
+\definelist{\Quadruplets}{%pour un fonctionnement avec \fpeval
+{2.8,9.6,6,8},%10
+{3.2,12.6,5,12},%13
+{6.6,11.2,5,12},%13
+{7.8,10.4,5,12},%13
+{3.2,12.6,6.6,11.2},%13
+{3.2,12.6,7.8,10.4},%13
+{6.6,11.2,7.8,10.4},%13
+{7.8,10.4,6.6,11.2},%13
+{4.2,14.4,9,12},%15
+{2.6,16.8,7.2,15.4},%17
+{8,15,10.2,13.6},%17
+{2.6,16.8,8,15},%17
+{2.6,16.8,10.2,13.6},%17
+{5.6,19.2,12,16},%20
+{12,16,5.6,19.2},%20
+{7,24,8.8,23.4},%25
+{7,24,15,20},%25
+{8.8,23.4,15,20},%25
+{6.4,25.2,10,24},%26
+{6.4,25.2,13.2,22.4},%26
+{10,24,13.2,22.4},%26
+{10,24,15.6,20.8},%26
+{13.2,22.4,15.6,20.8},%26
+{9,40,16.8,37.4},%41
+{24.6,32.8,26.6,31.2},%41
+{9,40,26.6,31.2},%41
+{24.6,32.8,16.8,37.4}%41
+}%
+
+\definelist{\tripletspytha}{{2{,}8,9{,}6,10},{6,8,10},%10
+{3{,}2,12{,}6,13},{5,12,13},%13
+{6{,}6,11{,}2,13},{7{,}8,10{,}4,13},%13
+{4{,}2,14{,}4,15},{9,12,15},%15
+{2{,}6,16{,}8,17},{7{,}2,15{,}4,17},%17
+{8,15,17},{10{,}2,13{,}6,17},%17
+{5{,}6,19{,}2,20},{12,16,20},%20
+{7,24,25},{8{,}8,23{,}4,25},%25
+{15,20,25},%25
+{8{,}8,23{,}4,25},%25
+{6{,}4,25{,}2,26},{10,24,26},%26
+{13{,}2,22{,}4,26},%26
+{15{,}6,20{,}8,26},%26
+{9,40,41},{16{,}8,37{,}4,41},%41
+{24{,}6,32{,}8,41},{26{,}6,31{,}2,41}%41
+}%
+
+\definelist{\tripletspythaentier}{%
+{3,4,5},{5,12,13},{6,8,10},{7,24,25},{8,15,17},{9,12,15},{9,40,41},{10,24,26},{11,60,61},{12,16,20},{12,35,37},{13,84,85},{14,48,50},{15,20,25},{15,36,39},{16,30,34},{16,63,65},{18,24,30},{18,80,82},{20,21,29},{20,48,52},{21,28,35},{21,72,75},{24,32,40},{24,45,51},{24,70,74},{25,60,65},{27,36,45},{28,45,53},{28,96,100},{30,40,50},{30,72,78},{32,60,68},{33,44,55},{33,56,65},{35,84,91},{36,48,60},{36,77,85},{39,52,65},{39,80,89},{40,42,58},{40,75,85},{42,56,70},{45,60,75},{48,55,73},{48,64,80},{51,68,85},{54,72,90},{57,76,95},{60,63,87},{60,80,100},{65,72,97}}%%d'après villement.gerard.free.fr
+
+
+\newcommand\initcarre{%
+ \definelist{\carres}{4,9,16,25,36,49,64,81,100}%
+}
+\newcommand\getcarre{%
+ \randomextract{\carres}{\carreA}
+}
+
+%2009-2018
+ % Source https://ec.europa.eu/eurostat/databrowser/view/ENV_AIR_GGE__custom_743354/default/table?lang=en
+\definelist{\GazSerreEu}{%
+ {{la },Belgique,131038.46,123642.9},%
+ {{la },Bulgarie,58617.88,58595.07},%
+ {{le },Danemark,65734.85,51299.75},%
+ {{l'},Allemagne,934202.04,888718.56},%
+ {{l'},Irlande,63985.03,64241.55},%
+ {{la },Grèce,127381.2,96113.19},%
+ {{l'},Espagne,385211.04,352208.55},%
+ {{la },France,521519.73,462798.66},%
+ {{l'},Italie,510950.49,439263.95},%
+ {{les },{Pays Bas},212360.67,200458.52},%
+ {{la },Pologne,395464.33,415858.2},%
+ {{la },Norvège,54280.59,53769.04},%
+ {{la },Suisse,57276.22,52099.15}%
+}
+
+\newcommand\getGazSerre{%
+ \randomextract{\GazSerreEu}{\GazSerrePays}%
+ \extract{\GazSerrePays}{1}{\ArticlePaysGS}%
+ \extract{\GazSerrePays}{1}{\NomPaysGS}%
+ \extract{\GazSerrePays}{1}{\ConsoAPaysGS}%
+ \extract{\GazSerrePays}{1}{\ConsoBPaysGS}%
+}
+
+ \definelist{\VehiculesINSEE}{%
+ {2012,13132,22264,8111,15242},%
+ {2013,12853,22712,8028,15020},%
+ {2014,12778,23134,8049,14905},%
+ {2015,12874,23460,8144,14813},%
+ {2016,13144,23634,8308,14813},%
+ {2017,13580,23645,8437,14629},%
+ {2018,14140,23293,8652,14453},%
+ {2019,14756,22636,8920,14392}%
+ }%
+ \newcommand\getVehiculesINSEE{%
+ \randomextract{\VehiculesINSEE}{\NbVehiculesINSEE}%
+ \extract{\NbVehiculesINSEE}{1}{\AnneeVehiculesINSEE}%
+ \extract{\NbVehiculesINSEE}{1}{\EssenceVehiculesINSEE}%
+ \extract{\NbVehiculesINSEE}{1}{\DieselVehiculesINSEE}%
+ \extract{\NbVehiculesINSEE}{1}{\KmEssenceVehiculesINSEE}%
+ \extract{\NbVehiculesINSEE}{1}{\KmDieselVehiculesINSEE}%
+ } \ No newline at end of file