texlive[63823] Master/texmf-dist: profcollege (6jul22)

commits+karl at tug.org commits+karl at tug.org
Wed Jul 6 22:19:07 CEST 2022


Revision: 63823
          http://tug.org/svn/texlive?view=revision&revision=63823
Author:   karl
Date:     2022-07-06 22:19:06 +0200 (Wed, 06 Jul 2022)
Log Message:
-----------
profcollege (6jul22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/profcollege/ProfCollege-doc.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/ProfCollege-doc.zip
    trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
    trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty

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

Modified: trunk/Master/texmf-dist/doc/latex/profcollege/ProfCollege-doc.zip
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp	2022-07-06 20:18:37 UTC (rev 63822)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp	2022-07-06 20:19:06 UTC (rev 63823)
@@ -1276,4 +1276,240 @@
   tetrar
 enddef;
 
+%Outils
+numeric echelleequerre;
+echelleequerre=2;
+vardef equerre(expr dte,drte,perpe,sens)=
+  save picequerre;
+  picture picequerre;
+  pair ww,t[];
+  path intermede;
+  pair perpen,ptt,pttt;
+  perpen:=projection(perpe,dte,drte);
+  %if sens=1 :
+    ptt:=longueurequerre*(drte-dte) rotated 90 shifted perpen;
+  %else :
+%    ptt:=longueurequerre*(drte-dte) rotated (-90) shifted perpen;
+  %fi;
+  ww=unitvector(drte-dte);
+  intermede=ptt--(10[ptt,(perpen rotatedabout(ptt,if sens=1: 30 else:-30 fi))]);
+  pttt=intermede intersectionpoint (10[dte,drte]--10[drte,dte]);
+  picequerre=image(
+    draw perpen--ptt--pttt--cycle;
+    draw codeperp(ptt,perpen,pttt,5);
+    );
+  picequerre
+enddef;
+
+  vardef regle(expr depart,arrivee,rr)=
+  save picregle;
+  picture picregle,grad[],gradu[],final;
+  pair t[];
+  path reduit;
+  t1000=depart shifted (5*unitvector(depart-arrivee));
+  t1003=arrivee shifted (20*unitvector(arrivee-depart));
+  t1004=(unitvector(arrivee-depart) rotated (-90)) shifted t1000;
+  t1001=t1000 shifted (50*(t1004-t1000));
+  t1002=t1001 shifted (t1003-t1000);
+  reduit=t1000--t1001--t1002..(t1002 shifted(5*unitvector(t1001-t1002)+1/4(t1003-t1002)))..(t1002 shifted(5*unitvector(t1002-t1001)+2/4(t1003-t1002)))..(t1002 shifted(5*unitvector(t1001-t1002)+3/4(t1003-t1002)))..t1003--cycle;
+  gradu1=image(
+    for k=0 upto 59:
+      for j=1 upto 4:
+	t[5*k+j]=depart shifted (1mm*(5*k+j)*unitvector(arrivee-depart));
+	t[400+5*k+j]=t[5*k+j] shifted (2*(t1004-t1000));
+	draw t[5*k+j]--t[400+5*k+j];
+      endfor;
+    endfor
+    );
+  gradu2=image(
+    for k=0 upto 29:
+      t[5*(2*k+1)]=depart shifted (1mm*5*(2*k+1)*unitvector(arrivee-depart));
+      t[400+5*(2*k+1)]=t[5*(2*k+1)] shifted (5*(t1004-t1000));
+      draw t[5*(2*k+1)]--t[400+5*(2*k+1)];
+    endfor
+    );
+  gradu3=image(
+    for k=0 upto 30:
+      t[10*k]=depart shifted(1mm*10*k*unitvector(arrivee-depart));
+      t[400+10*k]=t[10*k] shifted (10*(t1004-t1000));
+      draw t[10*k]--t[400+10*k];
+    endfor
+    );
+  for j=0 upto 30:
+    grad[j]=image(
+	label.bot(TEX(""&decimal(j)&""),t[400+10*j]);
+      %affixe[j](t[400+10*j])s;
+      currentpicture:=currentpicture rotatedabout(t[400+10*j],90+angle(t[400+10*j]-t[10*j]));
+      );
+  endfor
+  final=image(
+    for k=0 upto 30:
+      draw grad[k];
+    endfor
+    for k=1 upto 3:
+      draw gradu[k];
+    endfor
+    clip currentpicture to reduit;
+    draw reduit;
+    );
+  if rr=-1:
+    picregle=image(
+      draw final rotatedabout(1/2[depart,arrivee],180);
+      );
+  else:
+    picregle=image(
+      draw final;
+      );
+  fi
+  picregle
+enddef;
+
+vardef crayon(expr depart,arrive,ptplace,nbechelle)=
+  save piccray;
+  picture piccray,crayolat;
+  pair w[];
+  w0=(0,0);
+  w1=(1,2)*u/2;
+  w2=(-1,2)*u/2;
+  w3=(0,2)*u/2;
+  w4=(0,7)*u/2;
+  path ccc,ccd;
+  ccc=cercles(w0,abs(w3-w2));
+  ccd=ccc yscaled 0.25 shifted w3;
+  crayolat=image(
+    draw subpath((length ccd)/2,length ccd) of ccd;
+    draw ccd shifted (w4-w3);
+    draw w2--w0--w1;
+    draw w1--((1,7)*u/2);
+    draw w2--((-1,7)*u/2);
+    );
+  crayolat:=crayolat scaled nbechelle;
+  piccray=(crayolat rotated(angle(arrive-depart)-30)) shifted ptplace;
+  piccray
+enddef;
+
+boolean Simple;
+Simple=false;
+
+vardef rapporteur(expr centre,segment,rr)=
+  save raps;
+  picture raps;
+  raps=image(
+  Simple:=true;
+  trace rapporteurdouble(centre,segment,rr);
+    Simple:=false;
+    );
+  raps
+enddef;
+
+vardef rapporteurdouble(expr centre,segment,rr)=
+  save rap,cc,cd,v,w,t,ww,vv;
+  picture rap;
+  path cc,cd;
+  pair a[],b[],v,w,t,ww,vv,rap[],rapp[];
+  cc=cercle(centre,0.75*abs(centre-segment));
+  t=cc intersectionpoint (centre--segment);
+  w=t-2*unitvector(segment-centre);v=symetrie(w,t);
+  ww=t-5*unitvector(segment-centre);vv=symetrie(ww,t);
+  a0=(ww-centre) shifted centre;
+  b0=(vv-centre) shifted centre;
+  for i=0 upto 35 :
+    for j=1 upto 4 :
+      a[5*i+j]=(w-centre) rotated (rr*(5*i+j)) shifted centre;
+      b[5*i+j]=(v-centre) rotated (rr*(5*i+j)) shifted centre;
+    endfor;
+    a[5*(i+1)]=(ww-centre) rotated (rr*(5*(i+1))) shifted centre;
+    b[5*(i+1)]=(vv-centre) rotated (rr*(5*(i+1))) shifted centre;
+  endfor
+  picture nomb[],nombre[];
+  if rr=1:
+    for j=0 upto 18:
+      nombre[10*j]=image(
+	  label.bot(TEX("\fontsize{4}{4}\selectfont"&decimal(10*j)&""),a[10*j]);
+	currentpicture:=currentpicture rotatedabout(a[10*j],angle(a[10*j]-centre)-90);
+	);
+    endfor
+    for j=0 upto 18:
+      nombre[10*j+1]=image(
+      % affixe.[180-10*j](b[10*j])n;
+      label.top(TEX("\fontsize{4}{4}\selectfont"&decimal(180-10*j)&""),b[10*j]);
+	currentpicture:=currentpicture rotatedabout(b[10*j],angle(b[10*j]-centre)-90);
+	);
+    endfor
+  else:
+    for j=0 upto 18:
+      nombre[10*j]=image(
+	  label.bot(TEX("\fontsize{4}{4}\selectfont"&decimal(180-10*j)&""),a[10*j]);
+	currentpicture:=currentpicture rotatedabout(a[10*j],angle(a[10*j]-centre)-90);
+	);
+    endfor
+    for j=18 downto 0:
+      nombre[10*j+1]=image(
+      % affixe.[10*j](b[10*j])n;
+	  label.top(TEX("\fontsize{4}{4}\selectfont"&decimal(10*j)&""),b[10*j]);
+	currentpicture:=currentpicture rotatedabout(b[10*j],angle(b[10*j]-centre)-90);
+	);
+    endfor
+  fi
+  rap=image(
+      for i=0 upto 18 :
+      draw nombre[10*i+1];
+      if Simple=false:
+	draw nombre[10*i];
+      fi;
+    endfor;
+    path cerc;
+    cerc=subpath((angle(segment-centre)*(length cc))/360,((length cc)/2)+(angle(segment-centre)*(length cc))/360) of cc;
+    if rr=-1:
+      draw cerc reflectedabout(segment,centre);
+    else:
+      draw cerc;
+    fi
+    draw a0--b0 withpen pencircle scaled 1.25bp;
+    for i=0 upto 35 :
+      for j=1 upto 4 :
+	draw a[5*i+j]--b[5*i+j];
+      endfor;
+    endfor;
+    for i=1 step 2 until 35:
+      draw a[5*i]--b[5*i];
+    endfor;
+    for i=1 upto 18:
+      draw a[10*i]--b[10i] withpen pencircle scaled 1.25;
+    endfor;
+    draw a0--a180;
+    path cent;
+    cent=cercle(centre,0.05*u);
+    fill cent withcolor if unknown fillrap: 0.9white else: fillrap fi;
+    );
+  rap
+enddef;
+
+vardef compas(expr centre,extre,n)=
+  save piccompas;
+  picture piccompas;
+  pair r,s,t,a,b,c,d,e,f;
+  if (abs(centre-extre)<10*u):
+    r=((extre-1/2[centre,extre]) rotated (n*90)) shifted (1/2[centre,extre]);
+  else:
+    r=0.25[1/2[centre,extre],((extre-1/2[centre,extre]) rotated (n*90)) shifted (1/2[centre,extre])];
+  fi
+  s=(1+50/abs(centre-extre))[1/2[centre,extre],r];
+  t=10*unitvector(extre-centre) rotated (n*90);
+  a=centre shifted t;
+  b=s shifted (5*unitvector(centre-extre)+10*unitvector(s-r));
+  c=b shifted (30*unitvector(s-r));
+  d=c reflectedabout(r,s);
+  e=b reflectedabout(r,s);
+  f=a reflectedabout(r,s);
+  path comp;
+  comp=a--b--c--d--e--f--s--a--cycle;
+  piccompas=image(
+    fill comp withcolor black;
+    draw centre--a withpen pencircle scaled 1.5bp;
+    draw f--extre withpen pencircle scaled 1.5bp withcolor 0.25[red,blue];
+    );
+  piccompas
+enddef;
+
 endinput;

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp	2022-07-06 20:18:37 UTC (rev 63822)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp	2022-07-06 20:19:06 UTC (rev 63823)
@@ -122,7 +122,7 @@
   save Ovar; picture Ovar;
   save TAvar; path TAvar;
   string TTv;
-  TTv=ar&"\barre";
+  TTv="\barre\bfseries "&ar;%
   TAvar=OvalBox(TTv);
   Ovar=image(
       fill TAvar if print=false : withcolor OrangeTrois else : withcolor white fi;

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2022-07-06 20:18:37 UTC (rev 63822)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2022-07-06 20:19:06 UTC (rev 63823)
@@ -1,9 +1,8 @@
 % 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}
-\ProvidesPackage{ProfCollege}[2022/06/01 v0.99-p Aide pour l'utilisation de LaTeX au college]
+\ProvidesPackage{ProfCollege}[2022/07/01 v0.99-r Aide pour utiliser LaTeX au college]
 
 \RequirePackage{verbatim}
 
@@ -190,9 +189,11 @@
 }%
 
 \newcommand\Lignespointilles[1]{%
-  \xintFor* ##1 in {\xintSeq {1}{#1}}\do{%
-    \pointilles\par%
-  }%
+  \xintifboolexpr{#1>1}{%
+    \xintFor* ##1 in {\xintSeq {1}{#1}}\do{%
+      \pointilles\par%
+    }%
+  }{}%
 }%
 
 \newcommand\MultiCol[2]{%
@@ -337,6 +338,717 @@
 }
 
 %%%
+% 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;
+      %if Compact:
+      %trace chemin(B,B+(0,0,-0.2)) dashed evenly withpen pencircle scaled 1.25;
+      %fi;
+      );
+      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;
+      %if Compact:
+      %trace chemin(B,B+(0,0,-0.2)) dashed evenly withpen pencircle scaled 1.25;
+      %fi;
+      );
+      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;
+      %if Compact:
+      %trace chemin(B,B+(0,0,-0.2)) dashed evenly withpen pencircle scaled 1.25;
+      %fi;
+      );
+      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 at resetdoamp\dtldisplaystarttab}%
+%         {\dtldisplaystarttab\@dtl at 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 que 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.
+  AMC=false,%
+  Multi=false%
+}%
+\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,Bernard/Il,Céline/Elle,Daniel/Il,Elise/Elle,Fabien/Il,Gérard/Il,Hélène/Elle,Ilies/Il,Jasmine/Elle,Kylian/Il,Laurent/Il,Mathilde/Elle,Nina/Elle,Octave/Il,Philippe/Il,Joachim/Il,Thérèse/Elle,Nawel/Elle,Alexandre/Il,Maxence/Il,Sophie/Elle,Christophe/Il,Myriam/Elle}%
+\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}
+\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\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 at exe{\write18}
+% Recuperer les sous-dossiers
+\def\RecupererSousDossiers#1{%#1 est le dossier contenant les fichiers can classés en sous-dossier
+  \app at 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]{}%
+
+\NewDocumentCommand\CourseNombre{o m}{%
+  \setKV[ClesMathAlea]{NbQ=1}%
+  \useKVdefault[ClesCN]%
+  \setKV[ClesCN]{#1}%
+  \ifboolKV[ClesCN]{Theme}{\renewcommand\CNTheme[1]{{\ttfamily Thème : ##1}\par}}{}%
+  \ifboolKV[ClesCN]{RAZ}{%\setcounter{CNNumQ}{1}}{}%
+    \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 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{0.7\linewidth}|p{0.1\linewidth}|p{0.05\linewidth}|}%
+          \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}&\input{\ListeFichiers[##1]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&&\\%
+            \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 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{0.7\linewidth}|p{0.1\linewidth}|p{0.05\linewidth}|}%
+            \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\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&&\\
+              \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"}%
@@ -404,7 +1116,7 @@
 %%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][]{%
+\newcommand\emoticon[2][]{%
 \scalebox{.5}{\begin{tikzpicture}
 \node[face,#1,draw,thick] (emoticon) {};
 %% The eyes are fixed.
@@ -413,7 +1125,7 @@
 \end{tikzpicture}}%
 }
 
-\newcommand{\pupils}{
+\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);}
@@ -614,8 +1326,8 @@
 \newcommand\MelangeListe[2]{%
   % #1 Liste à mélanger
   % #2 Nombre d'éléments à conserver
-  \setsepchar{,}\ignoreemptyitems
-  \readlist*\ListeInter{#1}
+  \setsepchar{,}\ignoreemptyitems%
+  \readlist*\ListeInter{#1}%
   \xdef\faa{}% Liste construite
   \xdef\fii{}% Liste détruite
   % on crée les #2 premieres solutions.
@@ -1112,7 +1824,7 @@
   \xdef\CountcolDeux{0}%
   \useKVdefault[ClesFicheMemo]%
   \setKV[ClesFicheMemo]{#1}%
-  \setsepchar[*]{§*/}%
+  \setsepchar[*]{§*/}\reademptyitems%
   \readlist*\ListeQuestionColonneUn{#2}%
   \readlist*\ListeQuestionColonneDeux{#3}%
   \renewcommand{\arraystretch}{1.35}%
@@ -1123,16 +1835,17 @@
     \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* ##4 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
-      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##4]==2}{%
+    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
+      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{%
         \uppercase{&}}{%
-        \Block[l]{\fpeval{\ListeQuestionColonneUn[##4,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneUn[##4,3]}{}}\uppercase{&}\xdef\CountcolUn{\fpeval{\CountcolUn+1}}\Block[l]{\fpeval{\ListeQuestionColonneUn[##4,1]}-1}{\ListeQuestionColonneUn[##4,2]}%
+        \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[##4]==2}{%
+      \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{%
         \uppercase{&}%
       }{%
-        \xdef\CountcolDeux{\fpeval{\CountcolDeux+1}}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##4,1]}-1}{\ListeQuestionColonneDeux[##4,2]}\uppercase{&}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##4,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneDeux[##4,3]}{}}%
+        \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]}{}}%
       }%
       \\%
     }%
@@ -1139,19 +1852,19 @@
     \CodeAfter%
     \tikz\node[xshift=0.5em] at (2-|1) {\scriptsize\faCut};%
     \xdef\PfCCountCutUn{2}%
-    \xintFor* ##4 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
-      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##4]==2}{%
+    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{%
+      \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{%
       }{%
-        \xdef\PfCCountCutUn{\fpeval{\PfCCountCutUn+\ListeQuestionColonneUn[##4,1]}}%
+        \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* ##4 in {\xintSeq {1}{\ListeQuestionColonneDeuxlen}}\do{%
-      \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##4]==2}{%
+    \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneDeuxlen}}\do{%
+      \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{%
       }{%
-        \xdef\PfCCountCutDeux{\fpeval{\PfCCountCutDeux+\ListeQuestionColonneDeux[##4,1]}}%
+        \xdef\PfCCountCutDeux{\fpeval{\PfCCountCutDeux+\ListeQuestionColonneDeux[##1,1]}}%
         \tikz\node[xshift=-0.5em] at (\fpeval{\PfCCountCutDeux}-|last) {\scriptsize\rotatebox{180}{\faCut}};%
       }%
     }%
@@ -1163,6 +1876,7 @@
     \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{,}%
 }%
 
 %%%
@@ -1170,9 +1884,9 @@
 %%%
 %% 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\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,
+\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}%
@@ -2097,6 +2811,7 @@
 
 \dtlexpandnewvalue%
 \DTLgnewdb{mtnumedb}%
+\DTLgnewdb{mtRGTdb}% Pb de doublon avec mtdb de Mediane
 
 \newcommand\Rangement[2][]{%
   \useKVdefault[ClesRgt]%
@@ -2111,48 +2826,48 @@
     }%
     % On cr\'ee la liste des rangements.
     \DTLcleardb{mtnumedb}%
-    % on les trie pour les ranger par ordre croissant
+%    % 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
+%    % On trie
     \ifboolKV[ClesRgt]{Decroissant}{%
-      % On trie la liste
+%      % 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
+%      % 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{mtdb}%
-    % on les trie pour les ranger par ordre croissant
+    \DTLcleardb{mtRGTdb}%
+%    % on les trie pour les ranger par ordre croissant
     \foreachitem\x\in\ListeRgt{%
-      \DTLnewrow{mtdb}%
+      \DTLnewrow{mtRGTdb}%
       \itemtomacro\ListeRgt[\xcnt]\y%
-      \DTLnewdbentry{mtdb}{numeric}{\y}%
+      \DTLnewdbentry{mtRGTdb}{numeric}{\y}%
     }%
-    % 
+%    % 
     \ifboolKV[ClesRgt]{Decroissant}{%
       % On trie la liste
-      \dtlsort{numeric=descending}{mtdb}{\dtlicompare}%
-      \ensuremath{\DTLforeach{mtdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}%
+      \dtlsort{numeric=descending}{mtRGTdb}{\dtlicompare}%
+      \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}%
     }{%
-      % On trie la liste
-      \dtlsort{numeric}{mtdb}{\dtlicompare}%
-      \ensuremath{\DTLforeach{mtdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}%
+%      % On trie la liste
+      \dtlsort{numeric}{mtRGTdb}{\dtlicompare}%
+      \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}%
     }%
   }%
 }%
@@ -3771,7 +4486,7 @@
     \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);%
@@ -3894,10 +4609,10 @@
         \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]};%
+        \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]};%
@@ -5982,7 +6697,16 @@
     cc=fullcircle scaled 1u;
     % on marque les angles
     picture MAngle;
-    MAngle=image(
+    MAngle=image(%
+    if #6=0:%Pour l'isocèle
+    path cd; pair M[];
+    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;
     draw (cc shifted A);
     draw (cc shifted B);
     draw (cc shifted C);
@@ -6490,9 +7214,11 @@
     \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]%
@@ -6613,13 +7339,13 @@
 % Distributivit\'e
 %%%
 % https://tex.stackexchange.com/questions/168972/draw-arrows-to-show-multiplication-pattern-distributive-property/169278?noredirect=1 
-\newcommand{\Tikzmark}[1]{%
+\newcommand\Tikzmark[1]{%
   \tikz[remember picture,baseline,inner sep=0pt]{%
     \node[name=Distri-\theNbDistri,anchor=base] {${#1}$};}%
   \stepcounter{NbDistri}%
 }%
 
-\newcommand{\DrawArrow}{%
+\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);
@@ -7016,7 +7742,7 @@
 \xdef\SommeB{0}%
 \xdef\SommeC{0}%
 
-\newcommand{\Distri}[5][]{%
+\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}%
@@ -7292,7 +8018,7 @@
   }%
 }%
 
-\newcommand{\DistriEchange}[5][]{%
+\newcommand\DistriEchange[5][]{%
   \ensuremath{%
     \useKVdefault[ClesDistributivite]%obligatoire car la macro n'est pas dans un groupe.
     \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
@@ -8529,7 +9255,7 @@
 }
 
 
-\newcommand{\SSimpli}[2]{%
+\newcommand\SSimpli[2]{%
   % D\'ecomposition d'une simplification de #1/#2
   \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno%
   \numerateur=\number#1
@@ -9092,7 +9818,7 @@
 \newcommand\EcritureQuotients{}%
 
 %%%
-\newcommand{\TTThales}[6][]{%
+\newcommand\TTThales[6][]{%
   \useKVdefault[ClesThales]%
   \setKV[ClesThales]{#1}%
   \ifboolKV[ClesThales]{Perso}{\RedactionThales}{%
@@ -9121,7 +9847,7 @@
   }%
 }%
 
-\newcommand{\TThalesCalculsD}[8][]{%
+\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{}%
@@ -9359,7 +10085,7 @@
 }{}
 }
 
-\newcommand{\TThalesCalculsE}[8][]{%
+\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%
@@ -9682,7 +10408,7 @@
 }{}%
 }
 
-\newcommand{\TThales}[8][]{%
+\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}{%
@@ -9733,7 +10459,7 @@
   }
 }
 
-\newcommand{\ReciThalesCalculs}[8][]{%
+\newcommand\ReciThalesCalculs[8][]{%
   \StrMid{#2}{1}{1}[\NomA]%
   \StrMid{#2}{2}{2}[\NomB]%
   \StrMid{#2}{3}{3}[\NomC]%
@@ -10587,7 +11313,7 @@
 %Pour les représentations
 Representation=false,%
 %Pour les barres horizontales
-Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false%
+Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dispo
 }
 %compl\'ements
 \defKV[ClesStat]{AngleRotationAbscisse=\setKV[ClesStat]{AbscisseRotation}}%
@@ -10705,8 +11431,8 @@
     \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,2],}%
   }%
   \xdef\DivMax{\fpeval{max(\PfCfooStat)}}%
-  \xdef\DivMax{\fpeval{round(ln(\DivMax)/ln(10))}}%
-  \xdef\DivMax{\fpeval{10**\DivMax}}%
+  \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},}%
@@ -10799,11 +11525,13 @@
   % #2 Liste des valeurs associées
   % #3 Liste des valeurs à afficher (si pb calcul MP)
   % #4 Liste des couleurs
-  \ifluatex
+  \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;
@@ -10810,6 +11538,12 @@
     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
@@ -10836,10 +11570,40 @@
     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);
+    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;
@@ -10848,11 +11612,15 @@
     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));
+    label.lft(TEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart)));
     k:=k+1;
     endfor;
     enddef;
@@ -10859,7 +11627,7 @@
     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));
+    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;
@@ -10867,21 +11635,33 @@
     ListeDonnees(#2);
     RecuperationCouleurs(#4);
     TraceDiag;
+    if LegendeVide=false:
     AffichageNom(#1);
+    fi;
+    if AffichageDonnee:
     AffichageDonnees(#3);
+    fi;
   \end{mplibcode}
-  \else
+  \else%
   \begin{mpost}[mpsettings={%
-    Longueur:=\useKV[ClesStat]{Longueur};
-    Hauteur:=\useKV[ClesStat]{Hauteur};
-    ecarthachures=\useKV[ClesStat]{EcartHachures};
-    epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures};
-    boolean Hachures;
-    Hachures=\useKV[ClesStat]{Hachures};
-    boolean Bicolore;
-    Bicolore=\useKV[ClesStat]{Bicolore};
-    }]
-    vardef CalculNombreDonneesEtDonneeMax(text t)=
+      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:
@@ -10907,10 +11687,40 @@
     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{\noexpand\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0));
+    endfor;
+    else:
+    dotlabel.bot(TEX("\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);
+    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;
@@ -10919,11 +11729,15 @@
     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));
+    label.lft(TEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart)));
     k:=k+1;
     endfor;
     enddef;
@@ -10930,7 +11744,7 @@
     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));
+    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;
@@ -10938,10 +11752,14 @@
     ListeDonnees(#2);
     RecuperationCouleurs(#4);
     TraceDiag;
+    if LegendeVide=false:
     AffichageNom(#1);
+    fi;
+    if AffichageDonnee:
     AffichageDonnees(#3);
+    fi;
   \end{mpost}
-  \fi  
+  \fi%
 }%
 
 % la construction du graphique en bâtons pour quantitatif
@@ -12446,7 +13264,7 @@
 %Une simplification de a/b est possible ou non ?
 \newboolean{Simplification}
 
-\newcommand{\SSimpliTest}[2]{%
+\newcommand\SSimpliTest[2]{%
   % Test d'une simplification possible ou pas de #1/#2
   \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno%
   \numerateur=\number#1
@@ -13258,13 +14076,13 @@
   \end{tabular}%
 }%
 
-\newcommand{\TikzRH}{%
+\newcommand\TikzRH{%
    \tikz[remember picture,overlay]{%
    \coordinate[name=ProporH-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}%
    \stepcounter{NbPropor}%
  }%
 
- \newcommand{\TikzRB}{%
+ \newcommand\TikzRB{%
    \tikz[remember picture, overlay]{%
      \coordinate[name=ProporB-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}%
    \stepcounter{NbPropor}%
@@ -13490,7 +14308,7 @@
 
 \def\MPFigureDroite#1#2{%
   \ifluatex
-  \mplibcodeinherit{enable}
+  %\mplibcodeinherit{enable}
   \mplibforcehmode
   \begin{mplibcode}
     pair A,B,C,D,E,F,G,H,I,J,K;
@@ -13574,7 +14392,7 @@
     reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180));
     draw reste;
   \end{mplibcode}
-  \mplibcodeinherit{disable}
+  %\mplibcodeinherit{disable}
   \else
   \begin{mpost}
     pair A,B,C,D,E,F,G,H,I,J,K;
@@ -17687,7 +18505,7 @@
     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));
+    pointe(unitp*(valeur[n],0));
     fi;
     endfor;
     elseif AffichageCoord=2:
@@ -17700,7 +18518,7 @@
     else:
     label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0));
     fi;
-    pointe(unitp*(valeur[n]-ValeurOrigine,0));
+    pointe(unitp*(valeur[n],0));
     fi;
     endfor;
     elseif AffichageCoord=1:
@@ -18218,58 +19036,59 @@
 %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}
+{%
+  \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 {#5} { \minute }
-      \IfNoValueF {#6} { ~ }
-    }
-  }
-  \IfNoValueF {#6}
-  { \tl_if_blank:nF {#6} { \SI {#6} { \second } } }
-}
+{%
+  \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][]{%



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