% 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{2022/08/30}%
\let\PfCfiledate\filedate%
\def\fileversion{0.99-y}%
\let\PfCfileversion\fileversion%
\ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college]

\RequirePackage{verbatim}

\RequirePackage{mathtools}
\RequirePackage{amssymb}

% mathématiques
\RequirePackage{siunitx}
\sisetup{%
  locale=FR,%
  mode = match, propagate-math-font = true,%
  reset-math-version = false, reset-text-family = false,%
  reset-text-series = false, reset-text-shape = false,%
  text-family-to-math = true, text-series-to-math = true,%
  output-decimal-marker={,},%
  group-minimum-digits=4%
}%
\DeclareSIUnit{\kmh}{\km\per\hour}
\newcommand\speed[1]{\SI{#1}{\kmh}}
\newcommand\Speed[1]{\SI[per-mode=symbol]{#1}{\kmh}}

\DeclareSIUnit{\are}{a}
\DeclareSIUnit{\annee}{an}
\DeclareSIUnit{\mois}{mois}
\DeclareSIUnit{\jour}{j}
\DeclareSIUnit{\quintal}{q}
\DeclareSIUnit{\octet}{o}
\DeclareSIUnit{\fahrenheit}{\text{\textdegree}F}
\DeclareSIUnit{\EuRo}{€}

\RequirePackage[table,svgnames]{xcolor}%Gestion des couleurs
\RequirePackage{xstring}%Gestion de chaines de caractères
\RequirePackage{simplekv}%Gestion de paramètres sous forme de clés
\RequirePackage{ifthen}
\RequirePackage{modulus}%Pour certains calculs arithmétiques.
\RequirePackage{xinttools}%Pour la création dynamique d'un tableau

\newif\if@shellescape \@shellescapetrue
\DeclareOption{nonshellescape}{\@shellescapefalse}
\ProcessOptions\relax

\RequirePackage{iftex}

\ifluatex
\RequirePackage{luamplib}
\everymplib{input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur; beginfig(1);}
\everyendmplib{endfig;}
\else
\if@shellescape
\RequirePackage[shellescape,latex]{gmp}%inclusion de figures metapost "à la volée"%
\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}}
\usempxclass{article}
\usempxpackage[locale=FR,mode = match, propagate-math-font = true,reset-math-version = false, reset-text-family = false,reset-text-series = false, reset-text-shape = false,text-family-to-math = true, text-series-to-math = true, output-decimal-marker={,},group-minimum-digits=4]{siunitx}
\usempxpackage[utf8]{inputenc}
\usempxpackage[T1]{fontenc}
\usempxpackage{fourier}
\usempxpackage[french]{babel}
\usempxpackage{pifont}
\else
\RequirePackage[latex]{gmp}%inclusion de figures metapost "à la volée"%
\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}}
\usempxclass{article}
\usempxpackage[locale=FR,mode = match, propagate-math-font = true,reset-math-version = false, reset-text-family = false,reset-text-series = false, reset-text-shape = false,text-family-to-math = true, text-series-to-math = true, output-decimal-marker={,},group-minimum-digits=4]{siunitx}
\usempxpackage[utf8]{inputenc}
\usempxpackage[T1]{fontenc}
\usempxpackage{fourier}
\usempxpackage[french]{babel}
\usempxpackage{pifont}
\fi
\fi

\RequirePackage{xintexpr}
\RequirePackage{listofitems}
\RequirePackage{datatool}
\RequirePackage{multido}

\RequirePackage{xlop}
\RequirePackage{xfp}

\RequirePackage[most]{tcolorbox}

\RequirePackage{tikz}
% https://tex.stackexchange.com/questions/349259/curved-arrow-describing-a-step-in-a-equation-derivation
%https://tex.stackexchange.com/questions/58656/best-way-to-draw-a-chevron-diagram-using-tikz
\usetikzlibrary{calc,shapes,arrows,tikzmark,chains,positioning,shapes.symbols,babel,fit}

\RequirePackage{suffix}%pour la commande étoilée

\RequirePackage{multicol}

\RequirePackage{hhline}

\RequirePackage{stackengine}
\RequirePackage[thicklines]{cancel}

\RequirePackage{fontawesome5}%Pour l'environnement Twitter
\RequirePackage{pifont}%Pour la commande \Autonomie
\RequirePackage{nicematrix}%
\NiceMatrixOptions{allow-duplicate-names}

\let\myoldmulticolumn\multicolumn
\AtBeginEnvironment{tabular}{\let\multicolumn\myoldmulticolumn}

\RequirePackage{fmtcount}
\FCloadlang{french}

% https://stackoverflow.com/questions/3391103/how-to-make-the-grayed-round-box-using-tiks
\RequirePackage{environ}

%%%%% Quelques besoins particuliers

\def\bla{}%JCC :) Pour les tests sur arguments vides

%% Colorer en mode mathématique. \color ne gère pas les espaces propres au mode mathématique. Donc besoin de changer
% https://tex.stackexchange.com/questions/21598/how-to-color-math-symbols
\makeatletter
\def\mathcolor#1#{\@mathcolor{#1}}
\def\@mathcolor#1#2#3{%
  \protect\leavevmode
  \begingroup
    \color#1{#2}#3%
  \endgroup
}
\makeatother

% Pb ProfCollege<->Chinois soulev\'e par Denis
% Solution by egreg :)
\newcommand\getstrut[1]{%
  \the\expandafter#1\expanded{\strutbox}%
}

% Colorer uniquement la barre de soulignement
% https://tex.stackexchange.com/questions/9466/color-underline-a-formula/153884
\def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}}

% Ecrire des lignes d'équations
\catcode`\@=11
\def\Eqalign#1{\null\,\vcenter{\openup\jot\m@th\ialign{
      \strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
      &&\quad\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$
      \hfil\crcr #1\crcr}}\,}
\catcode`\@=12

%%%
% Commandes "utiles"
%%%
%encadrer avec des "sommets arrondis"
\newsavebox{\logobox}

\newcommand\Logo[2]{%
\setbox1=\hbox{\includegraphics[scale=#2]{#1}}
\begin{tikzpicture}%
\clip[rounded corners=5mm] (0,0) rectangle (\wd1,\ht1);
\node[xshift=0.5\wd1, yshift=0.5\ht1, inner xsep=0pt, inner ysep=0pt] (box) {%
\includegraphics[scale=#2]{#1}%
};%
\end{tikzpicture}%
}

\newcommand\LogoTW[2]{%
\setbox1=\hbox{\includegraphics[scale=#2]{#1}}%
\begin{tikzpicture}%
  \clip (0,0) circle (4mm);
  \draw (0,0) circle (4mm);
  \node[xshift=0mm, yshift=0mm, inner xsep=0pt, inner ysep=0pt] (0,0) {%
    \includegraphics[scale=#2]{#1}%
  };%
\end{tikzpicture}%
}%

\makeatletter%
\NewDocumentCommand\Dotfill{}{%
\leavevmode%
\cleaders\hb@xt@.44em{\hss\xleaders\hrule width0.33em\hss}\hfill%
\kern\z@}%

\NewDocumentCommand\PfCdotover{}{\leavevmode\cleaders\hb@xt@ .22em{\hss $\cdot$\hss}\hfill\kern\z@}

\makeatother%

\NewDocumentCommand\pointilles{o}{%
  \IfNoValueTF{#1}{\Dotfill}{\makebox[#1]{\Dotfill}}%
}%

\NewDocumentCommand\Lignespointilles{m}{%
  \xintifboolexpr{#1>1}{%
    \xintFor* ##1 in {\xintSeq {1}{#1}}\do{%
      \pointilles\par%
    }%
  }{}%
}%

%https://tex.stackexchange.com/questions/128991/frac-or-inference-rule-with-dotted-line
\newcommand\PfCfrac[2]{%
\ooalign{$\genfrac{}{}{0pt}{0}{#1}{#2}$\cr\PfCdotover\cr}
}%
\makeatother

\newcommand\MultiCol[2]{%
  \setsepchar[*]{/}%
  \readlist*\ListeNombreCol{#1}%
  \setsepchar[*]{§}%
  \readlist*\ListeContenuCol{#2}%
  \xintFor* ##1 in {\xintSeq {1}{\ListeNombreCollen}}\do{%
    \begin{minipage}{\ListeNombreCol[##1]\linewidth}
      \ListeContenuCol[##1]
    \end{minipage}%
    \xintifboolexpr{##1<\ListeNombreCollen}{\hfill}{}%
  }%
}%

\newcount\PfCrappeljour

\newcommand\Demain{%
  \PfCrappeljour=\day\relax%
  \advance\day by 1\relax%
  \ifnum\month=1\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=2\relax%
  \ifnum\day>28\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=3\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=4\relax%
  \ifnum\day>30\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=5\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=6\relax%
  \ifnum\day>30\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=7\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=8\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=9\relax%
  \ifnum\day>30\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=10\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=11\relax%
  \ifnum\day>30\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \ifnum\month=12\relax%
  \ifnum\day>31\relax%
  \day=\numexpr1\relax%
  \advance\month by 1\relax%
  \today\relax%
  \advance\month by -1\relax%
  \else%
  \today\relax%
  \fi%
  \fi%
  \day=\the\PfCrappeljour\relax%
}

%%%
% Shikaku
%%%
\newcounter{PfCShikakuNom}
\setcounter{PfCShikakuNom}{0}

\setKVdefault[Shikaku]{Couleur=Purple,Taille=4,Largeur=2em,Solution=false,CodeAfter={},Creation=false,TailleHor=10,TailleVer=10,TailleHorMax=5,TailleVerMax=5,Nom=Shikaku\PfCShikakuNom}

\newlength\PfCShikakuh
\newlength\PfCShikakuv

\NewDocumentCommand\Shikaku{o m}{%
  \stepcounter{PfCShikakuNom}%
  \useKVdefault[Shikaku]%
  \setKV[Shikaku]{#1}%
  \ifboolKV[Shikaku]{Creation}{%
    \ifluatex\else\PackageWarning{ProfCollege}{La création automatique de Shikaku n'est disponible qu'avec LuaLaTeX.}\fi%
    \ifboolKV[Shikaku]{Solution}{%
      \ShikakuCreationSolution%
    }{%
      \ShikakuCreation%
    }%
  }{%
    \setlength{\PfCShikakuv}{\useKV[Shikaku]{Largeur}+\tabcolsep}%
    \setlength{\PfCShikakuh}{\useKV[Shikaku]{Largeur}}%
    \colorlet{PfCCouleurShikaku}{\useKV[Shikaku]{Couleur}}%
    \setsepchar[*]{,*/}%
    \readlist*\ListeCasesSKK{#2}%
    \savecomparemode%
    \comparestrict%
    \begin{NiceTabular}{*{\useKV[Shikaku]{Taille}}{m{\PfCShikakuh}}}[hvlines]
      \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Shikaku]{Taille}-1}}}\do{%
        \xintFor* ##2 in {\xintSeq{1}{\useKV[Shikaku]{Taille}}}\do{%
          \rule{0pt}{\PfCShikakuv}%
          \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{b}[\PfCTestb]%
          \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{l}[\PfCTestl]%
          \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]%
          \xintifboolexpr{\PfCTestb==0}{%
            \ifboolKV[Shikaku]{Solution}{%
              \Block[borders={bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{%
                \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
              }%
            }{%
              \Block[]{1-1}{%
                \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
              }%
            }%
          }{% Testl
            \xintifboolexpr{\PfCTestl==0}{%
              \ifboolKV[Shikaku]{Solution}{%
                \Block[borders={left,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{%
                  \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
                }%
              }{%
                \Block[]{1-1}{%
                  \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
                }%
              }%
            }{% Testlb
              \xintifboolexpr{\PfCTestlb==0}{%
                \ifboolKV[Shikaku]{Solution}{%
                  \Block[borders={left,bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{%
                    \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
                  }%
                }{%
                  \Block[]{1-1}{%
                    \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
                  }%
                }%
              }{%
                \Block[]{1-1}{%
                  \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]%
                }%
              }%
            }%
          }%
          \xintifForLast{\\}{&}%
        }%
      }%
      \CodeAfter%
      \useKV[Shikaku]{CodeAfter}%
      \ifboolKV[Shikaku]{Solution}{%
        \tikz\draw[line width=2pt,PfCCouleurShikaku] (1-|1) rectangle (last-|last);%
      }{}%
    \end{NiceTabular}%
    \restorecomparemode%
  }%
}%

\NewDocumentCommand\ShikakuCreation{}{%
  \ifluatex%
  \mplibforcehmode
  \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}%
  \begin{mplibcode}[\PfCNomShikaku]%
    Taillehor=\useKV[Shikaku]{TailleHor};
    Taillever=\useKV[Shikaku]{TailleVer};
    
    TailleMaxh=\useKV[Shikaku]{TailleHorMax};
    TailleMaxv=\useKV[Shikaku]{TailleVerMax};

    u:=5mm;
    
    path R[],S[],RIso[],SIso[];
    numeric RAire[],SAire[];
    numeric RHor[],RVer[],SHor[],SVer[],RAngle[],SAngle[];
    
    vardef RetiensLesInfosGenerales(expr depart,Lhor,Lver)=
    R[k]:=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver));
    RIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver));
    RHor[k]=Lhor;
    RVer[k]=Lver;
    RAire[k]=Lhor*Lver;
    RAngle[k]=ANGLE;
    enddef;
    
    vardef RetiensLesInfosPourLaSuite(expr depart,Lhor,Lver)=
    if Lver>0:
    S[k]=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver));
    SIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver));
    SHor[k]=Lhor;
    SVer[k]=Lver;
    SAire[k]=Lhor*Lver;
    SAngle[k]=ANGLE;
    fi;
    enddef;
    
    vardef RectangleAuto(expr aa,bb)=
    save $;
    path $;
    $=polygone(aa,aa+(xpart(bb-aa),0),bb,bb-(xpart(bb-aa),0));
    $
    enddef;

    pair T[];
    
    pair A[],B[];
  
    A1=u*(0,Taillever);
    A2-A1=u*(Taillehor,0);
    A4=(0,0);
    A3-A4=A2-A1;
    
    nbh=Taillehor div TailleMaxh;
    nbv=Taillever div TailleMaxv;
    
    p:=0;
    for l=0 upto nbv:
    for k=0 upto nbh:
    p:=p+1;
    T[p]=A1+u*(k*TailleMaxh,-l*TailleMaxv);
    if k<nbh:
    Hor[p]=TailleMaxh;
    else:
    Hor[p]=Taillehor mod TailleMaxh;
    fi;
    if l<nbv:
    Ver[p]=TailleMaxv;
    else:
    Ver[p]=Taillever mod TailleMaxv;
    fi;
    endfor;
    endfor;
    
    Total:=p;
    
    vardef DecomposeUnRectangle(expr BASEA,THOR,TVER)=
    TMAXV:=TVER;
    pair BBASEA;
    BTHOR:=THOR;
    BTVER:=TVER;
    BBASEA:=BASEA;
    forever:
    k:=k+1;
    hor:=floor(1+uniformdeviate(BTHOR));
    ver:=floor(1+uniformdeviate(BTVER));
    RetiensLesInfosGenerales(BBASEA,hor,ver);
    RetiensLesInfosPourLaSuite(BBASEA+u*(0,-ver),hor,TMAXV-ver);
    BTHOR:=BTHOR-hor;
    BTVER:=ver;
    BBASEA:=BBASEA+u*(hor,0);
    exitif BTHOR<1;
    endfor;
    enddef;
    
    k=0;
    for l=1 upto Total:
    if uniformdeviate(1)>0.5:
    Angle[l]=180;
    ANGLE:=Angle[l];
    else:
    Angle[l]=0;
    ANGLE:=Angle[l];
    fi;
    DecomposeUnRectangle(T[l],Hor[l],Ver[l]);
    endfor;
    Totalk=k;

    picture RTEXT[],STEXT[];
    
    drawoptions(withpen pencircle scaled 2);
    for n=1 upto Totalk:
    trace R[n] withcolor white;
    RTEXT[n]=image(
    label(decimal(RAire[n]),(0,0));
    );
    RTEXT[n]:=image(
    trace rotation(RTEXT[n],center RTEXT[n],RAngle[n]) shifted ((point(0) of R[n]) shifted(u*(0.5+floor(uniformdeviate(RHor[n])),-0.5-floor(uniformdeviate(RVer[n])))));
    );
    trace RTEXT[n];
    endfor;
    for n=1 upto Totalk:
    if unknown S[n]:
    else:
    trace S[n] withcolor white;
    STEXT[n]=image(
    label(decimal(SAire[n]),(0,0));
    );
    STEXT[n]:=image(
    trace rotation(STEXT[n],center STEXT[n],SAngle[n]) shifted ((point(0) of S[n]) shifted(u*(0.5+floor(uniformdeviate(SHor[n])),-0.5-floor(uniformdeviate(SVer[n])))));
    );
    trace STEXT[n];
    fi;
    endfor;
    clip currentpicture to polygone(A1,A2,A3,A4);
    
    picture CasesAvant[],CasesApres[];
    CasesAvant[0]=currentpicture;
    
    currentpicture:=nullpicture;

    drawoptions(withpen pencircle scaled 2);
    for n=1 upto Totalk:
    trace R[n];
    trace RTEXT[n];
    endfor;
    for n=1 upto Totalk:
    if unknown S[n]:
    else:
    trace S[n];
    trace STEXT[n];
    fi;
    endfor;
    clip currentpicture to polygone(A1,A2,A3,A4);
    CasesApres[0]:=currentpicture;
    
    currentpicture:=nullpicture;
        
    for l=1 upto Total:
    CasesAvant[l]=image(%
    trace CasesAvant[0];
    clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l]));
    );
    currentpicture:=nullpicture;
    CasesApres[l]=image(
    trace CasesApres[0];
    clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l]));
    );
    currentpicture:=nullpicture;
    endfor;
    
    for l=1 upto Total:
    trace rotation(CasesAvant[l],center CasesAvant[l],Angle[l]);
    endfor;
    
    drawoptions(withpen pencircle scaled 2);
    trace RectangleAuto(A1,A3);
    drawoptions();
    for k=1 upto Taillehor-1:
    trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2];
    endfor;
    
    for k=1 upto Taillever-1:
    trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2];
    endfor;
  \end{mplibcode}
  \fi%
}%

\NewDocumentCommand\ShikakuCreationSolution{}{%
  \ifluatex%
  \mplibforcehmode
  \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}%
  \begin{mplibcode}[\PfCNomShikaku]%
    for l=1 upto Total:
    trace rotation(CasesApres[l],center CasesApres[l],Angle[l]);
    endfor;
    drawoptions(withpen pencircle scaled 2);
    trace RectangleAuto(A1,A3);
    drawoptions();
    for k=1 upto Taillehor-1:
    trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2];
    endfor;
    
    for k=1 upto Taillever-1:
    trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2];
    endfor;
  \end{mplibcode}
  \fi%
}%

%%%
% Kakuro
%%%
\setKVdefault[Kakuro]{CouleurCase=LightGray,Taille=5,Solution=false,Largeur=2em,Aide=false,CouleurSolution=Black}
\defKV[Kakuro]{ListeNombres=\setKV[Kakuro]{Aide}}%

\newlength\PfCKakuro%

\NewDocumentCommand\Kakuro{o m}{%
  \useKVdefault[Kakuro]%
  \setKV[Kakuro]{#1}%
  \setlength{\PfCKakuro}{\useKV[Kakuro]{Largeur}+\tabcolsep}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeCasesKK{#2}%
  \setsepchar{,}%
  \xdef\ListeAvantNombres{\useKV[Kakuro]{ListeNombres}}%
  \readlist*\ListeKakuroNombres{\ListeAvantNombres}%
  \savecomparemode%
  \comparestrict%
  \begin{NiceTabular}{*{\useKV[Kakuro]{Taille}}{m{\useKV[Kakuro]{Largeur}}}}[hvlines]
    \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Kakuro]{Taille}-1}}}\do{%
      \xintFor* ##2 in {\xintSeq{1}{\useKV[Kakuro]{Taille}}}\do{%
        \rule{0pt}{\PfCKakuro}%
        \StrCompare{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},1]}{*}[\PfCTestBlack]
        \xintifboolexpr{\PfCTestBlack==0}{%
          \Block[fill=black]{1-1}{}%
        }{%
          \xintifboolexpr{\listlen\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2}]==2}{
            \Block[fill=\useKV[Kakuro]{CouleurCase}]{1-1}{\diagbox{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},1]}{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},2]}}%
          }{%
            \Block{1-1}{\ifboolKV[Kakuro]{Solution}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},1]}}{%
                \ifboolKV[Kakuro]{Aide}{%
                  \xintFor* ##3 in{\xintSeq{1}{\ListeKakuroNombreslen}}\do{%
                    \Block{1-1}{\xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},1]==\ListeKakuroNombres[##3]}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{Taille}*##1+##2},1]}}{}}%
                  }%
                }{}%
              }%
            }%
          }%
        }%
        \xintifForLast{\\}{&}%
      }%
    }%
  \end{NiceTabular}
  \restorecomparemode%
}%

%%%
% KenKen
%%%
\setKVdefault[ClesKK]{Solution=false,Taille=3,Largeur=2em,Aide=false}%
\defKV[ClesKK]{Nombre=\setKV[ClesKK]{Aide}}%

\newlength\PfCKenKen

\NewDocumentCommand\KenKen{o m}{%
  \useKVdefault[ClesKK]%
  \setKV[ClesKK]{#1}%
  \setlength{\PfCKenKen}{\useKV[ClesKK]{Largeur}+\tabcolsep}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeCasesKK{#2}%
  \savecomparemode%
  \comparestrict%
  \begin{NiceTabular}{*{\useKV[ClesKK]{Taille}}{m{\useKV[ClesKK]{Largeur}}}}%
    \CodeBefore
    \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{%
      \tikz\draw[gray] (##1-|1) -- (##1-|last);%
      \tikz\draw[gray] (1-|##1) -- (last-|##1);%
    }%
    \Body
    \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[ClesKK]{Taille}-1}}}\do{%
      \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{%
        \rule{0pt}{\PfCKenKen}%
        \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{b}[\PfCTestb]%\PfCTestb
        \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{l}[\PfCTestl]%\PfCTestr
        \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]%\PfCTestbr
        \xintifboolexpr{\PfCTestb==0}{%
          \Block[borders={bottom},line-width=2pt]{1-1}{%
            \ifboolKV[ClesKK]{Solution}{%
              \Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]%
            }{%
              \ifboolKV[ClesKK]{Aide}{%
                \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{%
                  \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]%
                }{}%
              }{}%
            }%
          }%
        }{%
          \xintifboolexpr{\PfCTestl==0}{%
            \Block[borders={left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{%
                \ifboolKV[ClesKK]{Aide}{%
                  \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{%
                    \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]%
                  }{}%
                }{}%
              }%
            }%
          }{%
            \xintifboolexpr{\PfCTestlb==0}{%
              \Block[borders={bottom,left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{%
                  \ifboolKV[ClesKK]{Aide}{%
                    \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{%
                      \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]%
                    }{}%
                  }{}%
                }%
              }%
            }{%
              \Block{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{%
                  \ifboolKV[ClesKK]{Aide}{%
                    \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{%
                      \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]%
                    }{}%
                  }{}%
                }%
              }%
            }%
          }%
        }%
        \xintifForLast{\\}{&}%
      }%
    }%
    \CodeAfter%
    \tikz\draw[line width=2pt] (1-|1) rectangle (last-|last);%
    \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{%
      \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{%
        \tikz\node[anchor=west,inner sep=0pt,xshift=1mm,yshift=-0.2\PfCKenKen] at (##1 -|##2) {\scriptsize$\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*(##1-1)+##2},2]$};%
      }%
    }%
  \end{NiceTabular}
  \restorecomparemode%
}%

%%%
% PixelArt
%%%
\newtoks\toklistePANombre%
\def\UpdatetoksPANombre#1\nil{\addtotok\toklistePANombre{"#1",}}%

\setKVdefault[ClesPixelArt]{Largeur=29,Hauteur=29,Solution=false,Lettres=ABCDEFGHIJK,Nombres=false,ListeCouleurs={Orange,Red,LightGray,Maroon,Purple,black,black,Plum,Orange,White,White},Unite=5mm}
\defKV[ClesPixelArt]{ListeNombres=\setKV[ClesPixelArt]{Nombres}}

\NewDocumentCommand\PixelArt{o m}{%
  \toklistePANombre{}%
  \useKVdefault[ClesPixelArt]%
  \setKV[ClesPixelArt]{#1}%
  \xdef\ListeAvantCouleurs{\useKV[ClesPixelArt]{ListeCouleurs}}%
  \xdef\ListeAvantNombres{\useKV[ClesPixelArt]{ListeNombres}}%
  \readlist*\ListePANombre{\ListeAvantNombres}%
  \foreachitem\compteur\in\ListePANombre{\expandafter\UpdatetoksPANombre\compteur\nil}%
  \BuildPixelArt{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}%
}%

\NewDocumentCommand\BuildPixelArt{m m m m}{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    largeur:=\useKV[ClesPixelArt]{Largeur};
    hauteur:=\useKV[ClesPixelArt]{Hauteur};
    Unite:=\useKV[ClesPixelArt]{Unite};
    boolean Solution,Nombres;
    Solution:=\useKV[ClesPixelArt]{Solution};
    Nombres:=\useKV[ClesPixelArt]{Nombres};
    string BaseLettres;
    BaseLettres=str #2;

    color ColorEntier[],ColFond;
    n:=0;
    for p_=#3:
    n:=n+1;
    ColorEntier[n]:=p_;
    endfor;

    string RetiensNombres[];
    if Nombres:
    n:=0;
    for p_=#4:
    n:=n+1;
    RetiensNombres[n]=p_;
    endfor;
    fi;
        
    vardef Lecturecsv(expr nomfichier)=
    for h=hauteur downto 1:
    string p_;
    p_=readfrom nomfichier;
    l:=0;
    for p=0 step 2 until 2*largeur-2:
    l:=l+1;
    if (substring(p,p+1) of p_)="-":
    else:
    if Nombres:
    for m=0 upto (length BaseLettres-1):
    if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres:
    label(TEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite));
    fi;
    endfor;
    else:
    label(TEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite));
    fi;
    if Solution:
    for m=0 upto (length BaseLettres-1):
    if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres:
    ColFond:=ColorEntier[m+1];
    fi;
    endfor;
    if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi;
    fi;
    trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite);
   fi;
    endfor;
    endfor;
    closefrom nomfichier;
    enddef;
    
    Lecturecsv("#1");
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres};}]
    string BaseLettres;
    BaseLettres=str #2;

    color ColorEntier[],ColFond;
    n:=0;
    for p_=#3:
    n:=n+1;
    ColorEntier[n]:=p_;
    endfor;

    string RetiensNombres[];
    if Nombres:
    n:=0;
    for p_=#4:
    n:=n+1;
    RetiensNombres[n]=p_;
    endfor;
    fi;
        
    vardef Lecturecsv(expr nomfichier)=
    for h=hauteur downto 1:
    string p_;
    p_=readfrom nomfichier;
    l:=0;
    for p=0 step 2 until 2*largeur-2:
    l:=l+1;
    if (substring(p,p+1) of p_)="-":
    else:
    if Nombres:
    for m=0 upto (length BaseLettres-1):
    if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres:
    label(LATEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite));
    fi;
    endfor;
    else:
    label(LATEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite));
    fi;
    if Solution:
    for m=0 upto (length BaseLettres-1):
    if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres:
    ColFond:=ColorEntier[m+1];
    fi;
    endfor;
    if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi;
    fi;
    trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite);
   fi;
    endfor;
    endfor;
    closefrom nomfichier;
    enddef;
    
    Lecturecsv("#1");
  \end{mpost}
  \fi
}

%%%
% Yohaku
%%%
\setKVdefault[Yohaku]{Taille=2,Largeur=1cm,Hauteur=1cm,Addition,Multiplication=false,Perso=false,Limite=50,Relatif=false,Negatif=false,Pair=false,Impair=false,Premier=false,Solution=false,Visible=false,Bordure=false,CouleurResultat=gray!15,Ligne=0,Colonne=0,PasL=0,PasC=0,CouleurZone=gray!25}%
\defKV[Yohaku]{Case=\setKV[Yohaku]{Visible}}%

\newlength\PfCYohaku%

\xdef\PfCYHKpremier{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}%

\NewDocumentCommand\Yohaku{o m}{%
  \useKVdefault[Yohaku]%
  \setKV[Yohaku]{#1}%
  \xdef\PfCYHKlast{\fpeval{\useKV[Yohaku]{Taille}+1}}%
  \xdef\PfCYHKnombre{1}%
  \xdef\PfCYHKpair{2}%
  \xdef\PfCYHKimpair{1}%
  \xdef\PfCYHKnegatif{}%
  \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{%
    \xdef\PfCYHKnegatif{\PfCYHKnegatif -##1,}%
  }%
  \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{%
    \xdef\PfCYHKnombre{\PfCYHKnombre,##1}%
  }%
  \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{%
    \xdef\PfCYHKpair{\PfCYHKpair,\fpeval{##1*2}}%
  }%
  \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{%
    \xdef\PfCYHKimpair{\PfCYHKimpair,\fpeval{##1*2+1}}%
  }%
  %
  \ifboolKV[Yohaku]{Perso}{%
    \setsepchar[*]{,*/}\ignoreemptyitems%
    \readlist*\PfCYHKListe{#2}%
    \setsepchar{,}%
    \xdef\PfCYHKListeFoo{}%
    \foreachitem\compteur\in\PfCYHKListe[1]{%
      \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[1,\compteurcnt],}%
    }%
    \ignoreemptyitems\readlist*\PfCYHKListeNA{\PfCYHKListeFoo}%
    \xdef\PfCYHKListeFoo{}%
    \foreachitem\compteur\in\PfCYHKListe[2]{%
      \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[2,\compteurcnt],}%
    }%
    \ignoreemptyitems\readlist*\PfCYHKListeP{\PfCYHKListeFoo}%
  }{%
    \ifboolKV[Yohaku]{Negatif}{%
      \xdef\PfCYHKListe{\PfCYHKnegatif}%
    }{%
      \ifboolKV[Yohaku]{Premier}{%
        \xdef\PfCYHKListe{\PfCYHKpremier}%
      }{%
        \ifboolKV[Yohaku]{Impair}{%
          \xdef\PfCYHKListe{\PfCYHKimpair}%
        }{%
          \ifboolKV[Yohaku]{Pair}{%
            \xdef\PfCYHKListe{\PfCYHKpair}%
          }{%
            \xdef\PfCYHKListe{\PfCYHKnombre}%
          }%
        }%
      }%
    }%
    \ifboolKV[Yohaku]{Relatif}{%
      \xdef\PfCMoitieCase{\fpeval{floor((\useKV[Yohaku]{Taille}**2)/2)}}%
      \xdef\PfCAutreMoitieCase{\fpeval{\useKV[Yohaku]{Taille}**2-\PfCMoitieCase}}%
      \xdef\PfCFooRelatifYohaku{}%
      \xdef\PfCYohakuAlea{\fpeval{randint(1,2)}}%
      \xintifboolexpr{\PfCYohakuAlea==1}{% on choisit M1 négatifs, M2 positifs
        \MelangeListe{\PfCYHKnegatif}{\PfCMoitieCase}%
        \xdef\PfCYohakuInter{\faa}%
        \MelangeListe{\PfCYHKnombre}{\PfCAutreMoitieCase}%
        \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}%
      }{% on choisit M1 positifs, M2 négatifs
        \MelangeListe{\PfCYHKnombre}{\PfCMoitieCase}%
        \xdef\PfCYohakuInter{\faa}%
        \MelangeListe{\PfCYHKnegatif}{\PfCAutreMoitieCase}%
        \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}%
      }%
      \MelangeListe{\PfCYohakuInter}{\fpeval{\useKV[Yohaku]{Taille}**2}}%
    }{%
      \MelangeListe{\PfCYHKListe}{\fpeval{\useKV[Yohaku]{Taille}**2}}%
    }%
    \ignoreemptyitems\readlist*\PfCYHKListeNA{\faa}%
    %Sommes/Produits
    \xdef\PfCYHKListeProduit{}%
    %verticaux
    \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
      \ifboolKV[Yohaku]{Multiplication}{%
        \xdef\PfCYHKTampon{1}%
        \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{%
          \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}%
        }%
      }{%
        \xdef\PfCYHKTampon{0}%
        \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{%
          \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}%
        }%
      }%
      \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}%
    }%
    % horizontaux
    \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
      \ifboolKV[Yohaku]{Multiplication}{%
        \xdef\PfCYHKTampon{1}%
        \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
          \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}%
        }%
      }{%
        \xdef\PfCYHKTampon{0}%
        \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
          \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}%
        }%
      }%
      \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}%
    }%
    \readlist*\PfCYHKListeP{\PfCYHKListeProduit}%
  }%
  \setlength{\PfCYohaku}{\useKV[Yohaku]{Largeur}-\tabcolsep}%
  \colorlet{PfCFondYohaku}{\useKV[Yohaku]{CouleurResultat}}%
  \colorlet{PfCZoneYohaku}{\useKV[Yohaku]{CouleurZone}}%
  \begin{NiceTabular}{*{\fpeval{\useKV[Yohaku]{Taille}+1}}{m{\PfCYohaku}}}[hvlines-except-borders]
    \CodeBefore
    \xintifboolexpr{\useKV[Yohaku]{Ligne}==0 || \useKV[Yohaku]{Colonne}==0}{}{%
      \tikz\draw[fill=PfCZoneYohaku](row-\fpeval{\useKV[Yohaku]{Ligne}}-|col-\fpeval{\useKV[Yohaku]{Colonne}}) rectangle (row-\fpeval{\useKV[Yohaku]{Ligne}+\useKV[Yohaku]{PasL}}-|col-\fpeval{\useKV[Yohaku]{Colonne}+\useKV[Yohaku]{PasC}});%
    }%
    \ifboolKV[Yohaku]{Bordure}{%
      \tikz\fill[PfCFondYohaku] (last-|1)--(last-|last)--(1-|last)--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--cycle;
    }{}
    \Body
    \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{%
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{%
        \xintifForFirst{\rule{0pt}{\useKV[Yohaku]{Hauteur}}}{&}
      }\\%
    }%
    \CodeAfter
    \ifboolKV[Yohaku]{Bordure}{%
      \tikz\draw (last-|1)--(last-|last)--(1-|last);
    }{}%
    \tikz\draw (1-|1)--(1-|last);
    \tikz\draw (1-|1)--(last-|1);
    \tikz\draw[line width=2pt] (1-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--cycle;
    \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\Huge\ifboolKV[Yohaku]{Multiplication}{$\times$}{$+$}};
    % Affichage des termes/facteurs
    \ifboolKV[Yohaku]{Solution}{%
      \ifboolKV[Yohaku]{Perso}{%
        \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
          \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
            \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]};
          }%
        }%
      }{%
        \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{
          \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{
            \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\num{\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]}};
          }%
        }%
      }%
    }{}%
    % Affichage d'un terme/facteur
    \ifboolKV[Yohaku]{Visible}{%
      \xdef\PfCYohakuCaseAFL{\fpeval{floor((\useKV[Yohaku]{Case}-1)/\useKV[Yohaku]{Taille})}}%
      \xdef\PfCYohakuCaseAFC{\fpeval{\useKV[Yohaku]{Case}-\useKV[Yohaku]{Taille}*\PfCYohakuCaseAFL}}%
      \ifboolKV[Yohaku]{Perso}{%
        \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]};
      }{%
        \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\num{\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]}};
      }%
    }{}%
    %% Affichage des sommes/produits horizontalement
    \ifboolKV[Yohaku]{Perso}{%
      \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
        \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\PfCYHKListeP[##2]};
      }%
      \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
        \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]};
      }%
    }{%
      \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
        \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\num{\PfCYHKListeP[##2]}};
      }%
      \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{%
        \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\num{\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]}};
      }%
    }%
  \end{NiceTabular}
}%

%%%
% Rose
%%%
\setKVdefault[ClesRose]{Vide=false,Couleur=white,Produits=false,Solution=false,Rayon=2cm,Petales=7,Aide=false,FacteurMin=2,FacteurMax=10,ProduitVide=false,CaseVide=false,Polygone=false,Nom=Rose1}%

\NewDocumentCommand\RoseMul{o}{%
  \useKVdefault[ClesRose]%
  \setKV[ClesRose]{#1}%
  \ifluatex%
  \ifboolKV[ClesRose]{Solution}{%
    \DessineRoseMulSol%
  }{%
    \DessineRoseMul%
  }%
  \else%
  \DessineRoseMul%
  \fi%
}%

\newcommand\DessineRoseMulSol{%
  \ifluatex%
  \mplibforcehmode%
  \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}%
  \begin{mplibcode}[\PfCNomRose]
    boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone;
    Aide:=\useKV[ClesRose]{Aide};
    Vide:=\useKV[ClesRose]{Vide};
    Solution:=\useKV[ClesRose]{Solution};
    Produits:=\useKV[ClesRose]{Produits};
    ProduitVide:=\useKV[ClesRose]{ProduitVide};
    CaseVide:=\useKV[ClesRose]{CaseVide};
    if ProduitVide:Solution:=true fi;
    if CaseVide:Solution:=true fi;
    % on labelise
    if Vide=false:
    if Produits:
    else:
    for k=0 upto Petales-1:
    label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec));
    endfor;
    fi;
    if Produits or Solution:
    for k=0 upto Petales-1:
    label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k])));
    endfor;
    fi;
    fi;
    % On trace et on affiche...éventuellement :)
    if Aide:
    for k=0 upto Petales-1:
    drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
    fi;
    if ProduitVide:
    %choix=floor(uniformdeviate(Petales-1));
    fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond;
    fi;
    if CaseVide:
    %choix:=floor(uniformdeviate(Petales-1));
    for k=0 upto Petales-1:
    if k<>choix:
    fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond;
    fi;
    endfor;
    fi;
    trace A0 for k=1 upto Petales:--A[k] endfor --cycle;
    for k=0 upto Petales-1:
    trace segment(O,B[k]) dashed withdots scaled 0.25;
    draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
  \end{mplibcode}
  \fi
}
\newcommand\DessineRoseMul{%
  \ifluatex%
  \mplibforcehmode%
  \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}%
  \begin{mplibcode}[\PfCNomRose]
    vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)=
    numeric ElementE[],ElementS[];
    %% éléments d'entrée
    nbe:=1;
    for k=nbmin upto nbmax:
    ElementE[nbe]=k;
    nbe:=nbe+1;
    endfor;
    totalE:=(nbmax-nbmin)+1;
    numeric rec;
    for k=1 upto nbfacteurs:
    rec:=ceiling(uniformdeviate(totalE+1-k));
    ElementS[k]=ElementE[rec];
    numeric ElementI[];
    p:=0;
    for l=1 upto totalE+1-k:
    if l<>rec:
    p:=p+1;
    ElementI[p]=ElementE[l];
    fi;
    endfor;
    numeric ElementE[];
    for l=1 upto p:
    ElementE[l]=ElementI[l];
    endfor;
    endfor;
    enddef;
    pair A[],B[],O;
    Rayon:=\useKV[ClesRose]{Rayon};
    boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone;
    Aide:=\useKV[ClesRose]{Aide};
    Vide:=\useKV[ClesRose]{Vide};
    Solution:=\useKV[ClesRose]{Solution};
    Produits:=\useKV[ClesRose]{Produits};
    ProduitVide:=\useKV[ClesRose]{ProduitVide};
    CaseVide:=\useKV[ClesRose]{CaseVide};
    if ProduitVide:Solution:=true fi;
    if CaseVide:Solution:=true fi;
    Polygone:=\useKV[ClesRose]{Polygone};
    Petales:=\useKV[ClesRose]{Petales};
    FacteurMin:=\useKV[ClesRose]{FacteurMin};
    FacteurMax:=\useKV[ClesRose]{FacteurMax};
    color Fond;
    Fond:=\useKV[ClesRose]{Couleur};
    O=(0,0);
    ExtraireListe(FacteurMin,FacteurMax,Petales);
    path cc;
    cc=cercles(O,Rayon);
    for k=0 upto Petales:
    A[k]=pointarc(cc,(360/Petales)*k);
    endfor;
    for k=0 upto Petales-1:
    B[k]=iso(A[k],A[k+1]);
    endfor;
    path BoiteRec;
    if Polygone:
    BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u;
    else:
    BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u;
    fi;    
    %On détermine les facteurs et produits
    for k=0 upto Petales-1:
    Facteur[k]:=ElementS[k+1];
    endfor;
    Facteur[Petales]:=Facteur[0];
    for k=0 upto Petales-1:
    Produit[k]:=Facteur[k]*Facteur[k+1];
    endfor;
    %on labelise
    if Vide=false:
    if Produits:
    else:
    for k=0 upto Petales-1:
    label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec));
    endfor;
    fi;
    if Produits or Solution:
    for k=0 upto Petales-1:
    label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k])));
    endfor;
    fi;
    fi;
    % On trace et on affiche...éventuellement :)
    if Aide:
    for k=0 upto Petales-1:
    drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
    fi;
    if ProduitVide:
    choix:=floor(uniformdeviate(Petales-1));
    fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond;
    fi;
    if CaseVide:
    choix:=floor(uniformdeviate(Petales-1));
    for k=0 upto Petales-1:
    if k<>choix:
    fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond;
    fi;
    endfor;
    fi;
    trace A0 for k=1 upto Petales:--A[k] endfor --cycle;
    for k=0 upto Petales-1:
    trace segment(O,B[k]) dashed withdots scaled 0.25;
    draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={Rayon:=\useKV[ClesRose]{Rayon};
    boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone;
    Aide:=\useKV[ClesRose]{Aide};
    Vide:=\useKV[ClesRose]{Vide};
    Solution:=\useKV[ClesRose]{Solution};
    Produits:=\useKV[ClesRose]{Produits};
    ProduitVide:=\useKV[ClesRose]{ProduitVide};
    CaseVide:=\useKV[ClesRose]{CaseVide};
    if ProduitVide:Solution:=true fi;
    if CaseVide:Solution:=true fi;
    Polygone:=\useKV[ClesRose]{Polygone};
    Petales:=\useKV[ClesRose]{Petales};
    FacteurMin:=\useKV[ClesRose]{FacteurMin};
    FacteurMax:=\useKV[ClesRose]{FacteurMax};
    color Fond;
    Fond:=\useKV[ClesRose]{Couleur};}]
    vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)=
    numeric ElementE[],ElementS[];
    %% éléments d'entrée
    nbe=1;
    for k=nbmin upto nbmax:
    ElementE[nbe]=k;
    nbe:=nbe+1;
    endfor;
    totalE=(nbmax-nbmin)+1;
    numeric rec;
    for k=1 upto nbfacteurs:
    rec:=ceiling(uniformdeviate(totalE+1-k));
    ElementS[k]=ElementE[rec];
    numeric ElementI[];
    p:=0;
    for l=1 upto totalE+1-k:
    if l<>rec:
    p:=p+1;
    ElementI[p]=ElementE[l];
    fi;
    endfor;
    numeric ElementE[];
    for l=1 upto p:
    ElementE[l]=ElementI[l];
    endfor;
    endfor;
    enddef;
    pair A[],B[],O;
    O=(0,0);
    ExtraireListe(FacteurMin,FacteurMax,Petales);
    path cc;
    cc=cercles(O,Rayon);
    for k=0 upto Petales:
    A[k]=pointarc(cc,(360/Petales)*k);
    endfor;
    for k=0 upto Petales-1:
    B[k]=iso(A[k],A[k+1]);
    endfor;
    path BoiteRec;
    if Polygone:
    BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u;
    else:
    BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u;
    fi;    
    %On détermine les facteurs et produits
    for k=0 upto Petales-1:
    Facteur[k]=ElementS[k+1];
    endfor;
    Facteur[Petales]=Facteur[0];
    for k=0 upto Petales-1:
    Produit[k]=Facteur[k]*Facteur[k+1];
    endfor;
    %on labelise
    if Vide=false:
    if Produits:
    else:
    for k=0 upto Petales-1:
    label(LATEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec));
    endfor;
    fi;
    if Produits or Solution:
    for k=0 upto Petales-1:
    label(LATEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k])));
    endfor;
    fi;
    fi;
    % On trace et on affiche...éventuellement :)
    if Aide:
    for k=0 upto Petales-1:
    drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
    fi;
    if ProduitVide:
    choix=floor(uniformdeviate(Petales-1));
    fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond;
    fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond;
    fi;
    if CaseVide:
    choix:=floor(uniformdeviate(Petales-1));
    for k=0 upto Petales-1:
    if k<>choix:
    fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond;
    fi;
    endfor;
    fi;
    trace A0 for k=1 upto Petales:--A[k] endfor --cycle;
    for k=0 upto Petales-1:
    trace segment(O,B[k]) dashed withdots scaled 0.25;
    draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5;
    endfor;
  \end{mpost}
  \fi
}%

%%%
% Puissances 4
%%%
\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,Multiplication,Entier,Nombre,Exposant=false}%
\defKV[ClesPQuatre]{Addition=\setKV[ClesPQuatre]{Multiplication=false}}%
\defKV[ClesPQuatre]{Relatif=\setKV[ClesPQuatre]{Entier=false}}%
\defKV[ClesPQuatre]{Puissance=\setKV[ClesPQuatre]{Exposant}}%
\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}}%

\newtoks\toklistePQuatreh%
\newtoks\toklistePQuatrev%
\def\UpdatetoksPQuatreh#1\nil{\addtotok\toklistePQuatreh{"#1",}}%
\def\UpdatetoksPQuatrev#1\nil{\addtotok\toklistePQuatrev{"#1",}}%

\NewDocumentCommand\PQuatre{o +m}{%
  \useKVdefault[ClesPQuatre]%
  \toklistePQuatreh{}%
  \toklistePQuatrev{}%
  \setKV[ClesPQuatre]{#1}%
  \ifboolKV[ClesPQuatre]{Nombre}{%
    \ifboolKV[ClesPQuatre]{Exposant}{%
      \def\PQuatreListe{$10^{-10}$,$10^{-9}$,$10^{-8}$,$10^{-7}$,$10^{-6}$,$10^{-5}$,$10^{-4}$,$10^{-3}$,$10^{-2}$,$10^{2}$,$10^{3}$,$10^{4}$,$10^{5}$,$10^{6}$,$10^{7}$,$10^{8}$,$10^{9}$,$10^{10}$}%
      \MelangeListe{\PQuatreListe}{7}%
      \readlist*\PQuatreListeH{\faa}%
      \MelangeListe{\PQuatreListe}{7}%
      \readlist*\PQuatreListeV{\faa}%
      \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}%
      \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}%
    }{%
      \ifboolKV[ClesPQuatre]{Entier}{%
        % On choisit aléatoirement les listes de nombres de 2 à 10 en faisant deux listes : horizontale et verticale
        \def\PQuatreListe{2,3,4,5,6,7,8,9,10}%
        \MelangeListe{\PQuatreListe}{7}%
        \readlist*\PQuatreListeH{\faa}%
        \MelangeListe{\PQuatreListe}{7}%
        \readlist*\PQuatreListeV{\faa}%
        \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}%
        \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}%
      }{%
        % On choisit aléatoirement les listes de nombres de -10 à -2 union 2 à 10 en faisant deux listes : horizontale et verticale
        \def\PQuatreListe{$-10$,$-9$,$-8$,$-7$,$-6$,$-5$,$-4$,$-3$,$-2$,2,3,4,5,6,7,8,9,10}%
        \MelangeListe{\PQuatreListe}{7}%
        \readlist*\PQuatreListeH{\faa}%
        \MelangeListe{\PQuatreListe}{7}%
        \readlist*\PQuatreListeV{\faa}%
        \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}%
        \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}%
      }%
    }%
  }{%
    % on lit la liste des données fournies par l'utilisateur
    \setsepchar[*]{,*/}%
    \readlist\PQuatreListes{#2}%
    \setsepchar{,}%
    \foreachitem\compteur\in\PQuatreListes[1]{\expandafter\UpdatetoksPQuatrev\compteur\nil}%
    \foreachitem\compteur\in\PQuatreListes[2]{\expandafter\UpdatetoksPQuatreh\compteur\nil}%
  }%
  % Une fois les listes construites, on dessine et on place les listes.
  \PQuatreGrille{\the\toklistePQuatrev}{\the\toklistePQuatreh}%
}%

\NewDocumentCommand\PQuatreGrille{m m}{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}
    Largeur=\useKV[ClesPQuatre]{Largeur};
    color fond;
    fond=\useKV[ClesPQuatre]{Couleur};
    boolean Multiplication,Addition;
    Multiplication=\useKV[ClesPQuatre]{Multiplication};
    pair A,B,C,D,H[],V[],M[][];
    A=(0,0);
    B-A=Largeur*(7,0);
    C=rotation(A,B,-90);
    D-C=A-B;
    fill polygone(A,B,C,D) withcolor fond;
    trace polygone(A,B,C,D);
    for k=0 upto 6:
    for l=0 upto 6:
    M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur);
    fill cercles(M[k][l],0.4*Largeur) withcolor blanc;
    trace cercles(M[k][l],0.4*Largeur);
    endfor;
    endfor;
    labeloffset:=labeloffset*2;
    if Multiplication:
    label.llft(btex $\times$ etex scaled 2,A);
    else:
    label.llft(btex $+$ etex scaled 2,A);
    fi;
    labeloffset:=labeloffset/2;
    vardef Vertical(text t)=
    n:=0;
    for p_=t:
%    if n<7:
    label.lft(TEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2));
    n:=n+1;
%    fi;
    endfor;
    enddef;
    vardef Horizontal(text t)=
    n:=0;
    for p_=t:
%    if n<7:
    label.bot(TEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0));
    n:=n+1;
%    fi;
    endfor;
    enddef;
    labeloffset:=labeloffset*4;
    Vertical(#1);
    Horizontal(#2);
  \end{mplibcode}
  \else%
  \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Multiplication;Multiplication=\useKV[ClesPQuatre]{Multiplication};}]
    pair A,B,C,D,H[],V[],M[][];
    A=(0,0);
    B-A=Largeur*(7,0);
    C=rotation(A,B,-90);
    D-C=A-B;
    fill polygone(A,B,C,D) withcolor fond;
    for k=0 upto 7:
    for l=0 upto 7:
    M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur);
    fill cercles(M[k][l],0.4*Largeur) withcolor blanc;
    endfor;
    endfor;
    labeloffset:=labeloffset*2;
    if Multiplication:
    label.llft(btex $\times$ etex scaled 2,A);
    else:
    label.llft(btex $+$ etex scaled 2,A);
    fi;
    labeloffset:=labeloffset/2;
    vardef Vertical(text t)=
    n:=0;
    for p_=t:
    if n<7:
    label.lft(LATEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2));
    n:=n+1;
    fi;
    endfor;
    enddef;
    vardef Horizontal(text t)=
    n:=0;
    for p_=t:
    if n<7:
    label.bot(LATEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0));
    n:=n+1;
    fi;
    endfor;
    enddef;
    labeloffset:=labeloffset*4;
    Vertical(#1);
    Horizontal(#2);
  \end{mpost}
  \fi%
}%

%%%
% Billard
%%%
\setKVdefault[ClesBillard]{Longueur=8cm,Largeur=5cm,Solution=false,Angle=70,Depart=0.5,Vrai=false}

\NewDocumentCommand\Billard{o m}{%
  \useKVdefault[ClesBillard]%
  \setKV[ClesBillard]{#1}%
  \ifboolKV[ClesBillard]{Solution}{%
    \MPBillardSolution{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}%
    }{%
      \MPBillard{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}%
    }%
}%

\def\MPBillard#1#2#3{%
  \mplibcodeinherit{disable}%
  \begin{Geometrie}[CoinHD={(\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm)}]
    boolean Vrai;
    Vrai:=\useKV[ClesBillard]{Vrai};
    % On définit la liste des 25 lettres alphabétiques dans laquelle on choisit autant de lettres que la longueur du mot
    % On a retiré la lettre Q pour des questions d'alignements esthétiques.
    vardef ChoixLettre=
    save Lettre,choixalea;
    string Lettre;
    choixalea=floor(uniformdeviate(26)+1);
    if choixalea=1:
    Lettre="A";
    elseif choixalea=2:
    Lettre="B";
    elseif choixalea=3:
    Lettre="C";
    elseif choixalea=4:
    Lettre="D";
    elseif choixalea=5:
    Lettre="E";
    elseif choixalea=6:
    Lettre="F";
    elseif choixalea=7:
    Lettre="G";
    elseif choixalea=8:
    Lettre="H";
    elseif choixalea=9:
    Lettre="I";
    elseif choixalea=10:
    Lettre="J";
    elseif choixalea=11:
    Lettre="K";
    elseif choixalea=12:
    Lettre="L";
    elseif choixalea=13:
    Lettre="M";
    elseif choixalea=14:
    Lettre="N";
    elseif choixalea=15:
    Lettre="O";
    elseif choixalea=16:
    Lettre="P";
    elseif choixalea=17:
    Lettre="O";
    elseif choixalea=18:
    Lettre="R";
    elseif choixalea=19:
    Lettre="S";
    elseif choixalea=20:
    Lettre="T";
    elseif choixalea=21:
    Lettre="U";
    elseif choixalea=22:
    Lettre="V";
    elseif choixalea=23:
    Lettre="W";
    elseif choixalea=24:
    Lettre="X";
    elseif choixalea=25:
    Lettre="Y";
    elseif choixalea=26:
    Lettre="Z";
    fi;
    Lettre
    enddef;
    % On crée un Quick Sort
    def QS(expr ndeb,nfin)=
    begingroup
    save v,m,x;
    if ndeb<nfin:
      v:=l[cpt[ndeb]];
      m:=ndeb;
      for i=(ndeb+1) upto nfin:
	if l[cpt[i]]<v:
	  m:=m+1;
	  x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
	fi
      endfor;
      x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
      QS(ndeb,m-1);
      QS(m+1,nfin);
    fi
    endgroup
    enddef;
    % On définit le rectangle
    pair M[],Co,Intermed;
    M1=u*(1,2);
    M2-M1=(\useKV[ClesBillard]{Longueur},0);
    M3-M2=(0,\useKV[ClesBillard]{Largeur});
    M4-M3=M1-M2;
    Co=iso(M1,M3);
    path rec,cote[];
    rec=polygone(M1,M2,M3,M4);
    cote1=segment(M1,M2);
    cote2=segment(M2,M3);
    cote3=segment(M3,M4);
    cote4=segment(M4,M1);
    trace rec;
    pair Pt[],FauxPt[];
    nbfaux=0;
    l1=#2;
    Pt[1]=point(l1) of rec;
    angleref=#3;
    if l1>3:
    angledepart=90+angleref;
    Pt[2]=demidroite(Pt[1],rotation(M1,Pt1,angledepart)) intersectionpoint (subpath(0,3) of rec);
    dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]);
    elseif l1>2:
    angledepart=180+angleref;
    Pt[2]=demidroite(Pt[1],rotation(M4,Pt1,angledepart)) intersectionpoint ((subpath(3,4) of rec)--(subpath(0,2) of rec));
    dotlabel.top(TEX(substring(0,1) of #1),Pt[1]);
    elseif l1>1:
    angledepart=angleref-90;
    Pt[2]=demidroite(Pt[1],rotation(M3,Pt1,angledepart)) intersectionpoint ((subpath(2,4) of rec)--(subpath(0,1) of rec));
    dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]);
    else:
    angledepart=angleref;
    Pt[2]=demidroite(Pt[1],rotation(M2,Pt1,angledepart)) intersectionpoint (subpath(1,4) of rec);
    dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]);
    fi;
    tourne=90;
    numeric Blong;
    BLong:=length #1;
    % Détermination des points.
    if Vrai:
    for k=3 upto BLong:
    Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M2-M3);
    if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1):
    Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
    else:
    Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M1-M2);
    Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
    fi;
    endfor;
    else:
    for k=3 upto BLong:
    Intermed:=rotation(Pt[k-2],Pt[k-1],tourne);
    if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1):
    Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
    else:
    Intermed:=rotation(Pt[k-2],Pt[k-1],-tourne);
    Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec;
    fi;
    endfor;
    fi;
    % Ajout des faux points
    path SPath[];
    cpt[1]:=1;
    cpt[BLong+1]:=BLong+1;
    l[BLong+1]:=4;
    for k=2 upto BLong:
    SPath[k]=rec cutafter demidroite(Co,Pt[k]);
    l[k]=arclength SPath[k];
    l[k]:=arctime l[k] of rec;
    cpt[k]:=k;
    endfor;
    QS(1,BLong+1);
    for k=2 upto BLong+1:
    if l[cpt[k]]-l[cpt[k-1]]>0.3:
    nbfaux:=nbfaux+1;
    FauxPt[nbfaux]=point(l[cpt[k-1]]+0.1) of rec;
    nbfaux:=nbfaux+1;
    FauxPt[nbfaux]=point(l[cpt[k]]-0.1) of rec;
    fi;
    endfor;
    drawoptions();
    % Tracés
    drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25;
    % Labelisation
    for k=2 upto BLong:
    if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1):
    dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1):
    dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1):
    dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1):
    dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]);
    fi;
    endfor;
    for k=1 upto nbfaux:
    if (demidroite(Co,FauxPt[k]) intersectiontimes cote[1])<>(-1,-1):
    dotlabel.bot(TEX(ChoixLettre),FauxPt[k]);
    elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[2])<>(-1,-1):
    dotlabel.rt(TEX(ChoixLettre),FauxPt[k]);
    elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[3])<>(-1,-1):
    dotlabel.top(TEX(ChoixLettre),FauxPt[k]);
    elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[4])<>(-1,-1):
    dotlabel.lft(TEX(ChoixLettre),FauxPt[k]);
    fi;
    endfor;
    picture Reponse;
    Reponse=image(
    trace segment((0,0),(7*BLong*mm-2mm,0)) dashed dashpattern(on5mm off2mm);
    );
    trace Reponse shifted((xpart(Co),5mm)-center Reponse);    
  \end{Geometrie}%
}%

\def\MPBillardSolution#1#2#3{%
  \mplibcodeinherit{enable}%
  \begin{mplibcode}%
    Figure(0,0,\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm);
    trace rec;
    % Tracés
    drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25;
    for k=1 upto BLong-1:
    trace segment(Pt[k],Pt[k+1]);
    endfor;
    if Vrai=false:
    for k=2 upto BLong-1:
    trace codeperp(Pt[k-1],Pt[k],Pt[k+1],5);
    endfor;
    fi;
    % Labelisation
    if l1>3:
    dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]);
    elseif l1>2:
    dotlabel.top(TEX(substring(0,1) of #1),Pt[1]);
    elseif l1>1:
    dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]);
    else:
    dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]);
    fi;
    for k=2 upto BLong:
    if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1):
    dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1):
    dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1):
    dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]);
    elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1):
    dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]);
    fi;
    endfor;
    trace Reponse shifted((xpart(Co),5mm)-center Reponse);
    % On affiche les lettres de la réponse.
    for k=1 upto BLong:
    label.top(TEX(substring(k-1,k) of #1),((xpart(Co),5mm)-center Reponse)+(k-1)*(7mm,0)+(2.5mm,0));
    endfor;
  \end{mplibcode}%
  \mplibcodeinherit{disable}%
}%

%%%
% Représenter un entier
%%%
\setKVdefault[ClesREntier]{Echelle=1,Unite=false,Compact=false,Impression=false,ListeCouleurs={Tomato,LightSteelBlue,LightGreen,Cornsilk}}%

\newcommand\RepresenterEntier[2][]{%
  \useKVdefault[ClesREntier]%
  \setKV[ClesREntier]{#1}%
  \ifboolKV[ClesREntier]{Unite}{%
    \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)}]
      Echelle=\useKV[ClesREntier]{Echelle};
      Initialisation(5,30,15,50*Echelle);
      color A,B,C,D,E,F,G,H;
      pointilles:="non";
      trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1);
    \end{Geometrie}
  }{%
    % On décompose le nombre
    \StrLen{#2}[\LongueurNombreEntier]%
    \xdef\FooListeEntier{}
    \xintFor* ##1 in{\xintSeq{1}{\LongueurNombreEntier}}\do{%
      \StrChar{#2}{##1}[\ChiffreAAjouter]
      \xdef\FooListeEntier{\FooListeEntier \ChiffreAAjouter,}
    }
    \setsepchar{,}\ignoreemptyitems
    \readlist*\ListeDesChiffres{\FooListeEntier}%
    \xdef\ListeAvantCouleurs{\useKV[ClesREntier]{ListeCouleurs}}%
    \readlist*\ListeCouleurEntier{\ListeAvantCouleurs}%
    \xintifboolexpr{\LongueurNombreEntier==4}{%
      \xdef\NombreMilliers{\ListeDesChiffres[1]}%
      \xdef\NombreCentaines{\ListeDesChiffres[2]}%
      \xdef\NombreDizaines{\ListeDesChiffres[3]}%
      \xdef\NombreUnites{\ListeDesChiffres[4]}%
    }{%
      \xintifboolexpr{\LongueurNombreEntier==3}{%
        \xdef\NombreMilliers{0}%
        \xdef\NombreCentaines{\ListeDesChiffres[1]}%
        \xdef\NombreDizaines{\ListeDesChiffres[2]}%
        \xdef\NombreUnites{\ListeDesChiffres[3]}%
      }{%
        \xintifboolexpr{\LongueurNombreEntier==2}{%
          \xdef\NombreMilliers{0}%
          \xdef\NombreCentaines{0}%
          \xdef\NombreDizaines{\ListeDesChiffres[1]}%
          \xdef\NombreUnites{\ListeDesChiffres[2]}%
        }{%
          \xdef\NombreMilliers{0}%
          \xdef\NombreCentaines{0}%
          \xdef\NombreDizaines{0}%
          \xdef\NombreUnites{\ListeDesChiffres[1]}%
        }%
      }%
    }%
    \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)},CoinHD={u*(20,20)}]
      Echelle=\useKV[ClesREntier]{Echelle};
      NM=\NombreMilliers;
      NC=\NombreCentaines;
      ND=\NombreDizaines;
      NU=\NombreUnites;
      color ColorEntier[];
      ColorEntier1=\ListeCouleurEntier[1];
      ColorEntier2=\ListeCouleurEntier[2];
      ColorEntier3=\ListeCouleurEntier[3];
      ColorEntier4=\ListeCouleurEntier[4];
      boolean Compact,Print;
      Compact=\useKV[ClesREntier]{Compact};
      Print=\useKV[ClesREntier]{Impression};
      Initialisation(5,30,15,50*Echelle);
      color A,B,C,D,E,F,G,H;
      picture TypePave[];
      TypePave0=image(
      trace Pave(A,B,C,D,E,F,G,H)(1,1,1);
      currentpicture:=nullpicture;
      remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier1 fi;
      for k=0 upto 10:
      trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]);
      endfor;
      for k=0 upto 10:
      trace chemin((k/10)[B,C],(k/10)[G,H],(k/10)[F,E]);
      endfor;
      for k=0 upto 10:
      trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]);
      endfor;
      );
      color A,B,C,D,E,F,G,H;
      TypePave1=image(
      trace Pave(A,B,C,D,E,F,G,H)(0.1,1,1);
      currentpicture:=nullpicture;
      remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier2 fi;
      trace chemin(C,H,E);
      for k=0 upto 10:
      trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]);
      endfor;
      for k=0 upto 10:
      trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]);
      endfor;
      );
      color A,B,C,D,E,F,G,H;
      TypePave2=image(
      trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,1);
      currentpicture:=nullpicture;
      remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier3 fi;
      trace chemin(C,H,E);
      trace chemin(A,F,E);
      trace chemin(B,G,F);
      for k=0 upto 10:
      trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]);
      endfor;
      );
      color A,B,C,D,E,F,G,H;
      TypePave3=image(
      trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1);
      currentpicture:=nullpicture;
      remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier4 fi;
      trace chemin(C,H,E);
      trace chemin(A,F,E);
      trace chemin(A,B,C);
      trace chemin(F,G,H);
      trace chemin(B,G);
      );
      if Compact:
      for k=0 upto (\NombreMilliers-1):
      trace TypePave0 shifted ((Projette((k,0,0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreCentaines-1):
      trace TypePave1 shifted ((Projette((0.1*k,1.5,0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreDizaines-1):
      trace TypePave2 shifted ((Projette((0.1*k,3,0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreUnites-1):
      trace TypePave3 shifted ((Projette((0,3.6,0.1*k))-Projette((0,0,0))));
      endfor;
      else:
      for k=0 upto (\NombreMilliers-1):
      trace TypePave0 shifted ((Projette((0,1.1*(k-1),0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreCentaines-1):
      trace TypePave1 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(k-1),0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreDizaines-1):
      trace TypePave2 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(k-1),0))-Projette((0,0,0))));
      endfor;
      for k=0 upto (\NombreUnites-1):
      trace TypePave3 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(\NombreDizaines-1),0.2*(k)))-Projette((0,0,0))));
      endfor;
      fi;
    \end{Geometrie}
  }
}

% Gestion de l'aléatoire (pour la CAN)
\newcommand\ChoixAlea[4][]{%
  \ifx\bla#1\bla%
  \xdef#4{\fpeval{randint(#2,#3)}}%
  \else%
  \xdef#4{\fpeval{round(randint(#2,#3)+rand(),#1)}}%
  \fi%
}%

\def\VariableAlea#1#2{%
  \xdef#1{\fpeval{#2}}%
}%

% On bloque la graine de fabrication des nombres aléatoires.
\ExplSyntaxOn
\cs_new_eq:NN \PfCGraineAlea \sys_gset_rand_seed:n
\ExplSyntaxOff

%%%
% Course aux nombres
%%%
\RequirePackage{longtable}
% https://tex.stackexchange.com/questions/642775/when-displaying-a-datatool-database-with-dtldisplaylongdb-how-to-obtain-a-hor
% Patch éventuel à ajouter
%\makeatletter
%\expandafter\patchcmd\expandafter{\csname\string\DTLdisplaylongdb\endcsname}%
%         {\@dtl@resetdoamp\dtldisplaystarttab}%
%         {\dtldisplaystarttab\@dtl@resetdoamp}%
%         {\message{Patching succeeded.}}%
%         {\message{Patching failed.}}%
%\makeatother

\setKVdefault[ClesMathAlea]{NbQ=5,ChoixTables=2-9,ValeurMax=20,Classique,Trou=false,Melange=false,Multiple=2,Theme=false}%
\defKV[ClesMathAlea]{Trous=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Trou}}%
\defKV[ClesMathAlea]{Melanges=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Melange}}%

\newcommand\MathAlea[2][]{%
  \useKVdefault[ClesMathAlea]%
  \setKV[ClesMathAlea]{#1}%
  \input{#2}%
}%

\newcommand\CourseNombreTotalQuestions[1]{%
  \setKV[ClesCN]{TotalQ=#1}%
  \xdef\CNfoo{}%
  \xintFor* ##1 in{\xintSeq{1}{#1}}\do{%
    \xdef\CNfoo{\CNfoo ##1,}%
  }%
}%

\setKVdefault[ClesCN]{%
  Stretch=2.5,%Elasticité du tableau
  NbQ=5,%Nb de questions à poser
  RAZ=false,%Pour remettre à zéro le compteur des questions
  Ordre=false,%Pour mettre toutes les questions dans l'ordre des numéros
  Exercice=false,%Pour utiliser l'aléatoire des questions mais sans habillage particulier, autre que des \item
  Perso=false,%Pour utiliser un choix personnel des questions
  Lecture=false,%Pour différencier avec une lecture automatisée sur les numéros de fichiers
  Maitre=false,%Pour indiquer qu'on prend en compte ou pas les sous-dossiers
  Nom=false,%Pour afficher le nom des fichiers utilisés.
  Theme=false,%Pour afficher le theme travaillé dans les fichiers utilisés (à retravailler).
  AMC=false,%
  Multi=false,%
  CAN=false,%Pour compléter la case réponse.
  CoefQ=0.4,%Coefficient multiplication de \linewidth pour la colonne question
  CoefR=0.35,%Coefficient multiplication de \linewidth pour la colonne réponse
  CoefJ=0.15,%Coefficient multiplication de \linewidth pour la colonne jury
}%
\defKV[ClesCN]{Liste=\setKV[ClesCN]{Perso=true}\setKV[ClesCN]{Lecture}}%
\defKV[ClesCN]{Dossier=\setKV[ClesCN]{Lecture}}%
\defKV[ClesCN]{Debut=\setKV[ClesCN]{RAZ}}%
\setsepchar[*]{,*/}%
\readlist*\ListeMotsCAN{La moitié de /2,Le double de /1,Le triple de /1, Le tiers de /3,Le nombre dix fois plus grand que /1,Le nombre cent fois plus grand que /1,Le nombre mille fois plus grand que /1,Le nombre dix fois plus petit que /10,Le nombre cent fois plus petit que /100,Le nombre mille fois plus petit que /1000}%
\readlist*\ListeMulAstucieuxCAN{50/2,25/4,20/5}%
\readlist*\ListeLieuxObjetsCAN{boulangerie/pains au chocolat/un pain au chocolat,boulangerie/cookies/un cookie,boulangerie/brioches/une brioche,piscine/entrées/une entrée,boucherie/saucisses/une saucisse,boucherie/cuisses de poulet/une cuisse de poulet}%
\readlist*\ListeNomsCAN{Aude/Elle/d'Aude,Bernard/Il/de Bernard,Céline/Elle/de Céline,Daniel/Il/de Daniel,\'Elise/Elle/d'\'Elise,Fabien/Il/de Fabien,Gérard/Il/de Gérard,Hélène/Elle/d'Hélène,Ilies/Il/d'Ilies,Jasmine/Elle/de Jasmine,Kylian/Il/de Kylian,Laurent/Il/de Laurent,Mathilde/Elle/de Mathilde,Nina/Elle/de Nina,Octave/Il/d'Octave,Philippe/Il/de Philippe,Joachim/Il/de Joachim,Thérèse/Elle/de Thérèse,Nawel/Elle/de Nawel,Alexandre/Il/d'Alexandre,Maxence/Il/de Maxence,Sophie/Elle/de Sophie,Christophe/Il/de Christophe,Myriam/Elle/de Myriam,Nathalie/Elle/de Nathalie}%
\readlist*\ListeComposantStatCAN{voitures/un garage/Cross-over/Utilitaires/Berlines,fruits/une corbeille/Pommes/Oranges/Bananes,vêtements/une armoire/Pulls/T-shirts/Chemises,couverts/un tiroir/Fourchettes/Couteaux/Cuillères}%
\readlist*\ListeObjetsSymbolesCAN{fleurs/96,ciseaux/36,crayons/47,enveloppes/41}%uniquement avec pifont
\setsepchar{,}%
\readlist*\ListeObjetsCAN{bonbons,billes,jouets,fruits,biscuits,gâteaux,pommes,poires,pains au chocolat,cookies,croissants,muffins,brioches,saucisses,cuisses de poulet}%
\readlist*\ListePetitsObjetsCAN{bonbons,billes,biscuits,gommes,clous,vis}
\readlist*\ListeFruitsCAN{pommes,poires,abricots,cerises,fraises,framboises,noix,pêches,nectarines,myrtilles}
\readlist*\ListeSommetsCAN{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}

\newcommand\ExtraitPetitsObjets[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListePetitsObjetsCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListePetitsObjetsCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \readlist*\PetitsObjetsMelanges{\faa}%
}%

\newcommand\ExtraitObjets[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeObjetsCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeObjetsCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \readlist*\ObjetsMelanges{\faa}%
}%

\newcommand\ExtraitSymboles[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeObjetsSymbolesCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeObjetsSymbolesCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\SymbolesMelanges{\faa}%
  \setsepchar{,}%
}%

\newcommand\ExtraitSommet[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeSommetsCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeSommetsCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \readlist*\SommetsMelanges{\faa}%
}%

\newcommand\ExtraitFruit[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeFruitsCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeFruitsCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \readlist*\FruitsMelanges{\faa}%
}%

\newcommand\ExtraitNom[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeNomsCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeNomsCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\NomsMelanges{\faa}%
  \setsepchar{,}%
}%

\newcommand\ExtraitElements[1]{%
  \xdef\CANSGFoo{}%
  \foreachitem\compteur\in\ListeComposantStatCAN{%
    \xdef\CANSGFoo{\CANSGFoo \ListeComposantStatCAN[\compteurcnt],}%
  }%
  \MelangeListe{\CANSGFoo}{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\ElementsMelanges{\faa}%
  \setsepchar{,}%
}%

\newcounter{CNNumQ}%
\setcounter{CNNumQ}{1}%

\newcommand\CANNew{%
  \textcolor{Crimson}{\faCopy}%
}%

\newread\RecupNbFichiers
\newread\RecupSSDossiers
\newread\zzz
\def\zzpar{\par}%

\makeatletter
\def\app@exe{\write18}
% Recuperer les sous-dossiers
\def\RecupererSousDossiers#1{%#1 est le dossier contenant les fichiers can classés en sous-dossier
  \app@exe{rm -f RecapSSDossier.tmp ; ls -1 -I "*.tex" #1 > RecapSSDossier.tmp}%
  \immediate\openin\zzz=RecapSSDossier.tmp
  \loop%
  \read\zzz to \tmp%
  \ifx\tmp\zzpar\else%
  \xdef\CNFOOSSDossiers{\CNFOOSSDossiers \expandafter\detokenize\expandafter{\tmp},}%
  \fi%
  \ifeof\zzz\else%
  \repeat%
  \setsepchar{,}\ignoreemptyitems
  \readlist*\ListeSSDossiers{\CNFOOSSDossiers}
}

\def\RecupererFichierTeXSSDossier#1#2{%
  \openin\zzz="|ls #1/#2/*.tex"%
  \loop%
  \read\zzz to \tmp%
  \ifx\tmp\zzpar\else%
  \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}%
  \fi%
  \ifeof\zzz\else%
  \repeat%
}

\def\RecupererFichierTeXDossier#1{%
  \xdef\CNFOO{}%
  \openin\zzz="|ls #1/*.tex"
  \loop%
  \read\zzz to \tmp%
  \ifx\tmp\zzpar\else%
  \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}%
  \fi%
  \ifeof\zzz\else%
  \repeat%
}

\def\DefinirListeFichiers{%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\ListeFichiers{\CNFOO}%
}

\def\RecupererFichierTeXAllSSDossier#1{%
  \RecupererSousDossiers{#1}%
  \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}%
  \DefinirListeFichiers%
}

\def\RecupererFichierTeXAllDossier#1{%
  \RecupererFichierTeXDossier{#1}%
  \DefinirListeFichiers%
}

\def\RecupererFichierTeXComplet#1{%
  \RecupererFichierTeXDossier{#1}%
  \RecupererSousDossiers{#1}%
  \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}%
  \DefinirListeFichiers%
}

\def\RecupererFichierTeXSSDossierPerso#1{%
  \openin\zzz="|ls #1/*.tex"
  \loop%
  \read\zzz to \tmp%
  \ifx\tmp\zzpar\else%
  \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}%
  \fi%
  \ifeof\zzz\else%
  \repeat%
}

\makeatother

\newcommand\CNTheme[1]{}%
\newcommand\CNReponse{}%

\newlength{\PfCLargeurQuestion}%
\newlength{\PfCLargeurReponse}%
\newlength{\PfCLargeurJury}%

\NewDocumentCommand\CourseNombre{o m}{%
  \useKVdefault[ClesCN]%
  \setKV[ClesCN]{#1}%
  \ifboolKV[ClesCN]{Theme}{\renewcommand\CNTheme[1]{{\ttfamily Thème : ##1}\par}}{}%
  \ifboolKV[ClesCN]{RAZ}{%
    \setcounter{CNNumQ}{\useKV[ClesCN]{Debut}}%
  }{}%
  \setKV[ClesMathAlea]{NbQ=1}%
  \xdef\CNFOOSSDossiers{}%
  \xdef\CNFOO{}%
  \ifboolKV[ClesCN]{Lecture}{%
    \ifboolKV[ClesCN]{Perso}{%
      %      % Ici \useKV[ClesCN]{Liste}
      \xdef\CNFOOListePerso{\useKV[ClesCN]{Liste}}%
      %      % OK -> Là, normalement, c'est la liste des dossiers choisis par l'utilisateur : \CNFOOListePerso
      \setsepchar{,}%
      \readlist*\ListeDesSSDossiersPerso{\CNFOOListePerso}%
      %      % \par OK -> Là, normalement, c'est la liste des dossiers perso sous forme de liste : \showitems\ListeDesSSDossiersPerso[]%
      \foreachitem\compteur\in\ListeDesSSDossiersPerso{\RecupererFichierTeXSSDossierPerso{\ListeDesSSDossiersPerso[\compteurcnt]}}%
      \DefinirListeFichiers%
      %      % \par OK -> Là, enfin, normalement, c'est la liste des fichiers contenus dans les dossiers perso :
      %      % \showitems\ListeFichiers[]
    }{%
      \ifboolKV[ClesCN]{Maitre}{%
        %        % On récupère tous les fichiers can dans les sous-dossiers
        %        % et on construit une liste \ListeFichiers contenant les chemins des fichiers considérés.
        \RecupererFichierTeXComplet{\useKV[ClesCN]{Dossier}}%
      }{%
        %        % Là
        %        % On récupère seulement les fichiers can de ce dossier
        %        % et on consruit une liste \ListeFichiers contenant les chemins des fichiers considérés.
        \RecupererFichierTeXAllDossier{\useKV[ClesCN]{Dossier}}%
      }%
    }%
    %    % On crée la liste du nombre total de questions
    \xdef\CNfooListe{}%
    \xintFor* ##1 in{\xintSeq{1}{\ListeFichierslen}}\do{%
      \xdef\CNfooListe{\CNfooListe ##1,}%
    }%
    %    % \par OK -> normalement, on a la liste du nombre de questions : \CNfooListe
    % On règle maintenant les dimensions nécessaires.
    % \ifboolKV[ClesCN]{CAN}{
    \setlength{\PfCLargeurQuestion}{\useKV[ClesCN]{CoefQ}\linewidth}\setlength{\PfCLargeurReponse}{\useKV[ClesCN]{CoefR}\linewidth}\setlength{\PfCLargeurJury}{\useKV[ClesCN]{CoefJ}\linewidth}%
    %    % On affiche les questions :
    \ifboolKV[ClesCN]{Ordre}{%
      %        % soit dans un exercice
      \ifboolKV[ClesCN]{Exercice}{%
        %          % Attention le style de l'environnement est à choisir par l'utilisateur
        \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{%
        \item\input{\ListeFichiers[##1]}%
        }%
      }{% Soit toutes les questions au format course
        \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}%
        \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}%
          \hhline{~---}%
          \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\%
          \hline%
          \endhead%
          \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{%
            \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\input{\ListeFichiers[##1]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&\ifboolKV[ClesCN]{CAN}{\CNReponse}{}&\\%
            \hline%
          }%
        \end{longtable}%
        \renewcommand{\arraystretch}{1}%
      }%
    }{%
      % On prévient l'utilisateur si le nb de questions est inférieur à NbQ
      \xintifboolexpr{\ListeFichierslen<\useKV[ClesCN]{NbQ}}{%
        \faExclamationCircle~Le nombre maximal de questions disponibles est inférieur au nombre de questions à afficher. Modifier la clé {\ttfamily NbQ} ou ajouter des questions dans le(s) répertoire(s).%
      }{%%On choisit NbQ questions parmi la liste de fichiers
        \MelangeListe{\CNfooListe}{\useKV[ClesCN]{NbQ}}%
        \setsepchar{,}\ignoreemptyitems%
        \readlist*\ListeCNQuestions{\faa}
        \ifboolKV[ClesCN]{Exercice}{%
          \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{%
          \item\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}%
          }%
        }{% On les affiche
          \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}%
          \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}%
            \hhline{~---}%
            \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\%
            \hline%
            \endhead%
            \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{%
              \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&\ifboolKV[ClesCN]{CAN}{\CNReponse}{}&\\
              \hline
            }%
          \end{longtable}%
          \renewcommand{\arraystretch}{1}%
        }%
      }%
    }%
  }{%
    \input{#2}
  }%
}%
% fin course aux nombres

%%%
% Frise temporelle
%%%
\setKVdefault[ClesFrise]{Longueur=8cm,Fleches=false,Ecart=5mm,Sup=false}%

\newtoks\toklistefrise%
\def\UpdatetoksFrise#1/#2/#3\nil{\addtotok\toklistefrise{"#1","#2","#3",}}%

\newcommand\Frise[2][]{%
  \useKVdefault[ClesFrise]%
  \setKV[ClesFrise]{#1}%
  \setsepchar[*]{,*/}\ignoreemptyitems%
  \readlist*\ListeTempo{#2}%
  \toklistefrise{}%
  \foreachitem\compteur\in\ListeTempo{\expandafter\UpdatetoksFrise\compteur\nil}
  \MPDessineFrise{\the\toklistefrise}%
}

\newcommand\MPDessineFrise[1]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    Longueur:=\useKV[ClesFrise]{Longueur};
    Ecart:=\useKV[ClesFrise]{Ecart};
    boolean Fleches;
    Fleches=\useKV[ClesFrise]{Fleches};
    boolean Sup;
    Sup=\useKV[ClesFrise]{Sup};
    pair A[],B;
    A0=(0,0);
    B-A0=(Longueur,0);
    n=0;
    for p_=#1:
    n:=n+1;
    endfor;
    for k=1 upto ((n div 3)-2):
    A[k]=(k/((n div 3)-1))[A0,B];
    endfor;
    A[(n div 3)-1]=B;
    if Sup:
      for k=0 upto ((n div 3)-1):
      trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k];
      endfor;
      % on définit les points milieu des fleches
      path Fleche[];
      pair C[];
      for k=0 upto ((n div 3)-3):
      Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart));
      C[k]=point (0.5*length Fleche[k]) of Fleche[k];
      endfor;
      Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart));
      chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart));
      C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2];
      Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart));
      C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1];
      % 
      maxx:=n;
      trace segment(A0,A[(n div 3)-2]);
      trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly;
      n:=0;
      labeloffset:=labeloffset*2;
      for p_=#1:
      n:=n+1;
      if n<maxx+1:
      if (n mod 3)=1:
      label.top(TEX(""&p_&""),A[n div 3]);
      elseif (n mod 3)=2:
      label.top(TEX(""&p_&""),C[n div 3]);%
      elseif (n mod 3)=0:
      label.bot(TEX(""&p_&""),C[(n div 3)-1]);
      fi;
      fi;
      endfor;
      drawoptions();
      labeloffset:=labeloffset/2;
      if Fleches:
      for k=0 upto ((n div 3)-4):
      drawarrow Fleche[k];
      endfor;
      drawarrow Fleche[(n div 3)-1];
      drawarrow Fleche[(n div 3)-2];
      drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart));
      for k=0 upto ((n div 3)-2):
      draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly;
      endfor;
      draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly;
      fi;
    %fin Sup
    else:
      for k=0 upto ((n div 3)-1):
      trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k];
      endfor;
      % on définit les points milieu des fleches
      path Fleche[];
      pair C[];
      for k=0 upto ((n div 3)-2):
      Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart));
      C[k]=point (0.5*length Fleche[k]) of Fleche[k];
      endfor;
      maxx:=n;
      trace segment(A0,A[(n div 3)-1]);
      n:=0;
      labeloffset:=labeloffset*2;
      for p_=#1:
      n:=n+1;
      if n<maxx:
      if (n mod 3)=1:
      label.top(TEX(""&p_&""),A[n div 3]);
      elseif (n mod 3)=2:
      if (n div 3)<((maxx div 3)-1):label.top(TEX(""&p_&""),C[n div 3]);fi;
      elseif (n mod 3)=0:
      label.bot(TEX(""&p_&""),C[(n div 3)-1]);
      fi;
      fi;
      endfor;
      labeloffset:=labeloffset/2;
      if Fleches:
      for k=0 upto ((n div 3)-2):
      draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly;
      drawarrow Fleche[k];
      endfor;
      draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly;
      fi;
    fi;
  \end{mplibcode}
  \else
    \begin{mpost}[mpsettings={%
    Longueur:=\useKV[ClesFrise]{Longueur};
    Ecart:=\useKV[ClesFrise]{Ecart};
    boolean Fleches;
    Fleches=\useKV[ClesFrise]{Fleches};
    boolean Sup;
    Sup=\useKV[ClesFrise]{Sup};
    }]
    pair A[],B;
    A0=(0,0);
    B-A0=(Longueur,0);
    n=0;
    for p_=#1:
    n:=n+1;
    endfor;
    for k=1 upto ((n div 3)-2):
    A[k]=(k/((n div 3)-1))[A0,B];
    endfor;
    A[(n div 3)-1]=B;
    if Sup:
      for k=0 upto ((n div 3)-1):
      trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k];
      endfor;
      % on définit les points milieu des fleches
      path Fleche[];
      pair C[];
      for k=0 upto ((n div 3)-3):
      Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart));
      C[k]=point (0.5*length Fleche[k]) of Fleche[k];
      endfor;
      Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart));
      chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart));
      C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2];
      Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart));
      C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1];
      % 
      maxx:=n;
      trace segment(A0,A[(n div 3)-2]);
      trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly;
      n:=0;
      labeloffset:=labeloffset*2;
      for p_=#1:
      n:=n+1;
      if n<maxx+1:
      if (n mod 3)=1:
      label.top(LATEX(""&p_&""),A[n div 3]);
      elseif (n mod 3)=2:
      label.top(LATEX(""&p_&""),C[n div 3]);%
      elseif (n mod 3)=0:
      label.bot(LATEX(""&p_&""),C[(n div 3)-1]);
      fi;
      fi;
      endfor;
      drawoptions();
      labeloffset:=labeloffset/2;
      if Fleches:
      for k=0 upto ((n div 3)-4):
      drawarrow Fleche[k];
      endfor;
      drawarrow Fleche[(n div 3)-1];
      drawarrow Fleche[(n div 3)-2];
      drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart));
      for k=0 upto ((n div 3)-2):
      draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly;
      endfor;
      draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly;
      fi;
    %fin Sup
    else:
      for k=0 upto ((n div 3)-1):
      trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k];
      endfor;
      % on définit les points milieu des fleches
      path Fleche[];
      pair C[];
      for k=0 upto ((n div 3)-2):
      Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart));
      C[k]=point (0.5*length Fleche[k]) of Fleche[k];
      endfor;
      maxx:=n;
      trace segment(A0,A[(n div 3)-1]);
      n:=0;
      labeloffset:=labeloffset*2;
      for p_=#1:
      n:=n+1;
      if n<maxx:
      if (n mod 3)=1:
      label.top(LATEX(""&p_&""),A[n div 3]);
      elseif (n mod 3)=2:
      if (n div 3)<((maxx div 3)-1):label.top(LATEX(""&p_&""),C[n div 3]);fi;
      elseif (n mod 3)=0:
      label.bot(LATEX(""&p_&""),C[(n div 3)-1]);
      fi;
      fi;
      endfor;
      labeloffset:=labeloffset/2;
      if Fleches:
      for k=0 upto ((n div 3)-2):
      draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly;
      drawarrow Fleche[k];
      endfor;
      draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly;
      fi;
    fi;
  \end{mpost}
  \fi
}

%%%
% Geometrie
%%%
\setKVdefault[Geometrie]{CoinBG={(0,0)},CoinHD={(10u,10u)},TypeTrace="Instruments"}%

\ifluatex
\NewDocumentEnvironment{Geometrie}{o +b}{%
  \useKVdefault[Geometrie]%
  \setKV[Geometrie]{#1}%
  \mplibforcehmode
  \begin{mplibcode}
    % input PfCMPFr;
    pair Coinbg,Coinhd;
    Coinbg=\useKV[Geometrie]{CoinBG};
    Coinhd=\useKV[Geometrie]{CoinHD};
    if \useKV[Geometrie]{TypeTrace}="Instruments":
    typetrace:="normal";
    elseif \useKV[Geometrie]{TypeTrace}="MainLevee":
    typetrace:="mainlevee";
    elseif \useKV[Geometrie]{TypeTrace}="Espace":
    typetrace:="3D";
    typerepre:="persp";
    fi;
    xa=xpart(Coinbg);
    xb=xpart(Coinhd);
    ya=ypart(Coinbg);
    yb=ypart(Coinhd);
    feuille(xa,ya,xb,yb);
    _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi;
    _tfig:=2*_tfig;
    #2%
  \end{mplibcode}
}{}
\else
\NewDocumentEnvironment{Geometrie}{o +b}{%
  \useKVdefault[Geometrie]%
  \setKV[Geometrie]{#1}%
  \begin{mpost}[mpsettings={
      pair Coinbg,Coinhd;
      Coinbg=\useKV[Geometrie]{CoinBG};
      Coinhd=\useKV[Geometrie]{CoinHD};
      if \useKV[Geometrie]{TypeTrace}="Instruments":
      typetrace:="normal";
      elseif \useKV[Geometrie]{TypeTrace}="MainLevee":
      typetrace:="mainlevee";
      elseif \useKV[Geometrie]{TypeTrace}="Espace":
      typetrace:="3D";
      typerepre:="persp";
      fi;}
    ]%
    xa=xpart(Coinbg);
    xb=xpart(Coinhd);;
    ya=ypart(Coinbg);
    yb=ypart(Coinhd);
    feuille(xa,ya,xb,yb);
    _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi;
    _tfig:=2*_tfig;
    #2%
  \end{mpost}
}{}
\fi%

%%%
% Smiley
%%% https://tex.stackexchange.com/questions/3695/smileys-in-latex/227226
\tikzset{face/.style={shape=circle,minimum size=4ex,shading=radial,outer sep=0pt, inner color=white!50!yellow,outer color= yellow!70!orange}}

\newcommand\emoticon[2][]{%
\scalebox{.5}{\begin{tikzpicture}
\node[face,#1,draw,thick] (emoticon) {};
%% The eyes are fixed.
\draw[fill=white] (-1ex,0ex) ..controls (-0.5ex,0.2ex)and(0.5ex,0.2ex)..(1ex,0.0ex) ..controls ( 1.5ex,1.5ex)and( 0.2ex,1.7ex)..(0ex,0.4ex) ..controls (-0.2ex,1.7ex)and(-1.5ex,1.5ex)..(-1ex,0ex)--cycle;
#2%
\end{tikzpicture}}%
}

\newcommand\pupils{
%% standard pupils
\fill[shift={(0.5ex,0.5ex)},rotate=80] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.5ex,0.5ex)},rotate=100] (0,0) ellipse (0.3ex and 0.15ex);}

\def\RKsmallsmile{%
\emoticon{%
\pupils
%% mouth
\draw[thick] (-0.5ex,-1ex)..controls (-0.25ex,-1.25ex)and(0.25ex,-1.25ex)..(0.5ex,-1ex);
}%\emoticon
}

\def\RKsmile{%
\emoticon{%
\pupils
\draw[thick] (-1ex,-1ex)..controls (-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKbigsmile{%
\emoticon{%
\pupils
%% mouth
\draw[thick] (-1.5ex,-0.5ex)..controls (-0.7ex,-1.7ex)and(0.7ex,-1.7ex)..(1.5ex,-0.5ex);
}%\emoticon
}

\def\RKsad{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls(-0.5ex,-0.5ex)and(0.5ex,-0.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKneutral{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-0.5ex,-1ex)--(0.5ex,-1ex);
}%\emoticon
}

\def\RKconfused{%
\emoticon{%
\pupils
%% mouth
\draw[thick] (-1ex,-0.75ex)--(1ex,-1.25ex);
}%\emoticon
}

\def\RKsexy{%
\emoticon{%
\pupils
%% mouth
\draw[very thick,red,line cap=round] (-1ex,-1ex)..controls (-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
%% eyelashes
\draw (0.60ex,1.20ex)--(0.60ex,1.60ex)
  (0.85ex,1.25ex)--(0.95ex,1.45ex)
  (1.00ex,1.00ex)--(1.20ex,1.10ex)
  (0.35ex,1.15ex)--(0.25ex,1.35ex)
  (-0.60ex,1.20ex)--(-0.60ex,1.60ex)
  (-0.85ex,1.25ex)--(-0.95ex,1.45ex)
  (-1.00ex,1.00ex)--(-1.20ex,1.10ex)
  (-0.35ex,1.15ex)--(-0.25ex,1.35ex);
}%\emoticon
}

\def\RKangry{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.5ex,0.5ex)},rotate=90] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls(-0.5ex,-0.5ex)and(0.5ex,-0.5ex)..(1ex,-1ex);
%% eyebrows
\draw[thick] (0.2ex,1.15ex)--(0.5ex,1.6ex)(-0.2ex,1.15ex)--(-0.5ex,1.6ex);
}%\emoticon
}

\def\RKlookup{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,1.05ex)},rotate= 80] (0,0) ellipse (0.2ex and 0.2ex);
\fill[shift={(-0.5ex,1.05ex)},rotate=100] (0,0) ellipse (0.2ex and 0.2ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls(-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKlookdown{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,0.3ex)},rotate= 80] (0,0) ellipse (0.2ex and 0.2ex);
\fill[shift={(-0.5ex,0.3ex)},rotate=100] (0,0) ellipse (0.2ex and 0.2ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls(-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKlookleft{%
\emoticon{%
%% pupils
\fill[shift={( 0.25ex,0.5ex)},rotate=100] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.95ex,0.5ex)},rotate=100] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls(-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKlookright{%
\emoticon{%
%% pupils
\fill[shift={( 0.95ex,0.5ex)},rotate=80] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.25ex,0.5ex)},rotate=80] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-1.0ex,-1ex)..controls(-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKblush{%
\emoticon{%
\pupils
%% mouth
\draw[thick] (-0.5ex,-1ex)..controls (-0.25ex,-1.25ex)and(0.25ex,-1.25ex)..(0.5ex,-1ex);
%% blush
\shade[shading=radial,inner color=white!50!red,outer color= yellow!80!orange] ( 1ex,-0.5ex) circle (0.4ex);
\shade[shading=radial,inner color=white!50!red,outer color= yellow!80!orange] (-1ex,-0.5ex) circle (0.4ex);
}%\emoticon
}

\def\RKalmostcrying{%
\emoticon{%
%% pupils
\fill[shift={( 0.5ex,0.5ex)},rotate=105] (0,0) ellipse (0.3ex and 0.15ex);
\fill[shift={(-0.5ex,0.5ex)},rotate= 75] (0,0) ellipse (0.3ex and 0.15ex);
%% mouth
\draw[thick] (-1ex,-1ex)..controls
(-0.5ex,-0.8ex)and(0.5ex,-0.8ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKmartian{%
\emoticon[inner color=white!50!green,outer color=green!70!red]{%
\pupils
%% mouth
\draw[thick] (-1ex,-1ex)..controls
(-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
}%\emoticon
}

\def\RKdevilish{%
\raisebox{-0.6ex}[0ex][0ex]{%
\emoticon[inner color=white!50!red,outer color= red!70!red!90!black]{%
\pupils
%% mouth
\draw[thick,line cap=round] (-1ex,-1ex)..controls (-0.5ex,-1.5ex)and(0.5ex,-1.5ex)..(1ex,-1ex);
%% tail
\draw[line width=0.45ex,-stealth,black] (emoticon.330)--++(330:0.01ex)..controls (3ex,-3ex)and(3.5ex,1ex)..(4.25ex,-3ex);
\draw[line width=0.27ex,-stealth,red!90!black] (emoticon.330)--++(330:0.01ex)..controls (3ex,-3ex)and(3.5ex,1ex)..(4.22ex,-2.8ex);
%% horns
\draw[fill] (emoticon.80)..controls ( 0.6ex,2.4ex)..( 1ex,2.5ex)..controls ( 0.8ex,2.3ex)..(emoticon.70);
\draw[fill] (emoticon.100)..controls (-0.6ex,2.4ex)..(-1ex,2.5ex)..controls (-0.8ex,2.3ex)..(emoticon.110); 
\draw[thick] (0,0) circle (2ex);
}%\emoticon
}%\raisebox
}

%%%%%
% Enquête
%%%%%
\setKVdefault[ClesEnquete]{Perso=Qui ?,Objet=Quoi ?,Lieu=Où ?,Largeur=4.5cm}

\newcommand\Enquete[1][]{%
  \useKVdefault[ClesEnquete]%
  \setKV[ClesEnquete]{#1}%
}

\newcommand\ListePersonnages[1]{%
  \setsepchar{§}%
  \readlist*\RetiensListePersonnages{#1}%
  \setsepchar{,}%
}

\newcommand\ListeObjets[1]{%
  \setsepchar{§}%
  \readlist*\RetiensListeObjets{#1}%
  \setsepchar{,}%
}

\newcommand\ListeLieux[1]{%
  \setsepchar{§}%
  \readlist*\RetiensListeLieux{#1}%
  \setsepchar{,}%
}

\newcommand\MelangeListe[2]{%
  % #1 Liste à mélanger
  % #2 Nombre d'éléments à conserver
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\ListeInter{#1}%
  \xdef\faa{}% Liste construite
  \xdef\fii{}% Liste détruite
  % on crée les #2 premieres solutions.
  \xintFor* ##1 in {\xintSeq{1}{#2}}\do{%
    \xintifboolexpr{\ListeInterlen>1}{%
      \xdef\Alea{\fpeval{randint(\ListeInterlen)}}%
      \xdef\faa{\faa \ListeInter[\Alea],}%
      \xdef\fii{}%
      \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{%
        \xintifboolexpr{##2 == \Alea}{%
        }{%
          \xdef\fii{\fii \ListeInter[##2],}%
        }%
      }%
    }{%
      \xdef\faa{\faa \ListeInter[1]}%
    }%
    \readlist*\ListeInter{\fii}%
  }%
  \reademptyitems%
}%

\newcommand\ListeQuestions[1]{%
  \setsepchar[*]{§*/}%
  \readlist*\RetiensListeQuestions{#1}
  % On crée la liste des numéros des questions
  \xdef\foo{}%
  \xintFor* ##1 in {\xintSeq{1}{\RetiensListeQuestionslen}}\do{%
    \xdef\foo{\foo ##1,}%
  }%
  % Mélange des questions
  % on crée les 6 premieres solutions.
  \MelangeListe{\foo}{\fpeval{\RetiensListePersonnageslen}}%
  \readlist*\ListeMelangeePersonnages{\faa}%
  \readlist*\ListeRestante{\fii}%\ListeRestante[]
  \MelangeListe{\faa}{\fpeval{\RetiensListePersonnageslen-1}}%
  \readlist*\ListefuuPerso{\faa}%
  % on crée les 6 solutions suivantes.
  \xdef\fuuu{}%
  \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}%
  \MelangeListe{\fuuu}{\fpeval{\RetiensListeObjetslen}}%
  \readlist*\ListeMelangeeObjets{\faa}%
  \readlist*\ListeRestante{\fii}%
  \MelangeListe{\faa}{\fpeval{\RetiensListeObjetslen-1}}%
  \readlist*\ListefuuObjets{\faa}%
  % on crée les dernieres solutions.
  \xdef\fuuu{}%
  \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}%
  \MelangeListe{\fuuu}{\fpeval{\RetiensListeLieuxlen}}
  \readlist*\ListeMelangeeLieux{\faa}%
  %% \readlist*\ListeRestante{\fii}%
  \MelangeListe{\faa}{\fpeval{\RetiensListeLieuxlen-1}}%
  \readlist*\ListefuuLieux{\faa}%
  % --------------
  % Liste des questions sauvegardees
  \xdef\fuu{}%
  \foreachitem\compteur\in\ListefuuPerso{\xdef\fuu{\fuu,\ListefuuPerso[\compteurcnt]}}%
  \foreachitem\compteur\in\ListefuuObjets{\xdef\fuu{\fuu,\ListefuuObjets[\compteurcnt]}}%
  \foreachitem\compteur\in\ListefuuLieux{\xdef\fuu{\fuu,\ListefuuLieux[\compteurcnt]}}%
  \ignoreemptyitems\setsepchar{,}%
  \MelangeListe{\fuu}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}%
  \readlist*\ListeMelangeeQuestions{\faa}%
  \reademptyitems%
}%

\newcommand\AffichageQuestions{%
  \begin{enumerate}
    \xintFor* ##1 in {\xintSeq{1}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}}\do{%
    \item\xdef\Compteur{\ListeMelangeeQuestions[##1]}\RetiensListeQuestions[\Compteur,1]
    }
  \end{enumerate}
}

\newcommand\AffichageTableau{%
  \begin{tabular}{|>{\PfCTBstrut$\square$~}m{\useKV[ClesEnquete]{Largeur}}|}
    \hline
    \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Perso}}\\
    \hline
    \xintFor* ##1 in {\xintSeq{1}{\RetiensListePersonnageslen}}\do{%
    \RetiensListePersonnages[##1]\xdef\PfCCompteurMelange{\ListeMelangeePersonnages[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\
    }
    % 
    \hline
    \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Objet}}\\
    \hline
    \xintFor* ##1 in {\xintSeq{1}{\RetiensListeObjetslen}}\do{%
    \RetiensListeObjets[##1]\xdef\PfCCompteurMelange{\ListeMelangeeObjets[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\
    }
    % 
    \hline
    \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Lieu}}\\
    \hline
    \xintFor* ##1 in {\xintSeq{1}{\RetiensListeLieuxlen}}\do{%
    \RetiensListeLieux[##1]\xdef\PfCCompteurMelange{\ListeMelangeeLieux[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]
    \\
    }
    \hline
  \end{tabular}
}%


%%%
% Modele en barre
%%%
\setKVdefault[ClesModeleBarre]{Hauteur=0.5cm,Largeur=1cm,Separation=0,Homogene=false}%Separation pour conserver le lien avec les équations.
\defKV[ClesModeleBarre]{Longueur=\setKV[ClesModeleBarre]{Homogene}}%

\newtoks\toklistemodelbarresup%
\toklistemodelbarresup{}%
\def\UpdateListeModelBarreSup#1\nil{\addtotok\toklistemodelbarresup{#1,}}%
\newtoks\toklistemodelbarreinf%
\toklistemodelbarreinf{}%
\def\UpdateListeModelBarreInf#1\nil{\addtotok\toklistemodelbarreinf{#1,}}%

\newcommand\ModeleBarre[3][]{%
  % #1 options
  % #2 éléments de la barre supérieure C1 2 $x$ 1 3/C2 1 1x/
  % #3 éléments de la barre inférieure (même lecture)
  \useKVdefault[ClesModeleBarre]%
  \setKV[ClesModeleBarre]{#1}%
  \setsepchar{\\/ }%
  \readlist\ListeModelBarreSup{#2}%
  \readlist\ListeModelBarreInf{#3}%
  \toklistemodelbarresup{}%
  \foreachitem\compteur\in\ListeModelBarreSup{%
    \foreachitem\valeur\in\ListeModelBarreSup[\compteurcnt]{%
      \expandafter\UpdateListeModelBarreSup\valeur\nil%
    }%
  }%
  \toklistemodelbarreinf{}%
  \foreachitem\compteur\in\ListeModelBarreInf{%
    \foreachitem\valeur\in\ListeModelBarreInf[\compteurcnt]{%
      \expandafter\UpdateListeModelBarreInf\valeur\nil%
    }%
  }%
  \ifboolKV[ClesModeleBarre]{Homogene}{%
    \PfCMPDessineModelBarre{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}%
  }{%
    \PfCMPDessineModelBarreNonHomogene{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}%
  }%
}%

\newcommand\PfCMPDessineModelBarre[2]{%
  \begin{mplibcode}%
    Longueur:=\useKV[ClesModeleBarre]{Longueur};
    Hauteur:=\useKV[ClesModeleBarre]{Hauteur};

    vardef Briquesup(expr col)(text t)=
    save $;
    picture $;
    $=image(
    u:=Longueur/MBnbcasessuptotal;
    remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col;
    draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur));
    label(TEX(t),iso((0,0),(u,Hauteur)));
    u:=1cm;
    );
    $
    enddef;

    vardef Briqueinf(expr col)(text t)=
    save $;
    picture $;
    $=image(
    u:=Longueur/MBnbcasesinftotal;
    remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col;
    draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur));
    label(TEX(t),iso((0,0),(u,Hauteur)));
    u:=1cm;
    );
    $
    enddef;
    
    numeric MBnbcolsup;%compte combien de couleurs
    MBnbcolsup=0;
    color MBColSup[];%Sauvegarde les couleurs de la barre sup
    numeric MBnbinfosup[];%compte combien d'infos par couleurs.
    numeric MBnbcasessup[][];
    numeric MBnbcasessuptotal;
    MBnbcasessuptotal=0;
    string MBTextcasessup[][];
    vardef toto(text t)=
    for p_=t:
    if color p_:
    MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
    MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
    MBnbinfosup[MBnbcolsup]:=0;
    else:
    if numeric p_:
    MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
    MBnbcasessuptotal:=MBnbcasessuptotal+p_;
    MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    else:
    MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    toto(#1);

    numeric MBnbcolinf;%compte combien de couleurs
    MBnbcolinf=0;
    color MBColInf[];%Sauvegarde les couleurs de la barre inf
    numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
    numeric MBnbcasesinf[][];
    numeric MBnbcasesinftotal;
    MBnbcasesinftotal=0;
    string MBTextcasesinf[][];
    vardef tata(text t)=
    for p_=t:
    if color p_:
    MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
    MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
    MBnbinfoinf[MBnbcolinf]:=0;
    else:
    if numeric p_:
    MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
    MBnbcasesinftotal:=MBnbcasesinftotal+p_;
    MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    else:
    MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    tata(#2);
    
    pair VecteurDeplasup;
    VecteurDeplasup=(Longueur/MBnbcasessuptotal,0);

    numeric MBnbdepla;
    MBnbdepla=0;
    for k=1 upto MBnbcolsup:
    for l=1 upto MBnbinfosup[k]:
    for j=1 upto MBnbcasessup[k][l]:
    trace Briquesup(MBColSup[k])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDeplasup);
    MBnbdepla:=MBnbdepla+1;
    endfor;
    endfor;
    endfor;

    pair VecteurDeplainf;
    VecteurDeplainf=(Longueur/MBnbcasesinftotal,0);

    numeric MBnbdepla;
    MBnbdepla=0;
    for k=1 upto MBnbcolinf:
    for l=1 upto MBnbinfoinf[k]:
    for j=1 upto MBnbcasesinf[k][l]:
    trace Briqueinf(MBColInf[k])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDeplainf+(0,-Hauteur));
    MBnbdepla:=MBnbdepla+1;
    endfor;
    endfor;
    endfor;
  \end{mplibcode}
}%

\newcommand\PfCMPDessineModelBarreNonHomogene[2]{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}
    Longueur:=\useKV[ClesModeleBarre]{Largeur};
    Hauteur:=\useKV[ClesModeleBarre]{Hauteur};
    Separation:=\useKV[ClesModeleBarre]{Separation};
    
    vardef Brique(expr col,nbfois)(text t)=
    save $;
    picture $;
    $=image(
    u:=Longueur;
    if t="?":
    draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly;
    else:
    remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col;
    draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur));
    fi;
    if nbfois>0:
    label(TEX(t),iso((0,0),(u*abs(nbfois),Hauteur)));
    else:
    label.bot(TEX(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
    drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
    fi;
    u:=1cm;
    );
    $
    enddef;
    
    numeric MBnbcolsup;%compte combien de couleurs
    MBnbcolsup=0;
    color MBColSup[];%Sauvegarde les couleurs de la barre sup
    numeric MBnbinfosup[];%compte combien d'infos par couleurs.
    numeric MBnbcasessup[][];
    numeric MBnbcasessuptotal;
    MBnbcasessuptotal=0;
    string MBTextcasessup[][];
    vardef toto(text t)=
    for p_=t:
    if color p_:
    MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
    MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
    MBnbinfosup[MBnbcolsup]:=0;
    else:
    if numeric p_:
    MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
    MBnbcasessuptotal:=MBnbcasessuptotal+p_;
    MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    else:
    MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    toto(#1);

    numeric MBnbcolinf;%compte combien de couleurs
    MBnbcolinf=0;
    color MBColInf[];%Sauvegarde les couleurs de la barre inf
    numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
    numeric MBnbcasesinf[][];
    numeric MBnbcasesinftotal;
    MBnbcasesinftotal=0;
    string MBTextcasesinf[][];
    vardef tata(text t)=
    for p_=t:
    if color p_:
    MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
    MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
    MBnbinfoinf[MBnbcolinf]:=0;
    else:
    if numeric p_:
    MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
    MBnbcasesinftotal:=MBnbcasesinftotal+p_;
    MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    else:
    MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    tata(#2);
    
    pair VecteurDepla;
    VecteurDepla=(Longueur,0);

    numeric MBnbdepla;
    MBnbdepla=0;
    for k=1 upto MBnbcolsup:
    for l=1 upto MBnbinfosup[k]:
    trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla);
    MBnbdepla:=MBnbdepla+MBnbcasessup[k][l];
    endfor;
    endfor;

    MBnbdepla:=0;
    for k=1 upto MBnbcolinf:
    for l=1 upto MBnbinfoinf[k]:
    trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+(0,-Hauteur));
    if MBnbcasesinf[k][l]<0:
    for j=1 upto (abs(MBnbcasesinf[k][l])-1):
    trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+(0,-Hauteur)) withcolor black;
    endfor;
    fi;
    MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]);
    endfor;
    endfor;

    if Separation>0:
    draw (u*Separation,-1.5Hauteur)--(u*Separation,1.5Hauteur) withpen pencircle scaled 1.5 dashed evenly withcolor red;
    fi;

  \end{mplibcode}%
  \else
  \begin{mpost}[mpsettings={Longueur:=\useKV[ClesModeleBarre]{Largeur};Hauteur:=\useKV[ClesModeleBarre]{Hauteur};Separation:=\useKV[ClesModeleBarre]{Separation};}]
    vardef Brique(expr col,nbfois)(text t)=
    save $;
    picture $;
    $=image(
    u:=Longueur;
    if t="?":
    draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly;
    else:
    remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col;
    draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur));
    fi;
    if nbfois>0:
    label(LATEXProf(t),iso((0,0),(u*abs(nbfois),Hauteur)));
    else:
    label.bot(LATEXProf(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
    drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
    fi;
    u:=1cm;
    );
    $
    enddef;
    
    numeric MBnbcolsup;%compte combien de couleurs
    MBnbcolsup=0;
    color MBColSup[];%Sauvegarde les couleurs de la barre sup
    numeric MBnbinfosup[];%compte combien d'infos par couleurs.
    numeric MBnbcasessup[][];
    numeric MBnbcasessuptotal;
    MBnbcasessuptotal=0;
    string MBTextcasessup[][];
    vardef toto(text t)=
    for p_=t:
    if color p_:
    MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs
    MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases
    MBnbinfosup[MBnbcolsup]:=0;
    else:
    if numeric p_:
    MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1;
    MBnbcasessuptotal:=MBnbcasessuptotal+p_;
    MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    else:
    MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    toto(#1);

    numeric MBnbcolinf;%compte combien de couleurs
    MBnbcolinf=0;
    color MBColInf[];%Sauvegarde les couleurs de la barre inf
    numeric MBnbinfoinf[];%compte combien d'infos par couleurs.
    numeric MBnbcasesinf[][];
    numeric MBnbcasesinftotal;
    MBnbcasesinftotal=0;
    string MBTextcasesinf[][];
    vardef tata(text t)=
    for p_=t:
    if color p_:
    MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs
    MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases
    MBnbinfoinf[MBnbcolinf]:=0;
    else:
    if numeric p_:
    MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1;
    MBnbcasesinftotal:=MBnbcasesinftotal+p_;
    MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    else:
    MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_;
    fi;
    fi;
    endfor;
    enddef;
    
    tata(#2);
    
    pair VecteurDepla;
    VecteurDepla=(Longueur,0);

    numeric MBnbdepla;
    MBnbdepla=0;
    for k=1 upto MBnbcolsup:
    for l=1 upto MBnbinfosup[k]:
    trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla);
    MBnbdepla:=MBnbdepla+MBnbcasessup[k][l];
    endfor;
    endfor;

    MBnbdepla:=0;
    for k=1 upto MBnbcolinf:
    for l=1 upto MBnbinfoinf[k]:
    trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+u*(0,-0.5));
    if MBnbcasesinf[k][l]<0:
    for j=1 upto (abs(MBnbcasesinf[k][l])-1):
    trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+u*(0,-0.5)) withcolor black;
    endfor;
    fi;
    MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]);
    endfor;
    endfor;

    if Separation>0:
    draw u*(Separation,-0.75)--u*(Separation,0.75) withpen pencircle scaled 1.5 dashed evenly withcolor red;
    fi;

  \end{mpost}
  \fi
}%

%%%
% Fiche m\'emorisation active
%%%
\setKVdefault[ClesFicheMemo]{TexteReponses=Réponses,TexteQuestions=Questions,Solution=false,Largeur=\linewidth}

\newcommand\FicheMemo[3][]{%
  \xdef\CountcolUn{0}%
  \xdef\CountcolDeux{0}%
  \useKVdefault[ClesFicheMemo]%
  \setKV[ClesFicheMemo]{#1}%
  \setsepchar[*]{§*/}\reademptyitems%
  \readlist*\ListeQuestionColonneUn{#2}%
  \readlist*\ListeQuestionColonneDeux{#3}%
  \renewcommand{\arraystretch}{1.35}%
  \begin{NiceTabular}[width=\useKV[ClesFicheMemo]{Largeur}]{X[1]X[1]X[1]X[1]}[hvlines]
    \CodeBefore%
    \rowcolor{gray!15}{1}%
    \tikz\draw[dashed,gray!50](2-|1.5) to (last-|1.5);%
    \tikz\draw[dashed,gray!50](2-|4.5) to (last-|4.5);%
    \Body%
    \Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}&&&\Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}\\
    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{%
        \uppercase{&}}{%
        \Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneUn[##1,3]}{}}%
        \uppercase{&}\xdef\CountcolUn{\fpeval{\CountcolUn+1}}\Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ListeQuestionColonneUn[##1,2]}%
      }%
      &%
      \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{%
        \uppercase{&}%
      }{%
        \xdef\CountcolDeux{\fpeval{\CountcolDeux+1}}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ListeQuestionColonneDeux[##1,2]}\uppercase{&}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneDeux[##1,3]}{}}%
      }%
      \\%
    }%
    \CodeAfter%
    \tikz\node[xshift=0.5em] at (2-|1) {\scriptsize\faCut};%
    \xdef\PfCCountCutUn{2}%
    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{%
      }{%
        \xdef\PfCCountCutUn{\fpeval{\PfCCountCutUn+\ListeQuestionColonneUn[##1,1]}}%
        \tikz\node[xshift=0.5em] at (\fpeval{\PfCCountCutUn}-|1) {\scriptsize\faCut};%
      }%
    }%
    \tikz\node[xshift=-0.5em] at (2-|last) {\scriptsize\rotatebox{180}{\faCut}};%
    \xdef\PfCCountCutDeux{2}%
    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneDeuxlen}}\do{%
      \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{%
      }{%
        \xdef\PfCCountCutDeux{\fpeval{\PfCCountCutDeux+\ListeQuestionColonneDeux[##1,1]}}%
        \tikz\node[xshift=-0.5em] at (\fpeval{\PfCCountCutDeux}-|last) {\scriptsize\rotatebox{180}{\faCut}};%
      }%
    }%
    \tikz\node[xshift=0.5em] at (1-|1) {\color{gray}\scriptsize\faCut};%
    \tikz\node[xshift=0.5em] at (last-|1) {\color{gray}\scriptsize\faCut};%
    \tikz\node[xshift=-0.5em] at (1-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};%
    \tikz\node[xshift=-0.5em] at (last-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};%
    \tikz\node at (1.5-|2.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} 1 à \num{\CountcolUn}};%
    \tikz\node at (1.5-|3.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} \num{\fpeval{\CountcolUn+1}} à \num{\fpeval{\CountcolUn+\CountcolDeux}}};%
  \end{NiceTabular}%
  \renewcommand{\arraystretch}{1}%
  \setsepchar{,}%
}%

%%%
% Op\'erations pos\'es à trou
%%%
%% D'après https://tex.stackexchange.com/questions/277246/drawing-a-circle-around-the-numbers-in-xlop-package

\newcommand\PfCchiffre[2]{\tikz[remember picture] \node[inner sep=0pt](#1){#2};}

\newcommand\PfCentoure[2]{\tikz[remember picture,overlay] \node[preaction={draw={\useKV[ClesOperations]{CouleurCadre}},ultra thick,opacity=1,
transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{} ;}

\newcounter{divxlop}%
\newcounter{mulxlop}%
\newcounter{addxlop}%
\newcounter{subxlop}%

\setKVdefault[ClesOperations]{Solution=false,CouleurCadre=LightSteelBlue,CouleurSolution=red,CouleurFond=white,CouleurVirgule=white}

\newcommand\Division[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \opidiv[lineheight=1.5em,columnwidth=1.25em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},remainderstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop}]{#2}{#3}%
  \foreach \i in {1,...,\thedivxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

\newcommand\DivisionD[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opdiv[decimalsepsymbol={,},lineheight=1.5em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},remainderstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \foreach \i in {1,...,\thedivxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

\newcommand\Multiplication[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{mulxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opmul[decimalsepsymbol={,},lineheight=2em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \foreach \i in {1,...,\themulxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

\newcommand\Addition[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{addxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\opset{carryadd,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carryadd=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}
  \foreach \i in {1,...,\theaddxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

\newcommand\Soustraction[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{subxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\opset{carrysub,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carrysub=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \foreach \i in {1,...,\thesubxlop}{%
    \PfCentoure{A\i}{A\i}
  }%
}%

%%%
% Cartographie
%%%
\setKVdefault[Cartographie]{Echelle=1,Carte=false,All=false,Europe=false,Asie=false,Amsud=false,Amnord=false,Amcentre=false,Caraibes=false,Afrique=false,AfficheEchelle=false,PaysSeul=false,VillesSup=false,Capitales=false,Impression=false,Fleuves=false,CouleurFond=ciel,Largeur=12,Hauteur=12,Arborescence="/usr/local/texlive/2022/texmf-dist/metapost/profcollege/datastest/",Projection=false,TypeProjection="mercator",CouleurPays=Cornsilk,Pasl=2,PasL=2}
\defKV[Cartographie]{EchelleCarte=\setKV[Cartographie]{Carte}}
\defKV[Cartographie]{Pays=\setKV[Cartographie]{PaysSeul}}
\defKV[Cartographie]{Villes=\setKV[Cartographie]{VillesSup}}

\newcommand\Cartographie[3][]{%
  \ifluatex
  \useKVdefault[Cartographie]
  \setKV[Cartographie]{#1}
  \ifboolKV[Cartographie]{Projection}{%
    \mplibforcehmode
    \begin{mplibcode}
      input PfCMonde;
      string arborescence;
      arborescence:=\useKV[Cartographie]{Arborescence};
      boolean Impression,VillesSup;
      VillesSup=\useKV[Cartographie]{VillesSup};
      Impression=\useKV[Cartographie]{Impression};
      
      maillage:=true;
      fleuves:=false;
      lacs:=false;
      capitales:=false;

      if Impression:
      noncolore:=true;
      payscolor:=white;
      else:
      noncolore:=true;
      payscolor:=\useKV[Cartographie]{CouleurPays};
      fi;

      projection:=\useKV[Cartographie]{TypeProjection};
      feuillet:=u*(-20,-20)--u*(20,-20)--u*(20,20)--u*(-20,20)--cycle;
      drawoptions(withpen pencircle scaled 0.5 withcolor 0.5white);
      Projection(3,48,\useKV[Cartographie]{Echelle});
      drawoptions();

      if projection="mercator":
      clip currentpicture to (mercatorc(-85,-180)--mercatorc(-85,180)--mercatorc(85,180)--mercatorc(85,-180)--cycle);
      draw mercatorc(0,-180)--mercatorc(0,180);
      draw mercatorc(-85,0)--mercatorc(85,0);
      label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),mercatorc(0,0));
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8:
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(-k*10,0));
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(k*10,0));
      endfor;
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18:
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,-k*10));
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,k*10));
      endfor;
      elseif projection="cylindrique":
      clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle);
      draw cylindriquec(0,-180)--cylindriquec(0,180);
      draw cylindriquec(-85,0)--cylindriquec(85,0);
      label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0));
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8:
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0));
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0));
      endfor;
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18:
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10));
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10));
      endfor;
      elseif projection="winkel":
      clip currentpicture to (winkelc(-85,-180)--winkelc(-85,180) for k=-80 step 5 until 85:--winkelc(k,180) endfor --winkelc(85,-180) for k=80 step -5 until -85:--winkelc(k,-180) endfor --cycle);
      draw winkelc(0,-180)--winkelc(0,180);
      draw winkelc(-85,0)--winkelc(85,0);
      label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),winkelc(0,0));
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8:
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(-k*10,0));
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(k*10,0));
      endfor;
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18:
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,-k*10));
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,k*10));
      endfor;
      elseif projection="cylindrique":
      clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle);
      draw cylindriquec(0,-180)--cylindriquec(0,180);
      draw cylindriquec(-85,0)--cylindriquec(85,0);
      label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0));
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8:
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0));
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0));
      endfor;
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18:
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10));
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10));
      endfor;
      elseif projection="simple":
      clip currentpicture to (simplec(-85,-180)--simplec(-85,180)--simplec(85,180)--simplec(85,-180)--cycle);
      draw simplec(0,-180)--simplec(0,180);
      draw simplec(-85,0)--simplec(85,0);
      label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),simplec(0,0));
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8:
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(-k*10,0));
      label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(k*10,0));
      endfor;
      for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18:
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,-k*10));
      label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,k*10));
      endfor;
      fi;
      if VillesSup:
      nomfichiermul:=\useKV[Cartographie]{Villes};
      nblec:=scantokens readfrom nomfichiermul;
      drawoptions(withcolor (0.15,0.15,0.15));
      for p=1 upto nblec:
      pair Coord[],latlon;string p_;
      latlon=scantokens readfrom nomfichiermul;
      p_=scantokens readfrom nomfichiermul;
      if projection="mercator":
      Coord[p]=mercatorc(ypart(latlon),xpart(latlon));
      elseif projection="winkel":
      Coord[p]=winkelc(ypart(latlon),xpart(latlon));
      elseif projection="cylindrique":
      Coord[p]=cylindriquec(ypart(latlon),xpart(latlon));
      elseif projection="simple":
      Coord[p]=simplec(ypart(latlon),xpart(latlon));
      fi;
      marque_p:="croix";
      pointe(Coord[p]);
      label.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]);
      endfor;
      drawoptions();
      closefrom nomfichiermul;
      fi;
    \end{mplibcode}
  }{%    
    \mplibforcehmode
    \begin{mplibcode}
      input PfCMonde;
      string arborescence;
      arborescence:=\useKV[Cartographie]{Arborescence};
      LargeurCadre=\useKV[Cartographie]{Largeur};
      HauteurCadre=\useKV[Cartographie]{Hauteur};
      distanceecran=100*\useKV[Cartographie]{Echelle};
      fleuves:=\useKV[Cartographie]{Fleuves};
      boolean Carte,Impression,VillesSup;
      Carte=\useKV[Cartographie]{Carte};
      Impression=\useKV[Cartographie]{Impression};
      VillesSup=\useKV[Cartographie]{VillesSup};
      couleurfond:=\useKV[Cartographie]{CouleurFond};
      if Impression:
      noncolore:=true;
      payscolor:=0.85white;
      couleurfond:=white;
      couleurfleuve:=couleurfond;
      fi;
      capitales:=\useKV[Cartographie]{Capitales};
      All:=\useKV[Cartographie]{All};
      Europe:=\useKV[Cartographie]{Europe};
      Asie:=\useKV[Cartographie]{Asie};
      Amsud:=\useKV[Cartographie]{Amsud};
      Amnord:=\useKV[Cartographie]{Amnord};
      Amcentrale:=\useKV[Cartographie]{Amcentre};
      Caraibes:=\useKV[Cartographie]{Caraibes};
      Afrique:=\useKV[Cartographie]{Afrique};
      if Carte:
      Echelle:=\useKV[Cartographie]{AfficheEchelle};
      figure(-0.5u*LargeurCadre,-0.5u*HauteurCadre,0.5u*LargeurCadre,0.5u*HauteurCadre);
      if \useKV[Cartographie]{PaysSeul}:
      projection:="bonne";
      theta:=#2;
      phi:=#3;
      zoom(echelle(#2,#3,\useKV[Cartographie]{EchelleCarte}));
      fill (bonnec(-90,-180) for k=-85 step 5 until 90:..bonnec(k,-180) endfor)..reverse(bonnec(-90,180) for k=-85 step 5 until 90:..bonnec(k,180) endfor)..cycle withcolor couleurfond;
      lecturep(arborescence&\useKV[Cartographie]{Pays}&".dat",couleurfond);%
      trace feuillet withpen pencircle scaled 2;
      if Echelle=true:
      draw ((Xa,Ya)+u*(1,1))--((Xa,Ya)+u*(2,1));
      labeloffset:=labeloffset*1.5;
      label.top(btex 0 etex,(Xa,Ya)+u*(1,1));
      label.top(TEX(""&decimal(Long)&"~km"),(Xa,Ya)+u*(2,1));
      labeloffset:=labeloffset/1.5;
      draw ((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9));
      draw (((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9))) shifted(u*(1,0));
      fi;
      else:
      projection:="bonne";
      Projection(#2,#3,echelle(#2,#3,\useKV[Cartographie]{EchelleCarte}));
      trace feuillet withpen pencircle scaled 2;
      fi;
      if VillesSup:
      nomfichiermul:=\useKV[Cartographie]{Villes};
      nblec:=scantokens readfrom nomfichiermul;
      drawoptions(withcolor (0.15,0.15,0.15));
      projection:="bonne";
      for p=1 upto nblec:
      pair Coord[],latlon;string p_;
      latlon=scantokens readfrom nomfichiermul;
      p_=scantokens readfrom nomfichiermul;
      Coord[p]=bonnec(ypart(latlon),xpart(latlon));
      dotlabel.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]);
      endfor;
      drawoptions();
      closefrom nomfichiermul;
      fi;
      else:
      mappemonde(#2,#3);
      fi;
    \end{mplibcode}
  }
  \else
  \PackageWarning{ProfCollege}{"La commande Cartographie n'est compatible qu'avec LuaLaTeX."}
  \fi
}%

%%%
% Twitter
%%%
\setKVdefault[Twitter]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Url=ViveLaTeX,EchelleLogo=0.035,Logo=DrStrange,Publie=false}

\NewEnviron{Twitter}[1][]{%
  \useKVdefault[Twitter]%
  \setKV[Twitter]{#1}%
  \xdef\EchelleLogo{\useKV[Twitter]{EchelleLogo}}%
  \begin{tcolorbox}[%
    enhanced,%
    overlay unbroken and first={%
      \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\textbf{\useKV[Twitter]{Auteur}}~{\color{gray}@\ttfamily \useKV[Twitter]{Url} - \useKV[Twitter]{Date}}};
      \node[anchor=center,xshift=1em+2mm,yshift=-2em] at (frame.north west) {\LogoTW{\useKV[Twitter]{Logo}}{\EchelleLogo}};
      \node[xshift=-1em,yshift=-2em] at (frame.north east) {\color{gray}...};
      \coordinate[yshift=1em] (A) at (frame.south west);
      \coordinate[yshift=1em] (B) at (frame.south east);
      \node[] (C1) at ($(A)!0.1!(B)$) {\faComment[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}};
      \node[] (C2) at ($(A)!0.325!(B)$) {\faRetweet\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}};
      \node[] (C3) at ($(A)!0.55!(B)$) {\faHeart[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}};
      \node[] (C4) at ($(A)!0.775!(B)$) {\faShareSquare};
    },
    colback=white,
    colframe=gray!15,
    top=2em,
    left=3em,
    bottom=2em]
    \vspace*{0.5em}\par
    \BODY%
  \end{tcolorbox}
}

%%%
% Facebook
%%%
\setKVdefault[Facebook]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Heure=3:14,EchelleLogo=0.035,Logo=DrStrange,Publie=false}

\NewEnviron{Facebook}[1][]{%
  \useKVdefault[Facebook]%
  \setKV[Facebook]{#1}%
  \xdef\EchelleLogo{\useKV[Facebook]{EchelleLogo}}%
  \begin{tcolorbox}[%
    enhanced,%
    overlay unbroken and first={%
      \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Facebook]{Auteur}}};
      \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray}\useKV[Facebook]{Date}, \useKV[Facebook]{Heure}};
      \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Facebook]{Logo}}{\EchelleLogo}};
      \node[xshift=-1em,yshift=-1.5em] at (frame.north east) {\bfseries\color{gray}...};
      \coordinate[yshift=1.15em] (A) at (frame.south west);
      \coordinate[yshift=1.15em] (B) at (frame.south east);
      \coordinate[xshift=0.5em,yshift=1.8em] (A1) at (frame.south west);
      \coordinate[xshift=-0.5em,yshift=1.8em] (B1) at (frame.south east);
      \coordinate[xshift=0.5em,yshift=0.5em] (A2) at (frame.south west);
      \coordinate[xshift=-0.5em,yshift=0.5em] (B2) at (frame.south east);
      \ifboolKV[Facebook]{Publie}{%
        \coordinate[xshift=1em,yshift=1em] (A3) at (A1);
        \draw[blue,fill=blue] (A3) circle (1.5mm);
        \node[] at (A3) {\tiny\color{white}\faThumbsUp};
        \node[anchor=west] at (A3) {~\scriptsize\fpeval{randint(1,150)}};
        \node[anchor=east,xshift=-1em,yshift=1em] at (B1) {\scriptsize\fpeval{randint(2,20)} commentaires~\fpeval{randint(2,10)} partages};
      }{}
      \draw[gray] (A1)--(B1);
      \draw[gray] (A2)--(B2);
      \node[] (C1) at ($(A)!0.15!(B)$) {\footnotesize\faThumbsUp{}~\bfseries J'aime};
      \node[] (C2) at ($(A)!0.5!(B)$) {\footnotesize\faComment*[regular]~\bfseries Commenter};     \node[] (C3) at ($(A)!0.85!(B)$) {\footnotesize\faShareSquare~\bfseries Partager};
    },
    colback=white,
    colframe=gray!15,
    top=2em,
    left=3em,
    bottom=4em]
    %\vspace*{0.5em}\par
    \BODY%
  \end{tcolorbox}
}

%%%
% Instagram
%%%
\setKVdefault[Instagram]{Largeur=0.95\linewidth,Auteur=Christophe,Expediteur=Pierre,Date=\today,Temps=34,Publie=false,Logo=DrStrange,LogoEx=tiger,EchelleLogo=0.035,Texte={}}

\NewEnviron{Instagram}[1][]{%
  \useKVdefault[Instagram]%
  \setKV[Instagram]{#1}%
  \xdef\EchelleLogo{\useKV[Instagram]{EchelleLogo}}%
  \begin{tcolorbox}[%
    enhanced,%
    underlay unbroken and first={%
      \node[anchor=west,xshift=3em,yshift=-1.5em] at (frame.north west) {\textbf{\useKV[Instagram]{Expediteur}}};
      \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Instagram]{LogoEx}}{\EchelleLogo}};
      \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries\color{gray}...};
      \coordinate[yshift=-3em] (HA) at (frame.north west);
      \coordinate[yshift=-3em] (HB) at (frame.north east);
      \draw[gray!15] (HA)--(HB);
      \coordinate[yshift=7em] (BA) at (frame.south west);
      \coordinate[yshift=7em] (BB) at (frame.south east);
      \draw[gray!15] (BA)--(BB);
      \coordinate[xshift=1em,yshift=6em] (A) at (frame.south west);
      \node[anchor=west] at (A) {\bfseries\faHeart[regular]\quad\faComment[regular]\quad\faPaperPlane};
      \coordinate[xshift=-1em,yshift=6em] (A1) at (frame.south east);
      \node[anchor=east] at (A1) {\bfseries\faBookmark[regular]};
      \coordinate[xshift=1em,yshift=5em] (B) at (frame.south west);
      \node[anchor=west] at (B) {\footnotesize\bfseries\fpeval{randint(10,30)} J'aime};
      \coordinate[xshift=1em,yshift=4em] (C) at (frame.south west);
      \node[anchor=west] at (C) {\textbf{\useKV[Instagram]{Expediteur}}~\useKV[Instagram]{Texte}};
      \node[anchor=center,xshift=2em,yshift=2.25em] at (frame.south west) {\LogoTW{\useKV[Instagram]{Logo}}{\EchelleLogo}};
      \node[anchor=west,xshift=4em,yshift=2.25em] at (frame.south west) {\textcolor{gray!50}{Ajouter un commentaire\dots}};
      \node[anchor=east,xshift=-1em,yshift=2.25em] at (frame.south east) {\textcolor{red}{\faHeart}\quad\textcolor{Gold}{\faHandSpock}\quad\textcolor{gray!50}{\faPlusCircle}};
      \node[anchor=west,xshift=1em,yshift=0.5em] at (frame.south west) {\scriptsize\color{gray} Il y a \useKV[Instagram]{Temps} secondes};
    },
    colback=white,
    colframe=gray!15,
    top=3em,
    left=3em,
    bottom=7em]
    \BODY%
  \end{tcolorbox}
}

%%%
% Snapchat
%%%
\setKVdefault[Snapchat]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Temps=34,Logo=DrStrange,EchelleLogo=0.035,Texte=Envoyer un Chat}

\NewEnviron{Snapchat}[1][]{%
  \useKVdefault[Snapchat]%
  \setKV[Snapchat]{#1}%
  \xdef\EchelleLogo{\useKV[Snapchat]{EchelleLogo}}%
  \begin{tcolorbox}[%
    enhanced,%
    underlay unbroken and first={%
      \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Snapchat]{Auteur}}};
      \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray} il y a \useKV[Snapchat]{Temps}~min};
      \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Snapchat]{Logo}}{\EchelleLogo}};
      \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries...};
      \node[xshift=-3em,yshift=-1.5em] at (frame.north east) {\faBell[regular]};
      \coordinate[xshift=2em,yshift=2em] (P1) at (frame.south west);
      \coordinate[xshift=4.5em,yshift=2em] (P2) at (frame.south west);
      \coordinate[xshift=-3em,yshift=2em] (P4) at (frame.south west);
      \coordinate[xshift=-2em,yshift=2em] (P3) at (frame.south east);
      \coordinate[xshift=4.5em,yshift=1em] (P5) at (frame.south west);
      \coordinate[xshift=4.5em,yshift=3em] (P8) at (frame.south west);
      \coordinate[xshift=-4.5em,yshift=1em] (P6) at (frame.south east);
      \coordinate[xshift=-4.5em,yshift=3em] (P7) at (frame.south east);
      \draw (P1) circle (1em);
      \node at (P1) {\faCamera};
      \draw (P3) circle (1em);
      \node[xshift=-0.125em,rotate=-45] at (P3) {\faLocationArrow};
      \node[anchor=west,inner sep=0pt] at (P2) {\useKV[Snapchat]{Texte}};
      \draw (P5) -- (P6) arc(270:450:1em) -- (P7) -- (P8) arc(90:270:1em) -- cycle;
    },
    colback=white,
    colframe=gray!15,
    top=3em,
    left=3em,
    bottom=3em]
    \BODY%
  \end{tcolorbox}
}

%%%
% Bon de sortie
%%%
\newcommand\BonSortieBandeau{%
  Nom : \hfill Date : \hspace*{3cm}
}

\newtcolorbox{Sortie}{%
  %Titre
  colbacktitle=white,
  fonttitle=\color{black}\Large\bfseries,
  toptitle=2mm,
  bottomtitle=2mm,
  title={\BonSortieBandeau},
  %%Cadre principal
  enhanced,
  nobeforeafter,
  width=13.15cm,
  height=8.8cm,
  colback=white,
  valign=top,
  %Cadre bas
  sidebyside,
  righthand width=0.05\linewidth,
}

\setKVdefault[ClesSortie]{MemeEnonce=false}%

\newcommand\BonSortieSmiley{%
  \Huge
  \begin{center}
    \RKangry

    \vspace{1em}
    
    \RKsad

    \vspace{1em}
    
    \RKsmallsmile
    
    \vspace{1em}

    \RKbigsmile
  \end{center}
}

\NewDocumentCommand\BonSortie{o m m m m}{%
  \clearpage%
  \useKVdefault[ClesSortie]%
  \setKV[ClesSortie]{#1}%
  \begin{tikzpicture}[remember picture, overlay]
    \draw[dashed] (current page.north) to (current page.south);
    \draw[dashed] (current page.west) to (current page.east);
    \coordinate[xshift=7.425cm,yshift=-5.25cm] (A) at (current page.north west);
    \coordinate[xshift=-7.425cm,yshift=-5.25cm] (B) at (current page.north east);
    \coordinate[xshift=7.425cm,yshift=5.25cm] (C) at (current page.south west);
    \coordinate[xshift=-7.425cm,yshift=5.25cm] (D) at (current page.south east);
    \ifboolKV[ClesSortie]{MemeEnonce}{%
      \foreach\i\in in {A,B,C,D}{%
        \node (\i1) at (\i) {\begin{Sortie}
            #2
            \tcblower
            \BonSortieSmiley
          \end{Sortie}
        };
      }
    }{%
      \node (A1) at (A) {\begin{Sortie}
          #2
          \tcblower
          \BonSortieSmiley
        \end{Sortie}
      };
      \node (B1) at (B) {\begin{Sortie}
          #3
          \tcblower
          \BonSortieSmiley
        \end{Sortie}
      };
      \node (C1) at (C) {\begin{Sortie}
          #4
          \tcblower
          \BonSortieSmiley
        \end{Sortie}
      };
      \node (D1) at (D) {\begin{Sortie}
          #5
          \tcblower
          \BonSortieSmiley
        \end{Sortie}
      };
    }
  \end{tikzpicture}
}

%%%
% Ecriture des nombres en lettres
%%%
\setKVdefault[ClesEcriture]{Math=false,Majuscule=false,E=false,Tradition=false,Zero=false}

\newcommand\EcriturePluriel[1]{%
  \xintifboolexpr{#1 > 1}{s}{}%
}

\newcommand\EcritureDecimale{%
  \StrLen{\ListeEcriture[2]}[\LongueurDecimale]%
  \xintifboolexpr{\LongueurDecimale == 6}{%
    ~millionième\EcriturePluriel{\ListeEcriture[2]}%
  }{\xintifboolexpr{\LongueurDecimale == 5}{%
     ~cent-millième\EcriturePluriel{\ListeEcriture[2]}
    }{\xintifboolexpr{\LongueurDecimale == 4}{%
        ~dix-millième\EcriturePluriel{\ListeEcriture[2]}
      }{\xintifboolexpr{\LongueurDecimale == 3}{%
          ~millième\EcriturePluriel{\ListeEcriture[2]}
        }{\xintifboolexpr{\LongueurDecimale == 2}{%
            ~centième\EcriturePluriel{\ListeEcriture[2]}
          }{\xintifboolexpr{\LongueurDecimale == 1}{%
              ~dixième\EcriturePluriel{\ListeEcriture[2]}
            }{}%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Ecriture[2][]{%
  \useKVdefault[ClesEcriture]%
  \setKV[ClesEcriture]{#1}%
  \ifboolKV[ClesEcriture]{Tradition}{%
    \fmtcountsetoptions{french={dash or space=traditional}}%
  }{%
    \fmtcountsetoptions{french={dash or space=always}}%
  }%
  \setsepchar{.}%
  \readlist*\ListeEcriture{#2}%
  \xintifboolexpr{\ListeEcriturelen == 2}{%
    \ifboolKV[ClesEcriture]{Majuscule}{%
      \ifboolKV[ClesEcriture]{Zero}{}{\Numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}%
    }{%
      \ifboolKV[ClesEcriture]{Zero}{}{\numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}%
    }}{%
    \ifboolKV[ClesEcriture]{Majuscule}{%
      \Numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}%
    }{%
      \numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}%
    }%
  }%
}%

%%%
% D\'ecomposition de fractions d\'ecimales
%%%
\setKVdefault[ClesFracDeci]{Complete=false,SansZero=false,Remediation=false}

\newcommand\FractionDecimale[2][]{%
  \useKVdefault[ClesFracDeci]%
  \setKV[ClesFracDeci]{#1}%
  \setsepchar[*]{/}%
  \readlist*\ListeFractionDecimale{#2}%
  \xdef\FractionDeciNum{\ListeFractionDecimale[1]}%
  \xdef\FractionDeciDeno{\ListeFractionDecimale[2]}%
  \xdef\PartieEntiereFractionDeci{\fpeval{floor(\FractionDeciNum/\FractionDeciDeno)}}%
  \xdef\PartieDecimaleFractionDeci{\fpeval{\FractionDeciNum-floor(\FractionDeciNum/\FractionDeciDeno)*\FractionDeciDeno}}%
  \StrLen{\PartieDecimaleFractionDeci}[\LongueurPartieDecimale]%
  \StrLen{\fpeval{\FractionDeciDeno}}[\LongueurFracDeciDeno]%
  \StrLen{\fpeval{\FractionDeciNum}}[\LongueurFracDeciNum]%
  \xintifboolexpr{\PartieEntiereFractionDeci == 0}{\xdef\LongueurPartieEntiere{0}}{\StrLen{\PartieEntiereFractionDeci}[\LongueurPartieEntiere]}%
  \xintifboolexpr{\PartieEntiereFractionDeci == \fpeval{\FractionDeciNum/\FractionDeciDeno}}{%
    \ensuremath{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\PartieEntiereFractionDeci}}}%
  }{%
    \ifboolKV[ClesFracDeci]{SansZero}{%
      \ensuremath{%
        \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\PartieEntiereFractionDeci}}+}%
        \xintFor* ##1 in {\xintSeq{1}{\LongueurPartieDecimale}}\do{%
          \StrMid{\PartieDecimaleFractionDeci}{##1}{##1}[\ChiffrePartieDecimale]%
          \xintifForFirst{}{\xintifboolexpr{\ChiffrePartieDecimale == 0}{}{+}}\xintifboolexpr{\ChiffrePartieDecimale == 0}{}{\frac{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**(\LongueurFracDeciDeno-1-\LongueurPartieDecimale+##1)}}}}%
        }%
      }%
    }{%
      \ifboolKV[ClesFracDeci]{Complete}{%
        \xintifboolexpr{\FractionDeciNum>\FractionDeciDeno}{%
          \ensuremath{%
            % on affiche la partie entière.
            \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\PartieEntiereFractionDeci}}+}%
            \StrGobbleLeft{\FractionDeciNum}{\fpeval{\LongueurPartieEntiere}}[\DecompositionFracDeciComplete]%
            % on affiche la partie décimale.
            \xintFor* ##1 in {\xintSeq{1}{\fpeval{\LongueurFracDeciNum-\LongueurPartieEntiere}}}\do{%
              \xintifForFirst{}{+}\StrMid{\DecompositionFracDeciComplete}{##1}{##1}[\ChiffrePartieDecimale]\frac{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**##1}}}%
            }%
          }%
        }{%
          \ensuremath{%
            \xintFor* ##1 in {\xintSeq{1}{\LongueurPartieDecimale}}\do{%
              \StrMid{\PartieDecimaleFractionDeci}{##1}{##1}[\ChiffrePartieDecimale]%
              \xintifForFirst{}{+}\frac{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**(\LongueurFracDeciDeno-1-\LongueurPartieDecimale+##1)}}}%
            }%
          }%
        }%
      }{%
        \ensuremath{%
          \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\PartieEntiereFractionDeci}}+}\frac{\ifboolKV[ClesFracDeci]{Remediation}{\dots}{\num{\PartieDecimaleFractionDeci}}}{\num{\FractionDeciDeno}}%
        }%
      }%
    }%
  }%
}%

%%%
% Pyramide de calculs
%%%
\newcommand\DessinePyramideNombreMul[1]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair A[],B[],O;
    cote:=\useKV[ClesPyramide]{Cote};
    boolean Aide,Produit,Solution,Vide;
    Aide:=\useKV[ClesPyramide]{Aide};
    Vide:=\useKV[ClesPyramide]{Vide};
    Produit:=\useKV[ClesPyramide]{Produit};
    Solution:=\useKV[ClesPyramide]{Solution};
    A1=u*(1,1);
    A2-A1=cote*(1,0);
    A3=rotation(A2,A1,60);
    A4=A1;
    B1=iso(A1,A2);
    B2=iso(A2,A3);
    B3=iso(A3,A1);
    O=iso(A1,A2,A3);
    path BoiteRec;
    BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u;
    % On trace et on affiche...éventuellement :)
    trace polygone(A1,A2,A3);
    for k=1 upto 3:
    trace segment(O,B[k]) dashed withdots scaled 0.25;
    draw BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    endfor;
    if Vide:
    else:
    % On récupère les valeurs pour déterminer les produits
    k=0;
    for p_=#1:
    k:=k+1;
    Facteur[k]=p_;
    endfor;
    Produit[1]=Facteur[1] * Facteur[2];
    Produit[2]=Facteur[2] * Facteur[3];
    Produit[3]=Facteur[3] * Facteur[1];
    for k=1 upto 3:
    if Produit or Solution:
    label(TEX("\num{"&decimal(Produit[k])&"}"),(1.75[O,B[k]]-center BoiteRec));
    fi;
    if Produit:
    else:
    label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec));
    fi;
    endfor;
    fi;
    if Aide:
    for k=1 upto 3:
    drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    endfor;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={cote:=\useKV[ClesPyramide]{Cote};
      boolean Aide,Produit,Solution,Vide;
      Aide:=\useKV[ClesPyramide]{Aide};
      Vide:=\useKV[ClesPyramide]{Vide};
      Produit:=\useKV[ClesPyramide]{Produit};
      Solution:=\useKV[ClesPyramide]{Solution};}]
    pair A[],B[],O;
    A1=u*(1,1);
    A2-A1=cote*(1,0);
    A3=rotation(A2,A1,60);
    A4=A1;
    B1=iso(A1,A2);
    B2=iso(A2,A3);
    B3=iso(A3,A1);
    O=iso(A1,A2,A3);
    path BoiteRec;
    BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u;
    % On trace et on affiche...éventuellement :)
    trace polygone(A1,A2,A3);
    for k=1 upto 3:
    trace segment(O,B[k]) dashed withdots scaled 0.25;
    draw BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    endfor;
    if Vide:
    else:
    % On récupère les valeurs pour déterminer les produits
    k=0;
    for p_=#1:
    k:=k+1;
    Facteur[k]=p_;
    endfor;
    Produit[1]=Facteur[1] * Facteur[2];
    Produit[2]=Facteur[2] * Facteur[3];
    Produit[3]=Facteur[3] * Facteur[1];
    for k=1 upto 3:
    if Produit or Solution:
    label(TEX("\num{"&decimal(Produit[k])&"}"),(1.75[O,B[k]]-center BoiteRec));
    fi;
    if Produit:
    else:
    label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec));
    fi;
    endfor;
    fi;
    if Aide:
    for k=1 upto 3:
    drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5;
    endfor;
    fi;
  \end{mpost}
  \fi
}

\newcommand\DessinePyramideNombre[1]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair A[][],B[];
    path Case[];
    color CaseCouleur;
    nbetages:=\useKV[ClesPyramide]{Etages};
    largeur:=\useKV[ClesPyramide]{Largeur};
    hauteur:=\useKV[ClesPyramide]{Hauteur};
    CaseCouleur:=\useKV[ClesPyramide]{Couleur};
    boolean Double;
    Double=\useKV[ClesPyramide]{Double};
    Nbeb:=0;%Pour associer les textes avec les points. Plus facile :)
    if Double:
    for k=nbetages downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,(nbetages-k)*hauteur);
    B[Nbeb]=A[k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    for k=nbetages-1 downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[-k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,-(nbetages-k)*hauteur);
    B[Nbeb]=A[-k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[-k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    else:
    if \useKV[ClesPyramide]{Inverse}:
    change:=-1;
    else:
    change=1;
    fi;
    for k=nbetages downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,change*(nbetages-k)*hauteur);
    B[Nbeb]=A[k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    fi;
    if \useKV[ClesPyramide]{Vide}:
    else:
    Nbeb:=0;
    for p_=#1:
    Nbeb:=Nbeb+1;
    if (substring(0,1) of p_)="*":
    fill Case[Nbeb] withcolor CaseCouleur;
    trace Case[Nbeb];
    label(TEX(substring(1,length p_) of p_),B[Nbeb]);
    elseif (substring(0,1) of p_)="!":
    drawoptions(withcolor \useKV[ClesPyramide]{CouleurNombre});
    label(TEX(substring(1,length p_) of p_),B[Nbeb]);
    drawoptions();
    else:
    label(TEX(p_),B[Nbeb]);
    fi;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={nbetages:=\useKV[ClesPyramide]{Etages};largeur:=\useKV[ClesPyramide]{Largeur};hauteur:=\useKV[ClesPyramide]{Hauteur};boolean Vide;Vide=\useKV[ClesPyramide]{Vide};boolean Inverse;Inverse=\useKV[ClesPyramide]{Inverse};color CaseCouleur; CaseCouleur:=\useKV[ClesPyramide]{Couleur};boolean Double;Double=\useKV[ClesPyramide]{Double}; color CouleurNombre;CouleurNombre=\useKV[ClesPyramide]{CouleurNombre};}]
    pair A[][],B[];
    path Case[];
    Nbeb:=0;
    if Double:
    for k=nbetages downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,(nbetages-k)*hauteur);
    B[Nbeb]=A[k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    for k=nbetages-1 downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[-k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,-(nbetages-k)*hauteur);
    B[Nbeb]=A[-k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[-k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    else:
    if \useKV[ClesPyramide]{Inverse}:
    change:=-1;
    else:
    change=1;
    fi;
    for k=nbetages downto 1:
    for l=0 upto (k-1):
    Nbeb:=Nbeb+1;
    A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,change*(nbetages-k)*hauteur);
    B[Nbeb]=A[k][l];
    Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur));
    trace Case[Nbeb];
    endfor;
    endfor;
    fi;
    if \useKV[ClesPyramide]{Vide}:
    else:
    Nbeb:=0;
    for p_=#1:
    Nbeb:=Nbeb+1;
    if (substring(0,1) of p_)="*":
    fill Case[Nbeb] withcolor CaseCouleur;
    trace Case[Nbeb];
    label(LATEX(substring(1,length p_) of p_),B[Nbeb]);
    elseif (substring(0,1) of p_)="!":
    drawoptions(withcolor CouleurNombre);
    label(LATEX(substring(1,length p_) of p_),B[Nbeb]);
    drawoptions();
    else:
    label(LATEX(p_),B[Nbeb]);
    fi;
    endfor;
  \end{mpost}
  \fi
}%

\setKVdefault[ClesPyramide]{Etages=5,Largeur=2cm,Hauteur=1cm,Vide=false,Inverse=false,Double=false,Couleur=Crimson,Multiplication=false,CouleurNombre=blue,Produit=false,Solution=false,Aide=false,Cote=4cm}%

\newtoks\toklistecaseP%
\def\UpdatetoksPyramide#1\nil{\addtotok\toklistecaseP{"#1",}}%
\def\UpdatetoksPyramideMul#1\nil{\addtotok\toklistecaseP{#1,}}%

\NewDocumentCommand\PyramideNombre{o m}{%
  \useKVdefault[ClesPyramide]%
  \setKV[ClesPyramide]{#1}%
  \ifboolKV[ClesPyramide]{Multiplication}{%
    \ifx\bla#2\bla%
    \setKV[ClesPyramide]{Vide=true}%
    \DessinePyramideNombreMul{\the\toklistecaseP}%
    \else
    \setsepchar{,}%
    \readlist*\ListePyramide{#2}%
    \DessinePyramideNombreMul{\ListePyramide[1],\ListePyramide[2],\ListePyramide[3]}%
    \fi
  }{%
    \ifx\bla#2\bla%
    \setKV[ClesPyramide]{Vide=true}%
    \DessinePyramideNombre{\the\toklistecaseP}%
    \else%
    \setsepchar{,}%
    \readlist*\ListePyramide{#2}%
    \ifboolKV[ClesPyramide]{Double}{%
      \def\CalculNombreComposants{\fpeval{\useKV[ClesPyramide]{Etages}*\useKV[ClesPyramide]{Etages}}}%
    }{%
      \def\CalculNombreComposants{\fpeval{\useKV[ClesPyramide]{Etages}*(\useKV[ClesPyramide]{Etages}+1)/2}}%
    }%
    \xintifboolexpr{\ListePyramidelen==\CalculNombreComposants}{%
      \toklistecaseP{}%
      \foreachitem\compteur\in\ListePyramide{\expandafter\UpdatetoksPyramide\compteur\nil}%
      \DessinePyramideNombre{\the\toklistecaseP}%
    }{Le nombre d'éléments dans la liste des propositions n'est pas compatible avec le nombre d'étages choisi.}%
    \fi%
  }%
}%

%%%
% Tables Addition-Multiplication
%%%
\setKVdefault[Tables]{Addition=false,Multiplication=true,Seul=false,Debut=0,Fin=10,Couleur=white}

% pour m\'emoire
\newcommand\TableMultiplicationComplete{%
  \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}%
  \begin{tabular}{|>{\columncolor{gray!15}\centering\arraybackslash}p{1.5em}|*{\NbColTabMul}{>{\centering\arraybackslash}p{1.5em}|}}%
    \hline
    $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\cellcolor{gray!15}\fpeval{##1}
      }
    \\
    \hline
    \xintFor* ##1 in {\xintSeq {0}{10}}\do{%
    ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\fpeval{##2*##1}
      }
    \\
    \hline
    }
  \end{tabular}%
}
%%%%

\newcommand\TableMultiplicationCompleteColore{%
  \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}%
  \begin{tabular}{|>{\columncolor{gray!15}\centering\arraybackslash}p{1.5em}|*{\NbColTabMul}{>{\centering\arraybackslash}p{1.5em}|}}%
    \hline
    $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\cellcolor{gray!15}\fpeval{##1}
      }
    \\
    \hline
    \xintFor* ##1 in {\xintSeq {0}{10}}\do{%
    ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\xintifboolexpr{##2<##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##1*10}}}{\xintifboolexpr{##2>##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##2*10}}}{}}\fpeval{##2*##1}
      }
    \\
    \hline
    }
  \end{tabular}%
}

\newcommand\TableAdditionComplete{%
  \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}%
  \begin{tabular}{|>{\columncolor{gray!15}\centering\arraybackslash}p{1.5em}|*{\NbColTabMul}{>{\centering\arraybackslash}p{1.5em}|}}%
    \hline
    $+$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\cellcolor{gray!15}\fpeval{##1}
      }
    \\
    \hline
    \xintFor* ##1 in {\xintSeq {0}{10}}\do{%
    ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{%
    &\fpeval{##2+##1}
      }
    \\
    \hline
    }
  \end{tabular}%
}

\newcommand\TableMultiplicationSeule[1]{%
  \ensuremath{%
    \begin{array}{ccccc}%
      \xintFor* ##1 in {\xintSeq
      {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{
      ##1&\times&#1&=&\fpeval{##1*#1}\\
      }
    \end{array}
  }%
}%

\newcommand\TableAdditionSeule[1]{%
  \ensuremath{%
    \begin{array}{ccccc}
      \xintFor* ##1 in {\xintSeq
      {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{
      ##1&+&#1&=&\fpeval{##1+#1}\\
      }
    \end{array}
  }%
}%

\newcommand\Tables[2][]{%
  \useKVdefault[Tables]%
  \setKV[Tables]{#1}%
  \ifboolKV[Tables]{Seul}{%
    \ifboolKV[Tables]{Addition}{%
      \TableAdditionSeule{#2}%
    }{%
      \TableMultiplicationSeule{#2}%
    }%
  }{%
    \ifboolKV[Tables]{Addition}{%
      \TableAdditionComplete%
    }{%
      \TableMultiplicationCompleteColore%
    }%
  }%
}%

\setKVdefault[DefiTable]{Solution=false,Math=false,LargeurT=5mm}

\newcommand\DefiTable[2][]{%
  % 1 les clés
  % 2 la table de décodage
  \useKVdefault[DefiTable]%
  \setKV[DefiTable]{#1}%
  \setsepchar[*]{§* }%
  \readlist*\ListeDefiTableCode{#2}%
  \begin{NiceTabular}{>{\columncolor{gray!15}}{c}*{10}{c}}[hvlines]
    \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{%
      \xintifForFirst{}{&}##1}
    \\
    1\xintFor* ##1 in {\xintSeq {1}{10}}\do{%
      &\ListeDefiTableCode[1,##1]%
    }\\
    \xintFor* ##1 in {\xintSeq {2}{9}}\do{%
      ##1\xintFor* ##2 in {\xintSeq {1}{##1}}\do{%
        &\ListeDefiTableCode[##2,\fpeval{##1-##2+1}]%
      }\xintFor* ##2 in {\xintSeq {1}{\fpeval{10-##1}}}\do{%
        &\ListeDefiTableCode[##1,\fpeval{##2+1}]%
        }%
      \\
    }%
    10&\ListeDefiTableCode[1,10]&\ListeDefiTableCode[2,9]&\ListeDefiTableCode[3,8]&\ListeDefiTableCode[4,7]&\ListeDefiTableCode[5,6]&\ListeDefiTableCode[6,5]&\ListeDefiTableCode[7,4]&\ListeDefiTableCode[8,3]&\ListeDefiTableCode[9,2]&\ListeDefiTableCode[10,1]\\
  \end{NiceTabular}%
}%

\newcommand\DefiTableTexte[3][]{%
  \useKVdefault[DefiTable]%
  \setKV[DefiTable]{#1}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeDefiTableTableau{#2}%
  \xdef\ListeDefiTableMax{0}%
  \setsepchar{§}%
  \readlist*\ListeDefiTablePhrase{#3}%
  \foreachitem\compteur\in\ListeDefiTableTableau{%
    \xintifboolexpr{\ListeDefiTableMax<\listlen\ListeDefiTableTableau[\compteurcnt]}{\xdef\ListeDefiTableMax{\fpeval{\listlen\ListeDefiTableTableau[\compteurcnt]}}}{}%
  }%
  \begin{NiceTabular}{*{\fpeval{\ListeDefiTableMax}}{>{\centering\arraybackslash}m{\useKV[DefiTable]{LargeurT}}}}
    \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeDefiTableTableaulen}}}\do{%
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{%
        \xintifForFirst{}{&}\ifboolKV[DefiTable]{Solution}{%
          \StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}[\DefiTableMaLettre]%
          \IfStrEq{\DefiTableMaLettre}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{\StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}}}%
        }{%
          \IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{}}%
        }%%
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{%
        \xintifForFirst{}{&}
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{%
        \xintifForFirst{}{&}\IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[DefiTable]{Math}{\ListeDefiTableTableau[##1,##2]}{\num{\ListeDefiTableTableau[##1,##2]}}}%
      }\\
    }%
  \end{NiceTabular}%
}%

%%%
% Rangement des nombres
%%%
\setKVdefault[ClesRgt]{Croissant,Decroissant=false,Strict,Fraction=false,Details=false}

\dtlexpandnewvalue%
\DTLgnewdb{mtnumedb}%
\DTLgnewdb{mtRGTdb}% Pb de doublon avec mtdb de Mediane

\newcommand\Rangement[2][]{%
  \useKVdefault[ClesRgt]%
  \setKV[ClesRgt]{#1}%
  \ifboolKV[ClesRgt]{Fraction}{%
    \setsepchar[*]{,*/}\ignoreemptyitems%
    \readlist*\ListeRgt{#2}%
    % on cherche le d\'enominateur commun
    \ppcm=1\relax
    \foreachitem\x\in\ListeRgt{%
      \PPCM{\fpeval{\ListeRgt[\xcnt,2]}}{\fpeval{\the\ppcm}}%
    }%
    % On cr\'ee la liste des rangements.
    \DTLcleardb{mtnumedb}%
%    % on les trie pour les ranger par ordre croissant
    \foreachitem\x\in\ListeRgt{%
      \DTLnewrow{mtnumedb}%
      \xdef\toto{\fpeval{\ListeRgt[\xcnt,1]*\the\ppcm/\ListeRgt[\xcnt,2]}}%
      \DTLnewdbentry{mtnumedb}{numeric}{\toto}%
    }%
%    % On trie
    \ifboolKV[ClesRgt]{Decroissant}{%
%      % On trie la liste
      \dtlsort{numeric=descending}{mtnumedb}{\dtlicompare}%
      \ifboolKV[ClesRgt]{Details}{\ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}}{%
        \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}%
      }
    }{%
%      % On trie la liste
      \dtlsort{numeric}{mtnumedb}{\dtlicompare}%
      \ifboolKV[ClesRgt]{Details}{%
        \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}%
      }{%
        \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}%
      }%
    }%
  }{%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\ListeRgt{#2}%
    % on cr\'ee la base de donn\'ees des valeurs
    \DTLcleardb{mtRGTdb}%
%    % on les trie pour les ranger par ordre croissant
    \foreachitem\x\in\ListeRgt{%
      \DTLnewrow{mtRGTdb}%
      \itemtomacro\ListeRgt[\xcnt]\y%
      \DTLnewdbentry{mtRGTdb}{numeric}{\y}%
    }%
%    % 
    \ifboolKV[ClesRgt]{Decroissant}{%
      % On trie la liste
      \dtlsort{numeric=descending}{mtRGTdb}{\dtlicompare}%
      \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}%
    }{%
%      % On trie la liste
      \dtlsort{numeric}{mtRGTdb}{\dtlicompare}%
      \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}%
    }%
  }%
}%

%%%
% Mots Cod\'es
%%%
\setKVdefault[MotsCodes]{LargeurT=1cm,Colonnes=5,Largeur=3cm,Solution=false,Math=false}%

\newcommand\MotsCodes[2][]{%
  \useKVdefault[MotsCodes]%
  \setKV[MotsCodes]{#1}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeMotsCodes{#2}%
  \xdef\ListeMotsCodesPas{\fpeval{\ListeMotsCodeslen/\useKV[MotsCodes]{Colonnes}}}%
  \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{Largeur}}}}
    \xintFor* ##1 in {\xintSeq {1}{\ListeMotsCodesPas}}\do{%
      \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{%
        \xintifForFirst{}{&}\Block[draw=black]{4-1}{}%
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{%
        \xintifForFirst{}{&}\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},1]
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{%
        \xintifForFirst{}{&}%
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{%
        \xintifForFirst{}{&}\textbf{\Large\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},2]}
      }\\
    }%
  \end{NiceTabular}%
}%

\newcommand\MotsCodesTableau[3][]{%
  \useKVdefault[MotsCodes]%
  \setKV[MotsCodes]{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeMotsCodesTableau{#2}%
  \xdef\ListeMotsCodesMax{0}%
  \setsepchar{,}%
  \readlist*\ListeMotsCodesPhrase{#3}%
  \foreachitem\compteur\in\ListeMotsCodesTableau{%
    \xintifboolexpr{\ListeMotsCodesMax<\listlen\ListeMotsCodesTableau[\compteurcnt]}{\xdef\ListeMotsCodesMax{\fpeval{\listlen\ListeMotsCodesTableau[\compteurcnt]}}}{}%
  }%
  \begin{NiceTabular}{*{\fpeval{\ListeMotsCodesMax}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{LargeurT}}}}
    \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsCodesTableaulen}}}\do{%
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{%
        \xintifForFirst{}{&}\ifboolKV[MotsCodes]{Solution}{%
          \StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}[\MotsCodesMaLettre]%
          \IfStrEq{\MotsCodesMaLettre}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{\StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}}}%
        }{%
          \IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{}}%
        }%%
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{%
        \xintifForFirst{}{&}
      }\\
      \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{%
        \xintifForFirst{}{&}\IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[MotsCodes]{Math}{\ListeMotsCodesTableau[##1,##2]}{\num{\ListeMotsCodesTableau[##1,##2]}}}%
      }\\
    }%
  \end{NiceTabular}%
}%

%%%
% Labyrinthe
%%%
\setKVdefault[Labyrinthe]{Lignes=6,Colonnes=3,Longueur=4,Hauteur=2,Passages=false,EcartH=1,EcartV=1,CouleurF=gray!50,Texte=\color{black},SensImpose=false,Slop}

\tikzset{FDirect/.style={-stealth}}
\tikzset{FIndirect/.style={stealth-}}
\tikzset{FBidirect/.style={stealth-stealth}}

\newcommand\Labyrinthe[3][]{%
  \useKVdefault[Labyrinthe]%
  \setKV[Labyrinthe]{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeLaby{#2}%
  \xdef\LabySlop{\ifboolKV[Labyrinthe]{Slop}{sloped}{}}%
  \ifboolKV[Labyrinthe]{Passages}{%
    \readlist*\ListeLabySol{#3}%
  }{}%
  \xdef\LabyLong{\useKV[Labyrinthe]{Longueur}}%
  \xdef\LabyHaut{\useKV[Labyrinthe]{Hauteur}}%
  \ifboolKV[Labyrinthe]{SensImpose}{%
    \xdef\TotalLaby{\fpeval{4*(\useKV[Labyrinthe]{Colonnes}-1)+1}}%
  }{%
    \xdef\TotalLaby{\fpeval{3*\useKV[Labyrinthe]{Colonnes}-2}}%
  }%
  \xdef\CouleurF{\useKV[Labyrinthe]{CouleurF}}%
  \xdef\MotifTexte{\noexpand\useKV[Labyrinthe]{Texte}}%
  \xintifboolexpr{\ListeLabylen==\fpeval{\useKV[Labyrinthe]{Lignes}*\useKV[Labyrinthe]{Colonnes}}}{%
    \begin{tikzpicture}[remember picture]%
%      % on dessine les cadres
      \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{%
        \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{%
          \xdef\ColorFill{\ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},2]}%
          \node[fill=\ColorFill,draw,minimum height=\LabyHaut*1cm,minimum width=\LabyLong*1cm,name=A-\compteurh-\compteurv] at
          (\fpeval{\LabyLong+\useKV[Labyrinthe]{EcartH}}*\compteurh,-\fpeval{\LabyHaut+\useKV[Labyrinthe]{EcartV}}*\compteurv) {\ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},1]};%
        }%
      }%
      % fin des cadres
      % on dessine les fl\`eches
      \ifboolKV[Labyrinthe]{SensImpose}{%
        %verticales
        \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{%
          \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},1]}%
              \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}%
                \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,midway,inner sep=2pt]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});}{}%
            }{%
              \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});%
            }%
          }%
        }%
%        % horizontales
        \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},1]}%
              \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}%
              \draw[\CouleurF,line width=3pt,\NomStyle](A-\compteurh-\compteurv) -- node[fill=white,midway,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv);}{}
            }{%
              \draw[\CouleurF,line width=3pt,FBidirect](A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv);%
            }%
          }%
        }%
%        % diagonales "inverses"
        \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},1]}%
              \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}%
                \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1});
              }{}
            }{%
              \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1});
            }%
          }%
        }%
%%        % diagonales directes
        \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},1]}%
              \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]>0}{%
                \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}
                \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1});
              }{}%
            }{%
              \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1});
            }%          
          }%
        }%
      }{%
        \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{%
          \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)}]}%
              \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});%
            }{%
              \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});%
            }%
          }%
        }%
        \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\compteurh}]}%
              \draw[\CouleurF,line width=3pt,stealth-stealth]
              (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv);
            }{%
              \draw[\CouleurF,line width=3pt,stealth-stealth]
              (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv);
            }%
          }
        }
        \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1});
          }
        }
        \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{%
          \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{%
            \ifboolKV[Labyrinthe]{Passages}{%
              \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)+1}]}%
              \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1});
            }{%
              \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1});
            }%          
          }%
        }%
%      % fin des fl\`eches
    }
  \end{tikzpicture}
   }{
  \textbf{! Le nombre d'informations n'est pas compatible avec les
    d\'efinitions de {\ttfamily Colonnes} et {\ttfamily Lignes} !}}%
}

%%%
% Triominos
%%%
\setKVdefault[ClesTriomino]{Longueur=5cm,Etages=3,Ecart=0.6,AffichagePiece=false,Hexagone=false,Recapitulatif=false,Colonnes=2}%
\defKV[ClesTriomino]{Piece=\setKV[ClesTriomino]{AffichagePiece=true}}%

\def\TraceTriomino#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesTriomino]{Longueur};
    Rayon:=0.75*u*sqrt(3)/6;
    Etages:=\useKV[ClesTriomino]{Etages};
    pair A,B,C,D,E,F;
    A=(0,0);
    B-A=Etages*u*(1,0);
    C=rotation(B,A,60);
    D=(1/Etages)[C,A];
    E=(1/Etages)[C,B];
    F=C;
    trace polygone(A,B,C);
    for k=1 upto Etages-1:
    trace (k/Etages)[C,A]--(k/Etages)[C,B];
    trace (k/Etages)[A,C]--(k/Etages)[A,B];
    trace (k/Etages)[B,A]--(k/Etages)[B,C];
    endfor;
    pair G[];color H[];%Couleur pour garder l'orientation des textes...
    G[1]=iso(D,E,F);
    H1=blue;
    n=1;
    for k=1 upto Etages-1:
    for l=0 upto (2*k):
    n:=n+1;
    if (l mod 2=0):
    G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D));
    H[n]=blue;
    else:
    G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D));
    H[n]=green;
    fi;
    endfor;
    endfor;
    % affichage des textes
    nba=0;
    for p_=#1:
    if (nba mod 3)=1:
    if H[(nba div 3)+1]=blue:
    label(TEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30));
    else:
    label(TEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90));
    fi;
    elseif (nba mod 3)=2:
    if H[(nba div 3)+1]=blue:
    label(TEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270));
    else:
    label(TEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330));
    fi;
    else:
    if H[(nba div 3)+1]=blue:
    label(TEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150));
    else:
    label(TEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210));
    fi;
    fi;
    nba:=nba+1;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur}; Etages:=\useKV[ClesTriomino]{Etages};}]
    Rayon:=0.75*u*sqrt(3)/6;
    pair A,B,C,D,E,F;
    A=(0,0);
    B-A=Etages*u*(1,0);
    C=rotation(B,A,60);
    D=(1/Etages)[C,A];
    E=(1/Etages)[C,B];
    F=C;
    trace polygone(A,B,C);
    for k=1 upto Etages-1:
    trace (k/Etages)[C,A]--(k/Etages)[C,B];
    trace (k/Etages)[A,C]--(k/Etages)[A,B];
    trace (k/Etages)[B,A]--(k/Etages)[B,C];
    endfor;
    pair G[];color H[];%Couleur pour garder l'orientation des textes...
    G[1]=iso(D,E,F);
    H1=blue;
    n=1;
    for k=1 upto Etages-1:
    for l=0 upto (2*k):
    n:=n+1;
    if (l mod 2=0):
    G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D));
    H[n]=blue;
    else:
    G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D));
    H[n]=green;
    fi;
    endfor;
    endfor;
    % affichage des textes
    nba=0;
    for p_=#1:
    if (nba mod 3)=1:
    if H[(nba div 3)+1]=blue:
    label(LATEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30));
    else:
    label(LATEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90));
    fi;
    elseif (nba mod 3)=2:
    if H[(nba div 3)+1]=blue:
    label(LATEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270));
    else:
    label(LATEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330));
    fi;
    else:
    if H[(nba div 3)+1]=blue:
    label(LATEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150));
    else:
    label(LATEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210));
    fi;
    fi;
    nba:=nba+1;
    endfor;    
  \end{mpost}
  \fi
}

\def\TraceTriominoHexa#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesTriomino]{Longueur};
    RayonCercle:=u;
    Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6;
    pair O,A,B,C,D,E,F,G,H[],I[];
    O=(0,0);
    path cc;
    cc=cercles(O,RayonCercle);
    A=pointarc(cc,0);
    B=rotation(A,O,60);
    C=rotation(B,O,60);
    D=rotation(C,O,60);
    E=rotation(D,O,60);
    F=rotation(E,O,60);
    G=rotation(F,O,60);
    H1=iso(A,B);
    H2=iso(B,C);
    H3=iso(C,D);
    H4=iso(D,E);
    H5=iso(E,F);
    H6=iso(F,A);
    I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60));
    I2=symetrie(I1,C,F);
    I3=symetrie(I2,1/2[B,C],1/2[D,E]);
    I4=symetrie(I3,1/2[B,C],1/2[F,A]);
    I5=symetrie(I4,B,E);
    I6-I1=0.5*(D-C);
    I7-I2=0.5*(D-C);
    I8-I3=0.5*(D-C);
    I9-I4=0.5*(D-C);
    I10-I5=0.5*(D-C);
    I11=symetrie(I10,1/2[C,B],1/2[F,A]);
    I12=symetrie(I11,1/2[A,B],1/2[E,F]);
    I13=symetrie(I6,A,D);
    I14=symetrie(I7,A,D);
    I15=symetrie(I8,A,D);
    I16=symetrie(I9,A,D);
    I17=symetrie(I10,A,D);
    I18=symetrie(I11,A,D);
    I19=symetrie(I12,A,D);
    I20=symetrie(I1,A,D);
    I21=symetrie(I2,A,D);
    I22=symetrie(I3,A,D);
    I23=symetrie(I4,A,D);
    I24=symetrie(I5,A,D);
    trace polygone(A,B,C,D,E,F);
    trace polygone(H1,H3,H5);
    trace polygone(H2,H4,H6);
    trace segment(A,D);
    trace segment(B,E);
    trace segment(C,F);
    color N[];%Couleur pour garder l'orientation des textes...
    N1=blue;
    for l=2 upto 5:
    if (l mod 2=0):
    N[l]=green;
    else:
    N[l]=blue;
    fi;
    endfor;
    for l=6 upto 12:
    if (l mod 2=0):
    N[l]=blue;
    else:
    N[l]=green;
    fi;
    endfor;
    for l=13 upto 19:
    if (l mod 2=0):
    N[l]=blue;
    else:
    N[l]=green;
    fi;
    endfor;
    for l=20 upto 24:
    if (l mod 2=0):
    N[l]=green;
    else:
    N[l]=blue;
    fi;
    endfor;
    % affichage des textes
    nba=0;
    for p_=#1:
    if (nba mod 3)=1:
    if N[(nba div 3)+1]=blue:
    label(TEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30));
    else:
    label(TEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90));
    fi;
    elseif (nba mod 3)=2:
    if N[(nba div 3)+1]=blue:
    label(TEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270));
    else:
    label(TEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330));
    fi;
    else:
    if N[(nba div 3)+1]=blue:
    label(TEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150));
    else:
    label(TEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210));
    fi;
    fi;
    nba:=nba+1;
    endfor;
  \end{mplibcode}
  \else
    \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur};RayonCercle:=u; Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6;}]
    pair O,A,B,C,D,E,F,G,H[],I[];
    O=(0,0);
    path cc;
    cc=cercles(O,RayonCercle);
    A=pointarc(cc,0);
    B=rotation(A,O,60);
    C=rotation(B,O,60);
    D=rotation(C,O,60);
    E=rotation(D,O,60);
    F=rotation(E,O,60);
    G=rotation(F,O,60);
    H1=iso(A,B);
    H2=iso(B,C);
    H3=iso(C,D);
    H4=iso(D,E);
    H5=iso(E,F);
    H6=iso(F,A);
    I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60));
    I2=symetrie(I1,C,F);
    I3=symetrie(I2,1/2[B,C],1/2[D,E]);
    I4=symetrie(I3,1/2[B,C],1/2[F,A]);
    I5=symetrie(I4,B,E);
    I6-I1=0.5*(D-C);
    I7-I2=0.5*(D-C);
    I8-I3=0.5*(D-C);
    I9-I4=0.5*(D-C);
    I10-I5=0.5*(D-C);
    I11=symetrie(I10,1/2[C,B],1/2[F,A]);
    I12=symetrie(I11,1/2[A,B],1/2[E,F]);
    I13=symetrie(I6,A,D);
    I14=symetrie(I7,A,D);
    I15=symetrie(I8,A,D);
    I16=symetrie(I9,A,D);
    I17=symetrie(I10,A,D);
    I18=symetrie(I11,A,D);
    I19=symetrie(I12,A,D);
    I20=symetrie(I1,A,D);
    I21=symetrie(I2,A,D);
    I22=symetrie(I3,A,D);
    I23=symetrie(I4,A,D);
    I24=symetrie(I5,A,D);
    trace polygone(A,B,C,D,E,F);
    trace polygone(H1,H3,H5);
    trace polygone(H2,H4,H6);
    trace segment(A,D);
    trace segment(B,E);
    trace segment(C,F);
    color N[];%Couleur pour garder l'orientation des textes...
    N1=blue;
    for l=2 upto 5:
    if (l mod 2=0):
    N[l]=green;
    else:
    N[l]=blue;
    fi;
    endfor;
    for l=6 upto 12:
    if (l mod 2=0):
    N[l]=blue;
    else:
    N[l]=green;
    fi;
    endfor;
    for l=13 upto 19:
    if (l mod 2=0):
    N[l]=blue;
    else:
    N[l]=green;
    fi;
    endfor;
    for l=20 upto 24:
    if (l mod 2=0):
    N[l]=green;
    else:
    N[l]=blue;
    fi;
    endfor;
    % affichage des textes
    nba=0;
    for p_=#1:
    if (nba mod 3)=1:
    if N[(nba div 3)+1]=blue:
    label(LATEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30));
    else:
    label(LATEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90));
    fi;
    elseif (nba mod 3)=2:
    if N[(nba div 3)+1]=blue:
    label(LATEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270));
    else:
    label(LATEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330));
    fi;
    else:
    if N[(nba div 3)+1]=blue:
    label(LATEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150));
    else:
    label(LATEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210));
    fi;
    fi;
    nba:=nba+1;
    endfor;
  \end{mpost}
  \fi
}

\newtoks\toklisteTriomino%
\def\UpdatetoksTriomino#1\nil{\addtotok\toklisteTriomino{"#1",}}%
  
\newcommand\Triomino[2][]{%
  \useKVdefault[ClesTriomino]%
  \setKV[ClesTriomino]{#1}%
  \setsepchar{§}%\ignoreemptyitems%
  \readlist*\ListeTriominos{#2}%
  \toklisteTriomino{}%
  \ifboolKV[ClesTriomino]{Recapitulatif}{%
    %\begin{longtable}{|>{\centering}p{0.45\linewidth}|p{0.45\linewidth}|}
    %  \hline
    %  \xintFor* ##1 in {\xintSeq{1}{\ListeTriominoslen}}\do{
    %    &\\
    %    &\\
    %    \ListeTriominos[##1]&\\
    %    &\\
    %    &\\
    %    \hline
    %  }%
    %\end{longtable}
  }{%
    \ifboolKV[ClesTriomino]{AffichagePiece}{%
      \setKV[ClesTriomino]{Etages=1}%
      \TraceTriomino{"\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-2}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-1}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}}]"}%
    }{%
      \foreachitem\compteur\in\ListeTriominos{\expandafter\UpdatetoksTriomino\compteur\nil}%
      \ifboolKV[ClesTriomino]{Hexagone}{%
        \TraceTriominoHexa{\the\toklisteTriomino}%
      }{%
        \TraceTriomino{\the\toklisteTriomino}%
      }%
    }%
  }%
}%

%%%
% Labyrinthe Nombre
%%%
\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue}

\newcommand\LabyNombre[1][]{%
  \useKVdefault[ClesLabyNb]%
  \setKV[ClesLabyNb]{#1}%
  \ifboolKV[ClesLabyNb]{Solution}{%
    \TraceSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}
  }{%
    \TraceLabyNombre{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}
  }%
}

\newcommand\TraceLabyNombre[6]{%
  \mplibforcehmode%
  \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
  \begin{mplibcode}[\PfCNomLabyrinthe]
    input PfCLabyNombre;

    boolean Murs;
    Murs=\useKV[ClesLabyNb]{Murs};
    
    numeric Multiple;
    Multiple=#1;
    % Initialisation du labyrinthe
    InitialisationLabyrinthe(#2,#3);
    % On initialise les paramètres du parcours
    numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA;
    choixligneD=xpart(#4);
    choixcolonneD=ypart(#4);
    choixligneA=xpart(#5);
    choixcolonneA=ypart(#5);%
    pair Depart;
    Depart=N[choixligneD][choixcolonneD];
    pair Arrivee;
    Arrivee=N[choixligneA][choixcolonneA];
    pair Mobile;
    Mobile=Depart;
    RAZPileChemin;
    % Exploration du labyrinthe
    PushChemin((choixligneD,choixcolonneD));
    CaseExploree[choixligneD][choixcolonneD]:=true;
    VoisinDispo(choixligneD,choixcolonneD);
    forever: exitif Mobile=Arrivee;%nb=0;
    nb:=ceiling(uniformdeviate(nbvoisin));
    if nb>0:
      for k=1 upto nbvoisin:
        CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true;
      endfor;
      PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb])));
      Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])];
      VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin]));
    else:
      PopChemin;
    fi;
    endfor;
    % Affichagefinal
    % on sauvegarde les nombres aléatoires
    numeric NbAffiche[];
    numeric NbSol[];
    % on écrit des nombres au hasard, mais sans être multiple du nombre choisi
    numeric nbaffiche;
    nbaffiche=0;
    for k=0 upto LargeurLaby-1:
      for l=0 upto LongueurLaby-1:
        nbaffiche:=nbaffiche+1;
        NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
      endfor;
    endfor;
    % On crée des multiples du nombre choisi
    for k=2 upto indiceChemin-1:
      NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
    endfor;
    % On affiche
    picture Corps;
    Corps=image(
      nbaffiche:=0;
      for k=0 upto LargeurLaby-1:
        for l=0 upto LongueurLaby-1:
	  nbaffiche:=nbaffiche+1;
          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
        endfor;
      endfor;
      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
      for k=2 upto indiceChemin-1:
        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
      endfor;
      trace TraceLabyrinthe;
    );
    Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
    trace Corps;
  \end{mplibcode}
}

\newcommand\TraceSolution[6]{%
  \mplibforcehmode%
  \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
  \begin{mplibcode}[\PfCNomLabyrinthe]
    picture CorpsSolution;
    CorpsSolution=image(
      nbaffiche:=0;
      for k=0 upto #3-1:
        for l=0 upto #2-1:
          nbaffiche:=nbaffiche+1;
          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
        endfor;
      endfor;
      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
      for k=2 upto indiceChemin-1:
        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin};
        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
      endfor;
      trace TraceLabyrinthe;
      );
      CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
      trace CorpsSolution;
  \end{mplibcode}
}%

\newcommand\TraceLabyNombreold[6]{%
  \mplibforcehmode%
  \begin{mplibcode}
    input PfCLabyNombre;

    boolean Murs;
    Murs=\useKV[ClesLabyNb]{Murs};
    
    numeric Multiple;
    Multiple=#1;
    % Initialisation du labyrinthe
    InitialisationLabyrinthe(#2,#3);
    % On initialise les paramètres du parcours
    numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA;
    choixligneD=xpart(#4);
    choixcolonneD=ypart(#4);
    choixligneA=xpart(#5);
    choixcolonneA=ypart(#5);%
    pair Depart;
    Depart=N[choixligneD][choixcolonneD];
    pair Arrivee;
    Arrivee=N[choixligneA][choixcolonneA];
    pair Mobile;
    Mobile=Depart;
    RAZPileChemin;
    % Exploration du labyrinthe
    PushChemin((choixligneD,choixcolonneD));
    CaseExploree[choixligneD][choixcolonneD]:=true;
    VoisinDispo(choixligneD,choixcolonneD);
    forever: exitif Mobile=Arrivee;%nb=0;
    nb:=ceiling(uniformdeviate(nbvoisin));
    if nb>0:
      for k=1 upto nbvoisin:
        CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true;
      endfor;
      PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb])));
      Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])];
      VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin]));
    else:
      PopChemin;
    fi;
    endfor;
    % Affichagefinal
    % on sauvegarde les nombres aléatoires
    numeric NbAffiche[];
    numeric NbSol[];
    % on écrit des nombres au hasard, mais sans être multiple du nombre choisi
    numeric nbaffiche;
    nbaffiche=0;
    for k=0 upto LargeurLaby-1:
      for l=0 upto LongueurLaby-1:
        nbaffiche:=nbaffiche+1;
        NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
      endfor;
    endfor;
    % On crée des multiples du nombre choisi
    for k=2 upto indiceChemin-1:
      NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
    endfor;
    % On affiche
    picture Corps;
    Corps=image(
      nbaffiche:=0;
      for k=0 upto LargeurLaby-1:
        for l=0 upto LongueurLaby-1:
	  nbaffiche:=nbaffiche+1;
          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
        endfor;
      endfor;
      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
      for k=2 upto indiceChemin-1:
        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
      endfor;
      trace TraceLabyrinthe;
    );
    Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
    trace Corps;
  \end{mplibcode}
}

\newcommand\TraceSolutionold[6]{%
  \mplibforcehmode%
  \mplibcodeinherit{enable}
  \begin{mplibcode}
    picture CorpsSolution;
    CorpsSolution=image(
      nbaffiche:=0;
      for k=0 upto #3-1:
        for l=0 upto #2-1:
          nbaffiche:=nbaffiche+1;
          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
        endfor;
      endfor;
      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
      for k=2 upto indiceChemin-1:
        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor 0.5white;
        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
      endfor;
      trace TraceLabyrinthe;
      );
      CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
      trace CorpsSolution;
  \end{mplibcode}
  \mplibcodeinherit{disable}
}%

%%%
% Mots croisés
%%%
\setKVdefault[ClesCroises]{Lignes=6,Colonnes=8,Solution=false,Croises=false,Couleur=gray,Largeur=1em}

\newcounter{PfCLettreHorizontal}

\newcommand\MotsCroises[2][]{%
  \useKVdefault[ClesCroises]%
  \setKV[ClesCroises]{#1}%
  \setcounter{PfCLettreHorizontal}{0}%
  \setsepchar[*]{§*,*/}%
  \readlist*\ListeCasesCroises{#2}%
  \begin{NiceTabular}{*{\fpeval{\useKV[ClesCroises]{Colonnes}}}{p{\useKV[ClesCroises]{Largeur}}}}[first-row,first-col]%
    \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{%
      &\ifboolKV[ClesCroises]{Croises}{\stepcounter{PfCLettreHorizontal}\footnotesize\Alph{PfCLettreHorizontal}}{}
    }\\
    \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{%
      \ifboolKV[ClesCroises]{Croises}{\footnotesize##1}{}\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{%
        &\IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{%
        }{%
          \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{%
            \Block[draw,fill=black]{}{\PfCTBstrut}}{%
            \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{%
              \Block[draw,fill=\useKV[ClesCroises]{Couleur}]{}{%
                \PfCTBstrut\ifboolKV[ClesCroises]{Solution}{%
                  \ListeCasesCroises[##1,##2,2]%
                }{}%
              }
            }{%
              \Block[draw]{}{\PfCTBstrut\ifboolKV[ClesCroises]{Solution}{%
                  \ListeCasesCroises[##1,##2,2]}{}%
              }%
            }%
          }%
        }%
      }\\
    }%
    \CodeAfter
    \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{%
      \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{%
        \IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{%
        }{%
          \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{%
          }{%
            \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{%
            }{%
              \xintifboolexpr{\fpeval{\ListeCasesCroises[##1,##2,1]}>0}{\tikz\node[transform canvas={xshift=1mm,yshift=-1mm}] at (\fpeval{##1}-|\fpeval{##2}){\tiny\ListeCasesCroises[##1,##2,1]};}{}%
            }%
          }%
        }%
      }%
    }%
  \end{NiceTabular}%
  \setsepchar{,}%
}%


%%%
% Mots empilés
%%%
\setKVdefault[ClesMotEmpile]{Colonne=4,Solution=false,Couleur=black}

\newcounter{CompteurMotEmpile}

\newcommand\MotsEmpiles[2][]{%
  \useKVdefault[ClesMotEmpile]%
  \setKV[ClesMotEmpile]{#1}%
  \setcounter{CompteurMotEmpile}{0}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeMotsEmpiles{#2}
  \xdef\ListeMotsEmpilesMax{0}%
  \colorlet{MotEmpileCouleur}{\useKV[ClesMotEmpile]{Couleur}}%
  \foreachitem\compteur\in\ListeMotsEmpiles{%
    \StrLen{\ListeMotsEmpiles[\compteurcnt,2]}[\LongueurMot]%
    \xintifboolexpr{\ListeMotsEmpilesMax<\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}{\xdef\ListeMotsEmpilesMax{\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}}{}%
  }%
  \begin{NiceTabular}{c|*{\fpeval{\ListeMotsEmpilesMax}}{m{0.5em}}}
    \Block{1-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}}{}\xintFor* ##1 in {\xintSeq {1}{\fpeval{\useKV[ClesMotEmpile]{Colonne}}}}\do{&}&$\downarrow$\xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpilesMax-\useKV[ClesMotEmpile]{Colonne}-1}}}\do{&}\\
    \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpileslen}}}\do{%
      \rule[-1.2ex]{0pt}{3.8ex}\stepcounter{CompteurMotEmpile}\Alph{CompteurMotEmpile}&\Block{1-\fpeval{\ListeMotsEmpiles[##1,1]}}{}\xintFor* ##2 in {\xintSeq {1}{\fpeval{\ListeMotsEmpiles[##1,1]}}}\do{%
        &
      }%
      \StrLen{\ListeMotsEmpiles[##1,2]}[\LongueurMot]%
      \xintFor* ##3 in {\xintSeq {1}{\fpeval{\LongueurMot}}}\do{%
        \xintifForFirst{}{&}\Block[draw=black]{1-1}{\ifboolKV[ClesMotEmpile]{Solution}{\centering\arraybackslash\StrMid{\ListeMotsEmpiles[##1,2]}{##3}{##3}}{}}%%
      }
      \\
    }%
    \CodeAfter\tikz\draw[line width=1.5pt,MotEmpileCouleur](row-2-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}) rectangle (row-\fpeval{\ListeMotsEmpileslen+2}-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+3});
  \end{NiceTabular}
}%

%%% Colorilude %%%
\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false}

\newcommand\dispogpfc[3][]{%
  \setbox1=\hbox{#2}%
  \setbox2=\hbox{#3}%
  \begin{minipage}{\wd2}%
    #3%
  \end{minipage}%
  \quad%
  \begin{minipage}{\wd1}%
    #2%
  \end{minipage}%
}%

\newcommand\TraceEchiquierColorilude{%
  \ifluatex
  \begin{mplibcode}
    pair A,B,C,D;%pour la grille
    A=(0,0);
    B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0);
    C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes});
    D-C=A-B;
    nblargeur=\useKV[Colorilude]{Largeur};
    nblignes=\useKV[Colorilude]{Lignes};
    for k=1 upto nblargeur-1:
    draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C];
    endfor;
    for k=1 upto nblignes-1:
    draw (k/nblignes)[A,D]--(k/nblignes)[B,C];
    endfor;
    draw polygone(A,B,C,D) withpen pensquare scaled 1.5;
    if \useKV[Colorilude]{Legende}:
    label.lrt(btex \tiny d'après APMEP etex rotated 90,B);
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={boolean Legende;
      Legende=\useKV[Colorilude]{Legende};
      nblargeur:=\useKV[Colorilude]{Largeur};
      nblignes:=\useKV[Colorilude]{Lignes};
      coef:=\useKV[Colorilude]{Coef};}]
    pair A,B,C,D;%pour la grille
    A=(0,0);
    B-A=u*coef*(nblargeur,0);
    C-B=u*coef*(0,-nblignes);
    D-C=A-B;
    for k=1 upto nblargeur-1:
    draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C];
    endfor;
    for k=1 upto nblignes-1:
    draw (k/nblignes)[A,D]--(k/nblignes)[B,C];
    endfor;
    draw polygone(A,B,C,D) withpen pensquare scaled 1.5;
    if Legende:
    label.lrt(\btex \tiny d'après APMEP etex rotated 90,B);
    fi;
  \end{mpost}
  \fi
}%

\newcommand\TraceEchiquierColoreColorilude{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}
    pair A,B,C,D;%pour la grille
    A=(0,0);
    B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0);
    C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes});
    D-C=A-B;
    numeric nblargeur,nblignes;
    nblargeur:=\useKV[Colorilude]{Largeur};
    nblignes:=\useKV[Colorilude]{Lignes};
    % on récupère les données de coloriage
    numeric n;
    n:=0;
    numeric nbCases[];
    color ColorSucc[];
    for p_=\the\toklisteremplissage:
    n:=n+1;
    if (n mod 2)=0:
    nbCases[n div 2]:=p_;
    else:
    ColorSucc[n div 2]:=p_;
    fi;
    endfor;
    % on colorie :)
    numeric NBCASES;
    NBCASES:=0;
    for l=1 upto (n div 2):
    fill ((unitsquare xscaled (\useKV[Colorilude]{Coef}*u*nbCases[l]) yscaled (\useKV[Colorilude]{Coef}*u)) shifted(\useKV[Colorilude]{Coef}*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1];
    NBCASES:=NBCASES+nbCases[l];
    endfor;
    % on trace le quadrillage
    for k=1 upto nblargeur-1:
    draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C];
    endfor;
    for k=1 upto nblignes-1:
    draw (k/nblignes)[A,D]--(k/nblignes)[B,C];
    endfor;
    draw polygone(A,B,C,D) withpen pensquare scaled 1.5;
    if \useKV[Colorilude]{Legende}:
    label.lrt(btex \tiny d'après APMEP etex rotated 90,B);
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={boolean Legende;
      Legende=\useKV[Colorilude]{Legende};
      nblargeur:=\useKV[Colorilude]{Largeur};
      nblignes:=\useKV[Colorilude]{Lignes};
      coef:=\useKV[Colorilude]{Coef};
      numeric n;
      n:=0;
      numeric nbCases[];
      color ColorSucc[];
      for p_=\the\toklisteremplissage:
      n:=n+1;
      if (n mod 2)=0:
      nbCases[n div 2]:=p_;
      else:
      ColorSucc[n div 2]:=p_;
      fi;
      endfor;
    }]
    pair A,B,C,D;%pour la grille
    A=(0,0);
    B-A=u*coef*(nblargeur,0);
    C-B=u*coef*(0,-nblignes);
    D-C=A-B;
    % on colorie :)
    numeric NBCASES;
    NBCASES:=0;
    for l=1 upto (n div 2):
    fill ((unitsquare xscaled (coef*u*nbCases[l]) yscaled (coef*u)) shifted(coef*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1];
    NBCASES:=NBCASES+nbCases[l];
    endfor;
    % on trace le quadrillage
    for k=1 upto nblargeur-1:
    draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C];
    endfor;
    for k=1 upto nblignes-1:
    draw (k/nblignes)[A,D]--(k/nblignes)[B,C];
    endfor;
    draw polygone(A,B,C,D) withpen pensquare scaled 1.5;
    if Legende:
    label.lrt(\btex \tiny d'après APMEP etex rotated 90,B);
    fi;
  \end{mpost}
  \fi
}%

\newtoks\toklisteremplissage%
\toklisteremplissage{}%
\def\UpdateRemplissage#1\nil{\addtotok\toklisteremplissage{#1,}}%

\newcommand\ColoriludeEnonce{%
Pour chaque ligne de la grille, colorie de gauche à droite, de la
couleur indiquée, le nombre de cases donné par le résultat du calcul.
}%

\newcommand\ColoriludeListeCouleur[1]{%
  \setsepchar{ }%
  \readlist\ListeColoriludeCouleurs{#1}%
  \foreachitem\compteur\in\ListeColoriludeCouleurs{%
     \ifodd\compteurcnt\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\compteur}\end{minipage}}~\else\compteur\quad\fi%
  }%
}%

\newcommand\Colorilude[2][]{%
  \useKVdefault[Colorilude]%
  \setKV[Colorilude]{#1}%
  \setsepchar{\\/ }%
  \readlist\ListeColorilude{#2}%
  \ifboolKV[Colorilude]{Solution}{%
    \toklisteremplissage{}%
    \foreachitem\compteur\in\ListeColorilude{%
      \foreachitem\couleur\in\ListeColorilude[\compteurcnt]{%
        \expandafter\UpdateRemplissage\couleur\nil}%
    }%
    \TraceEchiquierColoreColorilude%
  }{%
    \dispogpfc{%
      \TraceEchiquierColorilude%
    }{%
      % On cherche le nombre max de colonnes
      \xdef\ListeColoriludeMax{0}%
      \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{%
        \xintifboolexpr{\listlen\ListeColorilude[##1]>\ListeColoriludeMax}{%
          \xdef\ListeColoriludeMax{\listlen\ListeColorilude[##1]}%
        }{}%
      }%
      % 
      % On affiche le tableau
      \setlength{\tabcolsep}{0.2\tabcolsep}%
      \begin{NiceTabular}{*{\fpeval{\ListeColoriludeMax/2}}{rl}}%
        \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{%
          \xintifboolexpr{\listlen\ListeColorilude[##1]==\ListeColoriludeMax}{%
            \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{%
              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi%
            }%
          }{%
            \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{%
              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi%
            }%
            &\hbox to1em{~}&\Cdots%
          }%
          \\[0.5em]%
        }%
      \end{NiceTabular}%
    }%
  }%
}%

%%%
% Mosaique
%%%
\setKVdefault[ClesMosaique]{Largeur=2,Hauteur=2,Solution=false,Type=1,Label,Echelle=1cm}

\newcommand\DessineMosaique[2][]{%
  \useKVdefault[ClesMosaique]%
  \setKV[ClesMosaique]{#1}%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}
    u:=\useKV[ClesMosaique]{Echelle};
    Type:=\useKV[ClesMosaique]{Type};
    input PfCMosaique;
    trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi;
  \end{mplibcode}%
  \else%
  \begin{mpost}[mpsettings={u:=\useKV[ClesMosaique]{Echelle};Type:=\useKV[ClesMosaique]{Type};}]%
    input PfCMosaique;
    trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi;
  \end{mpost}%
  \fi%
}%

\newcommand\DessineMosaiqueComplet[1]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCMosaique;
    Largeur=\useKV[ClesMosaique]{Largeur};
    Hauteur=\useKV[ClesMosaique]{Hauteur};
    Type=\useKV[ClesMosaique]{Type};
    boolean Solution,Label;
    Solution=\useKV[ClesMosaique]{Solution};
    Label=\useKV[ClesMosaique]{Label};
    pair A,B,C,D;
    A=u*(0,1);
    B-A=u*(Largeur,0);
    C-B=u*(0,-Hauteur);
    D-C=A-B;
    picture mosaique;
    path case;
    case=unitsquare scaled 1cm;
    if Type=1:
    mosaique=image(
    trace case withcolor 0.5white;
    trace (point(0) of case)--(point(2) of case) withcolor 0.75white;
    trace (point(1) of case)--(point(3) of case) withcolor 0.75white;
    trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white;
    trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white;
    );
    else:
    mosaique=image(
    trace case withcolor 0.5white;
    trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white;
    trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white;
    trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white;
    );
    fi;
    if Solution:
    nbmos:=0;
    for p_=#1:
    trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)));
    nbmos:=nbmos+1;
    endfor;
    else:
    nbmos:=0;
    for p_=#1:
    trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)));
    if Label:
    label(TEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique  shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)))));
    fi;
    nbmos:=nbmos+1;
    endfor;
    fi;
    trace polygone(A,B,C,D);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={Largeur=\useKV[ClesMosaique]{Largeur};Hauteur=\useKV[ClesMosaique]{Hauteur};Type=\useKV[ClesMosaique]{Type};boolean Solution,Label;Solution=\useKV[ClesMosaique]{Solution};}]
    Label=\useKV[ClesMosaique]{Label};
    input PfCMosaique;
    pair A,B,C,D;
    A=u*(0,1);
    B-A=u*(Largeur,0);
    C-B=u*(0,-Hauteur);
    D-C=A-B;
    picture mosaique;
    path case;
    case=unitsquare scaled 1cm;
    if Type=1:
    mosaique=image(
    trace case withcolor 0.5white;
    trace (point(0) of case)--(point(2) of case) withcolor 0.75white;
    trace (point(1) of case)--(point(3) of case) withcolor 0.75white;
    trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white;
    trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white;
    );
    else:
    mosaique=image(
    trace case withcolor 0.5white;
    trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white;
    trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white;
    trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white;
    );
    fi;
    if Solution:
    nbmos:=0;
    for p_=#1:
    trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)));
    nbmos:=nbmos+1;
    endfor;
    else:
    nbmos:=0;
    for p_=#1:
    trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)));
    if Label:
    label(LATEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique  shifted(u*(nbmos mod Largeur,-(nbmos div Largeur)))));
    fi;
    nbmos:=nbmos+1;
    endfor;
    fi;
    trace polygone(A,B,C,D);
  \end{mpost}
  \fi
}%
    
\newtoks\toklistecaseM%
\def\UpdatetoksMosaique#1/#2\nil{\addtotok\toklistecaseM{(#1,#2),}}%

\newcommand\Mosaique[2][]{%
  \useKVdefault[ClesMosaique]%
  \setKV[ClesMosaique]{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeMosaique{#2}%
  \toklistecaseM{}%
  \foreachitem\compteur\in\ListeMosaique{\expandafter\UpdatetoksMosaique\compteur\nil}%
  \DessineMosaiqueComplet{\the\toklistecaseM}%
}%

%%%
% Qui suis-je
%%%
\setKVdefault[Quisuisje]{Solution=false,Largeur=5mm,Colonnes=5,CodePerso=false,TexteA=Lettre,TexteB=R\'esultat du calcul}%

\newcommand\QuisuisjeEnonce{%
  Chaque lettre du mot à découvrir porte un numéro qui correspond à un
  calcul à effectuer. Pour trouver les lettres de ce mot, tu dois donc
  effectuer les calculs proposés. Les résultats que tu auras trouvés
  te donneront, à l'aide du tableau de correspondance ci-dessous, les
  lettres du mot.
}%

\newcommand\QuisuisjeTableau[2][]{%
  \setKV[Quisuisje]{#1}%
  \setsepchar[*]{§*/}\ignoreemptyitems%
  \readlist*\ListeQuisuisje{#2}%
  \begin{NiceTabular}{|l|*{\ListeQuisuisjelen}{m{\useKV[Quisuisje]{Largeur}}|}}%
    \hline
    \useKV[Quisuisje]{TexteA}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{%
      &\centering\arraybackslash\ListeQuisuisje[##1,1]
    }\\
    \hline
    \useKV[Quisuisje]{TexteB}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{%
      &\centering\arraybackslash\ListeQuisuisje[##1,2]
    }\\
    \hline
  \end{NiceTabular}%
}%

\newcommand\QuisuisjeCodePerso[3][]{%
  \setKV[Quisuisje]{#1}%
  \setsepchar{ }%
  \readlist*\ListeQuisuisjeCode{#2}%
  \readlist*\ListeQuisuisjeLettres{#3}%
  \par\hfill%
  \begin{NiceTabular}{|*{\ListeQuisuisjeLettreslen}{m{7mm}|}}
    \hline
    \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{%
      \xintifForFirst{}{&}\ifboolKV[Quisuisje]{Solution}{\hfill\ListeQuisuisjeLettres[##1]}{\phantom{1}}
    }\\
    \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{%
      \xintifForFirst{}{&}\tiny\ListeQuisuisjeCode[##1]%
    }\\
    \hline
  \end{NiceTabular}%
}%

\newcommand\Quisuisje[3][]{%
  \useKVdefault[Quisuisje]%
  \setKV[Quisuisje]{#1}%
  \ifboolKV[Quisuisje]{CodePerso}{}{%
    \setsepchar{ }%
    \readlist\ListeLettres{#3}%
  }%
  \setsepchar{§}%
  \readlist\ListeCalculs{#2}%
  \ifboolKV[Quisuisje]{CodePerso}{}{%
    \par\hfill%
    \begin{NiceTabular}{|*{\ListeLettreslen}{m{7mm}|}}
      \hline
      \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{%
        \xintifForFirst{}{&} \ifboolKV[Quisuisje]{Solution}{\hfill\ListeLettres[##1]}{\phantom{1}}
      }\\
      \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{%
        \xintifForFirst{}{&}\tiny\num{##1}%
      }\\
      \hline
    \end{NiceTabular}%
  }%
  \par\bigskip\par
  \ifboolKV[Quisuisje]{Solution}{}{%
    \begin{multicols}{\useKV[Quisuisje]{Colonnes}}%
      \begin{enumerate}
        \xintFor* ##1 in {\xintSeq {1}{\ListeCalculslen}}\do{%
        \item\ListeCalculs[##1]
        }
      \end{enumerate}%
    \end{multicols}%
  }%
}%

%%% Dessin Gradue %%%
\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false}

\def\TraceDessinGradue#1#2#3#4{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair La,Lb,Lab[];
    La=(0,0);
    Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
    for k=0 upto #4:
    Lab[k]=(k/#4)[La,Lb];
    endfor;
    picture EnsembleLignes,Lignes;
    Lignes=image(
    trace segment(La,Lb);
    for k=0 upto #4:
    trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(TEX("\num{"&decimal(#2)&"}"),La);
    label.top(TEX("\num{"&decimal(#3)&"}"),Lb);
    labeloffset:=labeloffset/1.5;
    );
    EnsembleLignes=image(
    for k=0 upto #1-1:
    trace Lignes shifted(k*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    label(TEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*\useKV[DessinGradue]{EcartVertical}));
    endfor;
    );
    trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}]
    pair La,Lb,Lab[];
    La=(0,0);
    Lb-La=u*(LongueurLigne,0);
    for k=0 upto #4:
    Lab[k]=(k/#4)[La,Lb];
    endfor;
    picture EnsembleLignes,Lignes;
    Lignes=image(
    trace segment(La,Lb);
    for k=0 upto #4:
    trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(LATEX("\num{"&decimal(#2)&"}"),La);
    label.top(LATEX("\num{"&decimal(#3)&"}"),Lb);
    labeloffset:=labeloffset/1.5;
    );
    EnsembleLignes=image(
    for k=0 upto #1-1:
    trace Lignes shifted(k*u*(0,-EcartVertical));
    label(LATEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,-k*EcartVertical));
    endfor;
    );
    trace EnsembleLignes scaled Echelle;
  \end{mpost}
  \fi
}

\def\TraceDessinGradueSolution#1#2#3#4#5#6{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair La,Lb,Lab[];
    pair 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,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',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'';
    La=(0,0);
    Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
    for k=0 upto #4:
    Lab[k]=(k/#4)[La,Lb];
    endfor;
    picture EnsembleLignes,Lignes;
    Lignes=image(
    trace segment(La,Lb);
    for k=0 upto #4:
    trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(TEX("\num{"&decimal(#2)&"}"),La);
    label.top(TEX("\num{"&decimal(#3)&"}"),Lb);
    labeloffset:=labeloffset/1.5;
    );
    EnsembleLignes=image(%
    drawoptions(withcolor 0.5white);
    for k=0 upto #1-1:
    trace Lignes shifted(k*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    label(TEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,k*(-\useKV[DessinGradue]{EcartVertical})));
    endfor;
    drawoptions();
    n:=0;
    numeric nblignes,nbpas;
    for p_=#5:
    n:=n+1;
    if (n mod 3)=1:
    nblignes:=p_;
    elseif (n mod 3)=2:
    nbpas:=p_;
    elseif (n mod 3)=0:
    p_=(nbpas/#4)[La,Lb] shifted(u*(0,(nblignes-1)*(-\useKV[DessinGradue]{EcartVertical})));
    fi;
    endfor;
    for p_=#6:
    trace p_ withpen pencircle scaled 1.5;
    endfor;
    );
    trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}]
    pair La,Lb,Lab[];
    pair 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,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',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'';
    La=(0,0);
    Lb-La=u*(LongueurLigne,0);
    for k=0 upto #4:
    Lab[k]=(k/#4)[La,Lb];
    endfor;
    picture EnsembleLignes,Lignes;
    Lignes=image(
    trace segment(La,Lb);
    for k=0 upto #4:
    trace (Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(LATEX("\num{"&decimal(#2)&"}"),La);
    label.top(LATEX("\num{"&decimal(#3)&"}"),Lb);
    labeloffset:=labeloffset/1.5;
    );
    EnsembleLignes=image(
    drawoptions(withcolor 0.5white);
    for k=0 upto #1-1:
    trace Lignes shifted(k*u*(0,-EcartVertical));
    label(LATEX("(\num{"&decimal(k+1)&"})"),La+u*(-1.5,k*(-EcartVertical)));
    endfor;
    drawoptions();
    n:=0;
    numeric nblignes,nbpas;
    for p_=#5:
    n:=n+1;
    if (n mod 3)=1:
    nblignes:=p_;
    elseif (n mod 3)=2:
    nbpas:=p_;
    elseif (n mod 3)=0:
    p_=(nbpas/#4)[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical)));
    fi;
    endfor;
    for p_=#6:
    trace p_ withpen pencircle scaled 1.5;
    endfor;
    );
    trace EnsembleLignes scaled Echelle;
  \end{mpost}
  \fi
}

\def\TraceDessinGradueMul#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair La,Lb,Lab[];
    La=(0,0);
    Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
    picture EnsembleLignes,Lignes;
    EnsembleLignes=image(
    n:=0;
    m:=0;
    for p_=#1:
    n:=n+1;
    trace segment(La,Lb) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    label(TEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical}));
    for k=0 upto bluepart(p_):
    m:=bluepart(p_);
    Lab[k]:=(k/m)[La,Lb];
    trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})));
    label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})));
    labeloffset:=labeloffset/1.5;
    endfor;
    );
    trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}]
    pair La,Lb,Lab[];
    La=(0,0);
    Lb-La=u*(LongueurLigne,0);
    picture EnsembleLignes,Lignes;
    EnsembleLignes=image(
    n:=0;
    m:=0;
    for p_=#1:
    n:=n+1;
    trace segment(La,Lb) shifted((n-1)*u*(0,-EcartVertical));
    for k=0 upto bluepart(p_):
    m:=bluepart(p_);
    Lab[k]:=(k/m)[La,Lb];
    trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-EcartVertical));
    label(LATEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical}));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(LATEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical)));
    label.top(LATEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical)));
    labeloffset:=labeloffset/1.5;
    endfor;
    );
    trace EnsembleLignes scaled Echelle;
  \end{mpost}
  \fi
}

\def\TraceDessinGradueMulSolution#1#2#3{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair La,Lb,Lab[];
    pair 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,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',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'';
    La=(0,0);
    Lb-La=u*(\useKV[DessinGradue]{Longueur},0);
    picture EnsembleLignes,Lignes;
    EnsembleLignes=image(%
    drawoptions(withcolor 0.5white);
    n:=0;
    m:=0;
    numeric retienspas[];
    for p_=#1:
    n:=n+1;
    trace segment(La,Lb) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    label(TEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical}));
    for k=0 upto bluepart(p_):
    m:=bluepart(p_);
    retienspas[n]:=bluepart(p_);
    Lab[k]:=(k/m)[La,Lb];
    trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical}));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})));
    label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-\useKV[DessinGradue]{EcartVertical})));
    labeloffset:=labeloffset/1.5;
    endfor;
    drawoptions();
    n:=0;
    numeric nblignes,nbpas;
    for p_=#2:
    n:=n+1;
    if (n mod 3)=1:
    nblignes:=p_;
    elseif (n mod 3)=2:
    nbpas:=p_;
    elseif (n mod 3)=0:
    p_=(nbpas/retienspas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-\useKV[DessinGradue]{EcartVertical})));
    fi;
    endfor;
    %Differents traces
    for p_=#3:
    trace p_ withpen pencircle scaled 1.5;
    endfor;
    );
    trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle};
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric LongueurLigne; LongueurLigne=\useKV[DessinGradue]{Longueur};numeric EcartVertical; EcartVertical=\useKV[DessinGradue]{EcartVertical}; numeric Echelle; Echelle=\useKV[DessinGradue]{Echelle};}]
    pair La,Lb,Lab[];
    pair 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,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',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'';
    La=(0,0);
    Lb-La=u*(LongueurLigne,0);
    picture EnsembleLignes,Lignes;
    EnsembleLignes=image(
    n:=0;
    m:=0;
    numeric retienspas[];
    drawoptions(withcolor 0.5white);
    for p_=#1:
    n:=n+1;
    trace segment(La,Lb) shifted((n-1)*u*(0,-EcartVertical));
    label(LATEX("(\num{"&decimal(n)&"})"),La+u*(-1.5,-(n-1)*\useKV[DessinGradue]{EcartVertical}));
    for k=0 upto bluepart(p_):
    m:=bluepart(p_);
    retienspas[n]:=bluepart(p_);
    Lab[k]:=(k/m)[La,Lb];
    trace ((Lab[k]+u*(0,-0.1))--(Lab[k]+u*(0,0.1))) shifted((n-1)*u*(0,-EcartVertical));
    endfor;
    labeloffset:=labeloffset*1.5;
    label.top(TEX("\num{"&decimal(redpart(p_))&"}"),La shifted((n-1)*u*(0,-EcartVertical)));
    label.top(TEX("\num{"&decimal(greenpart(p_))&"}"),Lb shifted((n-1)*u*(0,-EcartVertical)));
    labeloffset:=labeloffset/1.5;
    endfor;
    drawoptions();
    n:=0;
    numeric nblignes,nbpas;
    for p_=#2:
    n:=n+1;
    if (n mod 3)=1:
    nblignes:=p_;
    elseif (n mod 3)=2:
    nbpas:=p_;
    elseif (n mod 3)=0:
    p_=(nbpas/retienspas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical)));
    fi;
    endfor;
    %Differents traces
    for p_=#3:
    trace p_ withpen pencircle scaled 1.5;
    endfor;
    );
    trace EnsembleLignes scaled Echelle;
  \end{mpost}
  \fi
}

\def\UpdateLignes#1/#2/#3\nil{\addtotok\toklisteptsgrad{#1,#3,#2,}}
\def\UpdateTraces#1\nil{\addtotok\toklistetracesgrad{#1,}}
\def\UpdateDefLignes#1/#2/#3\nil{\addtotok\toklistedefligne{(#1,#2,#3),}}
\def\UpdateDefDroites#1/#2/#3/#4\nil{\addtotok\toklistedefligne{(#1,#2,#3),#4,}}

\newcommand\DessinGradue[4][]{%
  \useKVdefault[DessinGradue]%
  \setKV[DessinGradue]{#1}%
  \ifboolKV[DessinGradue]{Droites}{%
    %en travail
    \setsepchar[*]{,*/}%
    \readlist\ListeDefDroites{#2}%
    \newtoks\toklistedefdroites%
    \foreachitem\compteur\in\ListeDefDroites{\expandafter\UpdateDefDroites\compteur\nil}%
    %en travail
  }{%
    \ifboolKV[DessinGradue]{LignesIdentiques}{%
      \ifboolKV[DessinGradue]{Solution}{%
        \setsepchar[*]{,*/}%
        \readlist\ListePG{#3}%
        \setsepchar[*]{§*/}%
        \readlist\ListeTraces{#4}%
        \newtoks\toklisteptsgrad%
        \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}%
        \newtoks\toklistetracesgrad%
        \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}%
        \TraceDessinGradueSolution{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}{\the\toklisteptsgrad}{\the\toklistetracesgrad}%
      }{%
        \TraceDessinGradue{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}%
      }
    }{%
      \setsepchar[*]{,*/}%
      \readlist\ListeDefLigne{#2}%
      \newtoks\toklistedefligne%
      \foreachitem\compteur\in\ListeDefLigne{\expandafter\UpdateDefLignes\compteur\nil}%
      \ifboolKV[DessinGradue]{Solution}{%
        \setsepchar[*]{,*/}%
        \readlist\ListePG{#3}%
        \setsepchar[*]{§*/}%
        \readlist\ListeTraces{#4}%
        \newtoks\toklisteptsgrad%
        \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}%
        \newtoks\toklistetracesgrad%
        \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}%
        \TraceDessinGradueMulSolution{\the\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}%
      }{%
        \TraceDessinGradueMul{\the\toklistedefligne}%
      }%
    }%
  }%
}%

%%% Autonomie %%%
\setKVdefault[Autonomie]{AfficheMarge=false,TitreEnigme=Enigme,TitreAtoi=\`A toi,Enigme=false,TexteCorrection=\bfseries Correction,ARemplir=false,Deux=false}%

\newcommand\Autonomie[3][]{%
  \useKVdefault[Autonomie]%
  \setKV[Autonomie]{#1}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeAutoQ{#2}%
  % \setsepchar{§}
  % \readlist*\ListeAutoR{#3}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeAutoEn{#3}%
  \clearpage
  \begin{tikzpicture}[remember picture,overlay]%
    \ifboolKV[Autonomie]{AfficheMarge}{%
      \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};%
      \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};%
      \draw[blue,dashed] (PfCA) rectangle (PfCB);%
    }{}%
    \foreach \i in {1,...,3}{%
      \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);%
      \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);%
    }%
    \foreach \i in{1,...,4}{%
      \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);%
      \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);%
      \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);%
      \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);%
    }%
    \ifboolKV[Autonomie]{Deux}{%
      \draw (C2) to (D2);%
      \draw (E2) to (F2);%
    }{%
      \foreach\i in{1,...,4}{%
        \draw (C\i) to (D\i);%
        \draw (E\i) to (F\i);%
      }%
    }%
    \coordinate (Q1) at ($(F1)!0.5!(A3)$);%
    \coordinate (Q2) at ($(F2)!0.5!(E1)$);%
    \coordinate (Q3) at ($(F3)!0.5!(E2)$);%
    \coordinate (Q4) at ($(F4)!0.5!(E3)$);%
    \coordinate (Q5) at ($(C1)!0.5!(A1)$);%
    \coordinate (Q6) at ($(C2)!0.5!(D1)$);%
    \coordinate (Q7) at ($(C3)!0.5!(D2)$);%
    \coordinate (Q8) at ($(C4)!0.5!(D3)$);%
    \draw[dashed] (A1) to (B1);%
    \draw[dashed] (A3) to (B3);%
    \ifboolKV[Autonomie]{ARemplir}{%
      \ifboolKV[Autonomie]{Deux}{%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test1) at ($(Q1)!0.5!(Q2)$) {\ListeAutoQ[1,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test2) at ($(Q3)!0.5!(Q4)$) {\ListeAutoQ[2,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test3) at ($(Q5)!0.5!(Q6)$) {\ListeAutoQ[3,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test4) at ($(Q7)!0.5!(Q8)$) {\ListeAutoQ[4,1]};%
      }{%
        \foreach \i in {1,...,4}{%
          \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};%
        }%
        \foreach \i in {5,...,8}{%
          \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};%
        }%
      }%
    }{%
      \foreach \i in {1,...,4}{%
        \node[xshift=-5mm,align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};%
      }%
      \foreach \i in {5,...,8}{%
        \node[align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};%
      }%
    }%
  \end{tikzpicture}%
  \clearpage%
  \begin{tikzpicture}[remember picture,overlay]%
    \ifboolKV[Autonomie]{AfficheMarge}{%
      \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};%
      \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};%
      \draw[blue,dashed] (PfCA) rectangle (PfCB);%
    }{}%
    \foreach \i in {1,...,3}{%
      \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);%
      \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);%
    }%
    \foreach \i in{1,...,4}{%
      \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);%
      \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);%
      \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);%
      \coordinate[yshift=-\i*0.25*\paperheight] (G\i) at (A2);%
      \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);%
    }%
    \ifboolKV[Autonomie]{Deux}{%
      \draw (C2) to (F2);%
    }{%
      \foreach \i in{1,...,4}{%
        \draw (C\i) to (F\i);%
      }%
    }%
    \coordinate (T1) at ($(current page.north west)!0.5!(A1)$);%
    \coordinate (T2) at ($(C1)!0.5!(D1)$);%
    \coordinate (T3) at ($(C2)!0.5!(D2)$);%
    \coordinate (T4) at ($(C3)!0.5!(D3)$);%
    \coordinate (T5) at ($(current page.north east)!0.5!(A3)$);%
    \coordinate (T6) at ($(E1)!0.5!(F1)$);%
    \coordinate (T7) at ($(E2)!0.5!(F2)$);%
    \coordinate (T8) at ($(E3)!0.5!(F3)$);%
    \coordinate (U1) at ($(C1)!0.5!(D1)$);%
    \coordinate (U2) at ($(C2)!0.5!(D2)$);%
    \coordinate (U3) at ($(C3)!0.5!(D3)$);%
    \coordinate (U4) at ($(current page.south west)!0.5!(B1)$);%
    \coordinate (U5) at ($(E1)!0.5!(F1)$);%
    \coordinate (U6) at ($(E2)!0.5!(F2)$);%
    \coordinate (U7) at ($(E3)!0.5!(F3)$);%
    \coordinate (U8) at ($(B3)!0.5!(current page.south east)$);%
    \coordinate (R1) at ($(D1)!0.5!(A2)$);%
    \coordinate (R2) at ($(D2)!0.5!(G1)$);%
    \coordinate (R3) at ($(D3)!0.5!(G2)$);%
    \coordinate (R4) at ($(D4)!0.5!(G3)$);%
    \coordinate (R5) at ($(E1)!0.5!(A2)$);%
    \coordinate (R6) at ($(E2)!0.5!(G1)$);%
    \coordinate (R7) at ($(E3)!0.5!(G2)$);%
    \coordinate (R8) at ($(E4)!0.5!(G3)$);%
    \coordinate (S1) at ($(A1)!0.5!(D1)$);%
    \coordinate (S2) at ($(D1)!0.5!(D2)$);%
    \coordinate (S3) at ($(D2)!0.5!(D3)$);%
    \coordinate (S4) at ($(D3)!0.5!(B1)$);%
    \coordinate (S5) at ($(R1)!0.5!(R5)$);%
    \coordinate (S6) at ($(R2)!0.5!(R6)$);%
    \coordinate (S7) at ($(R3)!0.5!(R7)$);%
    \coordinate (S8) at ($(R4)!0.5!(R8)$);%
    \coordinate (V1) at ($(T1)!0.5!(U1)$);%
    \coordinate (V2) at ($(T2)!0.5!(U2)$);%
    \coordinate (V3) at ($(T3)!0.5!(U3)$);%
    \coordinate (V4) at ($(T4)!0.5!(U4)$);%
    \coordinate (V5) at ($(T5)!0.5!(U5)$);%
    \coordinate (V6) at ($(T6)!0.5!(U6)$);%
    \coordinate (V7) at ($(T7)!0.5!(U7)$);%
    \coordinate (V8) at ($(T8)!0.5!(U8)$);%
    \draw[dashed] (A1) to (B1);%
    \draw[dashed] (A2) to (B2);%
    \draw[dashed] (A3) to (B3);%
    \ifboolKV[Autonomie]{ARemplir}{%
      \ifboolKV[Autonomie]{Deux}{%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V1)!0.5!(V2)$) {\ListeAutoEn[1,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V3)!0.5!(V4)$) {\ListeAutoEn[2,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V5)!0.5!(V6)$) {\ListeAutoEn[3,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V7)!0.5!(V8)$) {\ListeAutoEn[4,1]};%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R1)!0.5!(R2)$) {\ListeAutoQ[1,2]};%%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R3)!0.5!(R4)$) {\ListeAutoQ[2,2]};%%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R5)!0.5!(R6)$) {\ListeAutoQ[3,2]};%%
        \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R7)!0.5!(R8)$) {\ListeAutoQ[4,2]};%%
      }{%
        \foreach \i in {1,...,8}{%
          \node[text width=0.9*0.25\paperwidth] at (V\i) {\ListeAutoQ[\i,2]};%
          \node[text width=0.9*0.25\paperwidth] at (R\i) {\ListeAutoEn[\i,1]};%
        }%
      }%
    }{%
      \foreach \i in {1,...,8}{%
        \node[rotate=90,anchor=north] (Cor\i) at (S\i) {\useKV[Autonomie]{TexteCorrection}};%
        \node[anchor=west,xshift=2em,text width=0.8*0.25\paperwidth] (Test\i)
        at (S\i) {\ListeAutoQ[\i,2]};%
        \node[anchor=north,yshift=-1em,text width=0.85*0.25\paperwidth] (TestEn\i)
        at (T\i) {\textbf{\useKV[Autonomie]{TitreAtoi}} \ListeAutoEn[\i,1]};%
        \ifboolKV[Autonomie]{Enigme}{%
          \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i)
          at (U\i) {%
            \ListeAutoEn[\i,2] : \pointilles\\%
            Lettre \ding{\fpeval{171+\i}} : \pointilles%
          };%
        }{%
          \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i)
          at (U\i) {%
            \ListeAutoEn[\i,2]%
          };%
        }%
      }%
    }%
  \end{tikzpicture}%
}%

%%%
% Calculatrice
%%%
%https://tex.stackexchange.com/questions/290321/mimicking-a-calculator-inputs-and-screen
\definecolor{lightorange}{rgb}{0.9,0.4,0}%
\definecolor{lightestorange}{rgb}{1,0.8,0.5}%
\definecolor{darkorange}{rgb}{0.2,0.1,0}%

\colorlet{blackened}{black!90!white}%
\colorlet{blackish}{black!70!white}%
\colorlet{greyish}{black!60!white}%
\colorlet{whiteish}{white}%
\colorlet{orangeish}{yellow!90!red}%
\colorlet{greenish}{green!16!gray}%
\colorlet{redish}{red!80!black}%

\tcbset{calbackground/.style={
    enhanced,
    leftright skip=0.25cm,beforeafter skip=0pt,
    toptitle=0mm,bottomtitle=0mm,
    right=2mm,left=2mm,
    top=1pt,
    bottom=0.25cm,
    boxsep=0pt,
    boxrule=0mm,
    sharp corners,
    sidebyside,
    sidebyside gap=2mm,
    lefthand ratio=0.6,
    bicolor,
    colback=black!10!white,
    colbacklower=greenish,
    colframe=white,
    autoparskip,
  }}%

\newtcbox{\KY}[1][]{
  enhanced,
  on line,
  arc=2pt,outer arc=2pt,
  boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm,
  boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt,
  interior style={top color=blackish,bottom color=blackened},
  colframe=greyish,
  width=2.5em,
  tcbox width=forced center,
  equal height group=K,
  valign=center,
  fontupper=\footnotesize\sffamily,
  coltext=orangeish,
  before upper=\vrule width 0pt height 2ex depth 1ex\relax,
}%

\newtcbox{\KYm}[1][]{
  enhanced,
  on line,
  arc=2pt,outer arc=2pt,
  boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm,
  boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt,
  interior style={top color=blackish,bottom color=blackened},
  colframe=greyish,
  width=2.5em,
  tcbox width=forced center,
  equal height group=K,
  valign=center,
  fontupper=\footnotesize\sffamily,
  coltext=orangeish,
  before upper=\vrule width 0pt height 2ex depth 1ex\relax$,
  after upper=$,
}%

\newtcbox{\KN}{
  enhanced,
  on line,
  arc=2pt,outer arc=2pt,
  boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm,
  boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt,
  interior style={top color=blackish,bottom color=blackened},
  colframe=greyish,
  width=1.5em,
  tcbox width=forced center,
  equal height group=K,
  valign=center,
  fontupper=\footnotesize\sffamily,
  coltext=whiteish,
  before upper=\vrule width 0pt height 2ex depth 1ex\relax,
}%

\newtcolorbox{calc}[1][]{%
  enhanced,bicolor,
  boxsep=0pt,
  boxrule=0pt,
  top=6pt,bottom=0pt,left=6pt,right=0pt,
  sharp corners,
  frame empty,
  colback=black!10,
  colbacklower=greenish,
  sidebyside,
  sidebyside align=top seam,
  sidebyside gap=0pt,
  righthand width=50.7mm,
  before lower=\begin{tabular}{@{}l@{}},
  after lower=\end{tabular},
  overlay={\node[inner sep=0pt, outer sep=0pt, text height=5pt, text
    depth=1pt, text width=50.7mm, fill=greenish, anchor=north
    east, font=\sffamily\tiny\bfseries, align=flush right]
    at (frame.north east) {#1};}
}

\def\MPCalculatrice#1#2#3{
  % #1 Calcul %2 r\'eponse
  \ifluatex
  \mplibforcehmode%
  \begin{mplibcode}%
    input PfCCalculatrice;
    LCD(#1)(#2)(#3);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCCalculatrice;}]
    LCD(#1)(#2)(#3);    
  \end{mpost}
  \fi
}

\setKVdefault[ClesCalculatrice]{Ecran=false,NbLignes=0,BL=0.775}

\newcommand\Calculatrice[2][]{%
  \setstackgap{L}{\useKV[ClesCalculatrice]{BL}\baselineskip}%
  \useKVdefault[ClesCalculatrice]%
  \setKV[ClesCalculatrice]{#1}%
  \ifboolKV[ClesCalculatrice]{Ecran}{%
    \setsepchar[*]{,*/}%
    \readlist\ListeCalc{#2}%
    \MPCalculatrice{\ListeCalc[1,1]}{\ListeCalc[1,2]}{\useKV[ClesCalculatrice]{NbLignes}}%
  }{%
    \setsepchar[*]{,*/}%
    \readlist\ListeCalc{#2}%
    \foreachitem\compteur\in\ListeCalc{\xintifboolexpr{\listlen\ListeCalc[\compteurcnt]==2}{\Longstack{{\tiny\ListeCalc[\compteurcnt,1]} \KN{\ListeCalc[\compteurcnt,2]}}}{\Longstack{{\tiny\ListeCalc[\compteurcnt,2]} \KY{\ListeCalc[\compteurcnt,3]}}}%
    }%
  }%
  \setstackgap{L}{\baselineskip}%
}%

%%%
% Questions Flash
%%%
\tcbset{Expression/.style={colback=white,valign=center,left=0mm,right=0mm,top=1mm,bottom=1mm,colframe=white}}%
\tcbset{ExpressionSerie1/.style={colback=\useKV[ClesFlash]{Couleur1},left=0mm,right=0mm,top=1mm,bottom=1mm}}%
\tcbset{ExpressionSerie2/.style={colback=\useKV[ClesFlash]{Couleur2},left=0mm,right=0mm,top=1mm,bottom=1mm}}%
\tcbset{ExpressionSerie3/.style={colback=\useKV[ClesFlash]{Couleur3},left=0mm,right=0mm,top=1mm,bottom=1mm}}
\tcbset{ExpressionSerie4/.style={colback=\useKV[ClesFlash]{Couleur4},left=0mm,right=0mm,top=1mm,bottom=1mm}}
\tcbset{BoiteExpression/.style={enhanced,nobeforeafter,tcbox raise base,colback=white,right=3.5mm,left=3.5mm,halign=center,colframe=black}}
\newtcolorbox{CadreNombre}[1][]{%
  Expression,#1}

\newcommand\BoiteFlash[2][40pt]{%
  \ifx\bla#2\bla%
  \tcbox[BoiteExpression]{\hbox to#1{\phantom{A}}}%
  \else
  \tcbox[BoiteExpression]{#2}%
  \fi
}

\setKVdefault[ClesFlash]{Hauteur=0.2\textheight,Simple=false,Intrus=false,Kahout=false,Daily=false,Expression=false,Mental=false,Mesure=false,Heure=false,Decimal=false,Operation=Multiplie,Numeration=false,Evaluation=false,Pause=false,Couleur1=blue!10,Couleur2=orange!10,Couleur3=green!10,Couleur4=yellow!10,Numerique=false,Seul=false}

\newlength{\HauteurFlash}

\def\MPAfficheur#1#2#3{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=0.5u;
    draw Afficheur(#1 div10,0);
    draw Afficheur(#1 mod10,0) shifted(u*(1,0));
    draw Afficheur(10,0) shifted(u*(2,0));
    draw Afficheur(#2 div10,0) shifted(u*(3,0));
    draw Afficheur(#2 mod10,0) shifted(u*(4,0));
    draw Afficheur(10,0) shifted(u*(5,0));
    draw Afficheur(#3 div10,0) shifted(u*(6,0));
    draw Afficheur(#3 mod10,0) shifted(u*(7,0));
  \end{mplibcode}
  \else
  \begin{mpost}
    u:=0.5u;
    draw Afficheur(#1 div10,0);
    draw Afficheur(#1 mod10,0) shifted(u*(1,0));
    draw Afficheur(10,0) shifted(u*(2,0));
    draw Afficheur(#2 div10,0) shifted(u*(3,0));
    draw Afficheur(#2 mod10,0) shifted(u*(4,0));
    draw Afficheur(10,0) shifted(u*(5,0));
    draw Afficheur(#3 div10,0) shifted(u*(6,0));
    draw Afficheur(#3 mod10,0) shifted(u*(7,0));
  \end{mpost}
  \fi
}

\def\MPHorloge#1#2#3{
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
  marque_horloge=1;
  save Hor;
  picture Hor;
  path gdeaig,pteaig,trot;
  pair centrehorloge;
  centrehorloge=(0,0);
  path tourhorloge;
  tourhorloge=cercles(centrehorloge,marque_horloge*cm);
  Hor=image(
  %% dessin de l'horloge
  draw tourhorloge;
  for i=0 upto 59:
  if (i mod 5)=0:
  if (i mod 15)=0:
  draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp;
  else:
  draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp;
  fi;
  else:
  draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i))));
  fi;
  endfor;
  path graduhorloge;
  graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0))));
  % 
  marque_p:="plein";
  pointe(centrehorloge);
  marque_p:="rien";
  %% placement des aiguilles
  gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0))));
  pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0))));
  trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0))));
  draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4;
  draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25;
  draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp;
  );
  draw Hor;
  \end{mplibcode}
\else
  \begin{mpost}[mpsettings={input PfCGeometrie;}]
    marque_horloge=1;
    save Hor;
    picture Hor;
    path gdeaig,pteaig,trot;
    pair centrehorloge;
    centrehorloge=(0,0);
    path tourhorloge;
    tourhorloge=cercles(centrehorloge,marque_horloge*cm);
    Hor=image(
    %% dessin de l'horloge
    draw tourhorloge;
    for i=0 upto 59:
    if (i mod 5)=0:
    if (i mod 15)=0:
    draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp;
    else:
    draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp;
    fi;
    else:
    draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i))));
    fi;
    endfor;
    path graduhorloge;
    graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0))));
    %
    marque_p:="plein";
    pointe(centrehorloge);
    marque_p:="rien";
    %% placement des aiguilles
    gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0))));
    pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0))));
    trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0))));
    draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4;
    draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25;
    draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp;
    );
    draw Hor;
  \end{mpost}
  \fi
}

\newcommand\QFNumeration{%
  \begin{CadreNombre}
    {\Large LE NOMBRE DU JOUR est : }
    \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{Le chiffre des \ListeFlash[1,2] est :}
      \tcbox[BoiteExpression]{\phantom{1500000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \textbf{Le chiffre \ListeFlash[1,3] repr\'esente le
        chiffre des :}
      \tcbox[BoiteExpression]{\phantom{1500000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{Le nombre de \ListeFlash[1,4] est :}
      \tcbox[BoiteExpression]{\phantom{1500000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{\ListeFlash[1,5] est le nombre des :}
      \tcbox[BoiteExpression]{\phantom{1500000}}
    \end{tcolorbox}
  \end{CadreNombre}
}

\newcommand\QFHeure{%
  \begin{CadreNombre}
    {\Large L'HEURE DU JOUR est : }\ifboolKV[ClesFlash]{Numerique}{\raisebox{-0.3cm}{\MPAfficheur{\NbHeures}{\NbMinutes}{\NbSecondes}}}{\raisebox{-0.9cm}{{\MPHorloge{\NbHeures}{\NbMinutes}{\NbSecondes}}}}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{\ListeFlash[1,2] :}
      \tcbox[BoiteExpression]{\phantom{1500000000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \textbf{\ListeFlash[1,3] :}
      \tcbox[BoiteExpression]{\phantom{1500000000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{\ListeFlash[1,4] :}
      \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{15}}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{\ListeFlash[1,5] :}
      \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{1500000}}}
    \end{tcolorbox}
  \end{CadreNombre}
}

\newcommand\QFMesure{%
  \begin{CadreNombre}
    {\Large LA MESURE DU JOUR est : }
    \tcbox[BoiteExpression]{\ListeFlash[1,1]}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{Convertis-la en \ListeFlash[1,2] :}
      \tcbox[BoiteExpression]{\phantom{1500000000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \textbf{Elle peut aussi s'\'ecrire \ListeFlash[1,3] }
      \tcbox[BoiteExpression]{\phantom{1500000000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{Ajoute-lui \ListeFlash[1,4] :}
      \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{Enl\`eve-lui \ListeFlash[1,5] :}
      \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}}
    \end{tcolorbox}
  \end{CadreNombre}
}

\tikzset{
  arrow/.style={
    draw,
    minimum height=1.25cm,
    inner sep=0.25em,
    shape=signal,
    signal from=west,
    signal to=east,
    signal pointer angle=150,
  }
}

\newcommand\QFDaily{%
  \begin{tikzpicture}%
    \begin{scope}[start chain=transition going right,node distance=-\pgflinewidth]%
      \foreach \s in {1,...,\ListeFlashlen}{%
        \xintifboolexpr{\s == 1}{%
          \node[arrow,on chain] {\Huge\bfseries\ListeFlash[\s]};%
          \ifboolKV[ClesFlash]{Pause}{\pause}{}%
        }{%
          \xintifboolexpr{\s == \ListeFlashlen}{%
            \node[arrow,on chain] {\Huge\bfseries?};%
          }{%
            \node[arrow,on chain] {\ListeFlash[\s]};%
            \ifboolKV[ClesFlash]{Pause}{\pause}{}%
          }%
        }%
      }%
    \end{scope}%
  \end{tikzpicture}%
}%

\newcommand\QFDecimal{%
  \begin{CadreNombre}
    {\Large LE NOMBRE DU JOUR est : }
    \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{\'Ecris-le en fraction d\'ecimale :}
      \tcbox[BoiteExpression]{$\dfrac{\phantom{1000000}}{\phantom{1000000}}$}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \begin{tabular}{c}
        \textbf{Partie}\\
        \textbf{enti\`ere}
      \end{tabular} \textbf{: }
      \tcbox[BoiteExpression]{\phantom{100000}}\hfill%
      $\square$ \begin{tabular}{c}
        \textbf{Partie}\\
        \textbf{d\'ecimale}
      \end{tabular} \textbf{: }
      \tcbox[BoiteExpression]{\phantom{100000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{\useKV[ClesFlash]{Operation}-le par
        \ListeFlash[1,2] :} \tcbox[BoiteExpression]{\phantom{1000000000}}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{Trouve le nombre entier le plus proche :} \tcbox[BoiteExpression]{\phantom{10000000}}
    \end{tcolorbox}
  \end{CadreNombre}
}

\newcommand\QFMental{%
  \begin{CadreNombre}
    {\Large LE NOMBRE DU JOUR est : }
    \tcbox[BoiteExpression]{\ListeFlash[1,1]}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{Ajoute-lui}
      \tcbox[BoiteExpression]{\ListeFlash[1,2]}\hfill$\square$
      \textbf{Soustrais-lui} \tcbox[BoiteExpression]{\ListeFlash[1,3]}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \textbf{Multiplie-le par }
      \tcbox[BoiteExpression]{\ListeFlash[1,4]}\hfill$\square$
      \textbf{Divise-le par } \tcbox[BoiteExpression]{\ListeFlash[1,5]}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{Trouve}
      \tcbox[BoiteExpression]{\ListeFlash[1,6]}
      \textbf{\% de ce nombre.}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{Trouve } \tcbox[BoiteExpression]{\ListeFlash[1,7]}
      \textbf{de ce nombre.}
    \end{tcolorbox}
  \end{CadreNombre}
}

\newcommand\QFExpression{%
  \begin{CadreNombre}
    {\Large L'EXPRESSION DU JOUR est : }
    \tcbox[BoiteExpression]{\ListeFlash[1,1]}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie1]
      $\square$ \textbf{Ajoute-lui}
      \tcbox[BoiteExpression]{\ListeFlash[1,2]}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie2]
      $\square$ \textbf{Soustrais-lui}
      \tcbox[BoiteExpression]{\ListeFlash[1,3]}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie3]
      $\square$ \textbf{Multiplie-la par}
      \tcbox[BoiteExpression]{\ListeFlash[1,4]}
    \end{tcolorbox}
    \ifboolKV[ClesFlash]{Pause}{\pause}{}
    \begin{tcolorbox}[ExpressionSerie4]
      $\square$ \textbf{\'Evalue-la lorsque} \tcbox[BoiteExpression]{\ListeFlash[1,5]}
    \end{tcolorbox}
  \end{CadreNombre}
}



\newcommand\QFVide{%
  \begin{CadreNombre}
    {\ListeFlash[1]}
    \xintFor* ##1 in {\xintSeq {1}{\ListeFlashlen-1}}\do{%
      \ifboolKV[ClesFlash]{Pause}{\pause}{}
      \begin{tcolorbox}[ExpressionSerie##1]
        \ListeFlash[1+##1]
      \end{tcolorbox}
    }
  \end{CadreNombre}
}

\newcommand\QFlash[2][]{%
  \useKVdefault[ClesFlash]%
  \setKV[ClesFlash]{#1}%
  \setlength{\HauteurFlash}{\useKV[ClesFlash]{Hauteur}}%
  \colorlet{CouleurUn}{\useKV[ClesFlash]{Couleur1}}%
  \colorlet{CouleurDeux}{\useKV[ClesFlash]{Couleur2}}%
  \colorlet{CouleurTrois}{\useKV[ClesFlash]{Couleur3}}%
  \colorlet{CouleurQuatre}{\useKV[ClesFlash]{Couleur4}}%
  \ifboolKV[ClesFlash]{Evaluation}{%
    \ifboolKV[ClesFlash]{Seul}{%
      \setsepchar[*]{/}%
      \readlist*\ListeFlash{#2}%
      \QFVide%
    }{%
      \ifboolKV[ClesFlash]{Numeration}{%
        \setsepchar[*]{,*/}%
        \readlist*\ListeFlash{#2}%
        \QFNumeration%
      }{%
        \ifboolKV[ClesFlash]{Heure}{%
          \setsepchar[*]{,*/}%
          \readlist*\ListeFlash{#2}%
          \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]%
          \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]%
          \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]%
          \QFHeure%
        }{%
          \ifboolKV[ClesFlash]{Mesure}{%
            \setsepchar[*]{,*/}%
            \readlist*\ListeFlash{#2}%
            \QFMesure%
          }{%
            \ifboolKV[ClesFlash]{Daily}{%
              \setsepchar[*]{/}%
              \readlist*\ListeFlash{#2}%
              \QFDaily%
            }{%
              \ifboolKV[ClesFlash]{Decimal}{%
                \setsepchar[*]{,*/}%
                \readlist*\ListeFlash{#2}%
                \QFDecimal%
              }{%
                \ifboolKV[ClesFlash]{Mental}{%
                  \setsepchar[*]{,*/}%
                  \readlist*\ListeFlash{#2}%
                  \QFMental%
                }{%
                  \ifboolKV[ClesFlash]{Expression}{%
                    \setsepchar[*]{,*/}%
                    \readlist*\ListeFlash{#2}%
                    \QFExpression%
                  }{%
                    \setsepchar[*]{/}%
                    \readlist*\ListeFlash{#2}%
                    \ifboolKV[ClesFlash]{Simple}{%
                      \ListeFlash[1]
                      \begin{tcolorbox}[valign=center]
                        \ListeFlash[2]
                      \end{tcolorbox}
                    }{%
                      \setsepchar[*]{*/}%
                      \readlist*\ListeFlash{#2}%
                      \ifboolKV[ClesFlash]{Kahout}{%
                        \setsepchar[*]{*/}%
                        \readlist*\ListeFlash{#2}%
                        \begin{tcolorbox}[halign=center,valign=center]
                          \ListeFlash[1,1]
                        \end{tcolorbox}
                        % \par
                        \begin{multicols}{4}
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center]
                            \ListeFlash[1,2]
                          \end{tcolorbox}
                          % \hfill%
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center]
                            \ListeFlash[1,3]
                          \end{tcolorbox}
                          % \hfill%
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center]
                            \ListeFlash[1,4]
                          \end{tcolorbox}
                          % \hfill%
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center]
                            \ListeFlash[1,5]
                          \end{tcolorbox}
                        \end{multicols}
                      }{%
                        \setsepchar[*]{*/}%
                        \readlist*\ListeFlash{#2}%
                        \begin{tcolorbox}[halign=center,valign=center]
                          \ListeFlash[1,1]
                        \end{tcolorbox}
                        \begin{multicols}{4}
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center]
                            \ListeFlash[1,2]
                          \end{tcolorbox}
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center]
                            \ListeFlash[1,3]
                          \end{tcolorbox}
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center]
                            \ListeFlash[1,4]
                          \end{tcolorbox}
                          \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center]
                            \ListeFlash[1,5]
                          \end{tcolorbox}
                        \end{multicols}
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }{%
    \ifboolKV[ClesFlash]{Seul}{%
      \setsepchar[*]{/}%
      \readlist*\ListeFlash{#2}%
      \begin{frame}
        \QFVide%
      \end{frame}
    }{%
      \ifboolKV[ClesFlash]{Numeration}{%
        \setsepchar[*]{,*/}%
        \readlist*\ListeFlash{#2}%
        \begin{frame}
          \QFNumeration%
        \end{frame}
      }{%
        \ifboolKV[ClesFlash]{Heure}{%
          \setsepchar[*]{,*/}%
          \readlist*\ListeFlash{#2}%
          \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]%
          \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]%
          \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]%
          \begin{frame}
            \QFHeure%
          \end{frame}
        }{%
          \ifboolKV[ClesFlash]{Mesure}{%
            \setsepchar[*]{,*/}%
            \readlist*\ListeFlash{#2}%
            \begin{frame}
              \QFMesure%
            \end{frame}
          }{%
            \ifboolKV[ClesFlash]{Daily}{%
              \setsepchar[*]{/}%
              \readlist*\ListeFlash{#2}%
              \begin{frame}
                \QFDaily%
              \end{frame}
            }{%
              \ifboolKV[ClesFlash]{Decimal}{%
                \setsepchar[*]{,*/}%
                \readlist*\ListeFlash{#2}%
                \begin{frame}
                  \QFDecimal%
                \end{frame}
              }{%
                \ifboolKV[ClesFlash]{Mental}{%
                  \setsepchar[*]{,*/}%
                  \readlist*\ListeFlash{#2}%
                  \begin{frame}
                    \QFMental%
                  \end{frame}
                }{%
                  \ifboolKV[ClesFlash]{Expression}{%
                    \setsepchar[*]{,*/}%
                    \readlist*\ListeFlash{#2}%
                    \begin{frame}
                      \QFExpression%
                    \end{frame}
                  }{%
                    \setsepchar[*]{/}%
                    \readlist*\ListeFlash{#2}%
                    \ifboolKV[ClesFlash]{Simple}{%
                      \begin{frame}
                        \ListeFlash[1]
                        \begin{tcolorbox}[valign=center]
                          \ListeFlash[2]
                        \end{tcolorbox}
                      \end{frame}
                    }{%
                      \setsepchar[*]{,*/}%
                      \readlist*\ListeFlash{#2}%
                      \ifboolKV[ClesFlash]{Kahout}{%
                        \setsepchar[*]{*/}%
                        \readlist*\ListeFlash{#2}%
                        \begin{frame}
                          \begin{tcolorbox}[valign=center]
                            \ListeFlash[1,1]
                          \end{tcolorbox}
                          \vfill
                          \ifboolKV[ClesFlash]{Pause}{\pause}{}
                          \begin{columns}[T]
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center]
                                \ListeFlash[1,2]
                              \end{tcolorbox}
                            \end{column}
                            \ifboolKV[ClesFlash]{Pause}{\pause}{}
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center]
                                \ListeFlash[1,3]
                              \end{tcolorbox}
                            \end{column}
                          \end{columns}
                          \bigskip
                          \ifboolKV[ClesFlash]{Pause}{\pause}{}
                          \begin{columns}[T]
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center]
                                \ListeFlash[1,4]
                              \end{tcolorbox}
                            \end{column}
                            \ifboolKV[ClesFlash]{Pause}{\pause}{}
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center]
                                \ListeFlash[1,5]
                              \end{tcolorbox}
                            \end{column}
                          \end{columns}
                        \end{frame}
                      }{%
                        \setsepchar[*]{*/}%
                        \readlist*\ListeFlash{#2}%
                        \begin{frame}
                          \begin{tcolorbox}[valign=center]
                            \ListeFlash[1,1]
                          \end{tcolorbox}
                          \vfill
                          \ifboolKV[ClesFlash]{Pause}{\pause}{}
                          \begin{columns}[T]
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center]
                                \ListeFlash[1,2]
                              \end{tcolorbox}
                            \end{column}
                            \ifboolKV[ClesFlash]{Pause}{\pause}{}
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center]
                                \ListeFlash[1,3]
                              \end{tcolorbox}
                            \end{column}
                          \end{columns}
                          \bigskip
                          \ifboolKV[ClesFlash]{Pause}{\pause}{}
                          \begin{columns}[T]
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center]
                                \ListeFlash[1,4]
                              \end{tcolorbox}
                            \end{column}
                            \ifboolKV[ClesFlash]{Pause}{\pause}{}
                            \begin{column}{0.45\linewidth}
                              \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center]
                                \ListeFlash[1,5]
                              \end{tcolorbox}
                            \end{column}
                          \end{columns}
                        \end{frame}
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

%%%
% Rapido
%%%
%% D'après https://www.facebook.com/groups/994675223903586/user/100017057226847
%% et une programmation de Laurent Lassale-Carrere
\newcounter{PfCnexo}
\newtcolorbox[use counter=PfCnexo,number format=\arabic]{RapidoBox}{%
  % Titre
  colbacktitle=white,
  fonttitle=\color{black}\Large\bfseries,
  toptitle=1mm,
  bottomtitle=1mm,
  bottom=1mm,
  title={\useKV[ClesRapido]{Titre}},
  %% Cadre principal
  enhanced,
  width=\WidthRapido,
  colback=white,
  valign=top,
  drop lifted shadow
}
\newtcolorbox{QuestionBox}{enhanced,nobeforeafter,size=small,sidebyside adapt=left}
\newtcolorbox{QuestionReponse}{enhanced,nobeforeafter,upperbox=invisible,colback=white,width=1.5cm,grow to left by=3mm,grow to right by=3mm,height=10mm}

\setKVdefault[ClesRapido]{Debut=false,Largeur=0.9\linewidth,Titre={Rapido n°\thetcbcounter\hfill Date :\hspace*{2.5cm}}}%
\defKV[ClesRapido]{Numero=\setKV[ClesRapido]{Debut=true}}

\newlength{\WidthRapido}

\newcommand\Rapido[2][]{% numéro
\useKVdefault[ClesRapido]%
\setKV[ClesRapido]{#1}%
%
\ifboolKV[ClesRapido]{Debut}{%
  \setcounter{PfCnexo}{\fpeval{\useKV[ClesRapido]{Numero}-1}}
}{}%
\setlength{\WidthRapido}{\useKV[ClesRapido]{Largeur}}%
%
\setsepchar[*]{§*/}%
\readlist*\ListeRapido{#2}%
\begin{RapidoBox}
  \xintFor* ##1 in {\xintSeq {1}{\ListeRapidolen}}\do{%
    \tcbsidebyside[%
    sidebyside adapt=right,
    bicolor,
    colback=white,colbacklower=yellow!10!white,
    nobeforeafter,
    top=0mm,left=1mm,
    grow to left by=3mm,
    grow to right by=3mm,
    bottom=0mm
    ]{%
      \ListeRapido[##1,1]
    }{%
      \ListeRapido[##1,2]
    }
  }%
\end{RapidoBox}
}%

\newcommand\BoiteRapido[1]{%
  \ifx\bla#1\bla%
  \tcbox[BoiteExpression]{\phantom{100000}}%
  \else%
  \tcbox[BoiteExpression]{#1}%
  \fi
}%

%%%
% Fractions
%%%
\setKVdefault[ClesFraction]{Rayon=2cm,Disque,Regulier=false,Segment=false,Rectangle=false,Longueur=5cm,Largeur=2cm,Cotes=5,Triangle=false,Parts=3,Couleur=green,Reponse=false,Multiple=1,Hachures=false,Epaisseur=1}

\def\MPFractionTriangle#1#2#3#4#5{%
  % #1 longueur du c\^ot\'e
  % #2 partage sur le c\^ot\'e
  % #3 num
  % #4 d\'eno (attention : = #2^2)
  % #5 couleur
  \ifluatex
   \mplibforcehmode
   \begin{mplibcode}
     nbtriangle=0;

     vardef Ligne(expr longueur)=
     for k=0 upto 2*(longueur-1):
     nbtriangle:=nbtriangle+1;
     if (k mod 2)=0:
     M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     else:
     M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     fi;
     endfor;
     enddef;

     pair A,B,C;
     A=u*(0.5,0.5);
     B-A=(#1,0);
     C=rotation(B,A,60);

     nbparts:=#2;

     path M[];

     path Tria,Trir;
     Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]);
     Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]);

     for k=nbparts downto 1:
     Ligne(k);
     endfor;
     
     m:=#3 div #4;

     drawoptions(shifted(m*(#1+1cm,0)));
     for l=1 upto (#3 mod #4):
     fill M[l] withcolor #5;
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     endfor;
     
     for l=0 upto (m-1):
     drawoptions(shifted(l*(#1+1cm,0)));
     remplis polygone(A,B,C) withcolor #5;
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     endfor;
   \end{mplibcode}
     \else
     \begin{mpost}
            nbtriangle=0;

     vardef Ligne(expr longueur)=
     for k=0 upto 2*(longueur-1):
     nbtriangle:=nbtriangle+1;
     if (k mod 2)=0:
     M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     else:
     M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     fi;
     endfor;
     enddef;

     pair A,B,C;
     A=u*(0.5,0.5);
     B-A=(#1,0);
     C=rotation(B,A,60);

     nbparts:=#2;

     path M[];

     path Tria,Trir;
     Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]);
     Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]);

     for k=nbparts downto 1:
     Ligne(k);
     endfor;
     
     m:=#3 div #4;

     drawoptions(shifted(m*(#1+1cm,0)));
     for l=1 upto (#3 mod #4):
     fill M[l] withcolor #5;
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     endfor;
     
     for l=0 upto (m-1):
     drawoptions(shifted(l*(#1+1cm,0)));
     remplis polygone(A,B,C) withcolor #5;
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     endfor;
     \end{mpost}
   \fi
 }

 \def\MPFractionTriangleH#1#2#3#4#5#6{
  % #1 longueur du c\^ot\'e
  % #2 partage sur le c\^ot\'e
  % #3 num
  % #4 d\'eno (attention : = #2^2)
  % #5 couleur
  % #6 \'epaisseur
  \ifluatex
   \mplibforcehmode
   \begin{mplibcode}
          nbtriangle=0;

     vardef Ligne(expr longueur)=
     for k=0 upto 2*(longueur-1):
     nbtriangle:=nbtriangle+1;
     if (k mod 2)=0:
     M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     else:
     M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     fi;
     endfor;
     enddef;

     pair A,B,C;
     A=u*(0.5,0.5);
     B-A=(#1,0);
     C=rotation(B,A,60);

     nbparts:=#2;

     path M[];

     path Tria,Trir;
     Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]);
     Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]);

     for k=nbparts downto 1:
     Ligne(k);
     endfor;
     
     m:=#3 div #4;

     for l=1 upto (#3 mod #4):
     drawoptions(withpen pencircle scaled #6);
     trace hachurage(M[l] shifted(m*(#1+1cm,0)),90,0.2,0) withcolor #5;%M[l] withcolor #5;
     for k=1 upto nbparts:
     drawoptions(withpen pencircle scaled #6);
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(#1+1cm,0));
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(#1+1cm,0));
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(#1+1cm,0));
     endfor;
     endfor;
     
     for l=0 upto (m-1):
     drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6);
     trace hachurage(polygone(A,B,C),90,0.2,0) withcolor #5;%polygone(A,B,C) withcolor #5;
          drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6);
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     endfor;
   \end{mplibcode}
     \else
     \begin{mpost}
       nbtriangle=0;

     vardef Ligne(expr longueur)=
     for k=0 upto 2*(longueur-1):
     nbtriangle:=nbtriangle+1;
     if (k mod 2)=0:
     M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     else:
     M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A)))  shifted((nbparts-longueur)*(1/nbparts)*(C-A));
     fi;
     endfor;
     enddef;

     pair A,B,C;
     A=u*(0.5,0.5);
     B-A=(#1,0);
     C=rotation(B,A,60);

     nbparts:=#2;

     path M[];

     path Tria,Trir;
     Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]);
     Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]);

     for k=nbparts downto 1:
     Ligne(k);
     endfor;

     diversite=floor(uniformdeviate(#2**2-#3-1));
     
     for k=(1+diversite) upto (#3+diversite):
     drawoptions(withpen pencircle scaled #6);
     trace hachurage(M[k],90,0.2,0) withcolor #5;
     endfor;
     drawoptions(withpen pencircle scaled #6);
     
     for k=1 upto nbparts:
     trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]);
     trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]);
     trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]);
     endfor;
     \end{mpost}
   \fi
 }

\def\MPFractionRegulier#1#2#3#4#5{%
  % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair O,A[],B[];
    O=u*(0,0);
    path cc,cd;
    cc=cercles(O,#1);
    for k=0 upto #2:
    A[k]=pointarc(cc,k*(360/#2));
    endfor;
    cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor);
    for k=0 upto #4-1:
    B[k]=point(k*(#2/#4)) of cd;
    endfor;
    picture fondcolore;
    fondcolore=image(
    remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5;
    clip currentpicture to cd;
    for k=0 upto #4-1:
    draw segment(O,B[k]) cutafter cd;
    endfor;
    trace cd;
    );
    currentpicture:=nullpicture;
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5;
    trace cd shifted(l*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0));
    endfor;
    fi;
    endfor;
    fi;
    draw fondcolore shifted(m*(#1*2+0.5cm,0));
    draw cd shifted(m*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0));
    endfor;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}
        pair O,A[],B[];
    O=u*(0,0);
    path cc,cd;
    cc=cercles(O,#1);
    for k=0 upto #2:
    A[k]=pointarc(cc,k*(360/#2));
    endfor;
    cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor);
    for k=0 upto #4-1:
    B[k]=point(k*(#2/#4)) of cd;
    endfor;
    picture fondcolore;
    fondcolore=image(
    remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5;
    clip currentpicture to cd;
    for k=0 upto #4-1:
    draw segment(O,B[k]) cutafter cd;
    endfor;
    trace cd;
    );
    currentpicture:=nullpicture;
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5;
    trace cd shifted(l*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0));
    endfor;
    fi;
    endfor;
    fi;
    draw fondcolore shifted(m*(#1*2+0.5cm,0));
    draw cd shifted(m*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0));
    endfor;
    fi;
  \end{mpost}
  \fi
}

\def\MPFractionRegulierH#1#2#3#4#5#6{%
  % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur, #6 épaisseur
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair O,A[],B[];
    O=u*(0,0);
    path cc,cd;
    cc=cercles(O,#1);
    for k=0 upto #2:
    A[k]=pointarc(cc,k*(360/#2));
    endfor;
    cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor);
    for k=0 upto #4-1:
    B[k]=point(k*(#2/#4)) of cd;
    endfor;
    picture fondcolore;
    fondcolore=image(%
    drawoptions(withpen pencircle scaled #6);
    trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5;
    clip currentpicture to cd;
    drawoptions(withpen pencircle scaled #6);
    for k=0 upto #4-1:
    draw segment(O,B[k]) cutafter cd;
    endfor;
    trace cd;
    );
    currentpicture:=nullpicture;
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled #6);
    trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5;
    drawoptions(withpen pencircle scaled #6);
    trace cd shifted(l*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    drawoptions(withpen pencircle scaled #6);
    draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0));
    endfor;
    fi;
    endfor;
    fi;
    draw fondcolore shifted(m*(#1*2+0.5cm,0));
    drawoptions(withpen pencircle scaled #6);
    draw cd shifted(m*(#1*2+0.5cm,0));
    if #4>1:
    drawoptions(withpen pencircle scaled #6);
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0));
    endfor;
    fi;
  \end{mplibcode}
  \else
\begin{mpost}
    pair O,A[],B[];
    O=u*(0,0);
    path cc,cd;
    cc=cercles(O,#1);
    for k=0 upto #2:
    A[k]=pointarc(cc,k*(360/#2));
    endfor;
    cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor);
    for k=0 upto #4-1:
    B[k]=point(k*(#2/#4)) of cd;
    endfor;
    picture fondcolore;
    fondcolore=image(%
    drawoptions(withpen pencircle scaled #6);
    trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5;
    clip currentpicture to cd;
    drawoptions(withpen pencircle scaled #6);
    for k=0 upto #4-1:
    draw segment(O,B[k]) cutafter cd;
    endfor;
    trace cd;
    );
    currentpicture:=nullpicture;
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled #6);
    trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5;
    drawoptions(withpen pencircle scaled #6);
    trace cd shifted(l*(#1*2+0.5cm,0));
    if #4>1:
    for k=0 upto #4-1:
    drawoptions(withpen pencircle scaled #6);
    draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0));
    endfor;
    fi;
    endfor;
    fi;
    draw fondcolore shifted(m*(#1*2+0.5cm,0));
    drawoptions(withpen pencircle scaled #6);
    draw cd shifted(m*(#1*2+0.5cm,0));
    if #4>1:
    drawoptions(withpen pencircle scaled #6);
    for k=0 upto #4-1:
    draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0));
    endfor;
    fi;
  \end{mpost}
  \fi
}

\def\MPFractionRectangle#1#2#3#4#5#6{%
  % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,B,C,D,M[],N[],R[],S[];
    A=(1,1);
    B-A=(#1,0);
    C-B=(0,#2);
    D-C=A-B;
    numeric parts;
    parts=(#4 div #6);
    for k=0 upto parts:
    M[k]=(k/parts)[A,B];
    N[k]=(k/parts)[D,C];
    endfor;
    if #6>1:
    for k=0 upto #6:
    R[k]=(k/#6)[A,D];
    S[k]=(k/#6)[B,C];
    endfor;
    fi;
    picture FondRectangle;
    FondRectangle=image(%
    draw polygone(A,B,C,D);
    for k=1 upto (parts-1):
    draw segment(M[k],N[k]);
    endfor;
    if #6>1:
    for k=1 upto (#6-1):
    draw segment(R[k],S[k]);
    endfor;
    fi;
    );
    picture FondRectangleColorie;
    FondRectangleColorie=image(%
    if #6=1:
    remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5;
    else:
    DDiv=(#3 mod #4) div parts;
    MMod=(#3 mod #4) mod parts;
    remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5;
    remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5;
    fi;
    );    
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto m-1:
    remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5;
    trace FondRectangle shifted(l*(#1+1cm,0));
    endfor;
    fi;
    if (#3 mod #4)<>0:
    trace FondRectangleColorie shifted(m*(#1+1cm,0));
    else:
    remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5;
    fi;
    trace FondRectangle shifted(m*(#1+1cm,0));
  \end{mplibcode}
  \else
\begin{mpost}
      pair A,B,C,D,M[],N[],R[],S[];
    A=(1,1);
    B-A=(#1,0);
    C-B=(0,#2);
    D-C=A-B;
    numeric parts;
    parts=(#4 div #6);
    for k=0 upto parts:
    M[k]=(k/parts)[A,B];
    N[k]=(k/parts)[D,C];
    endfor;
    if #6>1:
    for k=0 upto #6:
    R[k]=(k/#6)[A,D];
    S[k]=(k/#6)[B,C];
    endfor;
    fi;
    picture FondRectangle;
    FondRectangle=image(%
    draw polygone(A,B,C,D);
    for k=1 upto (parts-1):
    draw segment(M[k],N[k]);
    endfor;
    if #6>1:
    for k=1 upto (#6-1):
    draw segment(R[k],S[k]);
    endfor;
    fi;
    );
    picture FondRectangleColorie;
    FondRectangleColorie=image(%
    if #6=1:
    remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5;
    else:
    DDiv=(#3 mod #4) div parts;
    MMod=(#3 mod #4) mod parts;
    remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5;
    remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5;
    fi;
    );    
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto m-1:
    remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5;
    trace FondRectangle shifted(l*(#1+1cm,0));
    endfor;
    fi;
    if (#3 mod #4)<>0:
    trace FondRectangleColorie shifted(m*(#1+1cm,0));
    else:
    remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5;
    fi;
    trace FondRectangle shifted(m*(#1+1cm,0));
  \end{mpost}
  \fi
}

\def\MPFractionRectangleH#1#2#3#4#5#6#7{%
  % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,B,C,D,M[],N[],R[],S[];
    A=(1,1);
    B-A=(#1,0);
    C-B=(0,#2);
    D-C=A-B;
    numeric parts;
    parts=(#4 div #6);
    for k=0 upto parts:
    M[k]=(k/parts)[A,B];
    N[k]=(k/parts)[D,C];
    endfor;
    if #6>1:
    for k=0 upto #6:
    R[k]=(k/#6)[A,D];
    S[k]=(k/#6)[B,C];
    endfor;
    fi;
    picture FondRectangle;
    FondRectangle=image(%
    draw polygone(A,B,C,D);
    for k=1 upto (parts-1):
    draw segment(M[k],N[k]);
    endfor;
    if #6>1:
    for k=1 upto (#6-1):
    draw segment(R[k],S[k]);
    endfor;
    fi;
    );
    picture FondRectangleColorie;
    FondRectangleColorie=image(%
    if #6=1:
    drawoptions(withpen pencircle scaled#7);
    trace hachurage(polygone(A,M[#3 mod #4],N[#3 mod #4],D),45,0.25,0) withcolor #5;
    else:
    DDiv=(#3 mod #4) div parts;
    MMod=(#3 mod #4) mod parts;
    drawoptions(withpen pencircle scaled#7);
    trace hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5;
        drawoptions(withpen pencircle scaled#7);
    trace hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5;
    fi;
    );    
    m=#3 div #4;
    if (#3 mod #4)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto m-1:
        drawoptions(withpen pencircle scaled#7);
        trace hachurage(polygone(A,B,C,D) shifted(l*(#1+1cm,0)),45,0.25,0) withcolor #5;
            drawoptions(withpen pencircle scaled#7);
    trace FondRectangle shifted(l*(#1+1cm,0));
    endfor;
    fi;
    if (#3 mod #4)<>0:
        drawoptions(withpen pencircle scaled#7);
    trace FondRectangleColorie shifted(m*(#1+1cm,0));
    else:
        drawoptions(withpen pencircle scaled#7);
    trace hachurage(polygone(A,B,C,D) shifted(m*(#1+1cm,0)),45,0.25,0) withcolor #5;
    fi;
        drawoptions(withpen pencircle scaled#7);
    trace FondRectangle shifted(m*(#1+1cm,0));
  \end{mplibcode}
  \else
\begin{mpost}
    pair A,B,C,D,M[],N[],R[],S[];
    A=(1,1);
    B-A=(#1,0);
    C-B=(0,#2);
    D-C=A-B;
    numeric parts;
    parts=(#4 div #6);
    for k=0 upto parts:
    M[k]=(k/parts)[A,B];
    N[k]=(k/parts)[D,C];
    endfor;
    if #6>1:
    for k=0 upto #6:
    R[k]=(k/#6)[A,D];
    S[k]=(k/#6)[B,C];
    endfor;
    fi;
    if #6=1:
    drawoptions(withpen pencircle scaled#7);
    draw hachurage(polygone(A,M[#3],N[#3],D),45,0.25,0) withcolor #5;
    else:
    DDiv=#3 div parts;
    MMod=#3 mod parts;
    drawoptions(withpen pencircle scaled#7);
    draw hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5;
    drawoptions(withpen pencircle scaled#7);
    draw hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5;
    fi;
    drawoptions(withpen pencircle scaled#7);
    draw polygone(A,B,C,D);
    for k=1 upto (parts-1):
    draw segment(M[k],N[k]);
    endfor;
    if #6>1:
    for k=1 upto (#6-1):
    draw segment(R[k],S[k]);
    endfor;
    drawoptions();
    fi;
  \end{mpost}
  \fi
}

\def\MPFractionDisque#1#2#3#4{%
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,B[];
    A=(0,0);
    path cc;
    cc=cercles(A,#1);
    for k=0 upto #3:
    B[k]=pointarc(cc,(360/#3)*k);
    endfor;
    m=(#2 div #3);
    if (#2 mod #3)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    fill cc shifted(l*(2*#1+1cm,0)) withcolor #4;
    endfor;
    fi;
    fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4;
    for l=0 upto m:
    draw cc shifted(l*(2*#1+1cm,0));
    for k=0 upto (#3-1):
    draw segment(A,B[k]) shifted(l*(2*#1+1cm,0));
    endfor;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}
    pair A,B[];
    A=(0,0);
    path cc;
    cc=cercles(A,#1);
    for k=0 upto #3:
    B[k]=pointarc(cc,(360/#3)*k);
    endfor;
    m=#2 div #3;
    if (#2 mod #3)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    fill cc shifted(l*(2*#1+1cm,0)) withcolor #4;
    endfor;
    fi;
    fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4;
    for l=0 upto m:
    draw cc shifted(l*(2*#1+1cm,0));
    for k=0 upto (#3-1):
    draw segment(A,B[k]) shifted(l*(2*#1+1cm,0));
    endfor;
    endfor;
  \end{mpost}
  \fi
}

\def\MPFractionDisqueH#1#2#3#4#5{%
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,B[];
    A=(0,0);
    path cc;
    cc=cercles(A,#1);
    for k=0 upto #3:
    B[k]=pointarc(cc,(360/#3)*k);
    endfor;
    m=#2 div #3;
    if (#2 mod #3)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4;
    endfor;
    fi;
    drawoptions(withpen pencircle scaled#5);
    draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4;
    drawoptions(withpen pencircle scaled#5);
    for l=0 upto m:
    draw cc shifted(l*(2*#1+1cm,0));
    for k=0 upto (#3-1):
    draw segment(A,B[k]) shifted(l*(2*#1+1cm,0));
    endfor;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}
    pair A,B[];
    A=(0,0);
    path cc;
    cc=cercles(A,#1);
    for k=0 upto #3:
    B[k]=pointarc(cc,(360/#3)*k);
    endfor;
    m=#2 div #3;
    if (#2 mod #3)=0:m:=m-1; fi;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4;
    endfor;
    fi;
    drawoptions(withpen pencircle scaled#5);
    draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4;
    drawoptions(withpen pencircle scaled#5);
    for l=0 upto m:
    draw cc shifted(l*(2*#1+1cm,0));
    for k=0 upto (#3-1):
    draw segment(A,B[k]) shifted(l*(2*#1+1cm,0));
    endfor;
    endfor;
  \end{mpost}
  \fi
}

\def\MPFractionSegment#1#2#3#4{
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,C,B[];
    A=(0,0);
    C-A=(#1,0);
    for k=0 upto #3:
    B[k]=(k/#3)[A,C];
    endfor;
    m=#2 div #3;
    if m>0:
    for l=0 upto (m-1):
    draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4;
    endfor;
    fi;
    if (#2 mod #3)<>0:
    draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4;
    draw segment(A,C) shifted(m*(#1+1cm,0));
    fi;
    marque_p:="tiretv";
    for l=0 upto m-1:
    for k=0 upto #3:
    pointe(B[k] shifted(l*(#1+1cm,0)));
    endfor;
    endfor;
    if (#2 mod #3)<>0:
    for k=0 upto #3:
    pointe(B[k] shifted(m*(#1+1cm,0)));
    endfor;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}
        pair A,C,B[];
    A=(0,0);
    C-A=(#1,0);
    for k=0 upto #3:
    B[k]=(k/#3)[A,C];
    endfor;
    m=#2 div #3;
    if m>0:
    for l=0 upto (m-1):
    draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4;
    endfor;
    fi;
    if (#2 mod #3)<>0:
    draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4;
    draw segment(A,C) shifted(m*(#1+1cm,0));
    fi;
    marque_p:="tiretv";
    for l=0 upto m-1:
    for k=0 upto #3:
    pointe(B[k] shifted(l*(#1+1cm,0)));
    endfor;
    endfor;
    if (#2 mod #3)<>0:
    for k=0 upto #3:
    pointe(B[k] shifted(m*(#1+1cm,0)));
    endfor;
    fi;
  \end{mpost}
  \fi
}

\def\MPFractionSegmentH#1#2#3#4#5{%
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    pair A,C,B[];
    A=(0,0);
    C-A=(#1,0);
    for k=0 upto #3:
    B[k]=(k/#3)[A,C];
    endfor;
    m=#2 div #3;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4;
    drawoptions(withpen pencircle scaled#5);
    draw segment(A,C) shifted(l*(#1+1cm,0));
    endfor;
    fi;
    if (#2 mod #3)<>0:
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4;
            drawoptions(withpen pencircle scaled#5);
    draw segment(A,C) shifted(m*(#1+1cm,0));
    fi;
    marque_p:="tiretv";
    for l=0 upto m-1:
    for k=0 upto #3:
    pointe(B[k] shifted(l*(#1+1cm,0)));
    endfor;
    endfor;
    if (#2 mod #3)<>0:
    for k=0 upto #3:
    pointe(B[k] shifted(m*(#1+1cm,0)));
    endfor;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}
        pair A,C,B[];
    A=(0,0);
    C-A=(#1,0);
    for k=0 upto #3:
    B[k]=(k/#3)[A,C];
    endfor;
    m=#2 div #3;
    if m>0:
    for l=0 upto (m-1):
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4;
    drawoptions(withpen pencircle scaled#5);
    draw segment(A,C) shifted(l*(#1+1cm,0));
    endfor;
    fi;
    if (#2 mod #3)<>0:
    drawoptions(withpen pencircle scaled#5);
    draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4;
            drawoptions(withpen pencircle scaled#5);
    draw segment(A,C) shifted(m*(#1+1cm,0));
    fi;
    marque_p:="tiretv";
    for l=0 upto m-1:
    for k=0 upto #3:
    pointe(B[k] shifted(l*(#1+1cm,0)));
    endfor;
    endfor;
    if (#2 mod #3)<>0:
    for k=0 upto #3:
    pointe(B[k] shifted(m*(#1+1cm,0)));
    endfor;
    fi;
  \end{mpost}
  \fi
}

\newcommand\Fraction[2][]{%
  \useKVdefault[ClesFraction]%
  \setKV[ClesFraction]{#1}%
  \setsepchar[*]{/}%
  \readlist*\ListeFraction{#2}%
  \ifboolKV[ClesFraction]{Triangle}{%
    \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}%
      \ifboolKV[ClesFraction]{Hachures}{%
        \MPFractionTriangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}%
      }{%
        \MPFractionTriangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}%
      }%
  }{%
    \ifboolKV[ClesFraction]{Regulier}{%
      \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}%
      \ifboolKV[ClesFraction]{Hachures}{%
        \MPFractionRegulierH{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}%
      }{%
        \MPFractionRegulier{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}%
      }%
    }{%
      \ifboolKV[ClesFraction]{Segment}{%
        \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}%
        \ifboolKV[ClesFraction]{Hachures}{%
          \MPFractionSegmentH{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}%
        }{%
          \MPFractionSegment{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}%
        }%
      }{%
        \ifboolKV[ClesFraction]{Rectangle}{%rectangle
          \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}%
          \ifboolKV[ClesFraction]{Hachures}{%
            \MPFractionRectangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}{\useKV[ClesFraction]{Epaisseur}}%
          }{%
            \MPFractionRectangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}%
          }%
        }{%disque
          \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}%
          \ifboolKV[ClesFraction]{Hachures}{%
            \MPFractionDisqueH{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% 
          }{%
            \MPFractionDisque{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}%
          }%
        }%
      }%
    }%
  }%
}%

%%%
% R\'eponses \`a relier
%%%
\setKVdefault[ClesRelie]{Solution=false,LargeurG=5cm,LargeurD=2cm,Stretch=1.5,Ecart=2cm,Couleur=black}

\newcommand\Relie[2][]{%
  \useKVdefault[ClesRelie]%
  \setKV[ClesRelie]{#1}%
  \setsepchar[*]{,*/}%
  \readlist*\ListeRelie{#2}%
  \buildtabrelie%
  \ifboolKV[ClesRelie]{Solution}{%
    \colorlet{PfCRelieCouleurTrace}{\useKV[ClesRelie]{Couleur}}%
    \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{%
      \itemtomacro\ListeRelie[##1,1]\untest
      \ifx\bla\untest\bla%
      \else
      \tikz[remember picture,overlay]{\draw[PfCRelieCouleurTrace] (RelieG-##1) -- (RelieD-\ListeRelie[##1,3]);}%
      \fi
    }%
  }{%
  }%
}

\newcounter{NbRelie}

\def\buildtabrelie{%
  \setcounter{NbRelie}{0}%
  \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}%
  \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember
    picture]{\node[name=RelieD-\theNbRelie,inner
    sep=0pt]{};\fill[] (RelieD-\theNbRelie) circle[radius=1.5pt]}}cp{\useKV[ClesRelie]{LargeurD}}}%
    \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest%
\ifx\bla\untest\bla%                                       
    \uppercase{&}\stepcounter{NbRelie}%
      \else
      \uppercase{&}\stepcounter{NbRelie}\tikz[remember
                   picture,overlay]{\node[name=RelieG-\theNbRelie,inner
                   sep=0pt]{};\fill[]
                   (RelieG-\theNbRelie) circle[radius=1.5pt];}
\fi&&&\ListeRelie[##1,2]\\}%
  \end{tabular}%
  \setcounter{NbRelie}{0}%
}%

\def\buildtabrelieold{%
  \setcounter{NbRelie}{0}%
  \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}%
  \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember
    picture,baseline]{\node[name=RelieD-\theNbRelie]{\Large\textbullet};}}cp{\useKV[ClesRelie]{LargeurD}}}%
    \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest%
\ifx\bla\untest\bla%                                       
    \uppercase{&}\stepcounter{NbRelie}%
      \else
      \uppercase{&}\stepcounter{NbRelie}\tikz[remember picture,baseline]{\node[name=RelieG-\theNbRelie]{\Large\textbullet};}
\fi&&&\ListeRelie[##1,2]\\}%
  \end{tabular}%
  \setcounter{NbRelie}{0}%
}%

%%%
% QCM
%%%
\setKVdefault[ClesQCM]{Reponses=3,Solution=false,Stretch=1,Largeur=2cm,Couleur=gray!15,Titre=false,Nom=R\'eponse,NomV=Vrai,NomF=Faux,Alph=false,AlphT=false,VF=false,Depart=1,Alterne=false,Noms={A/B/C},Multiple=false}%
\newlength{\LargeurQCM}%
\newcounter{QuestionQCM}%
\newcounter{TitreQCM}%
\ifdef{\QCM}{%
  \PackageWarning{ProfCollege}{La commande \noexpand\QCM étant définie par la classe du document, ProfCollege modifie sa commande \noexpand\QCM en \noexpand\QCMPfC.}%
  \newcommand\QCMPfC[2][]{%
    \useKVdefault[ClesQCM]%
    \setKV[ClesQCM]{#1}%
    \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}%
    \setcounter{TitreQCM}{0}
    \setsepchar[*]{§*&}\ignoreemptyitems%
    \readlist*\ListeQCM{#2}%
    \ifboolKV[ClesQCM]{Multiple}{%
      \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
      \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
      \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
      \xdef\ListeNom{\useKV[ClesQCM]{Noms}}%
      \setsepchar[*]{/}%
      \readlist*\ListeNomsMul{\ListeNom}%
      \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
        \cline{2-\NBcases}%
        \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
        &\ListeNomsMul[##2]}%
        \\
        \hline%
        \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
        \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
        &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}%
          }\\
        }%
        \hline%
      \end{tabular}%
    }{%
      \ifboolKV[ClesQCM]{VF}{%
        \setKV[ClesQCM]{Reponses=2}
        \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
        \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
        \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
        \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
          \cline{2-\NBcases}%
          \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\
          \hline%
          \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
          \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
                               &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}%
                                 }\\
          }%
          \hline%
        \end{tabular}
      }{%
        \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
        \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
        \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
        \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
          \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}%
          \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
          &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}%
          \\
          }{}
          \hline%
          \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
          \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
          &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]%
            }\\
          }%
          \hline%
        \end{tabular}%
      }%
    }%
    \renewcommand{\arraystretch}{1}%
  }%
}{%
  \newcommand\QCM[2][]{%
    \useKVdefault[ClesQCM]%
    \setKV[ClesQCM]{#1}%
    \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}%
    \setcounter{TitreQCM}{0}
    \setsepchar[*]{,*&}\ignoreemptyitems%
    \readlist*\ListeQCM{#2}%
    \ifboolKV[ClesQCM]{Multiple}{%
      \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
      \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
      \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
      \xdef\ListeNom{\useKV[ClesQCM]{Noms}}%
      \setsepchar[*]{/}%
      \readlist*\ListeNomsMul{\ListeNom}%
      \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
        \cline{2-\NBcases}%
        \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
        &\ListeNomsMul[##2]}%
        \\
        \hline%
        \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
        \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
        &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}%
          }\\
        }%
        \hline%
      \end{tabular}%
      \renewcommand{\arraystretch}{1}%
    }{%
      \ifboolKV[ClesQCM]{VF}{%
        \setKV[ClesQCM]{Reponses=2}
        \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
        \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
        \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
        \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
          \cline{2-\NBcases}%
          \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\
          \hline%
          \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
          \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
                               &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}%
                                 }\\
          }%
          \hline%
        \end{tabular}
      }{%
        \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
        \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
        \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
        \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
          \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}%
          \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
          &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}%
          \\
          }{}
          \hline%
          \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{%
          \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
          &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]%
            }\\
          }%
          \hline%
        \end{tabular}%
      }%
    }%
    \renewcommand{\arraystretch}{1}%
  }%
}

%%%
% Somme des angles
%%%
\setKVdefault[ClesSommeAngle]{Detail=true,Isocele=false,Rectangle=false,Figure=false,FigureSeule=false,Angle=0,Perso=false,Echelle=1cm}%

\def\MPFigureSommeAngle#1#2#3#4#5{%
    % #1 Premier sommet
    % #2 Deuxi\`eme sommet
    % #3 Troisi\`eme sommet
    % #4 1er angle
    % #5 2eme angle
  \ifluatex
  %\mplibcodeinherit{enable}
  \mplibforcehmode
  \begin{mplibcode}
    pair A,B,C,O,I;%
    u:=\useKV[ClesSommeAngle]{Echelle};
    Angle:=\useKV[ClesSommeAngle]{Angle};
    boolean Rectangle,Isocele;
    Rectangle=\useKV[ClesSommeAngle]{Rectangle};%
    Isocele=\useKV[ClesSommeAngle]{Isocele};
    A=u*(1,1);
    B-A=u*(4,0);
    if Rectangle:
    C=3/5[B,rotation(A,B,-90)];
    else:
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    fi;
    O=CentreCercleC(A,B,C);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=rotation(A,O,Angle);
    B:=rotation(B,O,Angle);
    C:=rotation(C,O,Angle);
    % On d\'efinit le centre du cercle inscrit
    I=CentreCercleI(A,B,C);
    % on dessine \`a main lev\'ee :)
    path triangle;
    triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
    % pour marquer les angles
    path cc;
    cc=fullcircle scaled 1u;
    picture MAngle;
    path cd; pair M[];
    MAngle=image(%
    if Isocele:%
    if Rectangle:
    trace codeperp(A,B,C,5);
    cd=A--(A+B+C)/3;
    M1=cd intersectionpoint (cc shifted A);
    trace 9/10[A,M1]--11/10[A,M1];
    cd:=C--(A+B+C)/3;
    M1:=cd intersectionpoint (cc shifted C);
    trace 9/10[C,M1]--11/10[C,M1];
    else:
    cd=B--(A+B+C)/3;
    M1=cd intersectionpoint (cc shifted B);
    trace 9/10[B,M1]--11/10[B,M1];
    cd:=C--(A+B+C)/3;
    M1:=cd intersectionpoint (cc shifted C);
    trace 9/10[C,M1]--11/10[C,M1];
    fi;
    fi;
    if Rectangle:
    trace codeperp(A,B,C,5);
    else:
    draw (cc shifted B);
    fi;
    draw (cc shifted A);
    draw (cc shifted C);
    );
    draw MAngle;
    clip currentpicture to triangle;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    % on labelise
    label(btex #1 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #3 etex,1.2[O,C]);
    % Codage
    if Isocele:
    marque_s:=marque_s/2;
    if Rectangle:
    draw Codelongueur(A,B,B,C,2);
    else:
    draw Codelongueur(A,B,A,C,2);
    fi;
    marque_s:=marque_s*2;
    fi;
    % Affichage des angles:
    if Isocele:
    if Rectangle:
    label(btex ? etex,A+0.95u*unitvector(I-A));
    else:
    if #4>#5:%Cas où b est vide donc on affiche la mesure commune
    label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A));
    label(btex ? etex,B+0.95u*unitvector(I-B));
    else:
    label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B));
    label(btex ? etex,A+0.95u*unitvector(I-A));
    fi;
    fi;
    else:
    if Rectangle:
    if #4>#5:
    label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C));
    else:
    label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C));
    fi;
    else:
    label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B));
    label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C));
    fi;
    label(btex ? etex,A+0.95u*unitvector(I-A));
    fi;
  \end{mplibcode}
  %\mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesSommeAngle]{Echelle};boolean Rectangle,Isocele;
      Rectangle=\useKV[ClesSommeAngle]{Rectangle};Isocele=\useKV[ClesSommeAngle]{Isocele};Angle:=\useKV[ClesSommeAngle]{Angle};}]
    pair A,B,C,O,I;%
    A=u*(1,1);
    B-A=u*(4,0);
    if Rectangle:
    C=3/5[B,rotation(A,B,-90)];
    else:
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    fi;
    O=CentreCercleC(A,B,C);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=rotation(A,O,Angle);
    B:=rotation(B,O,Angle);
    C:=rotation(C,O,Angle);
    % On d\'efinit le centre du cercle inscrit
    I=CentreCercleI(A,B,C);
    % on dessine \`a main lev\'ee :)
    path triangle;
    triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
    % pour marquer les angles
    path cc;
    cc=fullcircle scaled 1u;
    picture MAngle;
    path cd; pair M[];
    MAngle=image(%
    if Isocele:%
    if Rectangle:
    trace codeperp(A,B,C,5);
    cd=A--(A+B+C)/3;
    M1=cd intersectionpoint (cc shifted A);
    trace 9/10[A,M1]--11/10[A,M1];
    cd:=C--(A+B+C)/3;
    M1:=cd intersectionpoint (cc shifted C);
    trace 9/10[C,M1]--11/10[C,M1];
    else:
    cd=B--(A+B+C)/3;
    M1=cd intersectionpoint (cc shifted B);
    trace 9/10[B,M1]--11/10[B,M1];
    cd:=C--(A+B+C)/3;
    M1:=cd intersectionpoint (cc shifted C);
    trace 9/10[C,M1]--11/10[C,M1];
    fi;
    fi;
    if Rectangle:
    trace codeperp(A,B,C,5);
    else:
    draw (cc shifted B);
    fi;
    draw (cc shifted A);
    draw (cc shifted C);
    );
    draw MAngle;
    clip currentpicture to triangle;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    % on labelise
    label(btex #1 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #3 etex,1.2[O,C]);
    % Codage
    if Isocele:
    marque_s:=marque_s/2;
    if Rectangle:
    draw Codelongueur(A,B,B,C,2);
    else:
    draw Codelongueur(A,B,A,C,2);
    fi;
    marque_s:=marque_s*2;
    fi;
    % Affichage des angles:
    if Isocele:
    if Rectangle:
    label(btex ? etex,A+0.95u*unitvector(I-A));
    else:
    if #4>#5:%Cas où b est vide donc on affiche la mesure commune
    label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A));
    label(btex ? etex,B+0.95u*unitvector(I-B));
    else:
    label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B));
    label(btex ? etex,A+0.95u*unitvector(I-A));
    fi;
    fi;
    else:
    if Rectangle:
    if #4>#5:
    label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C));
    else:
    label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C));
    fi;
    else:
    label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B));
    label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C));
    fi;
    label(btex ? etex,A+0.95u*unitvector(I-A));
    fi;
  \end{mpost}
  \fi
}

\xdef\RedactionSomme{}

\newcommand\RedactionSom[4][]{%
  % #1 : nom du triangle pA pB pC
  % #2 : mesure de l'angle pApBpC
  % #3 : mesure de l'angle pBpCpA
  \useKVdefault[ClesSommeAngle]%
  \setKV[ClesSommeAngle]{#1}%
  % On r\'ecup\`ere les noms des sommets.
  \StrMid{#2}{1}{1}[\NomA]%
  \StrMid{#2}{2}{2}[\NomB]%
  \StrMid{#2}{3}{3}[\NomC]%
  \xdef\NomTriangle{\NomA\NomB\NomC}%
  \xdef\NomSommetB{\NomB}%
  \xdef\NomSommetA{\NomA}%
  \xdef\NomSommetC{\NomC}%
  % On r\'edige
  \ifboolKV[ClesSommeAngle]{Perso}{\RedactionSomme}{Dans le triangle $\NomA\NomB\NomC$, \ifboolKV[ClesSommeAngle]{Rectangle}{ rectangle \ifboolKV[ClesSommeAngle]{Isocele}{isocèle }{}en $\NomB$, }{\ifboolKV[ClesSommeAngle]{Isocele}{ isoc\`ele en $\NomA$, }}%
    on a :}%
  \ifboolKV[ClesSommeAngle]{Rectangle}{%
    \ifboolKV[ClesSommeAngle]{Isocele}{%
      \ifx\bla#3\bla%
      \begin{align*}
        2\times\widehat{\NomB\NomA\NomC}&=\ang{90}\\%
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\frac{\ang{90}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{45}}%
      \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{45}}{}%
      \end{align*}
      \fi
    }{%
      \ifx\bla#3\bla%
      \begin{align*}
        \widehat{\NomB\NomA\NomC}+\widehat{\NomB\NomC\NomA}&=\ang{90}\\%
        \widehat{\NomB\NomA\NomC}+\ang{#4}&=\ang{90}\\%
        \xdef\totalangle{\fpeval{90-#4}}\ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{90}-\ang{#4}\\}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}%
      \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}{}%
      \end{align*}
      \fi
    }%
  }{%
    \ifboolKV[ClesSommeAngle]{Isocele}{%
      \ifx\bla#4\bla%
      \begin{align*}%
        \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        2\times\ang{#3}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        \xdef\sommeangle{\fpeval{2*#3}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}%
                                                                                                                               \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}%
      \end{align*}%
      \xdef\ResultatAngle{\totalangle}%
      \else%
      \begin{align*}%
        \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        2\times\widehat{\NomA\NomB\NomC}+\ang{#4}&=\ang{180}\\%
        \xdef\totalangle{\fpeval{180-#4}}%
        \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{180}-\ang{#4}\\}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}%
        \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}%
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}}%\\
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}\\}{}%
      \end{align*}%
      \xdef\ResultatAngle{\fpeval{0.5*(180-#4)}}%
      \fi%
    }{%
      \begin{align*}%
        \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        \ang{#3}+\ang{#4}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        \xdef\sommeangle{\fpeval{#3+#4}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\%
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}%\\
        \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}%
      \end{align*}%
      \xdef\ResultatAngle{\totalangle}%
    }%
  }%
}%

\newcommand\SommeAngles[4][]{% Macro calculant la mesure de l'angle pCpApB
  % #1 : nom du triangle pA pB pC
  % #2 : mesure de l'angle pApBpC
  % #3 : mesure de l'angle pBpCpA
  \useKVdefault[ClesSommeAngle]%obligatoire car la macro n'est pas dans un groupe.
  \setKV[ClesSommeAngle]{#1}%lit les arguments optionnels
  % On r\'ecup\`ere les noms des sommets.
  \StrMid{#2}{1}{1}[\NomA]%
  \StrMid{#2}{2}{2}[\NomB]%
  \StrMid{#2}{3}{3}[\NomC]%
  % Figure ou pas ?
  \ifboolKV[ClesSommeAngle]{FigureSeule}{%
    \ifx\bla#3\bla%
    \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}%
    \else%
    \ifx\bla#4\bla%
    \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}%
    \else%
    \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}%
    \fi%
    \fi%
  }{%
    \ifboolKV[ClesSommeAngle]{Figure}{%
      \begin{multicols}{2}%
        {\em La figure est donn\'ee \`a titre indicatif.}%
        \ifx\bla#3\bla%
        \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}\]%
        \else%
        \ifx\bla#4\bla%
        \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}\]%
        \else%
        \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}\]%
        \fi%
        \fi%
        \par\columnbreak\par%
        \RedactionSom[#1]{#2}{#3}{#4}%
      \end{multicols}%
    }{% on r\'edige
      \RedactionSom[#1]{#2}{#3}{#4}%
    }%
  }%
}%

%%%
% Le th\'eor\`eme de Pythagore
%%%
\setKVdefault[ClesPythagore]{Exact=false,AvantRacine=false,Racine=false,Entier=false,Egalite=false,Precision=2,Soustraction=false,Figure=false,FigureSeule=false,Angle=0,Echelle=1cm,Reciproque=false,ReciColonnes=false,Faible=false,Unite=cm,EnchaineA=false,EnchaineB=false,EnchaineC=false,ValeurA=0,ValeurB=0,ValeurC=0,Perso=false,AllPerso=false}

% On d\'efinit les figures \`a utiliser
\def\MPFigurePytha#1#2#3#4#5#6{%
  % #1 Premier sommet
  % #2 Sommet de l'angle droit
  % #3 troisi\`eme sommet
  % #4 1ere longueur
  % #5 2eme longueur
  % #6 angle de rotation de la figure
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesPythagore]{Echelle};
    pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
    O=u*(2.5,2.5);
    path cc;
    cc=(fullcircle scaled 4u) shifted O;
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.9*length cc) of cc;
    B=A rotatedabout(O,-120);
    C=2[A,O];
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % On d\'efinit l'angle droit
    D-B=7*unitvector(C-B);
    F-B=7*unitvector(A-B);
    E-D=F-B;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    draw D--E--F;
    numeric decalage;
    decalage=3mm;
    if (#4<#5) or (#4=#5) :
    if ypart(B)>ypart(O) :
        label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B)));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
     else:
        label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B)));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
     fi
    else:
      if ypart(B)>ypart(O) :
        label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
        else:
        label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C)
        rotated 90));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    fi;
    label(btex #3 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #1 etex,1.2[O,C]);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}]
    pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
    O=u*(2.5,2.5);
    path cc;
    cc=(fullcircle scaled 4u) shifted O;
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.9*length cc) of cc;
    B=A rotatedabout(O,-120);
    C=2[A,O];
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % On d\'efinit l'angle droit
    D-B=7*unitvector(C-B);
    F-B=7*unitvector(A-B);
    E-D=F-B;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};    
    draw D--E--F;
    decalage=3mm;
    if (#4<#5) or (#4=#5) :
    if ypart(B)>ypart(O) :
        label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B)));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
     else:
        label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B)));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
     fi
    else:
      if ypart(B)>ypart(O) :
      label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
        else:
        label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C)
        rotated 90));
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    fi;
    label(btex #3 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #1 etex,1.2[O,C]);
  \end{mpost}
  \fi
}

\def\MPFigureReciPytha#1#2#3#4#5#6#7{%
  % #1 Premier sommet
    % #2 Sommet de l'angle droit
    % #3 troisi\`eme sommet
    % #4 1ere longueur
    % #5 2eme longueur
    % #6 3eme longueur
    % #7 angle de rotation de la figure
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesPythagore]{Echelle};
    pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
    O=u*(2.5,2.5);
    path cc;
    cc=(fullcircle scaled 4u) shifted O;
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.8*length cc) of cc;
    B=A rotatedabout(O,-100);
    C=2[A,O];
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#7);
    B:=B rotatedabout(O,#7);
    C:=C rotatedabout(O,#7);
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};    
    decalage=3mm;
    if ypart(B)>ypart(O) :
    label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90));
    label(btex \num{#5} etex,1/2[C,B]-decalage*(unitvector(C-B)));
    label(btex \num{#6} etex,1/2[A,B]-decalage*(unitvector(C-B)));
    else:
    label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) rotated 90));
    label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
    label(btex \num{#6} etex,1/2[C,B]-decalage*(unitvector(A-B)));
    fi;
    label(btex #1 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #3 etex,1.2[O,C]);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}]
    pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
    O=u*(2.5,2.5);
    path cc;
    cc=(fullcircle scaled 4u) shifted O;
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.8*length cc) of cc;
    B=A rotatedabout(O,-100);
    C=2[A,O];
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#7);
    B:=B rotatedabout(O,#7);
    C:=C rotatedabout(O,#7);
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};    
    decalage=3mm;
    if ypart(B)>ypart(O) :
    label(LATEX("\num{"&decimal(#4)&"}") rotated angle(C-A),1/2[C,A]-decalage*(unitvector(C-A) rotated 90));
    label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(C-B)),1/2[C,B]-decalage*(unitvector(C-B)));
    label(LATEX("\num{"&decimal(#6)&"}") rotated(angle(B-A)),1/2[A,B]-decalage*(unitvector(C-B)));
    else:
    label(LATEX("\num{"&decimal(#4)&"}") rotated angle(A-C),1/2[A,C]+decalage*(unitvector(A-C) rotated 90));
    label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(A-B)),1/2[A,B]-decalage*(unitvector(C-B)));
    label(LATEX("\num{"&decimal(#6)&"}") rotated angle(C-B),1/2[C,B]-decalage*(unitvector(A-B)));
    fi;
    label(btex #1 etex,1.2[O,A]);
    label(btex #2 etex,1.2[O,B]);
    label(btex #3 etex,1.2[O,C]);
  \end{mpost}
  \fi
}

\newcommand\RedactionPythagore{}%
\newcommand\RedactionReciPythagore{}%
\newcommand\RedactionCalculsPythagore{}%
\newcommand\RedactionCalculsReciPythagore{}%
\newcommand\RedactionConclusionReciPythagore{}%

\newcommand\Pythagore[5][]{%
  % #1 Param\`etres sous forme de cl\'es
  % #2 Nom "complet" du triangle : ABC par exemple
  % #3 Premi\`ere longueur
  % #4 Deuxi\`eme longueur
  % #5 Troisi\`eme longueur (\'eventuellement vide)
  \useKVdefault[ClesPythagore]%obligatoire car la macro n'est pas dans un groupe.
  \setKV[ClesPythagore]{#1}%On lit les arguments optionnels
  \DeclareSIUnit{\PfCPythaUnit}{\useKV[ClesPythagore]{Unite}}%
  \ifboolKV[ClesPythagore]{Reciproque}{%
    % On retient les noms des sommets
    \StrMid{#2}{1}{1}[\NomA]%
    \StrMid{#2}{2}{2}[\NomB]%
    \StrMid{#2}{3}{3}[\NomC]%
    \xdef\NomTriangle{\NomA\NomB\NomC}%
    % on stocke les valeurs donn\'ees
    \opcopy{#3}{A1}%
    \opcopy{#4}{A2}%
    \opcopy{#5}{A3}%
    \xdef\GrandCote{#3}%
    \xdef\PetitCote{#4}%
    \xdef\MoyenCote{#5}%
    % On trace une figure ou pas ?
    \ifboolKV[ClesPythagore]{FigureSeule}{%
      \MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}%
    }{%
      \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation
        \begin{multicols}{2}
          {\em La figure est donn\'ee \`a titre indicatif.}%
          \[\MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}\]%
          \par\columnbreak\par%
          \ifboolKV[ClesPythagore]{AllPerso}{%
            \RedactionReciPythagore%
            \RedactionCalculsReciPythagore%
            \RedactionConclusionReciPythagore%
          }{%
            % on r\'edige
            \ifboolKV[ClesPythagore]{Perso}{%
              \RedactionReciPythagore%
            }{%
              Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.%
            }
            \ifboolKV[ClesPythagore]{ReciColonnes}{%
              \[
                \begin{array}{cccc|cccc}
                  &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\
                  &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\
                  &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\
                  &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\
                \end{array}
              \]
            }{%
              \[\left.
                  \begin{array}{l}
                    \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\
                    \\
                    \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\
                  \end{array}
                \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi
              \]
            }
            \ifboolKV[ClesPythagore]{Egalite}{%
              \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi%
              \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi%
            }{%
              \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle
              en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi%
              \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le
              triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi%
            }
          }
        \end{multicols}
      }{%
        \ifboolKV[ClesPythagore]{AllPerso}{%
          \RedactionReciPythagore%
          \RedactionCalculsReciPythagore%
          \RedactionConclusionReciPythagore%
        }{%
          \ifboolKV[ClesPythagore]{Perso}{\RedactionReciPythagore}{%
            Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.%
          }
          \ifboolKV[ClesPythagore]{ReciColonnes}{%
            \[
              \begin{array}{cccc|cccc}
                &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\
                &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\
                &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\
                &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\
              \end{array}
            \]
          }{%
            \[\left.
                \begin{array}{l}
                  \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\
                  \\
                  \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\
                \end{array}
              \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi
            \]
          }%
          \ifboolKV[ClesPythagore]{Egalite}{%
            \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi%
            \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi%
          }{%
            \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle
            en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi%
            \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le
            triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi%
          }%
        }%
      }%
    }%
  }{%
    % [xlop] param\`etres de calcul
    \opcopy{#3}{A1}%
    \opcopy{#4}{A2}%
    \opcopy{\useKV[ClesPythagore]{Precision}}{pres}%
    \xintifboolexpr{#3<#4 || #3==#4}{
      \xdef\PetitCote{#3}%
      \xdef\MoyenCote{#4}%
      \xdef\GrandCote{}%
    }{%
      \xdef\GrandCote{#3}%
      \xdef\MoyenCote{#4}%
      \xdef\PetitCote{}% Pour la personnalisation
    }
    % On retient les noms des sommets
    \StrMid{#2}{1}{1}[\NomA]%
    \StrMid{#2}{2}{2}[\NomB]%
    \StrMid{#2}{3}{3}[\NomC]%
    \xdef\NomTriangle{\NomA\NomB\NomC}%
    \xdef\NomAngleDroit{\NomB}%
    \xdef\NomSommetA{\NomA}%
    \xdef\NomSommetC{\NomC}%
    % On trace une figure ou pas ?
    \ifboolKV[ClesPythagore]{FigureSeule}{%
      \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4%
        \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}%
      }{%
        \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}%
      }%
      \MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}
    }{%
      \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation
        \begin{multicols}{2}%
          {\em La figure est donn\'ee \`a titre indicatif.}%
          \[\MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}\]
          \par\columnbreak\par%
          % On d\'emarre la r\'esolution
          \ifboolKV[ClesPythagore]{AllPerso}{%
            \RedactionPythagore%
            \RedactionCalculsPythagore%
          }{%
            \ifboolKV[ClesPythagore]{Perso}{%
              \RedactionCalculsPythagore%
            }{%
              \ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :%
              }%
            }
            \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4%
              \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}%
              \begin{align*}
                \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\
                \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\
                \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\
              \ifboolKV[ClesPythagore]{AvantRacine}{}{%
              \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}
                                                               \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\
                }%
              \end{align*}
            }{%\else%
              \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}%
              \begin{align*}
                \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\
                \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\
                \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\
                \ifboolKV[ClesPythagore]{AvantRacine}{}{%
                \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}
                                                                 \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\
                }%
              \end{align*}
            }%\fi%
          }
        \end{multicols}
      }{%
        % On d\'emarre la r\'esolution
        \ifboolKV[ClesPythagore]{AllPerso}{%
          \RedactionPythagore%
          \RedactionCalculsPythagore%
        }{%
          \ifboolKV[ClesPythagore]{Perso}{\RedactionPythagore}{\ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :%
            }}%
          \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4%
            \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}%
            \begin{align*}
              \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\
              \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\
              \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
              \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\
              \ifboolKV[ClesPythagore]{AvantRacine}{}{%
              \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}
                                                               \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\
              }
            \end{align*}
          }{%\else
            \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}%
            \ifboolKV[ClesPythagore]{Soustraction}{%
              \begin{align*}
                \NomA\NomB^2&=\NomA\NomC^2-\NomB\NomC^2\\
                \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}-\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\
                \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\
                \ifboolKV[ClesPythagore]{AvantRacine}{}{%
                \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}
                                                                 \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\
                }
              \end{align*}
            }{%
              \begin{align*}
                \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\
                \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\
                \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\
                \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\
                \ifboolKV[ClesPythagore]{AvantRacine}{}{%
                \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}%
                                                                 \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\
                }
              \end{align*}
            }%
          }%\fi%
        }%
      }%
    }%
  }%
}%

%%%
% Distributivit\'e
%%%
% https://tex.stackexchange.com/questions/168972/draw-arrows-to-show-multiplication-pattern-distributive-property/169278?noredirect=1 
\newcommand\Tikzmark[1]{%
  \tikz[remember picture,baseline,inner sep=0pt]{%
    \node[name=Distri-\theNbDistri,anchor=base] {${#1}$};}%
  \stepcounter{NbDistri}%
}%

\newcommand\DrawArrow{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-2.north);
    \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-3.north);
    \draw[-stealth,out=-50,in=-140,DCFlechesb,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-2.south);
    \draw[-stealth,out=-50,in=-140,DCFlechesb!50,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-3.south);
  \end{tikzpicture}
}

\newcommand\DrawArrowSimple[1]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-2.north);
    \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-3.north);
  \end{tikzpicture}
}

\newcommand\DrawArrowSimpleRenverse[1]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[-stealth,out=140,in=50,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-0.north);
    \draw[-stealth,out=140,in=50,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-1.north);
  \end{tikzpicture}
}

\newcounter{NbDistri}%
\setcounter{NbDistri}{0}%

\newcounter{NbCalculDistri}%Pour compter combien de distributivit\'e il
% y a dans un "seul calcul".
\setcounter{NbCalculDistri}{0}

\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Impression=false}%,AideAdd=false:inutile ?

\newcommand\Tuile[4]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    boolean Vide,Print;
    Vide=\useKV[ClesDistributivite]{Vide};
    Print=\useKV[ClesDistributivite]{Impression};
    pair _CoinTuilev;
    _CoinTuilev=(0,0);
    numeric largeur,longueur,ecart;
    largeur=0.75;
    longueur=sqrt(3);
    ecart=0.6;
    pair _CoinTuileh;
    _CoinTuileh=u*(largeur+ecart,ecart);
    vardef tuilev(expr LL,ll,nb,col)(text t)=
    save $; picture $;
    save TT; picture TT;
    TT=image(
    path cc;
    cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll));
    if Print=false:
    fill cc withcolor col;
    fi;
    trace cc;
    label(TEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)));
    );
    $=image(
    for k=0 upto nb-1:
    trace TT shifted(_CoinTuilev+k*u*(0,-ll));
    endfor;
    _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll));
    );
    $
    enddef;
    vardef tuileh(expr LL,ll,nb,col)(text t)=
    save $; picture $;
    picture TT;
    TT=image(
    path cc;
    cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll));
    if Print=false:
    fill cc withcolor col;
    fi;
    trace cc;
    label(TEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)));
    );
    $=image(
    for k=0 upto nb-1:
    trace TT shifted(_CoinTuileh+k*u*(LL,0));
    endfor;
    _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0));
    );
    $
    enddef;
    color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg;
    ColorLetter=LightGreen;
    ColorLetterPos=ColorLetter;
    ColorLetterNeg=Tomato;
    ColorNum=Orange;
    ColorNumPos=ColorNum;
    ColorNumNeg=Tomato;
    ColorCarrePos:=LightBlue;
    ColorCarreNeg:=Tomato;
    if #1<0:
    ColorLetter:=Tomato;
    trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$");
    else:
    ColorLetter:=LightGreen;
    trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$");
    fi;
    if #2<0:
    ColorNum:=Tomato;
    trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$");
    else:
    ColorNum:=Orange;
    trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$");
    fi;
    if #3<0:
    ColorLetter:=Tomato;
    trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$");
    else:
    ColorLetter:=LightGreen;
    trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$");
    fi;
    if #4<0:
    ColorNum:=Tomato;
    trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$");
    else:
    ColorNum:=Orange;
    trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$");
    fi;
    trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2;
    trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2;
    drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2;
    labeloffset:=labeloffset*2;
    label.ulft(TEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart)));
    labeloffset:=labeloffset/2;
    if Vide=false:
    %% tuile a*c
    if #1*#3<>0:
    for k=0 upto (abs(#3)-1):
    for l=0 upto (abs(#1)-1):
    path titi;
    titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)));
    if Print=false:
    fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi;
    fi;
    trace titi;
    if #1*#3>0:
    label(TEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))));
    else:
    label(TEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile a*d
    if #1*#4<>0:
    for k=0 upto (abs(#4)-1):
    for l=0 upto (abs(#1)-1):
    path titi;
    titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)));
    if Print=false:
    fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi;
    fi;
    trace titi;
    if #1*#4>0:
    label(TEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))));
    else:
    label(TEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile b*c
    if #2*#3<>0:
    for k=0 upto (abs(#3)-1):
    for l=0 upto (abs(#2)-1):
    path titi;
    titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)));
    if Print=false:
    fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi;
    fi;
    trace titi;
    if #2*#3>0:
    label(TEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))));
    else:
    label(TEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile b*d
    if #2*#4<>0:
    for k=0 upto (abs(#4)-1):
    for l=0 upto (abs(#2)-1):
    path titi;
    titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)));
    if Print=false:
    fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi;
    fi;
    trace titi;
    if #2*#4>0:
    label(TEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))));
    else:
    label(TEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))));
    fi;
    endfor;
    endfor;
    fi;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={boolean Vide,Print; Vide=\useKV[ClesDistributivite]{Vide}; Print=\useKV[ClesDistributivite]{Impression};}]
    pair _CoinTuilev;
    _CoinTuilev=(0,0);
    numeric largeur,longueur,ecart;
    largeur=0.75;
    longueur=sqrt(3);
    ecart=0.6;
    pair _CoinTuileh;
    _CoinTuileh=u*(largeur+ecart,ecart);
    vardef tuilev(expr LL,ll,nb,col)(text t)=
    save $; picture $;
    save TT; picture TT;
    TT=image(
    path cc;
    cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll));
    if Print=false:
    fill cc withcolor col;
    fi;
    trace cc;
    label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)));
    );
    $=image(
    for k=0 upto nb-1:
    trace TT shifted(_CoinTuilev+k*u*(0,-ll));
    endfor;
    _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll));
    );
    $
    enddef;
    vardef tuileh(expr LL,ll,nb,col)(text t)=
    save $; picture $;
    picture TT;
    TT=image(
    path cc;
    cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll));
    if Print=false:
    fill cc withcolor col;
    fi;
    trace cc;
    label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)));
    );
    $=image(
    for k=0 upto nb-1:
    trace TT shifted(_CoinTuileh+k*u*(LL,0));
    endfor;
    _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0));
    );
    $
    enddef;
    color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg;
    ColorLetter=LightGreen;
    ColorLetterPos=ColorLetter;
    ColorLetterNeg=Tomato;
    ColorNum=Orange;
    ColorNumPos=ColorNum;
    ColorNumNeg=Tomato;
    ColorCarrePos:=LightBlue;
    ColorCarreNeg:=Tomato;
    if #1<0:
    ColorLetter:=Tomato;
    trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$");
    else:
    ColorLetter:=LightGreen;
    trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$");
    fi;
    if #2<0:
    ColorNum:=Tomato;
    trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$");
    else:
    ColorNum:=Orange;
    trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$");
    fi;
    if #3<0:
    ColorLetter:=Tomato;
    trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$");
    else:
    ColorLetter:=LightGreen;
    trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$");
    fi;
    if #4<0:
    ColorNum:=Tomato;
    trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$");
    else:
    ColorNum:=Orange;
    trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$");
    fi;
    trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2;
    trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2;
    drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2;
    labeloffset:=labeloffset*2;
    label.ulft(LATEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart)));
    labeloffset:=labeloffset/2;
    if Vide=false:
    %% tuile a*c
    if #1*#3<>0:
    for k=0 upto (abs(#3)-1):
    for l=0 upto (abs(#1)-1):
    path titi;
    titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)));
    if Print=false:
    fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi;
    fi;
    trace titi;
    if #1*#3>0:
    label(LATEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))));
    else:
    label(LATEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile a*d
    if #1*#4<>0:
    for k=0 upto (abs(#4)-1):
    for l=0 upto (abs(#1)-1):
    path titi;
    titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)));
    if Print=false:
    fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi;
    fi;
    trace titi;
    if #1*#4>0:
    label(LATEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))));
    else:
    label(LATEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile b*c
    if #2*#3<>0:
    for k=0 upto (abs(#3)-1):
    for l=0 upto (abs(#2)-1):
    path titi;
    titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)));
    if Print=false:
    fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi;
    fi;
    trace titi;
    if #2*#3>0:
    label(LATEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))));
    else:
    label(LATEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))));
    fi;
    endfor;
    endfor;
    fi;
    %tuile b*d
    if #2*#4<>0:
    for k=0 upto (abs(#4)-1):
    for l=0 upto (abs(#2)-1):
    path titi;
    titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)));
    if Print=false:
    fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi;
    fi;
    trace titi;
    if #2*#4>0:
    label(LATEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))));
    else:
    label(LATEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))));
    fi;
    endfor;
    endfor;
    fi;
    fi;
  \end{mpost}
  \fi
}

\newcommand\Affichage[4][]{%
  \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
  \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}%
  \ensuremath{%
    % partie du x^2
    \xintifboolexpr{#2==0}{}{\xintifboolexpr{#2==1}{}{\xintifboolexpr{#2==-1}{-}{\num{#2}}}\LETTRE^2}%
    % partie du x
    \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{%
        \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}}%
      }\LETTRE}%
    % partie du nombre
    \xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{}{+}}{+}\num{#4}}{%
        \xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{\num{#4}}{-\num{\fpeval{abs(#4)}}}}{-\num{\fpeval{abs(#4)}}}}}%
    % 
  }%
}%

\xdef\SommeA{0}%
\xdef\SommeB{0}%
\xdef\SommeC{0}%

\newcommand\Distri[5][]{%
  \useKVdefault[ClesDistributivite]%obligatoire car la macro n'est pas dans un groupe.
  \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
  \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}%
    \setcounter{NbCalculDistri}{0}%
  }{}%
  \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}%
  \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}%
  \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}%
  \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}%
  \ifboolKV[ClesDistributivite]{Cours}{%
    \ensuremath{%
      \xintifboolexpr{#2==0}{%
      }{\xintifboolexpr{#3==0}{}{(}}\xintifboolexpr{#2==0}{\Tikzmark{}}{\Tikzmark{a}}
      \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
      \xintifboolexpr{#3==0}{\Tikzmark{}}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{b}}%
      \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
      \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}%
      % 
      \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double
      \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk
      % 
      \xintifboolexpr{\Multi==0}{\times%
        \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
      \Tikzmark{c}%
      \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
      \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{d}%
      \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
      \xintifboolexpr{\Multi==0}{%
        \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
      %
      =
      %
      \xdef\Multi{\fpeval{#2*#4}}%
      \xintifboolexpr{\Multi==0}{}{%
        \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}%
      }
      \xdef\Multij{\fpeval{#2*#5}}%
      \xintifboolexpr{\Multij==0}{}{%
        \xintifboolexpr{\Multi==0}{}{+}%
        \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}%
      }%
      \xdef\Multik{\fpeval{#3*#4}}%
      \xintifboolexpr{\Multik==0}{}{%
        \xintifboolexpr{\Multi==0}{}{+}%
        \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}%
      }%
      \xdef\Multil{\fpeval{#3*#5}}%
      \xintifboolexpr{\Multil==0}{}{+%
        \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}%
      }%
      % Fleches
      \ifboolKV[ClesDistributivite]{Fleches}{%
        \xdef\Multi{\fpeval{#2*#3*#4*#5}}%
        \xintifboolexpr{\Multi==0}{%
          \xdef\Multij{\fpeval{#2*#3}}%\relax
          \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}
            }{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}%
        }{%
          \DrawArrow%
        }%
      }{}\setcounter{NbDistri}{0}%
    }%
  }{%
    \ifboolKV[ClesDistributivite]{Tuile}{%
      \Tuile{#2}{#3}{#4}{#5}%
    }{%
      \ensuremath{%
        \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{%
          \DistriEchange[#1]{#2}{#3}{#4}{#5}%
        }{%
          \ifboolKV[ClesDistributivite]{Remarquable}{%
            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
              \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi%
            }{}
            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{}
            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
              \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
              \stepcounter{NbCalculDistri}%
              \ifx\bla#4\bla%
              \xdef\Multi{\fpeval{#2*#2}}%
              \xdef\Multij{\fpeval{#2*#3}}%
              \xdef\Multik{\fpeval{#3*#2}}%
              \xdef\Multil{\fpeval{#3*#3}}%
              %% ils sont red\'efinis pour pouvoir envisager la somme de deux
              %% expressions \`a d\'evelopper
              \xdef\Multim{\fpeval{#2*#3+#3*#2}}%
              \ifboolKV[ClesDistributivite]{Oppose}{%
                \xdef\Multi{\fpeval{-\Multi}}%
                \xdef\Multim{\fpeval{-\Multim}}%
                \xdef\Multil{\fpeval{-\Multil}}%
                \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
                \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
                \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
              }{%
                \Affichage{\Multi}{\Multim}{\Multil}%
              }
              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}%
              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}%
              \else%
              \xdef\Multi{\fpeval{#2*#4}}%
              \xdef\Multij{\fpeval{#2*#5}}%
              \xdef\Multik{\fpeval{#3*#4}}%
              \xdef\Multil{\fpeval{#3*#5}}%
            %% ils sont red\'efinis pour pouvoir envisager la somme de deux
            %% expressions \`a d\'evelopper
              \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
              \ifboolKV[ClesDistributivite]{Oppose}{%
                \xdef\Multi{\fpeval{-\Multi}}%
                \xdef\Multim{\fpeval{-\Multim}}%
                \xdef\Multil{\fpeval{-\Multil}}%
                \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
                \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
                \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
              }{%
                \Affichage{\Multi}{\Multim}{\Multil}%
              }
              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
              \fi%
            }{}%
          }{%
            \ifboolKV[ClesDistributivite]{Numerique}{%
              \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{%
                \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}%
              }{%
                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{%
                  \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}%
                }{%
                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}%
                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}%
                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}%
                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}%
                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}%
                }%
              }%
            }{%
              \ifboolKV[ClesDistributivite]{All}{%
                \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}%
                \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}%
                \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}%
                \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do
                {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}%
                \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}%
              }{%
                % Etape 1
                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
                  \xintifboolexpr{#2==0}{%
                  }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
                  \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
                  \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%
                  \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
                  \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}%
                  % 
                  \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double
                  \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk
                  % 
                  \xintifboolexpr{\Multi==0}{\times%
                    \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
                  \Tikzmark{\Affichage[#1]{0}{#4}{0}}%
                  \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
                  \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}%
                  \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
                  \xintifboolexpr{\Multi==0}{%
                    \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
                  \ifboolKV[ClesDistributivite]{Fleches}{%
                    \xdef\Multi{\fpeval{#2*#3*#4*#5}}%
                    \xintifboolexpr{\Multi==0}{%
                      \xdef\Multij{\fpeval{#2*#3}}%\relax
                      \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}%
                    }{%
                      \DrawArrow%
                    }%
                  }{}\setcounter{NbDistri}{0}%
                }{}
                % Etape 2
                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
                  \xdef\Multi{\fpeval{#2*#4}}%
                  \xintifboolexpr{\Multi==0}{}{%
                    \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
                  }
                  \xdef\Multij{\fpeval{#2*#5}}%
                  \xintifboolexpr{\Multij==0}{}{%
                    \xintifboolexpr{\Multi==0}{}{+}%
                    \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
                  }%
                  \xdef\Multik{\fpeval{#3*#4}}%
                  \xintifboolexpr{\Multik==0}{}{%
                    \xintifboolexpr{\Multi==0}{}{+}%
                    \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
                  }%
                  \xdef\Multil{\fpeval{#3*#5}}%
                  \xintifboolexpr{\Multil==0}{}{+%
                    \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
                  }%
                }{}%
                % Etape 3
                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
                  \stepcounter{NbCalculDistri}%
                  \xdef\Multi{\fpeval{#2*#4}}%
                  \xdef\Multij{\fpeval{#2*#5}}%
                  \xdef\Multik{\fpeval{#3*#4}}%
                  \xdef\Multil{\fpeval{#3*#5}}%
                  %% ils sont red\'efinis pour pouvoir envisager la somme de deux
                  %% expressions \`a d\'evelopper
                  \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}%
                  \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{%
                      \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
                      \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
                    }%
                  }{%
                    \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
                    \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
                  }%
                  \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}%
                }{}%
                % Etape 4
                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{%
                  \xdef\Multi{\fpeval{#2*#4}}%
                  \xdef\Multij{\fpeval{#2*#5}}%
                  \xdef\Multik{\fpeval{#3*#4}}%
                  \xdef\Multil{\fpeval{#3*#5}}%
                  %% ils sont red\'efinis pour pouvoir envisager la somme de deux
                  %% expressions \`a d\'evelopper
                  \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
                  \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
                  \stepcounter{NbCalculDistri}%
                  \ifboolKV[ClesDistributivite]{Oppose}{%
                    \xdef\Multi{\fpeval{-\Multi}}%
                    \xdef\Multim{\fpeval{-\Multim}}%
                    \xdef\Multil{\fpeval{-\Multil}}%
                    \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
                    \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
                    \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
                  }{%
                    \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}%
                    \xintifboolexpr{\Multim==0}{}{%
                      \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
                    }%
                    \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}%
                  }
                  \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
                  \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
                }{}%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Resultat[1][]{%
  \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
  \ensuremath{%
    \Affichage{\SommeA}{\SommeB}{\SommeC}
  }
}

\newcommand\AffichageEchange[4][]{%
  \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
  \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}%
  \ensuremath{%
    % partie du nombre
    \xintifboolexpr{#2==0}{}{\num{#2}}%
    % partie du x
    \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{%
        \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}}
      }\LETTRE}%
    % partie du x^2
    \xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{}{+}}{+}\xintifboolexpr{#4==1}{}{\num{#4}}}{%
        \xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{\num{#4}}{-\num{\fpeval{abs(#4)}}}}{-\num{\fpeval{abs(#4)}}}}\LETTRE^2}%
  }%
}%

\newcommand\DistriEchange[5][]{%
  \ensuremath{%
    \useKVdefault[ClesDistributivite]%obligatoire car la macro n'est pas dans un groupe.
    \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
    \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}%
      \setcounter{NbCalculDistri}{0}%
    }{}%
    \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}%
    \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}%
    \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}%
    \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}%
    \ifboolKV[ClesDistributivite]{Remarquable}{%
      \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\ifx\bla#4\bla(\AffichageEchange{#2}{#3}{0})^2\else(\AffichageEchange{#2}{#3}{0})(\AffichageEchange{#4}{#5}{0})\fi
      }{}
      \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
        \ifx\bla#4\bla\xintifboolexpr{#3>0}{%
          \num{#2}^2+2\times\num{#2}\times\xintifboolexpr{#3==1}{}{\num{#3}}\useKV[ClesDistributivite]{Lettre}+
          \xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2%
        }{%
          \num{#2}^2-2\times\num{#2}\times\xintifboolexpr{#3==-1}{}{\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}+
          \xintifboolexpr{#3==-1}{}{(\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==-1}{}{)}^2%
        }%
        \else\num{#2}^2-\xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2%
        \fi%
      }{}
      \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
        \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
        \stepcounter{NbCalculDistri}%
        \ifx\bla#4\bla%
        \xdef\Multi{\fpeval{#2*#2}}%
        \xdef\Multij{\fpeval{#2*#3}}%
        \xdef\Multik{\fpeval{#3*#2}}%
        \xdef\Multil{\fpeval{#3*#3}}%
        %% ils sont red\'efinis pour pouvoir envisager la somme de deux
        %% expressions \`a d\'evelopper
        \xdef\Multim{\fpeval{#2*#3+#3*#2}}%
        \ifboolKV[ClesDistributivite]{Oppose}{%
          \xdef\Multi{\fpeval{-\Multi}}%
          \xdef\Multim{\fpeval{-\Multim}}%
          \xdef\Multil{\fpeval{-\Multil}}%
          \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
          \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
          \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
        }{%
          \AffichageEchange{\Multi}{\Multim}{\Multil}%
        }
        \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#3}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#2*#2}}}{}%
        \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#3}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#2*#2}}}{}%
        \else%
        \xdef\Multi{\fpeval{#2*#4}}%
        \xdef\Multij{\fpeval{#2*#5}}%
        \xdef\Multik{\fpeval{#3*#4}}%
        \xdef\Multil{\fpeval{#3*#5}}%
        %% ils sont red\'efinis pour pouvoir envisager la somme de deux
        %% expressions \`a d\'evelopper
        \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
        \ifboolKV[ClesDistributivite]{Oppose}{%
          \xdef\Multi{\fpeval{-\Multi}}%
          \xdef\Multim{\fpeval{-\Multim}}%
          \xdef\Multil{\fpeval{-\Multil}}%
          \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
          \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
          \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
        }{%
          \AffichageEchange{\Multi}{\Multim}{\Multil}%
        }
        % \`a faire
        \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#5}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#2*#4}}}{}%
        \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#5}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#2*#4}}}{}%
        % 
        \fi%
      }{}%
    }{%
      \ifboolKV[ClesDistributivite]{Numerique}{%
      }{%
        \ifboolKV[ClesDistributivite]{All}{%
           \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}%
           \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}%
           \xdef\ValeurEchange{\useKV[ClesDistributivite]{Echange}}
           \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do
           {\NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=##1]{#2}{#3}{#4}{#5}\\}%
           \NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=\NomFin]{#2}{#3}{#4}{#5}%
        }{%
          % Etape 1
          \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1||\useKV[ClesDistributivite]{Echange}==3}{%
              \xintifboolexpr{#2==0}{%
              }{\xintifboolexpr{#3==0}{%
                }{(}}\Tikzmark{\Affichage[#1]{0}{0}{#2}}%
              \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
              \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{\fpeval{abs(#3)}}{0}}%
              \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
              \xintifboolexpr{#2==0}{%
              }{\xintifboolexpr{#3==0}{%
                }{)}}%
            }{
              \xintifboolexpr{#2==0}{%
              }{\xintifboolexpr{#3==0}{%
                }{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
              \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
              \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%
              \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
              \xintifboolexpr{#2==0}{%
              }{\xintifboolexpr{#3==0}{%
                }{)}}%
            }%
            % 
            \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double
            \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk
            % 
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2||\useKV[ClesDistributivite]{Echange}==3}{%
              \xintifboolexpr{\Multi==0}{\times%
                \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
              \Tikzmark{\AffichageEchange[#1]{#4}{0}{0}}%
              \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
              \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{-}{}}\Tikzmark{\AffichageEchange[#1]{0}{\fpeval{abs(#5)}}{0}}%
              \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
              \xintifboolexpr{\Multi==0}{%
                \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
            }{%
              \xintifboolexpr{\Multi==0}{\times%
                \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
              \Tikzmark{\Affichage[#1]{0}{#4}{0}}%
              \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
              \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}%
              \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
              \xintifboolexpr{\Multi==0}{%
                \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
            }%
             \ifboolKV[ClesDistributivite]{Fleches}{%
             \xdef\Multi{\fpeval{#2*#3*#4*#5}}%
             \xintifboolexpr{\Multi==0}{%
             \xdef\Multij{\fpeval{#2*#3}}%\relax
             \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}
             }{%
               \DrawArrow
             }%
             }{}\setcounter{NbDistri}{0}%
          }{}%
          % Etape 2
          \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{%
              \xdef\Multi{\fpeval{#2*#4}}%
              \xintifboolexpr{\Multi==0}{}{%
                \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multij{\fpeval{#2*#5}}%
              \xintifboolexpr{\Multij==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
              }%
              \xdef\Multik{\fpeval{#3*#4}}%
              \xintifboolexpr{\Multik==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multil{\fpeval{#3*#5}}%
              \xintifboolexpr{\Multil==0}{}{+%
                \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
              }%
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{%
              \xdef\Multi{\fpeval{#2*#4}}%
              \xintifboolexpr{\Multi==0}{}{%
                \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multij{\fpeval{#2*#5}}%
              \xintifboolexpr{\Multij==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}%
              }%
              \xdef\Multik{\fpeval{#3*#4}}%
              \xintifboolexpr{\Multik==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multil{\fpeval{#3*#5}}%
              \xintifboolexpr{\Multil==0}{}{+%
                \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}%
              }%
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{%
              \xdef\Multi{\fpeval{#2*#4}}%
              \xintifboolexpr{\Multi==0}{}{%
                \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multij{\fpeval{#2*#5}}%
              \xintifboolexpr{\Multij==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}%
              }%
              \xdef\Multik{\fpeval{#3*#4}}%
              \xintifboolexpr{\Multik==0}{}{%
                \xintifboolexpr{\Multi==0}{}{+}%
                \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}%
              }%
              \xdef\Multil{\fpeval{#3*#5}}%
              \xintifboolexpr{\Multil==0}{}{+%
                \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}%
              }%
            }{}
          }{}          
          % Etape 3
          \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
            \stepcounter{NbCalculDistri}%
            \xdef\Multi{\fpeval{#2*#4}}%
            \xdef\Multij{\fpeval{#2*#5}}%
            \xdef\Multik{\fpeval{#3*#4}}%
            \xdef\Multil{\fpeval{#3*#5}}%
            %% ils sont red\'efinis pour pouvoir envisager la somme de deux
            %% expressions \`a d\'evelopper
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{%
            \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}%
              \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{\Multij}{0}{0}\xintifboolexpr{\Multij<0}{)}{}}%
              \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2=0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{0}{\Multik}\xintifboolexpr{\Multik<0}{)}{}}%
              \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}%
              \xdef\Multim{\fpeval{#2*#4+#3*#5}}%              
              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}%
              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}%              
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{%
            \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}%
              \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{0}{\Multij}\xintifboolexpr{\Multij<0}{)}{}}%
              \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{\Multik}{0}{0}\xintifboolexpr{\Multik<0}{)}{}}%
              \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}%
              \xdef\Multim{\fpeval{#2*#4+#3*#5}}%
              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}%
              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}%
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{%
            \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{\Multi}{0}{0})}{\AffichageEchange{\Multi}{0}{0}}}{\AffichageEchange{\Multi}{0}{0}}%
              \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
              \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
              \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}%
              \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}%
              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}%
            }{}%
          }{}%fin etape3
          % Etape 4
          \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{%
            \xdef\Multi{\fpeval{#2*#4}}%
            \xdef\Multij{\fpeval{#2*#5}}%
            \xdef\Multik{\fpeval{#3*#4}}%
            \xdef\Multil{\fpeval{#3*#5}}%
            %% ils sont red\'efinis pour pouvoir envisager la somme de deux
            %% expressions \`a d\'evelopper
            \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
            \stepcounter{NbCalculDistri}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{%
              \xdef\Multim{\fpeval{#2*#4+#3*#5}}%
              \ifboolKV[ClesDistributivite]{Oppose}{%
                \xdef\Multiko{\fpeval{-\Multik}}%
                \xdef\Multimo{\fpeval{-\Multim}}%
                \xdef\Multijo{\fpeval{-\Multij}}%
                 \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko<0}{(}{}\Affichage{\Multiko}{0}{0}\xintifboolexpr{\Multiko<0}{)}{}}%
                 \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}%
                 \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo>0}{+}{+(}\Affichage{0}{0}{\Multijo}\xintifboolexpr{\Multijo<0}{)}{}}%
              }{%
                \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multik<0}{(\Affichage{\Multik}{0}{0})}{\Affichage{\Multik}{0}{0}}}{\Affichage{\Multik}{0}{0}}%
              \xintifboolexpr{\Multim==0}{}{%
                \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
              }%
              \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multij<0}{-\Affichage{0}{0}{\fpeval{-\Multij}}}{+\Affichage{0}{0}{\Multij}}}%
              }%
               \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}%
               \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}%
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{%
              \xdef\Multim{\fpeval{#2*#4+#3*#5}}%
              \ifboolKV[ClesDistributivite]{Oppose}{%
                \xdef\Multijo{\fpeval{-\Multij}}%
                \xdef\Multimo{\fpeval{-\Multim}}%
                \xdef\Multiko{\fpeval{-\Multik}}%
                 \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo<0}{(}{}\Affichage{\Multijo}{0}{0}\xintifboolexpr{\Multijo<0}{)}{}}%
                 \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}%
                 \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko>0}{+}{+(}\Affichage{0}{0}{\Multiko}\xintifboolexpr{\Multiko<0}{)}{}}%
              }{%
                \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multij<0}{(\Affichage{\Multij}{0}{0})}{\Affichage{\Multij}{0}{0}}}{\Affichage{\Multij}{0}{0}}%
              \xintifboolexpr{\Multim==0}{}{%
                \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
              }%
              \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multik<0}{-\Affichage{0}{0}{\fpeval{-\Multik}}}{+\Affichage{0}{0}{\Multik}}}%
              }%
               \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}%
               \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}%
            }{}%
            \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{%
              \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
              \ifboolKV[ClesDistributivite]{Oppose}{%
                \xdef\Multilo{\fpeval{-\Multil}}%
                \xdef\Multimo{\fpeval{-\Multim}}%
                \xdef\Multio{\fpeval{-\Multi}}%
                 \xintifboolexpr{\Multilo==0}{}{\xintifboolexpr{\Multilo<0}{(}{}\Affichage{\Multilo}{0}{0}\xintifboolexpr{\Multilo<0}{)}{}}%
                 \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}%
                 \xintifboolexpr{\Multio==0}{}{\xintifboolexpr{\Multio>0}{+}{+(}\Affichage{0}{0}{\Multio}\xintifboolexpr{\Multio<0}{)}{}}%
               }{%
                \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multil<0}{(\Affichage{\Multil}{0}{0})}{\Affichage{\Multil}{0}{0}}}{\Affichage{\Multil}{0}{0}}%
              \xintifboolexpr{\Multim==0}{}{%
                \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
              }%
              \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{-\Affichage{0}{0}{\fpeval{-\Multi}}}{+\Affichage{0}{0}{\Multi}}}%
              }
               \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}%
               \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}%
            }{}%
          }{}%
        }%
      }%
    }%
  }%
}%

%%%
% Nombre Premier
%%%
\setKVdefault[ClesNombrePremier]{Tableau=false,TableauVide=false,TableauVertical=false,TableauVerticalVide=false,Exposant=false,Longue=false,All=false,Arbre=false,ArbreVide=false,ArbreComplet=false,ArbreDessine=false,ArbreDessineVide=false,Entoure=false,Entourefin=false,Diviseurs=false,DiviseursT=false,Dot=\dotfill,Impose=false,ImposeAll=false,Potence=false,Decalage=10,Vide=false,CouleurFeuillage=ForestGreen,CouleurTronc=BurlyWood,CouleurFruits=Red,CouleurTexte=white}%
\defKV[ClesNombrePremier]{Nombre=\ifboolKV[ClesNombrePremier]{ArbreDessine}{}{\ifboolKV[ClesNombrePremier]{ArbreDessineVide}{}{\setKV[ClesNombrePremier]{Impose}}}}%
\defKV[ClesNombrePremier]{AllNombre=\setKV[ClesNombrePremier]{ImposeAll}}%
\defKV[ClesNombrePremier]{Impression=\setKV[ClesNombrePremier]{CouleurFeuillage=white,CouleurTronc=white,CouleurFruits=gris,CouleurTexte=black}}

\newcommand\Decomposition[2][]{%
  \useKVdefault[ClesNombrePremier]%
  \setKV[ClesNombrePremier]{#1}%
  \ifboolKV[ClesNombrePremier]{Impose}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{Nombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{Nombre}}}}{}%
  \ifboolKV[ClesNombrePremier]{ImposeAll}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{AllNombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{AllNombre}}}}{}%
  \ifboolKV[ClesNombrePremier]{Tableau}{\NombrePremier{#2}}{}%
  \ifboolKV[ClesNombrePremier]{TableauVide}{\NombrePremier{#2}}{}%
  \ifboolKV[ClesNombrePremier]{Potence}{\NombrePremierPotence{#2}}{}%
  \ifboolKV[ClesNombrePremier]{TableauVertical}{\NombrePremierVertical{#2}}{}%
  \ifboolKV[ClesNombrePremier]{TableauVerticalVide}{\NombrePremierVerticalVide{#2}}{}%
  \ifboolKV[ClesNombrePremier]{Exposant}{\PremierExposant{#2}}{}%
  \ifboolKV[ClesNombrePremier]{Longue}{\PremierLong{#2}}{}%
  \ifboolKV[ClesNombrePremier]{All}{\NombrePremierExposant{#2}}{}%
  \ifboolKV[ClesNombrePremier]{Arbre}{\MPArbre{#2}}{}%
  \ifboolKV[ClesNombrePremier]{ArbreComplet}{\MPArbreComplet{#2}}{}%
  \ifboolKV[ClesNombrePremier]{ArbreVide}{\MPArbreVide{#2}}{}%
  \ifboolKV[ClesNombrePremier]{ArbreDessine}{\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}%
  \ifboolKV[ClesNombrePremier]{ArbreDessineVide}{\setKV[ClesNombrePremier]{Vide=true}\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}%
  \ifboolKV[ClesNombrePremier]{Diviseurs}{\ListeDiviseur{#2}}{}%
  \ifboolKV[ClesNombrePremier]{DiviseursT}{\ListeDiviseurT{#2}}{}%
}%

\def\MPArbre#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    numeric decalage;
    decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;

    k:=0;
    Ancre0:=(0,0);
    racine:=#1;

    label(btex \num{#1} etex,(0,0));
    forever:
    PremierSimple(racine);
    exitif racine=1;
    endfor;

    if \useKV[ClesNombrePremier]{Entoure}:
    for l=1 upto k:
    if Estcepremier(retenirnb[l]):
    draw cercles(Ancre[l],0.25*decalage);
    fi;
    endfor;
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; boolean Entoure; Entoure=\useKV[ClesNombrePremier]{Entoure};}]
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    
    k:=0;
    Ancre0:=(0,0);
    racine:=#1;
    label(LATEX("\num{"&decimal(racine)&"}"),(0,0));
    forever:
    PremierSimplePdf(racine);
    exitif racine=1;
    endfor;

    if \useKV[ClesNombrePremier]{Entoure}:
    for l=1 upto k:
    if Estcepremier(retenirnb[l]):
    draw cercles(Ancre[l],0.25*decalage);
    fi;
    endfor;
    fi;
\end{mpost}
\fi
}

\def\MPArbreComplet#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    numeric decalage;
    decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;
    
    dx:=1cm;
    dy:=1cm;
    
    pair N[][];
    nbe:=NbEtape(#1);
    Positions(nbe);
    if \useKV[ClesNombrePremier]{Entoure}:
    draw polygone(N[nbe-1][0]+(-0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,-0.25*decalage),N[nbe-1][0]+(-0.25*dx,-0.25*decalage)) dashed evenly;
  fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}]
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];

    dx:=1cm;
    dy:=1cm;

    pair N[][];

    PositionsPdf(NbEtape(#1));
  \end{mpost}
  \fi
}

\def\MPArbreVide#1{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    numeric decalage;
    decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;
    
    dx:=1cm;
    dy:=1cm;
    
    pair N[][];
    
    PositionsVide(NbEtape(#1));
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric decalage; decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}]
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    
    dx:=1cm;
    dy:=1cm;

    pair N[][];

    PositionsVidePdf(NbEtape(#1));
  \end{mpost}
  \fi
}

\def\MPArbreDessine#1#2{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}
    input PfCArithmetique;
    numeric depart;
    pair Ancre[];
    numeric decalage;
    decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;
    rayonfruits:=3mm;

    color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte;
    CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc};
    CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage};
    CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits};
    CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte};
    
    k:=0;
    Ancre0:=(0,0);
    racine:=#1;
    k:=1;
    Ancre1:=(-decalage,-decalage);
    draw Branche(Ancre0,Ancre1);
    retenirnb[1]:=#2;
    racine:=#2;
    forever:
    PremierSimpleArbre(racine);
    exitif racine=1;
    endfor;
    k:=k+1;
    Ancre[k]:=(decalage,-decalage);
    draw Branche(Ancre0,Ancre[k]);
    retenirnb[k]:=#1 div #2;
    racine:=retenirnb[k];
    forever:
    PremierSimpleArbre(racine);
    exitif racine=1;
    endfor;

    fill cercles(Ancre[0],rayonfruits) withcolor white;
    label(btex \num{#1} etex,(0,0));
    for l=1 upto k:
    if \useKV[ClesNombrePremier]{Vide}:
    fill cercles(Ancre[l],rayonfruits) withcolor white;
    else:
    if Estcepremier(retenirnb[l]):
    fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits;
    drawoptions(withcolor CouleurTexte);
    label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]);
    drawoptions();
    else:
    fill cercles(Ancre[l],rayonfruits) withcolor white;
    label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]);
    fi;
    fi;
    endfor;
    for l=0 upto k:
    draw cercles(Ancre[l],rayonfruits);
    endfor;
    picture Bilan;
    Bilan=currentpicture;
    currentpicture:=nullpicture;
    % Habillage
    % On récupère le min des ordonnées des Ancre pour le feuillage
    minord=1000;
    nbancrearetenir=0;
    for l=0 upto k:
    if ypart(Ancre[l])<minord:
    minord:=ypart(Ancre[l]);
    nbancrearetenir:=l;
    fi;
    endfor;
    pair D[];
    D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))];
    dotlabel("",D0);
    % Herbe du sol
    pair A[];
    A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm);
    A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm);
    for l=1 upto 9:
    A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90);
    endfor;
    %Pour le tronc
    pair B[];
    B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90);
    B2=symetrie(B1,Ancre0,1/2[A0,A10]);%=(-2mm,0);
    B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))];
    path tronc;
    tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;%
    fill tronc withcolor CouleurTronc;
    trace tronc;
    % Pour le feuillage
    path feuillage;
    feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));%
    pair C[];
    for l=0 upto 7:
    C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0;
    endfor;
    feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle;
    fill feuillage withcolor CouleurFeuillage;
    trace feuillage;
    draw Bilan;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte;CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc};CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage};CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; boolean Vide; Vide=\useKV[ClesNombrePremier]{Vide};}]
    input PfCArithmetiquePDF;
    numeric depart;
    pair Ancre[];
    rayonfruits:=3mm;
    
    k:=0;
    Ancre0:=(0,0);
    racine:=#1;
    k:=1;
    Ancre1:=(-decalage,-decalage);
    draw Branche(Ancre0,Ancre1);
    retenirnb[1]:=#2;
    racine:=#2;
    forever:
    PremierSimpleArbre(racine);
    exitif racine=1;
    endfor;
    k:=k+1;
    Ancre[k]:=(decalage,-decalage);
    draw Branche(Ancre0,Ancre[k]);
    retenirnb[k]:=#1 div #2;
    racine:=retenirnb[k];
    forever:
    PremierSimpleArbre(racine);
    exitif racine=1;
    endfor;

    fill cercles(Ancre[0],rayonfruits) withcolor white;
    label(btex \num{#1} etex,(0,0));
    for l=1 upto k:
    if Vide:
    fill cercles(Ancre[l],rayonfruits) withcolor white;
    else:
    if Estcepremier(retenirnb[l]):
    fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits;
    drawoptions(withcolor CouleurTexte);
    label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]);
    drawoptions();
    else:
    fill cercles(Ancre[l],rayonfruits) withcolor white;
    label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]);
    fi;
    fi;
    endfor;
    for l=0 upto k:
    draw cercles(Ancre[l],rayonfruits);
    endfor;
    picture Bilan;
    Bilan=currentpicture;
    currentpicture:=nullpicture;
    % Habillage
    minord=1000;
    nbancrearetenir=0;
    for l=0 upto k:
    if ypart(Ancre[l])<minord:
    minord:=ypart(Ancre[l]);
    nbancrearetenir:=l;
    fi;
    endfor;
    pair D[];
    D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))];
    pair A[];
    A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm);
    A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm);
    for l=1 upto 9:
    A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90);
    endfor;
    pair B[];
    B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90);
    B2=symetrie(B1,Ancre0,1/2[A0,A10]);%
    B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))];
    path tronc;
    tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;%
    fill tronc withcolor CouleurTronc;
    trace tronc;
    path feuillage;
    feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));%
    pair C[];
    for l=0 upto 7:
    C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0;
    endfor;
    feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle;
    fill feuillage withcolor CouleurFeuillage;
    trace feuillage;
    draw Bilan;
  \end{mpost}
\fi
}

\newcount\premier%

\newcommand\NombrePremier[1]{%\'ecrire la d\'ecomposition compl\`ete
  % #1 le nombre premier \`a tester
  \newcount\anp\newcount\bnp\newcount\cnp%
  \anp=#1\relax
  \bnp=2\relax
  \premier=-1\relax
  % Pour d\'eterminer le nombre d'\'etapes
  \whiledo{\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax
      \global\premier=\numexpr\premier+1\relax
      \cnp=\numexpr\anp/\bnp\relax
      \anp=\cnp\relax
    \else%
      \bnp=\numexpr\bnp+1\relax%
    \fi%
  }
  \ifnum\premier=0
    Le nombre \num{#1} est un nombre premier.
  \else
    \begin{align*}
      \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\ifboolKV[ClesNombrePremier]{TableauVide}{\phantom{\PremierEtape{#1}{##1}}}{\PremierEtape{#1}{##1}}\xintifboolexpr{##1<\premier}{\\}{}}%
    \end{align*}
  \fi
}

\newcount\premierun
\newcount\premierdeux

\newcommand\NombrePremierImpose[3]{%
  % #1 le nombre premier \`a tester
  % #2 est le premier facteur imposé
  % #3 est le deuxième facteur imposé
  \newcount\anp\newcount\bnp\newcount\cnp%
  % Pour d\'eterminer le nombre d'\'etapes pour #1
  \anp=#1\relax
  \bnp=2\relax
  \premier=-1\relax
  \whiledo{\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax
      \global\premier=\numexpr\premier+1\relax
      \cnp=\numexpr\anp/\bnp\relax
      \anp=\cnp\relax
    \else%
      \bnp=\numexpr\bnp+1\relax%
    \fi%
  }%
  % Pour d\'eterminer le nombre d'\'etapes pour #2
  \anp=#2\relax
  \bnp=2\relax
  \premierun=-1\relax
  \whiledo{\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax
      \global\premierun=\numexpr\premierun+1\relax
      \cnp=\numexpr\anp/\bnp\relax
      \anp=\cnp\relax
    \else%
      \bnp=\numexpr\bnp+1\relax%
    \fi%
  }%
  % Pour d\'eterminer le nombre d'\'etapes pour #3
  \anp=#3\relax
  \bnp=2\relax
  \premierdeux=-1\relax
  \whiledo{\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax
      \global\premierdeux=\numexpr\premierdeux+1\relax
      \cnp=\numexpr\anp/\bnp\relax
      \anp=\cnp\relax
    \else%
      \bnp=\numexpr\bnp+1\relax%
    \fi%
  }%
  \ifboolKV[ClesNombrePremier]{ImposeAll}{\xdef\PfCRappelImposeAll{1}}{\xdef\PfCRappelImposeAll{0}}%
  \ifnum\premier=0
  Le nombre \num{#1} est un nombre premier.
  \else
  \xintifboolexpr{\premierun>\premierdeux}{\premier=\premierun}{\premier=\premierdeux}
  \begin{align*}
    \num{#1}&=\num{#2}\times\num{#3}%\\
    \xintifboolexpr{\premier>0}{\\%
    \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\xintifboolexpr{##1<\premierun}{\PremierEtape{#2}{##1}}{\Decomposition[Longue]{#2}}\mathrel{\times}\xintifboolexpr{##1<\premierdeux}{\PremierEtape{#3}{##1}}{\Decomposition[Longue]{#3}}\xintifboolexpr{##1<\premier}{\\}{}}%
    }{}%
    \xintifboolexpr{\PfCRappelImposeAll==1}{\\\num{#1}&=\PremierExposant{#1}}{}%
  \end{align*}
  \fi
}%

\newcommand\NombrePremierVertical[1]{%\'ecrire la d\'ecomposition compl\`ete
  % #1 le nombre premier \`a tester
  \newcount\anpv\newcount\bnpv\newcount\cnpv%
  \anpv=#1\relax
  \bnpv=2\relax
  \premier=-1\relax
  % Pour d\'eterminer le nombre d'\'etapes
  \whiledo{\anpv > 1}{%
    \modulo{\the\anpv}{\the\bnpv}
    \ifnum\remainder=0\relax
      \global\premier=\numexpr\premier+1\relax
      \cnpv=\numexpr\anpv/\bnpv\relax
      \anpv=\cnpv\relax
    \else%
      \bnpv=\numexpr\bnpv+1\relax%
    \fi%
  }
  \ifnum\premier=0
    Le nombre \num{#1} est un nombre premier.
    \else
    \begin{tabular}{c|c}
      \xintFor* ##1 in {\xintSeq {0}{\premier}}\do
      {\PremierMultipleVide{#1}{##1}&\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape}
                                      \xintifboolexpr{##1<\premier}{\\}{\\1\\}}%
    \end{tabular}
  \fi
}

\newcommand\NombrePremierPotence[1]{%
  % #1 le nombre premier \`a tester
  \newcount\anpv\newcount\bnpv\newcount\cnpv%
  \anpv=#1\relax
  \bnpv=2\relax
  \premier=-1\relax
  % Pour d\'eterminer le nombre d'\'etapes
  \whiledo{\anpv > 1}{%
    \modulo{\the\anpv}{\the\bnpv}
    \ifnum\remainder=0\relax
      \global\premier=\numexpr\premier+1\relax
      \cnpv=\numexpr\anpv/\bnpv\relax
      \anpv=\cnpv\relax
    \else%
      \bnpv=\numexpr\bnpv+1\relax%
    \fi%
  }
  \ifnum\premier=0%
    Le nombre \num{#1} est un nombre premier.%
  \else%
  \xdef\PotenceCases{\fpeval{\premier+2}}%
    \begin{NiceTabular}{*{\PotenceCases}{c}}
      %\Body
      \PremierMultipleVide{#1}{0}&\multicolumn{1}{|c}{\PremierDiviseurVide{#1}{1}}\\
      \hhline{~-}
      \xintFor* ##1 in {\xintSeq {1}{\premier}}\do{%
        \xintifboolexpr{##1 == 0}{}{\xintFor* ##2 in {\xintSeq {1}{##1}}\do{%
            &}%
        }%
        \multicolumn{1}{|c}{\PremierMultipleVide{#1}{##1}}&\multicolumn{1}{|c}{\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape}}\\
        \hhline{*{\fpeval{##1+1}}{~}-}
      }%
      \xintFor* ##1 in {\xintSeq {1}{\fpeval{\PotenceCases-2}}}\do{%
        &}&\multicolumn{1}{|c}{1}\\
      \CodeAfter
      \tikz \draw [white,fill=white] (1 -|2) circle (0.5mm);
      \xintFor* ##1 in {\xintseq{2}{\PotenceCases}}\do{%
        \tikz \draw [white,fill=white,transform canvas={xshift=0mm}] (\fpeval{##1-1} -|##1) circle (0.5mm);
      }%
    \end{NiceTabular}%
  \fi%
}

\newcommand\PremierDiviseurVide[2]{%
  %#1 : le nombre entier \`a tester
  %#2 : le nombre d'\'etapes \`a effectuer
  \newcount\anpvv\newcount\bnpvv\newcount\cnpvv\newcount\dnpvv%
  \ensuremath{%
    \anpvv=#1\relax
    \bnpvv=2\relax
    \dnpvv=0\relax%
    \whiledo{\anpvv > 1}{%
      \whiledo{\dnpvv < \number#2}{%
        \modulo{\the\anpvv}{\the\bnpvv}
        \ifnum\remainder=0\relax
          \dnpvv=\numexpr\dnpvv+1\relax
          \cnpvv=\numexpr\anpvv/\bnpvv\relax
          \anpvv=\cnpvv\relax
        \else%
          \bnpvv=\numexpr\bnpvv+1\relax%
        \fi%
      }
      \num{\the\bnpvv}%
      \anpvv=1%
    }
  }
}

\newcommand\PremierMultipleVide[2]{%
  %#1 : le nombre entier \`a tester
  %#2 : le nombre d'\'etapes \`a effectuer
  \newcount\anpmv\newcount\bnpmv\newcount\cnpmv\newcount\dnpmv%
  \ensuremath{%
    \anpmv=#1\relax
    \bnpmv=2\relax
    \dnpmv=0\relax%
    \whiledo{\anpmv > 1}{%
      \whiledo{\dnpmv < \number#2}{%
        \modulo{\the\anpmv}{\the\bnpmv}
        \ifnum\remainder=0\relax
          \dnpmv=\numexpr\dnpmv+1\relax
          \cnpmv=\numexpr\anpmv/\bnpmv\relax
          \anpmv=\cnpmv\relax
        \else%
          \bnpmv=\numexpr\bnpmv+1\relax%
        \fi%
      }
      \num{\the\anpmv}%
      \anpmv=1%
    }
  }
}

\newcommand\NombrePremierVerticalVide[1]{%
  % #1 le nombre premier \`a tester
  \newcount\anpv\newcount\bnpv\newcount\cnpv%
  \anpv=#1\relax
  \bnpv=2\relax
  \premier=-1\relax
  % Pour d\'eterminer le nombre d'\'etapes
  \whiledo{\anpv > 1}{%
    \modulo{\the\anpv}{\the\bnpv}
    \ifnum\remainder=0\relax
      \global\premier=\numexpr\premier+1\relax
      \cnpv=\numexpr\anpv/\bnpv\relax
      \anpv=\cnpv\relax
    \else%
      \bnpv=\numexpr\bnpv+1\relax%
    \fi%
  }
  \ifnum\premier=0
    Le nombre \num{#1} est un nombre premier.%
    \else
    \renewcommand{\arraystretch}{1.5}
    \begin{tabular}{c|c}
      \PremierMultipleVide{#1}{0}&\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}\\
      \xintFor* ##1 in {\xintSeq {1}{\premier}}\do
      {\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}&\hbox
                              to1cm{\useKV[ClesNombrePremier]{Dot}}\xintifboolexpr{##1<\premier}{\\}{\\\hbox
      to1cm{\useKV[ClesNombrePremier]{Dot}}\\}}%
    \end{tabular}
    \renewcommand{\arraystretch}{1}
  \fi
}

\newcommand\NombrePremierExposant[1]{%
  \newcount\anp\newcount\bnp\newcount\cnp%
  % #1 le nombre premier \`a tester
  \anp=#1\relax%
  \bnp=2\relax%
  \premier=-1\relax%
  % Pour d\'eterminer le nombre d'\'etapes
  \whiledo{\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax%
      \global\premier=\numexpr\premier+1\relax%
      \cnp=\numexpr\anp/\bnp\relax%
      \anp=\cnp\relax%
    \else%
      \bnp=\numexpr\bnp+1\relax%
      \fi%
  }%
  \ifnum\premier=0%
    Le nombre \num{#1} est un nombre premier.%
  \else%
  \begin{align*}
      \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\PremierEtape{#1}{##1}\\}%
      \num{#1}&=\PremierExposant{#1}%
    \end{align*}%
  \fi%
}%
  
\newcommand\PremierEtape[2]{%
  %#1 : le nombre entier \`a tester
  %#2 : le nombre d'\'etapes \`a effectuer
  \newcount\anp\newcount\bnp\newcount\cnp\newcount\dnp%
  \ensuremath{%
    \anp=#1\relax
    \bnp=2\relax
    \dnp=0\relax%
    \whiledo{\anp > 1}{%
      \whiledo{\dnp < \number#2}{%
        \modulo{\the\anp}{\the\bnp}
        \ifnum\remainder=0\relax
          \dnp=\numexpr\dnp+1\relax
          \cnp=\numexpr\anp/\bnp\relax
          \anp=\cnp\relax
          \num{\the\bnp}\times%
        \else%
          \bnp=\numexpr\bnp+1\relax%
        \fi%
      }
      \num{\the\anp}%
      \anp=1%
    }
  }
}

\newcommand\PremierExposant[1]{%
  %#1 : le nombre entier \`a tester
  \ensuremath{%
  \newcount\anp\newcount\bnp\newcount\cnp%
  \newcount\pileb\newcount\exposant%
  \exposant=0\relax%
  \anp=#1\relax%
  \bnp=2\relax%
  \pileb=2\relax%
  \whiledo{\the\anp > 1}{%
    \modulo{\the\anp}{\the\bnp}
    \ifnum\remainder=0\relax
      \cnp=\numexpr\anp/\bnp\relax
      \ifnum\pileb=\bnp
      \exposant=\numexpr\exposant+1\relax
      \fi
      \anp=\cnp\relax
    \else%
      \ifnum\exposant>0\relax
        \num{\the\pileb}\ifnum\exposant>1 ^{\num{\the\exposant}}\fi\times%
      \fi
      \bnp=\numexpr\bnp+1\relax%
      \pileb=\bnp\relax%
      \exposant=0\relax%
    \fi%
  }%
  \num{\the\pileb}\ifnum\exposant>1^{\num{\the\exposant}}\fi%
  }%
}%

\newcommand\PremierLong[1]{%
  %#1 : le nombre entier \`a tester
  \ensuremath{%
  \newcount\anpl\newcount\bnpl\newcount\cnpl%
  \newcount\pilebl%
  \anpl=#1\relax%
  \bnpl=2\relax%
  \pilebl=2\relax%
  \whiledo{\the\anpl > 1}{%
    \modulo{\the\anpl}{\the\bnpl}
    \ifnum\remainder=0\relax
      \cnpl=\numexpr\anpl/\bnpl\relax
      \num{\the\bnpl}\ifnum\anpl>\bnpl\times\fi%
      \anpl=\cnpl\relax
    \else%
      \bnpl=\numexpr\bnpl+1\relax%
      \pilebl=\bnpl\relax%
    \fi%
    }
  }
}

\newcommand\ListeDiviseur[1]{%#1 : le nombre entier \`a tester
  \newcount\anp\newcount\bnp%
  \anp=#1%
  \bnp=2\relax%
  1 %
  \whiledo{\bnp<\anp}{%
    \modulo{\the\anp}{\the\bnp}{}%
    \ifnum\remainder=0%
    ; $\num{\the\bnp}$ %
    \fi%
    \bnp=\numexpr\bnp+1%
  }%
  et \num{\the\anp}%
}

\newcount\anpT\newcount\bnpT\newcount\cnpT\newcount\dnpT%

\newcommand\ListeDiviseurT[1]{%#1 : le nombre entier \`a tester
  \anpT=#1%
  \bnpT=2\relax%
  %On compte les diviseurs propres.
  \cnpT=0\relax%
  \whiledo{\bnpT<\anpT}{%
    \modulo{\the\anpT}{\the\bnpT}{}%
    \ifnum\remainder=0%
    \cnpT=\numexpr\cnpT+1%
    \fi%
    \bnpT=\numexpr\bnpT+1%
  }%
  \ifodd\cnpT%
    \begin{tabular}{c|c}%
    1&\num{#1}\\
    \xintFor* ##1 in {\xintSeq {1}{\fpeval{(\cnpT+1)/2}}}\do{%
    \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\xintifboolexpr{\dnpT=\fpeval{#1/\dnpT}}{}{\num{\fpeval{#1/\dnpT}}}\\
    }
  \end{tabular}%
  \else%
    \begin{tabular}{c|c}
    1&\num{#1}\\
    \xintFor* ##1 in {\xintSeq {1}{\fpeval{\cnpT/2}}}\do{%
    \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\num{\fpeval{#1/\dnpT}}\\
    }
  \end{tabular}%
  \fi%
}%

\newcommand\DiviseurNumero[2]{%
  % #1 nb entier \`a tester
  % #2 no du diviseur (\`a part 1 et #1)
  \anpT=#1%
  \bnpT=2\relax%
  %On compte les diviseurs propres.
  \cnpT=0\relax%
  \whiledo{\bnpT<\anpT}{%
    \modulo{\the\anpT}{\the\bnpT}{}%
    \ifnum\remainder=0%
    \cnpT=\numexpr\cnpT+1%
    \ifnum\cnpT=\numexpr#2-1%
    \dnpT=\bnpT%
    \bnpT=\anpT%
    \fi%
    \fi%
    \bnpT=\numexpr\bnpT+1%
  }%
}

%%%
% Simplification
%%%
\makeatletter%by christian Tellechea
% Calcul du PGCD de #1 et #2
\newcount\cnt@a\newcount\cnt@b\newcount\pgcd
\def\PGCD#1#2{%
  \ifnum#1>#2\cnt@a#1\cnt@b#2\else\cnt@a#2\cnt@b#1\relax\fi
  \PGCD@i
}
\def\PGCD@i{\edef\PGCD@ii##1{##1{\number\cnt@a}{\number\cnt@b}}\PGCD@ii\PGCD@iii}
\def\PGCD@iii#1#2{%
  \cnt@b#1\relax\global\divide\cnt@b#2%
  \global\cnt@b\numexpr#1-#2*\cnt@b%
  \global\cnt@a#2\global\pgcd\cnt@a%
  \ifnum\cnt@b>\z@\expandafter\PGCD@i%
  \fi}%
\makeatother

\def\SSimplifie#1#2{%
  % Simplification d'une \'ecriture #1/#2
  \ensuremath{
    \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno
    \numerateur=\number#1
    \denominateur=\number#2
    \ifnum\number#1<0\relax
      \valabsnum=\numexpr0-\number#1
    \else
      \valabsnum=\number#1
    \fi
    \ifnum\number#2<0\relax
      \valabsdeno=\numexpr0-\number#2
    \else
      \valabsdeno=\number#2
    \fi
    \ifnum\the\numerateur<0\relax
      \ifnum\the\denominateur<0\relax
        \numerateur=\valabsnum
        \denominateur=\valabsdeno
      \fi
    \else
      \ifnum\the\denominateur<0\relax
        \numerateur=-\valabsnum
        \denominateur=\valabsdeno
      \fi
    \fi
    \ifnum\number#2=0\relax
      \text{\bfseries(???)}
    \else
      \ifnum\number#1=0\relax
        0
      \else
        \PGCD{\the\valabsnum}{\the\valabsdeno}%
        \ifnum\pgcd>1\relax
          \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{%
            \divide\numerateur by \denominateur\num{\the\numerateur}
          }{\divide\numerateur by\pgcd%
            \divide\denominateur by\pgcd%
            \frac{\num{\the\numerateur}}{\num{\the\denominateur}}
          }
        \else%%%comme on est avec les n\'egatifs, on doit regarder si la valeur absolue est \'egale \`a 1
          \ifnum\valabsdeno=1\relax
            \divide\numerateur by \denominateur\num{\the\numerateur}
          \else
            \frac{\num{\the\numerateur}}{\num{\the\denominateur}}
          \fi
        \fi%
      \fi%
    \fi%
  }%
}


\newcommand\SSimpli[2]{%
  % D\'ecomposition d'une simplification de #1/#2
  \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno%
  \numerateur=\number#1
  \denominateur=\number#2
  \ifnum\number#1<0
  \valabsnum=\numexpr0-\number#1
  \else
  \valabsnum=\number#1
  \fi
  \ifnum\number#2<0
  \valabsdeno=\numexpr0-\number#2
  \else
  \valabsdeno=\number#2
  \fi
  \ifnum\the\numerateur<0\relax
    \ifnum\the\denominateur<0\relax
      \numerateur=\valabsnum
      \denominateur=\valabsdeno
    \fi
  \else
    \ifnum\the\denominateur<0\relax
      \numerateur=-\valabsnum
      \denominateur=\valabsdeno
    \fi
  \fi
  \ifnum\number#2=0\relax
    \ensuremath{\text{\bfseries(???)}}
  \else
      \ifnum\number#1=0\relax
        0
      \else
        \PGCD{\the\valabsnum}{\the\valabsdeno}%
        \ifnum\pgcd>1\relax
          \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{%
            \divide\numerateur by \denominateur\num{\the\numerateur}
          }{%\divide\numerateur by\pgcd%
            % \divide\denominateur by\pgcd%
            \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}%
          }
        \else
          \ifnum\denominateur=1\relax
            \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}
          \else
            \ensuremath{\frac{\num{\the\numerateur}}{\num{\the\denominateur}}}
          \fi
        \fi
      \fi
    \fi
}

\newcount\anpdc\newcount\bnpdc\newcount\cnpdc\newcount\dnpdc%
\newcount\DivCom
\newcommand\DiviseurCommun[2]{%
  % #1 : le premier nombre entier
  % #2 : le deuxi\`eme nombre entier
 % nombre 1 vaut #1 - Nombre 2 vaut #2
  \anpdc=#1%
  \cnpdc=#2%
  \bnpdc=2\relax%
  \dnpdc=\numexpr#1+1\relax%
  \DivCom=1\relax%
  \whiledo{\bnpdc<\dnpdc}{%
    \modulo{\the\anpdc}{\the\bnpdc}\relax
    \ifnum\remainder=0%
    \modulo{\the\cnpdc}{\the\bnpdc}
    \ifnum\remainder=0%
    \DivCom=\bnpdc%
    \bnpdc=\anpdc%
    \else%
    \DivCom=1%
    \fi
    \else%
    \DivCom=1%
    \fi
    \bnpdc=\numexpr\bnpdc+1\relax%
  }%
}

\newcommand\LongueSimplification[2]{%
  \xdef\NumerateurDiv{#1}%
  \xdef\DenominateurDiv{#2}%
  \DiviseurCommun{#1}{#2}%
  \ensuremath{%
    \whiledo{\DivCom>1}{%
      \frac{\num{\fpeval{\NumerateurDiv/\the\DivCom}}\times\num{\the\DivCom}}{\num{\fpeval{\DenominateurDiv/\the\DivCom}}\times\num{\the\DivCom}}=\frac{\num{\fpeval{\NumerateurDiv/\DivCom}}}{\num{\fpeval{\DenominateurDiv/\DivCom}}}%
      \xdef\NumerateurDiv{\fpeval{\NumerateurDiv/\DivCom}}%
      \xdef\DenominateurDiv{\fpeval{\DenominateurDiv/\DivCom}}%
      \DiviseurCommun{\NumerateurDiv}{\DenominateurDiv}%
      \xintifboolexpr{\DivCom>1}{=}{}%
    }%
  }%
}%

\setKVdefault[ClesSimplification]{Details=false,All=false,Longue=false,Fleches=false,Contraire=0}

\newcounter{NbFrac}%
\setcounter{NbFrac}{0}%

\newcommand\Simplification[3][]{%
  \stepcounter{NbFrac}%
  \useKVdefault[ClesSimplification]%
  \setKV[ClesSimplification]{#1}%
  \ifboolKV[ClesSimplification]{Fleches}{%
    \setsepchar[*]{,*/}%\ignoreemptyitems
    \readlist*\Listea{#2}%
    \readlist*\Listeb{#3}%
    \setbox1=\hbox{\Listea[1,1]{}}%
    \setbox2=\hbox{\Listeb[1,1]}%
    \setbox3=\hbox{\Listea[1,3]}%
    \setbox4=\hbox{\Listeb[1,3]}%
     \ensuremath{%
       \frac{\tikzmarknode[anchor=north]{A-\theNbFrac}{\Listea[1,1]}{}}{\tikzmarknode[anchor=south]{B-\theNbFrac}{\Listeb[1,1]}{}}=\frac{\tikzmarknode[anchor=north]{C-\theNbFrac}{\Listea[1,3]}{}}{\tikzmarknode[anchor=south]{D-\theNbFrac}{\Listeb[1,3]}{}}%
     }%
     \begin{tikzpicture}[remember picture,overlay]%
       \draw[out=45,in=135,-stealth,transform canvas={yshift=0.25em}]
       let
       \p1=(pic cs:A-\theNbFrac),
       \p2=(pic cs:C-\theNbFrac)
       in (pic cs:A-\theNbFrac) to node[midway,above]{\Listea[1,2]}(\x2,\y1);
      \draw[out=-45,in=-135,-stealth,transform canvas={yshift=-0.25em}] (pic cs:B-\theNbFrac) to node[midway,below]{\Listeb[1,2]}(pic cs:D-\theNbFrac);%
    \end{tikzpicture}%
  }{%
    \xintifboolexpr{\useKV[ClesSimplification]{Contraire}>1}{%
      \ensuremath{%
        \frac{\num{#2}}{\num{#3}}=\frac{\num{#2}\times\num{\useKV[ClesSimplification]{Contraire}}}{\num{#3}\times\num{\useKV[ClesSimplification]{Contraire}}}=\frac{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#2}}}{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#3}}}%
      }%
    }{%
      \ifboolKV[ClesSimplification]{Longue}{%
        \LongueSimplification{#2}{#3}%
      }{%
        \ifboolKV[ClesSimplification]{Details}{\SSimpli{#2}{#3}}{\ifboolKV[ClesSimplification]{All}{\ensuremath{\SSimpli{#2}{#3}=\SSimplifie{#2}{#3}}}{\SSimplifie{#2}{#3}}}%
      }%
    }%
  }%
}%

%%%
% Thales
%%%
\newcount\ppcm%

\newcommand\PPCM[2]{%
  \PGCD{#1}{#2}%
  \ppcm=\numexpr#1*#2/\pgcd\relax%
}%

\setKVdefault[ClesThales]{Calcul=true,Droites=false,Propor=false,Segment=false,Figure=false,FigureSeule=false,Figurecroisee=false,FigurecroiseeSeule=false,Angle=0,Precision=2,Entier=false,Unite=cm,Reciproque=false,Produit=false,ChoixCalcul=0,Simplification,Redaction=false,Remediation=false,Echelle=1cm,Perso=false,CalculsPerso=false,IntroCalculs}

\DeclareSIUnit{\PfCThalesUnit}{\useKV[ClesThales]{Unite}}%

%On d\'efinit la figure \`a utiliser
\def\MPFigThales#1#2#3#4#5#6{
    % #1 Premier sommet
    % #2 Deuxi\`eme sommet
    % #3 Troisi\`eme sommet
    % #4 point sur le segment #1#2
    % #5 point sur le segment #1#3
    % #6 angle de rotation
  \ifluatex
%  \mplibcodeinherit{enable}
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesThales]{Echelle};
    pair A,B,C,M,N,O;%
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(4,0);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    M=point(0.4*length cotes1) of cotes1;
    N=point(0.6*length cotes3) of cotes3;
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    path triangle;
    triangle=cotes1--cotes2--cotes3--cycle;
    draw triangle;
    draw cotes4;
    %on labelise
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex #4 etex,1.1[C,M]);
    label(btex #5 etex,1.1[B,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4);
    pair I,J,K;
    I=1/2[M,N];
    J=1/2[B,C];
    K=1/2[I,J];
    path cd;
    cd=(fullcircle scaled 6mm) shifted K;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd);
    drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd);
    draw cd;
    label(btex $//$ etex ,K);
    drawoptions();
  \end{mplibcode}
%  \mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}]
    pair A,B,C,M,N,O;%
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(4,0);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    M=point(0.4*length cotes1) of cotes1;
    N=point(0.6*length cotes3) of cotes3;
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    path triangle;
    triangle=cotes1--cotes2--cotes3--cycle;
    draw triangle;
    draw cotes4;
    %on labelise
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex #4 etex,1.1[C,M]);
    label(btex #5 etex,1.1[B,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4);
    pair I,J,K;
    I=1/2[M,N];
    J=1/2[B,C];
    K=1/2[I,J];
    path cd;
    cd=(fullcircle scaled 6mm) shifted K;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd);
    drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd);
    draw cd;
    label(btex $//$ etex ,K);
    drawoptions();
  \end{mpost}
  \fi
}

%On d\'efinit la figure \`a utiliser
\def\MPFigReciThales#1#2#3#4#5#6{
    % #1 Premier sommet
    % #2 Deuxi\`eme sommet
    % #3 Troisi\`eme sommet
    % #4 point sur le segment #1#2
    % #5 point sur le segment #1#3
  \ifluatex
  \mplibcodeinherit{enable}
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesThales]{Echelle};
    pair A,B,C,M,N,O;%
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(4,0);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    M=point(0.4*length cotes1) of cotes1;
    N=point(0.6*length cotes3) of cotes3;
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    path triangle;
    triangle=cotes1--cotes2--cotes3--cycle;
    draw triangle;
    draw cotes4;
    %on labelise
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex #4 etex,1.1[C,M]);
    label(btex #5 etex,1.1[B,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4);
  \end{mplibcode}
  \mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}]
    pair A,B,C,M,N,O;%
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(4,0);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    M=point(0.4*length cotes1) of cotes1;
    N=point(0.6*length cotes3) of cotes3;
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    path triangle;
    triangle=cotes1--cotes2--cotes3--cycle;
    draw triangle;
    draw cotes4;
    %on labelise
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex #4 etex,1.1[C,M]);
    label(btex #5 etex,1.1[B,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4);
  \end{mpost}
  \fi
}

%On d\'efinit la deuxi\`eme figure \`a utiliser
\def\MPFigThalesCroisee#1#2#3#4#5#6{%
    % #1 Premier sommet
    % #2 Deuxi\`eme sommet
    % #3 Troisi\`eme sommet
    % #4 point sur la droite #1#2
    % #5 point sur la droite #1#3
  \ifluatex
  \mplibforcehmode
  \mplibcodeinherit{enable}
  \begin{mplibcode}
    u:=\useKV[ClesThales]{Echelle};
    pair A,B,C,M,N,O;%
    O=(2.5u,2.5u);
    path cc;
    cc=(fullcircle scaled 3u) shifted O;
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.1*length cc) of cc;
    B=A rotatedabout(O,130);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    M=1.4[B,A];
    N=1.4[C,A];
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)};
    cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)};
    cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)};
    cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)};
    for k=1 upto 6:
    draw cotes[k];
    endfor;
    pair I;
    % On d\'efinit le centre du cercle inscrit \`a AMC
    (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C];
    (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C];
    %on labelise
    label(btex #1 etex,I);
    label(btex #2 etex,1.2[M,B]);
    label(btex #3 etex,1.2[N,C]);
    label(btex #4 etex,1.1[B,M]);
    label(btex #5 etex,1.1[C,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4);
    pair I,J,K;
    I=1.1[N,M];
    J=1.1[B,C];
    K=1/2[I,J];
    path cd;
    cd=(fullcircle scaled 6mm) shifted K;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd);
    drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd);
    draw cd;
    label(btex $//$ etex ,K);
    drawoptions();
  \end{mplibcode}
  \mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}]
    pair A,B,C,M,N,O;%
    O=(2.5u,2.5u);
    path cc;
    cc=(fullcircle scaled 3u) shifted O;
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.1*length cc) of cc;
    B=A rotatedabout(O,130);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    M=1.4[B,A];
    N=1.4[C,A];
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)};
    cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)};
    cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)};
    cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)};
    for k=1 upto 6:
    draw cotes[k];
    endfor;
    pair I;
    % On d\'efinit le centre du cercle inscrit \`a AMC
    (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C];
    (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C];
    %on labelise
    label(btex #1 etex,I);
    label(btex #2 etex,1.2[M,B]);
    label(btex #3 etex,1.2[N,C]);
    label(btex #4 etex,1.1[B,M]);
    label(btex #5 etex,1.1[C,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4);
    pair I,J,K;
    I=1.1[N,M];
    J=1.1[B,C];
    K=1/2[I,J];
    path cd;
    cd=(fullcircle scaled 6mm) shifted K;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd);
    drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd);
    draw cd;
    label(btex $//$ etex ,K);
    drawoptions();
  \end{mpost}
  \fi
}

%On d\'efinit la deuxi\`eme figure \`a utiliser
\def\MPFigReciThalesCroisee#1#2#3#4#5#6{%
  % #1 Premier sommet
    % #2 Deuxi\`eme sommet
    % #3 Troisi\`eme sommet
    % #4 point sur la droite #1#2
    % #5 point sur la droite #1#3
  \ifluatex
  \mplibforcehmode
  \mplibcodeinherit{enable}
  \begin{mplibcode}
    u:=\useKV[ClesThales]{Echelle};
    pair A,B,C,M,N,O;%
    O=(2.5u,2.5u);
    path cc;
    cc=(fullcircle scaled 3u) shifted O;
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.1*length cc) of cc;
    B=A rotatedabout(O,130);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    M=1.4[B,A];
    N=1.4[C,A];
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)};
    cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)};
    cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)};
    cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)};
    for k=1 upto 6:
    draw cotes[k];
    endfor;
    pair I;
    % On d\'efinit le centre du cercle inscrit \`a AMC
    (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C];
    (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C];
    %on labelise
    label(btex #1 etex,I);
    label(btex #2 etex,1.2[M,B]);
    label(btex #3 etex,1.2[N,C]);
    label(btex #4 etex,1.1[B,M]);
    label(btex #5 etex,1.1[C,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2);
  \end{mplibcode}
  \mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}]
    pair A,B,C,M,N,O;%
    O=(2.5u,2.5u);
    path cc;
    cc=(fullcircle scaled 3u) shifted O;
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=point(0.1*length cc) of cc;
    B=A rotatedabout(O,130);
    C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]);
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#6);
    B:=B rotatedabout(O,#6);
    C:=C rotatedabout(O,#6);
    % on dessine \`a main lev\'ee :)
    M=1.4[B,A];
    N=1.4[C,A];
    path cotes[];
    cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)};
    cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)};
    cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)};
    cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)};
    cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)};
    for k=1 upto 6:
    draw cotes[k];
    endfor;
    pair I;
    % On d\'efinit le centre du cercle inscrit \`a AMC
    (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C];
    (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C];
    %on labelise
    label(btex #1 etex,I);
    label(btex #2 etex,1.2[M,B]);
    label(btex #3 etex,1.2[N,C]);
    label(btex #4 etex,1.1[B,M]);
    label(btex #5 etex,1.1[C,N]);
    fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4);
    fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2);
    fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2);
  \end{mpost}
  \fi
}

\newcommand\RedactionThales{}%
\newcommand\EcritureCalculs{}%
\newcommand\EcritureQuotients{}%

%%%
\newcommand\TTThales[6][]{%
  \useKVdefault[ClesThales]%
  \setKV[ClesThales]{#1}%
  \ifboolKV[ClesThales]{Perso}{\RedactionThales}{%
    \ifboolKV[ClesThales]{Droites}{%
      Les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#5)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#4#6)$} sont s\'ecantes en \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2$}.%
    }{%
      Dans le triangle \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2#3#4$}, \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#5$} est un point \ifboolKV[ClesThales]{Segment}{du segment}{de la
        droite}
      \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#3]$}{$(#2#3)$}},
      \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#6$} est un
      point \ifboolKV[ClesThales]{Segment}{du segment}{de la droite}
      \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#4]$}{$(#2#4)$}}.%
    }
    \\Comme les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#5#6)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#4)$} sont parall\`eles, alors \ifboolKV[ClesThales]{Propor}{le tableau%
      \[\begin{array}{c|c|c}
          \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#5}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#6}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#5#6}\\
          \hline
          \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#3}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#4}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#3#4}\\
        \end{array}
      \]
      est un tableau de proportionnalit\'e\ifboolKV[ClesThales]{Segment}{.}{ d'apr\`es le th\'eor\`eme de Thal\`es.}%
    }{%
      \ifboolKV[ClesThales]{Segment}{on a :}{le th\'eor\`eme de Thal\`es permet d'\'ecrire :}%
      \[\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#5}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#3}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#6}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#4}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#5#6}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#3#4}}\]%
    }%
  }%
}%

\newcommand\TThalesCalculsD[8][]{%
  \setKV[ClesThales]{#1}%
  \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire%
  \def\Nomx{}%
  \def\Nomy{}%
  \def\Nomz{}%
  \zzz=0\yyy=0\xxx=0%
  \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
\IfDecimal{#3}{%
  \IfDecimal{#6}{}{%
    \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \xxx=5263%#6&=\frac{#3\times#7}{#4}\\
          \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#7}{Valx}\opcopy{#4}{denox}%
          \xdef\ResultatThalesx{\fpeval{round(#3*#7/#4,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\]
              \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}%
              \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}%
          }{}}{}
        }
      }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\]
            \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}%
            \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}%
          }{}}{}
      }
    }
  }{%
    \IfDecimal{#6}{%
      \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]%
          \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#4}{Valx}\opcopy{#7}{denox}%
          \xdef\ResultatThalesx{\fpeval{round(#6*#4/#7,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547
              \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\]
              \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}%
            }{}}{}
        }
      }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547
            \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\]
            \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}%
          }{}}{}
      }
    }{}
  }%
  % 
  \IfDecimal{#4}{%
    \IfDecimal{#7}{}{%
      \IfDecimal{#5}{%
        \IfDecimal{#8}{%
          \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]%
          \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#8}{Valy}\opcopy{#5}{denoy}%
          \xdef\ResultatThalesy{\fpeval{round(#4*#8/#5,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\]
              \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}%
              \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}%
            }{}}{}
        }
      }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\]
            \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}%
            \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}%
            }{}}{}
      }
    }
  }{%
    \IfDecimal{#7}{%
      \IfDecimal{#5}{%
        \IfDecimal{#8}{%
          \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]%
          \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#5}{Valy}\opcopy{#8}{denoy}%
          \xdef\ResultatThalesy{\fpeval{round(#7*#5/#8,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\]
              \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}%
              \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\]
            \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}%
            \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}%
            }{}}{}
      }}{}}%
  % 
  \IfDecimal{#5}{%
    \IfDecimal{#8}{}{%
      \IfDecimal{#4}{
        \IfDecimal{#7}{
          \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]%
          \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#7}{Valz}\opcopy{#4}{denoz}%
          \xdef\ResultatThalesz{\fpeval{round(#5*#7/#4,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\]
              \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}%
              \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\]
            \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}%
            \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}%
            }{}}{}
      }
    }
  }{%
    \IfDecimal{#8}{%
      \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]%
          \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#4}{Valz}\opcopy{#7}{denoz}%
          \xdef\ResultatThalesz{\fpeval{round(#8*#4/#7,\useKV[ClesThales]{Precision})}}%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\]
              \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}%
              \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\]
            \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}%
            \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}%
            }{}}{}
      }}{}
  }%  
  %%
  \StrMid{\the\zzz}{1}{1}[\cmza]%
  \StrMid{\the\yyy}{1}{1}[\cmya]%
  \StrMid{\the\xxx}{1}{1}[\cmxa]%
  \ifboolKV[ClesThales]{Calcul}{%
  %%%%%%%%%%%%%%%%%%%%%%%%%%%
  \ifboolKV[ClesThales]{IntroCalculs}{On remplace par les longueurs connues :}{}%
  \ifboolKV[ClesThales]{CalculsPerso}{%
    \EcritureQuotients%
  }{%
    \ifboolKV[ClesThales]{Propor}{%
      \[\begin{array}{c|c|c}
          \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\
          \hline
          \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8}
        \end{array}
      \]
    }{%
      \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\]
    }%
  }%
  % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs.
  \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}%
  \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}{}%
  %% on fait les calculs
  \ifboolKV[ClesThales]{CalculsPerso}{%
    \EcritureCalculs%
  }{%
    \begin{align*}
      % Premier compteur \xxx
      \ifnum\cmxa>0
      \Nomx\uppercase{&}=\frac{\opexport{valx}{\valx}\num{\valx}\times\opexport{Valx}{\Valx}\num{\Valx}}{\opexport{denox}{\denox}\num{\denox}}\relax%\global\numx=\numexpr\opprint{valx}*\opprint{Valx}\relax
    \fi
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \ifnum\cmxa=0
      \else
        \uppercase{&}
      \fi%
      \Nomy\uppercase{&}=\frac{\opexport{valy}{\valy}\num{\valy}\times\opexport{Valy}{\Valy}\num{\Valy}}{\opexport{denoy}{\denoy}\num{\denoy}}\relax%\global\numy=\numexpr\opprint{valy}*\opprint{Valy}\relax
    \fi
    % Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \ifnum\cmxa=0
        \ifnum\cmya=0                           
          %
        \else
          \uppercase{&}
        \fi
        \Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax
      \else
        \uppercase{&}\Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax
      \fi
    \fi
    \\
%    % 2eme ligne du tableau : calcul des num\'erateurs
%        %Premier compteur \xxx
    \ifnum\cmxa>0
      \Nomx\uppercase{&}=\frac{\opmul*{valx}{Valx}{numx}\opexport{numx}{\numx}\num{\numx}}{\opexport{denox}{\denox}\num{\denox}}
    \fi
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \ifnum\cmxa=0
        %
      \else
        \uppercase{&}
      \fi
      \Nomy\uppercase{&}=\frac{\opmul*{valy}{Valy}{numy}\opexport{numy}{\numy}\num{\numy}}{\opexport{denoy}{\denoy}\num{\denoy}}%
    \fi
%    %Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \ifnum\cmxa=0
        \ifnum\cmya=0                           
          %
        \else
          \uppercase{&}
        \fi
        \Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}}
      \else
        \uppercase{&}\Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}}
      \fi
    \fi
    \\
%    % 3eme ligne : Calculs
    \ifnum\cmxa>0
      \Nomx\uppercase{&}\opdiv*{numx}{denox}{resultatx}{restex}\opcmp{restex}{0}\ifopeq=\SI{\ResultatThalesx}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesx,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi%
    \fi
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \ifnum\cmxa=0
        %
      \else
        \uppercase{&}
      \fi
      \Nomy\uppercase{&}\opdiv*{numy}{denoy}{resultaty}{restey}\opcmp{restey}{0}\ifopeq=\SI{\ResultatThalesy}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesy,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi%
    \fi
%    %Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \ifnum\cmxa=0
        \ifnum\cmya=0                           
          %
        \else
          \uppercase{&}
        \fi
        \Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi%
      \else
        \uppercase{&}\Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi%
      \fi
    \fi
    \end{align*}
    }
}{}
}

\newcommand\TThalesCalculsE[8][]{%
  \setKV[ClesThales]{#1}%
  \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire%
  \newcount\valx\newcount\Valx%
  \newcount\valy\newcount\Valy%
  \newcount\valz\newcount\Valz%
  \newcount\numx\newcount\numy\newcount\numz%
  \newcount\denox\newcount\denoy\newcount\denoz%
  \def\Nomx{}%
  \def\Nomy{}%
  \def\Nomz{}%
  \zzz=0\yyy=0\xxx=0%
  \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par%
\IfDecimal{#3}{%
  \IfDecimal{#6}{}{%
    \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \xxx=5263%#6&=\frac{#3\times#7}{#4}\\
          \edef\Nomx{#6}\valx=#3\Valx=#7\denox=#4%
        }{%
          \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\]
            \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5%
          }{}}{}
        }
      }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\]
            \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5%
          }{}}{}
      }
    }
  }{%
    \IfDecimal{#6}{%
      \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]%
          \edef\Nomx{#3}\valx=#6\Valx=#4\denox=#7%
        }{%
          \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547
            \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\]
            }{}}{}
        }
      }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547
            \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\]
            }{}}{}
      }
    }{}
  }%
  % 
  \IfDecimal{#4}{%
    \IfDecimal{#7}{}{%
      \IfDecimal{#5}{%
        \IfDecimal{#8}{%
          \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]%
          \edef\Nomy{#7}\valy=#4\Valy=#8\denoy=#5%
        }{%
          \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\]
            \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3%
            }{}}{}
        }
      }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\]
            \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3%
            }{}}{}
      }
    }
  }{%
    \IfDecimal{#7}{%
      \IfDecimal{#5}{%
        \IfDecimal{#8}{%
          \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]%
          \edef\Nomy{#4}\valy=#7\Valy=#5\denoy=#8%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\]
            \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\]
            \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6%
            }{}}{}
      }}{}}%
  % 
  \IfDecimal{#5}{%
    \IfDecimal{#8}{}{%
      \IfDecimal{#4}{
        \IfDecimal{#7}{
          \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]%
          \edef\Nomz{#8}\valz=#5\Valz=#7\denoz=#4%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\]
            \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\]
            \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3%
            }{}}{}
      }
    }
  }{%
    \IfDecimal{#8}{%
      \IfDecimal{#4}{%
        \IfDecimal{#7}{%
          \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]%
          \edef\Nomz{#5}\valz=#8\Valz=#4\denoz=#7%
        }{%
          \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\]
            \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6%
            }{}}{}
        }
      }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\]
            \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6%
            }{}}{}
      }}{}
  }%  
  %%
\StrMid{\the\zzz}{1}{1}[\cmza]%
\StrMid{\the\yyy}{1}{1}[\cmya]%
\StrMid{\the\xxx}{1}{1}[\cmxa]%
\ifboolKV[ClesThales]{Calcul}{%
  %%%%%%%%%%%%%%%%%%%%%%%%%%%
  On remplace par les longueurs connues :
  \ifboolKV[ClesThales]{Propor}{%
    \[\begin{array}{c|c|c}
        \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\
        \hline
        \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8}\\
      \end{array}
    \]
  }{%
    \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\]
  }%
  % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs.
  \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}%
  \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}%
  %%on fait les calculs
\begin{align*}
    %Premier compteur \xxx
    \ifnum\cmxa>0
      \Nomx\uppercase{&}=\frac{\the\valx\times\the\Valx}{\the\denox}\global\numx=\numexpr\the\valx*\the\Valx\relax
    \fi
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \ifnum\cmxa=0
      \else
        \uppercase{&}
      \fi%
      \Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax
     % \else
     %   \uppercase{&}\Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax
     % \fi
    \fi
    % Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \ifnum\cmxa=0
        \ifnum\cmya=0                           
          %\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax
        \else
          \uppercase{&}%\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax
        \fi
        \Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax
      \else
        \uppercase{&}\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax
      \fi
    \fi
    \\
    % 2eme ligne du tableau : calcul des num\'erateurs
        %Premier compteur \xxx
    \ifnum\cmxa>0
      \Nomx\uppercase{&}=\frac{\num{\the\numx}}{\num{\the\denox}}
    \fi
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \ifnum\cmxa=0
        %\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}}
      \else
        \uppercase{&}%\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}}
      \fi
      \Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}}%
    \fi
    %Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \ifnum\cmxa=0
        \ifnum\cmya=0                           
          %\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}}
        \else
          \uppercase{&}%\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}}
        \fi
        \Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}}
      \else
        \uppercase{&}\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}}
      \fi
    \fi
    \\
    % 3eme ligne : faire les simplifications ou pas ?
    %Premier compteur \xxx
    \ifnum\cmxa>0
      \PGCD{\the\numx}{\the\denox}
      \ifnum\pgcd>1
        \Nomx\uppercase{&}=\SSimpli{\the\numx}{\the\denox}
      \else
        \uppercase{&}
      \fi
    \fi                    
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \PGCD{\the\numy}{\the\denoy}
      \ifnum\cmxa=0
         \ifnum\pgcd>1
           \Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy}
         \else
           \uppercase{&}
         \fi
      \else
        \ifnum\pgcd>1
          \uppercase{&}\Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy}
        \else
          \uppercase{&&}
        \fi
      \fi
    \fi
    %Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \PGCD{\the\numz}{\the\denoz}
      \ifnum\cmxa=0
        \ifnum\cmya=0
          \ifnum\pgcd>1
            \Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz}
          \else
            \uppercase{&}
          \fi
        \else
          \ifnum\pgcd>1
            \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz}
          \else
            \uppercase{&&}
          \fi
        \fi
      \else
        \ifnum\pgcd>1
          \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz}
        \else
          \uppercase{&&}
        \fi
      \fi
    \fi
    \\
    % 4eme ligne : Terminer les simplifications ?
    %Premier compteur \xxx
    \ifnum\cmxa>0
      \PGCD{\the\numx}{\the\denox}
      \ifnum\pgcd>1
        \ifnum\pgcd<\the\denox
          \Nomx\uppercase{&}=\SSimplifie{\the\numx}{\the\denox}
        \else
          \uppercase{&}
        \fi
      \else
        \uppercase{&}
      \fi
    \fi                    
    %    % Deuxi\`eme compteur \yyy
    \ifnum\cmya>0
      \PGCD{\the\numy}{\the\denoy}
      \ifnum\cmxa=0
        \ifnum\pgcd>1
          \ifnum\pgcd<\the\denoy
            \Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy}
          \else
            \uppercase{&}
          \fi
         \else
           \uppercase{&}
         \fi
      \else
        \ifnum\pgcd>1
          \ifnum\pgcd<\the\denoy
            \uppercase{&}\Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy}
          \else
            \uppercase{&&}
          \fi
        \else
          \uppercase{&&}
        \fi
      \fi
    \fi
    %Troisi\`eme compteur \zzz
    \ifnum\cmza>0
      \PGCD{\the\numz}{\the\denoz}
      \ifnum\cmxa=0
        \ifnum\cmya=0
          \ifnum\pgcd>1
            \ifnum\pgcd<\the\denoz
              \Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz}
            \else
              \uppercase{&}
            \fi
          \else
            \uppercase{&}
          \fi
        \else
          \ifnum\pgcd>1
            \ifnum\pgcd<\the\denoz
              \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz}
            \else
              \uppercase{&&}
            \fi
          \else
            \uppercase{&&}
          \fi
        \fi
      \else
        \ifnum\pgcd>1
          \ifnum\pgcd<\the\denoz
            \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz}
          \else
            \uppercase{&&}
          \fi
        \else
          \uppercase{&&}
        \fi
      \fi
    \fi%\\
\end{align*}
}{}%
}

\newcommand\TThales[8][]{%
  \setKV[ClesThales]{#1}%
  \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
  \ifboolKV[ClesThales]{FigureSeule}{%
    \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
  }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{%
      \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
    }{%
      \ifboolKV[ClesThales]{Figure}{%
        \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
        \begin{multicols}{2}%
          {\em La figure est donn\'ee \`a titre indicatif.}%
          \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]%
          \par\columnbreak\par%
          \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}%
        \end{multicols}%
      }{\ifboolKV[ClesThales]{Figurecroisee}{%
          \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
          \begin{multicols}{2}%
            {\em La figure est donn\'ee \`a titre indicatif.}%
            \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]%
            \par\columnbreak\par%
            \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}%
          \end{multicols}%
        }{\ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}%
      }%
    }%
  }%
}%
%%%%

\newcommand\ReciThales[6][]{%
  \ifboolKV[ClesThales]{Droites}{%
    Les droites $(#3#5)$ et $(#4#6)$ sont s\'ecantes en $#2$.
  }{%
    Dans le triangle $#2#3#4$, $#5$ est un point
    \ifboolKV[ClesThales]{Segment}{du segment $[#2#3]$}{de la
      droite $(#2#3)$}, $#6$ est un point
    \ifboolKV[ClesThales]{Segment}{du segment $[#2#4]$}{de la droite
      $(#2#4)$}.
  } %
  \ifboolKV[ClesThales]{Propor}{Le tableau $\begin{array}{c|c}
        #2#5&#2#6\\
        \hline
        #2#3&#2#4\\
      \end{array}
    $ est-il un tableau de proportionnalit\'e ?
  }{%
  }
}

\newcommand\ReciThalesCalculs[8][]{%
  \StrMid{#2}{1}{1}[\NomA]%
  \StrMid{#2}{2}{2}[\NomB]%
  \StrMid{#2}{3}{3}[\NomC]%
  \StrMid{#2}{4}{4}[\NomM]%
  \StrMid{#2}{5}{5}[\NomN]%
  \ifboolKV[ClesThales]{Produit}{%
    \begin{align*}
      \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}&&\dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}}
    \end{align*}
    Effectuons les produits en croix :\xdef\NumA{\fpeval{#3*#6}}\xdef\NumB{\fpeval{#4*#5}}
    \begin{align*}
      \num{#3}\times\num{#6}&=\num{\fpeval{#3*#6}}&&&\num{#4}\times\num{#5}&=\num{\fpeval{#4*#5}}
    \end{align*}
    \xintifboolexpr{\NumA == \NumB}{Comme les produits en croix sont
      \'egaux, alors
      $\dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\[0.5em]%
    }{%
      Comme les produits en croix sont diff\'erents, alors
      $\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\%
    }%
  }{%
    \[\left.
        \begin{array}{l}
          \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}\ifx\bla#7\bla\ifboolKV[ClesThales]{Simplification}{\PGCD{#3}{#4}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM...
          \PGCD{#5}{#6}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#6/\pgcd}}\PPCM{#4}{\DenomSimpaa}\xintifboolexpr{\ppcm==#4}{}{=\dfrac{#3\times\num{\fpeval{\ppcm/#4}}}{#4\times\num{\fpeval{\ppcm/#4}}}=\dfrac{\num{\fpeval{#3*\ppcm/#4}}}{\num{\fpeval{\ppcm}}}}}{}%
          }{=\displaystyle\Simplification[All]{#3}{#4}\PGCD{#3}{#4}\xdef\NumSimp{\fpeval{#3/\pgcd}}\xdef\DenomSimp{\fpeval{#4/\pgcd}}\PGCD{#5}{#6}\xdef\NumSimpa{\fpeval{#5/\pgcd}}\xdef\DenomSimpa{\fpeval{#6/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#4}==1}{}{=\dfrac{\num{#3}\times\num{\fpeval{\the\ppcm/#4}}}{\num{#4}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#4}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#3*\the\ppcm/#4}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#6}}\else%
         \xintifboolexpr{#7==1}{}{=\dfrac{\num{#3}\times\num{#7}}{\num{#4}\times\num{#7}}=\dfrac{\num{\fpeval{#3*#7}}}{\num{\fpeval{#4*#7}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#4*#7}}{}{=\dfrac{\num{\fpeval{#3*#7}}\times\num{\fpeval{\the\ppcm/(#4*#7)}}}{\num{\fpeval{#4*#7}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#4*#7)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#3*\the\ppcm/#4}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#7*#6*#8}}
          \fi
          \\
          \\
          \dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}}%
          \ifx\bla#8\bla%
          \ifboolKV[ClesThales]{Simplification}{\PGCD{#5}{#6}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM...
          \PGCD{#3}{#4}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#4/\pgcd}}\PPCM{#6}{\DenomSimpaa}\xintifboolexpr{\ppcm==#6}{}{=\dfrac{#5\times\num{\fpeval{\ppcm/#6}}}{#6\times\num{\fpeval{\ppcm/#6}}}=\dfrac{\num{\fpeval{#5*\ppcm/#6}}}{\num{\fpeval{\ppcm}}}}}{}%
          }{=\displaystyle\Simplification[All]{#5}{#6}\PGCD{#5}{#6}\xdef\NumSimp{\fpeval{#5/\pgcd}}\xdef\DenomSimp{\fpeval{#6/\pgcd}}\PGCD{#3}{#4}\xdef\NumSimpa{\fpeval{#3/\pgcd}}\xdef\DenomSimpa{\fpeval{#4/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#6}==1}{}{=\dfrac{\num{#5}\times\num{\fpeval{\the\ppcm/#6}}}{\num{#6}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#6}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#5*\the\ppcm/#6}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumB{\fpeval{#5*#4}}%
          \else%
          \xintifboolexpr{#8==1}{}{=\dfrac{\num{#5}\times\num{#8}}{\num{#6}\times\num{#8}}=\dfrac{\num{\fpeval{#5*#8}}}{\num{\fpeval{#6*#8}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#6*#8}}{}{=\dfrac{\num{\fpeval{#5*#8}}\times\num{\fpeval{\the\ppcm/(#6*#8)}}}{\num{\fpeval{#6*#8}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#6*#8)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#5*\the\ppcm/#6}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}}
          }\xdef\NumB{\fpeval{#5*#8*#4*#7}}
          \fi\\
        \end{array}
      \right\}\ifnum\NumA=\NumB \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}\else\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}\fi
    \]
  }
  \ifboolKV[ClesThales]{Propor}{%
    \ifnum\NumA=\NumB Donc le tableau $\begin{array}{c|c}
        \NomA\NomM&\NomA\NomN\\
        \hline
        \NomA\NomB&\NomA\NomC\\
      \end{array}
    $ est bien un tableau de proportionnalit\'e.\\De plus, les points
    $\NomA$, $\NomM$, $\NomB$ sont align\'es dans le m\^eme ordre que les
    points $\NomA$, $\NomN$, $\NomC$. Donc les droites $(\NomM\NomN)$
    et $(\NomB\NomC)$ sont parall\`eles d'apr\`es la r\'eciproque du
    th\'eor\`eme de Thal\`es.\else%
    Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas parall\`eles.\fi
  }{%
    \xintifboolexpr{\NumA==\NumB}{%
      De plus, les points $\NomA$, $\NomM$, $\NomB$ sont align\'es dans
      le m\^eme ordre que les points $\NomA$, $\NomN$, $\NomC$. Donc les
      droites $(\NomM\NomN)$ et $(\NomB\NomC)$ sont parall\`eles d'apr\`es
      la r\'eciproque du th\'eor\`eme de Thal\`es.}{%
      Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas
      parall\`eles.}
  }
}

\newcommand\ReciproqueThales[8][]{%
  % #1 Cl\'es
  % #2 NomTriangle + Points ABCEF pour droite (BC)//(EF)
  % #3 longueur AE
  % #4 longueur AB
  % #5 longueur AF
  % #6 longueur AC
  \ifboolKV[ClesThales]{FigureSeule}{%
    \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
    \MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
  }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{%
      \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
      \MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
    }{%
      \ifboolKV[ClesThales]{Figure}{%
        \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
        \begin{multicols}{2}
          {\em La figure est donn\'ee \`a titre indicatif.}
          \[\MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]
          \par\columnbreak\par        
          \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
          \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}
        \end{multicols}
      }{\ifboolKV[ClesThales]{Figurecroisee}{%
          \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]
          \begin{minipage}{0.4\linewidth}
            {\em La figure est donn\'ee \`a titre indicatif.}
            \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]
          \end{minipage}
          \hfill
          \begin{minipage}{0.55\linewidth}
            \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
            \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
          \end{minipage}\\%
        }{\ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
          \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
        }%
      }%
    }%
  }%
}%

\newcommand\Thales[8][]{%
  \useKVdefault[ClesThales]%
  \setKV[ClesThales]{#1}%
  %Définir les points pour une utilisation perso
  \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
  \xdef\NomPointA{\NomA}%
  \xdef\NomPointB{\NomB}%
  \xdef\NomPointC{\NomC}%
  \xdef\NomTriangle{\NomA\NomB\NomC}%
  \xdef\NomPointM{\NomM}%
  \xdef\NomPointN{\NomN}%
  %
  \ifboolKV[ClesThales]{Reciproque}{%
    \ReciproqueThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
  }{%
    \ifboolKV[ClesThales]{FigureSeule}{%
      \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
      \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
    }{%
      \ifboolKV[ClesThales]{FigurecroiseeSeule}{%
        \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
        \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
      }{%
        \ifboolKV[ClesThales]{Redaction}{%
          \ifboolKV[ClesThales]{Figure}{%
            \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
            \begin{multicols}{2}
              {\em La figure est donn\'ee \`a titre indicatif.}%
              \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]%
              \par\columnbreak\par%
              \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}%
            \end{multicols}%
          }{%
            \ifboolKV[ClesThales]{Figurecroisee}{%
              \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
              \begin{multicols}{2}
                {\em La figure est donn\'ee \`a titre indicatif.}%
                \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]%
                \par\columnbreak\par%
                \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}%
              \end{multicols}
            }{%
              \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}%
            }
          }    
        }{%
          \TThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
        }%
      }%
    }%
  }%
}%

%%%
% Trigonom\'etrie
%%%
\def\MPFigTrigo#1#2#3#4#5#6#7#8{%
  \ifluatex
  \mplibcodeinherit{enable}
   \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesTrigo]{Echelle};
    pair A,B,C,O,I,D,E,F;%
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(3,0);
    C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#8);
    B:=B rotatedabout(O,#8);
    C:=C rotatedabout(O,#8);
    % On d\'efinit le centre du cercle inscrit
    (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C];
    (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C];
    % on dessine \`a main lev\'ee :)
    path triangle;
    triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
    % on d\'efinit l'angle droit
    D-B=7*unitvector(C-B);
    F-B=7*unitvector(A-B);
    E-D=F-B;
    draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)};
    % L'angle :)
    path cc;
    cc=fullcircle scaled 1u;
    % on marque les angles
    picture MAngle;
    MAngle=image(
    draw (cc shifted A);
    );
    draw MAngle;
    clip currentpicture to triangle;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    % on labelise
    picture z;
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex \ang{#7} etex,A+0.95u*unitvector(I-A));
    decalage:=3mm;
    if #6<0:
    else:
    if angle(1/2[A,C]-B)>0:
      if #6=0:
        label(btex ? etex,1.1[B,1/2[A,C]]);
      else:
        label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
      fi;
    else:
      if #6=0:
        label(btex ? etex,1.1[B,1/2[A,C]]);
      else:
        label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
      fi;
    fi;
  fi;   
  if #4<0:
  else:
    if angle(1/2[B,C]-A)>0:
      if #4=0:
        label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B)));
      else:
        label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
      fi;
    else:
      if #4=0:
        label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B)));
      else:
        label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
      fi;
    fi;
  fi;
  if #5<0:
  else:
    if angle(1/2[A,B]-C)>0:
      if #5=0:
        label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B)));
      else:
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    else:
      if #5=0:
        label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B)));
      else:
        label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    fi;
    fi;
  \end{mplibcode}
  \mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}]
    pair A,B,C,O,I,D,E,F;%
    % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
    A=u*(1,1);
    B-A=u*(3,0);
    C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]);
    % On d\'efinit le centre du cercle circonscrit
    O - .5[A,B] = whatever * (B-A) rotated 90;
    O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
    A:=A rotatedabout(O,#8);
    B:=B rotatedabout(O,#8);
    C:=C rotatedabout(O,#8);
    % On d\'efinit le centre du cercle inscrit
    (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C];
    (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C];
    % on dessine \`a main lev\'ee :)
    path triangle;
    triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
    % on d\'efinit l'angle droit
    D-B=7*unitvector(C-B);
    F-B=7*unitvector(A-B);
    E-D=F-B;
    draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)};
    % L'angle :)
    path cc;
    cc=fullcircle scaled 1u;
    % on marque les angles
    picture MAngle;
    MAngle=image(
    draw (cc shifted A);
    % draw (cc shifted B);
    % draw (cc shifted C);
    );
    draw MAngle;
    clip currentpicture to triangle;
    draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
    draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
    draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    % on labelise
    picture z;
    label(btex #1 etex,1.15[O,A]);
    label(btex #2 etex,1.15[O,B]);
    label(btex #3 etex,1.15[O,C]);
    label(btex \ang{#7} etex,A+0.95u*unitvector(I-A));
    decalage:=3mm;
    if #6<0:
    else:
    if angle(1/2[A,C]-B)>0:
      if #6=0:
        label(btex ? etex rotated angle(C-A),1.1[B,1/2[A,C]]);
      else:
        label(btex \num{#6} etex rotated angle(C-A),1.2[B,1/2[A,C]]);
      fi;
    else:
      if #6=0:
        label(btex ? etex rotated angle(A-C),1.1[B,1/2[A,C]]);
      else:
        label(btex \num{#6} etex rotated angle(A-C),1.2[B,1/2[A,C]]);
      fi;
    fi;
  fi;   
  if #4<0:
  else:
    if angle(1/2[B,C]-A)>0:
      if #4=0:
        label(btex ? etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B)));
      else:
        label(btex \num{#4} etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B)));
      fi;
    else:
      if #4=0:
        label(btex ? etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B)));
      else:
        label(btex \num{#4} etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B)));
      fi;
    fi;
  fi;
  if #5<0:
  else:
    if angle(1/2[A,B]-C)>0:
      if #5=0:
        label(btex ? etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B)));
      else:
        label(btex \num{#5} etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    else:
      if #5=0:
        label(btex ? etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B)));
      else:
        label(btex \num{#5} etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B)));
      fi;
    fi;
  fi;
\end{mpost}
\fi
}

\def\MPFigTrigoAngle#1#2#3#4#5#6#7{%
  % #1 A
  % #2 B
  % #3 C
  % #4 opp
  % #5 adj
  % #6 hyp
  % #7 angle de rotation
  \ifluatex
  \mplibcodeinherit{enable}
   \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesTrigo]{Echelle};
  pair A,B,C,O,I,D,E,F;%
  % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
  A=u*(1,1);
  B-A=u*(3,0);
  C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]);
    % On d\'efinit le centre du cercle circonscrit
  O - .5[A,B] = whatever * (B-A) rotated 90;
  O - .5[B,C] = whatever * (C-B) rotated 90;
  % On tourne pour \'eventuellement moins de lassitude :)
  A:=A rotatedabout(O,#7);
  B:=B rotatedabout(O,#7);
  C:=C rotatedabout(O,#7);
  % On d\'efinit le centre du cercle inscrit
  (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C];
  (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C];
    %on dessine \`a main lev\'ee :)
  path triangle;
  triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
  %on d\'efinit l'angle droit
  D-B=7*unitvector(C-B);
  F-B=7*unitvector(A-B);
  E-D=F-B;
  draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)};
  %L'angle :)
  path cc;
  cc=fullcircle scaled 1u;
  % on marque les angles
  picture MAngle;
  MAngle=image(
  draw (cc shifted A);
  );
  draw MAngle;
  clip currentpicture to triangle;
  draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
  draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
  draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
  % on labelise
  label(btex #1 etex,1.15[O,A]);
  label(btex #2 etex,1.15[O,B]);
  label(btex #3 etex,1.15[O,C]);
  label(btex ? etex,A+0.95u*unitvector(I-A));
  decalage:=3mm;
  if #6>0:
  if angle(1/2[A,C]-B)>0:
    label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
  else:
  label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
  fi;
  fi;
  if #4>0:
  if angle(1/2[B,C]-A)>0:
   label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
  else:
    label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
    fi;
    fi;
    if #5>0:
  if angle(1/2[A,B]-C)>0:
    label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
  else:
  label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
  fi;
  fi;
\end{mplibcode}
\mplibcodeinherit{disable}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}]
      u:=1cm;
  pair A,B,C,O,I,D,E,F;%
    %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure
  A=u*(1,1);
  B-A=u*(3,0);
  C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]);
    % On d\'efinit le centre du cercle circonscrit
  O - .5[A,B] = whatever * (B-A) rotated 90;
  O - .5[B,C] = whatever * (C-B) rotated 90;
    % On tourne pour \'eventuellement moins de lassitude :)
  A:=A rotatedabout(O,#7);
  B:=B rotatedabout(O,#7);
  C:=C rotatedabout(O,#7);
    % On d\'efinit le centre du cercle inscrit
  (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C];
  (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C];
    %on dessine \`a main lev\'ee :)
  path triangle;
  triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle;
  %on d\'efinit l'angle droit
  D-B=7*unitvector(C-B);
  F-B=7*unitvector(A-B);
  E-D=F-B;
  draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)};
  %L'angle :)
  path cc;
  cc=fullcircle scaled 1u;
    % on marque les angles
  picture MAngle;
  MAngle=image(
      draw (cc shifted A);
    );
  draw MAngle;
  clip currentpicture to triangle;
  draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)};
  draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)};
  draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
    %on labelise
  label(btex #1 etex,1.15[O,A]);
  label(btex #2 etex,1.15[O,B]);
  label(btex #3 etex,1.15[O,C]);
  label(btex ? etex,A+0.95u*unitvector(I-A));
  decalage:=3mm;
  if #6>0:
  if angle(1/2[A,C]-B)>0:
    label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
  else:
  label(btex \num{#6} etex,1.2[B,1/2[A,C]]);
  fi;
  fi;
  if #4>0:
  if angle(1/2[B,C]-A)>0:
   label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
  else:
    label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B)));
    fi;
    fi;
    if #5>0:
  if angle(1/2[A,B]-C)>0:
    label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
  else:
  label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B)));
  fi;
  fi;
\end{mpost}
\fi
}

\setKVdefault[ClesTrigo]{Angle=0,Propor=false,Figure=false,FigureSeule=false,ValeurExacte=false,Precision=2,Unite=cm,Sinus=false,Cosinus=false,Tangente=false,Perso=false,Echelle=1cm}%

\newcommand\RedactionTrigo{}%

\newcommand\TrigoCalculs[5][]{%
  \setKV[ClesTrigo]{#1}%
  % #1 Cl\'es
  % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC
  % #3 Longueur #4 Longueur #5 angle
  % On d\'efinit les points
  \DeclareSIUnit{\PfCTrigoUnit}{\useKV[ClesTrigo]{Unite}}%
  \StrMid{#2}{1}{1}[\NomA]%
  \StrMid{#2}{2}{2}[\NomB]%
  \StrMid{#2}{3}{3}[\NomC]%
  \xdef\NomTriangle{\NomA\NomB\NomC}%
  \xdef\NomAngleDroit{\NomB}%
  \xdef\NomSommetA{\NomA}%
  \xdef\NomSommetB{\NomB}%
  \xdef\NomSommetC{\NomC}%
  \ifboolKV[ClesTrigo]{Perso}{%
    \RedactionTrigo%
  }{%
    Dans le triangle $\NomA\NomB\NomC$, rectangle en $\NomB$, on a :%
  }%
  \ifboolKV[ClesTrigo]{Cosinus}{%
    \ifx\bla#3\bla%on calcule le c\^ot\'e adjacent
    \xdef\ResultatTrigo{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}%
   \ifboolKV[ClesTrigo]{Propor}{%
     \begin{align*}
       \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\
       \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\
       \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\
       \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB}
      \end{align*}%
    }{%
      \begin{align*}
        \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\
        \cos(\ang{#5})&=\frac{\NomA\NomB}{\num{#4}}\\
        \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB}%
      \end{align*}
    }%
    \else%
    \ifx\bla#4\bla%on calcule l'hypoth\'enuse
    \xdef\ResultatTrigo{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\
        \NomA\NomC\times\cos(\ang{#5})&=\num{#3}\\
        \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}
    }{%
      \begin{align*}
        \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\
        \cos(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\
        \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}%
    }%
    \else%on calcule l'angle
    \xdef\ResultatTrigo{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}%
    \setKV[ClesTrigo]{Precision=0}%
    \setKV[ClesTrigo]{#1}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\
        \num{#4}\times\cos(\widehat{\NomB\NomA\NomC})&=\num{#3}\\
        \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }{%
      \begin{align*}
        \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\
        \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }%
    \fi%
    \fi%
  }{}%
  \ifboolKV[ClesTrigo]{Sinus}{%
    \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e
    \xdef\ResultatTrigo{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\
        \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}%
      \end{align*}%
    }{%
      \begin{align*}
        \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\
        \sin(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\
        \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}%
      \end{align*}%
    }%
    \else
    \ifx\bla#4\bla%on calcule l'hypoth\'enuse
    \xdef\ResultatTrigo{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\
        \NomA\NomC\times\sin(\ang{#5})&=\num{#3}\\
        \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}%
    }{%
      \begin{align*}
        \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\
        \sin(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\
        \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}%
    }%
    \else%on calcule l'angle
    \xdef\ResultatTrigo{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}%
    \setKV[ClesTrigo]{Precision=0}%
    \setKV[ClesTrigo]{#1}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\
        \num{#4}\times\sin(\widehat{\NomB\NomA\NomC})&=\num{#3}\\
        \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }{%
      \begin{align*}
        \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\
        \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }%
    \fi%
    \fi%
  }{}%
  \ifboolKV[ClesTrigo]{Tangente}{%
    \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e
    \xdef\ResultatTrigo{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\%
        \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\%
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}%
      \end{align*}%
    }{%
      \begin{align*}
        \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\
        \tan(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\
        \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}%
      \end{align*}%
    }%
    \else
    \ifx\bla#4\bla%on calcule l'adjacent
    \xdef\ResultatTrigo{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\
        \NomA\NomB\times\tan(\ang{#5})&=\num{#3}\\
        \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}%
    }{%
      \begin{align*}
        \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\
        \tan(\ang{#5})&=\frac{\num{#3}}{\NomA\NomB}\\
        \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\
        \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\%
        \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}%
      \end{align*}%
    }%
    \else%on calcule l'angle
    \setKV[ClesTrigo]{Precision=0}%
    \setKV[ClesTrigo]{#1}%
    \xdef\ResultatTrigo{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}%
    \ifboolKV[ClesTrigo]{Propor}{%
      \begin{align*}
        \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\
        \num{#4}\times\tan(\widehat{\NomB\NomA\NomC})&=\num{#3}\\
        \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }{%
      \begin{align*}
        \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\
        \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\
        \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}%
      \end{align*}%
    }%
    \fi%
    \fi%
  }{}%
}%

\newcommand\Trigo[5][]{%
  \useKVdefault[ClesTrigo]%
  \setKV[ClesTrigo]{#1}%
  % #1 Cl\'es
  % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC
  % #3 Longueur #4 Longueur #5 angle
  % On d\'efinit les points
  \StrMid{#2}{1}{1}[\NomA]%
  \StrMid{#2}{2}{2}[\NomB]%
  \StrMid{#2}{3}{3}[\NomC]%
  % On r\'edige
  \ifboolKV[ClesTrigo]{FigureSeule}{%
    \ifx\bla#5\bla%
    \ifboolKV[ClesTrigo]{Cosinus}{%
      \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}}
    }{}%
    \ifboolKV[ClesTrigo]{Sinus}{%
      \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}}
    }{}%
    \ifboolKV[ClesTrigo]{Tangente}{%
      \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}}
    }{}%
    \else%}{%figure pour calculer une longueur
    \ifboolKV[ClesTrigo]{Cosinus}{%
      \ifx\bla#3\bla%adjacent inconnu
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}}
      \else
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}}
      \fi
    }{}%
    \ifboolKV[ClesTrigo]{Sinus}{%
      \ifx\bla#3\bla%adjacent inconnu
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}}
      \else
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}}
      \fi
    }{}%
    \ifboolKV[ClesTrigo]{Tangente}{%
      \ifx\bla#3\bla%adjacent inconnu
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}}
      \else%
      \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}}
      \fi%
    }{}%
    \fi%
  }{%
    \ifboolKV[ClesTrigo]{Figure}{%
      \begin{multicols}{2}%
        {\em La figure est donn\'ee \`a titre indicatif.}%
        \ifx\bla#5\bla%
        \ifboolKV[ClesTrigo]{Cosinus}{%
          \begin{center}
            \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}}
          \end{center}
        }{}%
        \ifboolKV[ClesTrigo]{Sinus}{%
          \begin{center}
            \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}}
          \end{center}
        }{}%
        \ifboolKV[ClesTrigo]{Tangente}{%
          \begin{center}
            \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}}
          \end{center}
        }{}%
        \else%}{%figure pour calculer une longueur
        \ifboolKV[ClesTrigo]{Cosinus}{%
          \ifx\bla#3\bla%adjacent inconnu
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \else
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \fi
        }{}%
        \ifboolKV[ClesTrigo]{Sinus}{%
          \ifx\bla#3\bla%adjacent inconnu
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \else
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \fi
        }{}%
        \ifboolKV[ClesTrigo]{Tangente}{%
          \ifx\bla#3\bla%adjacent inconnu
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \else%
          \begin{center}
            \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}}
          \end{center}
          \fi%
        }{}%
        \fi%
        \par\columnbreak\par
        \TrigoCalculs[#1]{#2}{#3}{#4}{#5}%
      \end{multicols}
    }{%
      \TrigoCalculs[#1]{#2}{#3}{#4}{#5}%
    }%
  }%
}%

%%%
% Statistiques
%%%
\newcommand\NbDonnees{}
\newcommand\SommeDonnees{}%
\newcommand\EffectifTotal{}%
\newcommand\Moyenne{}%
\newcommand\Etendue{}%
\newcommand\Mediane{}%
\newcommand\DonneeMax{}%
\newcommand\DonneeMin{}%
\newcommand\EffectifMax{}%

\setKVdefault[ClesStat]{ColVide=0,CaseVide=false,EffVide=false,%
FreqVide=false,AngVide=false,ECCVide=false,TotalVide=false,Sondage=false,Liste=false,%
Tableau=false,Stretch=1,Frequence=false,EffectifTotal=false,%
Etendue=false,Moyenne=false,SET=false,ValeurExacte=false,Mediane=false,QuartileUn=false,QuartileTrois=false,Total=false,Concret=false,%
Unite={},Largeur=1cm,Precision=2,PrecisionF=0,Donnee=Valeurs,Effectif=Effectif,Grille=false,Origine=0,Angle=false,SemiAngle=false,Qualitatif=false,TableauVide=false,ECC=false,Coupure=10,CouleurTab=gray!15,Graphique=false,Batons=true,%
% Pour les diags batons
EpaisseurBatons=1,ListeCouleursB={a},Lecture=false,LectureFine=false,AideLecture=false,Reponses=false,DonneesSup=false,AbscisseRotation=false,Tiret=false,AngleRotationAbscisse=0,Pasx=1,Pasy=1,Unitex=0.5,Unitey=0.5,Depart=0,CouleurDefaut=black,%
% Pour les diags circulaires
Rayon=3cm,AffichageAngle=false,AffichageDonnee=false,ListeCouleurs={white},Hachures=false,LectureInverse=false,EcartHachures=0.25,EpaisseurHachures=1,Legende,LegendeVide=false,ACompleter=false,%
%Pour les représentations
Representation=false,%
%Pour les barres horizontales
Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dispo
}
%compl\'ements
\defKV[ClesStat]{AngleRotationAbscisse=\setKV[ClesStat]{AbscisseRotation}}%
\defKV[ClesStat]{AffichageDonnees=\setKV[ClesStat]{AffichageAngle=false}\setKV[ClesStat]{AffichageDonnee}}%
\defKV[ClesStat]{CasesVides=\setKV[ClesStat]{CaseVide}}%
\defKV[ClesStat]{LegendesVides=\setKV[ClesStat]{LegendeVide}}%
% La construction du tableau
\def\addtotok#1#2{#1\expandafter{\the#1#2}}
\newtoks\tabtoksa\newtoks\tabtoksb\newtoks\tabtoksc
\def\updatetoks#1/#2\nil{\addtotok\tabtoksa{\ifboolKV[ClesStat]{Qualitatif}{&#1}{&\num{#1}}}\addtotok\tabtoksb{&\num{#2}}}
%
\newcounter{PfCCompteLignes}%
%
\def\BuildtabStat{% %%Tableau sans total
  \setcounter{PfCCompteLignes}{0}%
  \tabtoksa{\useKV[ClesStat]{Donnee}}\tabtoksb{\useKV[ClesStat]{Effectif}}%
  \foreachitem\compteur\in\ListeComplete{\expandafter\updatetoks\compteur\nil}%
  \ifboolKV[ClesStat]{Total}{%
    \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}%
    \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen+1}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}%
      \CodeBefore%
      \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}%
      \columncolor{\useKV[ClesStat]{CouleurTab}}{1}%
      \Body%
      \the\tabtoksa&Total\\%
      \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb&\num{\EffectifTotal}}\\%
      \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{100}}\\}{}%
      \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{360}}\\}{}%
      \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{180}}\\}{}%
      \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\num{\EffectifTotal}}}\\}{}%
      \CodeAfter%
      % On crée la liste des colonnes à vider
      \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{%
        \xdef\FooStat{\useKV[ClesStat]{ColVide}}%
        \setsepchar{,}%
        \readlist*\ListeColonnesAVider{\FooStat}%
        \foreachitem\compteur\in\ListeColonnesAVider{%
          \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});%
        }%
      }{}%
      % On crée la liste des cases à vider
      \ifboolKV[ClesStat]{CaseVide}{%
        \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}%
        \setsepchar[*]{,*/}%
        \readlist*\ListeCasesAVider{\FooStatCases}%
        \foreachitem\compteur\in\ListeCasesAVider{%
          \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});%
        }%
      }{}%
      % On retrace le tableau
      %Les colonnes
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+3}}}\do{%
        \tikz\draw (row-1-|col-##1) -- (last-|col-##1);%
      }%
      % Les lignes
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{%
        \tikz\draw (row-##1-|col-1) -- (row-##1-|last);%
      }%
    \end{NiceTabular}%
  }{%
    \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}%
    \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}%
      \CodeBefore%
      \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}%
      \columncolor{\useKV[ClesStat]{CouleurTab}}{1}%
      \Body%
      \the\tabtoksa\\%
      \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb}\\%
      \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}\\}{}%
      \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}\\}{}%
      \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}\\}{}%
      \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}\\}{}%
      \CodeAfter%
      % On crée la liste des colonnes à vider
      \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{%
        \xdef\FooStat{\useKV[ClesStat]{ColVide}}%
        \setsepchar{,}%
        \readlist*\ListeColonnesAVider{\FooStat}%
        \foreachitem\compteur\in\ListeColonnesAVider{%
          \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});%
        }%
      }{}%
      % On crée la liste des cases à vider
      \ifboolKV[ClesStat]{CaseVide}{%
        \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}%
        \setsepchar[*]{,*/}%
        \readlist*\ListeCasesAVider{\FooStatCases}%
        \foreachitem\compteur\in\ListeCasesAVider{%
          \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});%
        }%
      }{}%
      % On retrace le tableau
      %Les colonnes
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+2}}}\do{%
        \tikz\draw (row-1-|col-##1) -- (last-|col-##1);%
      }%
      % Les lignes
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{%
        \tikz\draw (row-##1-|col-1) -- (row-##1-|last);%
      }%
    \end{NiceTabular}%
  }%
}%

% Pour construire le diagramme en barres horizontales
\def\UpdatetoksHor#1/#2/#3\nil{\addtotok\toklistenomhor{"#1",}\addtotok\toklistedonhor{#3,}\addtotok\toklisteaffhor{"#2",}}%

\newcommand\buildgraphbarhor{%
  \newtoks\toklistenomhor%
  \newtoks\toklistedonhor%
  \newtoks\toklisteaffhor%
  \newtoks\toklistecouleur%
  \xdef\PfCfooStat{}%
  \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
    \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,2],}%
  }%
  \xdef\DivMax{\fpeval{max(\PfCfooStat)}}%
  \xdef\ExposantDivMax{\fpeval{round(ln(\DivMax)/ln(10))}}%
  \xdef\DivMax{\fpeval{10**\ExposantDivMax}}%
  \xdef\PfCfooStat{}%
  \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
    \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,1]/\ListeComplete[##1,2]/\fpeval{\ListeComplete[##1,2]/\DivMax},}%
  }%
  \readlist*\ListeCompleteDiagHor{\PfCfooStat}%
  \foreachitem\compteur\in\ListeCompleteDiagHor{\expandafter\UpdatetoksHor\compteur\nil}%
  \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}%
  \readlist*\ListeCouleur{\ListeAvantCouleurs}%
  \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
  \NewMPDiagBarreHor{\the\toklistenomhor}{\the\toklistedonhor}{\the\toklisteaffhor}{\the\toklistecouleur}%
}%

% Pour construire le diagramme en bâtons
\def\Updatetoks#1/#2\nil{\addtotok\toklistepoint{(#1,#2),}}%
\newcommand\buildgraph[1][]{%
  \newtoks\toklistepoint%
  \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoks\compteur\nil}%
  \newtoks\toklistecouleur%
  \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}%
  \readlist*\ListeCouleur{\ListeAvantCouleurs}%
  \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
  \MPStatNew{\the\toklistepoint}{\the\toklistecouleur}%
}%

% Pour construire le diagramme en bâtons qualitatif
\def\Updatetoksq#1/#2\nil{\addtotok\toklistepointq{"#1",#2,}}%
\newcommand\buildgraphq[1][]{%
  \newtoks\toklistepointq%
  \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}%
  \newtoks\toklistecouleur%
  \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}%
  \readlist*\ListeCouleur{\ListeAvantCouleurs}%
  \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
  \MPStatNew{\the\toklistepointq}{\the\toklistecouleur}%
}%

\def\UpdateCoul#1\nil{\addtotok\toklistecouleur{#1,}}%
\def\UpdateLegende#1\nil{\addtotok\toklistelegende{#1,}}%

% Pour construire le diagramme circulaire qualitatif
\def\buildgraphcq#1{%
  \newtoks\toklistepointq\toklistepointq{}%
  \newtoks\toklistecouleur\toklistecouleur{}%
  \newtoks\toklistelegende\toklistelegende{}%
  \ifboolKV[ClesStat]{LegendeVide}{%
    \xdef\foo{\useKV[ClesStat]{LegendesVides}}%
    \readlist*\ListeLegendesAEffacer{\foo}%
  }{\xdef\foo{0}\readlist*\ListeLegendesAEffacer{\foo}%
  }%
  \foreachitem\compteur\in\ListeLegendesAEffacer{\expandafter\UpdateLegende\compteur\nil}%
  %
  \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}%
  \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}%
  \readlist*\ListeCouleur{\ListeAvantCouleurs}%
  \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}%
  \NewMPStatCirculaireQ{\the\toklistepointq}{#1}{\the\toklistecouleur}{\the\toklistelegende}%
}%

%% calcul des fr\'equences
\newcommand\CalculFrequence[1]{%
  \fpeval{round(\ListeComplete[#1,2]*100/\EffectifTotal,\useKV[ClesStat]{PrecisionF})}
}

%% calcul des angles
\newcommand\CalculAngle[1]{%
  \fpeval{round(\ListeComplete[#1,2]*360/\EffectifTotal,0)}
}
\newcommand\CalculSemiAngle[1]{%
  \fpeval{round(\ListeComplete[#1,2]*180/\EffectifTotal,0)}
}

%% calcul des ECC
\newcount\CompteurECC%
\newcount\CompteurECCTotal%

\newcommand\CalculECC[1]{%
  \xdef\TotalECC{0}%
  \CompteurECC=1%
  \CompteurECCTotal=\numexpr#1+1%
  \whiledo{\CompteurECC < \CompteurECCTotal}{%
    \xdef\TotalECC{\fpeval{\TotalECC+\ListeComplete[\the\CompteurECC,2]}}%
    \CompteurECC=\numexpr\CompteurECC+1%
  }%
  \num{\TotalECC}%
}

% Construction d'un diagramme en barres horizontal
\newcommand\NewMPDiagBarreHor[4]{%
  % #1 Liste des noms
  % #2 Liste des valeurs associées
  % #3 Liste des valeurs à afficher (si pb calcul MP)
  % #4 Liste des couleurs
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    Longueur:=\useKV[ClesStat]{Longueur};
    Hauteur:=\useKV[ClesStat]{Hauteur};
    Ecart:=\useKV[ClesStat]{EcartBarre};
    ExposantDivMax:=\ExposantDivMax;
    ecarthachures=\useKV[ClesStat]{EcartHachures};
    epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures};
    boolean Hachures;
    Hachures=\useKV[ClesStat]{Hachures};
    boolean Bicolore;
    Bicolore=\useKV[ClesStat]{Bicolore};
    boolean Grille;
    Grille=\useKV[ClesStat]{Grille};
    boolean AffichageDonnee;
    AffichageDonnee=\useKV[ClesStat]{AffichageDonnee};
    boolean LegendeVide;
    LegendeVide=\useKV[ClesStat]{LegendeVide};
    vardef CalculNombreDonneesEtDonneeMax(text t)=
    nbdon:=0;%nombre de données
    DonneeMax:=0;%donnée DonneeMaximale
    for p_=t:
    nbdon:=nbdon+1;
    if p_>DonneeMax:
    DonneeMax:=p_;
    fi;
    endfor;
    enddef;
    vardef ListeDonnees(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    Donnees[n]:=p_;
    endfor;
    enddef;
    vardef RecuperationCouleurs(text t)=
    color Col[];
    n:=0;
    for p_=t:
    n:=n+1;
    Col[n]=p_;
    endfor;
    enddef;
    vardef TraceDiag=
    if Grille:
    pair Zz[];%Pour déterminer "le dernier point"
    Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart);
    Zz2=(0,(Hauteur+Ecart));
    Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart);
    Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi;
    if ExposantDivMax=0:
    for k=1 upto DonneeMax+1:
    trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white;
    endfor;
    else:
    for k=1 upto (floor(DonneeMax*10+2)):
    trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white;
    endfor;
    fi;
    if ExposantDivMax=0:
    for k=1 upto (DonneeMax+1):
    label.bot(TEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0));
    endfor;
    else:
    if ExposantDivMax<5:
    for k=1 upto (floor(DonneeMax*10+2)):
    label.bot(TEX("\num{\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0));
    endfor;
    else:
    dotlabel.bot(TEX("\num{\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1);
    fi;
    fi;
    fi;
    for k=0 upto nbdon-1:
    path RectangleDonnee;
    RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart));
    if Hachures:
    fill RectangleDonnee withcolor white;
    trace Hachurage(RectangleDonnee,60 if
    (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi)
    withpen pencircle scaled epaisseurhachures;
    else:
    remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi;
    fi;
    trace RectangleDonnee;
    endfor;
    if Grille:
    drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5;
    drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5;
    fi;
    enddef;
    vardef AffichageNom(text t)=
    k:=0;
    for p_=t:
    label.lft(TEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart)));
    k:=k+1;
    endfor;
    enddef;
    vardef AffichageDonnees(text t)=
    k:=0;
    for p_=t:
    label.rt(TEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart)));
    k:=k+1;
    endfor;
    enddef;
    CalculNombreDonneesEtDonneeMax(#2);
    ListeDonnees(#2);
    RecuperationCouleurs(#4);
    TraceDiag;
    if LegendeVide=false:
    AffichageNom(#1);
    fi;
    if AffichageDonnee:
    AffichageDonnees(#3);
    fi;
  \end{mplibcode}
  \else%
  \begin{mpost}[mpsettings={%
      Longueur:=\useKV[ClesStat]{Longueur};
      Hauteur:=\useKV[ClesStat]{Hauteur};
      Ecart:=\useKV[ClesStat]{EcartBarre};
      ExposantDivMax:=\ExposantDivMax;
      ecarthachures=\useKV[ClesStat]{EcartHachures};
      epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures};
      boolean Hachures;
      Hachures=\useKV[ClesStat]{Hachures};
      boolean Bicolore;
      Bicolore=\useKV[ClesStat]{Bicolore};
      boolean Grille;
      Grille=\useKV[ClesStat]{Grille};
      boolean AffichageDonnee;
      AffichageDonnee=\useKV[ClesStat]{AffichageDonnee};
      boolean LegendeVide;
      LegendeVide=\useKV[ClesStat]{LegendeVide};
    }]
    vardef CalculNombreDonneesEtDonneeMax(text t)=
    nbdon:=0;%nombre de données
    DonneeMax:=0;%donnée DonneeMaximale
    for p_=t:
    nbdon:=nbdon+1;
    if p_>DonneeMax:
    DonneeMax:=p_;
    fi;
    endfor;
    enddef;
    vardef ListeDonnees(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    Donnees[n]:=p_;
    endfor;
    enddef;
    vardef RecuperationCouleurs(text t)=
    color Col[];
    n:=0;
    for p_=t:
    n:=n+1;
    Col[n]=p_;
    endfor;
    enddef;
    vardef TraceDiag=
    if Grille:
    pair Zz[];%Pour déterminer "le dernier point"
    Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart);
    Zz2=(0,(Hauteur+Ecart));
    Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart);
    Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi;
    if ExposantDivMax=0:
    for k=1 upto DonneeMax+1:
    trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white;
    endfor;
    else:
    for k=1 upto (floor(DonneeMax*10+2)):
    trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white;
    endfor;
    fi;
    if ExposantDivMax=0:
    for k=1 upto (DonneeMax+1):
    label.bot(LATEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0));
    endfor;
    else:
    if ExposantDivMax<5:
    for k=1 upto (floor(DonneeMax*10+2)):
    label.bot(LATEX("\num{\noexpand\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0));
    endfor;
    else:
    dotlabel.bot(LATEX("\num{\noexpand\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1);
    fi;
    fi;
    fi;
    for k=0 upto nbdon-1:
    path RectangleDonnee;
    RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart));
    if Hachures:
    fill RectangleDonnee withcolor white;
    trace Hachurage(RectangleDonnee,60 if
    (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi)
    withpen pencircle scaled epaisseurhachures;
    else:
    remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi;
    fi;
    trace RectangleDonnee;
    endfor;
    if Grille:
    drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5;
    drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5;
    fi;
    enddef;
    vardef AffichageNom(text t)=
    k:=0;
    for p_=t:
    label.lft(LATEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart)));
    k:=k+1;
    endfor;
    enddef;
    vardef AffichageDonnees(text t)=
    k:=0;
    for p_=t:
    label.rt(LATEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart)));
    k:=k+1;
    endfor;
    enddef;
    CalculNombreDonneesEtDonneeMax(#2);
    ListeDonnees(#2);
    RecuperationCouleurs(#4);
    TraceDiag;
    if LegendeVide=false:
    AffichageNom(#1);
    fi;
    if AffichageDonnee:
    AffichageDonnees(#3);
    fi;
  \end{mpost}
  \fi%
}%

% Construction du graphique en bâtons
\newcommand\MPStatNew[2]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    maxx:=0;
    maxy:=0;
    unitex:=\useKV[ClesStat]{Unitex}*cm;
    unitey:=\useKV[ClesStat]{Unitey}*cm;
    xpartorigine:=\useKV[ClesStat]{Origine};
    AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse};
    boolean Rotation;
    Rotation=\useKV[ClesStat]{AbscisseRotation};
    boolean Lecture;
    Lecture:=\useKV[ClesStat]{Lecture};
    boolean LectureFine;
    LectureFine:=\useKV[ClesStat]{LectureFine};
    boolean AideLecture;
    AideLecture:=\useKV[ClesStat]{AideLecture};
    boolean DonneesSup;
    DonneesSup:=\useKV[ClesStat]{DonneesSup};
    boolean Reponses;
    Reponses:=\useKV[ClesStat]{Reponses};
    epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons};
    boolean Qualitatif;
    Qualitatif=\useKV[ClesStat]{Qualitatif};
    boolean Tiret;
    Tiret=\useKV[ClesStat]{Tiret};
    color CoulDefaut;
    CoulDefaut=\useKV[ClesStat]{CouleurDefaut};
    Depart=\useKV[ClesStat]{Depart};
    % on r\'ecup\`ere les couleurs
    color Col[];
    n:=0;
    for p_=#2:
    n:=n+1;
    if color p_:
    Col[n]=p_;
    else:
    Col[n]=CoulDefaut;
    fi;
    endfor;
    % 
    pair A[],B[],P[];
    vardef toto(text t)=%points quantitatif
    n:=0;
    for p_=t:
    if pair p_:
    n:=n+1;
    P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey);
    if xpart(p_)>maxx:
    maxx:=xpart(p_)-(xpartorigine);
    fi;
    if ypart(p_)>maxy:
    maxy:=ypart(p_);
    fi;
    A[n]=unitex*(xpart(p_)-(xpartorigine),0);
    B[n]=unitey*(0,ypart(p_));
    fi;
    endfor;
    enddef;
    vardef tutu(text t)=%points qualitatif
    n:=0;
    for p_=t:
    if numeric p_:
    P[n]=((n)*unitex,unitey*(p_-Depart));
    B[n]=(0,unitey*(p_-Depart));
    if p_>maxy:
    maxy:=p_;
    fi;
    else:
    n:=n+1;
    A[n]=unitex*(n,0);
    fi;
    endfor;
    maxy:=maxy-Depart;
    maxx:=n;
    enddef;
    vardef tata(text t)=%affichage quantitatif
    l=0;
    for p_=t:
    if pair p_:
    l:=l+1;
    if Rotation:
    label.bot(TEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]);
    else :
    label.bot(TEX("\num{"&decimal(xpart(p_))&"}"),A[l]);
    fi;
    if Reponses:
    if DonneesSup:
    label.top(TEX("\num{"&decimal(ypart(p_))&"}"),P[l]);
    else:
    if Tiret:
    trace (B[l]+(-1pt,0))--(B[l]+(1pt,0));
    label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]);
    else:
    dotlabel.lft(TEX("\num{"&decimal(ypart(p_))&"}"),B[l]);
    fi;
    fi;
    fi;
    fi;
    endfor;
    enddef;
    vardef titi(text t)=%affichage qualitatif
    l:=0;
    for p_=t:
    if numeric p_:
    if Reponses:
    if DonneesSup:
    label.top(TEX("\num{"&decimal(p_)&"}"),P[l]);
    else:
    if Tiret:
    trace (B[l]+(-1pt,0))--(B[l]+(1pt,0));
    label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]);
    else:
    dotlabel.lft(TEX("\num{"&decimal(p_)&"}"),B[l]);
    fi;
    fi;
    fi;
    else:
    l:=l+1;
    if Rotation:
    if AngleRotation<>0:
    picture TEXTELABEL;
    TEXTELABEL=image(
    labeloffset:=labeloffset*2;
    label.lft(TEX(p_),A[l]);
    labeloffset:=labeloffset/2;
    );
    trace rotation(TEXTELABEL,A[l],AngleRotation);
    else :
    label.bot(TEX(p_),A[l]);
    fi;
    fi;
    fi;
    endfor;
    enddef;
    if Qualitatif: tutu(#1); else: toto(#1); fi;
    boolean Grille;
    Grille:=\useKV[ClesStat]{Grille};
    Pasx:=\useKV[ClesStat]{Pasx};
    Pasy:=\useKV[ClesStat]{Pasy};
    if Grille:
    drawoptions(withcolor 0.75white);
    for k=0 step Pasx until ((maxx+1)):
    trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy));
    endfor;
    for k=0 step Pasy until ((maxy+2*Pasy)):
    trace (0,k*unitey)--(unitex*(maxx+1),k*unitey);
    endfor;
    drawoptions();
    fi;
    if epaisseurbatons<>0:
    for k=1 upto n:
    fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi;
    if AideLecture:
    draw B[k]--P[k] dashed evenly;
    fi;
    endfor;
    fi;
    if LectureFine:
    for k=0 step Pasy until ((maxy+1*Pasy)):
    if Tiret:
    trace (1pt,k*unitey)--(-1pt,k*unitey);
    label.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey));
    else:
    dotlabel.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey));
    fi;
    endfor;
    fi;
    if Lecture:
    for k=0 step Pasy until Pasy:
    if Tiret:
    trace (1pt,k*unitey)--(-1pt,k*unitey);
    label.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    else:
    dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    fi;
    endfor;
    fi;
    drawarrow (0,0)--unitex*(maxx+1,0);
    drawarrow (0,0)--unitey*(0,maxy+2*Pasy);
    label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0));
    label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy));
    if Qualitatif: titi(#1); else:tata(#1); fi;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={%
      unitex:=\useKV[ClesStat]{Unitex}*cm;
      unitey:=\useKV[ClesStat]{Unitey}*cm;
      xpartorigine:=\useKV[ClesStat]{Origine};
      AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse};
      boolean Rotation;
      Rotation=\useKV[ClesStat]{AbscisseRotation};
      boolean Lecture;
      Lecture:=\useKV[ClesStat]{Lecture};
      boolean LectureFine;
      LectureFine:=\useKV[ClesStat]{LectureFine};
      boolean AideLecture;
      AideLecture:=\useKV[ClesStat]{AideLecture};
      boolean DonneesSup;
      DonneesSup:=\useKV[ClesStat]{DonneesSup};
      boolean Reponses;
      Reponses:=\useKV[ClesStat]{Reponses};
      epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons};
      boolean Qualitatif;
      Qualitatif=\useKV[ClesStat]{Qualitatif};
      boolean Tiret;
      Tiret=\useKV[ClesStat]{Tiret};
      color CoulDefaut;
      CoulDefaut=\useKV[ClesStat]{CouleurDefaut};}
    Depart=\useKV[ClesStat]{Depart};
    ]
    maxx:=0;
    maxy:=0;
    % on r\'ecup\`ere les couleurs
    color Col[];
    n:=0;
    for p_=#2:
    n:=n+1;
    if color p_:
    Col[n]=p_;
    else:
    Col[n]=CoulDefaut;
    fi;
    endfor;
    % 
    pair A[],B[],P[];
    vardef toto(text t)=%points quantitatif
    n:=0;
    for p_=t:
    if pair p_:
    n:=n+1;
    P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey);
    if xpart(p_)>maxx:
    maxx:=xpart(p_)-(xpartorigine);
    fi;
    if ypart(p_)>maxy:
    maxy:=ypart(p_);
    fi;
    A[n]=unitex*(xpart(p_)-(xpartorigine),0);
    B[n]=unitey*(0,ypart(p_));
    fi;
    endfor;
    enddef;
    vardef tata(text t)=%affichage quantitatif
    l=0;
    for p_=t:
    if pair p_:
    l:=l+1;
    if Rotation:
    label.bot(LATEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]);
    else :
    label.bot(LATEX("\num{"&decimal(xpart(p_))&"}"),A[l]);
    fi;
    if Reponses:
    if DonneesSup:
    label.top(LATEX("\num{"&decimal(ypart(p_))&"}"),P[l]);
    else:
    if Tiret:
    trace (B[l]+(-1pt,0))--(B[l]+(1pt,0));
    label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]);
    else:
    dotlabel.lft(LATEX("\num{"&decimal(ypart(p_))&"}"),B[l]);
    fi;
    fi;
    fi;
    fi;
    endfor;
    enddef;
    vardef tutu(text t)=%points qualitatif
    n:=0;
    for p_=t:
    if numeric p_:
    P[n]=((n)*unitex,unitey*p_);
    B[n]=(0,unitey*p_);
    if p_>maxy:
    maxy:=p_;
    fi;
    else:
    n:=n+1;
    A[n]=unitex*(n,0);
    fi;
    endfor;
    maxx:=n;
    enddef;
    vardef titi(text t)=%affichage qualitatif
    l:=0;
    for p_=t:
    if numeric p_:
    if Reponses:
    if DonneesSup:
    label.top(LATEX("\num{"&decimal(p_)&"}"),P[l]);
    else:
    if Tiret:
    trace (B[l]+(-1pt,0))--(B[l]+(1pt,0));
    label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]);
    else:
    dotlabel.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]);
    fi;
    fi;
    fi;
    else:
    l:=l+1;
    if Rotation:
    if AngleRotation<>0:
    picture TEXTELABEL;
    TEXTELABEL=image(
    labeloffset:=labeloffset*2;
    label.lft(LATEX(p_),A[l]);
    labeloffset:=labeloffset/2;
    );
    trace rotation(TEXTELABEL,A[l],AngleRotation);
    else :
    label.bot(LATEX(p_),A[l]);
    fi;
    fi;
    fi;
    endfor;
    enddef;
    if Qualitatif: tutu(#1); else: toto(#1); fi;
    boolean Grille;
    Grille:=\useKV[ClesStat]{Grille};
    Pasx:=\useKV[ClesStat]{Pasx};
    Pasy:=\useKV[ClesStat]{Pasy};    
    if Grille:
    drawoptions(withcolor 0.75white);
    for k=0 step Pasx until ((maxx+1)):
    trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy));
    endfor;
    for k=0 step Pasy until ((maxy+2*Pasy)):
    trace (0,k*unitey)--(unitex*(maxx+1),k*unitey);
    endfor;
    drawoptions();
    fi;
    if epaisseurbatons<>0:
    for k=1 upto n:
    fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi;
    if AideLecture:
    draw B[k]--P[k] dashed evenly;
    fi;
    endfor;
    fi;
    if LectureFine:
    for k=0 step Pasy until ((maxy+1*Pasy)):
    if Tiret:
    trace (1pt,k*unitey)--(-1pt,k*unitey);
    label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    else:
    dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    fi;
    endfor;
    fi;
    if Lecture:
    for k=0 step Pasy until Pasy:
    if Tiret:
    trace (1pt,k*unitey)--(-1pt,k*unitey);
    label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    else:
    dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey));
    fi;
    endfor;
    fi;
    drawarrow (0,0)--unitex*(maxx+1,0);
    drawarrow (0,0)--unitey*(0,maxy+2*Pasy);
    label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0));
    label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy));
    if Qualitatif: titi(#1); else:tata(#1); fi;
  \end{mpost}
  \fi
}

% la construction du graphique qualitatif
\def\NewMPStatCirculaireQ#1#2#3#4{%
  %#1 : la liste des données
  %#2 : 360 ou 180
  %#3 : liste des couleurs
  %#4 : liste des légendes à effacer.
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    Rayon:=\useKV[ClesStat]{Rayon};
    ecarthachures=\useKV[ClesStat]{EcartHachures};
    epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures};
    boolean AffichageAngle;
    AffichageAngle=\useKV[ClesStat]{AffichageAngle};
    boolean AffichageDonnee;
    AffichageDonnee=\useKV[ClesStat]{AffichageDonnee};
    boolean Hachures;
    Hachures=\useKV[ClesStat]{Hachures};
    boolean Inverse;
    Inverse=\useKV[ClesStat]{LectureInverse};
    boolean Legende;
    Legende=\useKV[ClesStat]{Legende};
    boolean LegendeVide;
    LegendeVide=\useKV[ClesStat]{LegendeVide};
    boolean Retour;
    Retour=false;
    boolean ACompleter;
    ACompleter=\useKV[ClesStat]{ACompleter};
    pair A[],O,B[],C[],D[];
    O=(0,0);
    n:=0;
    numeric total[],ang[];
    total[0]=0;
    ang[0]:=0;
    path cc;
    cc=(fullcircle scaled (2*Rayon));
    % on r\'ecup\`ere les couleurs
    color Col[];
    n:=0;
    for p_=#3:
    n:=n+1;
    Col[n]=p_;
    endfor;
    if Inverse=false:
    A[0]=point(0) of cc;
    else:
    A[0]=point(180) of cc;
    fi;
    vardef toto(text t)=
    n:=0;
    for p_=t:
    if numeric p_:
    n:=n+1;
    total[n]:=total[n-1]+p_;
    fi;
    endfor;
    N=n;
    for k=1 upto N:
    ang[k]=(#2/total[N])*total[k];
    endfor;
    n:=0;
    for p_=t:
    if numeric p_:
    n:=n+1;
    if Inverse=false:
    A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N]));
    else:
    A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N]));
    fi;
    %hachure ou pas ?
    if Hachures=false:
    fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else:
    arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi;
    else:
    draw
    Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O)
    else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if
    (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi)
    withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi;
    fi;
    if ACompleter=false:
    draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi;
    fi;
    % Affichage des angles associ\'es
    if AffichageAngle:
    if round(p_*(#2/total[N]))>15:
    if (n mod 2)=0:
    marque_a:=20*0.75*Rayon/cm;
    else:
    marque_a:=20*0.5*Rayon/cm;
    fi;
    if Hachures:
    if Inverse=false:
    undraw
    Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    else:
    undraw
    Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    fi;
    fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor
    blanc;
    fi;
    if Inverse=false:
    draw
    Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    else:
    draw
    Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    fi;
    fi;
    elseif AffichageDonnee:
    if round(p_*(#2/total[N]))>15:
    if (n mod 2)=0:
    marque_a:=20*0.75*Rayon/cm;
    else:
    marque_a:=20*0.5*Rayon/cm;
    fi;
    if Hachures:
    if Inverse=false:
    undraw
    Codeangle(A[n-1],O,A[n],0,TEX(""&decimal(p_)&""));
    else:
    undraw
    Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&"")))));
    fi;
    fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor
    blanc;
    fi;
    if Inverse=false:
    draw
    Codeangle(A[n-1],O,A[n],0,(((TEX(""&decimal(p_)&"")))));
    else:
    draw
    Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&"")))));
    fi;
    fi;
    fi;
    %
    fi;
    endfor;
    if #2=360:
    draw cc if Hachures: withpen pencircle scaled2 fi;
    else:
    draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;;
    fi;
    n:=0;
    if Legende:
    for p_=t:
    if string p_:
    n:=n+1;
    C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2);
    draw 0.95[O,C[n]]--1.05[O,C[n]];
    C[n]:=1.05[O,C[n]];
    Test(n);
    if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)):
    D[n]=C[n]+(0.5cm,0);
    draw C[n]--D[n];
    if Retour=false:label.urt(TEX(p_),D[n]);fi;
    fi;
    if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)):
    D[n]=C[n]-(0.5cm,0);
    draw C[n]--D[n];
    if Retour=false:label.ulft(TEX(p_),D[n]);fi;
    fi;
    if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)):
    D[n]=C[n]-(0.5cm,0);
    draw C[n]--D[n];
    if Retour=false:label.llft(TEX(p_),D[n]);fi;
    fi;
    if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)):
    D[n]=C[n]+(0.5cm,0);
    draw C[n]--D[n];
    if Retour=false:label.lrt(TEX(p_),D[n]);fi;
    fi;
    fi;
    endfor;
    fi;
    enddef;
    vardef Test(expr nb)=
    Retour:=false;
    op:=0;
    for l_=#4:
    if l_=nb:
    op:=op+1;
    fi;
    endfor;
    if op>0:
    Retour:=true;
    fi;
    enddef;    
    Figure(-10u,-10u,10u,10u);
    toto(#1);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={%
      Rayon:=\useKV[ClesStat]{Rayon};
      ecarthachures=\useKV[ClesStat]{EcartHachures};
      epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures};
      boolean AffichageAngle;
      AffichageAngle=\useKV[ClesStat]{AffichageAngle};
      boolean AffichageDonnee;
      AffichageDonnee=\useKV[ClesStat]{AffichageDonnee};
      boolean Hachures;
      Hachures=\useKV[ClesStat]{Hachures};
      boolean Inverse;
      Inverse=\useKV[ClesStat]{LectureInverse};
      boolean Legende;
      Legende=\useKV[ClesStat]{Legende};
      boolean LegendeVide;
      LegendeVide=\useKV[ClesStat]{LegendeVide};
      boolean ACompleter;
      ACompleter=\useKV[ClesStat]{ACompleter};
    }]
    boolean Retour;
    Retour=false;
    pair A[],O,B[],C[],D[];
    O=(0,0);
    n:=0;
    numeric total[],ang[];
    total[0]=0;
    ang[0]:=0;
    path cc;
    cc=(fullcircle scaled (2*Rayon));
    % on r\'ecup\`ere les couleurs
    color Col[];
    n:=0;
    for p_=#3:
    n:=n+1;
    Col[n]=p_;
    endfor;
    if Inverse=false:
    A[0]=point(0) of cc;
    else:
    A[0]=point(180) of cc;
    fi;
    vardef toto(text t)=
    n:=0;
    for p_=t:
    if numeric p_:
    n:=n+1;
    total[n]:=total[n-1]+p_;
    fi;
    endfor;
    N=n;
    for k=1 upto N:
    ang[k]=(#2/total[N])*total[k];
    endfor;
    n:=0;
    for p_=t:
    if numeric p_:
    n:=n+1;
    if Inverse=false:
    A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N]));
    else:
    A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N]));
    fi;
    %hachure ou pas ?
    if Hachures=false:
    fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else:
    arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi;
    else:
    draw
    Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O)
    else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if
    (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi)
    withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi;
    fi;
    if ACompleter=false:
    draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi;
    fi;
    % Affichage des angles associ\'es
    if AffichageAngle:
    if round(p_*(#2/total[N]))>15:
    if (n mod 2)=0:
    marque_a:=20*0.75*Rayon/cm;
    else:
    marque_a:=20*0.5*Rayon/cm;
    fi;
    if Hachures:
    if Inverse=false:
    undraw
    Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    else:
    undraw
    Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    fi;
    fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor
    blanc;
    fi;
    if Inverse=false:
    draw
    Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    else:
    draw
    Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}")))));
    fi;
    fi;
    elseif AffichageDonnee:
    if round(p_*(#2/total[N]))>15:
    if (n mod 2)=0:
    marque_a:=20*0.75*Rayon/cm;
    else:
    marque_a:=20*0.5*Rayon/cm;
    fi;
    if Hachures:
    if Inverse=false:
    undraw
    Codeangle(A[n-1],O,A[n],0,LATEX(""&decimal(p_)&""));
    else:
    undraw
    Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&"")))));
    fi;
    fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor
    blanc;
    fi;
    if Inverse=false:
    draw
    Codeangle(A[n-1],O,A[n],0,(((LATEX(""&decimal(p_)&"")))));
    else:
    draw
    Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&"")))));
    fi;
    fi;
    fi;
    %
    fi;
    endfor;
    if #2=360:
    draw cc if Hachures: withpen pencircle scaled2 fi;
    else:
    draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;;
    fi;
    n:=0;
    if Legende:
    for p_=t:
    if string p_:
    n:=n+1;
    C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2);
    draw 0.95[O,C[n]]--1.05[O,C[n]];
    C[n]:=1.05[O,C[n]];
    Test(n);
    if Retour=false:
    if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)):
    D[n]=C[n]+(0.5cm,0);
    draw C[n]--D[n];
    label.urt(LATEX(p_),D[n]);
    fi;
    if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)):
    D[n]=C[n]-(0.5cm,0);
    draw C[n]--D[n];
    label.ulft(LATEX(p_),D[n]);
    fi;
    if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)):
    D[n]=C[n]-(0.5cm,0);
    draw C[n]--D[n];
    label.llft(LATEX(p_),D[n]);
    fi;
    if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)):
    D[n]=C[n]+(0.5cm,0);
    draw C[n]--D[n];
    label.lrt(LATEX(p_),D[n]);
    fi;
    fi;
    fi;
    endfor;
    fi;
    enddef;
    vardef Test(expr nb)=
    Retour:=false;
    op:=0;
    for l_=#4:
    if l_=nb:
    op:=op+1;
    fi;
    endfor;
    if op>0:
    Retour:=true;
    fi;
    enddef;    
    Figure(-10u,-10u,10u,10u);
    toto(#1);
  \end{mpost}
  \fi
}%

%Pour la m\'ediane.
\DTLgnewdb{mtdb}%
\dtlexpandnewvalue%
\newcount\nbdonnees%
% 
\def\AjoutListEEaa#1\nil{\addtotok\tabtoksEEa{#1,}}%
\def\AjoutListEEab#1\nil{\addtotok\tabtoksEEa{#1/}}%
\def\AjoutListEEb#1\nil{\addtotok\tabtoksEEb{#1,}}%
\def\AjoutListEEx#1\nil{\addtotok\tabtoksEE{#1,}}%
\def\AjoutListEEy#1\nil{\addtotok\tabtoksEE{#1/}}%

\DTLgnewdb{mtdbEE}%
\DTLgnewdb{mtdbEEqual}%
%
\newcommand\Stat[2][]{%
  \useKVdefault[ClesStat]%
  \setKV[ClesStat]{#1}%
  \ifboolKV[ClesStat]{Representation}{%
    \setKV[TraceG]{Xmin=0,Ymin=0}%
    \setKV[TraceG]{#1}%
    \readlist*\ListePointsPlaces{#2}%
    \newtoks\toklistepoint%
    \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}%
    \MPPlacePoint[#1]{\the\toklistepoint}%
  }{%
    \ifboolKV[ClesStat]{Liste}{%
      \setsepchar{,}\ignoreemptyitems%
      \readlist*\Liste{#2}%
      \xdef\foo{}%
      \setsepchar[*]{,*/}\ignoreemptyitems%
      \xintFor* ##1 in {\xintSeq {1}{\Listelen}}\do{%
        \xdef\foo{\foo 1/\Liste[##1],}%
      }%
      \readlist*\ListeComplete{\foo}%
      \setKV[ClesStat]{Qualitatif}%
    }{%
      \ifboolKV[ClesStat]{Sondage}{%
        \setsepchar{,}\ignoreemptyitems%
        \readlist*\Liste{#2}%
        % "liste vide"
        \newtoks\tabtoksEEa%
        \tabtoksEEa{}%
        % 
        % "liste vide"
        \newtoks\tabtoksEEb%
        \tabtoksEEb{}%
        % 
        \readlist*\ListeSansDoublonsEE{999}%   %% Pour ne pas avoir une liste vide
        % 
        \newcount\cmptEE%
        \newcount\PasNumEE%    %% Permettra de savoir si ce sondage est qualitatif ou quantitatif
        \PasNumEE=0\relax%
        \DTLcleardb{mtdbEE}%
        % on range les resultats du sondage par ordre croissant.
        \foreachitem\x\in\Liste{%
          \DTLnewrow{mtdbEE}%
          \DTLnewdbentry{mtdbEE}{Numeric}{\x}%
        }%
        \dtlsort{Numeric}{mtdbEE}{\dtlicompare}%
        \DTLforeach{mtdbEE}{\nba=Numeric}{%
          \IfDecimal{\nba}{}{\PasNumEE=\numexpr\PasNumEE+1\relax}%
          \cmptEE=0\relax%
          \foreachitem\nbb\in\ListeSansDoublonsEE{%
            \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}%
          }%
          \ifthenelse{\equal{\the\cmptEE}{0}}{%
            \expandafter\AjoutListEEb\nba\nil%
            \xdef\listEEa{\the\tabtoksEEb}%
            \ignoreemptyitems%
            \setsepchar{,}%
            \readlist*\ListeSansDoublonsEE\listEEa%    	%%% Enl\`eve tous les \'elements
            %%% identiques de Liste
          }{}%  
        }%	
        \foreachitem\nba\in\ListeSansDoublonsEE{%
          \cmptEE=0\relax%
          \DTLforeach{mtdbEE}{\nbb=Numeric}{%
            \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}%
          }%
          \expandafter\AjoutListEEab\nba\nil%
          \expandafter\AjoutListEEaa\the\cmptEE\nil% 	%%% Compte tous les \'elements
          %%% identiques de Liste
        }%
        \xdef\listEEb{\the\tabtoksEEa}
        \ignoreemptyitems%
        \setsepchar[*]{,*/}%
        \readlist*\ListeComplete\listEEb%
        % 
        \ifthenelse{\equal{\the\PasNumEE}{0}}{\setKV[ClesStat]{Quantitatif}}{\setKV[ClesStat]{Qualitatif}}%
      }{%
        \ifboolKV[ClesStat]{Qualitatif}{%
          %  % on lit la liste \'ecrite sous la forme valeur/effectif
          \setsepchar[*]{,*/}\ignoreemptyitems%
          \readlist*\ListeInitiale{#2}%
          % "liste vide"
          \newtoks\tabtoksEE%
          \tabtoksEE{}%
          \DTLcleardb{mtdbEEqual}%
          \foreachitem\x\in\ListeInitiale{%
            \DTLnewrow{mtdbEEqual}%
            \itemtomacro\ListeInitiale[\xcnt,1]\x%
            \DTLnewdbentry{mtdbEEqual}{Val}{\x}%
            \itemtomacro\ListeInitiale[\xcnt,2]\y%
            \DTLnewdbentry{mtdbEEqual}{Eff}{\y}%
          }%
          \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{%  
            \expandafter\AjoutListEEy\Val\nil%
            \expandafter\AjoutListEEx\Eff\nil%
          }%
          \xdef\listEE{\the\tabtoksEE}
          \ignoreemptyitems%
          \setsepchar[*]{,*/}%
          \readlist*\ListeComplete\listEE%
        }{% Dans le qualitatif, on trie d'abord les valeurs.
          \setsepchar[*]{,*/}\ignoreemptyitems%
          \readlist*\ListeInitiale{#2}%
          % "liste vide"
          \newtoks\tabtoksEE%
          \tabtoksEE{}%
          \DTLcleardb{mtdbEEqual}%
          \foreachitem\x\in\ListeInitiale{%
            \DTLnewrow{mtdbEEqual}%
            \itemtomacro\ListeInitiale[\xcnt,1]\x%
            \DTLnewdbentry{mtdbEEqual}{Val}{\x}%
            \itemtomacro\ListeInitiale[\xcnt,2]\y%
            \DTLnewdbentry{mtdbEEqual}{Eff}{\y}%
          }%
          \dtlsort{Val}{mtdbEEqual}{\dtlicompare}%
          \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{%  
            \expandafter\AjoutListEEy\Val\nil%
            \expandafter\AjoutListEEx\Eff\nil%
          }%
          \xdef\listEE{\the\tabtoksEE}
          \ignoreemptyitems%
          \setsepchar[*]{,*/}%
          \readlist*\ListeComplete\listEE%
        }}}%
    % on cr\'ee la base de donn\'ees des valeurs dans le cas qualitatif
    \DTLcleardb{mtdb}%
    % on les trie pour la m\'ediane dans le cas qualitatif % Touhami / Texnique.fr
    \foreachitem\x\in\ListeComplete{%
      \DTLnewrow{mtdb}%
      \itemtomacro\ListeComplete[\xcnt,2]\y%
      \DTLnewdbentry{mtdb}{Numeric}{\y}%
    }%
    \dtlsort{Numeric}{mtdb}{\dtlicompare}%
    %  % on r\'einitialise les valeurs des crit\`eres de position et de
    % dispersion
    \renewcommand\NbDonnees{}%
    \renewcommand\SommeDonnees{}%
    \renewcommand\EffectifTotal{}%
    \renewcommand\Moyenne{}%
    \renewcommand\Etendue{}%
    \renewcommand\Mediane{}%
    \renewcommand\DonneeMax{0}%
    \renewcommand\EffectifMax{0}%
    \renewcommand\DonneeMin{999999999}%
    \ifboolKV[ClesStat]{Qualitatif}{%D\'ebut qualitatif
      % Calculs
      %  %% celui de la somme des donn\'ees
      \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,2]}}}%
      %  %% celui de l'effectif total
      \ifboolKV[ClesStat]{EffectifTotal}{%
        \ifboolKV[ClesStat]{Liste}{L'effectif total de la s\'erie est
          \num{\ListeCompletelen}.\par}{%
          \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}%
          L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in
            {\xintSeq {2}{\ListeCompletelen}}\do{%
              +\ListeComplete[##1,2]}=\num{\EffectifTotal}\]}
      }{}%
      \ifboolKV[ClesStat]{Liste}{\xdef\EffectifTotal{\ListeCompletelen}}{\xdef\EffectifTotal{\SommeDonnees}}%
      %  %% celui de la moyenne
      \xdef\Moyenne{\fpeval{\SommeDonnees/\ListeCompletelen}}%	
      \ifboolKV[ClesStat]{Moyenne}{%
        \ifboolKV[ClesStat]{Liste}{%
          La somme des donn\'ees de la s\'erie est :%
          \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{%
            \[
              \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{%
                +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
              }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}%
            \]}{%
            \[
              \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{3}}\do{%
                +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{%
                +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
              }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}%
            \]%
          }%
          \ifboolKV[ClesStat]{SET}{}{Le nombre de donn\'ees de la s\'erie est \num{\ListeCompletelen}.\\}%
          Donc la moyenne de la s\'erie est \'egale \`a :%
          \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\ListeCompletelen}}%\IfInteger{\fpeval{round(\fpeval{\SommeDonnees/\ListeCompletelen},\useKV[ClesStat]{Precision})}}{=}{\approx}
            \ifboolKV[ClesStat]{ValeurExacte}{}{%
              \opdiv*{\SommeDonnees}{\ListeCompletelen}{resultatmoy}{restemoy}%
              \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}%
              \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi%
              \num{\fpeval{round(\SommeDonnees/\ListeCompletelen,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}%
            }%
          \]%
        }{Pas de moyenne possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}%
      %    %  %% celui de l'\'etendue
      \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
        \xintifboolexpr{\ListeComplete[##1,2]>\DonneeMax}{%
          \xdef\DonneeMax{\ListeComplete[##1,2]}%
        }{}%
        \xintifboolexpr{\ListeComplete[##1,2]<\DonneeMin}{%
          \xdef\DonneeMin{\ListeComplete[##1,2]}%
        }{}%
      }%
      \xdef\EffectifMax{\DonneeMax}%
      \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}%
      \ifboolKV[ClesStat]{Etendue}{%
        \ifboolKV[ClesStat]{Liste}{%
          L'\'etendue de la s\'erie est \'egale \`a $\num{\DonneeMax}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\DonneeMin}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}%
        }{Pas d'\'etendue possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}%
      % celui de la mediane
      %%% Recuperation de la mediane %%%%%%%%%%%%%%%%%%%%% 
      \newcount\Recapmed%
      \newcount\Recapmeda%
      \ifodd\number\ListeCompletelen%odd impair
      \Recapmed=\fpeval{(\ListeCompletelen+1)/2}\relax%
      \else%
      \Recapmed=\fpeval{\ListeCompletelen/2}\relax%
      \Recapmeda=\numexpr\Recapmed+1\relax%
      \fi%
      \newcount\Recapk%
      \Recapk=0%
      \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\Recapk=\numexpr\Recapk+1\relax%
        \ifnum\Recapk=\Recapmed%
        \ifodd\number\ListeCompletelen%
        \xdef\Mediane{\numeroDonnee}%
        \else%
        \xdef\Mediane{\numeroDonnee}%
        \fi%
        \fi%
        \ifnum\Recapk=\Recapmeda%
        \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}%
        \fi%
      }%
      %%% 
      \ifboolKV[ClesStat]{Mediane}{%
        \ifboolKV[ClesStat]{Liste}{%    
          On range les donn\'ees par ordre croissant :%
          \nbdonnees=0%
          \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{%
            \[\DTLforeach{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{;}}\]%
          }{%
            \medskip%
            \begin{center}
              \begin{minipage}{0.9\linewidth}
                \DTLforeach*{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{;
                  }\nbdonnees=\fpeval{\nbdonnees+1}\modulo{\nbdonnees}{\useKV[ClesStat]{Coupure}}\xintifboolexpr{\remainder==0}{\\}{}}
              \end{minipage}
            \end{center}%
            \medskip%
          }%
          \newcount\med%
          \newcount\meda%
          \ifodd\number\ListeCompletelen%odd impair
          \med=\fpeval{(\ListeCompletelen+1)/2}\relax%
          L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$.\\
          \else% pair
          \med=\fpeval{\ListeCompletelen/2}\relax%
          \meda=\numexpr\med+1\relax%
          L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\the\med}+\num{\the\med}$.\\
          \fi%
          \newcount\k%
          \k=0%
          \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\k=\numexpr\k+1\relax%
            \ifnum\k=\med %La m\'ediane vaut \numeroDonnee\fi
            \ifodd\number\ListeCompletelen%
            La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee.\\Donc la m\'ediane de la s\'erie est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}%
            \xdef\Mediane{\numeroDonnee}%
            \else%
            La \the\med\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\numeroDonnee}%
            \fi%
            \fi%
            \ifnum\k=\meda
            La \the\meda\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.} Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}%
            \fi%
          }%
          %%%%%%% 
        }{Pas de m\'ediane possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}
      %%% Quartile un
      \newcount\PfCQuartileUn%
      \modulo{\ListeCompletelen}{4}\relax%
      \ifnum\remainder=0%
      \PfCQuartileUn=\fpeval{\ListeCompletelen/4}%
      \else%
      \PfCQuartileUn=\fpeval{ceil(\ListeCompletelen/4)+1}%
      \fi%
      \newcount\PfCQunk%
      \PfCQunk=0%
      \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQunk=\numexpr\PfCQunk+1\relax%
        \ifnum\PfCQunk=\PfCQuartileUn%
        \xdef\QuartileUn{\numeroDonnee}%
        \fi%
      }%
      %%% Quartile trois
      \newcount\PfCQuartileTrois%
      \modulo{\ListeCompletelen}{4}\relax%
      \ifnum\remainder=0%
      \PfCQuartileTrois=\fpeval{3*\ListeCompletelen/4}%
      \else%
      \PfCQuartileTrois=\fpeval{ceil(3*\ListeCompletelen/4)+1}%
      \fi%
      \newcount\PfCQtroisk%
      \PfCQtroisk=0%
      \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQtroisk=\numexpr\PfCQtroisk+1\relax%
        \ifnum\PfCQtroisk=\PfCQuartileTrois%La m\'ediane vaut \numeroDonnee\fi
        \xdef\QuartileTrois{\numeroDonnee}%
        \fi%
      }%
      % Construction du tableau
      \ifboolKV[ClesStat]{Tableau}{%
        \ifboolKV[ClesStat]{Liste}{Pas de tableau possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un tableau avec cette liste.}{\BuildtabStat}}{}%
      % Construction du graphique
      \ifboolKV[ClesStat]{Graphique}{%
        \ifboolKV[ClesStat]{Liste}{Pas de graphique possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un graphique avec cette liste.}{%
          \ifboolKV[ClesStat]{Barre}{%
            \buildgraphbarhor%
          }{\ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraphq[#1]}}}%
        }}{}%
    }{%%%%%%%%%%%%%%%%%%%%%D\'ebut quantitatif
      %  % on effectue les calculs
      %  %% celui de la somme des donn\'ees
      \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,1]*\ListeComplete[\doncnt,2]}}}%
      %  %% celui de l'effectif total
      \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}%
      %  %% celui de l'\'etendue
      \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
        \xintifboolexpr{\ListeComplete[##1,1]>\DonneeMax}{%
          \xdef\DonneeMax{\ListeComplete[##1,1]}%
        }{}%
        \xintifboolexpr{\ListeComplete[##1,1]<\DonneeMin}{%
          \xdef\DonneeMin{\ListeComplete[##1,1]}%
        }{}%
      }%
      % \xdef\EffectifMax{\DonneeMax}%
      \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}%%
      %  %% celui de la moyenne
      \xdef\Moyenne{\fpeval{\SommeDonnees/\EffectifTotal}}%
      \ifboolKV[ClesStat]{EffectifTotal}{%
        L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in
          {\xintSeq {2}{\ListeCompletelen}}\do{%
            +\ListeComplete[##1,2]}=\num{\EffectifTotal}\]
      }{}%
      \ifboolKV[ClesStat]{Moyenne}{%
        La somme des donn\'ees de la s\'erie est :%
        \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{%
          \[
            \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{%
              +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
            }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
          \]
        }{%
          \[
            \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{2}}\do{%
              +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
            }+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{%
              +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
            }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}
          \]
        }%
        \ifboolKV[ClesStat]{SET}{}{L'effectif total de la s\'erie est :%
          \ifboolKV[ClesStat]{Liste}{ \num{\EffectifTotal}\\}{%
            \[\num{\ListeComplete[1,2]}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{%
                +\num{\ListeComplete[##1,2]}
              }=\num{\EffectifTotal}
            \]%
          }%
        }%
        Donc la moyenne de la s\'erie est \'egale \`a :%
        \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\EffectifTotal}}%
          \ifboolKV[ClesStat]{ValeurExacte}{}{%
            \opdiv*{\SommeDonnees}{\EffectifTotal}{resultatmoy}{restemoy}%
            \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}%
            \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi%
            \num{\fpeval{round(\SommeDonnees/\EffectifTotal,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}%
          }%
        \]%
      }{}%
      %  % Affichage des r\'eponses.
      %  %% pour l'\'etendue
      \ifboolKV[ClesStat]{Etendue}{L'\'etendue de la s\'erie est \'egale \`a $\num{\ListeComplete[\ListeCompletelen,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}}{}%
      % pour la m\'ediane
      %%% Recuperation Mediane
      \newcount\Recupmed%
      \newcount\Recupmeda%
      \ifodd\number\EffectifTotal%odd impair
      \Recupmed=\fpeval{(\EffectifTotal+1)/2}\relax%
      \else% pair
      \Recupmed=\fpeval{\EffectifTotal/2}\relax%
      \Recupmeda=\numexpr\Recupmed+1\relax%
      \fi%
      \newcount\Recupk%
      \Recupk=0%
      \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
        \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{%
          \Recupk=\numexpr\Recupk+1\relax%
          \ifnum\Recupk=\Recupmed%
          \ifodd\number\EffectifTotal%
          \xdef\Mediane{\ListeComplete[##1,1]}%
          \else%
          \xdef\Mediane{\ListeComplete[##1,1]}%
          \fi%
          \fi%
          \ifnum\Recupk=\Recupmeda%
          \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}%
          \fi%
        }%
      }%
      %%% 
      \ifboolKV[ClesStat]{Mediane}{%
        
        \newcount\med%
        \newcount\meda%
        \ifodd\number\EffectifTotal%odd impair
        \med=\fpeval{(\EffectifTotal+1)/2}\relax%
        L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$. %
        \else% pair
        \med=\fpeval{\EffectifTotal/2}\relax%
        \meda=\numexpr\med+1\relax%
        L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med}}+\num{\fpeval{\med}}$. %
        \fi%
        \newcount\k%
        \k=0%
        \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
          \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{%
            \k=\numexpr\k+1\relax%
            \ifnum\k=\med%
            \ifodd\number\EffectifTotal%
            La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee. Donc la m\'ediane de la s\'erie est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}%
            \else%
            La \the\med\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\ListeComplete[##1,1]}%
            \fi%
            \fi%
            \ifnum\k=\meda%
            La \the\meda\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}\\Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}%
            \fi%
          }%
        }%
      }{}%
      %%% Quartile un
      \newcount\PfCQuartileUn%
      \modulo{\EffectifTotal}{4}\relax%
      \ifnum\remainder=0%
      \PfCQuartileUn=\fpeval{\EffectifTotal/4}%
      \else%
      \PfCQuartileUn=\fpeval{ceil(\EffectifTotal/4)+1}%
      \fi%
      \newcount\PfCQunk%
      \PfCQunk=0%
      \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
        \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{%
          \PfCQunk=\numexpr\PfCQunk+1\relax%
          \ifnum\PfCQunk=\PfCQuartileUn%
          \xdef\QuartileUn{\ListeComplete[##1,1]}%
          \fi%
        }%
      }%
      %%% Quartile trois
      \newcount\PfCQuartileTrois%
      \modulo{\EffectifTotal}{4}\relax%
      \ifnum\remainder=0%
      \PfCQuartileTrois=\fpeval{3*\EffectifTotal/4}%
      \else%
      \PfCQuartileTrois=\fpeval{ceil(3*\EffectifTotal/4)+1}%
      \fi%
      \newcount\PfCQtroisk%
      \PfCQtroisk=0%
      \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{%
        \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{%
          \PfCQtroisk=\numexpr\PfCQtroisk+1\relax%
          \ifnum\PfCQtroisk=\PfCQuartileTrois%
          \xdef\QuartileTrois{\ListeComplete[##1,1]}%
          \fi%
        }%
      }%
      % Construction de tableau
      \ifboolKV[ClesStat]{Tableau}{\BuildtabStat}{}%
      % Construction du graphique ??
      \ifboolKV[ClesStat]{Graphique}{%
        \ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraph[#1]}}
      }{}%
    }%
  }%
}%

%%%
% Radar
%%%
\setKVdefault[ClesRadar]{Rayon=3cm,Reference=20,MoyenneClasse=false,Disciplines=false,Pas=5}

\newtoks\toklisteradara%pour la moyenne de l'\'el\`eve
\newtoks\toklisteradarb%pour la discipline
\newtoks\toklisteradarc%pour la moyenne de classe

\def\UpdateRadara#1/#2/#3\nil{\addtotok\toklisteradara{#1,}}
\def\UpdateRadarb#1/#2/#3\nil{\addtotok\toklisteradarb{"#2",}}
\def\UpdateRadarc#1/#2/#3\nil{\addtotok\toklisteradarc{#3,}}

\newcommand\MPRadar[6]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    pair O;
    O=(0,0);
    path cc;
    cc=cercles(O,#1);
    %%etiquettage des disciplines
    n:=0;%compter le nombre de disciplines
    for p_=#2:
    n:=n+1;
    endfor;
    for k=1 upto n:
    N[k]=k*(360/n);
    trace segment(O,pointarc(cc,N[k]));% dashed evenly;
    endfor;
    p:=0;
    for p_=#2:
    p:=p+1;
    if (N[p]<90) or (N[p]=90):
    label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if ((N[p]>90) and (N[p]<180)) or (N[p]=180):
    label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>180) and (N[p]<270):
    label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>270) or (N[p]=270):
    label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    endfor;
    % trac\'e des pas:
    pas=#4/#3;
    for k=1 upto pas-1:
    trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor
    --cycle dashed evenly withcolor 0.5white;
    endfor;
    trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor
    --cycle;
    % etiquettage des pas
    dotlabel.urt(btex \tiny #4 etex,pointarc(cc,0));
    dotlabel.urt(btex \tiny #3 etex,(1/pas)[O,pointarc(cc,0)]);
    % trac\'e des r\'esultats \'el\`eves
    pair El[];
    el=0;
    for p_=#5:
    el:=el+1;
    El[el]=(p_/#4)[O,pointarc(cc,N[el])];
    endfor;
    trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen
    pencircle scaled 1.5 withcolor blue;
    % trac\'e des r\'esultats classe
    pair Cl[];
    cl=0;
    for p_=#6:
    cl:=cl+1;
    Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])];
    endfor;
    trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge;
  \end{mplibcode}
  \else
  \begin{mpost}
    pair O;
    O=(0,0);
    path cc;
    cc=cercles(O,#1);
    %%etiquettage des disciplines
    n:=0;%compter le nombre de disciplines
    for p_=#2:
    n:=n+1;
    endfor;
    for k=1 upto n:
    N[k]=k*(360/n);
    trace segment(O,pointarc(cc,N[k]));% dashed evenly;
    endfor;
    p:=0;
    for p_=#2:
    p:=p+1;
    if (N[p]<90) or (N[p]=90):
    label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if ((N[p]>90) and (N[p]<180)) or (N[p]=180):
    label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>180) and (N[p]<270):
    label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    if (N[p]>270) or (N[p]=270):
    label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]);
    fi;
    endfor;
    % trac\'e des pas:
    pas=#4/#3;
    for k=1 upto pas-1:
    trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor
    --cycle dashed evenly withcolor 0.5white;
    endfor;
    trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor
    --cycle;
    % etiquettage des pas
    dotlabel.top(LATEX("\noexpand\tiny"&decimal(#4)&"") rotated -90,pointarc(cc,0));
    dotlabel.urt(LATEX("\noexpand\tiny"&decimal(#3)&""),(1/pas)[O,pointarc(cc,0)]);
    % trac\'e des r\'esultats \'el\`eves
    pair El[];
    el=0;
    for p_=#5:
    el:=el+1;
    El[el]=(p_/#4)[O,pointarc(cc,N[el])];
    endfor;
    trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen
    pencircle scaled 1.5 withcolor blue;
    % trac\'e des r\'esultats classe
    pair Cl[];
    cl=0;
    for p_=#6:
    cl:=cl+1;
    Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])];
    endfor;
    trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge;
  \end{mpost}
  \fi
}

\newcommand\Radar[2][]{%
  % 1 les param\`etres
  % 2 la r\'epartition des notes
  \useKVdefault[ClesRadar]%
  \setKV[ClesRadar]{#1}%
  \ignoreemptyitems%
  \setsepchar[*]{,}%
  \readlist*\ListeRadar{#2}%
  \toklisteradara{}%
  \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadara\compteur\nil}%
  \ifboolKV[ClesRadar]{Disciplines}{}{%
    \toklisteradarb{}%
    \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarb\compteur\nil}%
  }%
  \ifboolKV[ClesRadar]{MoyenneClasse}{}{%
    \toklisteradarc{}%
    \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarc\compteur\nil}%
  }%
  \MPRadar{\useKV[ClesRadar]{Rayon}}{\the\toklisteradarb}{\useKV[ClesRadar]{Pas}}{\useKV[ClesRadar]{Reference}}{\the\toklisteradara}{\the\toklisteradarc}%
}

%%%
% Barres de niveaux
%%%
\setKVdefault[ClesBarre]{Niveau=false,LimiteI=25,LimiteF=50,LimiteS=75,TexteOrigine=0,TexteReference=100,CouleurGraduation=white,CouleurFond=gray!50,CouleurBarre=black,Graduation=false,Nom=D\'efaut,Pas=10,CouleurI=red,CouleurF=orange,CouleurS=yellow,CouleurM=green}

\newlength{\barrewidth}

\newcommand\Jauge[2][]{%
  \setlength{\barrewidth}{\linewidth-2\fboxsep}%
  \useKVdefault[ClesBarre]%
  \setKV[ClesBarre]{#1}%
  \xdef\NomComp{\useKV[ClesBarre]{Nom}}%
  \xdef\TexteOrigine{\useKV[ClesBarre]{Origine}}%
  \xdef\TexteReference{\useKV[ClesBarre]{Reference}}%
  \xdef\CouleurFond{\useKV[ClesBarre]{CouleurFond}}%
  \xdef\CouleurGrad{\useKV[ClesBarre]{CouleurGraduation}}%
  \xdef\CouleurBarre{\useKV[ClesBarre]{CouleurBarre}}%
  \xdef\CouleurI{\useKV[ClesBarre]{CouleurI}}%
  \xdef\CouleurF{\useKV[ClesBarre]{CouleurF}}%
  \xdef\CouleurS{\useKV[ClesBarre]{CouleurS}}%
  \xdef\CouleurM{\useKV[ClesBarre]{CouleurM}}%
  \ifboolKV[ClesBarre]{Niveau}{%
    \begin{tikzpicture}[rounded corners=2pt,very thin]
      \fill [gray!50] (0,0) rectangle (\barrewidth, 0.15);
      \xintifboolexpr{#2<\useKV[ClesBarre]{LimiteI}}{%
        \fill [\CouleurI] (0,0) rectangle (#2/100*\barrewidth, 0.15);
      }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteF}}{%
          \fill [\CouleurF] (0,0) rectangle (#2/100*\barrewidth, 0.15);
        }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteS}}{%
            \fill [\CouleurS] (0,0) rectangle (#2/100*\barrewidth, 0.15);
          }{\fill [\CouleurM] (0,0) rectangle (#2/100*\barrewidth, 0.15);}
        }%
      }%
      \node[anchor=south west] at (0,0.5em) {\NomComp};%
      \node[anchor=north] at (0,-0.25em) {\TexteOrigine};
      \node[anchor=north] at (\barrewidth,-0.25em) {\TexteReference};
      \ifboolKV[ClesBarre]{Graduation}{%
        \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}%
        {
          \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15);
        }
      }{}
      \foreach \s in {\useKV[ClesBarre]{LimiteI},\useKV[ClesBarre]{LimiteF},\useKV[ClesBarre]{LimiteS}}%
      {
        \draw[black] (\s/100*\barrewidth,-0.1)--(\s/100*\barrewidth,0.2);%
      }
    \end{tikzpicture}%
  }{%
    \begin{tikzpicture}[rounded corners=2pt,very thin]
      \fill [\CouleurFond] (0,0) rectangle (\barrewidth, 0.15);%
      \fill [\CouleurBarre] (0,0) rectangle (#2/100*\barrewidth, 0.15);%
      \node[anchor=south west] at (0,0.5em) {\NomComp};%
      \node[anchor=north] at (0,-0.25em) {\useKV[ClesBarre]{TexteOrigine}};%
      \node[anchor=north] at (\barrewidth,-0.25em) {\useKV[ClesBarre]{TexteReference}};%
      \ifboolKV[ClesBarre]{Graduation}{%
      \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}%
      {
        \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15);
      }}{}%
    \end{tikzpicture}%
  }
}

%%%
% Equations
%%%
\setKVdefault[ClesEquation]{Ecart=0.5,Fleches=false,FlecheDiv=false,Laurent=false,Decomposition=false,Terme=false,Composition=false,Symbole=false,Decimal=false,Entier=false,Lettre=x,Solution=false,LettreSol=true,Bloc=false,Simplification=false,CouleurTerme=black,CouleurCompo=black,CouleurSous=red,CouleurSymbole=orange,Verification=false,Nombre=0,Egalite=false,Produit=false,Facteurs=false,Carre=false,Exact=false,Pose=false,Equivalence=false}

\newcommand\rightcomment[4]{%
  \begin{tikzpicture}[remember picture,overlay]
    \draw[Cfleches,-stealth]
    ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$)
    .. controls +(0.2,-0.05) and +(0.2,0.1) ..
    node[right,align=left]{#4}
    ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$);
  \end{tikzpicture}%
}%

\newcommand\leftcomment[4]{%
  \begin{tikzpicture}[remember picture,overlay]
    \draw[Cfleches,-stealth]
    ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$)
    .. controls +(-0.2,-0.05) and +(-0.2,0.1) ..
    node[left,align=right]{#4}
    ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$);
  \end{tikzpicture}%
}%

\newcommand\Rightcomment[4]{%
  \begin{tikzpicture}[remember picture,overlay]
    \draw[Cfleches,-stealth]
    ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$)
    .. controls +(0.2,-0.05) and +(0.2,0.1) ..
    node[right,align=left]{#4}
    ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$);
  \end{tikzpicture}%
}%
\newcommand\Leftcomment[4]{%
  \begin{tikzpicture}[remember picture,overlay]
    \draw[Cfleches,-stealth]
    ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$)
    .. controls +(-0.2,-0.05) and +(-0.2,0.1) ..
    node[left,align=right]{#4}
    ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$);
  \end{tikzpicture}%
}%

% Pour "oublier" les tikzmarks. En cas de plusieurs utilisations de la macro \ResolEquation
\newcounter{Nbequa}
\setcounter{Nbequa}{0}

%CT
\newdimen\fdashwidth    \fdashwidth  = 0.8pt % \'epaisseur traits
\newdimen\fdashlength   \fdashlength = 0.5mm % longueur des pointill\'es et s\'eparation entre pointill\'es
\newdimen\fdashsep      \fdashsep    = 3pt % s\'eparateur entre contenu et traits

\def\fdash#1{%
  \leavevmode\begingroup%
  \setbox0\hbox{#1}%
  \def\hdash{\vrule height\fdashwidth width\fdashlength\relax}%
  \def\vdash{\hrule height\fdashlength width\fdashwidth\relax}%
  \def\dashblank{\kern\fdashlength}%
  \ifdim\fdashsep>0pt
  \setbox0\hbox{\vrule width0pt height\dimexpr\ht0+\fdashsep depth\dimexpr\dp0+\fdashsep\kern\fdashsep\unhbox0 \kern\fdashsep}%
  \fi
  \edef\hdash{\hbox to\the\wd0{\noexpand\color{Csymbole}\hdash\kern.5\fdashlength\xleaders\hbox{\hdash\dashblank}\hfil\hdash}}%
  \edef\vdash{\vbox to\the\dimexpr\ht0+\dp0+2\fdashwidth{\noexpand\color{Csymbole}\vdash\kern.5\fdashlength\xleaders\vbox{\vdash\dashblank}\vfil\vdash}}%
  \hbox{%
    \vdash
    \vtop{\vbox{\offinterlineskip\hdash\hbox{\unhbox0 }\hdash}}%
    \vdash}%
  \endgroup
}
% fin CT
\def\Fdash#1{\raisebox{-2\fdashsep+\fdashwidth}{\fdash{#1}}}

%Une simplification de a/b est possible ou non ?
\newboolean{Simplification}

\newcommand\SSimpliTest[2]{%
  % Test d'une simplification possible ou pas de #1/#2
  \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno%
  \numerateur=\number#1
  \denominateur=\number#2
  \ifnum\number#1<0
  \valabsnum=\numexpr0-\number#1
  \else
  \valabsnum=\number#1
  \fi
  \ifnum\number#2<0
  \valabsdeno=\numexpr0-\number#2
  \else
  \valabsdeno=\number#2
  \fi
  \ifnum\the\valabsnum=0
    \setboolean{Simplification}{true}
  \else
    \PGCD{\the\valabsnum}{\the\valabsdeno}
    \ifnum\pgcd>1
      \setboolean{Simplification}{true}
    \else
      \ifnum\the\numerateur<0
        \ifnum\the\denominateur<0
          \setboolean{Simplification}{true}
        \else
          \ifnum\valabsdeno=1\relax
            \setboolean{Simplification}{true}
          \else
          \setboolean{Simplification}{false}
          \fi
        \fi
      \else
        \ifnum\valabsdeno=1\relax
          \setboolean{Simplification}{true}
        \else
          \setboolean{Simplification}{false}
        \fi
      \fi
    \fi
  \fi
}

\definecolor{Cfleches}{RGB}{100,100,100}%

\newcommand\AffichageEqua[4]{%
  \def\LETTRE{\useKV[ClesEquation]{Lettre}}%
  \ensuremath{%
    % partie du x
    \xintifboolexpr{#1==0}{}{\xintifboolexpr{#1==1}{}{\xintifboolexpr{#1==-1}{-}{\num{#1}}}\LETTRE}%
    % partie du nombre
    \xintifboolexpr{#2==0}{\xintifboolexpr{#1==0}{0}{}}{\xintifboolexpr{#2>0}{\xintifboolexpr{#1==0}{}{+}\num{#2}}{\num{#2}}}%
    % egal
    =
    % partie du x
    \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3==1}{}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}\LETTRE}%
    % partie du nombre
    \xintifboolexpr{#4==0}{%
      \xintifboolexpr{#3==0}{0}{}
    }{%
      \xintifboolexpr{#4>0}{\xintifboolexpr{#3==0}{}{+}\num{#4}}{\num{#4}}%
    }
  }%
}%

\newcommand\EcrireSolutionEquation[4]{%
  L'équation \AffichageEqua{#1}{#2}{#3}{#4} a une unique solution : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$.
}%

\input{PfCEquationSoustraction2}%
\input{PfCEquationTerme1}%
\input{PfCEquationComposition2}%
\input{PfCEquationPose1}%
\input{PfCEquationSymbole1}%
\input{PfCEquationLaurent1}

\newcommand\ResolEquation[5][]{%
  \useKVdefault[ClesEquation]%
  \setKV[ClesEquation]{#1}%
  \colorlet{Cterme}{\useKV[ClesEquation]{CouleurTerme}}%
  \colorlet{Ccompo}{\useKV[ClesEquation]{CouleurCompo}}%
  \colorlet{Csymbole}{\useKV[ClesEquation]{CouleurSymbole}}%
  \colorlet{Cdecomp}{\useKV[ClesEquation]{CouleurSous}}%
  \ifboolKV[ClesEquation]{Carre}{%
    \ResolEquationCarre[#1]{#2}%
  }{%
    \ifboolKV[ClesEquation]{Produit}{%
      \ResolEquationProduit[#1]{#2}{#3}{#4}{#5}%
    }{%
      \ifboolKV[ClesEquation]{Verification}{%
        \Verification[#1]{#2}{#3}{#4}{#5}%
      }{%
        \ifboolKV[ClesEquation]{Symbole}{%
          \ResolEquationSymbole[#1]{#2}{#3}{#4}{#5}%
        }{%
          \ifboolKV[ClesEquation]{Laurent}{%
            \ResolEquationLaurent[#1]{#2}{#3}{#4}{#5}%
          }{%
            \ifboolKV[ClesEquation]{Terme}{%
              \ResolEquationTerme[#1]{#2}{#3}{#4}{#5}%
            }{\ifboolKV[ClesEquation]{Composition}{%
                \ResolEquationComposition[#1]{#2}{#3}{#4}{#5}%
              }{\ifboolKV[ClesEquation]{Pose}{%
                  \ResolEquationL[#1]{#2}{#3}{#4}{#5}%
                }{%
                  \ResolEquationSoustraction[#1]{#2}{#3}{#4}{#5}%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\ResolEquationCarre[2][]{%
  \setKV[ClesEquation]{#1}%
  \xintifboolexpr{#2<0}{%
    Comme $\num{#2}$ est n\'egatif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ n'a aucune solution.%
  }{\xintifboolexpr{#2==0}{%
      L'\'equation $\useKV[ClesEquation]{Lettre}^2=0$ a une unique solution : $\useKV[ClesEquation]{Lettre}=0$.%
    }{%
      Comme \num{#2} est positif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ a deux solutions :%
      \begin{align*}
        \useKV[ClesEquation]{Lettre}&=\sqrt{\num{#2}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\sqrt{\num{#2}}%\\
        \ifboolKV[ClesEquation]{Exact}{\\%
        \useKV[ClesEquation]{Lettre}&=\num{\fpeval{sqrt(#2)}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\num{\fpeval{sqrt(#2)}}}{}%
      \end{align*}
    }%
  }%
}%

\newcommand\ResolEquationProduit[5][]{%
  \setKV[ClesEquation]{#1}%
  \ifboolKV[ClesEquation]{Equivalence}{}{C'est un produit nul donc \ifboolKV[ClesEquation]{Facteurs}{l'un au
      moins des facteurs est nul}{} :}%
  \ifboolKV[ClesEquation]{Equivalence}{%
          \[\Distri{#2}{#3}{#4}{#5}=0\]
    \begin{align*}%
      &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&\quad&\makebox[0pt]{ou}\quad&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\
      &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\
      \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1
      &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}}
      % accolade%\\
      %%%% 
      \ifboolKV[ClesEquation]{Entier}{%
      \xdef\TSimp{}%
      \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}}
      \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{}
      \xintifboolexpr{\TSimp==0}{}{\\
      \ifboolKV[ClesEquation]{Simplification}{%
      &\makebox[0pt]{$\Longleftrightarrow$}&\SSimpliTest{\Coeffb}{\Coeffa}\xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\
      }
      }{}
      &&&\ifboolKV[ClesEquation]{Simplification}{%
      \SSimpliTest{\Coeffd}{\Coeffc}%
          \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\
      }
      }{}
      }
      }{}
      }
    \end{align*}
  }{%
    \begin{align*}
    \xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&&\text{ou}&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\
    \xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\
      \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1
      \xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}}
       %accolade%\\
      %%%%   
      \ifboolKV[ClesEquation]{Entier}{%
      \xdef\TSimp{}
      \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}}
      \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{}
      \xintifboolexpr{\TSimp==0}{}{\\
      \ifboolKV[ClesEquation]{Simplification}{%
      \SSimpliTest{\Coeffb}{\Coeffa}
      \xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\
      }
      }{}
      &&&\ifboolKV[ClesEquation]{Simplification}{%
      \SSimpliTest{\Coeffd}{\Coeffc}%
          \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\
      }
      }{}
      }
      }{}
      }
    \end{align*}
  }%
  \ifboolKV[ClesEquation]{Solution}{L'\'equation $\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}})}\xintifboolexpr{#5==0}{\times\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}})}=0$ a deux solutions : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$ et \opdiv*{\Coeffd}{\Coeffc}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffd}{\Coeffc}}{\frac{\num{\Coeffd}}{\num{\Coeffc}}}\fi$.
  }{}%
}

\newcommand\Verification[5][]{%
  \setKV[ClesEquation]{#1}%
  \xdef\ValeurTest{\useKV[ClesEquation]{Nombre}}%
  Testons la valeur $\useKV[ClesEquation]{Lettre}=\num{\ValeurTest}$ :%
  \begin{align*}
    \xintifboolexpr{#2==0}{\num{#3}}{\num{#2}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{\num{#5}}{\num{#4}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\
    \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\
    \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}}
  \end{align*}
  \xdef\Testa{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}\xdef\Testb{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}%
  \ifboolKV[ClesEquation]{Egalite}{%
    Comme \xintifboolexpr{\Testa==\Testb}{$\num{\Testa}=\num{\Testb}$}{$\num{\Testa}\not=\num{\Testb}$}, alors l'\'egalit\'e $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$ \xintifboolexpr{\Testa==\Testb}{ est v\'erifi\'ee }{ n'est pas v\'erifi\'ee } pour $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$.%
  }{\xintifboolexpr{\Testa==\Testb}{Comme $\num{\Testa}=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ est bien }{Comme $\num{\Testa}\not=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ n'est pas }une solution de l'\'equation $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$.}%
}%

%%%
% Proportionnalit\'e
%%%
\setKVdefault[ClesPropor]{GrandeurA=Grandeur A,GrandeurB=Grandeur B,Largeur=1cm,Math=false,Stretch=1,ColorFill=white,CouleurTab=gray!15,Vertical=false}%

\def\Updatetoksmath#1/#2\nil{\addtotok\tabtoksa{&#1}\addtotok\tabtoksb{&#2}}%
\def\updatetokspropor#1/#2\nil{\addtotok\tabtoksa{&\num{#1}}\addtotok\tabtoksb{&\num{#2}}}
\def\Buildtabpropor{%
  \setcounter{NbProporG}{0}%
  \setcounter{NbProporD}{0}%
  \renewcommand{\arraystretch}{\useKV[ClesPropor]{Stretch}}%
  \ifboolKV[ClesPropor]{Vertical}{%
    \begin{tabular}{c|*{2}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}c}%
      \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPH}&\multicolumn{1}{c}{\TikzPH}&\\
      \hhline{~--~}%
      &\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}&\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}&\\
      \hhline{~--~}%
      \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeValeurlen}}}\do{%
      \stepcounter{NbProporG}\TikzPG&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,1]}{\num{\ListeValeur[##1,1]}}&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,2]}{\num{\ListeValeur[##1,2]}}&\stepcounter{NbProporD}\TikzPD\\
      \hhline{~--~}%
      }%
     \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPB}&\multicolumn{1}{c}{\TikzPB}&\\
    \end{tabular}%
  }{%
    \tabtoksa{}\tabtoksb{}%
    \tabtoksa{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}}\tabtoksb{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}}%
    \ifboolKV[ClesPropor]{Math}{%
      \foreachitem\compteur\in\ListeValeur{\expandafter\Updatetoksmath\compteur\nil}%
    }{\foreachitem\compteur\in\ListeValeur{\expandafter\updatetokspropor\compteur\nil}%
    }%
    \xdef\LongListe{\ListeValeurlen}%
    \begin{tabular}{rc|*{\number\numexpr\ListeValeurlen}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}l}%
      \multicolumn{1}{c}{}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPH}}&\multicolumn{1}{c}{}\\%
      \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}%
      \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksa&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\%
      \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}%
      \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksb&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\%
      \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}%
      \multicolumn{1}{c}{\stepcounter{NbProporG}\TikzPG}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPB}}&\multicolumn{1}{c}{}\\%
    \end{tabular}%
  }%
  \renewcommand{\arraystretch}{1}%
}%

\newcounter{NbPropor}%

\newcommand\TikzPH{%
  \tikz[remember picture,overlay]{%
    \coordinate[name=ProporH-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}%
  \stepcounter{NbPropor}%
}%

\newcommand\TikzPB{%
  \tikz[remember picture, overlay]{%
    \coordinate[name=ProporB-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}%
  \stepcounter{NbPropor}%
}%

\newcommand\TikzPG{%
  \tikz[remember picture,overlay]{%
    \coordinate[name=ProporG-\theNbProporG,xshift=\tabcolsep+\arrayrulewidth,yshift=\getstrut\dp];}%
}%
\newcommand\TikzPD{%
  \tikz[remember picture,overlay]{%
    \coordinate[name=ProporD-\theNbProporD,xshift=-\tabcolsep-\arrayrulewidth,yshift=\getstrut\dp];}%
}%

\newcommand\TikzPHD{%
  \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}%
  \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}%
  \xintifboolexpr{\wd1>\wd2}{%
    \tikz[remember picture,overlay]{%
      \coordinate[name=ProporHD,xshift=-0.5\wd1,yshift=-\getstrut\dp*\arraystretch];}%
  }{%
    \tikz[remember picture,overlay]{%
      \coordinate[name=ProporHD,xshift=-0.5\wd2,yshift=-\getstrut\dp*\arraystretch];}%
  }
}%

\newcommand\TikzPBD{%
  \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}%
  \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}%
  \xintifboolexpr{\wd1>\wd2}{%
    \tikz[remember picture, overlay]{%
      \coordinate[name=ProporBD,xshift=-0.5*\the\wd1,yshift=\getstrut\ht*\arraystretch];}%
  }{%
    \tikz[remember picture, overlay]{%
      \coordinate[name=ProporBD,xshift=-0.5*\the\wd2,yshift=\getstrut\ht*\arraystretch];}%
  }
  \stepcounter{NbPropor}%
}%
%
\newcommand\FlechesPH[3]{%
  \begin{tikzpicture}[remember picture,overlay]%
    \ifnum#1<#2\relax%
    \draw[-stealth,out=50,in=130] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);%
  \else%
    \draw[-stealth,out=130,in=50] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);%
    \fi%
  \end{tikzpicture}%
}%
%
\newcommand\FlechesPB[3]{%
  \ifnum\number#1<\number#2\relax%
  \begin{tikzpicture}[remember picture,overlay]%
    \draw[-stealth,out=-50,in=-130] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);%
  \end{tikzpicture}%
  \else%
  \begin{tikzpicture}[remember picture,overlay]%
    \draw[-stealth,out=-130,in=-50] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);%
  \end{tikzpicture}%
  \fi%
}%
%
\newcommand\FlechesPG[3]{%
  \begin{tikzpicture}[remember picture,overlay]%
    \ifnum#1<#2\relax%
    \draw[-stealth,out=-150,in=150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,left]{#3}(ProporG-#2);%
    \else%
    \draw[-stealth,out=150,in=-150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, left]{#3}(ProporG-#2);%
    \fi%
  \end{tikzpicture}%
}%

\newcommand\FlechesPD[3]{%
  \begin{tikzpicture}[remember picture,overlay]%
    \ifnum#1<#2\relax%
    \draw[-stealth,out=-30,in=30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);%
    \else%
    \draw[-stealth,out=30,in=-30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);%
    \fi%
  \end{tikzpicture}%
}%

\newcommand\FlecheLineaireG[4]{%
  \begin{tikzpicture}[remember picture,overlay,node distance=1em]%
    \node[inner sep=0pt] (MilieuH) at ($(ProporG-#1)!0.5!(ProporG-#2)$) {};%
    \node[circle,draw,inner sep=0pt] [left of=MilieuH] (aux) {#4} ;%
    \coordinate[left of=aux] (aux1);%
    \draw[-stealth] (ProporG-#1) -| (aux);%
    \draw[-stealth] (ProporG-#2) -| (aux);%
    \draw[-stealth] (aux) -- (aux1) |- (ProporG-#3);%
  \end{tikzpicture}%
}%

\newcommand\FlecheLineaireD[4]{%
  \begin{tikzpicture}[remember picture,overlay,node distance=1em]%
    \node[inner sep=0pt] (MilieuH) at ($(ProporD-#1)!0.5!(ProporD-#2)$) {};%
    \node[circle,draw,inner sep=0pt] [right of=MilieuH] (aux) {#4} ;%
    \coordinate[right of=aux] (aux1);%
    \draw[-stealth] (ProporD-#1) -| (aux);%
    \draw[-stealth] (ProporD-#2) -| (aux);%
    \draw[-stealth] (aux) -- (aux1) |- (ProporD-#3);%
  \end{tikzpicture}%
}%

\newcounter{NbProporG}%
\newcounter{NbProporD}%

\newcommand\Propor[2][]{%
  \useKVdefault[ClesPropor]%
  \setKV[ClesPropor]{#1}%
  \xdef\colorfill{\useKV[ClesPropor]{ColorFill}}%
  \xdef\EcartLargeur{\useKV[ClesPropor]{Largeur}}%
  %  % on lit la liste \'ecrite sous la forme valeur/effectif
  \setsepchar[*]{,*/}\ignoreemptyitems%
  \readlist*\ListeValeur{#2}%
  \Buildtabpropor%
}%

\newcommand\FlecheCoef[2][\EcartLargeur]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};%
    \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};%
    \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);%
    \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);%
    \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);%
  \end{tikzpicture}%
}%

\newcommand\FlecheCoefDebut[2][\tabcolsep+\arrayrulewidth]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \node[] (Noeud1) at ($(ProporHD)!0.1!(ProporBD)$) {};%
    \node[] (Noeud2) at ($(ProporHD)!0.9!(ProporBD)$) {};%
    \coordinate[left of=Noeud1,node distance=#1] (noeud1);%
    \coordinate[left of=Noeud2,node distance=#1] (noeud2);%
    \draw[-stealth,out=160,in=-160] (noeud2) to node[midway,left,inner sep=1pt]{#2}(noeud1);%
  \end{tikzpicture}%
}%

\newcommand\FlecheCoefInv[2][1cm]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};%
    \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};%
    \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);%
    \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);%
    \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);%
  \end{tikzpicture}%
}%

\newcommand\FlecheLineaireH[4]{%
  \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]%
    \node[inner sep=0pt] (MilieuH) at ($(ProporH-#1)!0.5!(ProporH-#2)$) {};%
    \node[circle,draw,inner sep=0pt] [above of=MilieuH] (aux) {#4} ;%
    \coordinate[above of=aux] (aux1);%
    \draw[-stealth] (ProporH-#1) |- (aux);%
    \draw[-stealth] (ProporH-#2) |- (aux);%
    \draw[-stealth] (aux) -- (aux1) -| (ProporH-#3);%
  \end{tikzpicture}%
}%

\newcommand\FlecheLineaireB[4]{%
  \begin{tikzpicture}[remember picture,overlay,node distance=3mm]%
    \node[inner sep=0pt] (MilieuB) at ($(ProporB-#1)!0.5!(ProporB-#2)$) {};%
    \node[circle,draw,inner sep=0pt] [below of=MilieuB] (aux) {#4};%
    \coordinate[below of=aux,node distance=3mm] (aux1);%
    \draw[-stealth] (ProporB-#1) |- (aux);%
    \draw[-stealth] (ProporB-#2) |- (aux);%
    \draw[-stealth] (aux) -- (aux1) -| (ProporB-#3);%
  \end{tikzpicture}%
}%

%%%
% Application : pourcentage
%%%
\setKVdefault[ClesPourcentage]{Appliquer,Calculer=false,Augmenter=false,Reduire=false,Fractionnaire=false,Decimal,Formule=false,Unite=g,Concret=false,GrandeurA=Grandeur A,GrandeurB=Total,Largeur=1cm,MotReduction=diminution,AideTableau=false,ColorFill=white,CouleurTab=gray!15}
  
\newcommand\Pourcentage[3][]{%
  \useKVdefault[ClesPourcentage]%
  \setKV[ClesPourcentage]{#1}%
  \ifboolKV[ClesPourcentage]{Reduire}{%
    \ifboolKV[ClesPourcentage]{Formule}{%
        R\'eduire une quantit\'e de \num{#2}~\%, cela revient \`a multiplier cette quantit\'e par $1-\dfrac{\num{#2}}{100}$. Par cons\'equent, si on r\'eduit \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne :
        \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1-\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1-\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1-#2/100)}}=\num{\fpeval{#3*(1-#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\]
      }{%
        Calculons ce que repr\'esente la \useKV[ClesPourcentage]{MotReduction} de \num{#2}~\%.
        \ifboolKV[ClesPourcentage]{AideTableau}{%
          \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}%
          \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}%
          \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}%
          \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}%
          \begin{center}
            \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100}
          \end{center}
          \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}%
          On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}. Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.%
        }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul :
        \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]%
       On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.}
      }
  }{%
    \ifboolKV[ClesPourcentage]{Augmenter}{%
      \ifboolKV[ClesPourcentage]{Formule}{%
        Augmenter de \num{#2}~\% une quantit\'e, cela revient \`a multiplier cette quantit\'e par $1+\dfrac{\num{#2}}{100}$. Par cons\'equent, si on augmente \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne :
        \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1+\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1+\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1+#2/100)}}=\num{\fpeval{#3*(1+#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\]
      }{%
        Calculons ce que repr\'esente l'augmentation de \num{#2}~\%. %
        \ifboolKV[ClesPourcentage]{AideTableau}{%
          \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}%
          \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}%
          \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}%
          \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}%
          \begin{center}%
            \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100}%
          \end{center}%
          \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}%
          On obtient une augmentation de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.%
        }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul :
          \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]%
          On obtient une augmentation de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.}
      }
    }{%
      \ifboolKV[ClesPourcentage]{Calculer}{%
        \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}%
        \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}%
        \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}%
        \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}%
        \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{\num{#2}/\num{#3},/100}%
        \xdef\colorfill{\useKV[ClesPourcentage]{ColorFill}}%
        \FlechesPB{2}{1}{\scriptsize$\times\num{\fpeval{#3/100}}$}%
        \FlechesPH{1}{2}{\scriptsize$\div\num{\fpeval{#3/100}}$}%
        \xdef\ResultatPourcentage{\fpeval{#2*100/#3}}%
      }{%
        Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul :%
        \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]%
      }%
    }%
  }%
}%

%%%
% Lien : ratio
%%%
\setKVdefault[ClesRatio]{FigureCours=false,Figure=false,Longueur=5cm,TexteTotal=quantit\'e,TextePart=part,Tableau=false,GrandeurA=Grandeur A,GrandeurB=Part(s),Largeur=1cm,Stretch=1,Nom=false,CouleurUn=gris,CouleurDeux=0.5gris+0.5blanc,CouleurTrois=white,CouleurTab=gray!15}

\newcommand\MPTest[9][]{%
  % #2 : Longueur de la barre unit\'e
  % #3 : premier nombre
  % #4 : deuxi\`eme nombre
  % #5 : troisi\`eme nombre
  % #6 : ne sert à rien. Laissé en attente.
  % #7 \`a #9: Couleurs de remplissage
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio
    pair A,B,C,D;
    A=u*(1,1);
    B-A=(long,0);
    C-B=u*(0,0.5);
    D-C=A-B;
    n:=0;%n pour savoir si le ratio est a:b ou a:b:c
    numeric N[];%Pour sauvegarder les \'el\'ements du ratio
    for p_=t:
    n:=n+1;
    N[n]=p_;
    endfor;
    % on fait la somme totale "du ratio"
    somme=0;
    somme:=somme for k=1 upto n:+N[k] endfor;
    %Figure(0,0,long+2u,3u);
    remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D)
    withcolor #7;
    remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C)
    withcolor #8;
    if n>2:
    remplis
    polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C])
    withcolor #8;
    remplis
    polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C)
    withcolor #9;
    fi;
    drawoptions(withpen pencircle scaled1.5bp);
    draw polygone(A,B,C,D);
    for k=1 upto somme-1:
    draw segment((k/somme)[A,B],(k/somme)[D,C]);
    endfor;
    drawoptions();
    % accolades
    labeloffset:=labeloffset/2;
    label.top(TEX("\footnotesize$\overbrace{\hbox
      to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C));
    labeloffset:=labeloffset*2;
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B]));
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    enddef;
    RatioTrois(#2)(#3,#4,#5);
    %etiquettage
    labeloffset:=labeloffset*3;
    label.top(btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C));
    if #3>1:
    label.bot(btex #3~\useKV[ClesRatio]{TextePart}s
    etex,iso(A,(N[1]/somme)[A,B]));
    else:
    label.bot(btex #3~\useKV[ClesRatio]{TextePart} etex,iso(A,(N[1]/somme)[A,B]));
    fi;
    if #4>1:
    label.bot(btex #4~\useKV[ClesRatio]{TextePart}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    else:
    label.bot(btex #4~\useKV[ClesRatio]{TextePart}
    etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    fi;
    if n>2:
    if #5>1:
    label.bot(btex #5~\useKV[ClesRatio]{TextePart}s etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    else:
    label.bot(btex #5~\useKV[ClesRatio]{TextePart} etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    fi;
  \end{mplibcode}
  \else
  \mpxcommands{%
    \usepackage{ProfCollege}
    \setKVdefault[ClesRatio]{TexteTotal=quantit\'e,TextePart=part}
    \setKV[ClesRatio]{#1}
  }
  \begin{mpost}
    vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio
    pair A,B,C,D;
    A=u*(1,1);
    B-A=(long,0);
    C-B=u*(0,0.5);
    D-C=A-B;
    n:=0;%n pour savoir si le ratio est a:b ou a:b:c
    numeric N[];%Pour sauvegarder les \'el\'ements du ratio
    for p_=t:
    n:=n+1;
    N[n]=p_;
    endfor;
    % on fait la somme totale "du ratio"
    somme=0;
    somme:=somme for k=1 upto n:+N[k] endfor;
    Figure(0,0,long+2u,3u);
    remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D)
    withcolor #7;
    remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C)
    withcolor #8;
    if n>2:
    remplis
    polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C])
    withcolor #8;
    remplis
    polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C)
    withcolor #9;
    fi;
    drawoptions(withpen pencircle scaled1.5bp);
    draw polygone(A,B,C,D);
    for k=1 upto somme-1:
    draw segment((k/somme)[A,B],(k/somme)[D,C]);
    endfor;
    drawoptions();
    %accolades
    label.top(LATEX("\noexpand\footnotesize$\noexpand\overbrace{\noexpand\hbox
      to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C));
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B]));
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    enddef;
    RatioTrois(#2)(#3,#4,#5);
    %etiquettage
    labeloffset:=labeloffset*3;
    label.top(\btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C));
    if #3>1:
    label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(A,(N[1]/somme)[A,B]));
    else:
    label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(A,(N[1]/somme)[A,B]));
    fi;
    if #4>1:
    label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    else:
    label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    fi;
    if n>2:
    if #5>1:
    label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    else:
    label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    fi;
  \end{mpost}
  \fi
}%

\newcommand\MPTestCours[9][]{%
  % #2 : Longueur de la barre unit\'e
  % #3 : premier nombre
  % #4 : deuxi\`eme nombre
  % #5 : troisi\`eme nombre
  % #6 : Valeurs du ratio
  % #7 \`a #9: Couleurs de remplissage
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio
    pair A,B,C,D;
    A=u*(1,1);
    B-A=(long,0);
    C-B=u*(0,0.5);
    D-C=A-B;
    n:=0;%n pour savoir si le ratio est a:b ou a:b:c
    numeric N[];%Pour sauvegarder les \'el\'ements du ratio
    for p_=t:
    n:=n+1;
    N[n]=p_;
    endfor;
    % on fait la somme totale "du ratio"
    somme=0;
    somme:=somme for k=1 upto n:+N[k] endfor;
    %%Figure(0,0,long+2u,3u);
    remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D)
    withcolor #7;
    remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C)
    withcolor #8;
    if n>2:
    remplis
    polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C])
    withcolor #8;
    remplis
    polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C)
    withcolor #9;
    fi;
    drawoptions(withpen pencircle scaled1.5bp);
    draw polygone(A,B,C,D);
    for k=1 upto somme-1:
    draw segment((k/somme)[A,B],(k/somme)[D,C]);
    endfor;
    drawoptions();
    % accolades
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B]));
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(TEX("\footnotesize$\underbrace{\hbox
      to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    enddef;
    RatioTrois(#2)(#3,#4,#5);
    %etiquettage
    labeloffset:=labeloffset*3;
    label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B]));
    label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
  \end{mplibcode}
  \else
  \begin{mpost}
    vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio
    pair A,B,C,D;
    A=u*(1,1);
    B-A=(long,0);
    C-B=u*(0,0.5);
    D-C=A-B;
    n:=0;%n pour savoir si le ratio est a:b ou a:b:c
    numeric N[];%Pour sauvegarder les \'el\'ements du ratio
    for p_=t:
    n:=n+1;
    N[n]=p_;
    endfor;
    % on fait la somme totale "du ratio"
    somme=0;
    somme:=somme for k=1 upto n:+N[k] endfor;
    %Figure(0,0,long+2u,3u);
    remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D)
    withcolor #7;
    remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C)
    withcolor #8;
    if n>2:
    remplis
    polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C])
    withcolor #8;
    remplis
    polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C)
    withcolor #9;
    fi;
    drawoptions(withpen pencircle scaled1.5bp);
    draw polygone(A,B,C,D);
    for k=1 upto somme-1:
    draw segment((k/somme)[A,B],(k/somme)[D,C]);
    endfor;
    drawoptions();
    % accolades
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B]));
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox
      to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
    enddef;
    RatioTrois(#2)(#3,#4,#5);
    %etiquettage
    labeloffset:=labeloffset*3;
    label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B]));
    label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B]));
    if n>2:
    label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B]));
    fi;
  \end{mpost}
  \fi
}

\newtoks\toklisteratio
\def\UpdateRatio#1\nil{\addtotok\toklisteratio{#1,}}

\def\updateratiotoks#1/#2/#3\nil{\addtotok\tabtoksa{&\ifx\bla#2\bla\else\num{#2}\fi}\addtotok\tabtoksb{&\ifx\bla#3\bla\else\num{#3}\fi}\addtotok\tabtoksc{&#1}}

\def\buildtabratio{%
  \tabtoksa{}\tabtoksb{}\tabtoksc{}%
  \tabtoksa{\useKV[ClesRatio]{GrandeurA}}\tabtoksb{\useKV[ClesRatio]{GrandeurB}}
  \foreachitem\compteur\in\ListeRatio{\expandafter\updateratiotoks\compteur\nil}%
  \xdef\LongListe{\ListeRatiolen}%
  \renewcommand{\arraystretch}{\useKV[ClesRatio]{Stretch}}%
  \begin{tabular}{|>{\columncolor{\useKV[ClesRatio]{CouleurTab}}}c|*{\number\numexpr\ListeRatiolen}{>{\centering\arraybackslash}p{\useKV[ClesRatio]{Largeur}}|}l}
    \ifboolKV[ClesRatio]{Nom}{%
    \hhline{~*{\number\numexpr\ListeRatiolen}{-}}
    \multicolumn{1}{c|}{}\the\tabtoksc\\
    }{}
    \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}%
    \the\tabtoksa&\setcounter{NbPropor}{1}\TikzRH\\%
    \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}%
    \the\tabtoksb&\setcounter{NbPropor}{1}\TikzRB\\%
    \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}%
  \end{tabular}%
}%

\newcommand\TikzRH{%
   \tikz[remember picture,overlay]{%
   \coordinate[name=ProporH-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}%
   \stepcounter{NbPropor}%
 }%

 \newcommand\TikzRB{%
   \tikz[remember picture, overlay]{%
     \coordinate[name=ProporB-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}%
   \stepcounter{NbPropor}%
 }%
 
\newcommand\FlecheRatio[2][\EcartLargeur]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};%
    \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};%
    \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);%
    \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);%
    \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);%
\end{tikzpicture}%
}%

\newcommand\FlecheInvRatio[2][\EcartLargeur]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};%
    \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};%
    \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);%
    \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);%
    \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);%
\end{tikzpicture}%
}%

\newcommand\Ratio[2][]{%
  \useKVdefault[ClesRatio]%
  \setKV[ClesRatio]{#1}%
  \xdef\EcartLargeur{\useKV[ClesRatio]{Largeur}}%
  \ifboolKV[ClesRatio]{FigureCours}{%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\ListeRatio{#2}%
    \toklisteratio{}%
    \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}%
    \itemtomacro\ListeRatio[1]\NbUn%
    \itemtomacro\ListeRatio[2]\NbDeux%
    \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}%
    \MPTestCours[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}%
  }{%
    \ifboolKV[ClesRatio]{Figure}{%
      \setsepchar{,}\ignoreemptyitems%
      \readlist*\ListeRatio{#2}%
      \toklisteratio{}%
      \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}%
      \itemtomacro\ListeRatio[1]\NbUn%
      \itemtomacro\ListeRatio[2]\NbDeux%
      \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}%
      \MPTest[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}%
    }{%
      \ifboolKV[ClesRatio]{Tableau}{%
        \setsepchar[*]{,*/}\ignoreemptyitems%
        \readlist*\ListeRatio{#2}%
        \buildtabratio%
      }{}%
    }%
  }%
}%
%%% 
% Cartes Mentales
%%%
\setKVdefault[ClesMentales]{Nom={Bulle}, Largeur=5cm, Ancre={0,0},Pointilles=false,CTrace=black,CFond=white,Epaisseur=1pt,Rayon=1}%
\newenvironment{Mind}{\begin{tikzpicture}}{\end{tikzpicture}}%

\newlength{\RoundedBoxWidth}%

\NewEnviron{Bulle}[1][]{%
  \setKV[ClesMentales]{#1}%
  \setlength{\RoundedBoxWidth}{\useKV[ClesMentales]{Largeur}}%
  \xdef\Pointilles{\ifboolKV[ClesMentales]{Pointilles}{dashed}{}}%
  \xdef\CouleurTrace{\useKV[ClesMentales]{CTrace}}%
  \xdef\CouleurFond{\useKV[ClesMentales]{CFond}}%
  \xdef\EpaisseurLigne{\useKV[ClesMentales]{Epaisseur}}%
  \xdef\RayonCoin{\useKV[ClesMentales]{Rayon}}%
  \node(\useKV[ClesMentales]{Nom}) [align=justify,draw=\CouleurTrace,line width=\EpaisseurLigne,\Pointilles,fill=\CouleurFond,rounded corners=\RayonCoin,text width=\RoundedBoxWidth] at (\useKV[ClesMentales]{Ancre}) {\begin{minipage}{\RoundedBoxWidth}\BODY\end{minipage}};%
  \multido{\i=1+1}{9}{%
    \xdef\x{\fpeval{\i/10}}
    \coordinate (\useKV[ClesMentales]{Nom}-H-\i) at ($(\useKV[ClesMentales]{Nom}.north west)!\x!(\useKV[ClesMentales]{Nom}.north east)$);
    \coordinate (\useKV[ClesMentales]{Nom}-D-\i) at ($(\useKV[ClesMentales]{Nom}.north east)!\x!(\useKV[ClesMentales]{Nom}.south east)$);
    \coordinate (\useKV[ClesMentales]{Nom}-B-\i) at ($(\useKV[ClesMentales]{Nom}.south east)!\x!(\useKV[ClesMentales]{Nom}.south west)$);
    \coordinate (\useKV[ClesMentales]{Nom}-G-\i) at ($(\useKV[ClesMentales]{Nom}.south west)!\x!(\useKV[ClesMentales]{Nom}.north west)$);
  }
}

%%%
% Ppt\'es des droites (6eme)
%%%
\setKVdefault[ClesDroites]{Brouillon=false,CitePropriete=false,Num=1,Figure=false,Remediation=false}

\newcommand\Redaction[4][]{%
  \ifboolKV[ClesDroites]{Remediation}{%
    \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{%
      \ifboolKV[ClesDroites]{CitePropriete}{%
        Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.%
        
        Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.%
        
        Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.%
      }{%
        Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux parall\`eles \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.%
      }
    }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{%
        \ifboolKV[ClesDroites]{CitePropriete}{%
          Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.%
          
          Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.%
          
          Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.
        }{%
          Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.
        }
      }{%
        \ifboolKV[ClesDroites]{CitePropriete}{%
          Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.%
          
          Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.%
          
          Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.
        }{%
          Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles, alors la droite $(\hbox to2em{\dotfill})$ qui est perpendiculaire \`a $(\hbox to2em{\dotfill})$ est \'egalement perpendiculaire \`a la droite $(\hbox to2em{\dotfill})$.
        }
      }
    }%
  }{%
    \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{%
      \ifboolKV[ClesDroites]{CitePropriete}{%
        Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont parall\`eles.%
        
        Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.%
        
        Donc les droites $(#2)$ et $(#3)$ sont parall\`eles.
      }{%
        Comme les droites $(#2)$ et $(#3)$ sont toutes les deux parall\`eles \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles.
      }
    }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{%
        \ifboolKV[ClesDroites]{CitePropriete}{%
          Les droites $(#2)$ et $(#4)$ sont perpendiculaires. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.%
          
          Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.%
          
          Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires.
        }{%
          Comme les droites $(#2)$ et $(#3)$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles.
        }
      }{%
        \ifboolKV[ClesDroites]{CitePropriete}{%
          Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.%
          
          Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.%
          
          Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires.
        }{%
          Comme les droites $(#2)$ et $(#4)$ sont parall\`eles, alors la droite $(#3)$ qui est perpendiculaire \`a $(#4)$ est \'egalement perpendiculaire \`a la droite $(#2)$.
        }%
      }%
    }%
  }%
}%

\newcommand\Brouillon[4][]{%
  \setlength{\abovedisplayskip}{0pt}
  \ifboolKV[ClesDroites]{Remediation}{%
    \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{%
      \[\left.
          \begin{array}{l}
            (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\
            \\
            (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})
          \end{array}
        \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})
      \]
    }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{%
        \[\left.
            \begin{array}{l}
              (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\
              \\
              (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\
            \end{array}
          \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})
        \]
      }{%
        \[\left.
            \begin{array}{l}
              (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\
              \\
              (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\
            \end{array}
          \right\}(\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})
        \]
      }
    }
  }{
    \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{%
      \[\left.
          \begin{array}{l}
            (#2)//(#4)\\
            \\
            (#3)//(#4)
          \end{array}
        \right\}(#2)//(#3)
      \]
    }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{%
        \[\left.
            \begin{array}{l}
              (#2)\perp(#4)\\
              \\
              (#3)\perp(#4)\\
            \end{array}
          \right\}(#2)//(#3)
        \]
      }{%
        \[\left.
            \begin{array}{l}
              (#2)//(#4)\\
              \\
              (#3)\perp(#4)\\
            \end{array}
          \right\}(#2)\perp(#3)
        \]
      }%
    }%
  }%
}%

\def\MPFigureDroite#1#2{%
  \ifluatex
  %\mplibcodeinherit{enable}
  \mplibforcehmode
  \begin{mplibcode}
    pair A,B,C,D,E,F,G,H,I,J,K;
    u:=7.5mm;
    A=u*(1,3);
    B-A=u*(3,2);
    C-A=u*(2,-1);
    E-C=u*(1,-1.5);
    G-E=u*(1.5,0);
    I-A=whatever*(B-A);
    I-G=whatever*((B-A) rotated 90);
    D-B=C-A;
    F-D=E-C;
    H=1.1[G,I];
    J=(C--D) intersectionpoint (G--H);
    K=(E--F) intersectionpoint (G--H);
    path Codeperp[];
    pair M[];
    M1-I=7*unitvector(B-I);
    M3-I=7*unitvector(J-I);
    M2-M3=M1-I;
    Codeperp1=M1--M2--M3;
    Codeperp2=Codeperp1 shifted(J-I);
    picture Codepara[];
    pair R,S,T;
    path cd;
    Codepara1=image(
    R=1/3[A,B];
    T=1/3[E,F];
    S=1/3[R,T];
    cd=(fullcircle scaled 6mm) shifted S;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd);
    drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd);
    draw cd;
    label(btex $//$ etex ,S);
    drawoptions();
    );
    Codepara2=image(
    R:=1/2[C,D];
    T:=1/2[E,F];
    S:=1/2[R,T];
    cd:=(fullcircle scaled 6mm) shifted S;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd);
    drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd);
    draw cd;
    label(btex $//$ etex ,S);
    drawoptions();
    );
    path d[];
    d1=A--B;
    d2=C--D;
    d3=E--F;
    d4=G--H;
    picture reste;
    reste=image(
    %trac\'es des droites
    draw d1;
    if #1=2:
    draw d2;
    elseif #1=3:
    draw d3;
    fi;
    if #2=3:
    draw d3;
    elseif #2=4:
    draw d4;
    fi;
    % trac\'es des codes
    if (#1=2) and (#2=3):
    draw Codepara1; draw Codepara2;
    fi;
    if (#1=2) and (#2=4):
    draw Codeperp1; draw Codeperp2;
    fi;
    if (#1=3) and (#2=4):
    draw Codepara1; draw Codeperp1;
    fi;
    );
    reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180));
    draw reste;
  \end{mplibcode}
  %\mplibcodeinherit{disable}
  \else
  \begin{mpost}
    pair A,B,C,D,E,F,G,H,I,J,K;
    u:=7.5mm;
    A=u*(1,3);
    B-A=u*(3,2);
    C-A=u*(2,-1);
    E-C=u*(1,-1.5);
    G-E=u*(1.5,0);
    I-A=whatever*(B-A);
    I-G=whatever*((B-A) rotated 90);
    D-B=C-A;
    F-D=E-C;
    H=1.1[G,I];
    J=(C--D) intersectionpoint (G--H);
    K=(E--F) intersectionpoint (G--H);
    path Codeperp[];
    pair M[];
    M1-I=7*unitvector(B-I);
    M3-I=7*unitvector(J-I);
    M2-M3=M1-I;
    Codeperp1=M1--M2--M3;
    Codeperp2=Codeperp1 shifted(J-I);
    picture Codepara[];
    pair R,S,T;
    path cd;
    Codepara1=image(
    R=1/3[A,B];
    T=1/3[E,F];
    S=1/3[R,T];
    cd=(fullcircle scaled 6mm) shifted S;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd);
    drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd);
    draw cd;
    label(btex $//$ etex ,S);
    drawoptions();
    );
    Codepara2=image(
    R:=1/2[C,D];
    T:=1/2[E,F];
    S:=1/2[R,T];
    cd:=(fullcircle scaled 6mm) shifted S;
    drawoptions(withcolor 0.75*white);
    drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd);
    drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd);
    draw cd;
    label(btex $//$ etex ,S);
    drawoptions();
    );
    path d[];
    d1=A--B;
    d2=C--D;
    d3=E--F;
    d4=G--H;
    picture reste;
    reste=image(
    %trac\'es des droites
    draw d1;
    if #1=2:
    draw d2;
    elseif #1=3:
    draw d3;
    fi;
    if #2=3:
    draw d3;
    elseif #2=4:
    draw d4;
    fi;
    % trac\'es des codes
    if (#1=2) and (#2=3):
    draw Codepara1; draw Codepara2;
    fi;
    if (#1=2) and (#2=4):
    draw Codeperp1; draw Codeperp2;
    fi;
    if (#1=3) and (#2=4):
    draw Codepara1; draw Codeperp1;
    fi;
    );
    reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180));
    draw reste;
  \end{mpost}
  \fi
}

\newcommand\FaireFigure[4][]{%
  \setlength{\abovedisplayskip}{0pt}
  \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{%
    \MPFigureDroite{2}{3}%
  }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{%
      \MPFigureDroite{2}{4}%
    }{%
      \MPFigureDroite{3}{4}%
    }%
  }%
}%

\newcommand\ProprieteDroites[4][]{%
  \useKVdefault[ClesDroites]%
  \setKV[ClesDroites]{#1}%
  \ifboolKV[ClesDroites]{Figure}{%
    \begin{multicols}{2}%
      \begin{center}%
        \FaireFigure[#1]{#2}{#3}{#4}%
      \end{center}%
      \columnbreak
      \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}%
      \Redaction[#1]{#2}{#3}{#4}%
      \par%
    \end{multicols}
  }{%
      \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}%
      \Redaction[#1]{#2}{#3}{#4}%
  }%
}%

%%%
% Fonction Affine
%%%
\setKVdefault[ClesAffine]{Nom=f,Variable=x,Ligne=false,Image=false,Antecedent=false,Graphique=false,Retrouve=false,ProgCalcul=false,Unitex=1,Unitey=1,VoirCoef=false,ACoef=0,Redaction=false,Ecriture=false,Definition=false}%ACoefficient=false%: inutile ?

\newcommand\FonctionAffine[5][]{%
  % #1 nombre ou abscisse premier point
  % #2 a ou ordonn\'ee premier point
  % #3 b ou abscisse deuxi\`eme point
  % #4 {} ou ordonn\'ee deuxi\`eme point
  \useKVdefault[ClesAffine]%A supprimer car appel r\'ecursif avec Redaction
  \setKV[ClesAffine]{#1}%
  \ifboolKV[ClesAffine]{Image}{%
    \ifboolKV[ClesAffine]{Ligne}{%
      \ensuremath{\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}=\num{\fpeval{#2*#3}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\xintifboolexpr{#4==0}{}{=\num{\fpeval{#2*#3+#4}}}}%
    }{%
      \ifboolKV[ClesAffine]{ProgCalcul}{%
        \begin{align*}
          \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}}\\
          \useKV[ClesAffine]{Nom}&:\num{#2}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{\fpeval{#3*#2+#4}}}
        \end{align*}    
      }{%
        \begin{align*}
          \useKV[ClesAffine]{Nom}(\num{#2})&=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\\
          \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}%\\
          \xintifboolexpr{#4==0}{}{\\
          \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2+#4}}%\\
          }
        \end{align*}
      }%
    }%
  }{\ifboolKV[ClesAffine]{Antecedent}{%
      \ifboolKV[ClesAffine]{ProgCalcul}{%
        La fonction affine $\useKV[ClesAffine]{Nom}$ est d\'efinie par :
        \begin{align*}
          \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}}
        \end{align*}
        Nous cherchons le nombre $\useKV[ClesAffine]{Variable}$ tel que son image par la fonction $\useKV[ClesAffine]{Nom}$ soit $\num{#2}$. Donc on obtient :
        \begin{align*}
          \useKV[ClesAffine]{Nom}&:\frac{\num{\fpeval{#2-#4}}}{\num{#3}}\stackrel{\div\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longleftarrow}\num{\fpeval{#2-#4}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{-\num{#4}}{\longleftarrow}}{\stackrel{+\num{\fpeval{0-#4}}}{\longleftarrow}}\num{#2}}
        \end{align*}    
      }{%
        On cherche l'ant\'ec\'edent de $\num{#2}$ par la fonction
        $\useKV[ClesAffine]{Nom}$, c'est-\`a-dire le nombre
        $\useKV[ClesAffine]{Variable}$ tel que
        $\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\num{#2}$. Or,
        la fonction $\useKV[ClesAffine]{Nom}$ est d\'efinie par : \[%
          \useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#3==0}{}{\num{#3}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#3==0}{\num{#4}}{\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}}
        \]
        Par cons\'equent, on a :
        \begin{align*}
            \num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}&=\num{#2}\\
          \xintifboolexpr{#4==0}{\useKV[ClesAffine]{Variable}\uppercase{&}=\frac{\num{#2}}{\num{#3}}%\\
          }{\num{#3}\useKV[ClesAffine]{Variable}&=\num{\fpeval{#2-#4}}\\
          \useKV[ClesAffine]{Variable}&=\frac{\num{\fpeval{#2-#4}}}{\num{#3}}%\\
          }
        \end{align*}
      }%
    }{%
      \ifboolKV[ClesAffine]{Retrouve}{%
        On sait que $\useKV[ClesAffine]{Nom}$ est une fonction affine. Donc elle s'\'ecrit sous la forme : \[\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=a\useKV[ClesAffine]{Variable}+b\]
        Or, $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$ et $\useKV[ClesAffine]{Nom}(\num{#4})=\num{#5}$. Par cons\'equent, d'apr\`es la propri\'et\'e des accroissements :
        \begin{align*}
          a&=\frac{\useKV[ClesAffine]{Nom}(\num{#2})-\useKV[ClesAffine]{Nom}(\num{#4})}{\num{#2}-\xintifboolexpr{#4<0}{(\num{#4})}{\num{#4}}}\\
          a&=\frac{\num{#3}-\xintifboolexpr{#5<0}{(\num{#5})}{\num{#5}}}{\num{\fpeval{#2-#4}}}\\
          a&=\frac{\num{\fpeval{#3-#5}}}{\num{\fpeval{#2-#4}}}%\\
          \SSimpliTest{\fpeval{#3-#5}}{\fpeval{#2-#4}}\ifthenelse{\boolean{Simplification}}{\\a&=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}}{}%
        \end{align*}
        La fonction $\useKV[ClesAffine]{Nom}$ s'\'ecrit alors sous la forme $\displaystyle\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}+b$.
        \\De plus, comme $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$, alors :
        \begin{align*}
          \SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}+b&=\num{#3}\\
          \SSimplifie{\fpeval{(#3-#5)*#2}}{\fpeval{#2-#4}}+b&=\num{#3}\\
          b&=\num{\fpeval{#3-(#3-#5)*#2/(#2-#4)}}
        \end{align*}
        \xdef\OrdOrigine{\fpeval{#3-(#3-#5)*#2/(#2-#4)}}
        La fonction affine $\useKV[ClesAffine]{Nom}$ cherch\'ee est :
        \[\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}\xintifboolexpr{\OrdOrigine==0}{}{\xintifboolexpr{\OrdOrigine>0}{+\num{\OrdOrigine}}{-\num{\fpeval{0-\OrdOrigine}}}}\]
      }{%
        %
      }%
    }%
  }%
  \ifboolKV[ClesAffine]{Graphique}{%
    \ifboolKV[ClesAffine]{VoirCoef}{%
      \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{\useKV[ClesAffine]{ACoef}}%
    }{%
      \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{""}}{}%
  }{}%
  \ifboolKV[ClesAffine]{Redaction}{%
    \xintifboolexpr{#2==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$
      est une fonction constante, alors sa repr\'esentation graphique est une droite parall\`ele \`a l'axe des abscisses passant par le point de coordonn\'ees $(0;\num{#3})$.}%
    {\xintifboolexpr{#3==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$ est une fonction lin\'eaire, alors sa repr\'esentation graphique est une droite passant par l'origine du rep\`ere.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomFonctionA{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonctionA,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$.
      }{%
        Comme $\useKV[ClesAffine]{Nom}$ est une fonction affine, alors sa repr\'esentation graphique est une droite.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomVariable{\useKV[ClesAffine]{Variable}}\xdef\NomFonction{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonction,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$.\\Je choisis \setKV[ClesAffine]{Variable=\NomVariable}$\useKV[ClesAffine]{Variable}=\num{#5}$. Son image est \FonctionAffine[Nom=\NomFonction,Image,Ligne]{#5}{#2}{#3}{#4}. On place le point de coordonn\'ees $(\num{#5};\num{\fpeval{#2*#5+#3}})$.%        
      }%
    }%
  }%
  {}%
  \ifboolKV[ClesAffine]{Ecriture}{\ensuremath{\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}%
  \ifboolKV[ClesAffine]{Definition}{\ensuremath{\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}%
}%

\def\MPFonctionAffine#1#2#3#4#5#6#7{%
  % #1 Unitex #2 Unitey
    % #2 a pour f1 - #4 b pour f1
    % #5 abscisse du premier point
    % #6 abscisse du deuxi\`eme point
  \ifluatex
   \mplibforcehmode
  \begin{mplibcode}
    XMin=-2;
    XMax=2;
    if #5<XMin:
    XMin:=#5;
    fi;
    if #6<XMin:
    XMin:=#6;
    fi;
    if #5>XMax:
    XMax:=#5;
    fi;
    if #6>XMax:
    XMax:=#6;
    fi;
    YMax=2;
    YMin=-2;
    if (#5*#3+(#4))>YMax:
    YMax:=(#5*#3+(#4));
    fi;
    if (#6*#3+(#4))>YMax:
    YMax:=(#6*#3+(#4));
    fi;
    if (#5*#3+(#4))<YMin:
    YMin:=(#5*#3+(#4));
    fi;
    if (#6*#3+(#4))<YMin:
    YMin:=(#6*#3+(#4));
    fi;
    unitex:=#1*cm;
    unitey:=#2*cm;
    XMax:=XMax+2;
    XMin:=XMin-2;
    YMax:=YMax+2;
    YMin:=YMin-2;
    %On trace la grille
    drawoptions(withcolor 0.95white);
    for k=0 upto (XMax-XMin):
    draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey);
    endfor;
    for k=0 upto (YMax-YMin):
    draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey);
    endfor;
    drawoptions();
    %On trace les axes
    drawarrow (XMin*unitex,0)--(XMax*unitex,0);
    drawarrow (0,YMin*unitey)--(0,YMax*unitey);
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,(unitex,0));
    dotlabel.lft(btex 1 etex,(0,unitey));
    % On trace la droite
    pair A[];
    A1=(#5*unitex,(#5*#3+(#4))*unitey);
    A2=(#6*unitex,(#6*#3+(#4))*unitey);
    draw 2[A1,A2]--2[A2,A1];
    clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle);
    %On labellise les points
    fill (fullcircle scaled 1mm) shifted A1;
    fill (fullcircle scaled 1mm) shifted A2;
    draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly;
    draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly;
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.top(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0));
    else:
    label.bot(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.top(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0));
    else:
    label.bot(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0));
    fi;
    fi;
    if #3=0:
    label.urt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    if #3>0:
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    else:
    label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    fi;
    fi;
    else:
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    else:
    label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    fi;
    fi;
    fi;
    fi;
    % On affiche ou pas "la marche" du coef directeur
    for p_=#7:
    if numeric p_:
    draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red;
    fi;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}
    % On d\'efinit les constantes
    XMin=-2;
    XMax=2;
    if #5<XMin:
    XMin:=#5;
    fi;
    if #6<XMin:
    XMin:=#6;
    fi;
    if #5>XMax:
    XMax:=#5;
    fi;
    if #6>XMax:
    XMax:=#6;
    fi;
    YMax=2;
    YMin=-2;
    if (#5*#3+(#4))>YMax:
    YMax:=(#5*#3+(#4));
    fi;
    if (#6*#3+(#4))>YMax:
    YMax:=(#6*#3+(#4));
    fi;
    if (#5*#3+(#4))<YMin:
    YMin:=(#5*#3+(#4));
    fi;
    if (#6*#3+(#4))<YMin:
    YMin:=(#6*#3+(#4));
    fi;
    unitex:=#1*cm;
    unitey:=#2*cm;
    XMax:=XMax+2;
    XMin:=XMin-2;
    YMax:=YMax+2;
    YMin:=YMin-2;
    %On trace la grille
    drawoptions(withcolor 0.95white);
    for k=0 upto (XMax-XMin):
    draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey);
    endfor;
    for k=0 upto (YMax-YMin):
    draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey);
    endfor;
    drawoptions();
    %On trace les axes
    drawarrow (XMin*unitex,0)--(XMax*unitex,0);
    drawarrow (0,YMin*unitey)--(0,YMax*unitey);
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,(unitex,0));
    dotlabel.lft(btex 1 etex,(0,unitey));
    % On trace la droite
    pair A[];
    A1=(#5*unitex,(#5*#3+(#4))*unitey);
    A2=(#6*unitex,(#6*#3+(#4))*unitey);
    draw 2[A1,A2]--2[A2,A1];
    clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle);
    %On labellise les points
    fill (fullcircle scaled 1mm) shifted A1;
    fill (fullcircle scaled 1mm) shifted A2;
    draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly;
    draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly;
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.top(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0));
    else:
    label.bot(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.top(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0));
    else:
    label.bot(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0));
    fi;
    fi;
    if #3=0:
    label.urt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    if #3>0:
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    else:
    label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    fi;
    fi;
    else:
    if (#5*#3+(#4))=0:
    else:
    if (#5*#3+(#4))<0:
    label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    else:
    label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1)));
    fi;
    fi;
    if (#6*#3+(#4))=0:
    else:
    if (#6*#3+(#4))<0:
    label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    else:
    label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2)));
    fi;
    fi;
    fi;
    fi;
    % On affiche ou pas "la marche" du coef directeur
    for p_=#7:
    if numeric p_:
    draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red;
    fi;
    endfor;
  \end{mpost}
  \fi
}


%%%
% Fonction
%%%
\setKVdefault[ClesFonction]{Nom=f,Variable=x,Calcul=x,Tableau=false,Largeur=5mm,Ecriture=false,Definition=false,Points=false,Tangentes=false,PasX=1,PasY=1,UniteX=1,UniteY=1,Prolonge=false,Trace=false}

\newtoks\toklistePtsFn%pour la discipline

\def\UpdatePtsFn#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{#1,(#2,#3),#4,}}%
\def\UpdatePtsFN#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{(#2,#3),}}%

\def\MPCourbePoints#1#2#3#4#5#6{%
  % #1 la liste des points
  % #2: pas en x
  % #3: pas en y
  % #4: unit\'e en x
  % #5: unit\'e en y
  % #6 : prolongement avant et apr\`es les premier et dernier points ?
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    x.u:=#2;
    y.u:=#3;
    X.u:=#4;
    Y.u:=#5;
    numeric dirav[],dirap[];
    pair Fn[],Gn[];
    n=0;
    for p_=#1:
    Gn[n]=p_;
    Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_));
    n:=n+1;
    endfor;
    N:=(n-1);
    MinX=999;
    MaxX=-999;
    MinY=999;
    MaxY=-999;
    for k=0 upto N:
    if xpart(Gn[k])<MinX:
    MinX:=xpart(Gn[k]);
    fi;
    if xpart(Gn[k])>MaxX:
    MaxX:=xpart(Gn[k]);
    fi;
    if ypart(Gn[k])<MinY:
    MinY:=ypart(Gn[k]);
    fi;
    if ypart(Gn[k])>MaxY:
    MaxY:=ypart(Gn[k]);
    fi;
    endfor;
    if #6=0:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX-1 step x.u until MaxX+1:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    else:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX step x.u until MaxX:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    fi;
    if #6=0:
    for k=0 upto N:
    fill cercles(Fn[k],0.5mm);
    endfor;
    else:
    for k=1 upto N-1:
    fill cercles(Fn[k],0.5mm);
    endfor;
    fi;
    if #6=0:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0);
    else:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0);
    fi;
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,cm*X.u*(1,0));
    dotlabel.lft(btex 1 etex,cm*Y.u*(0,1));
    draw Fn[0]
    for k=1 upto N:
    ..Fn[k]
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}
    x.u:=#2;
    y.u:=#3;
    X.u:=#4;
    Y.u:=#5;
    numeric dirav[],dirap[];
    pair Fn[],Gn[];
    n=0;
    for p_=#1:
    Gn[n]=p_;
    Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_));
    n:=n+1;
    endfor;
    N:=(n-1);
    MinX=999;
    MaxX=-999;
    MinY=999;
    MaxY=-999;
    for k=0 upto N:
    if xpart(Gn[k])<MinX:
    MinX:=xpart(Gn[k]);
    fi;
    if xpart(Gn[k])>MaxX:
    MaxX:=xpart(Gn[k]);
    fi;
    if ypart(Gn[k])<MinY:
    MinY:=ypart(Gn[k]);
    fi;
    if ypart(Gn[k])>MaxY:
    MaxY:=ypart(Gn[k]);
    fi;
    endfor;
    if #6=0:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX-1 step x.u until MaxX+1:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    else:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX step x.u until MaxX:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    fi;
    if #6=0:
    for k=0 upto N:
    fill cercles(Fn[k],0.5mm);
    endfor;
    else:
    for k=1 upto N-1:
    fill cercles(Fn[k],0.5mm);
    endfor;
    fi;
    if #6=0:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0);
    else:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0);
    fi;
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,cm*X.u*(1,0));
    dotlabel.lft(btex 1 etex,cm*Y.u*(0,1));
    draw Fn[0]
    for k=1 upto N:
    ..Fn[k]
    endfor;
  \end{mpost}
  \fi
}

\def\MPCourbe#1#2#3#4#5#6{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    x.u:=#2;
    y.u:=#3;
    X.u:=#4;
    Y.u:=#5;
    numeric dirav[],dirap[];
    pair Fn[],Gn[];
    n=0;
    for p_=#1:
    if (n mod 3)=0:
    dirav[n div 3]=p_;
    fi;
    if (n mod 3)=1:
    Gn[n div 3]=p_;
    Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_));
    fi;
    if (n mod 3)=2:
    dirap[n div 3]=p_;
    fi;
    n:=n+1;
    endfor;
    N:=(n-1) div 3;
    MinX=999;
    MaxX=-999;
    MinY=999;
    MaxY=-999;
    for k=0 upto N:
    if xpart(Gn[k])<MinX:
    MinX:=xpart(Gn[k]);
    fi;
    if xpart(Gn[k])>MaxX:
    MaxX:=xpart(Gn[k]);
    fi;
    if ypart(Gn[k])<MinY:
    MinY:=ypart(Gn[k]);
    fi;
    if ypart(Gn[k])>MaxY:
    MaxY:=ypart(Gn[k]);
    fi;
    endfor;
        if #6=0:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX-1 step x.u until MaxX+1:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    else:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX step x.u until MaxX:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    fi;
    if #6=0:
    for k=0 upto N:
    fill cercles(Fn[k],0.5mm);
    endfor;
    else:
    for k=1 upto N-1:
    fill cercles(Fn[k],0.5mm);
    endfor;
    fi;
    if #6=0:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0);
    else:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0);
    fi;
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,cm*X.u*(1,0));
    dotlabel.lft(btex 1 etex,cm*Y.u*(0,1));
    draw Fn[0]{dir dirap[0]}
    for k=1 upto (N-1):
    ..{dir dirav[k]}Fn[k]{dir dirap[k]}
    endfor
    ..{dir dirav[N]}Fn[N];
  \end{mplibcode}
  \else
  \begin{mpost}
        x.u:=#2;
    y.u:=#3;
    X.u:=#4;
    Y.u:=#5;
    numeric dirav[],dirap[];
    pair Fn[],Gn[];
    n=0;
    for p_=#1:
    if (n mod 3)=0:
    dirav[n div 3]=p_;
    fi;
    if (n mod 3)=1:
    Gn[n div 3]=p_;
    Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_));
    fi;
    if (n mod 3)=2:
    dirap[n div 3]=p_;
    fi;
    n:=n+1;
    endfor;
    N:=(n-1) div 3;
    MinX=999;
    MaxX=-999;
    MinY=999;
    MaxY=-999;
    for k=0 upto N:
    if xpart(Gn[k])<MinX:
    MinX:=xpart(Gn[k]);
    fi;
    if xpart(Gn[k])>MaxX:
    MaxX:=xpart(Gn[k]);
    fi;
    if ypart(Gn[k])<MinY:
    MinY:=ypart(Gn[k]);
    fi;
    if ypart(Gn[k])>MaxY:
    MaxY:=ypart(Gn[k]);
    fi;
    endfor;
        if #6=0:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX-1 step x.u until MaxX+1:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    else:
    for k=MinY-1 step y.u until MaxY+1:
    draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white;
    endfor;
    for k=MinX step x.u until MaxX:
    draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white;
    endfor;
    fi;
    if #6=0:
    for k=0 upto N:
    fill cercles(Fn[k],0.5mm);
    endfor;
    else:
    for k=1 upto N-1:
    fill cercles(Fn[k],0.5mm);
    endfor;
    fi;
    if #6=0:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0);
    else:
    drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm);
    drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0);
    fi;
    label.llft(btex O etex,(0,0));
    dotlabel.bot(btex 1 etex,cm*X.u*(1,0));
    dotlabel.lft(btex 1 etex,cm*Y.u*(0,1));
    draw Fn[0]{dir dirap[0]}
    for k=1 upto (N-1):
    ..{dir dirav[k]}Fn[k]{dir dirap[k]}
    endfor
    ..{dir dirav[N]}Fn[N];
  \end{mpost}
  \fi
}

\newcommand\Fonction[2][]{%
  \useKVdefault[ClesFonction]%
  \setKV[ClesFonction]{#1}%
  \ifboolKV[ClesFonction]{Trace}{%
    \useKVdefault[TraceG]%
    \setKV[TraceG]{#1}%
    \MPTraceFonction[#1]{\useKV[ClesFonction]{Calcul}}%
  }{%
    \ifboolKV[ClesFonction]{Points}{%
      \toklistePtsFn{}%
      \setsepchar[*]{§*/}%\ignoreemptyitems%
      \readlist*\ListePoints{#2}%
      \ifboolKV[ClesFonction]{Tangentes}{%
        \foreachitem\compteur\in\ListePoints{%
          \expandafter\UpdatePtsFn\compteur\nil%
        }%
        \ifboolKV[ClesFonction]{Prolonge}{%
          \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}%
        }{%
          \MPCourbe{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}%
        }%
      }{%
        \foreachitem\compteur\in\ListePoints{%
          \expandafter\UpdatePtsFN\compteur\nil%
        }%
        \ifboolKV[ClesFonction]{Prolonge}{%
          \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{1}%
        }{%
          \MPCourbePoints{\the\toklistePtsFn}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}{0}%
        }%
      }%
    }{%
      \setsepchar{,}\ignoreemptyitems%
      \readlist*\ListeFonction{#2}%
      \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{\i}[\temp]%
      \StrSubstitute{\useKV[ClesFonction]{Calcul}}{**}{^}[\tempa]%
      \StrSubstitute{\tempa}{*}{}[\tempab]%
      \ifboolKV[ClesFonction]{Ecriture}{%
        \ensuremath{\useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})=\tempab}%
      }{}%
      \ifboolKV[ClesFonction]{Definition}{%
        \ensuremath{\useKV[ClesFonction]{Nom}:\useKV[ClesFonction]{Variable}\mapsto\tempab}%
      }{}%
      \ifboolKV[ClesFonction]{Tableau}{%
        \buildtabfonction%
      }{}%
      \reademptyitems%
    }%
  }%
}%

\def\buildtabfonction{%
  \[%
    \begin{array}{|>{\columncolor{gray!15}}c|*{\number\numexpr\ListeFonctionlen}{>{\centering\arraybackslash}p{\useKV[ClesFonction]{Largeur}}|}}%
      \hline
      \useKV[ClesFonction]{Variable}\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{&\num{\ListeFonction[##1]}}\\
      \hline
      \useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{&  \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{(\ListeFonction[##1])}[\tempab]\num{\fpeval{\tempab}}}
      \\\hline
    \end{array}%
  \]%
}%

%%%
% Diff\'erentes représentations graphiques
%%%
\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Relie=false,RelieSegment=false,Marque=dot}

\newcommand\TraceGraphique[2][]{%
  \useKVdefault[TraceG]%
  \setKV[TraceG]{#1}%
  \ifboolKV[TraceG]{Fonction}{%
    \MPTraceFonction[#1]{#2}%
  }{%
    \setKV[TraceG]{Xmin=0,Ymin=0}
    \setKV[TraceG]{#1}%
    \readlist*\ListePointsPlaces{#2}%
    \newtoks\toklistepoint%
    \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}%
    \MPPlacePoint[#1]{\the\toklistepoint}
  }%
}%

\newcommand\MPPlacePoint[2][]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    xmin=\useKV[TraceG]{Xmin};
    xmax=\useKV[TraceG]{Xmax};
    ymin=\useKV[TraceG]{Ymin};
    ymax=\useKV[TraceG]{Ymax};
    pasx=\useKV[TraceG]{Xstep};
    pasy=\useKV[TraceG]{Ystep};
    x.u=1cm/\useKV[TraceG]{Xstep};
    y.u=1cm/\useKV[TraceG]{Ystep};
    grillex=\useKV[TraceG]{PasGrilleX};
    grilley=\useKV[TraceG]{PasGrilleY};
    pos=\useKV[TraceG]{LabelC};

    marque_p:=str \useKV[TraceG]{Marque};
    m_c:=m_c*2;
    
    color colorpoint,colortrace;
    colorpoint=\useKV[TraceG]{CouleurPoint};
    colortrace=\useKV[TraceG]{CouleurTrace};
    boolean Grille;
    Grille=\useKV[TraceG]{Grille};

    boolean Graduations;
    Graduations=\useKV[TraceG]{Graduations};

    boolean Relie;
    Relie=\useKV[TraceG]{Relie};

    boolean RelieSegment;
    RelieSegment=\useKV[TraceG]{RelieSegment};

    boolean Invisible;
    Invisible=\useKV[TraceG]{Invisible};
    
    pair Origine;
    Origine=(0,0);
    
    if Grille:
    drawoptions(withcolor 0.75white);
    for k=0 step grillex until (xmax-xmin):
    trace (k*x.u,ypart(Origine))--(x.u*k,y.u*(ymax-ymin));
    endfor;
    for k=0 step grilley until (ymax-ymin):
    trace (xpart(Origine),k*y.u)--(x.u*(xmax-xmin),y.u*k);
    endfor;
    drawoptions();
    fi;
    
    if Graduations:
    for k=0 step grillex until (xmax-xmin):
    trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*x.u,0) shifted Origine) withpen pencircle scaled1.25;
    label.bot(TEX("\num{"&decimal(xmin+k)&"}"),(k*x.u,0) shifted Origine);
    endfor;
    label.ulft(TEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine);
    for k=grilley step grilley until (ymax-ymin):
    trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*y.u) shifted Origine) withpen pencircle scaled1.25;
    label.lft(TEX("\num{"&decimal(ymin+k)&"}"),(0,k*y.u) shifted Origine);
    endfor;
    fi;
    drawoptions(withpen pencircle scaled1.5);
    drawarrow Origine--(xpart(Origine),y.u*(ymax-ymin));
    drawarrow Origine--((xmax-xmin)*x.u,ypart(Origine));
    drawoptions();

    % On relie éventuellement les points
    if Relie:
    pair N[];
    nbpoint=0;
    for p_=#2:
    nbpoint:=nbpoint+1;
    N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin));
    endfor;
    draw N[1] for k=2 upto nbpoint:
    ..N[k]
    endfor withcolor colortrace;
    fi;
    if RelieSegment:
    pair N[];
    nbpoint=0;
    for p_=#2:
    nbpoint:=nbpoint+1;
    N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin));
    endfor;
    draw N[1] for k=2 upto nbpoint:
    --N[k]
    endfor withcolor colortrace;
    fi;
    
    % On place les points
    if Invisible=false:
    drawoptions(withcolor colorpoint);
    for p_=#2:
    if marque_p="dot":
    dotlabel("",(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)));
    elseif marque_p="croix":
    pointe((x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)));
    fi;
    endfor;
    drawoptions();
    fi;
    %on labelise les axes
    label.urt(btex \useKV[TraceG]{LabelX} etex,(x.u*(xmax-xmin),ypart(Origine)));
    label.urt(btex \useKV[TraceG]{LabelY} etex,(xpart(Origine),y.u*(ymax-ymin)));
  \end{mplibcode}
  \else
  \mpxcommands{%
    \usepackage{ProfCollege}
    \setKV[TraceG]{#1}
  }
  \begin{mpost}[mpsettings={xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colorpoint,colortrace;colorpoint=\useKV[TraceG]{CouleurPoint};colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};boolean Relie;Relie=\useKV[TraceG]{Relie};boolean RelieSegment;RelieSegment=\useKV[TraceG]{RelieSegment};boolean Invisible;Invisible=\useKV[TraceG]{Invisible};}]    
    pair Origine;
    Origine=(0,0);
    
    if Grille:
    drawoptions(withcolor 0.75white);
    for k=0 step grillex until (xmax-xmin):
    trace (k*xu,ypart(Origine))--(xu*k,yu*(ymax-ymin));
    endfor;
    for k=0 step grilley until (ymax-ymin):
    trace (xpart(Origine),k*yu)--(xu*(xmax-xmin),yu*k);
    endfor;
    drawoptions();
    fi;
    
    if Graduations:
    for k=0 step grillex until (xmax-xmin):
    trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*xu,0) shifted Origine) withpen pencircle scaled1.25;
    label.bot(LATEX("\num{"&decimal(xmin+k)&"}"),(k*xu,0) shifted Origine);
    endfor;
    label.ulft(LATEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine);
    for k=grilley step grilley until (ymax-ymin):
    trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*yu) shifted Origine) withpen pencircle scaled1.25;
    label.lft(LATEX("\num{"&decimal(ymin+k)&"}"),(0,k*yu) shifted Origine);
    endfor;
    fi;
    drawoptions(withpen pencircle scaled1.5);
    drawarrow Origine--(xpart(Origine),yu*(ymax-ymin));
    drawarrow Origine--((xmax-xmin)*xu,ypart(Origine));
    drawoptions();

    % On relie éventuellement les points
    if Relie:
    pair N[];
    nbpoint=0;
    for p_=#2:
    nbpoint:=nbpoint+1;
    N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin));
    endfor;
    draw N[1] for k=2 upto nbpoint:
    ..N[k]
    endfor withcolor colortrace;
    fi;
    if RelieSegment:
    pair N[];
    nbpoint=0;
    for p_=#2:
    nbpoint:=nbpoint+1;
    N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin));
    endfor;
    draw N[1] for k=2 upto nbpoint:
    --N[k]
    endfor withcolor colortrace;
    fi;
    
    % On place les points
    if Invisible=false:
    drawoptions(withcolor colorpoint);
    for p_=#2:
    dotlabel("",(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin)));
    endfor;
    drawoptions();
    fi;
    %on labelise les axes
    label.urt(btex \unexpanded{\useKV[TraceG]{LabelX}} etex,(xu*(xmax-xmin),ypart(Origine)));
    label.urt(btex \unexpanded{\useKV[TraceG]{LabelY}} etex,(xpart(Origine),yu*(ymax-ymin)));
  \end{mpost}
  \fi
}

\newcommand\MPTraceFonction[2][]{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    borneinf=\useKV[TraceG]{Bornea};
    bornesup=\useKV[TraceG]{Borneb};
    xmin=\useKV[TraceG]{Xmin};
    xmax=\useKV[TraceG]{Xmax};
    ymin=\useKV[TraceG]{Ymin};
    ymax=\useKV[TraceG]{Ymax};
    pasx=\useKV[TraceG]{Xstep};
    pasy=\useKV[TraceG]{Ystep};
    x.u=1cm/\useKV[TraceG]{Xstep};
    y.u=1cm/\useKV[TraceG]{Ystep};
    grillex=\useKV[TraceG]{PasGrilleX};
    grilley=\useKV[TraceG]{PasGrilleY};
    pos=\useKV[TraceG]{LabelC};

    color colortrace;
    colortrace=\useKV[TraceG]{CouleurTrace};
    
    pair Origine;
    Origine=(xmin,ymin)+\useKV[TraceG]{Origine};

    boolean Grille;
    Grille=\useKV[TraceG]{Grille};

    boolean Graduations;
    Graduations=\useKV[TraceG]{Graduations};

    vardef sin(expr t) = sind(c*t) enddef;

    vardef cos(expr t) = cosd(c*t) enddef;
    
    vardef tan(expr t) = sin(t)/cos(t) enddef;
    
    vardef exp(expr t) = e**t enddef;
    
    vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef;
    
    vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
    
    vardef ln(expr t) = mlog(t)/256 enddef;
    
    vardef arcsin(expr x)=%Définition mathématique en radian
    pi*angle((sqrt(1-x**2),x))/180
    enddef;
    
    vardef arccos(expr x)=%Définition mathématique en radian
    pi*angle((x,sqrt(1-x**2)))/180
    enddef;
    
    path Cb[];
    
    vardef courbe[](expr a,b,nb)(text texte)=
    path Courbe;
    for i:=0 upto nb :
    x@[i]:=(a+i*(b-a)/nb);
    x:=x@[i];
    y@[i]:=texte;
    endfor ;
    Cb@:=(x@.0*x.u,y@.0*y.u)
    for i:=1 upto nb :
    ..(x@[i]*x.u,y@[i]*y.u)
    endfor;
    Cb@:=Cb@ shifted (Origine*cm);
    Courbe=Cb@;
    Courbe
    enddef;

    if Grille:
    drawoptions(withcolor 0.75white);
    for k=xpart(Origine) step grillex until xmax:
    trace u*(k,ymin)--u*(k,ymax);
    endfor;
    for k=xpart(Origine) step -grillex until xmin:
    trace u*(k,ymin)--u*(k,ymax);
    endfor;
    for k=ypart(Origine) step grilley until ymax:
    trace u*(xmin,k)--u*(xmax,k);
    endfor;
    for k=ypart(Origine) step -grilley until ymin:
    trace u*(xmin,k)--u*(xmax,k);
    endfor;
    drawoptions();
    fi;
    if Graduations:
    for k=1 upto xmax/grillex:
    dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm)));
    endfor;
    for k=-1 downto xmin/grillex:
    dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm)));
    endfor;
    for k=1 upto ymax/grilley:
    dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm)));
    endfor;
    for k=-1 downto ymin/grilley:
    dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm)));
    endfor;
    fi;
    drawoptions(withpen pencircle scaled1.5);
    drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0));
    drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine)));
    drawoptions();
    draw courbe1(borneinf,bornesup,100)(#2) withcolor colortrace;
    % labelisation
    numeric t;
    t=pos*length Cb1;
    pair PT,Tangente;
    PT:=point (pos*length Cb1) of Cb1;
    Tangente:=unitvector(direction t of Cb1);
    label(btex \useKV[TraceG]{NomCourbe} etex rotated angle(Tangente),PT+2mm*(Tangente rotated 90));
    % fin labelisation
    clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax));
    label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine)));
    label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax));
  \end{mplibcode}
  \else
  \mpxcommands{%
    \usepackage{ProfCollege}
    \setKV[TraceG]{#1}
  }
  \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};}]
    pair Origine;
    Origine=(xmin,ymin)+\useKV[TraceG]{Origine};

    vardef sin(expr t) = sind(c*t) enddef;

    vardef cos(expr t) = cosd(c*t) enddef;
    
    vardef tan(expr t) = sin(t)/cos(t) enddef;
   
    vardef exp(expr t) = e**t enddef;
   
    vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef;
    
    vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
    
    vardef ln(expr t) = mlog(t)/256 enddef;
    
    vardef arcsin(expr x)=%Définition mathématique en radian
    pi*angle((sqrt(1-x**2),x))/180
    enddef;
    
    vardef arccos(expr x)=%Définition mathématique en radian
    pi*angle((x,sqrt(1-x**2)))/180
    enddef;
    
    path Cb[];
    
    vardef courbe[](expr a,b,nb)(text texte)=
    path Courbe;
    for i:=0 upto nb :
    x@[i]:=(a+i*(b-a)/nb);
    x:=x@[i];
    y@[i]:=texte;
    endfor ;
    Cb@:=(x@.0*xu,y@.0*yu)
    for i:=1 upto nb :
    ..(x@[i]*xu,y@[i]*yu)
    endfor;
    Cb@:=Cb@ shifted (Origine*cm);
    Courbe=Cb@;
    Courbe
    enddef;

    if Grille:
    drawoptions(withcolor 0.75white);
    for k=xpart(Origine) step grillex until xmax:
    trace u*(k,ymin)--u*(k,ymax);
    endfor;
    for k=xpart(Origine) step -grillex until xmin:
    trace u*(k,ymin)--u*(k,ymax);
    endfor;
    for k=ypart(Origine) step grilley until ymax:
    trace u*(xmin,k)--u*(xmax,k);
    endfor;
    for k=ypart(Origine) step -grilley until ymin:
    trace u*(xmin,k)--u*(xmax,k);
    endfor;
    drawoptions();
    fi;
    if Graduations:
    for k=1 upto xmax/grillex:
    dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm)));
    endfor;
    for k=-1 downto xmin/grillex:
    dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm)));
    endfor;
    for k=1 upto ymax/grilley:
    dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm)));
    endfor;
    for k=-1 downto ymin/grilley:
    dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm)));
    endfor;
    fi;
    drawoptions(withpen pencircle scaled1.5);
    drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0));
    drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine)));
    drawoptions();
    draw courbe1(borneinf,bornesup,100)(#2) withcolor colortrace;
%    % labelisation
    numeric t;
    t=pos*length Cb1;
    pair PT,Tangente;
    PT:=point (pos*length Cb1) of Cb1;
    Tangente:=unitvector(direction t of Cb1);
    label(btex \noexpand\useKV[TraceG]{NomCourbe} etex rotated angle(Tangente),PT+2mm*(Tangente rotated 90));
%    % fin labelisation
    clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax));
    label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine)));
    label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax));
  \end{mpost}
  \fi
}

%%%
% Formules
%%%
\setKVdefault[ClesFormule]{Perimetre=false,Aire=false,Volume=false,Surface=carr\'e,Solide=pav\'e,Angle=0,Ancre={(0,0)},Largeur=5cm,Couleur=white,EchelleEspace=70,Echelle=1cm}

\def\MPFigureCarre{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0);
    C=rotation(A,B,-90);
    D-C=A-B;
    draw polygone(A,B,C,D);
    draw codeperp(A,B,C,5);
    draw codeperp(B,C,D,5);
    draw codeperp(C,D,A,5);
    draw codeperp(D,A,B,5);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $c$ etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0);
    C=rotation(A,B,-90);
    D-C=A-B;
    draw polygone(A,B,C,D);
    draw codeperp(A,B,C,5);
    draw codeperp(B,C,D,5);
    draw codeperp(C,D,A,5);
    draw codeperp(D,A,B,5);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $c$ etex);
  \end{mpost}
  \fi
}

\def\MPFigurePolygone{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    pair A,B,C,D,E,F;
    A=u*(1,1);
    B-A=u*(2,0);
    C=3/5[B,rotation(A,B,-120)];
    D-C=u*(0,1);
    E-D=u*(-1.25,-1);
    F-E=u*(-1,1);
    draw polygone(A,B,C,D,E,F);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    pair A,B,C,D,E,F;
    A=u*(1,1);
    B-A=u*(2,0);
    C=3/5[B,rotation(A,B,-120)];
    D-C=u*(0,1);
    E-D=u*(-1.25,-1);
    F-E=u*(-1,1);
    draw polygone(A,B,C,D,E,F);
  \end{mpost}
  \fi
}

\def\MPFigureParallelogramme{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesFormule]{Echelle};
    vardef marque_para(expr dd,ee,pa)=
  save im;
  picture im;
  pair kk,ll,mn,mo;
  kk=point(pa*length dd) of dd;
  ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee);
  mn=iso(kk,ll);
  mo=(mn--kk) intersectionpoint cercles(mn,3mm);
  im=image(
    drawarrow mo--kk;
    drawarrow symetrie(mo,mn)--ll;
    label(btex $//$ etex,mn);
    );
  im
  enddef;
     
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2.25,0.25);
    D=4/5[A,rotation(B,A,40)];
    C-D=B-A;
    draw polygone(A,B,C,D);
    drawoptions(withcolor gris);
    draw marque_para(droite(A,B),droite(C,D),0.455);
    draw marque_para(droite(B,C),droite(A,D),0.43);
    draw segment(B,2.5[C,B]) dashed evenly;
    draw segment(A,1.5[D,A]) dashed evenly;
    draw segment(A,1.55[B,A]) dashed evenly;
    draw segment(D,2[C,D]) dashed evenly;
    drawoptions();
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    vardef marque_para(expr dd,ee,pa)=
  save im;
  picture im;
  pair kk,ll,mn,mo;
  kk=point(pa*length dd) of dd;
  ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee);
  mn=iso(kk,ll);
  mo=(mn--kk) intersectionpoint cercles(mn,3mm);
  im=image(
    drawarrow mo--kk;
    drawarrow symetrie(mo,mn)--ll;
    label(btex $//$ etex,mn);
    );
  im
  enddef;
  
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2.25,0.25);
    D=4/5[A,rotation(B,A,40)];
    C-D=B-A;
    draw polygone(A,B,C,D);
    drawoptions(withcolor gris);
    draw marque_para(droite(A,B),droite(C,D),0.455);
    draw marque_para(droite(B,C),droite(A,D),0.43);
    draw segment(B,2.5[C,B]) dashed evenly;
    draw segment(A,1.5[D,A]) dashed evenly;
    draw segment(A,1.55[B,A]) dashed evenly;
    draw segment(D,2[C,D]) dashed evenly;
    drawoptions();
  \end{mpost}
  \fi
}

\def\MPFigureParallelogrammeAire{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,10u,5u);
    pair A,B,C,D,I,J;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=3/5[A,rotation(B,A,40)];
    C-D=B-A;
    I=projection(D,A,B);
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(A,B);
    draw segment(D,I);
    draw codeperp(D,I,B,5);
    A:=A+3*u*(1,0);
    B:=A+u*(2,0.5);
    D:=3/5[A,rotation(B,A,40)];
    C:=D+B-A;
    J=projection(B,A,D);
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(D,1.5[A,D]) dashed evenly withcolor gris;
    draw segment(A,D);
    draw segment(B,J);
    draw codeperp(B,J,A,5);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,10u,5u);
    pair A,B,C,D,I,J;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=3/5[A,rotation(B,A,40)];
    C-D=B-A;
    I=projection(D,A,B);
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(A,B);
    draw segment(D,I);
    draw codeperp(D,I,B,5);
    A:=A+3*u*(1,0);
    B:=A+u*(2,0.5);
    D:=3/5[A,rotation(B,A,40)];
    C:=D+B-A;
    J=projection(B,A,D);
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(D,1.5[A,D]) dashed evenly withcolor gris;
    draw segment(A,D);
    draw segment(B,J);
    draw codeperp(B,J,A,5);
  \end{mpost}
  \fi
}

\def\MPFigureSphere{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace});
    color O,A,B,C;
    O=(0,0,0);
    A-O=(0,1/2,0);
    C-O=(-1/2,0,0);
    B-O=(0,0,1/2);
    path cc,cd;
    cc=cercles(O,A,O,A,C);
    cd=cercles(O,A,O,A,B);
    draw cd;
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw cotationmil(O,A,0,18,btex rayon $r$ etex);
    marque_p:="plein";
    pointe(O);
    marque_p:="non";
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,10,v);
    color O,A,B,C;
    O=(0,0,0);
    A-O=(0,1/2,0);
    C-O=(-1/2,0,0);
    B-O=(0,0,1/2);
    path cc,cd;
    cc=cercles(O,A,O,A,C);
    cd=cercles(O,A,O,A,B);
    draw cd;
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw cotationmil(O,A,0,18,btex rayon $r$ etex);
    marque_p:="plein";
    pointe(O);
    marque_p:="non";
  \end{mpost}
  \fi
}

\def\MPFigurePave{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,115);
    color A,B,C,D,E,F,G,H;
    draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris;
    draw segment(A,B);
    draw segment(E,F);
    draw segment(A,F);
    draw appelation(A,B,-2mm,btex $\ell$ etex);
    draw appelation(F,E,2mm,btex $p$ etex);
    draw appelation(A,F,2mm,btex $h$ etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,115);
    color A,B,C,D,E,F,G,H;
    draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris;
    draw segment(A,B);
    draw segment(E,F);
    draw segment(A,F);
    draw appelation(A,B,-2mm,\btex $\ell$ etex);
    draw appelation(F,E,2mm,\btex $p$ etex);
    draw appelation(A,F,2mm,\btex $h$ etex);
  \end{mpost}
  \fi
}

\def\MPFigurePrisme{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,\useKV[ClesFormule]{EchelleEspace});
    color A,B,C,D,E,F,G,H;
    D=(0.75,0,0);
    G=(0,1,0);
    H=(0,0,0);
    A-D=(0,0,0.5);
    C-D=G-H;
    E-H=A-D;
    F-E=(0,0.6,0);
    B-A=F-E;
    NbS:=8;
    Sommet1:=A;
    Sommet2:=B;
    Sommet3:=C;
    Sommet4:=D;
    Sommet5:=E;
    Sommet6:=F;
    Sommet7:=G;
    Sommet8:=H;
    NF:=6;
    Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2;
    Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8;
    Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3;
    Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7;
    Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5;
    Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6;
    CoulTrace:=gris;
    DessineObjet;
    drawoptions(withcolor gris);
    draw codeperp(B,A,E,5);
    draw codeperp(A,B,F,5);
    draw codeperp(H,D,C,5);
    draw codeperp(D,C,G,5);
    drawoptions();
    draw polygone(A,B,C,D);
    draw hachurage(polygone(A,B,C,D),60,0.3,0);
    draw segment(A,E);
    draw appelation(A,E,3mm,btex hauteur etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,115);
    color A,B,C,D,E,F,G,H;
    D=(0.75,0,0);
    G=(0,1,0);
    H=(0,0,0);
    A-D=(0,0,0.5);
    C-D=G-H;
    E-H=A-D;
    F-E=(0,0.6,0);
    B-A=F-E;
    NbS:=8;
    Sommet1:=A;
    Sommet2:=B;
    Sommet3:=C;
    Sommet4:=D;
    Sommet5:=E;
    Sommet6:=F;
    Sommet7:=G;
    Sommet8:=H;
    NF:=6;
    Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2;
    Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8;
    Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3;
    Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7;
    Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5;
    Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6;
    CoulTrace:=gris;
    DessineObjet;
    drawoptions(withcolor gris);
    draw codeperp(B,A,E,5);
    draw codeperp(A,B,F,5);
    draw codeperp(H,D,C,5);
    draw codeperp(D,C,G,5);
    drawoptions();
    draw polygone(A,B,C,D);
    draw hachurage(polygone(A,B,C,D),60,0.3,0);
    draw segment(A,E);
    draw appelation(A,E,3mm,btex hauteur etex);
  \end{mpost}
  \fi
}

\def\MPFigureCylindre{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,20,\useKV[ClesFormule]{EchelleEspace});
    color O,O',A,A',B,B',C,C';
    O=(0,0,0);
    O'-O=(0,0,1);
    A-O=(0,1,0);
    A'-A=O'-O;
    C=symetrie(A,O);
    C'-C=O'-O;
    B-O=(-1/2,0,0);
    B'-B=O'-O;
    path cc,cd;
    cc=cercles(O,A,O,A,B);
    cd=cercles(O',A',O',A',B');
    draw cd;
    draw segment(C,C');
    draw segment(A,A');
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw segment(O,A);
    draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex);
    draw appelation(O,A,2mm,btex rayon $r$ etex);
    marque_p:="croix";
    pointe(O);
    marque_p:="non";
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,20,70);
    color O,O',A,A',B,B',C,C';
    O=(0,0,0);
    O'-O=(0,0,1);
    A-O=(0,1,0);
    A'-A=O'-O;
    C=symetrie(A,O);
    C'-C=O'-O;
    B-O=(-1/2,0,0);
    B'-B=O'-O;
    path cc,cd;
    cc=cercles(O,A,O,A,B);
    cd=cercles(O',A',O',A',B');
    draw cd;
    draw segment(C,C');
    draw segment(A,A');
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw segment(O,A);
    draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex);
    draw appelation(O,A,2mm,btex rayon $r$ etex);
    marque_p:="croix";
    pointe(O);
    marque_p:="non";
  \end{mpost}
  \fi
}

\def\MPFigureCone{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace});
    color O,O',A,B,C;
    O=(0,0,0);
    O'-O=(0,0,1.5);
    A-O=(0,1,0);
    C=symetrie(A,O);
    B-O=(-1/2,0,0);
    path cc;
    cc=cercles(O,A,O,A,B);
    draw chemin(C,O',A);
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw chemin(O',O,A);
    draw appelation(O,O',2mm,btex hauteur etex);
    draw appelation(O,A,1mm,btex rayon $r$ etex);
    marque_p:="croix";
    pointe(O);
    marque_p:="non";
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,0,10,70);
    color O,O',A,B,C;
    O=(0,0,0);
    O'-O=(0,0,1.5);
    A-O=(0,1,0);
    C=symetrie(A,O);
    B-O=(-1/2,0,0);
    path cc;
    cc=cercles(O,A,O,A,B);
    draw chemin(C,O',A);
    draw (subpath(0,length cc/2) of cc) dashed evenly;
    draw subpath(length cc/2,length cc) of cc;
    draw chemin(O',O,A);
    draw appelation(O,O',2mm,btex hauteur etex);
    draw appelation(O,A,1mm,btex rayon $r$ etex);
    marque_p:="croix";
    pointe(O);
    marque_p:="non";
  \end{mpost}
  \fi
}

\def\MPFigurePyramide{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    u:=0.5cm;
    z0=(-0.5,0)*u;
    z1=(2.5,0.5)*u;
    z2=(4,2)*u;
    z3=(-0.5,2.75)*u;
    z4=(-3,1.5)*u;
    z5=(0.5,6)*u;
    z6=(0.5,1.5)*u;
    z7=z6 shifted (5u,0);
    draw z5--z0 withcolor gris;
    draw z5--z1 withcolor gris;
    draw z5--z2 withcolor gris;
    draw z5--z4 withcolor gris;
    draw z5--z3 dashed evenly withcolor gris;
    draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0);
    remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white;
    draw z4--z0--z1--z2;
    draw z2--z3--z4 dashed evenly;
    draw z5--z6 dashed evenly;
    draw codeperp(z7,z6,z5,8);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    Figure(-10u,-10u,10u,10u);
    u:=0.5cm;
    z0=(-0.5,0)*u;
    z1=(2.5,0.5)*u;
    z2=(4,2)*u;
    z3=(-0.5,2.75)*u;
    z4=(-3,1.5)*u;
    z5=(0.5,6)*u;
    z6=(0.5,1.5)*u;
    z7=z6 shifted (5u,0);
    draw z5--z0 withcolor gris;
    draw z5--z1 withcolor gris;
    draw z5--z2 withcolor gris;
    draw z5--z4 withcolor gris;
    draw z5--z3 dashed evenly withcolor gris;
    draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0);
    remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white;
    draw z4--z0--z1--z2;
    draw z2--z3--z4 dashed evenly;
    draw z5--z6 dashed evenly;
    draw codeperp(z7,z6,z5,8);
  \end{mpost}
  \fi
}

\def\MPFigureCube{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    drawoptions( dashed dashpattern(on1cm));
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,80);
    color A,B,C,D,E,F,G,H;
    draw Cube(A,B,C,D,E,F,G,H) withcolor gris;
    draw segment(E,H);
    draw appelation(E,H,2mm,btex $a$ etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-10u,-10u,10u,10u);
    Initialisation(5,30,20,80);
    color A,B,C,D,E,F,G,H;
    draw Cube(A,B,C,D,E,F,G,H) withcolor gris;
    draw segment(E,H);
    draw appelation(E,H,2mm,btex $a$ etex);
  \end{mpost}
  \fi
}

\def\MPFigureLosange{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=rotation(B,A,40);
    C-D=B-A;
    draw polygone(A,B,C,D);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $c$ etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=rotation(B,A,40);
    C-D=B-A;
    draw polygone(A,B,C,D);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $c$ etex);
  \end{mpost}
  \fi
}

\def\MPFigureLosangeAire{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=rotation(B,A,40);
    C-D=B-A;
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(A,C);
    draw segment(B,D);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(2,0.5);
    D=rotation(B,A,40);
    C-D=B-A;
    draw polygone(A,B,C,D) withcolor gris;
    draw segment(A,C);
    draw segment(B,D);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,B,C,C,D,D,A,2);
    marque_s:=marque_s*3;
  \end{mpost}
  \fi
}

\def\MPFigureRectangle{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(3,0);
    C=2/3[B,rotation(A,B,-90)];
    D-C=A-B;
    draw polygone(A,B,C,D);
    draw codeperp(A,B,C,5);
    draw codeperp(B,C,D,5);
    draw codeperp(C,D,A,5);
    draw codeperp(D,A,B,5);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,C,D,2);
    draw Codelongueur(A,D,C,B,5);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $L$ etex);
    label.lft(btex $\ell$ etex,iso(A,D));
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    pair A,B,C,D;
    A=u*(1,1);
    B-A=u*(3,0);
    C=2/3[B,rotation(A,B,-90)];
    D-C=A-B;
    draw polygone(A,B,C,D);
    draw codeperp(A,B,C,5);
    draw codeperp(B,C,D,5);
    draw codeperp(C,D,A,5);
    draw codeperp(D,A,B,5);
    marque_s:=marque_s/3;
    draw Codelongueur(A,B,C,D,2);
    draw Codelongueur(A,D,C,B,5);
    marque_s:=marque_s*3;
    draw appelation(A,B,-3mm,btex $L$ etex);
    label.lft(btex $\ell$ etex,iso(A,D));
  \end{mpost}
  \fi
}

\def\MPFigureTriangle{%
    \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(1,1);
    B-A=u*(3,0);
    C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    draw polygone(A,B,C);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(1,1);
    B-A=u*(3,0);
    C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    draw polygone(A,B,C);
  \end{mpost}
  \fi
}

\def\MPFigureCercle{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(2.5,2.5);
    path cc;
    cc=cercles(A,1.25u);
    B=pointarc(cc,195);
    C=symetrie(B,A);
    draw cc withcolor gris;
    draw segment(B,C);
    marque_p:="croix";
    pointe(A);
    draw appelation(B,C,3mm,btex diam\`etre etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(2.5,2.5);
    path cc;
    cc=cercles(A,1.25u);
    B=pointarc(cc,195);
    C=symetrie(B,A);
    draw cc withcolor gris;
    draw segment(B,C);
    marque_p:="croix";
    pointe(A);
    draw appelation(B,C,3mm,\btex diam\`etre etex);
  \end{mpost}
  \fi
}

\def\MPFigureDisque{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(2.5,2.5);
    path cc;
    cc=cercles(A,1.25u);
    B=pointarc(cc,195);
    C=symetrie(B,A);
    draw cc withcolor gris;
    draw segment(A,C);
    marque_p:="croix";
    pointe(A);
    draw appelation(A,C,3mm,btex rayon $r$ etex);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C;
    A=u*(2.5,2.5);
    path cc;
    cc=cercles(A,1.25u);
    B=pointarc(cc,195);
    C=symetrie(B,A);
    draw cc withcolor gris;
    draw segment(A,C);
    marque_p:="croix";
    pointe(A);
    draw appelation(A,C,3mm,\btex rayon $r$ etex);
  \end{mpost}
  \fi
}

\def\MPFigureTriangleAire{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
u:=\useKV[ClesFormule]{Echelle};
    drawoptions( dashed dashpattern(on1cm));
    pair A,B,C,H,I,J;
    A=u*(0.5,1);
    B-A=u*(1.4,0);
    C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    H=projection(C,A,B);
    I=projection(A,B,C);
    J=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(C,H);
    draw segment(A,B);
    draw codeperp(C,H,B,5);
    drawoptions();
    A:=A+u*(2.5,0);
    B:=A+u*(1.4,0);
    C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    I:=projection(A,B,C);
    J:=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(A,I);
    draw segment(C,B);
    draw codeperp(A,I,B,5);
    drawoptions();
    A:=A-u*(1.25,1);
    B:=A+u*(1.4,0);
    C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    J:=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(B,J);
    draw segment(C,A);
    draw codeperp(B,J,C,5);
    drawoptions();
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}]
    Figure(-5u,-5u,5u,5u);
    pair A,B,C,H,I,J;
    A=u*(0.5,1);
    B-A=u*(1.4,0);
    C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    H=projection(C,A,B);
    I=projection(A,B,C);
    J=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(C,H);
    draw segment(A,B);
    draw codeperp(C,H,B,5);
    drawoptions();
    A:=A+u*(2.5,0);
    B:=A+u*(1.4,0);
    C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    I:=projection(A,B,C);
    J:=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(A,I);
    draw segment(C,B);
    draw codeperp(A,I,B,5);
    drawoptions();
    A:=A-u*(1.25,1);
    B:=A+u*(1.4,0);
    C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45));
    J:=projection(B,C,A);
    draw polygone(A,B,C) withcolor gris;
    drawoptions();
    draw segment(B,J);
    draw segment(C,A);
    draw codeperp(B,J,C,5);
    drawoptions();
  \end{mpost}
  \fi
}%

\newcommand\Formule[1][]{%
  \useKVdefault[ClesFormule]%
  \setKV[ClesFormule]{#1}%
  \setlength{\RoundedBoxWidth}{\useKV[ClesFormule]{Largeur}}%
  \xdef\ColorFill{\useKV[ClesFormule]{Couleur}}%
  \ifboolKV[ClesFormule]{Perimetre}{%
    \begin{tikzpicture}[remember picture, overlay]
      \node[draw,fill=\ColorFill,dashed,rounded corners,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}%
          \IfStrEqCase{\useKV[ClesFormule]{Surface}}{%
            {carre}{\begin{center}
                \MPFigureCarre\par
                P\'erim\`etre d'un carr\'e :\par$4\times c$
              \end{center}}%
            {polygone}{%
              \begin{center}
                \MPFigurePolygone\par
                P\'erim\`etre d'un polygone : \par$\text{Somme des c\^ot\'es}$
              \end{center}
            }%
            {rectangle}{%
              \begin{center}
                \MPFigureRectangle\par
                P\'erim\`etre d'un rectangle : \par$2\times(L+\ell)$
              \end{center}
              }%
              {losange}{%
                \begin{center}
                \MPFigureLosange\par
                P\'erim\`etre d'un losange : \par$4\times c$
              \end{center}
              }%
            {triangle}{%
              \begin{center}
                \MPFigureTriangle\par
                P\'erim\`etre d'un triangle : \par Somme des c\^ot\'es
              \end{center}
            }%
            {cercle}{%
              \begin{center}
                \MPFigureCercle\par
                P\'erim\`etre d'un cercle : \par$\pi\times\text{diam\`etre}$
              \end{center}
            }%
            {parallelogramme}{%
              \begin{center}
                \MPFigureParallelogramme\par
                P\'erim\`etre d'un parall\'elogramme : \par Somme des c\^ot\'es
              \end{center}
            }}
        \end{minipage}};
    \end{tikzpicture}
  }{\ifboolKV[ClesFormule]{Aire}{%
      \begin{tikzpicture}[remember picture, overlay]
        \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}%
            \IfStrEqCase{\useKV[ClesFormule]{Surface}}{%
              {carre}{\begin{center}
                  \MPFigureCarre\par
                  Aire d'un carr\'e :\par$c\times c$
              \end{center}}%
            {rectangle}{%
              \begin{center}
                  \MPFigureRectangle\par
                  Aire d'un rectangle :\par$L\times\ell$
              \end{center}
              }%
              {losange}{%
                \begin{center}
                  \MPFigureLosangeAire\par
                  Aire d'un losange :\par$\dfrac{\text{grande diagonale}\times\text{petite diagonale}}{2}$
              \end{center}
              }%
            {triangle}{%
              \begin{center}
                \MPFigureTriangleAire\par\vspace{1em}\par
                Aire d'un triangle : $\displaystyle\frac{\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}}{2}$
              \end{center}
            }%
            {disque}{%
              \begin{center}
                \MPFigureDisque\par
                Aire d'un disque :\par$\pi\times r\times r$
              \end{center}
            }%
            {parallelogramme}{%
              \begin{center}
                \MPFigureParallelogrammeAire\par
                Aire d'un parall\'elogramme : $\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}$
                \end{center}
            }
            {sphere}{%
              \begin{center}
                \MPFigureSphere\par
                Aire d'une sph\`ere : $4\times\pi\times r^2$
              \end{center}
            }}
        \end{minipage}};
    \end{tikzpicture}
    }{%Volume
      \begin{tikzpicture}[remember picture, overlay]
        \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}%
            \IfStrEqCase{\useKV[ClesFormule]{Solide}}{%
              {boule}{\begin{center}
                \MPFigureSphere\par
                Volume d'une boule : $\dfrac{4\times\pi\times r^3}{3}$
              \end{center}}%
            {cube}{%
              \begin{center}
                \MPFigureCube\par
                Volume d'une cube : $a^3\quad(a\times a\times a)$
              \end{center}
            }%
              {pave}{%
                \begin{center}
                  \MPFigurePave\par
                  Volume d'un pav\'e droit : $\ell\times h\times p$
              \end{center}
              }
              {prisme}{%
                \begin{center}
                  \MPFigurePrisme\par
                  Volume d'un prisme droit : $\text{Aire de la base}\times\mbox{hauteur}$
                \end{center}
              }
              {cylindre}{%
                \begin{center}
                  \MPFigureCylindre\par
                  Volume d'un cylindre de r\'evolution : $\pi\times r^2\times h$
                \end{center}
              }
              {pyramide}{%
                \begin{center}
                  \MPFigurePyramide\par
                  Volume d'une pyramide : $\dfrac{\text{Aire de la base}\times\text{hauteur}}{3}$
                \end{center}
              }
              {cone}{%
                \begin{center}
                  \MPFigureCone\par
                  Volume d'un c\^one de r\'evolution : $\displaystyle\dfrac{\pi\times r^2\times h}{3}$
                \end{center}
              }
              }
          \end{minipage}};
      \end{tikzpicture}
    }
  }
}

%%%
% Proba
%%%
\setKVdefault[ClesProba]{Echelle=false,Arbre=false,Branche=2,Angle=60,Rayon=0.25,LongueurEchelle=5,Affichage=0,Grille=1,Incline}

\def\Updatetoksproba#1/#2\nil{\addtotok\toklistepointproba{"#1","\footnotesize #2",}}
\def\Updatetoksprobapdf#1/#2\nil{\addtotok\toklistepointproba{"#1","\noexpand\footnotesize #2",}}
\def\Updatetoksprobaechelle#1/#2/#3\nil{\addtotok\toklistepointproba{#1,#2,"#3",}}

\newtoks\toklistepointproba

% Pour construire l'arbre de probabilit\'e
\def\buildarbreproba{%
  \toklistepointproba{}%
  \ifluatex
  \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksproba\compteur\nil}%
  \else
  \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobapdf\compteur\nil}%
  \fi
  \MPArbreProba{\useKV[ClesProba]{Branche}}{\useKV[ClesProba]{Angle}}{\the\toklistepointproba}{\useKV[ClesProba]{Rayon}}%
}%

% Pour construire l'\'echelle de probabilit\'e
\def\buildechelleproba{%
  \toklistepointproba{}%
  \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobaechelle\compteur\nil}%
  \MPEchelleProbaUn{\useKV[ClesProba]{LongueurEchelle}}{\the\toklistepointproba}{\useKV[ClesProba]{Affichage}}{\useKV[ClesProba]{Grille}}%
}

\def\MPEchelleProbaUn#1#2#3#4{%
  % #1:longueur du segment repr\'esentant l'\'echelle
  % #2:Liste des \'ev\`enements/proba
  % #3: pour l'affichage des labels (0 : rien, 1: fleches, 2 : fleches+ev\`enements, 3: fleches+proba, 4 : tout)
  % #4 : dimension de "la grille" associ\'ee
  \ifluatex
  \begin{mplibcode}
    pair A,B,C[],D[];%les noeuds de l'arbre
    %Figure(-10u,-10u,10u,10u);
    A=u*(1,1);
    B-A=u*(#1,0);
    draw segment(A,B);
    draw marquesegment(A,B);
    marque_s:=marque_s/2;
    if #4>1:
      for k=0 upto (#4-1):
        D[k]=(k/#4)[A,B];
      endfor;
      if (#4 mod 2)=0:
        for k=0 step 2 until (#4-1):
          draw marquesegment(D[k],D[k+1]);
        endfor;
      else:
        for k=1 step 2 until (#4-1):
          draw marquesegment(D[k],D[k+1]);
        endfor;
      fi;
    fi;
    marque_s:=marque_s*2;
    labeloffset:=labeloffset*3;
    label.bot(btex 0 etex,A);
    label.bot(btex 1 etex,B);
    labeloffset:=labeloffset/3;
    n:=1;%compter les informations
    k:=1;% compter les informations noeud pour les placer
    vardef toto(text t)=
      for p_=t:
        if (n mod 3)=1:
          num:=p_;
        fi;
        if (n mod 3)=2:
        deno:=p_;
        fi;
        if (n mod 3=0):
          C[k]=(num/deno)[A,B];
          if (#3>0):
          drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15));
          fi;
          if (#3=2) or (#3=4):
            dotlabel.top(TEX(p_),C[k]);
          fi;
          if (#3=1) or (#3=3):
            dotlabel.top("",C[k]);
          fi;
          if (#3>2):
            label.bot(TEX("$\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5));
          fi;
          k:=k+1;
        fi;
      n:=n+1;
      endfor;
    enddef;
    toto(#2);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCGeometrie;}]
    pair A,B,C[],D[];%les noeuds de l'arbre
    Figure(-10u,-10u,10u,10u);
    A=u*(1,1);
    B-A=u*(#1,0);
    draw segment(A,B);
    draw marquesegment(A,B);
    marque_s:=marque_s/2;
    if #4>1:
      for k=0 upto (#4-1):
        D[k]=(k/#4)[A,B];
      endfor;
      if (#4 mod 2)=0:
        for k=0 step 2 until (#4-1):
          draw marquesegment(D[k],D[k+1]);
        endfor;
      else:
        for k=1 step 2 until (#4-1):
          draw marquesegment(D[k],D[k+1]);
        endfor;
      fi;
    fi;
    marque_s:=marque_s*2;
    labeloffset:=labeloffset*3;
    label.bot(btex 0 etex,A);
    label.bot(btex 1 etex,B);
    labeloffset:=labeloffset/3;
    n:=1;%compter les informations
    k:=1;% compter les informations noeud pour les placer
    vardef toto(text t)=
      for p_=t:
        if (n mod 3)=1:
          num:=p_;
        fi;
        if (n mod 3)=2:
        deno:=p_;
        fi;
        if (n mod 3=0):
          C[k]=(num/deno)[A,B];
          if (#3>0):
          drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15));
          fi;
          if (#3=2) or (#3=4):
            dotlabel.top(LATEX(p_),C[k]);
          fi;
          if (#3=1) or (#3=3):
            dotlabel.top("",C[k]);
          fi;
          if (#3>2):
            label.bot(LATEX("$\noexpand\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5));%Le \noexpand est n\'ecessaire pour \'eviter un probl\`eme \`a la compilation, dû \`a l'expansion du \frac par gmp.
          fi;
          k:=k+1;
        fi;
      n:=n+1;
      endfor;
    enddef;
    toto(#2);
  \end{mpost}
  \fi
}

\def\MPArbreProba#1#2#3#4{%
  % #1:longueur d'une branche
  % #2:angle entre deux branches de m\^eme origine
  % #3:Liste des \'ev\`enements/proba
  \ifluatex
  \begin{mplibcode}
    boolean Incline;
    Incline=\useKV[ClesProba]{Incline};
    pair A[],B[];%les noeuds de l'arbre
    A0=u*(1,1);
    B0-A0=u*(#1,0);
    A1=rotation(B0,A0,#2/2);
    A2=rotation(B0,A0,-#2/2);
    B1-A1=B0-A0;
    A3=rotation(B1,A1,#2/3);
    A4=rotation(B1,A1,-#2/3);
    B2-A2=B0-A0;
    A5=rotation(B2,A2,#2/3);
    A6=rotation(B2,A2,-#2/3);
    draw segment(A4,A1);
    draw segment(A5,A2);
    draw chemin(A3,A1,A0,A2,A6);
    for k=1 upto 6:
    fill cercles(A[k],#4*cm) withcolor white;
    endfor;
    n:=1;%compter les informations
    k:=1;% compter les informations noeud pour les placer
    l:=1;% compter les informations "num\'eriques"
    vardef toto(text t)=
    for p_=t:
    if (n mod 2)=1:
    if p_<>"":
    label(TEX(p_),A[k]);
    fi;
    k:=k+1;
    else:
    if (l mod 2)=1:
    if p_<>"":
    if Incline:
    draw appelation(A[(l-1) div 2],A[l],4mm,TEX(p_));
    else:
    label.ulft(TEX(p_),iso(A[(l-1) div 2],A[l]));
    fi;
    fi;
    else:
    if p_<>"":
    if Incline:
    draw appelation(A[(l-1) div 2],A[l],-4mm,TEX(p_));
    else:
    label.llft(TEX(p_),iso(A[(l-1) div 2],A[l]));
    fi;
    fi;
    fi;
    l:=l+1;
    fi;
    n:=n+1;
    endfor;
    enddef;
    toto(#3);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={%input PfCGeometrie;
      boolean Incline; Incline=\useKV[ClesProba]{Incline};}]
    pair A[],B[];%les noeuds de l'arbre
    %Figure(-10u,-10u,10u,10u);
    A0=u*(1,1);
    B0-A0=u*(#1,0);
    A1=rotation(B0,A0,#2/2);
    A2=rotation(B0,A0,-#2/2);
    B1-A1=B0-A0;
    A3=rotation(B1,A1,#2/3);
    A4=rotation(B1,A1,-#2/3);
    B2-A2=B0-A0;
    A5=rotation(B2,A2,#2/3);
    A6=rotation(B2,A2,-#2/3);
    draw segment(A4,A1);
    draw segment(A5,A2);
    draw chemin(A3,A1,A0,A2,A6);
    for k=1 upto 6:
    fill cercles(A[k],#4*cm) withcolor white;
    endfor;
    n:=1;%compter les informations
    k:=1;% compter les informations noeud pour les placer
    l:=1;% compter les informations "num\'eriques"
    vardef toto(text t)=
    for p_=t:
    if (n mod 2)=1:
    if p_<>"":
    label(LATEX(p_),A[k]);
    fi;
    k:=k+1;
    else:
    if (l mod 2)=1:
    if p_<>"":
    if Incline:
    draw appelation(A[(l-1) div 2],A[l],4mm,LATEX(p_));
    else:
    label.ulft(LATEX(p_),iso(A[(l-1) div 2],A[l]));
    fi;
    fi;
    else:
    if p_<>"":
    if Incline:
    draw appelation(A[(l-1) div 2],A[l],-4mm,LATEX(p_));
    else:
    label.llft(LATEX(p_),iso(A[(l-1) div 2],A[l]));
    fi;
    fi;
    fi;
    l:=l+1;
    fi;
    n:=n+1;
    endfor;
    enddef;
    toto(#3);
  \end{mpost}
  \fi
}

\newcommand\Proba[2][]{%
  \useKVdefault[ClesProba]%
  \setKV[ClesProba]{#1}%
  % On liste les diff\'erents \'el\'ements sous la forme Ev\`enement/proba
  \setsepchar[*]{,*/}\ignoreemptyitems%
  \readlist*\ListeProba{#2}%
  \ifboolKV[ClesProba]{Echelle}{%
    \buildechelleproba%
  }{\ifboolKV[ClesProba]{Arbre}{%
      \buildarbreproba%
    }{}%
  }%
  \setsepchar{,}%
}%

%%%
% Reperage
%%%
\setKVdefault[ClesReperage]{Unitex=1,Pasx=1,Unitey=1,Pasy=1,Unitez=1,Pasz=1,DemiDroite=false,Droite=false,Plan=false,Trace=false,ListeSegment={},Espace=false,Sphere=false,AnglePhi=30,CouleurLa=white,CouleurLon=Tomato,AffichageNom=false,AffichageGrad=false,AffichageAbs=0,AffichageCoord=false,LectureCoord=false,ValeurUnitex=1,ValeurUnitey=1,ValeurOrigine=0,NomOrigine=O,EchelleEspace=50,CouleurCoord=black,Thermometre=false,Mercure=false,CouleurMercure=black,Celsius,Kelvin=false,Farenheit=false,ValeurMin=-4000,ValeurMax=4000,Etages=4}
% ValeurOrigine permet de faire des morceaux de demi-droite gradu\'ee en passant par droite :)

\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}}
\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}}
\def\Updatetoksdemidroite#1/#2\nil{\addtotok\toklistenompointdemidroite{"#2",}}
\def\Updatetoksrepere#1/#2/#3\nil{\addtotok\toklistepointrepere{#1,#2,"#3",}}
\def\Updatetoksespace#1/#2/#3/#4\nil{\addtotok\toklistepointespace{#1,#2,#3,"#4",}}

\newtoks\toklistepointrepere%
\newtoks\toklistepointdroite%
\newtoks\toklistepointdemidroite%
\newtoks\toklistenompointdemidroite%
\newtoks\toklistepointespace%

% Pour construire le rep\`ere de l'espace
\def\buildespace{%
  \toklistepointespace{}%
  \ifboolKV[ClesReperage]{Sphere}{%
    \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksrepere\compteur\nil}%
    \[\MPEspaceSphere{\the\toklistepointrepere}{\useKV[ClesReperage]{EchelleEspace}}\]
  }{%
    \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksespace\compteur\nil}%
    \ifboolKV[ClesReperage]{AffichageNom}{%
      \ifboolKV[ClesReperage]{AffichageCoord}{%
        \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{3}{\useKV[ClesReperage]{EchelleEspace}}\]%
      }{%
        \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{2}{\useKV[ClesReperage]{EchelleEspace}}\]%
      }%
    }{%
      \ifboolKV[ClesReperage]{AffichageCoord}{%
        \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{1}{\useKV[ClesReperage]{EchelleEspace}}\]%
      }{%
        \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{0}{\useKV[ClesReperage]{EchelleEspace}}\]%
      }%
    }%
  }%
}%

\def\MPEspaceSphere#1#2{%
  \ifluatex
  \begin{mplibcode}
    typetrace:="3D";
    typerepre:="persp";
    anglephi:=\useKV[ClesReperage]{AnglePhi};
    Initialisation(1500,anglephi,10,#2);
    color O,A,B,C,D,Z,M[];
    O=(0,0,0);
    A=(cosd(anglephi+90),sind(anglephi+90),0);
    B=(cosd(anglephi+180),sind(anglephi+180),0);
    C=(1,0,0);
    D=(0,1,0);
    Z=(0,0,1);
    trace cercles(O,A,O,A,Z) withcolor 0.7white;
    path Equateur;
    Equateur=cercles(O,C,O,C,D);
    trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white;
    trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white;
    path greenwich;
    greenwich=cercles(O,C,O,C,Z);
    trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich  withcolor 0.7white;
    clip currentpicture to cercles(O,A,O,A,Z);
    trace chemin(C,O,Z) dashed evenly withcolor 0.85white;
    trace chemin(O,2[Z,O])  dashed evenly withcolor 0.85white;

    vardef toto(text t)=
    n:=1;
    for p_=t:
    if (n mod 3)=1:
    k:=p_;
    fi;
    if (n mod 3)=2:
    l:=p_;
    fi;
    if (n mod 3)=0:
      M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l));
      path Codageun,Codagedeux;
      if k>0:
        Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0));
      elseif k<0:
        Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0));
      fi;
      if l>0:
        Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]);
      elseif l<0:
        Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]);
      fi;
    %%%% if l>0:
    %%%fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa};
    %%%fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon};
    %%%else:
    %%%fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa};
    %%%fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon};
    %%%fi;
      if unknown Codageun: else: trace Codageun; fi;
      if unknown Codagedeux: else: trace Codagedeux; fi;
      if \useKV[ClesReperage]{AffichageCoord}:
        picture CodageUn,CodageDeux;
        CodageUn=image(
          if k>0:
            label.bot(TEX("\scriptsize\ang{"&decimal(k)&"} E"),(0,0));
          else:
            label.bot(TEX("\scriptsize\ang{"&decimal(abs(k))&"} O"),(0,0));
          fi;
        );
        CodageDeux=image(
        if k>0:
          label.rt(TEX("\scriptsize\ang{"&decimal(l)&"} N"),(0,0));
        else:
          label.lft(TEX("\scriptsize\ang{"&decimal(abs(l))&"} S"),(0,0));
        fi;
        );
        fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc;
        trace CodageUn shifted (point(0.5*length Codageun) of Codageun);
        fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc;
        trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux);
      fi;
    trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5;
    trace chemin(O,M[n]) dashed withdots scaled 0.5;
    trace chemin(O,C) dashed withdots scaled 0.5;
    if \useKV[ClesReperage]{AffichageNom}:
    if l>0:dotlabel.top(p_,Projette(M[n]));
    else:
    dotlabel.bot(p_,Projette(M[n]));
    fi;
    fi;
    fi;
    n:=n+1;
    endfor;
    enddef;
    toto(#1);
    label.llft(btex \tiny \ang{0} etex,Projette(C));
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={boolean AffichageCoord; AffichageCoord=\useKV[ClesReperage]{AffichageCoord}; boolean AffichageNom; AffichageNom=\useKV[ClesReperage]{AffichageNom};anglephi:=\useKV[ClesReperage]{AnglePhi};}]
    typetrace:="3D";
    typerepre:="persp";
    Initialisation(1500,anglephi,10,#2);
    color O,A,B,C,D,Z,M[];
    O=(0,0,0);
    A=(cosd(anglephi+90),sind(anglephi+90),0);
    B=(cosd(anglephi+180),sind(anglephi+180),0);
    C=(1,0,0);
    D=(0,1,0);
    Z=(0,0,1);
    trace cercles(O,A,O,A,Z) withcolor 0.7white;
    path Equateur;
    Equateur=cercles(O,C,O,C,D);
    trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white;
    trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white;
    path greenwich;
    greenwich=cercles(O,C,O,C,Z);
    trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich  withcolor 0.7white;
    clip currentpicture to cercles(O,A,O,A,Z);
    trace chemin(C,O,Z) dashed evenly withcolor 0.85white;
    trace chemin(O,2[Z,O])  dashed evenly withcolor 0.85white;

    vardef toto(text t)=
    n:=1;
    for p_=t:
     if (n mod 3)=1:
     k:=p_;
    fi;
    if (n mod 3)=2:
    l:=p_;
    fi;
    if (n mod 3)=0:
    M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l));
    path Codageun,Codagedeux;
    if k>0:
    Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0));
    elseif k<0:
    Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0));
    fi;
    if l>0:
    Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]);
    elseif k<0:
    Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]);
    fi;
    %if l>0:
    %fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa};
    %fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon};
    %else:
    %fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa};
    %fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon};
    %fi;
    if unknown Codageun: else: trace Codageun; fi;
    if unknown Codagedeux: else: trace Codagedeux; fi;
    if AffichageCoord:
    picture CodageUn,CodageDeux;
    CodageUn=image(
    if k>0:
    label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(k)&"} E"),(0,0));
    else:
    label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(k))&"} O"),(0,0));
    fi;
    );
    CodageDeux=image(
    if k>0:
    label.rt(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(l)&"} N"),(0,0));
    else:
    label.lft(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(l))&"} S"),(0,0));
    fi;
    );
    fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc;
    trace CodageUn shifted (point(0.5*length Codageun) of Codageun);
    fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc;
    trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux);
    fi;
    trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5;
    trace chemin(O,M[n]) dashed withdots scaled 0.5;
    trace chemin(O,C) dashed withdots scaled 0.5;
    if AffichageNom:
    if l>0:dotlabel.top(p_,Projette(M[n]));
    else:
    dotlabel.bot(p_,Projette(M[n]));
    fi;
    fi;
    fi;
    n:=n+1;
    endfor;
    enddef;
    toto(#1);
    label.llft(LATEX("\noexpand\tiny\noexpand\ang{0}"),Projette(C));
  \end{mpost}
  \fi
}

\def\MPEspacePave#1#2#3#4#5#6#7#8#9{%
  \ifluatex
  \begin{mplibcode}
    typetrace:="3D";
    typerepre:="persp";
    Figure(-20u,-20u,20u,20u);
    Initialisation(1500,30,20,abs(#9));
    %marque_r:=marque_r/2;
    marque_p:="plein";
    color A,B,C,D,E,F,G,H,M[],N[];
    draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5);
    if #9>0:
    drawarrow Projette(A)--Projette(1.5[D,A]);
    drawarrow Projette(C)--Projette(1.5[D,C]);
    drawarrow Projette(E)--Projette(1.5[D,E]);
    label.bot(btex $x$ etex,Projette(1.5[D,A]));
    label.top(btex $y$ etex,Projette(1.5[D,C]));
    label.top(btex $z$ etex,Projette(1.5[D,E]));
    label.ulft(btex 1 etex,Projette((1/#2)[D,A]));
    label.bot(btex 1 etex,Projette((1/#4)[D,C]));
    label.lft(btex 1 etex,Projette((1/#6)[D,E]));
    for k=1 upto (#2):
    pointe((k/#2)[D,A]);
    endfor;
    for k=1 upto (#4):
    pointe((k/#4)[D,C]);
    endfor;
    for k=1 upto (#6):
    pointe((k/#6)[D,E]);
    endfor;
    else:
    drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly;
    drawarrow Projette(B)--Projette(1.5[A,B]);
    drawarrow Projette(F)--Projette(1.5[A,F]);
    label.lrt(btex $x$ etex,Projette(1.5[A,D]));
    label.top(btex $y$ etex,Projette(1.5[A,B]));
    label.top(btex $z$ etex,Projette(1.5[A,F]));
    label.ulft(btex 1 etex,Projette((1/#2)[A,D]));
    label.bot(btex 1 etex,Projette((1/#4)[A,B]));
    label.lft(btex 1 etex,Projette((1/#6)[A,F]));
    for k=1 upto (#2):
    pointe((k/#2)[A,D]);
    endfor;
    for k=1 upto (#4):
    pointe((k/#4)[A,B]);
    endfor;
    for k=1 upto (#6):
    pointe((k/#6)[A,F]);
    endfor;
    fi;
    vardef tata(text t)=
    n:=1;%pour compter combien de points
    k:=0;%pour garder l'abscisse
    l:=0;%pour garder l'ordonn\'ee
    m:=0;%pour garder l'altitude
    if #8>0:
    for p_=t:
    if (n mod 4)=1:
    k:=p_;
    fi;
    if (n mod 4)=2:
    l:=p_;
    fi;
    if (n mod 4)=3:
    m:=p_;
    fi;
    if (n mod 4)=0:
    M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D);
    N[n]=(k/#2)[D,A]+(l/#4)*(C-D);
    if (#8>1):
    label.top(TEX(p_),Projette(M[n]));
    pointe(M[n]);
    fi;
    if (#8=1) or (#8=3) :
    drawoptions(dashed evenly withcolor gris);
    draw segment(M[n],(0,0,bluepart(M[n])));
    draw segment(M[n],N[n]);
    draw segment(N[n],(redpart(M[n]),0,0));
    draw segment(N[n],(0,greenpart(M[n]),0));
    drawoptions();
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    vardef toto(text t)=
    n:=1;%pour compter combien de points
    k:=0;%pour garder l'abscisse
    l:=0;%pour garder l'ordonn\'ee
    m:=0;%pour garder l'altitude
    if #8>0:
    for p_=t:
    if (n mod 4)=1:
    k:=p_;
    fi;
    if (n mod 4)=2:
    l:=p_;
    fi;
    if (n mod 4)=3:
    m:=p_;
    fi;
    if (n mod 4)=0:
    % message("je suis ici : "&p_);
    M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A);
    N[n]=(k/#2)[A,D]+(l/#4)*(B-A);
    if (#8>1):
    label.top(TEX(p_),Projette(M[n]));
    pointe(M[n]);
    fi;
    if (#8=1) or (#8=3) :
    drawoptions(dashed evenly withcolor gris);
    draw segment(M[n],A+(0,0,bluepart(M[n])));
    draw segment(M[n],N[n]);
    draw segment(N[n],A+(l/#4)*(B-A));
    draw segment(N[n],A+(k/#2)*(D-A));
    drawoptions();
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    if #9>0:
    tata(#7);
    else:
    toto(#7);
    fi;
    draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCGeometrie;}]
    typetrace:="3D";
    typerepre:="persp";
    Figure(-20u,-20u,20u,20u);
    Initialisation(1500,30,20,abs(#9));
    %marque_r:=marque_r/2;
    marque_p:="plein";
    color A,B,C,D,E,F,G,H,M[],N[];
    draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5);
    if #9>0:
    drawarrow Projette(A)--Projette(1.5[D,A]);
    drawarrow Projette(C)--Projette(1.5[D,C]);
    drawarrow Projette(E)--Projette(1.5[D,E]);
    label.ulft(btex 1 etex,Projette((1/#2)[D,A]));
    label.bot(btex 1 etex,Projette((1/#4)[D,C]));
    label.lft(btex 1 etex,Projette((1/#6)[D,E]));
    for k=1 upto (#2):
    pointe((k/#2)[D,A]);
    endfor;
    for k=1 upto (#4):
    pointe((k/#4)[D,C]);
    endfor;
    for k=1 upto (#6):
    pointe((k/#6)[D,E]);
    endfor;
    else:
    drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly;
    drawarrow Projette(B)--Projette(1.5[A,B]);
    drawarrow Projette(F)--Projette(1.5[A,F]);
    label.ulft(btex 1 etex,Projette((1/#2)[A,D]));
    label.bot(btex 1 etex,Projette((1/#4)[A,B]));
    label.lft(btex 1 etex,Projette((1/#6)[A,F]));
    for k=1 upto (#2):
    pointe((k/#2)[A,D]);
    endfor;
    for k=1 upto (#4):
    pointe((k/#4)[A,B]);
    endfor;
    for k=1 upto (#6):
    pointe((k/#6)[A,F]);
    endfor;
    fi;
    vardef tata(text t)=
    n:=1;%pour compter combien de points
    k:=0;%pour garder l'abscisse
    l:=0;%pour garder l'ordonn\'ee
    m:=0;%pour garder l'altitude
    if #8>0:
    for p_=t:
    if (n mod 4)=1:
    k:=p_;
    fi;
    if (n mod 4)=2:
    l:=p_;
    fi;
    if (n mod 4)=3:
    m:=p_;
    fi;
    if (n mod 4)=0:
    M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D);
    N[n]=(k/#2)[D,A]+(l/#4)*(C-D);
    if (#8>1):
    label.top(LATEX(p_),Projette(M[n]));
    pointe(M[n]);
    fi;
    if (#8=1) or (#8=3) :
    drawoptions(dashed evenly withcolor gris);
    draw segment(M[n],(0,0,bluepart(M[n])));
    draw segment(M[n],N[n]);
    draw segment(N[n],(redpart(M[n]),0,0));
    draw segment(N[n],(0,greenpart(M[n]),0));
    drawoptions();
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    vardef toto(text t)=
    n:=1;%pour compter combien de points
    k:=0;%pour garder l'abscisse
    l:=0;%pour garder l'ordonn\'ee
    m:=0;%pour garder l'altitude
    if #8>0:
    for p_=t:
    if (n mod 4)=1:
    k:=p_;
    fi;
    if (n mod 4)=2:
    l:=p_;
    fi;
    if (n mod 4)=3:
    m:=p_;
    fi;
    if (n mod 4)=0:
    % message("je suis ici : "&p_);
    M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A);
    N[n]=(k/#2)[A,D]+(l/#4)*(B-A);
    if (#8>1):
    label.top(LATEX(p_),Projette(M[n]));
    pointe(M[n]);
    fi;
    if (#8=1) or (#8=3) :
    drawoptions(dashed evenly withcolor gris);
    draw segment(M[n],A+(0,0,bluepart(M[n])));
    draw segment(M[n],N[n]);
    draw segment(N[n],A+(l/#4)*(B-A));
    draw segment(N[n],A+(k/#2)*(D-A));
    drawoptions();
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    if #9>0:
    tata(#7);
    else:
    toto(#7);
    fi;
    draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5);
  \end{mpost}
  \fi
}%

% Pour construire le rep\`ere du plan
\def\buildreperenew{%
  \toklistepointrepere{}%
  \foreachitem\compteur\in\ListePointRepere{\expandafter\Updatetoksrepere\compteur\nil}%
  \ifboolKV[ClesReperage]{Trace}{%
    \[\MPPlanTrace{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\the\toklistepointrepere}{2}{\useKV[ClesReperage]{ValeurUnitex}}{\useKV[ClesReperage]{ValeurUnitey}}{\useKV[ClesReperage]{ListeSegment}}\]%
  }{%
    \xdef\AfficheNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{3}}{\xdef\AfficheNom{2}}}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{1}}{}}%
    \xdef\AfficheGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AfficheGrad{1}}{}%
    \xdef\AfficheCoord{\useKV[ClesReperage]{AffichageAbs}}%
    \MPPlannew{(\useKV[ClesReperage]{Unitex},\useKV[ClesReperage]{Pasx})}{(\useKV[ClesReperage]{Unitey},\useKV[ClesReperage]{Pasy})}{\the\toklistepointrepere}{\AfficheNom}{\AfficheCoord}{\AfficheGrad}{(\useKV[ClesReperage]{ValeurUnitex},\useKV[ClesReperage]{ValeurUnitey})}%
  }%
}

\def\MPPlannew#1#2#3#4#5#6#7{%
  %#1 : Unitex, pasx
  %#2 : unitey, pasy
  %#3 : liste de points
  %#4 : Affichage nom + lecture graphique
  %#5 : Affichage des (abscisses/ordonn\'ees)
  %#6 : Graduation compl\`ete ?
  %#7 : (unitex,unitey)
  \ifluatex
  \begin{mplibcode}
    maxx:=-4000;
    minx=4000;
    unitex:=(xpart(#1))*cm;
    pasx=ypart(#1);
    unitpx:=unitex/pasx;
    maxy:=-4000;
    miny:=4000;
    unitey:=(xpart(#2))*cm;
    pasy:=ypart(#2);
    unitpy:=unitey/pasy;
    n:=1;
    vardef toto(text t)=
    for p_=t:
    if (n mod 3)=1:
    if p_>maxx:
        maxx:=p_;
      fi;
      if p_<minx:
        minx:=p_;
      fi;
    fi;
    if (n mod 3)=2:
      if p_>maxy:
        maxy:=p_;
      fi;
      if p_<miny:
        miny:=p_;
      fi;
      fi;
      n:=n+1;
    endfor;
    maxx:=maxx+1;
    minx:=minx-1;
    if maxx<(ypart(#1)+1):
    maxx:=ypart(#1)+1;
    fi;
    if minx>(-ypart(#1)-1):
    minx:=-ypart(#1)-1;
    fi;
    maxy:=maxy+1;
    miny:=miny-1;
    if maxy<(ypart(#2)+1):
    maxy:=ypart(#2)+1;
    fi;
    if miny>(-ypart(#2)-1):
    miny:=-ypart(#2)-1;
    fi;
    enddef;
    toto(#3);
    Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy);
    pair A,B,C,D,E;
    A=(0,0);
    B=(minx*unitpx,0);
    C=(maxx*unitpx,0);
    D=(0,miny*unitpy);
    E=(0,maxy*unitpy);
    for k=0 upto (maxx-minx):
    draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris;
    endfor;
    for k=0 upto (maxy-miny):
    draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris;
    endfor;
    drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0));
    drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy));
    % graduation compl\`ete ou pas ?
    label.llft(btex \footnotesize 0 etex,A);
    if #6>0:
    for k=minx upto maxx:
    if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))):
    if k<>0:
    dotlabel.lrt(TEX("\footnotesize\num{"&decimal(k)&"}"),(k*unitex,0));
    fi;
    fi;
    endfor;
    for k=miny upto maxy:
    if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))):
    if k<>0:
    dotlabel.ulft(TEX("\footnotesize\num{"&decimal(k)&"}"),(0,k*unitey));
    fi;
    fi;
    endfor;
    else:
    dotlabel.lrt(TEX("\footnotesize\num{"&decimal(xpart(#7))&"}"),(unitex,0));
    dotlabel.ulft(TEX("\footnotesize\num{"&decimal(ypart(#7))&"}"),(0,unitey));
    fi;
    % apparition du nom des points ou pas
    m_c:=m_c*3;
    marque_p:="croix";
    vardef tata(text t)=%on place les points
    if #4>0:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if #4>1:
    if p_<>"":
    if (k>0) and (l>0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l>0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l=0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l>0):
    label.ulft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l<0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l<0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l=0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l<0):
    label.lrt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    pointe((k*unitpx,l*unitpy));
    fi;
    fi;
    if (#4=1) or (#4=3):
    draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly;
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    if #5=2:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if p_<>"":
        if (k mod pasx)<>0:
        label.lrt(TEX("\footnotesize$\frac{\num{"&decimal(k)&"}}{\num{"&decimal(pasx)&"}}$"),(k*unitpx,0));
        else:
        label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0));
        fi;
        if (l mod pasy)<>0:
        label.ulft(TEX("\footnotesize$\frac{\num{"&decimal(l)&"}}{\num{"&decimal(pasy)&"}}$"),(0,l*unitpy));
        else:
        label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy));
        fi;
      pointe((k*unitpx,0),(0,l*unitpy));
      fi;
    fi;
    n:=n+1;
    endfor;
    elseif #5=1:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if p_<>"":
    label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0));
    label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy));
    pointe((k*unitpx,0),(0,l*unitpy));
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    tata(#3);
  \end{mplibcode}
  \else
  \begin{mpost}
    maxx:=-4000;
    minx=4000;
    unitex:=(xpart(#1))*cm;
    pasx=ypart(#1);
    unitpx:=unitex/pasx;
    maxy:=-4000;
    miny:=4000;
    unitey:=(xpart(#2))*cm;
    pasy:=ypart(#2);
    unitpy:=unitey/pasy;
    n:=1;
    vardef toto(text t)=
    for p_=t:
    if (n mod 3)=1:
    if p_>maxx:
        maxx:=p_;
      fi;
      if p_<minx:
        minx:=p_;
      fi;
    fi;
    if (n mod 3)=2:
      if p_>maxy:
        maxy:=p_;
      fi;
      if p_<miny:
        miny:=p_;
      fi;
      fi;
      n:=n+1;
    endfor;
    maxx:=maxx+1;
    minx:=minx-1;
    if maxx<(ypart(#1)+1):
    maxx:=ypart(#1)+1;
    fi;
    if minx>(-ypart(#1)-1):
    minx:=-ypart(#1)-1;
    fi;
    maxy:=maxy+1;
    miny:=miny-1;
    if maxy<(ypart(#2)+1):
    maxy:=ypart(#2)+1;
    fi;
    if miny>(-ypart(#2)-1):
    miny:=-ypart(#2)-1;
    fi;
    enddef;
    toto(#3);
    Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy);
    pair A,B,C,D,E;
    A=(0,0);
    B=(minx*unitpx,0);
    C=(maxx*unitpx,0);
    D=(0,miny*unitpy);
    E=(0,maxy*unitpy);
    for k=0 upto (maxx-minx):
    draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris;
    endfor;
    for k=0 upto (maxy-miny):
    draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris;
    endfor;
    drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0));
    drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy));
    % graduation compl\`ete ou pas ?
    label.llft(btex \noexpand\footnotesize 0 etex,A);
    if #6>0:
    for k=minx upto maxx:
    if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))):
    if k<>0:
    dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(k*unitex,0));
    fi;
    fi;
    endfor;
    for k=miny upto maxy:
    if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))):
    if k<>0:
    dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(0,k*unitey));
    fi;
    fi;
    endfor;
    else:
    dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(xpart(#7))&"}"),(unitex,0));
    dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ypart(#7))&"}"),(0,unitey));
    fi;
    % apparition du nom des points ou pas
    m_c:=m_c*3;
    marque_p:="croix";
    vardef tata(text t)=%on place les points
    if #4>0:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if #4>1:
    if p_<>"":
    if (k>0) and (l>0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l>0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l=0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l>0):
    label.ulft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l<0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l<0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l=0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l<0):
    label.lrt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    pointe((k*unitpx,l*unitpy));
    fi;
    fi;
    if (#4=1) or (#4=3):
    draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly;
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    if #5=2:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if p_<>"":
        if (k mod pasx)<>0:
        label.lrt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(k)&"}}{\noexpand\num{"&decimal(pasx)&"}}$"),(k*unitpx,0));
        else:
        label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0));
        fi;
        if (l mod pasy)<>0:
        label.ulft(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(l)&"}}{\noexpand\num{"&decimal(pasy)&"}}$"),(0,l*unitpy));
        else:
        label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy));
        fi;
      pointe((k*unitpx,0),(0,l*unitpy));
      fi;
    fi;
    n:=n+1;
    endfor;
    elseif #5=1:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if p_<>"":
    label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0));
    label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy));
    pointe((k*unitpx,0),(0,l*unitpy));
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;
    tata(#3);
  \end{mpost}
  \fi
}

\def\MPPlanTrace#1#2#3#4#5#6#7#8#9{%
  \ifluatex
  \begin{mplibcode}
    maxx:=-4000;
  minx=4000;
  unitex:=#1*cm;
  pasx=#2;
  unitpx:=unitex/pasx;
  maxy:=-4000;
  miny:=4000;
  unitey:=#3*cm;
  pasy:=#4;
  unitpy:=unitey/pasy;
  n:=1;
  vardef toto(text t)=
    for p_=t:
    if (n mod 3)=1:
      if p_>maxx:
        maxx:=p_;
      fi;
      if p_<minx:
        minx:=p_;
      fi;
    fi;
    if (n mod 3)=2:
      if p_>maxy:
        maxy:=p_;
      fi;
      if p_<miny:
        miny:=p_;
      fi;
      fi;
      n:=n+1;
    endfor;
    maxx:=maxx+1;
    minx:=minx-1;
    if maxx<(#2+1):
    maxx:=#2+1;
    fi;
    if minx>(-#2-1):
    minx:=-#2-1;
    fi;
    maxy:=maxy+1;
    miny:=miny-1;
    if maxy<(#4+1):
    maxy:=#2+1;
    fi;
    if miny>(-#4-1):
    miny:=-#4-1;
    fi;
    enddef;
    toto(#5);
    Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy);
    pair A,B,C,D,E;
    A=(0,0);
    B=(minx*unitpx,0);
    C=(maxx*unitpx,0);
    D=(0,miny*unitpy);
    E=(0,maxy*unitpy);
    for k=0 upto (maxx-minx):
    draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris;
    endfor;
    for k=0 upto (maxy-miny):
    draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris;
    endfor;
    drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0));
    drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy));
    dotlabel.bot(TEX("\footnotesize\num{"&decimal(#7)&"}"),(unitex,0));
    dotlabel.lft(TEX("\footnotesize\num{"&decimal(#8)&"}"),(0,unitey));
    label.llft(btex 0 etex,A);
    % apparition du nom des points ou pas
    m_c:=m_c*3;
    marque_p:="croix";
        vardef tata(text t)=%on place les points
    if #6>0:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if #6>1:
    if (k>0) and (l>0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l>0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l=0):
    label.urt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l>0):
    label.ulft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l<0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l<0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l=0):
    label.llft(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l<0):
    label.lrt(TEX(p_),(k*unitpx,l*unitpy));
    fi;
    pointe((k*unitpx,l*unitpy));
    fi;
    if (#6=1) or (#6=3):
    draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly;
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;    
    vardef Tracage(text t)(text ls)=%on trace les segments
    pair A[];
    n:=0;%pour parcourir la liste
    m:=0;%pour lister les points par leur nombre
    for p_=t:
    n:=n+1;
    if (n mod 3)=1:
    k:=p_;
    fi;
    if (n mod 3)=2:
    l:=p_;
    fi;
    if (n mod 3)=0:
    m:=m+1;
    A[m]=(k*unitpx,l*unitpy);
    fi;
    endfor;
    for p_=ls:
    draw segment(A[p_ div 10],A[p_ mod 10]);
    endfor;
    enddef;
    tata(#5);
    Tracage(#5)(#9);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCGeometrie;}]
  maxx:=-4000;
  minx=4000;
  unitex:=#1*cm;
  pasx=#2;
  unitpx:=unitex/pasx;
  maxy:=-4000;
  miny:=4000;
  unitey:=#3*cm;
  pasy:=#4;
  unitpy:=unitey/pasy;
  n:=1;
  vardef toto(text t)=
    for p_=t:
    if (n mod 3)=1:
      if p_>maxx:
        maxx:=p_;
      fi;
      if p_<minx:
        minx:=p_;
      fi;
    fi;
    if (n mod 3)=2:
      if p_>maxy:
        maxy:=p_;
      fi;
      if p_<miny:
        miny:=p_;
      fi;
      fi;
      n:=n+1;
    endfor;
    maxx:=maxx+1;
    minx:=minx-1;
    if maxx<(#2+1):
    maxx:=#2+1;
    fi;
    if minx>(-#2-1):
    minx:=-#2-1;
    fi;
    maxy:=maxy+1;
    miny:=miny-1;
    if maxy<(#4+1):
    maxy:=#2+1;
    fi;
    if miny>(-#4-1):
    miny:=-#4-1;
    fi;
    enddef;
    toto(#5);
    Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy);
    pair A,B,C,D,E;
    A=(0,0);
    B=(minx*unitpx,0);
    C=(maxx*unitpx,0);
    D=(0,miny*unitpy);
    E=(0,maxy*unitpy);
    for k=0 upto (maxx-minx):
    draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris;
    endfor;
    for k=0 upto (maxy-miny):
    draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris;
    endfor;
    drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0));
    drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy));
    dotlabel.bot(LATEX("\noexpand\footnotesize\num{"&decimal(#7)&"}"),(unitex,0));
    dotlabel.lft(LATEX("\noexpand\footnotesize\num{"&decimal(#8)&"}"),(0,unitey));
    label.llft(btex 0 etex,A);
    % apparition du nom des points ou pas
    m_c:=m_c*3;
    marque_p:="croix";
        vardef tata(text t)=%on place les points
    if #6>0:
    n:=1;
    k:=0;%pour retenir la coordonn\'ee en x
    l:=0;%pour retenir la coordonn\'ee en y
    for p_=t:
        if (n mod 3)=1:
    if numeric p_:
    k:=p_;
    fi;
    fi;
    if (n mod 3)=2:
    if numeric p_:
    l:=p_;
    fi;
    fi;
    if (n mod 3)=0:
    if #6>1:
    if (k>0) and (l>0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l>0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l=0):
    label.urt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l>0):
    label.ulft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k=0) and (l<0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l<0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k<0) and (l=0):
    label.llft(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    if (k>0) and (l<0):
    label.lrt(LATEX(p_),(k*unitpx,l*unitpy));
    fi;
    pointe((k*unitpx,l*unitpy));
    fi;
    if (#6=1) or (#6=3):
    draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly;
    fi;
    fi;
    n:=n+1;
    endfor;
    fi;
    enddef;    
    vardef Tracage(text t)(text ls)=%on trace les segments
    pair A[];
    n:=0;%pour parcourir la liste
    m:=0;%pour lister les points par leur nombre
    for p_=t:
    n:=n+1;
    if (n mod 3)=1:
    k:=p_;
    fi;
    if (n mod 3)=2:
    l:=p_;
    fi;
    if (n mod 3)=0:
    m:=m+1;
    A[m]=(k*unitpx,l*unitpy);
    fi;
    endfor;
    for p_=ls:
    draw segment(A[p_ div 10],A[p_ mod 10]);
    endfor;
    enddef;
    tata(#5);
    Tracage(#5)(#9);
  \end{mpost}
  \fi
}

\def\MPNewDEMIGraduee#1#2{%
  % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires
  % #2 : liste des noms des points
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    maxx:=0;
    unitex:=\useKV[ClesReperage]{Unitex}*cm;
    pasx:=\useKV[ClesReperage]{Pasx};
    unitp:=unitex/pasx;%unit\'e de d\'eplacement
    ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex};
    ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine};
    AffichageGrad:=\AffichageGrad;
    AffichageCoord:=\useKV[ClesReperage]{AffichageAbs};
    AffichageNom:=\AffichageNom;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination de l'abscisse maximale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+1;
    if maxx<(pasx+1):
    maxx:=pasx+1;
    fi;
    % -----
    pair A,B;
    A=(0,0);
    B=unitp*(maxx,0);
    % On trace la demi-droite
    drawarrow A--(B+(0.75*unitp,0));
    % marquage secondaire
    marque_s:=marque_s/3;
    for k=0 step 2 until (maxx):
    draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
    endfor;
    drawoptions();
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-1):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    %% marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    dotlabel.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0));
    label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A);
    if AffichageGrad>0:
    for k=2 upto maxx:
    dotlabel.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(k)&"}}"),unitex*(k,0));
    endfor;
    fi;
    %%
    vardef tata(text t)=
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    label.top(TEX(p_),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    endfor;
    fi;
    if AffichageCoord=3:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \pointilles[2em] etex,(unitp*(valeur[n],-1)));
    fi;
    endfor;
    elseif AffichageCoord=2:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurOrigine*pasx)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    elseif AffichageCoord=1:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    fi;
    enddef;
    %----
    tata(#2);
    clip currentpicture to polygone(u*(-1,-1),((maxx+0.75)*unitp,-u),((maxx+0.75)*unitp,u),u*(-1,1));
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom;}]
    maxx:=0;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination de l'abscisse maximale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+1;
    if maxx<(pasx+1):
    maxx:=pasx+1;
    fi;
    % -----
    pair A,B;
    A=(0,0);
    B=unitp*(maxx,0);
    % On trace la demi-droite
    drawarrow A--(B+(0.75*unitp,0));
    % marquage secondaire
    marque_s:=marque_s/3;
    for k=0 step 2 until (maxx):
    draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
    endfor;
    drawoptions();
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-1):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    %% marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    dotlabel.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0));
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A);
    if AffichageGrad>0:
    for k=2 upto maxx:
    dotlabel.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(k)&"}}"),unitex*(k,0));
    endfor;
    fi;
    %%
    vardef tata(text t)=
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    label.top(LATEX(p_),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    endfor;
    fi;
    if AffichageCoord=3:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \noexpand\hbox to2em{\noexpand\pointilles[2em]} etex,(unitp*(valeur[n],-1)));
    %pointe(unitp*(valeur[n]-ValeurOrigine,0));
    fi;
    endfor;
    elseif AffichageCoord=2:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine*pasx)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    elseif AffichageCoord=1:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    fi;
    enddef;
    %----
    tata(#2);
    clip currentpicture to polygone(u*(-1,-1),((maxx+0.75)*unitp,-u),((maxx+0.75)*unitp,u),u*(-1,1));
  \end{mpost}
  \fi
}

\def\MPNewDROITEGraduee#1#2{%
  % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires
  % #2 : liste des noms des points
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    maxx:=0;
    minx:=4000;
    unitex:=\useKV[ClesReperage]{Unitex}*cm;
    pasx:=\useKV[ClesReperage]{Pasx};
    unitp:=unitex/pasx;%unit\'e de d\'eplacement
    ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex};
    ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine};
    AffichageGrad:=\AffichageGrad;
    AffichageCoord:=\useKV[ClesReperage]{AffichageAbs};
    AffichageNom:=\AffichageNom;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination des abscisses maximale et minimale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    if valeur[k]<minx:
    minx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+(pasx div 2);
    minx:=minx-(pasx div 2);
    if maxx<(pasx+1):
    maxx:=2*pasx-1;
    fi;
    if minx>(-pasx-1):
    minx:=-2*pasx-1;
    fi;
    if minx<\useKV[ClesReperage]{ValeurMin}:
    minx:=\useKV[ClesReperage]{ValeurMin};
    fi;
    if maxx>\useKV[ClesReperage]{ValeurMax}:
    maxx:=\useKV[ClesReperage]{ValeurMax};
    fi;
    % -----
    pair A,B,C;
    A=(0,0);
    B=unitp*(maxx,0);
    C=unitp*(minx,0);
    % On trace la demi-droite
    drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0));
    % marquage secondaire
    marque_s:=marque_s/3;
    labeloffset:=labeloffset*2;
    if ((maxx-minx) mod 2)=0:
      for k=(minx+1) step 2 until (maxx-1):
      draw marquedemidroite(C,B);
      draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
      endfor;
      else:
      for k=(minx) step 2 until (maxx-1):
        draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
     endfor;
     fi;
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-pasx):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    for k=0 step -pasx until (minx+pasx):
    draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]);
    endfor;
    % marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    label.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0));
    label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A);
    if AffichageGrad>0:
    for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx):
    if (k<0) or (k>1):
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%%
    fi;
    endfor;
    fi;
    vardef tata(text t)=%on place les points
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    if substring(1,2) of p_="*":
    label.top(TEX(substring(2,length p_) of p_),unitp*(valeur[n],0));
    else:
    label.top(TEX(p_),unitp*(valeur[n],0));
    fi;
    if p_<>"":
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    fi;
    % On ajoute une paramétrisation possible à chaque point.
    if AffichageCoord>0:
    n:=0;
    for p_=t:
    n:=n+1;
    if substring(1,2) of p_="*":
    ACoord:=scantokens(substring(0,1) of p_);
    if ACoord=3:
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1)));
    pointe(unitp*(valeur[n]-ValeurOrigine,0));
    elseif ACoord=2:
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    elseif ACoord=1:
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    else:
    if AffichageCoord=3:
    if p_<>"":
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1)));
    pointe(unitp*(valeur[n]-ValeurOrigine,0));
    fi;
    elseif AffichageCoord=2:
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    fi;
    elseif AffichageCoord=1:
    if p_<>"":
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    fi;
    fi;
    endfor;
    fi;
    enddef;
    %%%
    tata(#2);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom; ValeurMin=\useKV[ClesReperage]{ValeurMin}; ValeurMax=\useKV[ClesReperage]{ValeurMax};}]
    maxx:=0;
    minx:=4000;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination des abscisses maximale et minimale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    if valeur[k]<minx:
    minx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+(pasx div 2);
    minx:=minx-(pasx div 2);
    if maxx<(pasx+1):
    maxx:=2*pasx-1;
    fi;
    if minx>(-pasx-1):
    minx:=-2*pasx-1;
    fi;
    if minx<ValeurMin:
    minx:=ValeurMin;
    fi;
    if maxx>ValeurMax:
    maxx:=ValeurMax;
    fi;
    % -----
    pair A,B,C;
    A=(0,0);
    B=unitp*(maxx,0);
    C=unitp*(minx,0);
    % On trace la demi-droite
    drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0));
    % marquage secondaire
    marque_s:=marque_s/3;
    labeloffset:=labeloffset*2;
    if ((maxx-minx) mod 2)=0:
      for k=(minx+1) step 2 until (maxx-1):
      draw marquedemidroite(C,B);
      draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
      endfor;
      else:
      for k=(minx) step 2 until (maxx-1):
        draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
     endfor;
     fi;
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-pasx):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    for k=0 step -pasx until (minx+pasx):
    draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]);
    endfor;
    % marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0));
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A);
    if AffichageGrad>0:
    for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx):
    if (k<0) or (k>1):
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%%
    fi;
    endfor;
    fi;
    vardef tata(text t)=%on place les points
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    if substring(1,2) of p_="*":
    label.top(LATEX(substring(2,length p_) of p_),unitp*(valeur[n],0));
    else:
    label.top(LATEX(p_),unitp*(valeur[n],0));
    fi;
    if p_<>"":
    pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    fi;
    if AffichageCoord>0:
    n:=0;
    for p_=t:
    n:=n+1;
    if substring(1,2) of p_="*":
    ACoord:=scantokens(substring(0,1) of p_);
    if ACoord=3:
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1)));
    pointe(unitp*(valeur[n]-ValeurOrigine,0));
    elseif ACoord=2:
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    elseif ACoord=1:
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    else:
    if AffichageCoord=3:
    if p_<>"":
    drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3));
    label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1)));
    pointe(unitp*(valeur[n]-ValeurOrigine,0));
    fi;
    elseif AffichageCoord=2:
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0));
    else:
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    fi;
    pointe(unitp*(valeur[n],0));
    fi;
    elseif AffichageCoord=1:
    if p_<>"":
    label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
    pointe(unitp*(valeur[n],0));
    fi;
    fi;
    fi;
    endfor;
    fi;    
    enddef;
    %%%
    tata(#2);
  \end{mpost}
  \fi
}%

\def\MPThermo#1#2{%
  % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires
  % #2 : liste des noms des points
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    maxx:=0;
    minx:=4000;
    unitex:=\useKV[ClesReperage]{Unitex}*cm;
    pasx:=\useKV[ClesReperage]{Pasx};
    unitp:=unitex/pasx;%unit\'e de d\'eplacement
    ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex};
    ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine};
    AffichageGrad:=\AffichageGrad;
    AffichageCoord:=\useKV[ClesReperage]{AffichageAbs};
    AffichageNom:=\AffichageNom;
    boolean Kelvin,Farenheit;
    Kelvin=\useKV[ClesReperage]{Kelvin};
    Farenheit=\useKV[ClesReperage]{Farenheit};
    color ColMercure;
    ColMercure:=\useKV[ClesReperage]{CouleurMercure};
    boolean Mercure;
    Mercure=\useKV[ClesReperage]{Mercure};
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination des abscisses maximale et minimale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    if valeur[k]<minx:
    minx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+(pasx div 2);
    minx:=minx-(pasx div 2);
    if maxx<(pasx+1):
    maxx:=2*pasx-1;
    fi;
    if minx>(-pasx-1):
    minx:=-2*pasx-1;
    fi;
    if Kelvin:
    minx:=0;
    fi;
    % -----
    pair A,B,C;
    A=(0,0);
    B=unitp*(0,maxx);
    C=unitp*(0,minx);
    % On trace la demi-droite
    draw ((C+unitp*(0,-0.75))--(B+unitp*(0,0.75)));
    % marquage secondaire
    marque_s:=marque_s/3;
    if pasx<11:
    labeloffset:=labeloffset*2;
    if ((maxx-minx) mod 2)=0:
      for k=(minx+1) step 2 until (maxx-1):
      draw marquedemidroite(C,B);
      draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
      endfor;
      else:
      for k=(minx) step 2 until (maxx-1):
        draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
     endfor;
     fi;
     fi;
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-pasx):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    for k=0 step -pasx until (minx+pasx):
    draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]);
    endfor;
    % marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    if Kelvin:
    label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1));
    label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurOrigine)&"}"),A);
    elseif Farenheit:
    label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1));
    label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurOrigine)&"}"),A);
    else:
    label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurUnitex)&"}"),unitex*(0,1));
    label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurOrigine)&"}"),A);
    fi;
    if AffichageGrad>0:
    for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx):
    if (k<0) or (k>1):
    if Kelvin:
    label.lft(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%%
    elseif Farenheit:
    label.lft(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%%
    else:
    label.lft(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%%
    fi;
    fi;
    endfor;
    fi;

    vardef Thermo(expr nbt)=
    pair Tc[];
    Tc[0]=(5mm,unitp*(minx-1));
    path cc[];
    cc1=cercles(Tc[0],2.5mm);
    Tc1=pointarc(cc1,75);
    Tc4=pointarc(cc1,105);
    Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75)));
    Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75)));
    Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1])));
    Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1])));
    path temp;
    temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle;
    if nbt>0:
    fill temp withcolor ColMercure;
    fi;
    trace Tc5--Tc6;
    trace arccercle(Tc4,Tc1,Tc0);
    trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4;
    enddef;

    if Mercure:Thermo(1) else : Thermo(0) fi;
    
    vardef tata(text t)=%on place les points
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    label.rt(TEX(p_),unitp*(0,valeur[n]));
    if p_<>"":
    pointe(unitp*(0,valeur[n]));
    fi;
    endfor;
    fi;
    if AffichageCoord=3:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n]));
    label.rt(btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n])));
    pointe(unitp*(0,valeur[n]-ValeurOrigine));
    fi;
    endfor;
    elseif AffichageCoord=2:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.rt(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n]));
    else:
    label.rt(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n]));
    fi;
    pointe(unitp*(0,valeur[n]-ValeurOrigine));
    fi;
    endfor;
    elseif AffichageCoord=1:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if Kelvin:
    label.rt(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n]));
    elseif Farenheit:
    label.rt(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n]));
    else:
    label.rt(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n]));
    fi;
    pointe(unitp*(0,valeur[n]));
    draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly;
    fi;
    endfor;
    fi;
    enddef;
    %%%
    tata(#2);
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm;
    pasx:=\useKV[ClesReperage]{Pasx};
    unitp:=unitex/pasx;%unit\'e de d\'eplacement
    ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex};
    ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine};
    AffichageGrad:=\AffichageGrad;
    AffichageCoord:=\useKV[ClesReperage]{AffichageAbs};
    AffichageNom:=\AffichageNom;
    boolean Kelvin,Farenheit;
    Kelvin=\useKV[ClesReperage]{Kelvin};
    Farenheit=\useKV[ClesReperage]{Farenheit};
    color ColMercure;
    ColMercure:=\useKV[ClesReperage]{CouleurMercure};
    boolean Mercure;
    Mercure=\useKV[ClesReperage]{Mercure};}]
    maxx:=0;
    minx:=4000;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination des abscisses maximale et minimale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    if valeur[k]<minx:
    minx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+(pasx div 2);
    minx:=minx-(pasx div 2);
    if maxx<(pasx+1):
    maxx:=2*pasx-1;
    fi;
    if minx>(-pasx-1):
    minx:=-2*pasx-1;
    fi;
    if Kelvin:
    minx:=0;
    fi;
    % -----
    pair A,B,C;
    A=(0,0);
    B=unitp*(0,maxx);
    C=unitp*(0,minx);
    % On trace la demi-droite
    draw (C+unitp*(0,-0.75))--(B+unitp*(0,0.75));
    % marquage secondaire
    marque_s:=marque_s/3;
    if pasx<11:
    labeloffset:=labeloffset*2;
    if ((maxx-minx) mod 2)=0:
      for k=(minx+1) step 2 until (maxx-1):
      draw marquedemidroite(C,B);
      draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
      endfor;
      else:
      for k=(minx) step 2 until (maxx-1):
        draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]);
     endfor;
    fi;
    fi;
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-pasx):
    draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]);
    endfor;
    for k=0 step -pasx until (minx+pasx):
    draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]);
    endfor;
    % marquage des points
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    if Kelvin:
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\kelvin}"),unitex*(0,1));
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\kelvin}"),A);
    elseif Farenheit:
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\farenheit}"),unitex*(0,1));
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\farenheit}"),A);
    else:
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\celsius}"),unitex*(0,1));
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\celsius}"),A);
    fi;
    if AffichageGrad>0:
    for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx):
    if (k<0) or (k>1):
    if Kelvin:
    label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\kelvin}"),unitex*(0,k));%%%
    elseif Farenheit:
label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\farenheit}"),unitex*(0,k));%%%
    else:
label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\celsius}"),unitex*(0,k));%%%
    fi;
    fi;
    endfor;
    fi;

    vardef Thermo(expr nbt)=
    pair Tc[];
    Tc[0]=(5mm,unitp*(minx-1));
    path cc[];
    cc1=cercles(Tc[0],2.5mm);
    Tc1=pointarc(cc1,75);
    Tc4=pointarc(cc1,105);
    Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75)));
    Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75)));
    Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1])));
    Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1])));
    path temp;
    temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle;
    if nbt>0:
    fill temp;
    fi;
    trace arccercle(Tc4,Tc1,Tc0);
    trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4;
    trace Tc5--Tc6;
    enddef;

    if Mercure:Thermo(1) else : Thermo(0) fi;
    
    vardef tata(text t)=%on place les points
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    label.rt(LATEX(p_),unitp*(0,valeur[n]));
    if p_<>"":
    pointe(unitp*(0,valeur[n]));
    fi;
    endfor;
    fi;
    if AffichageCoord=3:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n]));
    label.rt(\btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n])));
    pointe(unitp*(0,valeur[n]-ValeurOrigine));
    fi;
    endfor;
    elseif AffichageCoord=2:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if ((ValeurUnitex*valeur[n]) mod pasx)<>0:
    label.rt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n]));
    else:
    label.rt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n]));
    fi;
    pointe(unitp*(0,valeur[n]-ValeurOrigine));
    fi;
    endfor;
    elseif AffichageCoord=1:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    if Kelvin:
    label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\kelvin}"),(5mm,unitp*valeur[n]));
    elseif Farenheit:
    label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\farenheit}"),(5mm,unitp*valeur[n]));
    else:
    label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\celsius}"),(5mm,unitp*valeur[n]));
    fi;
    pointe(unitp*(0,valeur[n]));
    draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly;
    fi;
    endfor;
    fi;
    enddef;
    %%%
    tata(#2);
  \end{mpost}
  \fi
}

\def\MPNewDROITEGradueeMulti#1#2{%
  % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires
  % #2 : liste des noms des points
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    maxx:=0;
    minx:=4000;
    unitex:=\useKV[ClesReperage]{Unitex}*cm;
    pasx:=\useKV[ClesReperage]{Pasx};
    unitp:=unitex/pasx;%unit\'e de d\'eplacement
    ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex};
    ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine};
    AffichageGrad:=\AffichageGrad;
    AffichageCoord:=\useKV[ClesReperage]{AffichageAbs};
    AffichageNom:=\AffichageNom;
    numeric valeur[];
    vardef titi(text t)=
    n:=0;
    for p_=t:
    n:=n+1;
    valeur[n]=p_;
    endfor;
    enddef;
    titi(#1);
    % Détermination des abscisses maximale et minimale
    for k=1 upto n:
    if valeur[k]>maxx:
    maxx:=valeur[k];
    fi;
    if valeur[k]<minx:
    minx:=valeur[k];
    fi;
    endfor;
    maxx:=maxx+(pasx div 2);
    minx:=minx-(pasx div 2);
    if maxx<(pasx+1):
    maxx:=2*pasx-1;
    fi;
    if minx>(-pasx-1):
    minx:=-2*pasx-1;
    fi;
    if minx<\useKV[ClesReperage]{ValeurMin}:
    minx:=\useKV[ClesReperage]{ValeurMin};
    fi;
    if maxx>\useKV[ClesReperage]{ValeurMax}:
    maxx:=\useKV[ClesReperage]{ValeurMax};
    fi;
%    % -----
    pair A[],B[],C[];
    for l=0 upto (\useKV[ClesReperage]{Etages}-1):
    A[l]=(0,-l*cm);
    B[l]=unitp*(maxx,0)+(0,-l*cm);
    C[l]=unitp*(minx,0)+(0,-l*cm);
    % On trace la demi-droite
    drawarrow (C[l]+unitp*(-0.75,0))--(B[l]+unitp*(0.75,0));
    % marquage secondaire
    marque_s:=marque_s/3;
    if ((maxx-minx) mod 2)=0:
      for k=(minx+1) step 2 until (maxx-1):
      draw marquedemidroite(C[l],B[l]);
      draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]);
      endfor;
      else:
      for k=(minx) step 2 until (maxx-1):
        draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]);
     endfor;
     fi;
    % marquage primaire
    marque_s:=marque_s*3;
    for k=0 step pasx until (maxx-pasx):
    draw marquesegment((k/maxx)[A[l],B[l]],((k+pasx)/maxx)[A[l],B[l]]);
    endfor;
    for k=0 step -pasx until (minx+pasx):
    draw marquesegment((k/maxx)[A[l],B[l]],((k-pasx)/maxx)[A[l],B[l]]);
    endfor;
    endfor;
    % On trace les zoom
    for k=0 upto (\useKV[ClesReperage]{Etages}-2):
    lp:=floor(1+uniformdeviate(8));
    draw (lp/10)[A[k],B[k]]--A[k+1] dashed evenly scaled 0.5 withcolor 0.5white;
    draw ((lp+1)/10)[A[k],B[k]]--B[k+1] dashed evenly scaled 0.5 withcolor 0.5white;
    endfor;
    % Labelisation
    m_c:=m_c*3;
    marque_p:="croix";
    labeloffset:=labeloffset*2;
    label.top(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0));
    label.top(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A[0]);
    if AffichageGrad>0:
    for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx):
    if (k<0) or (k>1):
    label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%%
    fi;
    endfor;
    fi;
    labeloffset:=labeloffset/2;
    vardef tata(text t)=%on place les points
    if AffichageNom>0:
    n:=0;
    for p_=t:
    n:=n+1;
    label.top(TEX(p_),unitp*(valeur[n],0)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm));
    pointe(unitp*(valeur[n],0));
    endfor;
    fi;
    if AffichageCoord=3:
    n:=0;
    for p_=t:
    n:=n+1;
    if p_<>"":
    drawarrow (unitp*(valeur[n],-1)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm))--(unitp*(valeur[n],-0.3)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm));
    label.bot(btex \hbox to4em{\dotfill} etex,(unitp*(valeur[n],-1))+(0,(-\useKV[ClesReperage]{Etages}+0.5)*cm));
    %pointe(unitp*(valeur[n],0));
    fi;
    endfor;
    fi;
    enddef;
    %%%
    tata(#2);
  \end{mplibcode}
  \fi
}

% Pour construire les droite/demi-droite gradu\'ee
\def\builddemidroitenew{%
  \toklistepointdroite{}%
  \toklistenompointdemidroite{}%
  \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{}
  \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}}
  \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{}
  \ifboolKV[ClesReperage]{Thermometre}{%
    \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}%
    \xdef\Listedesvaleursaplacersurlademidroite{}%
    \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}%
    % \Listedesvaleursaplacersurlademidroite%
    \MPThermo{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}%
  }{%
    \ifboolKV[ClesReperage]{DemiDroite}{%
      \xdef\Listedesvaleursaplacersurlademidroite{}%
      \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}%
      \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}%
      %\Listedesvaleursaplacersurlademidroite%
      \MPNewDEMIGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}%
    }{%
      \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}%
      \xdef\Listedesvaleursaplacersurlademidroite{}%
      \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}%
      %\Listedesvaleursaplacersurlademidroite%
      \MPNewDROITEGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}%
    }%
  }%
}%

\NewDocumentCommand\Reperage{o m}{%
  \useKVdefault[ClesReperage]%
  \setKV[ClesReperage]{#1}%
  \ifboolKV[ClesReperage]{Espace}{%
    \setKV[ClesReperage]{Unitex=2,Unitey=2.5,Unitez=1.5}%
    \ifboolKV[ClesReperage]{Sphere}{\setKV[ClesReperage]{EchelleEspace=75}}{}%
    \setKV[ClesReperage]{#1}%
    \setsepchar[*]{,*/}\ignoreemptyitems%
    \readlist*\ListePointEspace{#2}%
    \buildespace%
  }{\ifboolKV[ClesReperage]{Plan}{%
      \setsepchar[*]{,*/}\ignoreemptyitems%
      \readlist*\ListePointRepere{#2}%
      \buildreperenew%
    }{%
      \setsepchar[*]{,*/}\ignoreemptyitems%
      \readlist*\ListePointDroite{#2}%
      \builddemidroitenew%
    }%
  }%
}%

\NewDocumentCommand\ReperageMulti{o m}{%
  \useKVdefault[ClesReperage]%
  \setKV[ClesReperage]{#1}%
  \setsepchar[*]{,*/}\ignoreemptyitems%
  \readlist*\ListePointDroite{#2}%
  \toklistepointdroite{}%
  \toklistenompointdemidroite{}%
  \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{}
  \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}}
  \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{}
  \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}%
  \xdef\Listedesvaleursaplacersurlademidroite{}%
  \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}%
  \MPNewDROITEGradueeMulti{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}%
  \setsepchar{,}%
}%

%%%
% Puissances
%%%
\newcommand\Puissances[2]{%
  \ensuremath{%
    \xintifboolexpr{#2==0}{1}{\xintifboolexpr{#2>0}{\xdef\TotalP{\fpeval{#2-1}}#1\multido{\i=1+1}{\TotalP}{\times#1}}{\xdef\TotalP{\fpeval{-#2-1}}\frac{1}{#1\multido{\i=1+1}{\TotalP}{\times#1}}}}%
  }%
}

%%%
% Ecritures d'unit\'es
%%%
\setKVdefault[Unites]{m=false,km=false,hm=false,ha=false,dam=false,a=false,dm=false,cm=true,mm=false,um=false,nm=false,g=true,t=false,q=false,kg=false,hg=false,dag=false,dg=false,cg=false,mg=false,ug=false,ng=false,mmin=false,kmh=true,kms=false,ms=false,mh=false,kgm=false,gcm=true,L=true,kL=false,hL=false,daL=false,dL=false,cL=false,mL=false,l=true,kl=false,hl=false,dal=false,dl=false,cl=false,ml=false,Go=true,Mo=false,ko=false,To=false,o=false,kWh=true,C=true,K=false,F=false}

%D'apres https://tex.stackexchange.com/questions/38905/time-of-the-day-or-time-period-using-the-package-siunitx
\ExplSyntaxOn
\NewDocumentCommand \Temps { o > { \SplitArgument { 5 } { ; } } m }
{%
  \group_begin:%
  \IfNoValueF{#1}
  { \keys_set:nn { siunitx } {#1} }
  \siunitx_hms_output:nnn #2
  \group_end:
}
\cs_new_protected:Npn \siunitx_hms_output:nnn #1#2#3#4#5#6
{%
  \IfNoValueF {#1}%
  {%
    \tl_if_blank:nF {#1}%
    {%
      \SI{#1}{\annee\xintifboolexpr{#1>1}{s}{}}%
      \IfNoValueF {#2}{~}%
    }%
  }%
  \IfNoValueF {#2}%
  {%
    \tl_if_blank:nF {#2}%
    {%
      \SI{#2}{\mois}%
      \IfNoValueF{#3}{~}%
    }%
  }%
  \IfNoValueF {#3}%
  {%
    \tl_if_blank:nF {#3}%
    {%
      \SI{#3}{\jour}%
      \IfNoValueF{#4}{~}%
    }%
  }%
  \IfNoValueF {#4}%
  {%
    \tl_if_blank:nF {#4}%
    {%
      \SI{#4}{\hour}%
      \IfNoValueF{#5}{~}%
    }%
  }%
  \IfNoValueF {#5}%
  {%
    \tl_if_blank:nF {#5}%
    {%
      \SI[minimum-integer-digits=2]{#5}{\minute}%
      \IfNoValueF{#6}{~}%
    }%
  }%
  \IfNoValueF {#6}%
  {%
    \tl_if_blank:nF {#6} {\SI{#6}{\second}}}%
}%
\ExplSyntaxOff

\newcommand\Temp[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{F}{%
    \SI{#2}{\fahrenheit}%
  }{%
    \ifboolKV[Unites]{K}{%
      \SI{#2}{\kelvin}%
    }{%
      \SI{#2}{\celsius}%
    }%
  }%
}%

\newcommand\Conso[2][]{%
  \SI{#2}{\kWh}%
}

\newcommand\Prix[2][2]{%
  \SI[round-mode=places,round-precision=#1]{#2}{\EuRo}%
}

\newcommand\Octet[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{o}{%
    \SI{#2}{\octet}%
  }{%
    \ifboolKV[Unites]{ko}{%
      \SI{#2}{\kilo\octet}%
    }{\ifboolKV[Unites]{Mo}{%
        \SI{#2}{\mega\octet}%
      }{\ifboolKV[Unites]{To}{%
          \SI{#2}{\tera\octet}%
        }{%
          \SI{#2}{\giga\octet}%
        }%
      }%
    }%
  }%
}%

\NewDocumentCommand\Lg{o m}{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{nm}{%
    \SI{#2}{\nm}%
  }{\ifboolKV[Unites]{um}{%
      \SI{#2}{\um}%
    }{\ifboolKV[Unites]{km}{%
        \SI{#2}{\km}%
      }{\ifboolKV[Unites]{hm}{%
          \SI{#2}{\hecto\metre}%
        }{\ifboolKV[Unites]{dam}{%
            \SI{#2}{\deca\metre}%
          }{\ifboolKV[Unites]{dm}{%
              \SI{#2}{\dm}%
            }{\ifboolKV[Unites]{m}{%
                \SI{#2}{\m}%
              }{\ifboolKV[Unites]{mm}{%
                  \SI{#2}{\mm}%
                }{\SI{#2}{\cm}%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\NewDocumentCommand\Masse{o m}{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{ng}{%
    \SI{#2}{\ng}%
  }{\ifboolKV[Unites]{ug}{%
      \SI{#2}{\ug}%
    }{\ifboolKV[Unites]{t}{%
        \SI{#2}{\tonne}%
      }{\ifboolKV[Unites]{q}{%
          \SI{#2}{\quintal}%
        }{%
          \ifboolKV[Unites]{kg}{%
            \SI{#2}{\kg}%
          }{\ifboolKV[Unites]{hg}{%
              \SI{#2}{\hecto\gram}%
            }{\ifboolKV[Unites]{dag}{%
                \SI{#2}{\deca\gram}%
              }{\ifboolKV[Unites]{dg}{%
                  \SI{#2}{\deci\gram}%
                }{\ifboolKV[Unites]{cg}{%
                    \SI{#2}{\centi\gram}%
                  }{\ifboolKV[Unites]{mg}{%
                      \SI{#2}{\milli\gram}%
                    }{\SI{#2}{\gram}%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Capa[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{kL}{%
    \SI{#2}{\kilo\liter}%
  }{\ifboolKV[Unites]{hL}{%
      \SI{#2}{\hecto\liter}%
    }{\ifboolKV[Unites]{daL}{%
        \SI{#2}{\deca\liter}%
      }{\ifboolKV[Unites]{dL}{%
          \SI{#2}{\deci\liter}%
        }{\ifboolKV[Unites]{cL}{%
            \SI{#2}{\centi\liter}%
          }{\ifboolKV[Unites]{mL}{%
              \SI{#2}{\milli\liter}%
            }{\SI{#2}{\liter}%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Aire[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{km}{%
    \SI{#2}{\square\km}%
  }{\ifboolKV[Unites]{hm}{%
      \SI{#2}{\square\hecto\metre}%
    }{\ifboolKV[Unites]{ha}{%
        \SI{#2}{\hectare}%
      }{\ifboolKV[Unites]{dam}{%
          \SI{#2}{\square\deca\metre}%
        }{\ifboolKV[Unites]{a}{%
            \SI{#2}{\are}%
          }{\ifboolKV[Unites]{dm}{%
              \SI{#2}{\square\dm}%
            }{\ifboolKV[Unites]{m}{%
                \SI{#2}{\square\metre}%
              }{\ifboolKV[Unites]{mm}{%
                  \SI{#2}{\square\mm}%
                }{\SI{#2}{\square\cm}%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Vol[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{km}{%
    \SI{#2}{\cubic\km}%
  }{\ifboolKV[Unites]{hm}{%
      \SI{#2}{\cubic\hecto\metre}%
    }{\ifboolKV[Unites]{dam}{%
        \SI{#2}{\cubic\deca\metre}%
      }{\ifboolKV[Unites]{dm}{%
          \SI{#2}{\cubic\dm}%
        }{\ifboolKV[Unites]{m}{%
            \SI{#2}{\cubic\metre}%
          }{\ifboolKV[Unites]{mm}{%
              \SI{#2}{\cubic\mm}%
            }{\SI{#2}{\cubic\cm}%
            }%
          }%
        }%
      }%
    }%
  }%
}%

\newcommand\Vitesse[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{mmin}{%
    \SI[per-mode=symbol]{#2}{\meter\per\minute}%
  }{%
    \ifboolKV[Unites]{mh}{%
      \SI[per-mode=symbol]{#2}{\meter\per\hour}%
    }{%
      \ifboolKV[Unites]{ms}{%
        \SI[per-mode=symbol]{#2}{\meter\per\second}%
      }{%
        \ifboolKV[Unites]{kms}{%
          \SI[per-mode=symbol]{#2}{\kilo\meter\per\second}%
        }{%
          \SI[per-mode=symbol]{#2}{\kilo\meter\per\hour}%
        }%
      }%
    }%
  }%
}%

\newcommand\MasseVol[2][]{%
  \useKVdefault[Unites]%
  \setKV[Unites]{#1}%
  \ifboolKV[Unites]{kgm}{%
    \SI[per-mode=symbol]{#2}{\kilo\gram\per\cubic\metre}%
  }{%
    \SI[per-mode=symbol]{#2}{\gram\per\cubic\centi\metre}%
  }%
}%

%%%
% Tableaux d'unit\'es
%%%
\setKVdefault[ClesTableaux]{Virgule=true,Incline=false,Entiers=false,Decimaux=false,Milliards=false,Millions=false,Micro=false,Nano=false,Partie=false,CouleurG=gray!15,CouleurM=gray!15,Couleurm=gray!15,Couleuru=gray!15,Couleurd=gray!15,Classes=false,Nombres=false,Puissances=false,NbLignes=2,Metre=false,Are=false,Capacite=false,Carre=false,Cube=false,Litre=false,Gramme=false,Fleches=false,FlechesB=false,FlechesH=false,Colonnes=false,Prefixes=false,Escalier=false,Taille=5,Largeur=4.75em,Nom=PfCTableau,CodeAfter={},PuissancesSeules=false,Colonne=-1}

\newcommand\PfCTBstrut{\rule[-1.2ex]{0pt}{3.8ex}} % Top and Bottom strut
\newcommand\PfCTstrut{\rule{0pt}{3.8ex}} % Top strut
\newcommand\PfCBstrut{\rule[-1.2ex]{0pt}{0ex}} % Bottom strut

\newlength\PfCTableauPuissances%

\newcommand\Tableau[2][]{%
  \useKVdefault[ClesTableaux]%
  \setKV[ClesTableaux]{#1}%
  \ifboolKV[ClesTableaux]{Escalier}{%
    \ifboolKV[ClesTableaux]{Metre}{%
      \xdef\PfCTableauUnite{\meter}%
      \xdef\PfCCoefConversion{10}%
    }{}%
    \ifboolKV[ClesTableaux]{Carre}{%
      \xdef\PfCTableauUnite{\square\meter}%
      \xdef\PfCCoefConversion{100}%
    }{}%
    \ifboolKV[ClesTableaux]{Cube}{%
      \xdef\PfCTableauUnite{\cubic\meter}%
      \xdef\PfCCoefConversion{1000}%
    }{}%
    \ifboolKV[ClesTableaux]{Gramme}{%
      \xdef\PfCTableauUnite{\gram}%
      \xdef\PfCCoefConversion{10}%
    }{}%
    \PfCTableauIncline%
  }{%
  %
  %%% Cl\'e Prefixes
  %
  \ifboolKV[ClesTableaux]{Prefixes}{%
    \xdef\DecalageLigne{0}%
    \setlength{\tabcolsep}{0.01\tabcolsep}%
    \begin{center}%
      %
      %%% Definition du tableau
      %
      \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}%
      \ifboolKV[ClesTableaux]{Nano}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+6}}}{\ifboolKV[ClesTableaux]{Micro}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+3}}}{}}
      \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{m{3.25em}}>{\columncolor{gray!15}}{c}*{%
            \ifboolKV[ClesTableaux]{Micro}{6}{%
              \ifboolKV[ClesTableaux]{Nano}{9}{3}%
            }}%
          {m{3.25em}}}%
        %
      	%%% Prise en compte de la cl\'e Partie
      	%
        \ifboolKV[ClesTableaux]{Partie}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \Block[]{1-%
            \ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&%
          }{%
            \ifboolKV[ClesTableaux]{Millions}{%
              &&&%
            }{%
            }}%
          &&&&&
          &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[]{1-%
            \ifboolKV[ClesTableaux]{Micro}{6}{%
              \ifboolKV[ClesTableaux]{Nano}{9}{3}%
            }}{\bfseries Partie d\'ecimale}
          &&%
          \ifboolKV[ClesTableaux]{Micro}{&&&}{%
            \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}%
          }%
          \\
        }{}%
        %
      	%%% Prise en compte de la cl\'e Classes
      	%
        \ifboolKV[ClesTableaux]{Classes}{%
          %\hline
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}
          \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}
          \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&%
          &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&
          &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[draw]{1-%
            \ifboolKV[ClesTableaux]{Micro}{6}{%
              \ifboolKV[ClesTableaux]{Nano}{9}{3}%
            }}{}
          &&%
          \ifboolKV[ClesTableaux]{Micro}{&&&}{%
            \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}%
          }%
          \\
        }{}%
      	%
      	%%% Valeurs par d\'efaut
      	%
        \hline%
        \ifboolKV[ClesTableaux]{Milliards}{%
        \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont giga}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont m\'ega}%
        &\Block[borders={right}]{}{}%
        }{%
        \ifboolKV[ClesTableaux]{Millions}{%
        \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}%
        &\Block[]{}{\fontsize{8}{8}\selectfont m\'ega}%
        &%
        }{%
        }}%
        \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont kilo}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont hecto}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont d\'eca}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont unit\'es}%
        &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont deci}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont centi}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont milli}%
      	\ifboolKV[ClesTableaux]{Micro}{&\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}\\}{%
      	\ifboolKV[ClesTableaux]{Nano}{&\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont nano}\\}{\\}%
      	}%
        %
      	%%% Prise en compte de la cl\'e Nombres
      	%
        \ifboolKV[ClesTableaux]{Nombres}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}%
          &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}%
          \ifboolKV[ClesTableaux]{Micro}{%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}%
          }{%
            \ifboolKV[ClesTableaux]{Nano}{%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0000001} ou $\dfrac{\strut1}{\strut\num{10000000}}$}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00000001} ou $\dfrac{\strut1}{\strut\num{100000000}}$}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000000001} ou $\dfrac{\strut1}{\strut\num{1000000000}}$}%
            }{}%
          }{}\\%
        }{}%
      	%%% Prise en compte de la cl\'e Puissances
        \ifboolKV[ClesTableaux]{Puissances}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
          \Block[borders={left,right}]{}{}&%
          \Block[borders={right}]{}{}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}%
          &\Block[borders={right}]{}{}%
          &\Block[borders={right}]{}{}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
          &\Block[borders={right}]{}{}%
        }{%
        \ifboolKV[ClesTableaux]{Millions}{%
          \Block[borders={left,right}]{}{}&%
          \Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
        &%
        }{%
        }}%
        \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}%
        &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}%
        \ifboolKV[ClesTableaux]{Micro}{&%
          \Block[borders={right}]{}{}&%
          \Block[borders={right}]{}{}&
          \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}}{%
      	\ifboolKV[ClesTableaux]{Nano}{&%
          \Block[borders={right}]{}{}&%
        \Block[borders={right}]{}{}&%
        \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-9}$}}{}%
      	}%
        \\%
        }{}%
        %
      	%%% Lignes vierges
      	%
        \hline%
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&%
          }{%
            \ifboolKV[ClesTableaux]{Millions}{%
              &&&%
            }{%
            }}%
          &&&&&&,&&&%
          \ifboolKV[ClesTableaux]{Micro}{&&&}{%
            \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}%
          }%
          \\}%
        \CodeAfter%
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{%
          \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);%
        }%
        %% On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}%
        \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}%
        \setsepchar[*]{,*.}%
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{%
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{%
            \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};%
          }%
          \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};%
          }%
        }%
        \fi%
      \end{NiceTabular}%
    \end{center}%
    \setlength{\tabcolsep}{100\tabcolsep}%
  }{}%
  %
  %%% Puissances seules
  %
  \ifboolKV[ClesTableaux]{PuissancesSeules}{%
    \setlength{\PfCTableauPuissances}{3em}%
    \xdef\DecalageLigne{0}%
    \setlength{\tabcolsep}{0.01\tabcolsep}%
    \begin{center}%
      % 
      %%% Definition du tableau
      % 
      \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}%
      \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{m{\PfCTableauPuissances}}>{\columncolor{gray!15}}{c}*{3}{m{\PfCTableauPuissances}}}%
        \CodeBefore
        \xintifboolexpr{\useKV[ClesTableaux]{Colonne}>0}{%
          \tikz\fill[gray!15] (1-|\fpeval{\useKV[ClesTableaux]{Colonne}}) rectangle (last-|\fpeval{\useKV[ClesTableaux]{Colonne}+1});
        }{}
        \Body
        \hline
      	% 
      	%%% Prise en compte de la cl\'e Partie
%      	% 
%        \ifboolKV[ClesTableaux]{Partie}{%
%          \Block[]{1-%
%            \ifboolKV[ClesTableaux]{Milliards}{12}{%
%              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
%            }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{%
%            &&&&&&%
%          }{%
%            \ifboolKV[ClesTableaux]{Millions}{%
%              &&&%
%            }{%
%            }}%
%          &&&&&%
%          &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%%
%          &\Block[]{1-3}{\bfseries Partie d\'ecimale}%
%          &&\\
%        }{}%
%        %
%      	%%% Prise en compte de la cl\'e Classes
%      	%
%        \ifboolKV[ClesTableaux]{Classes}{%
%          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}%
%          \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}%
%          \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&%
%          &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&
%          &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
%          &\Block[draw]{1-3}{}&&%
%          \\
%        }{}%
        % 
        %%% Valeurs ci-dessous par d\'efaut
        %
        %Affichage ou pas des noms ?
%        \hline
%        \ifboolKV[ClesTableaux]{Milliards}{%
%          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}%
%          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}%
%          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}%
%          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}%
%          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
%          &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
%          &
%        }{}%
%        \ifboolKV[ClesTableaux]{Millions}{%
%          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}%
%          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
%          &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
%          &
%        }{}%
%        \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}%
%        &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}%
%        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\
%        %
      	%%% Prise en compte de la cl\'e Nombres
      	%
        \ifboolKV[ClesTableaux]{Nombres}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}%
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}%
          &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}%
          \\
        }{}%
        %%% Prise en compte de la cl\'e Puissances
        \ifboolKV[ClesTableaux]{Milliards}{%
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{11}$}&%
          \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{10}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{9}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}%
          &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}%
          &%
        }{%
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}&%
            \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}%
            &%
          }{%
          }}%
        \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{5}$}
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{4}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^3$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d2}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d1}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^0$}%
        &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-1}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-2}$}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-3}$}%
        \\%
        %%% Lignes vierges
        \hline%
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&}{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            &&&}{}%
          &&&&&&\ifboolKV[ClesTableaux]{Virgule}{,}{\phantom{,}}&&&\\}%
        \CodeAfter%
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{%
          \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);%
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}%
        \readlist*\ListeNombreAPlacer{#2}%
        \setsepchar{,}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+1.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }
        \fi%
      \end{NiceTabular}%
    \end{center}%
    \setlength{\tabcolsep}{100\tabcolsep}%
  }{}%
  %
  %%% Cl\'e Entiers
  %
  \ifboolKV[ClesTableaux]{Entiers}{%
    \xdef\DecalageLigne{0}%
    \xdef\TailleFonte{\useKV[ClesTableaux]{Taille}}%
    \setlength{\tabcolsep}{0.01\tabcolsep}%
    \begin{center}%
      % 
      %%% Definition du tableau
      % 
      \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{10}}{\xdef\PfCDerniereColonne{7}}}%
      \begin{NiceTabular}{*{%
            \ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }%
          }{m{\useKV[ClesTableaux]{Largeur}}}}%
        \ifboolKV[ClesTableaux]{Classes}{%
          \hline
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&%
          }{}
          \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}
          \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&%
          &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&\\}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}%
          \Block[]{}{}
          &\Block[]{}{}
          &\Block[]{}{}
          &\Block[]{}{}
          &\Block[]{}{}
          &\Block[]{}{}\\
        }%ok
        \hline
        \ifboolKV[ClesTableaux]{Milliards}{%
          \Block[draw]{}{\fontsize{\TailleFonte}{\TailleFonte}\selectfont centaines de milliards}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliards}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
          &
        }{}
        \ifboolKV[ClesTableaux]{Millions}{%
          \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
          &
        }{}
        \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de milliers}%
        &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliers}%
        &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}%
        &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines}%
        &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines}%
        &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es}\\%
        \ifboolKV[ClesTableaux]{Nombres}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}%
            &%
          }{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}%
            &%
          }{}%
          \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000}}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000}}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000}}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100}}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10}}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1}}%
          \\
        }{}%
        % 
        %%% Prise en compte de la cl\'e Puissances
        % 
        \ifboolKV[ClesTableaux]{Puissances}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}%
            &%
            &%
            &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
            &%
          }{%
            \ifboolKV[ClesTableaux]{Millions}{%
              &%
              &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
              &%
            }{%
            }}%
          &%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^3$}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}%
          &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}%
          \\%
        }{}%
        % 
        %%% Lignes vierges
        % 
        \hline%
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&}{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            &&&}{}%
          &&&&&\\}%
        \ifboolKV[ClesTableaux]{Milliards}{%
          \Block[]{}{\tikz[remember picture,overlay]{\coordinate (L1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (K1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (J1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}%
        \ifboolKV[ClesTableaux]{Millions}{%
          \Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}%
        \Block[]{}{\tikz[remember picture,overlay]{\coordinate (F1);}}
        &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (E1);}}
        &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (D1);}}
        &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (C1);}}
        &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (B1);}}
        &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (A1);}}\\
        \CodeAfter%
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{\PfCDerniereColonne}}\do{%
          \tikz\draw (\fpeval{\DecalageLigne+1}-|##1)--(\fpeval{\DecalageLigne+1+\useKV[ClesTableaux]{NbLignes}+1}-|##1);%
        }%
        %% On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar{,}%
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{%
          \StrLen{\ListeNombreAPlacer[##2]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{%
            \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonne-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2]}{##1}{##1}};%
          }%
        }%
        \fi%
        % On trace les éventuelles fleches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%%
        \ifboolKV[ClesTableaux]{Classes}{}{%
          \ifboolKV[ClesTableaux]{FlechesB}{%
            \ifboolKV[ClesTableaux]{Milliards}{%
              \xintFor* ##1 in {\xintSeq{1}{11}}\do{%
                \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});%
              }%
            }{%
              \ifboolKV[ClesTableaux]{Millions}{%
                \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
                  \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});%
                }%
              }{%
                \xintFor* ##1 in {\xintSeq{1}{5}}\do{%
                  \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});%
                }%
              }%
            }%
          }{}%
          \ifboolKV[ClesTableaux]{FlechesH}{%
            \ifboolKV[ClesTableaux]{Milliards}{%
              \xintFor* ##1 in {\xintSeq{1}{11}}\do{%
                \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
              }%
            }{%
              \ifboolKV[ClesTableaux]{Millions}{%
                \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
                  \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
                }%
              }{%
                \xintFor* ##1 in {\xintSeq{1}{5}}\do{%
                  \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
                }%
              }%
            }%
          }{}%
        }%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}%
    \end{center}%
    \setlength{\tabcolsep}{100\tabcolsep}%
  }{}%
  % 
  %%% Cl\'e Decimaux
  % 
  \ifboolKV[ClesTableaux]{Decimaux}{%
    \xdef\DecalageLigne{0}%
    \setlength{\tabcolsep}{0.01\tabcolsep}%
    \begin{center}%
      % 
      %%% Definition du tableau
      % 
      \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}%
      \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{m{4.75em}}>{\columncolor{gray!15}}{c}*{3}{m{4.75em}}}%
      	% 
      	%%% Prise en compte de la cl\'e Partie
      	% 
        \ifboolKV[ClesTableaux]{Partie}{%
          \Block[]{1-%
            \ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&%
          }{%
            \ifboolKV[ClesTableaux]{Millions}{%
              &&&%
            }{%
            }}%
          &&&&&%
          &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%%
          &\Block[]{1-3}{\bfseries Partie d\'ecimale}%
          &&\\
        }{}%
        %
      	%%% Prise en compte de la cl\'e Classes
      	%
        \ifboolKV[ClesTableaux]{Classes}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}%
          \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}%
          \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&%
          &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&
          &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[draw]{1-3}{}&&%
          \\
        }{}%
        % 
        %%% Valeurs ci-dessous par d\'efaut
        % 
        \hline
        \ifboolKV[ClesTableaux]{Milliards}{%
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
          &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
          &
        }{}%
        \ifboolKV[ClesTableaux]{Millions}{%
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}%
          &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}%
          &
        }{}%
        \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}%
        &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}%
        &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\
        %
      	%%% Prise en compte de la cl\'e Nombres
      	%
        \ifboolKV[ClesTableaux]{Nombres}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}%
            &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}%
            &%
          }{}%
          \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}%
          &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}%
          \\
        }{}%
        %
        %%% Prise en compte de la cl\'e Puissances
        %
        \ifboolKV[ClesTableaux]{Puissances}{%
          \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%
          \ifboolKV[ClesTableaux]{Milliards}{%
            \Block[borders={left,right}]{}{}&%
            \Block[borders={right}]{}{}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}%
            &\Block[borders={right}]{}{}%
            &\Block[borders={right}]{}{}%
            &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
            &\Block[borders={right}]{}{}%
          }{%
            \ifboolKV[ClesTableaux]{Millions}{%
              \Block[borders={left,right}]{}{}&%
              \Block[borders={right}]{}{}%
              &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}%
              &%
            }{%
            }}%
          \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}%
          &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}%
          &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}%
          \\%
        }{}%
        %
        %%% Lignes vierges
        %
        \hline%
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&}{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            &&&}{}%
          &&&&&&,&&&\\}%
        \CodeAfter%
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{%
          \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);%
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}%
        \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}%
        \setsepchar[*]{,*.}%
        \ignoreemptyitems%
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{%
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{%
            \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};%
          }%
          \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]%
          \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{%
            \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
              \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};%
            }%
          }%
        }%
        \fi%
      \end{NiceTabular}%
    \end{center}%
    \setlength{\tabcolsep}{100\tabcolsep}%
  }{}%
  % Décimal version inclinée
  \ifboolKV[ClesTableaux]{Incline}{%
    \colorlet{PfCCouleurd}{\useKV[ClesTableaux]{Couleurd}}%
    \xdef\DecalageLigne{0}%
    \setlength{\tabcolsep}{0.01\tabcolsep}%
    \begin{center}%
      %
      %%% Definition du tableau
      %
      \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{17}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{14}}{\xdef\PfCDerniereColonne{11}}}%
      \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{%
              \ifboolKV[ClesTableaux]{Millions}{9}{6}%
            }}{wc{1cm}}*{5}{wc{1cm}}}%
        %
        \CodeBefore%
        \ifboolKV[ClesTableaux]{Milliards}{%
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle;
          \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle;
          \tikz\draw[draw=black,fill=PfCCouleurd!50] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle;
          \tikz\draw[draw=black,fill=PfCCouleurd!40] (14|-5)--(15|-1)--(16|-1)--(15|-5)--cycle;
          \tikz\draw[draw=black,fill=PfCCouleurd!30] (15|-5)--(16|-1)--(17|-1)--(16|-5)--cycle;
          \tikz\draw[draw=black,fill=PfCCouleurd!20] (16|-5)--(17|-1)--(18|-1)--(17|-5)--cycle;
        }{\ifboolKV[ClesTableaux]{Millions}{%
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!50] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!40] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!30] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!20] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle;
          }{%
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle;
            \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!50] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!40] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!30] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle;
            \tikz\draw[draw=black,fill=PfCCouleurd!20] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle;
          }%
        }%
        \Body
        %% Pour décaler et laisser la place nécessaire
        \xintFor* ##1 in {\xintSeq{1}{4}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&}{}%
          \ifboolKV[ClesTableaux]{Millions}{%
            &&&}{}%
          &&&&&&&&&&\\}%
        %%% Lignes vierges       
        %
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          \ifboolKV[ClesTableaux]{Milliards}{%
            &&&&&&}{}%                         
          \ifboolKV[ClesTableaux]{Millions}{%
            &&&}{}%
          &&&&&&&&&&\\}%
        \CodeAfter%%
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{2}{\fpeval{\PfCDerniereColonne-1}}}\do{%
          \tikz\draw[dashed] (\fpeval{\DecalageLigne+5}-|##1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|##1);%
        }%
        \tikz\draw (\fpeval{\DecalageLigne+5}-|1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|1);%
        \tikz\draw (\fpeval{\DecalageLigne+5}-|\fpeval{\PfCDerniereColonne})--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{\PfCDerniereColonne});%
        %% On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}%
        \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+1}}%
        \setsepchar[*]{,*.}%
        \ignoreemptyitems%
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{%
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{%
            \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};%
          }%
          \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]%
          \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{%
            %On place la virgule
            \tikz\node[xshift=1em] at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+1}) {\PfCTBstrut,};%
            %on écrit la partie décimale
            \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
              \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};%
            }%
          }%
        }%
        \fi%
        \ifboolKV[ClesTableaux]{Milliards}{%
          \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliards\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliards\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliards\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (15|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (16|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}};
          \tikz\node[rotate=58] at (17|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}};
        }{\ifboolKV[ClesTableaux]{Millions}{%
            \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}};
          }{%
            \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}};
            \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}};
          }%
        }%
      \end{NiceTabular}%
    \end{center}%
    \setlength{\tabcolsep}{100\tabcolsep}%
  }{}%  
  %
  %%% Prise en compte de la cl\'e Metre
  %
  \ifboolKV[ClesTableaux]{Metre}{%
    \[\renewcommand{\arraystretch}{1.15}%
      \begin{NiceTabular}{*{7}{wc{7.5mm}}}%
        \Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}\\
        \Block[draw]{}{km\PfCTBstrut}&\Block[draw]{1-1}{hm\PfCTBstrut}&\Block[draw]{1-1}{dam\PfCTBstrut}&\Block[draw]{1-1}{m\PfCTBstrut}&\Block[draw]{1-1}{dm\PfCTBstrut}&\Block[draw]{1-1}{cm\PfCTBstrut}&\Block[draw]{1-1}{mm\PfCTBstrut}\\
        \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          &&&&&&\\
        }%
        \Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}\\
        \CodeAfter
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
          \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1);
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }
        \fi%
        % on trace les flèches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%
        \ifboolKV[ClesTableaux]{FlechesH}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
          }%
        }{}%
        \ifboolKV[ClesTableaux]{FlechesB}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});%
          }%
        }{}%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}%
    \]%
  }%
  {}%
  
  %
  %%% Prise en compte de la cl\'e Carre
  %
  \ifboolKV[ClesTableaux]{Carre}{%
    \[\renewcommand{\arraystretch}{1.15}%
      \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}}}%
        \Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}\\
        \Block[borders={left,top,right}]{1-2}{km$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{hm$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{dam$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{m$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{dm$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{cm$^2$\PfCTBstrut}&&\Block[borders={left,top,right}]{1-2}{mm$^2$\PfCTBstrut}&\\
        \ifboolKV[ClesTableaux]{Are}{%
          \Block[borders={left,right,bottom}]{1-2}{}&&\Block[draw=gray!50,borders={left,top,bottom}]{1-1}{}&\Block[borders={top,right,bottom}]{1-1}{\scriptsize ha}&\Block[draw=gray!50,borders={left,top,bottom}]{1-1}{}&\Block[borders={top,right,bottom}]{1-1}{\scriptsize a}&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&\\
        }{\hline}%
        \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          &&&&&&&&&&&&&\\
        }%
        \Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}
        &&\Block[]{1-2}{}\\
        \CodeAfter
        % on trace les lignes verticales
        \xintifboolexpr{\useKV[ClesTableaux]{Are}}{%
          \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
            \tikz\draw (4-|\fpeval{2*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1});
          }%
          \xintFor* ##1 in {\xintSeq{1}{7}}\do{%
            \tikz\draw[gray!50] (4-|\fpeval{2*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2});
          }%
        }{%
          \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
            \tikz\draw (3-|\fpeval{2*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1});
          }%
          \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{%
            \xintFor* ##1 in {\xintSeq{1}{7}}\do{%
              \tikz\draw[gray!50] (3-|\fpeval{2*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2});
            }%
          }{}%
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Are}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }
        \fi%
        % on trace les flèches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%
        \ifboolKV[ClesTableaux]{Are}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}%
        \ifboolKV[ClesTableaux]{FlechesH}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2*##1}) to node[above, midway]{\small$\times\num{100}$}(1.5-|\fpeval{2*(##1+1)});%
          }%
        }{}%
        \ifboolKV[ClesTableaux]{FlechesB}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*(##1+1)}) to node[below,midway]{\small$\div\num{100}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*##1});%
          }%
        }{}%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}
    \]%
  }{}%
  %
  %%% Prise en compte de la cl\'e Cube
  %
  \ifboolKV[ClesTableaux]{Cube}{%
    \[\renewcommand{\arraystretch}{1.15}%
      \setlength{\tabcolsep}{0.625\tabcolsep}%
      \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}}
        \Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}\\
        \Block[borders={left,top,right}]{1-3}{km$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{hm$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{dam$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{m$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{dm$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{cm$^3$\PfCTBstrut}&&&\Block[borders={left,top,right}]{1-3}{mm$^3$\PfCTBstrut}&&\\
        \ifboolKV[ClesTableaux]{Capacite}{%
          \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={left,right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom},l]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={left,right,bottom}]{1-3}{}&&\\
        }{\hline}%
        \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
        &&&&&&&&&&&&&&&&&&&&\\
        }%
        \Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}
        &&&\Block[]{1-3}{}\\
        \CodeAfter
        % on trace les lignes verticales
        \xintifboolexpr{\useKV[ClesTableaux]{Capacite}}{%
          \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
            \tikz\draw (4-|\fpeval{3*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1});
          }%
          \xintFor* ##1 in {\xintSeq{1}{7}}\do{%
            \tikz\draw[gray!50] (4-|\fpeval{3*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2});
            \tikz\draw[gray!50] (4-|\fpeval{3*##1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1});
          }%
        }{%
          \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
            \tikz\draw (3-|\fpeval{3*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1});
          }%
          \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{%
            \xintFor* ##1 in {\xintSeq{1}{7}}\do{%
              \tikz\draw[gray!50] (3-|\fpeval{3*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2});
              \tikz\draw[gray!50] (3-|\fpeval{3*##1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1});
            }%
          }{}%
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Capacite}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }
        \fi%
        % on trace les flèches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%
        \ifboolKV[ClesTableaux]{Capacite}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}%
        \ifboolKV[ClesTableaux]{FlechesH}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2.5+3*(##1-1)}) to node[above, midway]{\small$\times\num{1000}$}(1.5-|\fpeval{2.5+3*##1});%
          }%
        }{}%
        \ifboolKV[ClesTableaux]{FlechesB}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*##1}) to node[below,midway]{\small$\div\num{1000}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*(##1-1)});%
          }%
        }{}%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}
    \]%
%    \setlength{\tabcolsep}{1.6\tabcolsep}%
  }{}%
  %
  %%% Prise en compte de la cl\'e Litre
  %
  \ifboolKV[ClesTableaux]{Litre}{%
    \[\renewcommand{\arraystretch}{1.15}%
      \begin{NiceTabular}{*{6}{wc{7.5mm}}}%
        \Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}\\
        \Block[draw]{}{hL\PfCTBstrut}&\Block[draw]{}{daL\PfCTBstrut}&\Block[draw]{}{L\PfCTBstrut}&\Block[draw]{}{dL\PfCTBstrut}&\Block[draw]{}{cL\PfCTBstrut}&\Block[draw]{}{mL\PfCTBstrut}\\
        \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          &&&&&\\
        }
        \Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}
        &\Block[]{1-1}{}\\
        \CodeAfter
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{7}}\do{%
          \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1);
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }%
        \fi%
        % on trace les flèches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%
        \ifboolKV[ClesTableaux]{FlechesH}{%
          \xintFor* ##1 in {\xintSeq{1}{5}}\do{%
            \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
          }%
        }{}%
        \ifboolKV[ClesTableaux]{FlechesB}{%
          \xintFor* ##1 in {\xintSeq{1}{5}}\do{%
            \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});%
          }%
        }{}%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}%
    \]%
  }{}%
  % 
  %%% Prise en compte de la cl\'e Gramme
  % 
  \ifboolKV[ClesTableaux]{Gramme}{%
    \[\renewcommand{\arraystretch}{1.15}%
      \begin{NiceTabular}{*{7}{wc{7.5mm}}}%
        \Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}\\
        \Block[draw]{}{kg\PfCTBstrut}&\Block[draw]{1-1}{hg\PfCTBstrut}&\Block[draw]{1-1}{dag\PfCTBstrut}&\Block[draw]{1-1}{g\PfCTBstrut}&\Block[draw]{1-1}{dg\PfCTBstrut}&\Block[draw]{1-1}{cg\PfCTBstrut}&\Block[draw]{1-1}{mg\PfCTBstrut}\\
        \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
          &&&&&&\\
        }%
        \Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}
        &\Block[]{}{}\\
        \CodeAfter
        % on trace les lignes verticales
        \xintFor* ##1 in {\xintSeq{1}{8}}\do{%
          \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1);
        }%
        % On place le nombre éventuel
        \ifx\bla#2\bla%
        \else%
        \setsepchar[*]{,*/}
        \readlist*\ListeNombreAPlacer{#2}%
        \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{
          \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]%
          \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{%
            \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};
          }%
        }
        \fi%
        % on trace les flèches
        \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%
        \ifboolKV[ClesTableaux]{FlechesH}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});%
          }%
        }{}%
        \ifboolKV[ClesTableaux]{FlechesB}{%
          \xintFor* ##1 in {\xintSeq{1}{6}}\do{%
            \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});%
          }%
        }{}%
        \useKV[ClesTableaux]{CodeAfter}%
      \end{NiceTabular}%
    \]%
  }{}%
}%
}%

\newcommand\PfCTableauIncline{%
\begin{NiceTabular}{wc{1.5em}wc{1.5em}wc{1.5em}wc{1.5em}wc{1.5em}wc{1.5em}wc{1.5em}}
  &&&&&&\\
  \Block[borders={bottom}]{}{\si{\kilo\PfCTableauUnite}}&\\
  &\Block[borders={left}]{}{}&\\
  &\Block[borders={left,bottom}]{}{\si{\hecto\PfCTableauUnite}}&\\
  &&\Block[borders={left}]{}{}&\\
  &&\Block[borders={left,bottom}]{}{\si{\deca\PfCTableauUnite}}&\\
  &&&\Block[borders={left}]{}{}&\\
  &&&\Block[borders={left,bottom}]{}{\si{\PfCTableauUnite}}&\\
  &&&&\Block[borders={left}]{}{}&\\
  &&&&\Block[borders={left,bottom}]{}{\si{\deci\PfCTableauUnite}}&\\
  &&&&&\Block[borders={left}]{}{}&\\
  &&&&&\Block[borders={left,bottom}]{}{\si{\centi\PfCTableauUnite}}&\\
  &&&&&&\Block[borders={left}]{}{}\\
  &&&&&&\Block[borders={left,bottom}]{}{\si{\milli\PfCTableauUnite}}\\
  &&&&&&
  \CodeAfter
  \tikz\draw[out=35,in=90,-stealth,gray] (2-|1.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(4-|2.5);
  \tikz\draw[out=35,in=90,-stealth,gray] (4-|2.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(6-|3.5);
  \tikz\draw[out=35,in=90,-stealth,gray] (6-|3.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(8-|4.5);
  \tikz\draw[out=35,in=90,-stealth,gray] (8-|4.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(10-|5.5);
  \tikz\draw[out=35,in=90,-stealth,gray] (10-|5.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(12-|6.5);
  \tikz\draw[out=35,in=90,-stealth,gray] (12-|6.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(14-|7.5);
  % bas
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (15-|7.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(13-|6.5);
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (13-|6.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(11-|5.5);
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (11-|5.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(9-|4.5);
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (9-|4.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(7-|3.5);
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (7-|3.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(5-|2.5);
  \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (5-|2.5) to node[midway,left]{\footnotesize$\div{\PfCCoefConversion}$}(3-|1.5);
\end{NiceTabular}%
}%

%%%
% Cards
%%%
\newtcolorbox{Mybox}[3]{%
  enhanced,%
  nobeforeafter,%
  left=0pt,right=0pt,top=0pt,%
  text fill,%
  width=\largeurcarte,%
  height=\hauteurcarte,%
  arc=5pt,%
  overlay unbroken and first={%
    \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west);%
    \coordinate[yshift=-0.5\hauteurtitre] (B1) at (frame.north east);%   
    \coordinate[yshift=-\hauteurtitre] (A) at (frame.north west);%
    \coordinate[yshift=-\hauteurtitre] (B) at (frame.north east);%
    \coordinate[xshift=1.5pt,yshift=8mm] (S1) at (frame.south west);%
    \coordinate[xshift=-1.5pt,yshift=8mm] (S2) at (frame.south east);%
    \coordinate[xshift=3mm+(\largeurtitre/2)] (A2) at (A1);%
    \coordinate[xshift=-3mm-(\largeurtitre/2)] (B2) at (B1);%
    \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T1) at (A2){};%
    \node[TexteCouleur] (T1a) at (T1){\Large #1};%
    \node[yshift=-0.65cm] (T1b) at (T1){\tiny r\'eponse pr\'ec\'edente};%
    \node[inner sep=0pt,rounded corners, rectangle, draw=black,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T2) at (B2){};%
    \node[inner sep=0pt,TexteCouleur] (T2a) at (T2){%
      \begin{minipage}{\largeurtitre}%
        \begin{center}%
          #2%
        \end{center}%
      \end{minipage}%
    };%
    \node[yshift=-0.65cm] (T2b) at (T2){};%
    \ifboolKV[Cards]{Titre}{\node[] at (T2b) {\tiny\useKV[Cards]{NomTitre}};}{}%
    \node[rectangle,xshift=5pt,yshift=4.25mm,minimum width=2em,rounded corners,fill=TrameCouleur,draw=black,anchor=west] (R) at (frame.south west) {\color{black}\Large\bfseries #3};%
    \draw[dashed] (S1) -- (S2);%
  },%
  colback=white,%
  colbacktitle=TrameCouleur,%
}

\newtcolorbox{MyboxJQ}[2]{%
  enhanced,
  nobeforeafter,
  left=0pt,right=0pt,top=0pt,
  text fill,
  width=\largeurcarte,
  height=\hauteurcarte,
  arc=5pt,
  overlay unbroken and first={%
    \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west);
    \coordinate[yshift=0\hauteurtitre] (S3) at (frame.center);
    \coordinate[yshift=3mm] (C3) at (frame.south);
    \coordinate[xshift=\largeurcarte/2] (A3) at (A1);
    \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A3){};
    \node[TexteCouleur] (T1a) at (T1){\Large J'ai};
    \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T2) at (S3){};
    \node[TexteCouleur] (T2a) at (T2){\Large Qui a ?};
    \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte1) at ($(A3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}%
        \begin{center}%
          #1%
        \end{center}%
      \end{minipage}};
    \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte2) at ($(C3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}%
        \begin{center}%
          #2%
        \end{center}%
      \end{minipage}};
  },
  colback=white,
}

\usetikzlibrary{backgrounds}

\makeatletter
%https://tex.stackexchange.com/questions/347434/clip-background-image-inside-tcolorbox
\newtcolorbox{MyboxSimpleAv}[1]{%
  enhanced,%
  nobeforeafter,%
  left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,%
  text fill,%
  width=\largeurcarte,%
  height=\hauteurcarte,%
  arc=5pt,%
  colback=white,%
  underlay={%
    \ifboolKV[Cards]{BackgroundAv}{%
      \begin{tcbclipinterior}
        \node[anchor=center,opacity=1]
        at (interior.center) {%
          \includegraphics[%
          height=\tcb@height,
          width=\tcb@width,
          ]{\useKV[Cards]{ImageAv}}};%
      \end{tcbclipinterior},%
    }{}%
  },%
  overlay unbroken and first={%
    \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);%
    \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}%
        \begin{center}%
          #1%
        \end{center}%
      \end{minipage}};%
    \node[yshift=-0.5em-0.5\hauteurtitre] (B) at (A){};%
    \ifboolKV[Cards]{Titre}{\node[fill=white] at (B) {\useKV[Cards]{NomTitre}};}{}%
  }%
}%

\newtcolorbox{MyboxSimpleAr}[1]{%
  enhanced,%
  nobeforeafter,%
  left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,%
  text fill,%
  width=\largeurcarte,%
  height=\hauteurcarte,%
  arc=5pt,%
  colback=white,%
  underlay={%
    \ifboolKV[Cards]{BackgroundAr}{%
      \begin{tcbclipinterior}
        \node[anchor=center,opacity=1]
        at (interior.center) {%
          \includegraphics[%
          height=\tcb@height,
          width=\tcb@width,
          ]{\useKV[Cards]{ImageAr}}};
      \end{tcbclipinterior}%,%
    }{}%
  },%
  overlay unbroken and first={%
    \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);%
    \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}%
        \begin{center}%
          #1%
        \end{center}%
      \end{minipage}};%
  }%
}%
\makeatother

\newtcolorbox{MyboxTrivial}[1][]{%
  enhanced,%
  nobeforeafter,%
  left=0pt,right=0pt,top=0pt,bottom=0pt,%
  text fill,%
  width=\largeurcarte,%
  height=\hauteurcarte,%
  arc=5pt,%
  colback=white,%
  #1
}

\newlength{\largeurcards}%
\newlength{\hauteurcards}%
\newlength{\largeurcarte}%
\newlength{\hauteurcarte}%
\newlength{\hauteurtitre}%
\newlength{\largeurtitre}%

\newlength{\margeh}%
\newlength{\margev}%

\NewEnviron{Trame}{%
  \begin{tikzpicture}[remember picture,overlay]
    % quadrillages horizontal et vertical
    \coordinate[yshift=-\margev] (A) at (current page.north west);%
    \coordinate[yshift=-\margev] (B) at (current page.north east);%
    \coordinate[yshift=-\hauteurcards] (A1) at (A);%
    \coordinate[yshift=-\hauteurcards] (B1) at (B);%
    \coordinate[yshift=-\hauteurcards] (A2) at (A1);%
    \coordinate[yshift=-\hauteurcards] (B2) at (B1);%
    \coordinate[yshift=-\hauteurcards] (A3) at (A2);%
    \coordinate[yshift=-\hauteurcards] (B3) at (B2);%
    \coordinate[yshift=-\hauteurcards] (A4) at (A3);%
    \coordinate[yshift=-\hauteurcards] (B4) at (B3);%
    \coordinate[xshift=\margeh] (C) at (current page.north west);%
    \coordinate[xshift=\margeh] (D) at (current page.south west);%
    \coordinate[xshift=\largeurcards] (C1) at (C);%
    \coordinate[xshift=\largeurcards] (D1) at (D);%
    \coordinate[xshift=\largeurcards] (C2) at (C1);%
    \coordinate[xshift=\largeurcards] (D2) at (D1);%
    \coordinate[xshift=\largeurcards] (C3) at (C2);%
    \coordinate[xshift=\largeurcards] (D3) at (D2);%
    \draw (A) -- (B);%
    \draw (A1) -- (B1);%
    \draw (A2) -- (B2);%
    \draw (A3) -- (B3);%
    \draw (A4) -- (B4);%
    \draw (C)--(D);%
    \draw (C1)--(D1);%
    \draw (C2)--(D2);%
    \draw (C3)--(D3);%
    % point pour placer les cartes
    \coordinate[xshift=\margeh+0.5\largeurcards,yshift=-0.5\hauteurcards] (Carte1) at (A);%
    \coordinate[xshift=\largeurcards,yshift=0mm] (Carte2) at (Carte1);%
    \coordinate[xshift=2\largeurcards,yshift=0mm] (Carte3) at (Carte1);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte4) at (Carte1);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte5) at (Carte2);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte6) at (Carte3);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte7) at (Carte4);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte8) at (Carte5);%
    \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte9) at (Carte6);%
    \BODY%
  \end{tikzpicture}%
}%

\setKVdefault[Cards]{Largeur=59,Hauteur=89,HauteurTheme=15,Marge=4,Landscape=false,Couleur=Cornsilk,Theme=Th\'eor\`eme\\de
  Pythagore,ThemeSol=Solution,Trame=false,Titre=false,NomTitre=Jeu 1,Loop,JaiQuia=false,BackgroundAv=false,BackgroundAr=false,ImageAv=4813762.jpg,ImageAr=4813762.jpg,AffichageSolution=true,SolutionSeule=false,%
  % Pour le trivial
  Trivial=false,Symboles={\faInfinity,\faSignal,\faProjectDiagram,\faHiking,\faRuler,\faLockOpen}
}%

\newcommand\Cartes[2][]{%
  \useKVdefault[Cards]%
  \setKV[Cards]{#1}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeCards{#2}%
  \ifboolKV[Cards]{Landscape}{%
    \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}%
    \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}%
    \setlength{\largeurcards}{95mm}%
    \setlength{\hauteurcards}{65mm}%
    \setlength{\margeh}{(297mm-3\largeurcards)/2}%
    \setlength{\margev}{(210mm-3\hauteurcards)/2}%
  }{%
    \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}%
    \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}%
    \setlength{\largeurcards}{65mm}%
    \setlength{\hauteurcards}{95mm}%
    \setlength{\margeh}{(210mm-3\largeurcards)/2}%
    \setlength{\margev}{(297mm-3\hauteurcards)/2}%
  }%
  \setlength{\hauteurtitre}{\fpeval{\useKV[Cards]{HauteurTheme}}mm}%
  \setlength{\largeurtitre}{\fpeval{(\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}-9)/2}mm}%
  \colorlet{TexteCouleur}{black}%
  \colorlet{TrameCouleur}{\useKV[Cards]{Couleur}}%
  \ifboolKV[Cards]{Trivial}{%
    \xdef\PfCListeSymbolTrivial{\useKV[Cards]{Symboles}}%
    \setsepchar{,}\readlist*\ListeSymbolesTrivial{\PfCListeSymbolTrivial}%
    \setlength{\tabcolsep}{0.25\tabcolsep}
    \ifboolKV[Cards]{Trame}{%
      \clearpage%
      \thispagestyle{empty}%
      \begin{Trame}
        \multido{\i=1+1}{9}{%
          \node[] at (Carte\i) {%
            \begin{MyboxTrivial}%
              \begin{center}
                \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[9,m]}[hvlines]
                  \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
                    \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\i,\fpeval{1+2*(##1-1)}]\\
                  }%
                \end{NiceTabular}
              \end{center}
            \end{MyboxTrivial}%
          };%
        }%
      \end{Trame}%
      \ifboolKV[Cards]{AffichageSolution}{%
        \clearpage%
        \thispagestyle{empty}%
        \begin{Trame}
          \multido{\i=1+1}{3}{%
            \node at (Carte\i) {%
              \begin{MyboxTrivial}%
                \begin{center}
                  \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]
                    \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
                      \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{4-\i},\fpeval{2*##1}]\\
                    }%
                  \end{NiceTabular}
                \end{center}
              \end{MyboxTrivial}%
            };%
          }%
          \multido{\i=4+1}{3}{%
            \node at (Carte\i) {%
              \begin{MyboxTrivial}%
                \begin{center}
                  \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]
                    \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
                      \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{10-\i},\fpeval{2*##1}]\\
                    }%
                  \end{NiceTabular}
                \end{center}
              \end{MyboxTrivial}%
            };%
          }%
          \multido{\i=7+1}{3}{%
            \node at (Carte\i) {%
              \begin{MyboxTrivial}
                \begin{center}
                  \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]
                    \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
                      \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{16-\i},\fpeval{2*##1}]\\
                    }%
                  \end{NiceTabular}
                \end{center}
              \end{MyboxTrivial}%
            };%
          }%
        \end{Trame}%
        \clearpage%
      }{}%
    }{%
      \begin{MyboxTrivial}%
        \begin{center}
          \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]
            \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
              \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{1+2*(##1-1)}]\\
            }%
          \end{NiceTabular}
        \end{center}
      \end{MyboxTrivial}%
      \ifboolKV[Cards]{AffichageSolution}{%
        \begin{MyboxTrivial}%
          \begin{center}
            \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]
              \xintFor* ##1 in{\xintSeq{1}{6}}\do{%
                \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{2*##1}]\\
              }%
            \end{NiceTabular}
          \end{center}
        \end{MyboxTrivial}%
      }{}%
    }%
    \setlength{\tabcolsep}{4\tabcolsep}%
  }{%
    \ifboolKV[Cards]{JaiQuia}{%
      \ifboolKV[Cards]{Trame}{%
        \clearpage%
        \thispagestyle{empty}%
        \begin{Trame}
          \multido{\i=1+1}{9}{%
            \node at (Carte\i) {%
              \begin{MyboxJQ}{\ListeCards[\i,1]}{\ListeCards[\i,2]}%
                %% 
              \end{MyboxJQ}%
            };%
          }%
        \end{Trame}%
        \clearpage%
      }{%
        \begin{MyboxJQ}{\ListeCards[1,1]}{\ListeCards[1,2]}%
          %% 
        \end{MyboxJQ}%
      }%
    }{%
      \ifboolKV[Cards]{Loop}{%
        \ifboolKV[Cards]{Trame}{%
          \clearpage%
          \thispagestyle{empty}%
          \begin{Trame}
            \multido{\i=1+1}{9}{%
              \node at (Carte\i) {%
                \begin{Mybox}{\ListeCards[\i,1]}{\useKV[Cards]{Theme}}{\ListeCards[\i,2]}%
                  \ListeCards[\i,3]%
                \end{Mybox}%
              };%
            }%
          \end{Trame}%
          \clearpage%
        }{%
          \begin{Mybox}{\ListeCards[1,1]}{\useKV[Cards]{Theme}}{\ListeCards[1,2]}%
            \ListeCards[1,3]%
          \end{Mybox}%
        }%
      }{%
        \ifboolKV[Cards]{Trame}{%
          \clearpage%
          \thispagestyle{empty}%
          \begin{Trame}
            \multido{\i=1+1}{9}{%
              \node[] at (Carte\i) {%
                \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}%
                  \ListeCards[\i,1]%
                \end{MyboxSimpleAv}%
              };%
            }%
          \end{Trame}%
          \ifboolKV[Cards]{AffichageSolution}{%
            \clearpage%
            \thispagestyle{empty}%
            \begin{Trame}
              \multido{\i=1+1}{3}{%
                \node at (Carte\i) {%
                  \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}%
                    \ListeCards[\fpeval{4-\i},2]%
                  \end{MyboxSimpleAr}%
                };%
              }%
              \multido{\i=4+1}{3}{%
                \node at (Carte\i) {%
                  \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}%
                    \ListeCards[\fpeval{10-\i},2]%
                  \end{MyboxSimpleAr}%
                };%
              }%
              \multido{\i=7+1}{3}{%
                \node at (Carte\i) {%
                  \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}%
                    \ListeCards[\fpeval{16-\i},2]%
                  \end{MyboxSimpleAr}%
                };%
              }%
            \end{Trame}%
            \clearpage%
          }{}%
        }{%
          \ifboolKV[Cards]{SolutionSeule}{}{%
            \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}%
              \ListeCards[1,1]%
            \end{MyboxSimpleAv}%
          }%
          \ifboolKV[Cards]{AffichageSolution}{%
            \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}%
              \ListeCards[1,2]%
            \end{MyboxSimpleAr}%
          }{}%
        }%
      }%
    }%
  }%
}%

\newcommand\SolutionCarte[2]{%
  \begin{center}
    \bfseries#1
  \end{center}
  
  #2
}%

%%%
% Tableur
%%%
\setKVdefault[Tableur]{Colonnes=4,Largeur=3,LargeurUn=3,Bandeau=true,Formule={},Cellule=A1,Ligne=0,Colonne=0,PasL=1,PasC=1,Selection=false}%
%Idee de P. Nuns
\defKV[Tableur]{Couleur=\setKV[Tableur]{Selection}}%
%

%Bas\'e sur un code de Christian T\'ell\'ech\'ea.
\makeatletter
\newcount\cntlin
\newcount\cntcol

\newtoks\t@b
\long\def\ifremain@lines#1\\#2\@nil{%
  \csname @\ifx\@empty#2\@empty second\else first\fi oftwo\endcsname}
\long\def\subst@eol#1\\#2\@nil{\addtot@b{#1\\}%
  \ifremain@lines#2\\\@nil{\addtot@b&\subst@eol#2\@nil}{\addtot@b{#2\CodeAfter\xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{%
        \tikz\node at (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}}) {\tiny$\blacksquare$};%
      }%
    \end{NiceTabular}}}}%
\long\def\collectcp@body#1\end{\subst@eol#1\@nil\end}

\newcommand\addtot@b[1]{\t@b\expandafter{\the\t@b#1}}
\newcommand\edftot@b[1]{\edef\temp@{#1}\expandafter\addtot@b\expandafter{\temp@}}

\newlength\PfCLongInter%
\newlength\PfCTableurLargeurUn%
\newlength\PfCTableurLargeur%
\setlength{\PfCTableurLargeurUn}{\useKV[Tableur]{LargeurUn}em}
\setlength{\PfCTableurLargeur}{\useKV[Tableur]{Largeur}em}
\newenvironment{Tableur}[1][]{%
  \useKVdefault[Tableur]%
  \setKV[Tableur]{#1}%
  
  \ttfamily%
  \newcolumntype Y{>{\centering\arraybackslash}wc{\PfCTableurLargeurUn}}%
  \newcolumntype X{>{\centering\arraybackslash}wc{\PfCTableurLargeurUn}}%
  \ifboolKV[Tableur]{Bandeau}{%
    \setlength{\PfCLongInter}{\fpeval{\useKV[Tableur]{LargeurUn}+(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}-4}em+\fpeval{\useKV[Tableur]{Colonnes}*2-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+1}\arrayrulewidth}%
    \begin{NiceTabular}{wc{\PfCTableurLargeur}wc{1em}wc{5em}wc{\PfCLongInter}}%
      \Block[draw]{}{}\useKV[Tableur]{Cellule}&\Block[draw]{}{}\centering\arraybackslash\scriptsize$\blacktriangledown$&$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$&\Block[draw]{}{}\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$\\
    \end{NiceTabular}%
    \nopagebreak
    \\
  }{}
  \cntlin\z@
  \t@b{%
    \begin{NiceTabular}{%
        >{%
          \global\cntcol\z@\global\advance\cntlin\@ne
          \centering\arraybackslash
          \ifnum\cntlin>\@ne
          \ifboolKV[Tableur]{Selection}{%
            \xintifboolexpr{\cntlin>\useKV[Tableur]{Ligne} && \cntlin<\fpeval{\useKV[Tableur]{Ligne}+\useKV[Tableur]{PasL}+1}}{\textcolor{white}{\number\numexpr\cntlin-1\relax}}{\number\numexpr\cntlin-1\relax}
          }{\number\numexpr\cntlin-1\relax}\fi}
        wc{2em}Y*{\fpeval{\useKV[Tableur]{Colonnes}-1}}{X}}[hvlines]%
      \CodeBefore
      % on colorie en gris toute la première ligne
      \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (row-2-|last);%
      % on colorie en gris toute la première colonne
      \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (last-|col-2);%
      %
      \xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{%
        \ifboolKV[Tableur]{Selection}{%
          \xdef\PfCTabCouleur{\useKV[Tableur]{Couleur}}%
          % on colorie les cellules sans les tracer
          \tikz\draw[fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});%
          % on trace la première cellule qui a servi à sélectionner
          \tikz\draw[line width=1.25pt,fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+1});%
          % on colorie la zone nécessaire sur la première ligne
          \tikz\draw[fill=\PfCTabCouleur](row-1-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-2-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});%
          % on colorie la zone nécessaire sur la première colonne
          \tikz\draw[fill=\PfCTabCouleur](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-1) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-2);%
        }{%
          \tikz\draw[line width=1.25pt](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});%
        }%
      }%
      \Body
    %
  }%
  \loop%
  \ifnum\cntcol<\useKV[Tableur]{Colonnes}%
  \advance\cntcol\@ne%
  \addtot@b{&}%
  % modif by Pascal Nuns
  \ifboolKV[Tableur]{Selection}{%
    \ifnum \cntcol>\fpeval{\useKV[Tableur]{Colonne}-1}%
    \ifnum  \cntcol<\fpeval{\useKV[Tableur]{Colonne}+\useKV[Tableur]{PasC}}%
    \edftot@b{{\noexpand\textcolor{white}{\noexpand\bfseries\@Alph{\the\cntcol}}}}%
    \else%
    \edftot@b{\@Alph{\the\cntcol}}%
    \fi%
    \else%
    \edftot@b{\@Alph{\the\cntcol}}%
    \fi%
  }{\edftot@b{\@Alph{\the\cntcol}}}%
  % fin de modif
  \repeat
  \addtot@b{\\&}%
  \collectcp@body}{\the\t@b}
\makeatother

%%%
% Domino
%%%
\newtcolorbox{MyDominoMini}[1][]{%
  enhanced,
  nobeforeafter,
  left skip=0pt,
  right skip=0pt,
  left=0pt,right=0pt,top=0pt,bottom=0pt,
  width=\textwidth/\ColonneDomino,
  height=\textheight/\LigneDomino,
  segmentation style={solid, line width=1.5pt},
  colback=\CouleurDomino,
  center upper,
  valign upper=center,
  center lower,
  valign lower=center,
  arc=2pt,
  #1
}

\newtcolorbox{MyDominoLogo}[1][]{%
  enhanced,
  nobeforeafter,
  left skip=0pt,
  right skip=0pt,
  left=0pt,right=0pt,top=0pt,bottom=0pt,
  width=\textwidth/\ColonneDomino,
  height=\textheight/\LigneDomino,
  valign=center,
  halign=center,
  arc=2pt,
  colback=white,
  #1
}

\NewEnviron{TrameDomino}{%
  \setlength{\margev}{1cm}
  \setlength{\margeh}{1cm}
  \begin{tikzpicture}[remember picture,overlay]
    % quadrillages horizontal et vertical
    \coordinate[yshift=-\margev] (A0) at (current page.north west);
    \coordinate[yshift=-\margev] (B0) at (current page.north east);
    \foreach \i in {1,...,\useKV[Domino]{Lignes}}{%
      \coordinate[yshift=-\i*\textheight/\LigneDomino] (A\i) at (A0);
      \coordinate[yshift=-\i*\textheight/\LigneDomino] (B\i) at (B0);
    }
    \coordinate[xshift=\margeh] (C0) at (current page.north west);
    \coordinate[xshift=\margeh] (D0) at (current page.south west);
    \foreach \i in {1,...,\useKV[Domino]{Colonnes}}{
      \coordinate[xshift=\i*\textwidth/\ColonneDomino] (C\i) at (C0);
      \coordinate[xshift=\i*\textwidth/\ColonneDomino] (D\i) at (D0);
    }
    \foreach \i in {0,...,\LigneDomino}{%
      \draw (A\i) -- (B\i);
    }
    \foreach \i in {0,...,\ColonneDomino}{%
      \draw (C\i) -- (D\i);
    }
    \draw[blue, line width=3pt] (A0)--(B0);
    \draw[blue, line width=3pt] (A\LigneDomino)--(B\LigneDomino);
    \draw[blue, line width=3pt] (C0)--(D0);
    \draw[blue, line width=3pt] (C\ColonneDomino)--(D\ColonneDomino);
    % point pour placer les cartes
    \foreach \i in {0,...,\fpeval{\ColonneDomino-1}}{%
      \foreach \j in {0,...,\fpeval{\LigneDomino-1}}{%
        \coordinate[xshift=\margeh+(0.5\textwidth/\ColonneDomino)+\i*\textwidth/\ColonneDomino,yshift=-0.5\textheight/\LigneDomino-\j*\textheight/\LigneDomino]
        (Domino\fpeval{\i+\ColonneDomino*\j+1}) at (A0);
      }
    }
    \BODY
  \end{tikzpicture}
}

\setKVdefault[Domino]{Couleur=white,Trame,Ratio=0.5,Lignes=7,Colonnes=5,Superieur=false,Logo=false,Image=tiger.pdf}

\newcommand\Dominos[2][]{%
  \useKVdefault[Domino]%
  \setKV[Domino]{#1}%
  \setsepchar[*]{§*/}%
  \readlist*\ListeDominos{#2}%
  \xdef\CouleurDomino{\useKV[Domino]{Couleur}}%
  \xdef\ratiodomino{\useKV[Domino]{Ratio}}%
  \xdef\LigneDomino{\useKV[Domino]{Lignes}}%
  \xdef\ColonneDomino{\useKV[Domino]{Colonnes}}%
  \ifboolKV[Domino]{Trame}{%
    \clearpage
    \begin{TrameDomino}
      \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{%
        \node[] at (Domino\i){%
          \ifboolKV[Domino]{Superieur}{%
            \begin{MyDominoMini}[space=\ratiodomino]%
              \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]%
            \end{MyDominoMini}%
          }{%
            \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]%
              \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]%          
            \end{MyDominoMini}%
          }%
        };
      }%
    \end{TrameDomino}%
    \ifboolKV[Domino]{Logo}{%
      \clearpage
      \begin{TrameDomino}
        \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{%
          \node at (Domino\i){%
            \begin{MyDominoLogo}%
              \includegraphics[height=\tcbtextheight]{\useKV[Domino]{Image}}
            \end{MyDominoLogo}%
          };
        }%
      \end{TrameDomino}%
    }{}%
  }{%
    \ifboolKV[Domino]{Superieur}{%
      \begin{MyDominoMini}[space=\ratiodomino]%
        \ListeDominos[1,1]\tcblower\ListeDominos[1,2]%
      \end{MyDominoMini}%
    }{%
      \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]%
        \ListeDominos[1,1]\tcblower%
        \ListeDominos[1,2]%          
      \end{MyDominoMini}%
    }%
  }%
}%

%%%%
% Prog de calculs "simples"
%%%%
\setKVdefault[ClesProg]{%
  Ecart=2em,%
  Direct,%
  SansCalcul=false,%
  Application=false,
  Details=false,
  Enonce=false,
  Nom={},
  CouleurCadre=black,%
  CouleurFond=gray!10,%
  Largeur={.95\linewidth},%
  Epaisseur=.75pt,%
  Pointilles=0,
  ThemePerso=false,
}

\newcounter{NBprog}%
\setcounter{NBprog}{0}%

\newlength{\PointillesClesProg}%

\newcommand\ProgCalcul[2][]{%
  % #1 : cl\'es
  % #2 : \'etapes
  \useKVdefault[ClesProg]%
  \setKV[ClesProg]{#1}%
  \ifboolKV[ClesProg]{ThemePerso}{}{%
    \tcbset{ProgCalcul/.style={%
        boxsep=1mm,
        bottom=.75mm,
        middle=2mm,
        boxrule={\useKV[ClesProg]{Epaisseur}},
        text width={\useKV[ClesProg]{Largeur}},
        colframe={\useKV[ClesProg]{CouleurCadre}},
        colback={\useKV[ClesProg]{CouleurFond}},
        halign upper=center
      }%
    }%
  }%
  \ifboolKV[ClesProg]{Application}{%
    %    % by Thomas Dehon and cp
    \setsepchar[*]{§*,}
    % \setsepchar[*]{,* }%
    \ignoreemptyitems%
    \readlist*\ListeTotale{#2}%
    \xdef\PfCPCfoo{\ListeTotale[1]}%
    \xdef\PfCPCfaa{\ListeTotale[2]}%
    %% 
    \setsepchar{,}%    \ignoreemptyitems%
    \readlist*\ListeEtapes{\PfCPCfoo}%
    \setsepchar[*]{,* }\ignoreemptyitems%
    \readlist*\ListeProg{\PfCPCfaa}%
      \begin{tcolorbox}[%
        ProgCalcul,%
        ]
        \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}%
        {}%
        {%
          {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}%
          \tcblower
        }%
        \ifboolKV[ClesProg]{SansCalcul}{%
          \begin{enumerate}
          \item Choisir un nombre~\pointilles~$\ListeProg[1]$%
            \foreachitem\etape\in\ListeEtapes{%
            \item \etape~\pointilles~$\ListeProg[3,\etapecnt]$
            }%
          \end{enumerate}
        }{\begin{enumerate}
          \item Choisir un nombre~\pointilles~\xdef\NbDepart{\ListeProg[1]}\num{\NbDepart}
            \foreachitem\etape\in\ListeEtapes{%
            \item \etape~\pointilles~\edef\Test{\ListeProg[2,\etapecnt]}%
              \expandarg%
              \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]%
              \StrSubstitute{\tempa}{**}{^}[\tempab]%
              \StrSubstitute{\tempab}{*}{\times}[\tempac]%
              \StrSubstitute{\tempac}{/}{\div}[\tempad]%
              $\ifboolKV[ClesProg]{Details}{\xintifboolexpr{\NbDepart<0}{(\num{\NbDepart})}{\num{\NbDepart}}\tempad=}{}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\etapecnt]}}\num{\NbDepart}$%
            }%
          \end{enumerate}
        }
      \end{tcolorbox}
  }{%
    \ifboolKV[ClesProg]{Enonce}{%
      % by Thomas Dehon
      \setsepchar[*]{,* }%
      \ignoreemptyitems%
      \readlist*\ListeEtapes{#2}% 
      \begin{tcolorbox}[%
        ProgCalcul,%
        ]
        \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}%
        {}%
        {%
          {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}%
          \tcblower
        }%
        \begin{enumerate}
          \foreachitem\etape\in\ListeEtapes{%
          \item \etape 
            \ifthenelse{\equal{\useKV[ClesProg]{Pointilles}}{0}}%
            {}%
            {%
              \setlength{\PointillesClesProg}{\useKV[ClesProg]{Pointilles}}
              \hfill \pointilles[\PointillesClesProg]%
            }%
          }
        \end{enumerate}
      \end{tcolorbox}
    }{%
      \setsepchar[*]{,* }\ignoreemptyitems%
      \readlist*\ListeProg{#2}%
      \stepcounter{NBprog}%
      \xdef\NbDepart{\ListeProg[1]}%
      \ifboolKV[ClesProg]{SansCalcul}{%
        $\NbDepart$\foreachitem\compteur\in\ListeProg[2]{%
          \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\hspace{0.2em}$\ListeProg[3,\compteurcnt]$%
        }%
        \begin{tikzpicture}[remember picture, overlay]
          \foreachitem\compteur\in\ListeProg[2]{%
            \edef\Test{\ListeProg[2,\compteurcnt]}
            \expandarg%
            \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]%
            \StrSubstitute{\tempa}{**}{^}[\tempab]%
            \StrSubstitute{\tempab}{*}{\times}[\tempac]%
            \StrSubstitute{\tempac}{/}{\div}[\tempad]%
            \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) --
            node[above]{\scriptsize$\tempad$}(pic cs:B-\theNBprog-\compteurcnt);
          }
        \end{tikzpicture}  
      }{%
        \num{\NbDepart}\foreachitem\compteur\in\ListeProg[2]{%
          \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\compteurcnt]}}\hspace{0.2em}\num{\NbDepart}%
        }%
        \ifboolKV[ClesProg]{Direct}{%
          \begin{tikzpicture}[remember picture, overlay]
            \foreachitem\compteur\in\ListeProg[2]{%
              \edef\Test{\ListeProg[2,\compteurcnt]}
              \expandarg%
              \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]%
              \StrSubstitute{\tempa}{**}{^}[\tempab]%
              \StrSubstitute{\tempab}{*}{\times}[\tempac]%
              \StrSubstitute{\tempac}{/}{\div}[\tempad]%
              \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) --
              node[above]{\scriptsize$\tempad$}(pic
              cs:B-\theNBprog-\compteurcnt);
            }
          \end{tikzpicture}
        }{%
          \begin{tikzpicture}[remember picture, overlay]
            \foreachitem\compteur\in\ListeProg[2]{%
              \edef\Test{\ListeProg[2,\compteurcnt]}
              \expandarg%
              \StrSubstitute{\Test}{^2}{\empty\sqrt{\dots{}}}[\tempa]%
              \StrSubstitute{\tempa}{**}{^}[\tempab]%
              \StrSubstitute{\tempab}{*}{\div}[\tempac]%
              \StrSubstitute{\tempac}{/}{\times}[\tempad]%
              \StrSubstitute{\tempad}{-}{+}[\tempae]%
              \StrSubstitute{\tempae}{++}{-}[\tempaf]%
              \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:B-\theNBprog-\compteurcnt) --  node[above]{\scriptsize$\tempaf$}(pic cs:A-\theNBprog-\compteurcnt);
            }
          \end{tikzpicture}
        }%
      }%
    }%
  }%
}%

%%%
% Papiers
%%%
\setKVdefault[Papiers]{Cinq=true,Seyes=false,Isometrique=false,IsometriquePointe=false,Millimetre=false,Triangle=false,Largeur=5,Hauteur=4,Couleur=black,Grille=-1,GrillePointe=-1,PageEntiere=false,ZoneTexte=false,Baseline=false}%

%\def\MPBaseLineSkip#1#2#3{%à retravailler : ne fonctionne pas :(
%  %
%  \ifluatex
%  \mplibforcehmode
%  \begin{mplibcode}
%    path horizon,verticon;
%    horizon=(0,0)--(#1*cm,0);
%    %verticon=(0,0)--(0,#2*cm);
%    drawoptions(withcolor #3);
%    %for k=0 step 0.5 until #1:
%    %draw verticon shifted((k*cm,0));
%    %endfor;
%    for k=(#2-(\mpdim{1.6ex}/1cm)) step (-\mpdim{\baselineskip}/1cm) until 0:
%    draw horizon shifted((0,k*cm));
%    endfor;
%    drawoptions(withcolor blue);
%    for k=#2 step (-\mpdim{\baselineskip}/1cm) until 0:
%    draw horizon shifted((0,k*cm));
%    endfor;
%  \end{mplibcode}
%  \fi
%}

\def\MPGrille#1#2#3#4{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step (#4*100) until (#1*100):
    draw verticon shifted(((k/100)*cm,0));
    endfor;
    for k=0 step (#4*100) until (#2*100):
    draw horizon shifted((0,(k/100)*cm));
    endfor;
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 0.5 until #1:
    draw verticon shifted((k*cm,0));
    endfor;
    for k=0 step 0.5 until #2:
    draw horizon shifted((0,k*cm));
    endfor;
  \end{mpost}%
  \fi%
}%

\def\MPGrillePointe#1#2#3#4{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    drawoptions(withcolor #3);
    for k=0 step (#4*100) until (#1*100):
    for l=0 step (#4*100) until (#2*100):
    fill (cercles((0,0),1pt) shifted(((k/100)*cm,(l/100)*cm)));
    endfor;
    endfor;
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    drawoptions(withcolor #3);
    for k=0 step (#4*100) until (#1*100):
    for l=0 step (#4*100) until (#2*100):
    fill (cercles((0,0),0.5pt) shifted(((k/100)*cm,(l/100)*cm)));
    endfor;
    endfor;
  \end{mpost}%
  \fi%
}%

\def\MPCinq#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 0.5 until #1:
    draw verticon shifted((k*cm,0));
    endfor;
    for k=0 step 0.5 until #2:
    draw horizon shifted((0,k*cm));
    endfor;
  \end{mplibcode}%
  \else%
  \begin{mpost}
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 0.5 until #1:
    draw verticon shifted((k*cm,0));
    endfor;
    for k=0 step 0.5 until #2:
    draw horizon shifted((0,k*cm));
    endfor;
  \end{mpost}%
  \fi%
}%

\def\MPSeyes#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 8 until (#1*10):
    draw verticon shifted(((k/10)*cm,0));
    endfor;
    for k=0 step 2 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 8 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25;
    endfor;
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 8 until (#1*10):
    draw verticon shifted(((k/10)*cm,0));
    endfor;
    for k=0 step 2 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 8 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25;
    endfor;
  \end{mpost}
  \fi%
}%

\def\MPMillimetre#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until (#1*10):
    draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2;
    endfor;
    for k=0 step 5 until (#1*10):
    draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 1 until (#1):
    draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25;
    endfor;
    for k=0 step 1 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2;
    endfor;
    for k=0 step 5 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 1 until (#2):
    draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25;
    endfor;
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    path horizon,verticon;
    horizon=(0,0)--(#1*cm,0);
    verticon=(0,0)--(0,#2*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until (#1*10):
    draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2;
    endfor;
    for k=0 step 5 until (#1*10):
    draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 1 until (#1):
    draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25;
    endfor;
    for k=0 step 1 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2;
    endfor;
    for k=0 step 5 until (#2*10):
    draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5;
    endfor;
    for k=0 step 1 until (#2):
    draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25;
    endfor;
  \end{mpost}%
  \fi%
}%

\def\MPIsometrique#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path diagon,antidiagon;
    diagon=(0,0)--#2*(sqrt(3)*cm,1*cm);
    antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until (#1):
    draw diagon shifted((k*cm,0));
    draw antidiagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)/3) until (#2):
    draw diagon shifted((0,k*cm));
    draw antidiagon shifted((#1*cm,k*cm));
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm));
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    path diagon,antidiagon;
    diagon=(0,0)--#2*(sqrt(3)*cm,1*cm);
    antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until (#1):
    draw diagon shifted((k*cm,0));
    draw antidiagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)/3) until (#2):
    draw diagon shifted((0,k*cm));
    draw antidiagon shifted((#1*cm,k*cm));
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm));
  \end{mpost}%
  \fi%
}%

\def\MPIsometriquePointe#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    pair diagon,antidiagon;
    diagon=(1pt,1pt);
    antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3));
    drawoptions(withcolor #3);
    for k=0 step (sqrt(3)/3) until (#2):
    for l=0 step 1 until (#1):
    fill (cercles(diagon,1pt) shifted((l*cm,k*cm)));
    fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm)));
    endfor;
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt));
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    pair diagon,antidiagon;
    diagon=(1pt,1pt);
    antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3));
    drawoptions(withcolor #3);
    for k=0 step (sqrt(3)/3) until (#2):
    for l=0 step 1 until (#1):
    fill (cercles(diagon,1pt) shifted((l*cm,k*cm)));
    fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm)));
    endfor;
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt));
  \end{mpost}%
  \fi%
}%

\def\MPTriangulaire#1#2#3{%
  \ifluatex%
  \mplibforcehmode%
  \begin{mplibcode}%
    path horizon,diagon,antidiagon;
    horizon=(0,0)--(#1*cm,0);
    diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm);
    antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until #1:
    draw diagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)) until (#2):
    draw diagon shifted((0,k*cm));
    endfor;
    for k=0 step 1 until (#1):
    draw antidiagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)) until (#2):
    draw antidiagon shifted((#1*cm,k*cm));
    endfor;
    for k=0 step (sqrt(3)/2) until (#2):
    draw horizon shifted((0,k*cm));
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm));
  \end{mplibcode}%
  \else%
  \begin{mpost}%
    path horizon,diagon,antidiagon;
    horizon=(0,0)--(#1*cm,0);
    diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm);
    antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm);
    drawoptions(withcolor #3);
    for k=0 step 1 until #1:
    draw diagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)) until (#2):
    draw diagon shifted((0,k*cm));
    endfor;
    for k=0 step 1 until (#1):
    draw antidiagon shifted((k*cm,0));
    endfor;
    for k=0 step (sqrt(3)) until (#2):
    draw antidiagon shifted((#1*cm,k*cm));
    endfor;
    for k=0 step (sqrt(3)/2) until (#2):
    draw horizon shifted((0,k*cm));
    endfor;
    clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm));
  \end{mpost}%
  \fi%
}%

\RequirePackage{ifoddpage}

\newlength{\PapierLeftCurrent}

\newcommand\Papiers[1][]{%
  \useKVdefault[Papiers]%
  \setKV[Papiers]{#1}%
  \xdef\PapierLargeur{\useKV[Papiers]{Largeur}}%
  \xdef\PapierHauteur{\useKV[Papiers]{Hauteur}}%
  \xdef\PapierCouleur{\useKV[Papiers]{Couleur}}%
  \xdef\PapierGrille{\useKV[Papiers]{Grille}}%
  \xdef\PapierGrillePointe{\useKV[Papiers]{GrillePointe}}%
  \checkoddpage%
  \ifoddpage%
  \setlength{\PapierLeftCurrent}{\oddsidemargin}%
  \else%
  \setlength{\PapierLeftCurrent}{\evensidemargin}%
  \fi%
  \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}%
  \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}%
  \ifboolKV[Papiers]{ZoneTexte}{%
    \xdef\PapierHauteur{\fpeval{\textheight/1cm}}%
    \xdef\PapierLargeur{\fpeval{\textwidth/1cm}}%
    \begin{tikzpicture}[remember picture,overlay]%
      \node[anchor=south west,inner sep=0pt,transform canvas={xshift=\PapierLeft,yshift=\PapierBottom}] at (current page.south west) {%
        \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{%
          \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}%
        }{%
          \xintifboolexpr{\useKV[Papiers]{Grille}>0}{%
            \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}%
          }{\ifboolKV[Papiers]{Baseline}{%
              \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
            }{%
              \ifboolKV[Papiers]{IsometriquePointe}{%
                \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
              }{%
                \ifboolKV[Papiers]{Triangle}{%
                  \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                }{\ifboolKV[Papiers]{Millimetre}{%
                    \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                  }{\ifboolKV[Papiers]{Isometrique}{%
                      \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                    }{\ifboolKV[Papiers]{Seyes}{%
                        \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                      }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      };%
    \end{tikzpicture}%
  }{%
    \ifboolKV[Papiers]{PageEntiere}{%
      \xdef\PapierHauteur{\fpeval{\paperheight/1cm}}%
      \xdef\PapierLargeur{\fpeval{\paperwidth/1cm}}%
      \begin{tikzpicture}[remember picture,overlay]%
        \node[anchor=south west,inner sep=0pt] at (current page.south west) {%
          \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{%
            \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}%
          }{%
            \xintifboolexpr{\useKV[Papiers]{Grille}>0}{%
              \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}%
            }{\ifboolKV[Papiers]{IsometriquePointe}{%
                \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
              }{\ifboolKV[Papiers]{Triangle}{%
                  \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                }{\ifboolKV[Papiers]{Millimetre}{%
                    \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                  }{\ifboolKV[Papiers]{Isometrique}{%
                      \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                    }{\ifboolKV[Papiers]{Seyes}{%
                        \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                      }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        };%
      \end{tikzpicture}%
    }{%
      \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{%
        \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}%
      }{%
        \xintifboolexpr{\useKV[Papiers]{Grille}>0}{%
          \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}%
        }{\ifboolKV[Papiers]{Baseline}{%
            \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
          }{%
            \ifboolKV[Papiers]{IsometriquePointe}{%
              \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
            }{%
              \ifboolKV[Papiers]{Triangle}{%
                \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
              }{\ifboolKV[Papiers]{Millimetre}{%
                  \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                }{\ifboolKV[Papiers]{Isometrique}{%
                    \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                  }{\ifboolKV[Papiers]{Seyes}{%
                      \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                    }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }%
}%

%%%%
% Scratch
%%%%
\newlength{\longbarreheight}
\setlength{\longbarreheight}{2.1ex+3pt}

\newlength{\longbarredepth}
\setlength{\longbarredepth}{0.9ex+3pt}
\def\longbarre{\vrule height\longbarreheight depth\longbarredepth width0pt}%

\def\barre{\vrule height2.1ex depth.9ex width0pt}%
\def\demibarre{\vrule height1.4ex depth.6ex width0pt}%

\setKVdefault[Scratch]{Impression=false,Numerotation=false,Echelle=1,Naturel=false}%

\ifluatex
\NewDocumentEnvironment{Scratch}{o +b}{%
  \useKVdefault[Scratch]%
  \setKV[Scratch]{#1}%
  \mplibforcehmode%
  \ifboolKV[Scratch]{Naturel}{}{\myfontScratch}%
  \begin{mplibcode}%
    boolean Naturel;
    Naturel=\useKV[Scratch]{Naturel};
    if Naturel: input PfCPseudo; print:=true; else: input PfCScratch; print:=\useKV[Scratch]{Impression}; fi;
    NumeroteLignes:=\useKV[Scratch]{Numerotation};%
    #2%
    picture recap;%
    recap:=currentpicture scaled \useKV[Scratch]{Echelle};%
    currentpicture:=nullpicture;%
    draw recap;%
  \end{mplibcode}%
  }{}
\else%
\NewDocumentEnvironment{Scratch}{o +b}{%
  \setKV[Scratch]{#1}%
  \begin{mpost}[mpsettings={boolean Naturel;Naturel=\useKV[Scratch]{Naturel};if Naturel: input PfCPseudo; print:=true; else: input PfCScratch; print:=\useKV[Scratch]{Impression}; fi;NumeroteLignes:=\useKV[Scratch]{Numerotation};Echelle:=\useKV[Scratch]{Echelle};}]%
    #2%
    picture recap;%
    recap:=currentpicture scaled Echelle;%
    currentpicture:=nullpicture;%
    draw recap;%
  \end{mpost}
}{}%
\fi%