summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2024-03-07 21:22:39 +0000
committerKarl Berry <karl@freefriends.org>2024-03-07 21:22:39 +0000
commitcc77816bee5134b22e3a0f98ec91d326f1cc6008 (patch)
treecd272b9740fcb7ced0411b8e501c5cbaee5ff102 /Master/texmf-dist/tex
parent53959d4915c7c1171856b813716b4333d422b3b9 (diff)
profmaquette (7mar24)
git-svn-id: svn://tug.org/texlive/trunk@70470 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty497
1 files changed, 407 insertions, 90 deletions
diff --git a/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty b/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty
index e5c5e2ca36a..ffa3eb53ecf 100644
--- a/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty
+++ b/Master/texmf-dist/tex/latex/profmaquette/ProfMaquette.sty
@@ -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{2024/01/21}%
+\def\filedate{2024/03/06}%
\let\PfMfiledate\filedate%
-\def\fileversion{0.87}%
+\def\fileversion{0.88}%
\let\PfMfileversion\fileversion%
\ProvidesPackage{ProfMaquette}[\filedate\space v\fileversion\space Maquettage de documents]%
@@ -45,7 +45,7 @@
\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[Contrat]{Theme=Les nombres décimaux,Date=\today,Niveau=6,Classe={},Code={},NomExercice=Exercice}%
\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}}%
@@ -134,6 +134,26 @@
\setcounter{PfMNbLogo}{0}%
\newcount\Orientation%Pour le schéma des parcours
\newcounter{PfMCNNumQ}%
+
+\newcounter{Nbcolonnes}
+
+\newif\ifPfMDeuxColonnes
+\newif\ifPfMRectoVerso
+\makeatletter
+\if@twocolumn
+ \PfMDeuxColonnestrue
+ \setcounter{Nbcolonnes}{2}
+\else
+ \PfMDeuxColonnesfalse
+ \setcounter{Nbcolonnes}{4}
+\fi
+\if@twoside
+ \PfMRectoVersotrue
+\else
+ \PfMRectoVersofalse
+\fi
+\makeatother
+
% couleurs
\colorlet{PfMColCpt}{gray!50}%
\colorlet{PfMColSrc}{gray!50}%
@@ -141,6 +161,7 @@
\colorlet{PfMCadreDM}{gray!85}%
\colorlet{PfMCadreParcours}{gray!50}%
\colorlet{PfMCadreContrat}{gray!50}%
+\colorlet{PfMColbackFdR}{white}%
\colorlet{PfMCadreFdR}{gray!50}%
\colorlet{PfMFondEncart}{white}%
% Définitions de commandes
@@ -151,6 +172,10 @@
\newcommand\PfMCompECA{ECA}%
\newcommand\PfMCompA{A}%
+\NewDocumentCommand\TournerPage{O{\faShare}}{%
+ \par\vfill\par\hfill{\em Tourner la page #1}\clearpage
+}%
+
\tcbset{%
consignes/.style={
empty,
@@ -174,6 +199,19 @@
}%
}{}%
+%% Option french pour les mathématiques
+% By CT
+\NewDocumentCommand\TypoMathFrance{}{%
+ \unless\ifdefined\countletters\newcount\countletters\fi
+ \countletters=`A
+ \loop
+ \unless\ifnum\countletters>`Z
+ \begingroup\lccode`!=\countletters
+ \lowercase{\endgroup\DeclareMathSymbol{!}{\mathalpha}{operators}{`!}}%
+ \advance\countletters 1
+ \repeat
+}%
+
%% Gestion de l'affichage ou pas des item (Pour élèves PAP) par exemple
% Code by egreg : https://tex.stackexchange.com/questions/627250/hide-specific-item-in-a-list
\ExplSyntaxOn
@@ -263,7 +301,7 @@
}%
% % On rectifie sur la dernière valeur :)
\xdef\PfCCPEffectifs{\PfCCPEffectifs \fpeval{#1-\fpeval{\PfCRetiensRETSommeTotale}}}%
- Les choix : \PfCCPEffectifs.\\
+ %Les choix : \PfCCPEffectifs.\\
%% Somme totale : \fpeval{\PfCRetiensRETSommeTotale}\\
}
@@ -397,8 +435,142 @@
\fi%
}%
-\NewDocumentCommand\ChoixAleaMulti{mmmm}{%
+\NewDocumentCommand\ChoixAleaMultiMixListe{mmmm}{%
% #1 nombre de valeurs à choisir
+ % #2 Liste à parcourir
+ % #3 valeur(s) exclue(s)
+ % #4 Nom de la liste qui récupère les données.
+ \ifx\bla#3\bla%
+ \PackageWarning{ProfMaquette}{Il faut définir au moins une valeur à exclure.}%
+ \else%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeValeursExclues{#3}%
+ \readlist*\ListeValeursRetenues{#2}%
+ \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]}%
+ }%
+ }%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeValeursRetenues{\PfMMixFoo}%
+ }%
+ \ifnum\ListeValeursRetenueslen>1\relax%
+ \MelangeListe{\PfMMixFoo}{#1}%
+ \xdef#4{\faa}%
+ \else%
+ \xdef#4{\PfMMixFoo}%
+ \fi%
+ \fi%
+}%
+
+\NewDocumentCommand\ChoixAleaListe{ommmm}{%
+ % Il n'y a pas de répétitions des éléments.
+ % #1 précision des décimaux
+ % #2 nombre d'éléments
+ % #3 valeur entière minimale
+ % #4 valeur entière maximale
+ % #5 nom de la liste récupérant les nombres choisis.
+ % 1ere valeur
+ \IfNoValueTF{#1}{\xdef\ListeNombresAlea{\fpeval{randint(#3,#4)}}}{\xdef\ListeNombresAlea{\fpeval{round(randint(#3,#4-1)+rand(),#1)}}}%
+ \setsepchar{,}%
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \whiledo{\ListeARenvoyerlen<#2}{%
+ \IfNoValueTF{#1}{\xdef\SuivantNombreAlea{\fpeval{randint(#3,#4)}}}{\xdef\SuivantNombreAlea{\fpeval{round(randint(#3,#4-1)+rand(),#1)}}}%
+ \def\Unique{0}%
+ \xintFor* ##1 in{\xintSeq{1}{\ListeARenvoyerlen}}\do{%
+ \xintifboolexpr{\fpeval{\SuivantNombreAlea}==\fpeval{\ListeARenvoyer[##1]}}{%
+ \def\Unique{1}%
+ \xintBreakFor%
+ }{}%
+ }%
+ \ifnum\fpeval{\Unique}=0\relax%
+ \xdef\ListeNombresAlea{\ListeNombresAlea,\SuivantNombreAlea}%
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \fi%
+ }%
+ \xdef#5{\ListeNombresAlea}%
+}%
+
+\NewDocumentCommand\ChoixAleaListeold{mmmm}{%
+ % Il n'y a pas de répétitions des éléments.
+ % #1 nombre d'éléments
+ % #2 valeur entière minimale
+ % #3 valeur entière maximale
+ % #4 nom de la liste récupérant les nombres choisis.
+ % 1ere valeur
+ \xdef\ListeNombresAlea{\fpeval{randint(#2,#3)}}
+ \setsepchar{,}\ignoreemptyitems
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \whiledo{\ListeARenvoyerlen<#1}{%
+ \xdef\SuivantNombreAlea{\fpeval{randint(#2,#3)}}%
+ \def\Unique{0}%
+ \xintFor* ##1 in{\xintSeq{1}{\ListeARenvoyerlen}}\do{%
+ \xintifboolexpr{\fpeval{\SuivantNombreAlea}==\fpeval{\ListeARenvoyer[##1]}}{%
+ \def\Unique{1}%
+ \xintBreakFor%
+ }{}%
+ }%
+ \ifnum\fpeval{\Unique}=0\relax%
+ \xdef\ListeNombresAlea{\ListeNombresAlea,\SuivantNombreAlea}%
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \fi%
+ }%
+ \xdef#4{\ListeNombresAlea}%
+}
+
+\NewDocumentCommand\ChoixAleaListeMix{mmmmm}{%
+ % ideé by reddit : I need a randomly ordered list...
+ % Il n'y a pas de répétitions des éléments.
+ % #1 nombre d'éléments
+ % #2 valeur entière minimale
+ % #3 valeur entière maximale
+ % #4 Liste des valeurs à exclure
+ % #5 nom de la liste récupérant les nombres choisis.
+ \xdef\Toto{#4}%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeValeursExclues{\Toto}%
+ % 1ere valeur
+ \xdef\PfMNbCoups{0}%
+ \whiledo{\fpeval{\PfMNbCoups}<\ListeValeursExclueslen}{%
+ \xdef\ListeNombresAlea{\fpeval{randint(#2,#3)}}%
+ \xintFor* ##1 in {\xintSeq{1}{\ListeValeursExclueslen}}\do{%
+ \xintifboolexpr{\fpeval{\ListeNombresAlea}==\fpeval{\ListeValeursExclues[##1]}}{%
+ \xdef\PfMNbCoups{0}%
+ \xintBreakFor%
+ }{\xdef\PfMNbCoups{\fpeval{\PfMNbCoups+1}}}%
+ }%
+ }%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \whiledo{\ListeARenvoyerlen<#1}{%
+ \xdef\SuivantNombreAlea{\fpeval{randint(#2,#3)}}%
+ \def\Unique{0}%
+ \xintFor* ##1 in {\xintSeq{1}{\ListeValeursExclueslen}}\do{
+ \xintifboolexpr{\fpeval{\SuivantNombreAlea}==\fpeval{\ListeValeursExclues[##1]}}{%
+ \def\Unique{1}%
+ \xintBreakFor%
+ }{}%
+ }%
+ \ifnum\fpeval{\Unique}=0\relax%
+ \xintFor* ##1 in{\xintSeq{1}{\ListeARenvoyerlen}}\do{%
+ \xintifboolexpr{\fpeval{\SuivantNombreAlea}==\fpeval{\ListeARenvoyer[##1]}}{%
+ \def\Unique{1}%
+ \xintBreakFor%
+ }{}%
+ }%
+ \fi%
+ \ifnum\fpeval{\Unique}=0\relax%
+ \xdef\ListeNombresAlea{\ListeNombresAlea,\SuivantNombreAlea}%
+ \readlist*\ListeARenvoyer{\ListeNombresAlea}%
+ \fi%
+ }%
+ \xdef#5{\ListeNombresAlea}%
+}
+
+\NewDocumentCommand\ChoixAleaMulti{mmmm}{%
+ % #1 nombre de valeurs à choisir qui peut être supérieur au nombre de valeurs entières disponibles
% #2 valeur minimale
% #3 valeur maximale
% #4 Nom de la liste qui récupère les données.
@@ -409,6 +581,32 @@
\xdef#4{\PfMMixFoo}%
}%
+\NewDocumentCommand\ChoixAleaMultiMixRep{mmmmm}{%
+ % #1 nombre de valeurs à choisir
+ % #2 valeur minimale
+ % #3 valeur maximale
+ % #4 valeur à exclure
+ % #5 Nom de la liste qui récupère les données.
+ \xdef\PfCRetiensRetenues{}%
+ \xdef\PfMMixFoo{#2,#3}%
+ \setsepchar{,}\ignoreemptyitems%
+ \readlist*\ListeValeursExclues{#4}%
+ \xintFor* ##1 in{\xintSeq{\fpeval{#2+1}}{\fpeval{#3-1}}}\do{%
+ \xdef\PfCRetiensExclues{0}%
+ \xintFor* ##2 in{\xintSeq{1}{\ListeValeursExclueslen}}\do{%
+ \xintifboolexpr{##1==\ListeValeursExclues[##2]}{\xdef\PfCRetiensExclues{\fpeval{\PfCRetiensExclues+1}}}{}%
+ }%
+ \ifnum\fpeval{\PfCRetiensExclues}=0\relax%
+ \xdef\PfMMixFoo{\PfMMixFoo,##1}%
+ \fi%
+ }%
+ \xintFor* ##1 in {\xintSeq{1}{#1}}\do{%
+ \MelangeListe{\PfMMixFoo}{1}%
+ \xdef\PfCRetiensRetenues{\PfCRetiensRetenues\faa}%
+ }%
+ \xdef#5{\PfCRetiensRetenues}%
+}%
+
\NewDocumentCommand\MelangeNomFonction{mm}{%
% #1 Nombre d'éléments à conserver
% #2 Nom de la commande qui conserve
@@ -471,32 +669,6 @@
\xdef#2{\faa}%
}%
-\NewDocumentCommand\ChoixAleaMultiMixRep{mmmmm}{%
- % #1 nombre de valeurs à choisir
- % #2 valeur minimale
- % #3 valeur maximale
- % #4 valeur à exclure
- % #5 Nom de la liste qui récupère les données.
- \xdef\PfCRetiensRetenues{}%
- \xdef\PfMMixFoo{#2,#3}%
- \setsepchar{,}\ignoreemptyitems%
- \readlist*\ListeValeursExclues{#4}%
- \xintFor* ##1 in{\xintSeq{\fpeval{#2+1}}{\fpeval{#3-1}}}\do{%
- \xdef\PfCRetiensExclues{0}%
- \xintFor* ##2 in{\xintSeq{1}{\ListeValeursExclueslen}}\do{%
- \xintifboolexpr{##1==\ListeValeursExclues[##2]}{\xdef\PfCRetiensExclues{\fpeval{\PfCRetiensExclues+1}}}{}%
- }%
- \ifnum\fpeval{\PfCRetiensExclues}=0\relax%
- \xdef\PfMMixFoo{\PfMMixFoo,##1}%
- \fi%
- }%
- \xintFor* ##1 in {\xintSeq{1}{#1}}\do{%
- \MelangeListe{\PfMMixFoo}{1}%
- \xdef\PfCRetiensRetenues{\PfCRetiensRetenues\faa}%
- }%
- \xdef#5{\PfCRetiensRetenues}%
-}%
-
\NewDocumentCommand\AffSigne{smm}{%
\ifnum#2=0\relax{}
\else
@@ -603,7 +775,7 @@
\end{enumerate}
}{}%
- \NewDocumentEnvironment{Enumelangesol}{b}{%
+\NewDocumentEnvironment{Enumelangesol}{b}{%
\setcounter{Melquestions}{0}%
\setsepchar{\item}%
\readlist*\ListeTest{#1}%
@@ -840,6 +1012,8 @@
}%
}%
+\def\PfMTexteDuCorrige{Corrigé de l'exercice}
+
\NewDocumentCommand\PfMAffichageCorrige{}{%
\ifboolKV[Boulot]{CAN}{%Toto
\xintFor* ##1 in{\xintSeq{1}{\PfMCANTotalExo}}\do{%
@@ -853,7 +1027,7 @@
\refstepcounter{PfMExoSol}%{##1}%
\label{pagesol-\thePfMMaquette-\thePfMExoSol}
\setcounter{PfMAlea}{0}%
- \IfFileExists{\jobname-Ex##1.sol}{\PfMAffichageHideItemSolution\textbf{Corrigé de l'exercice\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi\PfMAffichageTitreSolution}\par\nopagebreak\input{\jobname-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ex##1.rep}{\PfMAffichageHideItemSolution\textbf{Réponse(s) seule(s) de l'exercice\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ex##1.rep}\par\goodbreak}{%
+ \IfFileExists{\jobname-Ex##1.sol}{\PfMAffichageHideItemSolution\textbf{\PfMTexteDuCorrige\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi\PfMAffichageTitreSolution}\par\nopagebreak\input{\jobname-Ex##1.sol}\par\goodbreak}{\IfFileExists{\jobname-Ex##1.rep}{\PfMAffichageHideItemSolution\textbf{Réponse(s) seule(s) de l'exercice\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ex##1.rep}\par\goodbreak}{%
\IfFileExists{\jobname-Ex##1.cdp}{\PfMAffichageHideItemSolution\textbf{Indice(s) pour l'exercice\ifnum\thePfMExo=1\relax\else~\ref{page-\thePfMMaquette-##1}\fi}\par\nopagebreak\input{\jobname-Ex##1.cdp}\par\goodbreak}{}%
}%
}%
@@ -969,7 +1143,12 @@
\makeatother
%%%%%%%% FIN BAREME %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Commandes pour les affichages optionnels dans les cadre
+%%% Commandes pour les affichages optionnels dans les cadres
+\NewDocumentCommand{\PfMAffichageLogos}{}{%
+ \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}}{}
+ }%
+%
\NewDocumentCommand{\PfMAffichageCompetencesTravaillees}{}{%
\ifboolKV[ClesExercices]{AffichageCompetence}{%
\node[%
@@ -981,7 +1160,8 @@
at (frame.north east)
{\itshape\scriptsize\sffamily Compétence(s) dominante(s) : \useKV[ClesExercices]{Competence}};
}{}%
-}
+ }%
+%
\NewDocumentCommand{\PfMLienVersSolution}{}{%
\ifboolKV[Boulot]{VersSolution}{%
\ifboolKV[ClesExercices]{PasCorrige}{}{%
@@ -1083,6 +1263,11 @@
\setcounter{PfMAlea}{0}%
\useKVdefault[ClesExercices]%
\setKV[ClesExercices]{#2}%
+ \ifboolKV[ClesExercices]{NonUtilise}{%
+ % Mettre la correction hors-jeu
+ \setKV[ClesExercices]{PasCorrige}%
+ \PfMChoixCorrection%
+ }{%
\IfBooleanTF{#1}{%
\setKV[ClesExercices]{Numerote=false}%
}{}%
@@ -1106,15 +1291,12 @@
#3
\end{tcolorbox}%
\PfMApresLesExercices%
+ }
}{}%
%%Contrat
%\makeatletter
-
-%\makeatother
-
-%\makeatletter
\NewDocumentCommand\AfficheContrat{o}{%
\useKVdefault[SchemaContrat]%
\setKV[SchemaContrat]{#1}%
@@ -1237,6 +1419,11 @@
\setcounter{PfMAlea}{0}%
\setcounter{PfMNbLogo}{1}%
\useKVdefault[ClesExercices]%
+ \ifboolKV[ClesExercices]{NonUtilise}{%
+ % Mettre la correction hors-jeu
+ \setKV[ClesExercices]{PasCorrige}%
+ \PfMChoixCorrection%
+ }{%
\setKV[ClesExercices]{#2}%
\IfBooleanTF{#1}{%
\setKV[ClesExercices]{Numerote=false}%
@@ -1267,6 +1454,7 @@
#3
\end{tcolorbox}
\PfMApresLesExercices%
+ }%
}{}%
%%% Contrat %%%
@@ -1290,6 +1478,11 @@
}
\NewDocumentCommand\TikzContratCor{m}{%
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\clearpage
\setKV[Contrat]{#1}%
\begin{tcolorbox}[usercontratcor]%
@@ -1313,8 +1506,7 @@
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}}{}
+ \PfMAffichageLogos%
%%
\PfMAffichageCompetencesTravaillees%
%%
@@ -1327,8 +1519,6 @@
%% Fin Contrat %%%
%%FdR
-
-%\makeatletter
\NewDocumentCommand\AfficheFdR{o}{%
\useKVdefault[SchemaFdR]%
\setKV[SchemaFdR]{#1}%
@@ -1351,7 +1541,6 @@
\BuildRouteTikz{\FdRTotalExo}{\PfMListeExerciceFdR}{\PfMListeExerciceFdRStop}%
}%
}%
-%\makeatother
\NewDocumentCommand\BuildRouteTikz{mmm}{%
\setsepchar{,}\ignoreemptyitems%
@@ -1577,6 +1766,11 @@
\setcounter{PfMNbLogo}{1}%
\useKVdefault[ClesExercices]%
\setKV[ClesExercices]{#2}%
+ \ifboolKV[ClesExercices]{NonUtilise}{%
+ % Mettre la correction hors-jeu
+ \setKV[ClesExercices]{PasCorrige}%
+ \PfMChoixCorrection%
+ }{%
\IfBooleanTF{#1}{%
\setKV[ClesExercices]{Numerote=false}%
}{}%
@@ -1588,6 +1782,7 @@
\immediate\write\@auxout{\string\opcopy{\thePfMExo}{\Roman{PfMMaquette}-FdRTotalExo}}%
% Creation des parcours
\ifboolKV[ClesExercices]{Routes}{%
+ \colorlet{PfMCadreFdR}{black}
% Remise à zéro de conteneurs des parcours
\setsepchar{,}%
% \ifboolKV[ClesExercices]{Stop}{\xdef\PfMFooListeFdR{\useKV[ClesExercices]{Route},0}}{
@@ -1597,7 +1792,7 @@
\foreachitem\compteur\in\ListeFdR{%
\RemplisFdR{\ListeFdR[\compteurcnt]}%
}%
- }{}
+ }{\colorlet{PfMCadreFdR}{gray!15}}
\ifboolKV[ClesExercices]{Stops}{%
\setsepchar{,}%
% \ifboolKV[ClesExercices]{Stop}{\xdef\PfMFooListeFdR{\useKV[ClesExercices]{Route},0}}{
@@ -1618,13 +1813,12 @@
#3
\end{tcolorbox}
\PfMApresLesExercices%
+ }%
}{}%
-%\makeatother
-
%CAN
\setsepchar[*]{,*/}%
-\readlist*\ListeNoms{Aude/Elle/d'Aude/qu'Aude,Bernard/Il/de Bernard/que Bernard,Céline/Elle/de Céline/que Céline,Daniel/Il/de Daniel/que Daniel,\'Elise/Elle/d'\'Elise/qu'\'Elise,Fabien/Il/de Fabien/que Fabien,Gérard/Il/de Gérard/que Gérard,Hélène/Elle/d'Hélène/qu'Hélène,Ilies/Il/d'Ilies/qu'Ilies,Jasmine/Elle/de Jasmine/que Jasmine,Kylian/Il/de Kylian/que Kylian,Laurent/Il/de Laurent/que Laurent,Mathilde/Elle/de Mathilde/que Mathilde,Nina/Elle/de Nina/que Nina,Octave/Il/d'Octave/qu'Octave,Philippe/Il/de Philippe/que Philippe,Joachim/Il/de Joachim/que Joachim,Thérèse/Elle/de Thérèse/que Thérèse,Nawel/Elle/de Nawel/que Nawel,Alexandre/Il/d'Alexandre/qu'Alexandre,Maxence/Il/de Maxence/que Maxence,Sophie/Elle/de Sophie/que Sophie,Christophe/Il/de Christophe/que Christophe,Myriam/Elle/de Myriam/que Myriam,Nathalie/Elle/de Nathalie/que Nathalie,Sébastien/Il/de Sébastion/que Sébastien}%
+\readlist*\ListeNoms{Aude/Elle/d'Aude/qu'Aude/elle,Bernard/Il/de Bernard/que Bernard/il,Céline/Elle/de Céline/que Céline/elle,Daniel/Il/de Daniel/que Daniel/il,\'Elise/Elle/d'\'Elise/qu'\'Elise/elle,Fabien/Il/de Fabien/que Fabien/il,Gérard/Il/de Gérard/que Gérard/il,Hélène/Elle/d'Hélène/qu'Hélène/elle,Ilies/Il/d'Ilies/qu'Ilies/il,Jasmine/Elle/de Jasmine/que Jasmine/elle,Kylian/Il/de Kylian/que Kylian/il,Laurent/Il/de Laurent/que Laurent/il,Mathilde/Elle/de Mathilde/que Mathilde/elle,Nina/Elle/de Nina/que Nina/elle,Octave/Il/d'Octave/qu'Octave/il,Philippe/Il/de Philippe/que Philippe/il,Joachim/Il/de Joachim/que Joachim/il,Thérèse/Elle/de Thérèse/que Thérèse/elle,Nawel/Elle/de Nawel/que Nawel/elle,Alexandre/Il/d'Alexandre/qu'Alexandre/il,Maxence/Il/de Maxence/que Maxence/il,Sophie/Elle/de Sophie/que Sophie/elle,Christophe/Il/de Christophe/que Christophe/il,Myriam/Elle/de Myriam/que Myriam/elle,Nathalie/Elle/de Nathalie/que Nathalie/elle,Sébastien/Il/de Sébastion/que Sébastien/il}%
\readlist*\ListeChersObjets{montre/une,collier/un,bague/une,pendentif/un}%
\readlist*\ListeSport{Football/du football/le football,Tennis/du tennis/le tennis,Basket/du basket/le basket,Athlétisme/de l'athlétisme/l'athlétisme,Natation/de la natation/la natation,Hand-ball/du hand-ball/le hand-ball,Volley-ball/du volley-ball/le volley-ball}
\setsepchar{,}%
@@ -1706,18 +1900,22 @@
\end{center}
\clearpage%
}%
-\makeatother
+%\makeatother
-\makeatletter
+%\makeatletter
\NewDocumentCommand\TikzCANCor{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[CAN]{#1}%
\begin{tcolorbox}[usercancor]%
\begin{center}
\Large\sffamily Course aux nombres (Correction)
\end{center}
\hfill\useKV[CAN]{Niveau}%
- %\par{\tiny\useKV[FdR]{Code}}\hfill{\scriptsize\useKV[FdR]{Date}}%
+ %\par{\tiny\useKV[CAN]{Code}}\hfill{\scriptsize\useKV[CAN]{Date}}%
\end{tcolorbox}%
}
%%% FdR %%%
@@ -1741,7 +1939,11 @@
}
\NewDocumentCommand\TikzFdRCor{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[FdR]{#1}%
\begin{tcolorbox}[userfdrcor]%
\Large\sffamily \useKV[FdR]{Theme} (Correction) \hfill\useKV[FdR]{Niveau} \useKV[FdR]{Classe}
@@ -1754,7 +1956,7 @@
before skip=1em,
enhanced,
breakable,
- colback=white,
+ colback=PfMColbackFdR,
colframe=PfMCadreFdR,
overlay unbroken and first={%
\node[%
@@ -1764,8 +1966,7 @@
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}}{}
+ \PfMAffichageLogos
%%
\PfMAffichageCompetencesTravaillees%
%%
@@ -1893,6 +2094,11 @@
\setcounter{PfMNbLogo}{1}%
\useKVdefault[ClesExercices]%
\setKV[ClesExercices]{#2}%
+ \ifboolKV[ClesExercices]{NonUtilise}{%
+ % Mettre la correction hors-jeu
+ \setKV[ClesExercices]{PasCorrige}%
+ \PfMChoixCorrection%
+ }{%
\IfBooleanTF{#1}{%
\setKV[ClesExercices]{Numerote=false}%
}{}%
@@ -1922,6 +2128,7 @@
#3
\end{tcolorbox}
\PfMApresLesExercices%
+ }
}{}%
%%%%%%%%%%%%%%%%%%%%%%%
@@ -2040,9 +2247,15 @@
\setcounter{PfMAlea}{0}%
\useKVdefault[ClesExercices]%
\setKV[ClesExercices]{#2}%
+ \ifboolKV[ClesExercices]{NonUtilise}{%
+ % Mettre la correction hors-jeu
+ \setKV[ClesExercices]{PasCorrige}%
+ \PfMChoixCorrection%
+ }{%
\IfBooleanTF{#1}{%
\setKV[ClesExercices]{Numerote=false}%
}{}%
+ \ifboolKV[ClesExercices]{Profile}{\PfMhideitems}{}%
\refstepcounter{PfMSection}%
\PfMChoixCorrection%
\refstepcounter{PfMExo}%
@@ -2063,6 +2276,7 @@
#3
\end{tcolorbox}%
\PfMApresLesExercices%
+ }%
}{}%
\NewDocumentEnvironment{ExerciceRecapBrevet}{so+b}{%
@@ -2186,8 +2400,7 @@
] 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}}{}%
+ \PfMAffichageLogos%
%
\PfMAffichageCompetencesTravaillees%
%
@@ -2218,7 +2431,11 @@
}
\NewDocumentCommand\TikzPdTCor{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[PdT]{#1}%
\begin{tcolorbox}[userpdtcor]%
\Large\sffamily \useKV[PdT]{Theme} (Correction) \hfill\useKV[PdT]{Niveau} \useKV[PdT]{Classe}
@@ -2483,8 +2700,12 @@
}%
\NewDocumentCommand\TikzDMCor{m}{%
- \clearpage
- \setKV[DM]{#1}
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
+ \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[%
@@ -2572,7 +2793,11 @@
}%
\NewDocumentCommand\TikzFicheCor{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[Fiche]{#1}%
\begin{tcolorbox}[userfichecor]%
\Large\sffamily \useKV[Fiche]{Theme} (Correction) \hfill\useKV[Fiche]{Niveau} \useKV[Fiche]{Classe}
@@ -2581,7 +2806,11 @@
}
\NewDocumentCommand\TikzFicheCorRep{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[Fiche]{#1}%
\begin{tcolorbox}[userfichecor]%
\Large\sffamily \useKV[Fiche]{Theme} (Réponses) \hfill\useKV[Fiche]{Niveau} \useKV[Fiche]{Classe}
@@ -2590,7 +2819,11 @@
}
\NewDocumentCommand\TikzFicheCorInd{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[Fiche]{#1}%
\begin{tcolorbox}[userfichecor]%
\Large\sffamily \useKV[Fiche]{Theme} (Indices) \hfill\useKV[Fiche]{Niveau} \useKV[Fiche]{Classe}
@@ -2612,10 +2845,9 @@
fill=ColExoFiche,
anchor=west,
xshift=\kvtcb@leftlower,
- ] at (frame.north west){\bfseries\sffamily\useKV[Fiche]{NomExercice}\ifboolKV[ClesExercices]{Numerote}{ \thePfMExo}{}\ifboolKV[ClesExercices]{AffichageTitre}{\useKV[ClesExercices]{Titre}}{}};
+ ] at (frame.north west){\bfseries\sffamily\useKV[Fiche]{NomExercice}\ifboolKV[ClesExercices]{Numerote}{ \thePfMExo}{}\ifboolKV[ClesExercices]{AffichageTitre}{\ifboolKV[ClesExercices]{Numerote}{~:~}{\xdef\PfMTitiLgNE{\useKV[Fiche]{NomExercice}}\IfStrEq{\PfMTitiLgNE}{}{}{~:~}}\useKV[ClesExercices]{Titre}}{}};
%%
- \ifboolKV[ClesExercices]{Calculatrice}{}{\node[fill=ColExoFiche,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\cancel{\faCalculator}};\stepcounter{PfMNbLogo}}
- \ifboolKV[ClesExercices]{Oral}{\node[fill=ColExoFiche,anchor=west,xshift=(\thePfMNbLogo*2.5+(\thePfMNbLogo-1)*20)*1pt] at (A.east) {\faBullhorn};\stepcounter{PfMNbLogo}}{}
+ \PfMAffichageLogos%
%
\PfMAffichageCompetencesTravaillees%
%
@@ -2647,7 +2879,11 @@
}
\NewDocumentCommand\TikzParcoursCor{m}{%
- \clearpage
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[Parcours]{#1}%
\begin{tcolorbox}[userparcourscor]%
\Large\sffamily \useKV[Parcours]{Theme} (Correction) \hfill\useKV[Parcours]{Niveau} \useKV[Parcours]{Classe}
@@ -2670,8 +2906,7 @@
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}}{}
+ \PfMAffichageLogos%
%%
\PfMAffichageCompetencesTravaillees%
%%
@@ -2709,8 +2944,12 @@
}%
\newcommand\TikzDSCor[1]{%
- \clearpage
- \setKV[DS]{#1}
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
+ \setKV[DS]{#1}%
\begin{tcolorbox}[userdscor]%
\sffamily Devoir surveillé \useKV[DS]{Numero} (Sujet \useKV[DS]{Sujet})\hfill\useKV[DS]{Niveau} \useKV[DS]{Classe}%
\par Correction%
@@ -2802,7 +3041,11 @@
}%
\newcommand\TikzIECor[1]{%
- \clearpage%
+ \ifPfMRectoVerso%
+ \cleardoublepage%
+ \else%
+ \clearpage%
+ \fi%
\setKV[IE]{#1}%
\begin{tcolorbox}[useriecor]%
\sffamily \useKV[IE]{Nom} \useKV[IE]{Numero} : \useKV[IE]{Theme} \ifboolKV[IE]{Sujets}{\scriptsize(Sujet \useKV[IE]{Sujet})}{}\hfill Correction%
@@ -2883,7 +3126,6 @@
% Environnement englobant le tout.
%\makeatletter
\NewDocumentEnvironment{Maquette}{om}{%
- % PfMFontSize vaut \PfMFontSize
% on remet à zéro les compteurs de solutions : inutile ?
\setcounter{RetiensSol}{0}%
\setcounter{RetiensRep}{0}%
@@ -2943,14 +3185,14 @@
\setKV[FdR]{#2}\TikzFdR%
\let\exercice\exerciceFdR\let\endexercice\endexerciceFdR%
\ifboolKV[Boulot]{CorrigeFin}{%
- \AddToHook{env/Maquette/after}[Correction]{%
- \useKVdefault[Boulot]%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \useKVdefault[Boulot]%
\setKV[Boulot]{#1}%
\PfMBasculeDys%
\setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzFdRCor{#2}%
\ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
- \PfMAffichageCorrige%
+ \PfMAffichageCorrige%
\ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
}%
}{}%
@@ -2959,14 +3201,14 @@
\setKV[Contrat]{#2}\TikzContrat%
\let\exercice\exerciceContrat\let\endexercice\endexerciceContrat%
\ifboolKV[Boulot]{CorrigeFin}{%
- \AddToHook{env/Maquette/after}[Correction]{%
- \useKVdefault[Boulot]%
+ \AddToHook{env/Maquette/after}[Correction]{%
+ \useKVdefault[Boulot]%
\setKV[Boulot]{#1}%
\PfMBasculeDys%
\setlength{\columnseprule}{\useKV[Boulot]{Epaisseur}}%
\TikzContratCor{#2}
\ifboolKV[Boulot]{CorrectionColonnes}{\begin{multicols}{\useKV[Boulot]{Colonnes}}}{}%
- \PfMAffichageCorrige%
+ \PfMAffichageCorrige%
\ifboolKV[Boulot]{CorrectionColonnes}{\end{multicols}}{}%
}%
}{}%
@@ -2975,7 +3217,6 @@
\setKV[Cours]{#2}%
\TikzCours%
\let\exercice\exerciceFiche\let\endexercice\endexerciceFiche%
- % \let\Exercice\exerciceFiche\let\endExercice\endexerciceFiche%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -2993,7 +3234,6 @@
\setKV[RecapBrevet]{#2}%
\TikzRecapBrevet%
\let\exercice\ExerciceRecapBrevet\let\endexercice\endExerciceRecapBrevet%
- %\let\Exercice\ExerciceRecapBrevet\let\endExercice\endExerciceRecapBrevet%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -3011,7 +3251,6 @@
\setKV[ParcoursPerso]{#2}%
\DTLloaddb[noheader,keys={PrenomEleve,NomEleve,ListeExo}]{dataperso}{\useKV[ParcoursPerso]{Fichier}.csv}%
\let\exercice\exerciceParcoursPerso\let\endexercice\endexerciceParcoursPerso%
- %\let\Exercice\exerciceParcoursPerso\let\endExercice\endexerciceParcoursPerso%
\ifboolKV[Boulot]{CorrigeFin}{\setcounter{PfMCorrigeParcoursPerso}{1}}{}%
\setcounter{PfMExo}{0}%
\AtEndDocument{%
@@ -3021,7 +3260,6 @@
\ifboolKV[Boulot]{Parcours}{%
\setKV[Parcours]{#2}\TikzParcours%
\let\exercice\exerciceParcours\let\endexercice\endexerciceParcours%
- %\let\Exercice\exerciceParcours\let\endExercice\endexerciceParcours%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -3038,7 +3276,6 @@
\ifboolKV[Boulot]{PdT}{%
\setKV[PdT]{#2}\TikzPdT%
\let\exercice\exercicePdT\let\endexercice\endexercicePdT%
- %\let\Exercice\exercicePdT\let\endExercice\endexercicePdT%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -3055,7 +3292,6 @@
\ifboolKV[Boulot]{DM}{%
\setKV[DM]{#2}\TikzDM{}%
\let\exercice\exerciceDM\let\endexercice\endexerciceDM%
- %\let\Exercice\exerciceDM\let\endExercice\endexerciceDM%
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -3073,7 +3309,6 @@
\setKV[Fiche]{#2}%
\TikzFiche%
\let\exercice\exerciceFiche\let\endexercice\endexerciceFiche%
- %\let\Exercice\exerciceFiche\let\endExercice\endexerciceFiche%
\ifboolKV[Boulot]{CorrigeFin}{%
\ifboolKV[Boulot]{CorrigeAll}{%
\AddToHook{env/Maquette/after}[Correction]{%
@@ -3138,7 +3373,6 @@
\ifboolKV[Boulot]{IE}{%
\setKV[IE]{#2}\TikzIE%
\let\exercice\exerciceDS\let\endexercice\endexerciceDS%On garde exerciceDS
- % \let\Exercice\exerciceDS\let\endExercice\endexerciceDS%On garde exerciceDS
\ifboolKV[Boulot]{CorrigeFin}{%
\AddToHook{env/Maquette/after}[Correction]{%
\useKVdefault[Boulot]%
@@ -3180,7 +3414,6 @@
}%
}%
}{}%
-%\makeatother
%D'après JCC
% Package pour gérer les nombres pseudo-aléatoires
@@ -3407,6 +3640,9 @@
\randomextract{\DeChoisi}{\NbDeChoisi}%
}
+\def\PfMListeNombresPremiers{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}
+
+
\newcommand\initpremiers{%
\definelist{\listpremiers}{13,17,19,23,29,31,37,41,43,47}%
}
@@ -3660,6 +3896,8 @@
}
% On met Christ7 à la fin :)
+ \newcommand{\vecteur}[1]{\overrightarrow{\strut #1}}
+
\newlength{\ltxt}
\newcommand\compo[4]{%
@@ -3808,4 +4046,83 @@
#2
\end{minipage}
\BaremeEspaceMarge{-82pt}
-} \ No newline at end of file
+}
+
+\AddToHook{env/multicols/begin}{\setcounter{Nbcolonnes}{2}}%
+\AddToHook{env/multicols/after}{\setcounter{Nbcolonnes}{4}}%
+\NewDocumentEnvironment{Dispo}{sm+b}{%
+ \ifPfMDeuxColonnes
+ \IfBooleanTF{#1}{%
+ #3
+ \begin{center}
+ #2
+ \end{center}
+ }{%
+ \begin{center}
+ #2
+ \end{center}
+ #3
+ }%
+ \else%
+ \IfBooleanTF{#1}{%
+ \dispog{1}{#2}{#3}
+ }{%
+ \dispo{1}{#2}{#3}
+ }%
+ \fi%
+}%
+
+\NewDocumentEnvironment{CALign}{O{&=\dots&}O{&=\dots}mb}{%
+ % #1 séparateur généraliste
+ % #2 séparateur dernière colonne
+ % #3 nombre de colonnes souhaitées
+ % #4 environnement
+ \xdef\Foo{#4}%
+ \setsepchar{§}\ignoreemptyitems%
+ \readlist*\ListeTest{\Foo}%
+ \reademptyitems%
+ \quotient{\ListeTestlen}{#3}%
+ \modulo{\ListeTestlen}{#3}%
+ \begin{align*}
+ \ifnum\intquotient>0\relax
+ \xintFor* ##9 in{\xintSeq{0}{\fpeval{\the\intquotient-1}}}\do{%
+ \xintFor* ##8 in{\xintSeq{1}{#3}}\do{
+ \ListeTest[\fpeval{##9*#3+##8}]\xintifForLast{#2}{#1}
+ }\ifnum##9<\fpeval{\the\intquotient-1}\relax\\\fi
+ }
+ \fi
+ \ifnum\remainder>0\relax
+ \ifnum\intquotient>0\relax\\\fi
+ \xintFor* ##8 in{\xintSeq{1}{\the\remainder}}\do{
+ \ListeTest[\fpeval{\the\intquotient*#3+##8}]\xintifForLast{#2}{#1}
+ }
+ \fi
+ \end{align*}
+}{}%
+
+\NewDocumentEnvironment{CALignAv}{O{A&=}mb}{%
+ % #1 séparateur généraliste
+ % #2 nombre de colonnes souhaitées
+ % #3 environnement
+ \xdef\Foo{#3}%
+ \setsepchar{§}\ignoreemptyitems%
+ \readlist*\ListeTest{\Foo}%
+ \reademptyitems%
+ \quotient{\ListeTestlen}{#2}%
+ \modulo{\ListeTestlen}{#2}%
+ \begin{align*}
+ \ifnum\intquotient>0\relax
+ \xintFor* ##9 in{\xintSeq{0}{\fpeval{\the\intquotient-1}}}\do{%
+ \xintFor* ##8 in{\xintSeq{1}{#2}}\do{%
+ #1\ListeTest[\fpeval{##9*#2+##8}]\ifnum##8<#2\relax\uppercase{&}\fi
+ }\ifnum##9<\fpeval{\the\intquotient-1}\relax{}\\\fi
+ }%
+ \fi%
+ \ifnum\remainder>0\relax%
+ \ifnum\intquotient>0\relax\\\fi
+ \xintFor* ##8 in{\xintSeq{1}{\the\remainder}}\do{%
+ #1\ListeTest[\fpeval{\the\intquotient*#2+##8}]\ifnum##8<\remainder\relax\uppercase{&}\fi
+ }%
+ \fi%
+ \end{align*}
+}{}% \ No newline at end of file