texlive[76163] Master/texmf-dist: profcollege (27aug25)

commits+karl at tug.org commits+karl at tug.org
Wed Aug 27 22:13:06 CEST 2025


Revision: 76163
          https://tug.org/svn/texlive?view=revision&revision=76163
Author:   karl
Date:     2025-08-27 22:13:06 +0200 (Wed, 27 Aug 2025)
Log Message:
-----------
profcollege (27aug25)

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/PfCConstantes.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCEngrenages.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCMosaique.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCAireSimple.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCBalance.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCBandeNumerique.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCCalculsFractions.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCCritere.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCDefiTables.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCDistributivite.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcrireunQCM.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcritureUnites.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCJeton.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCKakuro.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCKenKen.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCModeleBarre.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCMotsCodes.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCNotionFonction.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCOpCroisees.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCPatronPaves.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCPattern.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCPourcentage.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCPythagore.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCReperage.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterFraction.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterTableur.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCSimplifierFraction.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCSolides.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCStatistiques.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCTortueBase.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCUrneProba.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCVueCubes.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece10c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf
    trunk/Master/texmf-dist/doc/latex/profcollege/README.md
    trunk/Master/texmf-dist/metapost/profcollege/PfCMondegood.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCMonstre.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCPattern.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCPeople.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCScrabble.mp
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCBoiteADix.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCIteration.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCMonnaieEuro.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCMulEthiopie.tex
    trunk/Master/texmf-dist/tex/latex/profcollege/PfCSystemeImage.tex

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

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece10c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece10c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece10c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece10c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece1e.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece20c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece2e.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece50c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPiece5c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul10c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul1e.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul20c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul2e.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul50c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf	2025-08-27 20:13:06 UTC (rev 76163)

Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/PfCPieceCoul5c.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/profcollege/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/profcollege/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/profcollege/README.md	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,3 @@
+# ProfCollegeMP
+
+Dépôt pour les packages MetaPost de ProfCollege.
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/latex/profcollege/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
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/PfCConstantes.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCConstantes.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCConstantes.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -4,7 +4,7 @@
 pi:=3.141592654;
 e:=2.718281828;
 c:=57.29578; % conversion d'un radian en degres
-color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,cielfonce,orangevif,gris;
+color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,cielfonce,orangevif,gris,marron;
 rouge=(1,0,0);
 bleu=(0,0,1);
 noir=(0,0,0);
@@ -18,7 +18,7 @@
 vert=(0,1,0);
 jaune=rouge+vert;
 gris=0.8*white;
-
+marron=(.545,.27,.075);
 %coloriage et lumière
 vardef Hsv(expr CC)=%CC couleur donnée en hsv d'après http://en.wikipedia.org/wiki/HSL_color_space
   save $;

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCEngrenages.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCEngrenages.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCEngrenages.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -39,34 +39,49 @@
   cercleb=cercles(OPfC,0.5*Db);
   cerclepied=cercles(OPfC,0.5*Dpied);
   path dd,daction,dsupport[],dperp[],dsymetrie,darret;
+  if Db<Dpied:
+    _tfig:=2000*u;
+  fi;
   dd=demidroite(OPfC,OPfC+(0,1));
   APfC=dd intersectionpoint cerclep;
-  BPfC=dd intersectionpoint cercleb;
   path profil;
-  profil=(symetrie(rotation(Developpante(0.5*Db/(u)),OPfC,90),OPfC,(0,1)) cutafter cerclee);%0.5*Dp*cosd(Alpha));
-  %CPfC=dd intersectionpoint cerclepied;
+  profil=(symetrie(rotation(Developpante(0.5*Db/(u)),OPfC,90),OPfC,(0,1)) cutbefore cerclepied cutafter cerclee);
   ReleveAngle:=90-angle(profil intersectionpoint cerclep);
   dsymetrie=rotation(dd,OPfC,-(360/(4*Z)+ReleveAngle));
   darret=rotation(dd,OPfC,(360/(4*Z)-ReleveAngle));
-  pair D;
+  pair D,E;
   D=profil intersectionpoint cerclee;
+  E=symetrie(D,point(0) of dsymetrie,point(1) of dsymetrie);
   path Profil;
-  Profil=(reverse(cerclepied) cutbefore darret cutafter dd)--profil--(reverse(cerclee) cutbefore demidroite(OPfC,D) cutafter dsymetrie);
-  Profil:=Profil--symetrie(reverse(Profil),OPfC,rotation((0,1),OPfC,-(360/(4*Z)+ReleveAngle)));
+  if Db<Dpied:
+    Profil=arccercle(E,D,OPfC)--reverse(profil)--(cerclepied cutbefore darret cutafter dd);
+    Profil:=reverse(symetrie(Profil,OPfC,rotation((0,1),OPfC,-(360/(4*Z)+ReleveAngle))))--Profil;
+  else:
+    Profil=(reverse(cerclepied) cutbefore darret cutafter dd)--profil--(reverse(cerclee) cutbefore demidroite(OPfC,D) cutafter dsymetrie);
+    Profil:=Profil--symetrie(reverse(Profil),OPfC,rotation((0,1),OPfC,-(360/(4*Z)+ReleveAngle)));
+  fi;
   path ProfilGene;
+  coefrot:=-1;
+  if Db<Dpied:
+    coefrot:=1;
+  fi;
   ProfilGene=Profil
     for k=1 upto Z-1:
-    --rotation(Profil,OPfC,-k*(360/Z))
+    --rotation(Profil,OPfC,coefrot*k*(360/Z))
   endfor
   --cycle;
   $=image(
       fill ProfilGene withcolor CouleurEngrenage;
-    trace ProfilGene;
+    trace ProfilGene withpen pencircle scaled 0.25;
     fill cercles(OPfC,1u) withcolor blanc;
     trace cercles(OPfC,1u);
     fill cercles(OPfC,0.85u) withcolor 0.5white;
     trace cercles(OPfC,0.85u);
-    fill rotation((cercles(OPfC,0.25u) shifted (dd intersectionpoint cerclepied)),OPfC,-(360/(4*Z)+ReleveAngle));
+    if Db<Dpied:
+      fill rotation((cercles(OPfC,0.25u) shifted (dd intersectionpoint cercleb)),OPfC,-(360/(4*Z)+ReleveAngle));
+    else:
+      fill rotation((cercles(OPfC,0.25u) shifted (dd intersectionpoint cerclepied)),OPfC,-(360/(4*Z)+ReleveAngle));
+    fi;
     );
   $:=rotation($,OPfC,-90+(360/(4*Z)+ReleveAngle)) shifted Cc;
   $

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCGeometrie.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -2203,6 +2203,30 @@
   $
 enddef;
 
+vardef papierisometriqueu=
+  save $;
+  orig:=false;
+  x.u:=(sqrt(3)/2)*u;
+  y.u:=u;
+  picture $;
+  $=image(
+    path p[];
+    %triangle haut
+    p1:=(x.so*u,1u)--((x.so*u,0) rotatedabout((x.so*u,1u),60))--(x.so*u,0);
+    %triangle bas
+    p2:=((x.so*u,1u)--((x.so*u,0) rotatedabout((x.so*u,1u),-60))--(x.so*u,0)) shifted (((sqrt3)/2)*u,0);
+    %grille horizontale1
+    pickup pencircle scaled 0.5;
+    for i:=0 step 2  until (xpart(retrouvecoord(z.ne*u))-xpart(retrouvecoord(z.so*u))):
+      for j:=0 upto (ypart(retrouvecoord(z.ne*u))-ypart(retrouvecoord(z.so*u))-1):
+	draw p1 shifted (i*((sqrt3)/2)*u,j*u);
+	draw p2 shifted ((i+1)*((sqrt3)/2)*u,j*u);
+      endfor
+    endfor;
+    );
+  $
+enddef;
+
 vardef papierhexagonal=
   save $;
   picture $;
@@ -2226,4 +2250,27 @@
   $
 enddef;
 
+vardef papierhexagonalu=
+  save $;
+  picture $;
+  orig:=false;
+  path hexa;
+  %hexagone de départ
+  hexa:=z.so*u--(x.so*u+1u,y.so*u)--(z.so*u rotatedabout((x.so*u+1u,y.so*u),-120))--((x.so*u+1u,y.so*u) rotatedabout((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)),-120))--((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)) rotatedabout(((x.so*u+1u,y.so*u) rotatedabout((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)),-120)),-120))--(((x.so*u+1u,y.so*u) rotatedabout((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)),-120)) rotatedabout(((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)) rotatedabout(((x.so*u+1u,y.so*u) rotatedabout((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)),-120)),-120)),-120))--cycle;
+  $=image(
+    pair centrehexa;
+    centrehexa=1/2[z.so*u,((x.so*u+1u,y.so*u) rotatedabout((z.so*u rotatedabout((x.so*u+1u,y.so*u),-120)),-120))];
+    pickup pencircle scaled 0.5;
+    numeric etag;
+    etag=floor((abs(y.ne*u-y.so*u))/((sqrt(3)/2)*u));
+    for i:=0 step 3  until (abs(x.ne*u-x.so*u)/1u):
+      for j:=0 step 2 until etag:
+	draw hexa shifted ((i+0.5)*u,j*((sqrt 3)/2)*u);
+	draw hexa shifted ((i+2)*u,(j+1)*((sqrt 3)/2)*u);
+      endfor
+    endfor;
+    );
+  $
+enddef;
+
 endinput;

Added: trunk/Master/texmf-dist/metapost/profcollege/PfCMondegood.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCMondegood.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCMondegood.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,1553 @@
+%Package mp-geographie
+%Auteur:Christophe Poulain
+%Version 0.62
+%16/02/2010
+
+input marith;
+input sarith;
+%input LATEX;
+
+pi:=3.141592654;
+c:=57.29578; % conversion d'un radian en degr\xE9s
+
+color _T[],rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,cielfonce,orangevif,gris,tan,payscolor;
+
+rouge=(1,0,0);
+bleu=(0,0,1);
+noir=(0,0,0);
+blanc=(1,1,1);
+orange=(1,0.5,0);
+violet=(1,0,1);
+rose=(1,0.7,0.7);
+cielfonce=(0.25,0.75,1);
+ciel=(0,1,1);
+orangevif=(1,0.25,0.1);
+vert=(0,1,0);
+jaune=(1,1,0);
+gris=0.8*white;
+
+tan=(0.824,0.705,0.55);
+payscolor=tan;
+
+vardef flamme=reverse(2mm*(0.5,1){dir90}..2mm*(0.75,1.5)..{dir90}2mm*(1,2))--2mm*(0.5,1){dir=-90}..2mm*(1,0.5)..{dir=90}2mm*(1.5,1)--((2mm*(0.5,1){dir90}..2mm*(0.75,1.5)..{dir90}2mm*(1,2)) reflectedabout (2mm*(1,0),2mm*(1,0)+2mm*(0,1)))--cycle
+enddef;
+
+%Les marques
+
+string marque_p;
+marque_p := "non";
+marque_r := 20;
+
+def MarquePoint(expr p)=
+  if marque_p = "creux":
+    if color p:
+      fill fullcircle scaled (marque_r/5) shifted (Projgeo(p)) withcolor white;
+      draw fullcircle scaled (marque_r/5) shifted (Projgeo(p));
+    else:
+      fill fullcircle scaled (marque_r/5) shifted (p) withcolor white;
+      draw fullcircle scaled (marque_r/5) shifted (p);
+    fi;
+  fi;
+enddef;
+
+vardef pointe(text t) =
+  for p_ = t: if (pair p_) or (color p_): MarquePoint(p_); fi endfor;
+enddef;
+
+%D\xE9finition pour la feuille
+
+path feuillet;
+numeric _tfig,_nfig;
+_nfig:=0;
+u:=1cm;
+
+def feuille(expr xa,ya,xb,yb) =
+  numeric Xa,Ya;
+  Xa=xa;
+  Ya=ya;
+  feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
+  extra_endfig := "clip currentpicture to feuillet;" & extra_endfig;
+enddef;
+
+def figureespace(expr xa,ya,xb,yb) =
+  _nfig:=_nfig+1;
+  beginfig(_nfig);
+    feuille(xa,ya,xb,yb);
+enddef;  
+
+def finespace=
+endfig;
+enddef;
+
+def figure(expr xa,ya,xb,yb)=figureespace(xa,ya,xb,yb)
+enddef;
+
+def fin=finespace
+enddef;
+
+%definitions math\xE9matiques
+vardef cercles(text t)=
+  save Cer;
+  save n;
+  n:=0;
+  for p_=t:
+    if color p_:
+      n:=n+1;
+      _T[n]:=p_;
+    fi;
+  endfor;
+  path Cer;
+  color ptcer[];
+  for k=0 step 5 until 360 :
+    ptcer[k div 5]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5]));
+  endfor;
+  Cer=Projgeo(ptcer0)
+  for k=0 step 5 until 360 :
+    ..Projgeo(ptcer[k div 5])
+  endfor
+  ..cycle;
+  Cer
+enddef;
+
+vardef arcsind(expr x)=%en degr\xE9 ici :)
+  angle((sqrt(1-x**2),x))
+enddef;
+
+vardef tand(expr x)=sind(x)/cosd(x)%
+enddef;
+
+vardef cotand(expr x)=cosd(x)/sind(x)%
+enddef;
+
+vardef ln(expr t)=mlog(t)/256%
+enddef;
+
+%repr\xE9sentation param\xE9trique de la sph\xE8re terrestre.
+vardef FX(expr t,v)=rayon*cosd(c*t)*cosd(c*v)
+enddef;
+
+vardef FY(expr t,v)=rayon*cosd(c*t)*sind(c*v)
+enddef;
+
+vardef FZ(expr t,v)=rayon*sind(c*t)
+enddef;
+
+%Param\xE8tres et macros de repr\xE9sentation
+vardef Initialisation(expr r,t,p,d)=
+  Rho:=r;
+  Theta:=t;
+  Phi:=p;
+  DE:=d;
+  Aux1:=sind(Theta);
+  Aux2:=sind(Phi);
+  Aux3:=cosd(Theta);
+  Aux4:=cosd(Phi);
+  Aux5:=Aux3*Aux2;
+  Aux6:=Aux1*Aux2;
+  Aux7:=Aux3*Aux4;
+  Aux8:=Aux1*Aux4;
+enddef;
+
+vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2)
+enddef;
+
+vardef Vision(expr num)=
+  save bb;
+  color bb;
+  bb=(redpart(Oeil-Sommet[num]),greenpart(Oeil-Sommet[num]),bluepart(Oeil-Sommet[num]));  
+  bb
+enddef;
+
+vardef Normal(expr vecun,vecde,vectr)=
+  save aa;
+  color aa;
+  P1:=redpart(vecde-vecun);
+  P2:=greenpart(vecde-vecun);
+  P3:=bluepart(vecde-vecun);
+  Q1:=redpart(vectr-vecun);
+  Q2:=greenpart(vectr-vecun);
+  Q3:=bluepart(vectr-vecun);
+  aa=(P2*Q3-Q2*P3,P3*Q1-Q3*P1,P1*Q2-Q1*P2);
+  aa
+enddef;
+
+vardef ProduitScalaire(expr wec,mor)=
+  redpart(wec)*redpart(mor)+greenpart(wec)*greenpart(mor)+bluepart(wec)*bluepart(mor)
+enddef;
+
+vardef Distance(expr aa,bb)=%Entre deux points
+  sqrt((redpart(bb)-redpart(aa))*(redpart(bb)-redpart(aa))+(greenpart(bb)-greenpart(aa))*(greenpart(bb)-greenpart(aa))+(bluepart(bb)-bluepart(aa))*(bluepart(bb)-bluepart(aa)))
+enddef;
+
+vardef MaillageS=
+  path Maillage[];
+  color CentMaillage[];
+  %numeric Vmin,Vmax;
+  %total:=0;
+  for k=Udebut step 0.5*pasU until (Ufin):
+    for l=Vdebut step pasV until (Vfin):
+      Maillage[100*k+l]=Projgeo((FX(k,l),FY(k,l),FZ(k,l)))--Projgeo((FX(k,l+pasV),FY(k,l+pasV),FZ(k,l+pasV)))--Projgeo((FX(k+pasU,l+pasV),FY(k+pasU,l+pasV),FZ(k+pasU,l+pasV)))--Projgeo((FX(k+pasU,l),FY(k+pasU,l),FZ(k+pasU,l)))--cycle;
+      if ProduitScalaire(1/2[(FX(k,l),FY(k,l),FZ(k,l)),(FX(k+pasU,l+pasV),FY(k+pasU,l+pasV),FZ(k+pasU,l+pasV))]-pte3,Oeil-pte3)>0:
+	%total:=total+1;
+	%if total=1:
+	%  Vmin:=l;
+	%fi;
+	draw Maillage[100*k+l];
+      fi;
+    endfor;
+  endfor;
+  %drawoptions();
+  %for k=(Udebut+pasU) step pasU until (Ufin-pasU):
+  %  if abs(round(k*c))<100:
+  %    label.urt(TEX(""&decimal(round(k*c))&""),Projgeo(rayon*(cosd(round(k*c))*cosd(Theta),cosd(round(k*c))*sind(Theta),sind(round(k*c)))))
+  %  fi;
+  %endfor;
+  %Vmax:=0;
+  %Vmax:=Vmin+2*((Theta/c)-Vmin);
+  %label.top(TEX(""&decimal(round(Vmin*c))&"") rotated angle(Projgeo(rayon*(cosd(phim+10)*cosd(round(Vmin*c)),cosd(phim+10)*sind(round(Vmin*c)),sind(phim+10)))-Projgeo(rayon*(cosd(phim)*cosd(round(Vmin*c)),cosd(phim)*sind(round(Vmin*c)),sind(phim)))),Projgeo(rayon*(cosd(phim)*cosd(round(Vmin*c)),cosd(phim)*sind(round(Vmin*c)),sind(phim))));
+  %label.top(TEX(""&decimal(round(Theta))&"") rotated angle(Projgeo(rayon*(cosd(phim+10)*cosd(round(Theta)),cosd(phim+10)*sind(round(Theta)),sind(phim+10)))-Projgeo(rayon*(cosd(phim)*cosd(round(Theta)),cosd(phim)*sind(round(Theta)),sind(phim)))),Projgeo(rayon*(cosd(phim)*cosd(round(Theta)),cosd(phim)*sind(round(Theta)),sind(phim))));
+  %label.top(TEX(""&decimal(round(Vmax*c))&"") rotated angle(Projgeo(rayon*(cosd(phim+10)*cosd(round(Vmax*c)),cosd(phim+10)*sind(round(Vmax*c)),sind(phim+10)))-Projgeo(rayon*(cosd(phim)*cosd(round(Vmax*c)),cosd(phim)*sind(round(Vmax*c)),sind(phim)))),Projgeo(rayon*(cosd(phim)*cosd(round(Vmax*c)),cosd(phim)*sind(round(Vmax*c)),sind(phim))));
+enddef;
+
+vardef InitialiseMaillage(expr ud,uf,up,vd,vf,vp)=
+  Udebut:=ud;
+  Ufin:=uf;
+  pasU:=up;
+  Vdebut:=vd;
+  Vfin:=vf;
+  pasV:=vp;
+enddef;
+
+vardef MaillageSphere=
+  InitialiseMaillage(((phim div 10)+1)*pi/18,((phip div 10)-1)*pi/18,pi/18,-pi,pi,pi/36);
+  MaillageS;
+enddef;
+
+boolean maille;
+maille=false;
+
+vardef ParaMeri(expr lonn,latt)=%longitude et latitude en degr\xE9s%Parall\xE8le et m\xE9ridien particulier pour une repr\xE9sentation 3d.
+  maille:=true;
+  latpar:=latt;
+  lonpar:=lonn;
+enddef;
+
+vardef Maille=
+  InitialiseMaillage(((phim div 10)+1)*pi/18,((phip div 10)-1)*pi/18,pi/36,-pi,pi,pi/72);
+  path SMaillage[];picture Smaille;
+  drawoptions(withpen pencircle scaled 2bp withcolor orangevif);
+  for l=Vdebut step pasV until (Vfin+pasV):
+    SMaillage[100*latpar+l]=Projgeo((FX(latpar/c,l),FY(latpar/c,l),FZ(latpar/c,l)))--Projgeo((FX(latpar/c,l+pasV),FY(latpar/c,l+pasV),FZ(latpar/c,l+pasV)));
+    if ProduitScalaire(1/2[(FX(latpar/c,l),FY(latpar/c,l),FZ(latpar/c,l)),(FX(latpar/c,l+pasV),FY(latpar/c,l+pasV),FZ(latpar/c,l+pasV))]-pte3,Oeil-pte3)>0:
+      draw SMaillage[100*latpar+l];
+    fi;
+  endfor;
+  for k=Udebut step pasU until (Ufin+pasU):
+    SMaillage[k+100*lonpar]:=Projgeo((FX(k,lonpar/c),FY(k,lonpar/c),FZ(k,lonpar/c)))--Projgeo((FX(k+pasU,lonpar/c),FY(k+pasU,lonpar/c),FZ(k+pasU,lonpar/c)));
+    if ProduitScalaire(1/2[(FX(k,lonpar/c),FY(k,lonpar/c),FZ(k,lonpar/c)),(FX(k+pasU,lonpar/c),FY(k+pasU,lonpar/c),FZ(k+pasU,lonpar/c))]-pte3,Oeil-pte3)>0:
+      draw SMaillage[k+100*lonpar];
+    fi;
+  endfor;
+  drawoptions();
+    %);
+enddef;
+
+vardef Projgeo(expr X)=
+  pair $;
+  numeric Xobs,Yobs,Zobs,XProj,YProj;
+  Xobs = -redpart(X)*Aux1 + greenpart(X)*Aux3;
+  Yobs = -redpart(X)*Aux5 - greenpart(X)*Aux6 + bluepart(X)*Aux4;
+  Zobs = -redpart(X)*Aux7 - greenpart(X)*Aux8 - bluepart(X)*Aux2 + Rho;
+  XProj = DE*Xobs/Zobs;
+  YProj = DE*Yobs/Zobs;
+  $=(XProj,YProj);
+  $
+enddef;
+
+%D\xE9but du package
+numeric nbpts,nblec,nbcapitales;
+
+vardef lecture(expr nomfichier,fond)=
+  color Coord[],Pays[];
+  numeric ll;
+  ll:=0;
+  nbpts:=scantokens readfrom nomfichier;
+  for k=1 upto (nbpts div 3):
+    pair latlon;
+    latlon=((scantokens readfrom nomfichier)+(scantokens readfrom nomfichier)+(scantokens readfrom nomfichier))/3;
+    Coord[k]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+    if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+      if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	ll:=ll+1;
+	Pays[k]=Coord[k];
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    else:
+      Pays[k]=2*Coord[k];
+    fi;
+  endfor;
+  closefrom nomfichier;
+  path pays;
+  if ll>0:
+    pays=Projgeo(Pays[1])
+    for l=2 upto (nbpts div 3):
+      --Projgeo(Pays[l])
+    endfor;
+    if noncolore=true:
+      fill pays--cycle withcolor payscolor;
+    else:
+      fill pays--cycle withcolor fond;
+    fi;
+    draw pays;
+    clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+  fi;
+enddef;
+
+string nomfichiermul,NomFichier;
+
+vardef Lectureiles=
+  nomfichiermul:=arborescence&"iles.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    color Coord[],fond,Pays[];
+    numeric ll;
+    ll:=0;
+    nbpts:=scantokens readfrom nomfichiermul;
+    fond=scantokens readfrom nomfichiermul;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      Coord[k]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+      if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+	if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	  ll:=ll+1;
+	  Pays[k]=Coord[k];
+	else:
+	  Pays[k]=2*Coord[k];
+	fi;
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    endfor;
+    path pays;
+     if ll>0:
+      pays=Projgeo(Pays[1])
+      for l=2 upto nbpts:
+	--Projgeo(Pays[l])
+      endfor;
+      if noncolore=true:
+	fill pays--cycle withcolor payscolor;
+      else:
+	fill pays--cycle withcolor fond;
+      fi;
+      draw pays;
+      clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturelacs=
+  nomfichiermul:=arborescence&"lacs.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    color Coord[],Pays[];
+    numeric ll;
+    ll:=0;
+    nbpts:=scantokens readfrom nomfichiermul;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      Coord[k]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+      if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+	if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	  ll:=ll+1;
+	  Pays[k]=Coord[k];
+	else:
+	  Pays[k]=2*Coord[k];
+	fi;
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    endfor;
+    path pays;
+    if ll>0:
+      pays=Projgeo(Pays[1])
+      for l=2 upto nbpts:
+	--Projgeo(Pays[l])
+      endfor;
+      fill pays--cycle withcolor couleurfleuve;
+      draw pays;
+      clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturelacssup=
+  nomfichiermul:=arborescence&"lacssup.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    color Coord[],Pays[];
+    numeric ll;
+    ll:=0;
+    nbpts:=scantokens readfrom nomfichiermul;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      Coord[k]=rayon*(cosd(xpart(latlon))*cosd(ypart(latlon)),cosd(xpart(latlon))*sind(ypart(latlon)),sind(xpart(latlon)));
+      if ((xpart(latlon)>phim) and (xpart(latlon)<phip)):
+	if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	  ll:=ll+1;
+	  Pays[k]=Coord[k];
+	else:
+	  Pays[k]=2*Coord[k];
+	fi;
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    endfor;
+    path pays;
+    if ll>0:
+      pays=Projgeo(Pays[1])
+      for l=2 upto nbpts:
+	--Projgeo(Pays[l])
+      endfor;
+      fill pays--cycle withcolor couleurfleuve;
+      draw pays;
+      clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturevolcans=
+  drawoptions(withcolor orange);
+  nomfichiermul:=arborescence&"volcans.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  show nblec;
+  for p=1 upto nblec:
+    color Coord[],Pays[];
+    pair latlon;
+    latlon=scantokens readfrom nomfichiermul;
+    Coord[p]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+    if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+      if ProduitScalaire(Coord[p]-pte3,Oeil-pte3)>0:
+	Pays[p]=Coord[p];
+	fill flamme shifted Projgeo(Pays[p]) withcolor 1/2[orange,jaune];
+      %else:
+%	Pays[k]=2*Coord[k];
+      fi;
+%    else:
+%      Pays[k]=2*Coord[k];
+    fi;
+  endfor;
+closefrom nomfichiermul;
+drawoptions();
+enddef;
+
+vardef Lecturerivieres=
+  nomfichiermul:=arborescence&"rivieres.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    color Coord[],fond,Pays[];
+    numeric ll;
+    ll:=0;
+    nbpts:=scantokens readfrom nomfichiermul;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      Coord[k]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+      if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+	if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	  ll:=ll+1;
+	  Pays[k]=Coord[k];
+	else:
+	  Pays[k]=2*Coord[k];
+	fi;
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    endfor;
+    path pays;
+    if ll>0:
+      pays=Projgeo(Pays[1])
+      for l=2 upto nbpts:
+	--Projgeo(Pays[l])
+      endfor;
+      draw pays withcolor couleurfleuve;
+      clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturerivieressup=
+  nomfichiermul:=arborescence&"fleuveseurope.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    color Coord[],fond,Pays[];
+    numeric ll;
+    ll:=0;
+    nbpts:=scantokens readfrom nomfichiermul;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      Coord[k]=rayon*(cosd(xpart(latlon))*cosd(ypart(latlon)),cosd(xpart(latlon))*sind(ypart(latlon)),sind(xpart(latlon)));
+      if ((xpart(latlon)>phim) and (xpart(latlon)<phip)):
+	if ProduitScalaire(Coord[k]-pte3,Oeil-pte3)>0:
+	  ll:=ll+1;
+	  Pays[k]=Coord[k];
+	else:
+	  Pays[k]=2*Coord[k];
+	fi;
+      else:
+	Pays[k]=2*Coord[k];
+      fi;
+    endfor;
+    path pays;
+    if ll>0:
+      pays=Projgeo(Pays[1])
+      for l=2 upto nbpts:
+	--Projgeo(Pays[l])
+      endfor;
+      draw pays withcolor couleurfleuve;
+      clip currentpicture to cercles(pte3,pte1,pte3,pte1,pte4);
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturecapitales=
+  marque_p:="creux";
+  nomfichiermul:=arborescence&"capitales.dat";
+  nbcapitales:=scantokens readfrom nomfichiermul;
+  for p=1 upto nbcapitales:
+    color Coord[];
+    pair latlon;
+    picture Nom;
+    string p_;
+    p_=scantokens readfrom nomfichiermul;
+    latlon=scantokens readfrom nomfichiermul;
+    Coord[p]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+    Nom=image(
+      label.top(TEX(""&p_&""),Projgeo(Coord[p]));
+      );
+    if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+      if ProduitScalaire(Coord[p]-pte3,Oeil-pte3)>0:
+	pointe(Coord[p]);
+	%draw Nom;
+      fi;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+  marque_p:="non";
+enddef;
+
+vardef Lecture(expr Nomfichier)=
+  NomFichier:=arborescence&Nomfichier;
+  nblec:=scantokens readfrom NomFichier;
+  for w=1 upto nblec:
+    if projection="non":
+      lecture(scantokens readfrom NomFichier);
+    else:
+      lecturep(scantokens readfrom NomFichier);
+    fi;
+  endfor;
+  closefrom NomFichier;
+enddef;
+
+%Pour les projections
+string projection;
+projection:="non";
+
+vardef zoom(expr nbzoom)=
+  if projection="mercator":
+    xunit:=nbzoom;
+    yunit:=nbzoom*2*cm;
+  elseif projection="cylindrique":
+    xunit:=2.5*nbzoom;
+    yunit:=nbzoom*10*cm;
+  elseif projection="simple":
+    xunit:=nbzoom*0.5*mm;
+    yunit:=nbzoom*0.5*mm;
+  elseif projection="bonne":
+    xunit:=nbzoom*4*cm;
+    yunit:=xunit;
+  fi;
+enddef;
+
+vardef mercatorc(expr aa,bb)=
+  (xunit*(bb-theta),yunit*(ln(abs(tand(45+(aa/2))))-ln(abs(tand(45+(phi/2))))))
+enddef;
+
+vardef coniquec(expr aa,bb,pc)=
+  abscon:=5*cm*(cosd(aa)*sind(bb*sind(pc)))/(sind(pc)*cosd(aa-pc));
+  ordcon:=5*cm*(cosd(aa)*cosd(bb*sind(pc)))/(sind(pc)*cosd(aa-pc));
+  (abscon,ordcon)
+enddef;
+
+vardef cylindriquec(expr aa,bb)=
+  (xunit*(bb-theta),yunit*(sind(aa)-sind(phi)))
+enddef;
+
+vardef simplec(expr aa,bb)=
+  (xunit*(bb-theta),yunit*(aa-phi))
+enddef;
+
+vardef bonnec(expr aaa,bbb)=
+  save tt;
+  pair tt;
+  rho:=cotand(phi)+(phi-aaa)/c;
+  %E:=(((bbb-theta)/c)*cosd(aaa))/rho;
+  E:=(((bbb-theta)/c)/rho)*cosd(aaa);
+  tt=xunit*(rho*sind(E*c),cotand(phi)-rho*cosd(E*c));
+  tt
+enddef;
+
+vardef lecturep(expr nomfichier,fond)=
+  pair Coord[];
+  nbpts:=scantokens readfrom nomfichier;
+  numeric ll;
+  ll=0;
+  for k=1 upto nbpts:
+    pair latlon;
+    latlon=scantokens readfrom nomfichier;
+    if projection="mercator":
+      Coord[k]=mercatorc(xpart(latlon/60),ypart(latlon/60))
+    elseif projection="winkel":
+      Coord[k]=winkelc(xpart(latlon/60),ypart(latlon/60))
+    elseif projection="cylindrique":
+      Coord[k]=cylindriquec(xpart(latlon/60),ypart(latlon/60));
+    elseif projection="simple":
+      Coord[k]=simplec(xpart(latlon/60),ypart(latlon/60));
+    elseif projection="bonne":
+      Coord[k]=bonnec(xpart(latlon/60),ypart(latlon/60));
+    elseif projection="coniqueh":
+      if (xpart(latlon)>0) or (xpart(latlon)=0):
+	ll:=ll+1;
+	Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),45);
+      fi;
+    elseif projection="coniqueb":
+      if (xpart(latlon)<0):
+	ll:=ll+1;
+	Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),-45);
+      fi;
+    fi;
+  endfor;
+  closefrom nomfichier;
+  path pays;
+  if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+    ll:=nbpts
+  fi;
+  if ll>0:
+    pays=Coord[1]
+    for l=4 step 3 until ll:%upto ll:
+      --Coord[l]
+    endfor;
+    if noncolore=true:
+      fill pays--cycle withcolor payscolor;
+    else:
+      fill pays--cycle withcolor fond;
+    fi;
+    draw pays;
+  fi;
+  %label.top(decimal(nbpts),(0,0));
+enddef;
+
+vardef Lectureilesp=
+  if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+    nomfichiermul:=arborescence&"Ile.dat";
+  else:
+    nomfichiermul:=arborescence&"iles.dat";
+  fi;
+  nblec:=scantokens readfrom nomfichiermul;
+  if projection="bonne":
+    nblec:=nblec-1
+  fi;
+  for p=1 upto nblec:
+    pair Coord[];color fond;
+    nbpts:=scantokens readfrom nomfichiermul;
+    fond=scantokens readfrom nomfichiermul;
+    numeric ll;
+    ll=0;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      if projection="mercator":
+	Coord[k]=mercatorc(xpart(latlon/60),ypart(latlon/60))
+      elseif projection="winkel":
+	Coord[k]=winkelc(xpart(latlon/60),ypart(latlon/60))
+      elseif projection="simple":
+	Coord[k]=simplec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="cylindrique":
+	Coord[k]=cylindriquec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="bonne":
+	Coord[k]=bonnec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="coniqueh":
+	if (xpart(latlon)>0) or (xpart(latlon)=0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),45)
+	fi;
+      elseif projection="coniqueb":
+	if (xpart(latlon)<0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),-45);
+	fi;
+      fi;
+    endfor;
+    path pays;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      ll:=nbpts
+    fi;
+    if ll>0:
+      pays=Coord[1]
+      for l=2 upto ll:
+	--Coord[l]
+      endfor;
+      if noncolore=true:
+	fill pays--cycle withcolor payscolor;
+      else:
+	fill pays--cycle withcolor fond;
+      fi;
+      draw pays;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+  if (projection="mercator")or (projection="cylindrique") or (projection="simple"):
+    clip currentpicture to feuillet;
+  fi;
+  if projection="bonne":
+    lecturep(arborescence&"polesud.dat",blanc);
+    clip currentpicture to (bonnec(-90,-180) for k=-89 upto 90:..bonnec(k,-180) endfor)..reverse(bonnec(-90,180) for k=-89 upto 90:..bonnec(k,180) endfor)..cycle;
+  fi;
+enddef;
+
+%14/05/2017
+boolean ecriturevilles;
+ecriturevilles:=true;
+%14/05/2017
+
+vardef Lecturevillesp(expr nompays)=
+  nomfichiermul:=arborescence&"villes"&nompays&".dat";
+  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="simple":
+      Coord[p]=simplec(ypart(latlon),xpart(latlon));
+    elseif projection="cylindrique":
+      Coord[p]=cylindriquec(ypart(latlon),xpart(latlon));
+    elseif projection="bonne":
+	Coord[p]=bonnec(ypart(latlon),xpart(latlon));
+    fi;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      if ecriturevilles=true:
+	dotlabel.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]);
+      else:
+	dotlabel.scantokens readfrom nomfichiermul("",Coord[p]);
+      fi;
+    fi;
+  endfor;
+  drawoptions();
+  closefrom nomfichiermul;
+enddef;
+
+%16/02/2010
+
+vardef Lecturevilles(expr nomfich)=
+marque_p:="creux";
+  nomfichiermul:=nomfich&".dat";
+  nbcapitales:=scantokens readfrom nomfichiermul;
+  for p=1 upto nbcapitales:
+    color Coord[];
+    pair latlon;
+    picture Nom;
+    string p_;
+    p_=scantokens readfrom nomfichiermul;
+    latlon=scantokens readfrom nomfichiermul;
+    Coord[p]=rayon*(cosd(xpart(latlon/60))*cosd(ypart(latlon/60)),cosd(xpart(latlon/60))*sind(ypart(latlon/60)),sind(xpart(latlon/60)));
+    Nom=image(
+      label.scantokens readfrom nomfichiermul(TEX(""&p_&""),Projgeo(Coord[p]));
+      );
+    if ((xpart(latlon/60)>phim) and (xpart(latlon/60)<phip)):
+      if ProduitScalaire(Coord[p]-pte3,Oeil-pte3)>0:
+	pointe(Coord[p]);
+	draw Nom;
+      fi;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+  marque_p:="non";
+enddef;
+%
+
+
+vardef Lecturelacsp=
+  nomfichiermul:=arborescence&"lacs.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    pair Coord[];
+    nbpts:=scantokens readfrom nomfichiermul;
+    numeric ll;
+    ll=0;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      if projection="mercator":
+	Coord[k]=mercatorc(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="simple":
+	Coord[k]=simplec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="cylindrique":
+	Coord[k]=cylindriquec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="bonne":
+	Coord[k]=bonnec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="coniqueh":
+	if (xpart(latlon)>0) or (xpart(latlon)=0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),45);
+	fi;
+      elseif projection="coniqueb":
+	if (xpart(latlon)<0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),-45);
+	fi;
+      fi;
+    endfor;
+    path lac;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      ll:=nbpts
+    fi;
+    if ll>0:
+      lac=Coord[1]
+      for l=2 upto ll:
+	--Coord[l]
+      endfor;
+      fill lac--cycle withcolor couleurfleuve;
+      draw lac;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturelacspsup=
+  nomfichiermul:=arborescence&"lacssup.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    pair Coord[];
+    nbpts:=scantokens readfrom nomfichiermul;
+    numeric ll;
+    ll=0;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      if projection="mercator":
+	Coord[k]=mercatorc(xpart(latlon),ypart(latlon));
+      elseif projection="simple":
+	Coord[k]=simplec(xpart(latlon),ypart(latlon));
+      elseif projection="cylindrique":
+	Coord[k]=cylindriquec(xpart(latlon),ypart(latlon));
+      elseif projection="bonne":
+	Coord[k]=bonnec(xpart(latlon),ypart(latlon));
+      elseif projection="coniqueh":
+	if (xpart(latlon)>0) or (xpart(latlon)=0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon),ypart(latlon),45);
+	fi;
+      elseif projection="coniqueb":
+	if (xpart(latlon)<0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon),ypart(latlon),-45);
+	fi;
+      fi;
+    endfor;
+    path lac;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      ll:=nbpts
+    fi;
+    if ll>0:
+      lac=Coord[1]
+      for l=2 upto ll:
+	--Coord[l]
+      endfor;
+      fill lac--cycle withcolor couleurfleuve;
+      draw lac;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturerivieresp=
+  nomfichiermul:=arborescence&"rivieres.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    pair Coord[];
+    nbpts:=scantokens readfrom nomfichiermul;
+    numeric ll;
+    ll:=0;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      if projection="mercator":
+	Coord[k]=mercatorc(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="simple":
+	Coord[k]=simplec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="cylindrique":
+	Coord[k]=cylindriquec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="bonne":
+	Coord[k]=bonnec(xpart(latlon/60),ypart(latlon/60));
+      elseif projection="coniqueh":
+	if (xpart(latlon)>0) or (xpart(latlon)=0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),45);
+	fi;
+      elseif projection="coniqueb":
+	if (xpart(latlon)<0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon/60),ypart(latlon/60),-45);
+	fi;
+      fi;
+    endfor;
+    path riv;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      ll:=nbpts;
+    fi;
+    if ll>0:
+      riv=Coord[1]
+      for l=2 upto ll:
+	--Coord[l]
+      endfor;
+      draw riv withcolor couleurfleuve;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturerivierespsup=
+  nomfichiermul:=arborescence&"fleuveseurope.dat";
+  nblec:=scantokens readfrom nomfichiermul;
+  for p=1 upto nblec:
+    pair Coord[];
+    nbpts:=scantokens readfrom nomfichiermul;
+    numeric ll;
+    ll:=0;
+    for k=1 upto nbpts:
+      pair latlon;
+      latlon=scantokens readfrom nomfichiermul;
+      if projection="mercator":
+	Coord[k]=mercatorc(xpart(latlon),ypart(latlon));
+      elseif projection="simple":
+	Coord[k]=simplec(xpart(latlon),ypart(latlon));
+      elseif projection="cylindrique":
+	Coord[k]=cylindriquec(xpart(latlon),ypart(latlon));
+      elseif projection="bonne":
+	Coord[k]=bonnec(xpart(latlon),ypart(latlon));
+      elseif projection="coniqueh":
+	if (xpart(latlon)>0) or (xpart(latlon)=0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon),ypart(latlon),45);
+	fi;
+      elseif projection="coniqueb":
+	if (xpart(latlon)<0):
+	  ll:=ll+1;
+	  Coord[ll]=coniquec(xpart(latlon),ypart(latlon),-45);
+	fi;
+      fi;
+    endfor;
+    path riv;
+    if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+      ll:=nbpts;
+    fi;
+    if ll>0:
+      riv=Coord[1]
+      for l=2 upto ll:
+	--Coord[l]
+      endfor;
+      draw riv withcolor couleurfleuve;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+enddef;
+
+vardef Lecturecapitalesp=
+  marque_p:="creux";
+  nomfichiermul:=arborescence&"capitales.dat";
+  nbcapitales:=scantokens readfrom nomfichiermul;
+  for p=1 upto nbcapitales:
+    pair Coord[],latlon;
+    string p_;
+    p_=scantokens readfrom nomfichiermul;
+    latlon=scantokens readfrom nomfichiermul;
+    ll:=0;
+    if projection="mercator":
+      Coord[p]=mercatorc(xpart(latlon/60),ypart(latlon/60));
+      ll:=1;
+    elseif projection="simple":
+      Coord[p]=simplec(xpart(latlon/60),ypart(latlon/60));
+      ll:=1;
+    elseif projection="cylindrique":
+      Coord[p]=cylindriquec(xpart(latlon/60),ypart(latlon/60));
+      ll:=1;
+    elseif projection="bonne":
+      Coord[p]=bonnec(xpart(latlon/60),ypart(latlon/60));
+      ll:=1;
+    elseif projection="coniqueh":
+      if (xpart(latlon)>0) or (xpart(latlon)=0):
+	ll:=1;
+	Coord[p]=coniquec(xpart(latlon/60),ypart(latlon/60),45);
+      fi;
+    elseif projection="coniqueb":
+      if (xpart(latlon)<0):
+	ll:=1;
+	Coord[p]=coniquec(xpart(latlon/60),ypart(latlon/60),-45);
+      fi;
+    fi;
+    if ll>0:
+      drawoptions(withcolor rouge);
+      pointe(Coord[p]);
+      drawoptions();
+      if (projection="mercator") or (projection="cylindrique") or (projection="simple") or (projection="bonne"):
+	label.top(TEX(""&p_&""),Coord[p]);
+      fi;
+    fi;
+  endfor;
+  closefrom nomfichiermul;
+  marque_p:="non";
+enddef;
+
+vardef MeridienParallele=
+  if (projection="mercator") or (projection="cylindrique") or (projection="simple"):
+    pair Coord[];
+    for k=-85 step 5 until 85:
+      for j=-180 step 10 until 180:
+	if projection="mercator":
+	  Coord[100*k+j]=mercatorc(k,j);
+	elseif projection="simple":
+	  Coord[100*k+j]=simplec(k,j);
+	elseif projection="cylindrique":
+	  Coord[100*k+j]=cylindriquec(k,j);
+	fi;
+      endfor;
+    endfor;
+    for k=-85 step 5 until 85:
+      draw Coord[100*k-180]
+	for j=-170 step 10 until 180:
+	--Coord[100*k+j]
+      endfor;
+    endfor;
+    pair Coord[];
+    for k=-180 step 10 until 180:
+      for j=-85 step 5 until 85:
+	if projection="mercator":
+	  Coord[0.001*k+10*j]=mercatorc(j,k);
+	elseif projection="simple":
+	  Coord[0.001*k+10*j]=simplec(j,k);
+	elseif projection="cylindrique":
+	  Coord[0.001*k+10*j]=cylindriquec(j,k);
+	fi;
+      endfor;
+    endfor;
+    for k=-180 step 10 until 180:
+      draw Coord[0.001*k-10*80]
+	for j=-85 step 5 until 85:
+	--Coord[0.001*k+10*j]
+      endfor;
+    endfor;
+  elseif projection="bonne":
+    pair Coord[][];
+    for k=-90 step 10 until 90:
+      for j=-180 step 10 until 180:
+	Coord[k][j]=bonnec(k,j);
+      endfor;
+    endfor;
+    for k=-90 step 10 until 90:
+      draw Coord[k][-180]
+      for j=-170 step 10 until 180:
+	--Coord[k][j]
+      endfor;
+    endfor;
+    pair Coord[][];
+    for k=-170 step 10 until 170:
+      for j=-90 step 10 until 90:
+	Coord[k][j]=bonnec(j,k);
+      endfor;
+    endfor;
+    for k=-170 step 10 until 170:
+      draw Coord[k][-90]
+      for j=-80 step 10 until 90:
+	..Coord[k][j]
+      endfor;
+    endfor;
+  elseif projection="coniqueh":
+    pair Coord[];
+    for k=-180 step 10 until 180:
+      for j=0 step 10 until 90:
+	Coord[100*k+j]=coniquec(j,k,45);
+      endfor;
+    endfor;
+    for k=-180 step 10 until 180:
+      draw Coord[100*k]
+      for j=10 step 10 until 90:
+	--Coord[100*k+j]
+      endfor;
+    endfor;
+    pair Coord[];
+    for k=0 step 10 until 90:
+      for j=-180 step 10 until 180:
+	Coord[0.001*k+10*j]=coniquec(k,j,45);
+      endfor;
+    endfor;
+    for k=0 step 10 until 90:
+      draw Coord[0.001*k-10*180]
+      for j=-170 step 10 until 180:
+	--Coord[0.001*k+10*j]
+      endfor;
+    endfor;
+    clip currentpicture to coniquec(90,0,45)--(Coord[-10*180]
+      for j=-170 step 10 until 180:
+	--Coord[10*j]
+      endfor)--cycle;
+  elseif projection="coniqueb":
+    pair Coord[];
+    for k=-180 step 10 until 180:
+      for j=-90 step 10 until 0:
+	Coord[100*k+j]=coniquec(j,k,-45);
+      endfor;
+    endfor;
+    for k=-180 step 10 until 180:
+      draw Coord[100*k-90]
+      for j=-80 step 10 until 0:
+	--Coord[100*k+j]
+      endfor;
+    endfor;
+    pair Coord[];
+    for k=-90 step 10 until 0:
+      for j=-180 step 10 until 180:
+	Coord[0.001*k+10*j]=coniquec(k,j,-45);
+      endfor;
+    endfor;
+    for k=-90 step 10 until 0:
+      draw Coord[0.001*k-10*180]
+      for j=-170 step 10 until 180:
+	--Coord[0.001*k+10*j]
+      endfor;
+    endfor;
+    clip currentpicture to coniquec(-90,0,-45)--(Coord[-10*180]
+      for j=-170 step 10 until 180:
+	--Coord[10*j]
+      endfor)--cycle;
+  fi;
+enddef;
+
+boolean Echelle;
+Echelle=false;
+
+vardef echelle(expr Th,Ph,long)=%long en km.
+  %Echelle:=true;
+  theta:=Th;
+  phi:=Ph;
+  Long:=long;
+  zoom(1);
+  numeric $;
+  if projection="bonne":
+    $=(cm*pi*cosd(Ph)/36)/(long*abs(bonnec(Ph,Th)-bonnec(Ph,Th+5)))*6340;
+  elseif projection="mercator":
+    $=(cm*pi*cosd(Ph)*6340/36)/(long*abs(mercatorc(Ph,Th)-mercatorc(Ph,Th+5)));
+  elseif projection="simple":
+    $=(cm*pi*cosd(Ph)*6340/36)/(long*abs(simplec(Ph,Th)-simplec(Ph,Th+5)));
+  elseif projection="cylindrique":
+    $=(cm*pi*cosd(Ph)*6340/36)/(long*abs(cylindriquec(Ph,Th)-cylindriquec(Ph,Th+5)));
+  fi;
+  $
+enddef;
+
+boolean Amsud,Amnord,Amcentrale,Caraibes,Asie,Europe,Afrique,All;
+
+Amsud:=false;
+Amnord:=false;
+Amcentrale:=false;
+Caraibes:=false;
+Asie:=false;
+Europe:=false;
+Afrique:=false;
+All:=true;
+
+vardef Projection(expr TH,PH,Zoom)=
+  theta:=TH;
+  phi:=PH;
+  zoom(Zoom);
+  if projection="bonne":
+    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;
+  fi;
+  if All=true:
+    Lecture("Cameriquesud.dat");
+    Lecture("Ccaraibes.dat");
+    Lecture("Cameriquecentrale.dat");
+    Lecture("Cameriquenord.dat");
+    Lecture("Casia.dat");
+    Lecture("Ceurope.dat");
+    Lecture("Cafrique.dat");
+  else:
+    if Amsud=true:
+      Lecture("Cameriquesud.dat");
+    fi;
+    if Amnord=true:
+      Lecture("Cameriquenord.dat");
+    fi;
+    if Amcentrale=true:
+      Lecture("Cameriquecentrale.dat");
+    fi;
+    if Caraibes=true:
+      Lecture("Ccaraibes.dat");
+    fi;
+    if Asie=true:
+      if projection="bonne":
+	Lecture("Casie.dat");
+      else:
+	Lecture("Casia.dat");
+      fi;
+    fi;
+    if Europe=true:
+      Lecture("Ceurope.dat");
+    fi;
+    if Afrique=true:
+      Lecture("Cafrique.dat");
+    fi;
+  fi;
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+    Lecturerivierespsup;
+  fi;
+  if maillage=true:
+    drawoptions(withcolor gris);
+    MeridienParallele;
+    drawoptions();
+  fi;
+  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;
+enddef;
+
+vardef Simple(expr TH,PH,Zoom)=
+  projection:="simple";
+  theta:=TH;
+  phi:=PH;
+  zoom(Zoom);
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casia.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+   fi;
+  if maillage=true:
+    MeridienParallele
+  fi;
+enddef;
+
+vardef Mercator(expr TH,PH,Zoom)=
+  projection:="mercator";
+  theta:=TH;
+  phi:=PH;
+  zoom(Zoom);
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casia.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+  fi;
+  if maillage=true:
+    MeridienParallele
+  fi;
+enddef;
+
+vardef Cylindrique(expr TH,PH,Zoom)=
+  projection:="cylindrique";
+  theta:=TH;
+  phi:=PH;
+  zoom(Zoom);
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casia.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+  fi;
+  if maillage=true:
+    MeridienParallele
+  fi;
+enddef;
+
+vardef Bonne(expr TH,PH,Zoom)=
+  projection:="bonne";
+  theta:=TH;
+  phi:=PH;
+  zoom(Zoom);
+  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;
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casie.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+  fi;
+  if maillage=true:
+    drawoptions(withcolor gris);
+    MeridienParallele;
+    drawoptions();
+  fi;
+  draw (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;
+enddef;
+
+vardef ConiqueH=
+  projection:="coniqueh";
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casie.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+    Lecturerivierespsup;
+  fi;
+  drawoptions(withcolor gris);
+  MeridienParallele;
+  drawoptions();
+enddef;
+
+vardef ConiqueB=
+  projection:="coniqueb";
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casie.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if lacs=true:
+    Lecturelacsp;
+    Lecturelacspsup;
+  fi;
+  Lectureilesp;
+  if capitales=true:
+    Lecturecapitalesp;
+  fi;
+  if fleuves=true:
+    Lecturerivieresp;
+    Lecturerivierespsup;
+  fi;
+  drawoptions(withcolor gris);
+  MeridienParallele;
+  drawoptions();
+enddef;
+
+%%%%%%%
+
+rayon:=2;
+
+boolean fleuves,lacs,capitales,noncolore,maillage,volcans;
+fleuves=true;
+lacs=true;
+capitales=true;
+noncolore=false;
+maillage=false;
+volcans=false;
+
+color couleurfond,couleurmaillage,couleurfleuve;
+couleurfond:=ciel;
+couleurmaillage:=gris;
+couleurfleuve:=cielfonce;
+
+vardef Mappemonde(expr longobs,latobs)=
+  projection:="non";
+  %figureespace(-100u,-100u,100u,100u);
+  Initialisation(5,longobs,latobs,distanceecran);
+  numeric phim,phip,phii;%phi moins -- phi plus - phi interm\xE9diaire
+  phim=Phi+arcsind(rayon/Rho)-90;
+  phip=Phi+90-arcsind(rayon/Rho);
+  color pte[];
+  pte1=rayon*(cosd(phim)*cosd(Theta),cosd(phim)*sind(Theta),sind(phim));
+  pte2=rayon*(cosd(phip)*cosd(Theta),cosd(phip)*sind(Theta),sind(phip));
+  pte3=1/2[pte1,pte2];
+  pte4-pte3=Normal((0,0,0),pte1,pte2);
+  if (Phi>90):
+    phip:=180-phip;
+    phii:=180-phim;
+    phim:=phip;
+    phip:=phii;
+  fi;
+  if (Phi<-90):
+    phip:=-180-phip;
+    phii:=-180-phim;
+    phim:=phip;
+    phip:=phii;
+  fi;
+  fill cercles(pte3,pte1,pte3,pte1,pte4) withcolor couleurfond;
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casie.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if volcans=true:
+    Lecturevolcans;
+  fi;
+  if lacs=true:
+    Lecturelacs;
+    Lecturelacssup;
+  fi;
+  Lectureiles;
+  if capitales=true:
+    Lecturecapitales;
+  fi;
+  if fleuves=true:
+    Lecturerivieres;
+    %Lecturerivieressup;
+  fi;
+  if maillage=true:
+    drawoptions(withcolor couleurmaillage);
+    MaillageSphere;
+    drawoptions();
+  fi;
+  if maille=true:
+    Maille;
+  fi;
+  draw cercles(pte3,pte1,pte3,pte1,pte4);
+  %finespace;
+enddef;
+
+vardef mappemonde(expr longobs,latobs)=
+  projection:="non";
+  %figureespace(-100u,-100u,100u,100u);
+  Initialisation(5,longobs,latobs,distanceecran);
+  numeric phim,phip,phii;%phi moins -- phi plus - phi interm\xE9diaire
+  phim=Phi+arcsind(rayon/Rho)-90;
+  phip=Phi+90-arcsind(rayon/Rho);
+  color pte[];
+  pte1=rayon*(cosd(phim)*cosd(Theta),cosd(phim)*sind(Theta),sind(phim));
+  pte2=rayon*(cosd(phip)*cosd(Theta),cosd(phip)*sind(Theta),sind(phip));
+  pte3=1/2[pte1,pte2];
+  pte4-pte3=Normal((0,0,0),pte1,pte2);
+  if (Phi>90):
+    phip:=180-phip;
+    phii:=180-phim;
+    phim:=phip;
+    phip:=phii;
+  fi;
+  if (Phi<-90):
+    phip:=-180-phip;
+    phii:=-180-phim;
+    phim:=phip;
+    phip:=phii;
+  fi;
+  fill cercles(pte3,pte1,pte3,pte1,pte4) withcolor couleurfond;
+  Lecture("Cameriquesud.dat");
+  Lecture("Ccaraibes.dat");
+  Lecture("Cameriquecentrale.dat");
+  Lecture("Cameriquenord.dat");
+  Lecture("Casie.dat");
+  Lecture("Ceurope.dat");
+  Lecture("Cafrique.dat");
+  if volcans=true:
+    Lecturevolcans;
+  fi;
+  if lacs=true:
+    Lecturelacs;
+    Lecturelacssup;
+  fi;
+  Lectureiles;
+  if capitales=true:
+    Lecturecapitales;
+  fi;
+  if fleuves=true:
+    Lecturerivieres;
+    %Lecturerivieressup;
+  fi;
+  if maillage=true:
+    drawoptions(withcolor couleurmaillage);
+    MaillageSphere;
+    drawoptions();
+  fi;
+  if maille=true:
+    Maille;
+  fi;
+  draw cercles(pte3,pte1,pte3,pte1,pte4);
+%  finespace;
+enddef;
+
+endinput;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCMondegood.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/metapost/profcollege/PfCMonstre.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCMonstre.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCMonstre.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,323 @@
+boolean Couleurs;
+Couleurs=false;
+
+%Style cartoon
+pickup pencircle xscaled 2bp yscaled 0.25bp rotated 60;
+
+% Définitions des points d'accroche
+pair Or[],P[],Ja[],Br[],Bo,Ne,Ye,Ch,Pap,Cr,Mo,Ce;
+P1=(0,0);
+P2-P1=u*(5,0);
+P3-P2=u*(0,6.75);
+P4-P3=P1-P2;
+Ja1=1/4[P1,P2];
+Ja2=3/4[P1,P2];
+Br1=2/5[P1,P4];
+Br2=2/5[P2,P3];
+Or1=3.5/5[P1,P4];
+Or2=3.5/5[P2,P3];
+Ch=1/2[P4,P3];
+Ye=4/5[1/2[P1,P2],1/2[P3,P4]];
+Ne=1/2[1/2[P1,P2],1/2[P3,P4]];
+Mo=2/5[1/2[P1,P2],1/2[P3,P4]];
+Bo=1/5[1/2[P1,P2],1/2[P3,P4]];
+Pap=1/2[P1,P2];
+Cr=Pap;
+
+vardef Corps(expr nb)=
+  save $;
+  path $;
+  path RetiensCorps[];
+  RetiensCorps1=(0,0.125){dir-50}..{dir50}(0.5,0.125){dir-50}..{dir50}(1,0.125){dir-50}..{dir50}(1.5,0.125){dir-50}..{dir50}(2,0.125){dir-50}..{dir50}(2.5,0.125){dir160}..{dir90}(2.5,1.5)..{dir180}(1.25,2.25){dir180}..{dir-90}(0,1.5){dir-90}..{dir-160}cycle;
+  RetiensCorps1:=RetiensCorps1 xscaled 2u yscaled 3u;
+%
+  RetiensCorps2=(0,0)--(2.5,0){dir70}..{dir120}(2.5,1.5)--(2.25,1.25)--(2,1.75)--(1.75,1.5)--(1.25,2.25)--(0.75,1.5)--(0.5,1.75)--(0.25,1.25)--(0,1.5){dir-120}..{dir-70}cycle;
+  RetiensCorps2:=RetiensCorps2 xscaled 2u yscaled 3u;
+%
+  RetiensCorps3=(fullcircle scaled 2.5) shifted(1.25,1.25);
+%
+  RetiensCorps6=(0,0)--(2.5,0){dir70}..{dir120}(1.25,2.25){dir-120}..{dir-70}cycle;
+  RetiensCorps7=RetiensCorps6 scaled 0.9;
+  RetiensCorps8=RetiensCorps7 shifted(center RetiensCorps6-center RetiensCorps7);
+  pair MC[],NC[];
+  nbche:=20;
+  for k=0 upto nbche:
+    MC[k]=point(k*length RetiensCorps6/nbche) of RetiensCorps6;
+    NC[k]=point(k*length RetiensCorps8/nbche) of RetiensCorps8;
+  endfor;
+  RetiensCorps4=MC[0]{dir(angle(NC0-MC0)-5+uniformdeviate(10))} for k=0 upto nbche-1:..NC[k]{dir(angle(MC[k+1]-NC[k])-10+uniformdeviate(20))}..MC[k+1]{dir(angle(NC[k+1]-MC[k+1])-5+uniformdeviate(10))} endfor..cycle;
+  RetiensCorps4:=RetiensCorps4 xscaled 2u yscaled 3u;
+  RetiensCorps9=(fullcircle scaled (0.9*2.5)) shifted(1.25,1.25);
+  for k=0 upto 360:
+    MC[k]:=pointarc(RetiensCorps3,k);
+    NC[k]:=pointarc(RetiensCorps9,k);
+  endfor;
+  RetiensCorps51=NC[0]{dir90}..NC[5]{dir(angle(MC[10]-NC[5]))}--MC[5]{dir90}%
+    ..{dir180}NC[20]{dir(angle(MC[25]-NC[20]))}..MC[25]{dir115}%
+    ..{dir180}NC[45]{dir(angle(MC[50]-NC[45]))}..MC[50]{dir140}%
+    ..{dir180}NC[75]{dir(angle(MC[80]-NC[75]))}..MC[70]{dir160}%
+    ..MC[85]..NC[90];
+  RetiensCorps5=RetiensCorps51..(symetrie(reverse RetiensCorps51,center RetiensCorps3,center RetiensCorps3+(0,1)))..symetrie(RetiensCorps51,center RetiensCorps3)..symetrie(reverse RetiensCorps51,center RetiensCorps3,center RetiensCorps3+(1,0))..cycle;
+  RetiensCorps5:=RetiensCorps5 xscaled 2u yscaled ((6.75/2.5)*u);
+  $=RetiensCorps[nb];
+  $
+enddef;
+%%%%%%%%%%%%%
+% Yeux
+%%%%%%%%%%%%%
+vardef Yeux(expr nb)=
+  save $;
+  picture $;
+  picture RetiensYeux[];
+  RetiensYeux1=image(%
+      path cyeux,pupille;
+    cyeux=(fullcircle xscaled 0.9 yscaled 1.25) rotated -10;
+    pupille=0.1*(cosd(0),sind(0)) for k=1 upto 14:..(0.02+0.03*(k+1)-0.01*k)*(cosd(90*k),sind(90*k)) endfor;
+    fill (cyeux scaled u) withcolor white;
+    fill symetrie(cyeux scaled u,pointarc(cyeux scaled u,10)+(0,-u),pointarc(cyeux scaled u,10)+(0,u)) withcolor white;
+    trace cyeux scaled u;
+    trace pupille scaled u;
+    trace symetrie(cyeux scaled u,pointarc(cyeux scaled u,10)+(0,-u),pointarc(cyeux scaled u,10)+(0,u));
+    trace symetrie(pupille scaled u,pointarc(cyeux scaled u,10)+(0,-u),pointarc(cyeux scaled u,10)+(0,u));
+    );
+  RetiensYeux2=image(%
+      path cyeux,pupille;
+    cyeux=(fullcircle xscaled 0.9 yscaled 1.25);
+    pupille=fullcircle scaled 0.2;
+    fill rotation(cyeux scaled u,(0,0),-90) shifted(0.8u,-0.1u) withcolor white;
+    trace rotation(cyeux scaled u,(0,0),-90) shifted(0.8u,-0.1u);
+    fill rotation((pupille scaled u) shifted(pointarc(cyeux scaled u,-30)+(-0.1u,0)),(0,0),-90) shifted(0.8u,-0.1u);
+    fill (cyeux scaled u) withcolor white;
+    trace cyeux scaled u;
+    fill (pupille scaled u) shifted(pointarc(cyeux scaled u,0)+(-0.1u,0));
+    pair M[];
+    M1=pointarc(cyeux scaled u,75)+(0,0.05u);
+    M2=pointarc(cyeux scaled u,110)+0.5*sqrt(2)*(-0.05u,0.05u);
+    fill M1{dir150}..{dir-120}M2{dir90}..{dir-90}M1--cycle;
+    fill symetrie((M1{dir150}..{dir-120}M2{dir90}..{dir-90}M1--cycle),pointarc(cyeux scaled u,0),pointarc(cyeux scaled u,0)+(0,1)) shifted(0,-0.2u);
+    ); 
+  RetiensYeux3=image(%
+      path cyeux,pupille;
+    cyeux=(fullcircle xscaled 0.9 yscaled 1.25) rotated 30;
+    pupille=fullcircle scaled 0.25 shifted(0.2,0.2);
+    fill (cyeux scaled u) withcolor white;
+    fill symetrie(cyeux scaled u,pointarc(cyeux scaled u,-30)+(0,-u),pointarc(cyeux scaled u,-30)+(0,u)) withcolor white;
+    fill (cercles((0.5,0.5),0.25) scaled u) withcolor white;
+    trace cyeux scaled u;
+    fill pupille scaled u;
+    trace symetrie(cyeux scaled u,pointarc(cyeux scaled u,-30)+(0,-u),pointarc(cyeux scaled u,-30)+(0,u));
+    fill symetrie(pupille scaled u,pointarc(cyeux scaled u,-30)+(0,-u),pointarc(cyeux scaled u,-30)+(0,u));
+    trace cercles((0.5,0.5),0.25) scaled u;
+    fill (cercles((0.5,0.5),0.1) shifted(-0.1,0))  scaled u ;
+    );
+  RetiensYeux4=image(%
+      path cyeux,pupille;
+    trace (fullcircle xscaled 0.9 yscaled 1.25) scaled u withcolor CoulCorps;
+    cyeux=(fullcircle xscaled 1.1 yscaled 1.5) rotated 90;
+    pupille=fullcircle scaled 0.75;
+    fill (cyeux scaled u) withcolor white;
+    trace cyeux scaled u;
+    fill pupille scaled u;
+    );
+  RetiensYeux5=image(%
+      path cyeux,pupille;
+    cyeux=(fullcircle xscaled 0.9 yscaled 1.25);
+    pupille=fullcircle scaled 0.25;
+    fill (cyeux scaled u) withcolor white;
+    fill symetrie(cyeux scaled u,pointarc(cyeux scaled u,0)+(0,-u),pointarc(cyeux scaled u,0)+(0,u)) withcolor white;
+    fill ((subpath(0.05*length (cyeux scaled u),0.45*length (cyeux scaled u)) of (cyeux scaled u)){dir 30}..(point(0.05*length (cyeux scaled u)) of (cyeux scaled u))--cycle);
+    fill symetrie(((subpath(0.05*length (cyeux scaled u),0.45*length (cyeux scaled u)) of (cyeux scaled u)){dir 30}..(point(0.05*length (cyeux scaled u)) of (cyeux scaled u))--cycle),pointarc(cyeux scaled u,0)+(0,-u),pointarc(cyeux scaled u,0)+(0,u));
+    trace cyeux scaled u;
+    fill (pupille shifted (0,0.25)) scaled u;
+    trace symetrie(cyeux scaled u,pointarc(cyeux scaled u,0)+(0,-u),pointarc(cyeux scaled u,0)+(0,u));
+    fill symetrie(pupille scaled u,pointarc(cyeux scaled u,0)+(0,-u),pointarc(cyeux scaled u,0)+(0,u));
+    );
+  $=RetiensYeux[nb];
+  $
+enddef;
+%%%%%%
+%Bouche
+%%%%%%
+vardef Bouche(expr nb)=
+  save $;
+  picture $;
+  picture RetiensBouche[];
+  RetiensBouche1=image(
+      path contourbouche;
+    contourbouche=(0,0){dir-30}..{dir30}(0.5u,0){dir30}..{dir0}(1.5u,0.5u)..{dir-90}(2u,0){dir-90}..{dir120}(1.5u,-0.3u)..{dir180}(0.5u,0);
+    if Couleurs:
+      fill (0.5u,0){dir30}..{dir0}(1.5u,0.5u)..{dir-90}(2u,0){dir-90}..{dir120}(1.5u,-0.3u)..{dir180}(0.5u,0)--cycle withcolor white;
+    fi;
+    trace contourbouche;
+    trace (0.5u,0){dir10}..{dir-10}(2u,0);
+    trace (point(0.35*length contourbouche) of contourbouche){dir-80}..(point(0.875*length contourbouche) of contourbouche);
+    trace (point(0.45*length contourbouche) of contourbouche){dir-80}..(point(0.775*length contourbouche) of contourbouche);
+    );
+  RetiensBouche2=image(
+      path contourbouche,jointure,levreh,levreb;
+    contourbouche=(0,0){dir90}..(0.1u,0.35u){dir0}..(u,0.25u)..(1.5u,0.4u)..(1.9u,0.35u){dir-80}..(2u,0){dir-90}..(1.9u,-0.35u)..(1.5u,-0.4u)..(u,-0.25u)..(0.1u,-0.35u)..cycle;
+    jointure=(0,0){dir90}..(0.1u,0u){dir0}..(u,-0.1u)..(1.5u,0.05u)..(1.9u,0){dir-80}..(2u,0);
+    if Couleurs:
+      fill contourbouche withcolor white;
+    fi;
+    trace contourbouche;
+    trace jointure;
+    levreh=subpath(0,length contourbouche/2) of contourbouche;
+    levreb=subpath(length contourbouche/2,length contourbouche) of contourbouche;
+    pair tt[],ss[];
+    for k=1 upto 5:
+      tt[k]=point((k/6)*length jointure) of jointure;
+      ss[k]=point((1/8+k/7)*length jointure) of jointure;
+      trace tt[k]..(perpendiculaire((0,0),(2u,0),tt[k]) intersectionpoint levreh);
+      trace ss[k]..(perpendiculaire((0,0),(2u,0),ss[k]) intersectionpoint levreb);
+    endfor;
+    path carrieh[],carrieb[];
+    carrieh[4]=buildcycle(perpendiculaire((0,0),(2u,0),tt[4]),levreh,reverse(perpendiculaire((0,0),(2u,0),tt[5])),reverse(jointure));
+    fill carrieh4;
+    carrieh[2]=buildcycle(perpendiculaire((0,0),(2u,0),tt[1]),levreh,reverse(perpendiculaire((0,0),(2u,0),tt[2])),reverse(jointure));
+    fill carrieh2;
+    carrieb[2]=buildcycle(jointure,perpendiculaire((0,0),(2u,0),ss[3]),levreb,reverse(perpendiculaire((0,0),(2u,0),ss[2])));
+    fill carrieb2;
+    );
+  RetiensBouche3=image(
+      path contourbouche,jointure,levreh,levreb;
+    contourbouche=(0,0.75u){dir-60}..{dir0}(u,0.75u){dir0}..{dir60}(2u,0.75u){dir-110}..{dir180}(u,-0.15u){dir180}..{dir110}(0,0.75u)--cycle;
+    fill contourbouche;
+    levreh=subpath(0,2) of contourbouche;
+    levreb=subpath(2,length contourbouche) of contourbouche;
+    pair M[];
+    M1=point(0.1*length levreh) of levreh;
+    M2=point(0.15*length levreh) of levreh;
+    fill ((subpath(0.1*length levreh,0.15*length levreh) of levreh)--(iso(M1,M2)+(0,-0.1u))--cycle) withcolor white;
+    M3=point(0.25*length levreh) of levreh;
+    M4=point(0.325*length levreh) of levreh;
+    fill ((subpath(0.25*length levreh,0.325*length levreh) of levreh)--(iso(M3,M4)+(0,-0.2u))--cycle) withcolor white;
+    M5=point(0.45*length levreh) of levreh;
+    M6=point(0.55*length levreh) of levreh;
+    fill ((subpath(0.45*length levreh,0.55*length levreh) of levreh)--(iso(M5,M6)+(0,-0.35u))--cycle) withcolor white;
+    M7=point(0.675*length levreh) of levreh;
+    M8=point(0.75*length levreh) of levreh;
+    fill ((subpath(0.675*length levreh,0.75*length levreh) of levreh)--(iso(M7,M8)+(0,-0.2u))--cycle) withcolor white;
+    M10=point(0.875*length levreh) of levreh;
+    M11=point(0.925*length levreh) of levreh;
+    fill ((subpath(0.875*length levreh,0.925*length levreh) of levreh)--(iso(M10,M11)+(0,-0.1u))--cycle) withcolor white;
+%%%%%%%%%%%%%
+    M1:=point(0.1*length levreb) of levreb;
+    M2:=point(0.15*length levreb) of levreb;
+    fill ((subpath(0.1*length levreb,0.15*length levreb) of levreb)--(iso(M1,M2)+(0,0.15u))--cycle) withcolor white;
+    M3:=point(0.2*length levreb) of levreb;
+    M4:=point(0.3*length levreb) of levreb;
+    fill ((subpath(0.2*length levreb,0.3*length levreb) of levreb)--(iso(M3,M4)+(0,0.2u))--cycle) withcolor white;
+    M5:=point(0.35*length levreb) of levreb;
+    M6:=point(0.45*length levreb) of levreb;
+    fill ((subpath(0.35*length levreb,0.45*length levreb) of levreb)--(iso(M5,M6)+(0,0.2u))--cycle) withcolor white;
+    M7:=point(0.5*length levreb) of levreb;
+    M8:=point(0.55*length levreb) of levreb;
+    fill ((subpath(0.5*length levreb,0.55*length levreb) of levreb)--(iso(M7,M8)+(0,0.1u))--cycle) withcolor white;
+    trace contourbouche;
+    );
+  RetiensBouche4=image(
+      path contourbouche,jointure,levreh,levreb;
+    pair M[];
+    M0=(0,0);
+    M1=(2u,0.5u);
+    contourbouche=(0,0)--(2u,0.5u)--(1.25u,-0.2u)--cycle;
+    fill contourbouche;
+    trace (0,-0.2u)--(0,0.2u);
+    trace (2u,0.3u)--(2u,0.7u);
+    M2=6.5/10[M0,M1];
+    M3=8.5/10[M0,M1];
+    M4=(0.5*(6.5+8.5)/10)[M0,M1];
+    M5=2.9[M4,rotation(M3,M4,-90)];
+    trace contourbouche;
+    fill M2{dir-80}..{dir0}M5{dir60}..M3--cycle withcolor white;
+    trace M2{dir-80}..{dir0}M5{dir60}..M3--cycle;
+    trace M4--(7/10)[M4,M5];
+    );
+  RetiensBouche5=image(
+      path contourbouche,jointure,levreh,levreb;
+    contourbouche=(0,0.5u){dir60}..{dir0}(0.25u,0)..(0.6u,0.2u)..(1.2u,-0.2u)..{dir-10}(2u,0);
+    trace (-0.05u,0.55u)--(0.05u,0.45u);
+    trace (1.95u,-0.05u)--(2.05u,0.05u);
+    trace contourbouche;
+    );
+  $=RetiensBouche[nb];
+  $
+enddef;
+%%%%
+% Nez
+%%%%
+vardef Nez(expr nb)=
+  save $;
+  picture $;
+  picture RetiensNez[];
+  RetiensNez1=image(
+      trace (0,0.2u){dir-120}..{dir0}(0.25u,0);
+    trace (0.25u,0.1u){dir-90}..{dir60}(1.7u,0.2u);
+    trace (1.7u,0.2u){dir-110}..{dir100}(2u,0.2u);
+    );
+  RetiensNez2=image(
+      trace (0.1u,0.5u){dir-100}..{dir-10}(0,0){dir-10}..(u,0.2u)..(2u,0){dir0}..{dir100}(1.9u,0.5u);
+    );
+  RetiensNez3=image(
+      if Couleurs:
+      fill (0,0){dir90}..{dir-10}(u,0.25u){dir10}..{dir-90}(2u,0){dir-90}..{dir170}(u,-0.25u){dir-170}..{dir90}cycle withcolor white;
+      fi;
+      trace (0,0){dir90}..{dir-10}(u,0.25u){dir10}..{dir-90}(2u,0){dir-90}..{dir170}(u,-0.25u){dir-170}..{dir90}cycle;
+    fill (fullcircle xscaled 0.1u yscaled 0.2u) shifted(0.5u,0);
+    fill (fullcircle xscaled 0.1u yscaled 0.2u) shifted(1.5u,0);
+    );
+  RetiensNez4=image(
+      pair M[];
+    M0=(0,0);
+    M1=(0.5u,0);
+    M2=2[iso(M0,M1),rotation(M1,M0,60)];
+    fill M0{dir-10}..{dir10}M1..{dir120}M2{dir-120}..{dir-10}cycle;
+    );
+  RetiensNez5=image(
+      pair M[];
+    M0=(0,0);
+    M1=(0.5u,0);
+    M2=(1.5u,0);
+    M3=(2u,0);
+    path contournez;
+    contournez=M1{dir100}..{dir-100}M2{dir-160}..{dir160}cycle;
+    fill contournez withcolor white;
+    fill buildcycle(subpath(0,0.5*length contournez) of contournez,(point(0.15*length contournez) of contournez){dir0}..{dir-90}(u,-0.5u),contournez);
+    fill symetrie(buildcycle(subpath(0,0.5*length contournez) of contournez,(point(0.15*length contournez) of contournez){dir0}..{dir-90}(u,-0.5u),contournez),(u,0),(u,0.5));
+    trace contournez;
+    );
+  $=RetiensNez[nb];
+  $
+enddef;
+%%%%%
+%Oreilles
+%%%%%
+vardef Oreille(expr nb)=
+  save $;
+  picture $;
+  picture RetiensOreille[];
+  RetiensOreille1=image(
+      draw (0,0){dir150}..{dir60}(-0.2u,1.5u){dir-100}..(u,0.5u);
+    );
+  RetiensOreille2=image(
+      draw (0,0){dir180}..{dir-120}(-u,-0.25u){dir180}..{dir0}(-u,0.5u){dir-60}..{dir0}(u,0.25u);
+    draw (-u,-0.25u){dir120}..{dir60}(-u,0.5u);
+    );
+  RetiensOreille3=image(
+      draw (0,0)--(-u,0)--(-u,u){dir-90}..{dir90}(-0.5u,u)--(-0.5u,0.5u)--(u,0.5u);
+    );
+  RetiensOreille4=image(
+      path coinor;
+    coinor=(0,0){dir60}..{dir90}(-0.5u,1.5u){dir-60}..{dir0}(u,u);
+    fill (subpath(0.3*length coinor,0.7*length coinor) of coinor)--cycle;
+    trace coinor;
+    );
+  RetiensOreille5=image(
+      path coinor;
+    coinor=(0,0)--(-0.5u,1u)--(0,1.5u)--(-0.25u,u)--(u,0.5u);
+    trace coinor;
+    );
+  $=RetiensOreille[nb];
+  $
+enddef;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCMonstre.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCMosaique.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCMosaique.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCMosaique.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -3,7 +3,7 @@
 path Bc[];
 picture MosaiqueUn[];
 
-for k=1 upto 8:
+%for k=1 upto 8:
   A1=u*(0,0);
   A3-A1=u*(1,0);
   A2=iso(A1,A3);
@@ -13,7 +13,7 @@
   A6=iso(A5,A7);
   A8=iso(A7,A1);
   O=iso(A1,A5);
-endfor;
+%endfor;
 
 A9=A1;
 
@@ -224,7 +224,7 @@
 path Bc[];
 picture MosaiqueDeux[];
 
-for k=1 upto 8:
+%for k=1 upto 8:
   A1=u*(0,0);
   A3-A1=u*(1,0);
   A2=iso(A1,A3);
@@ -234,7 +234,7 @@
   A6=iso(A5,A7);
   A8=iso(A7,A1);
   O=iso(A1,A5);
-endfor;
+%endfor;
 
 A9=A1;
 
@@ -444,3 +444,145 @@
     endfor;
   endfor;
 endfor;
+
+%Troisieme ensemble de mosaique
+pair A[],O;
+path Bc[];
+picture MosaiqueTrois[];
+
+A1=u*(0,0);
+A3-A1=u*(1,0);
+A2=iso(A1,A3);
+A5=rotation(A1,A3,-90);
+A4=iso(A3,A5);
+A7-A5=A1-A3;
+A6=iso(A5,A7);
+A8=iso(A7,A1);
+O=iso(A1,A5);
+
+A9=A1;
+
+Bc[0]=polygone(A[1],A[2],A[8]);
+Bc[1]=polygone(A[8],A[2],O);
+Bc[2]=polygone(A[4],A[2],O);
+Bc[3]=polygone(A[3],A[2],A[4]);
+Bc[4]=polygone(A[5],A[4],A[6]);
+Bc[5]=polygone(A[4],A[6],O);
+Bc[6]=polygone(A[6],A[8],O);
+Bc[7]=polygone(A[6],A[7],A[8]);
+
+for p=0 upto 255:
+  depart:=p;
+  MosaiqueTrois[p]=image(%
+    for k=7 downto 0:
+      reste:=depart mod 2;
+      if reste=1:
+	remplis Bc[7-k];
+      fi;
+      depart:=depart div 2;
+    endfor;
+    drawoptions(withcolor gris);
+    trace polygone(A2,A4,A6,A8);
+    trace segment(A8,A4);
+    trace segment(A6,A2);
+    drawoptions();
+    trace polygone(A1,A3,A5,A7) withcolor 0.5white;
+    );
+endfor;
+
+vardef BinaireDecimalInv(expr nbbin)=
+  save $; numeric $,lg;
+  lg=length nbbin;
+  $=0;
+  for k=0 upto lg-1:
+    $:=$+scantokens(substring(k,k+1) of nbbin)*(2**k);
+  endfor;
+  $
+enddef;
+
+%Quatrieme ensemble de mosaïque : Type 1 en binaire
+vardef MosaiqueQuatre(expr p)=
+  save $; picture $;
+  pair A[],O;
+  path Bc[];
+  %
+  A1=u*(0,0);
+  A3-A1=u*(1,0);
+  A2=iso(A1,A3);
+  A5=rotation(A1,A3,-90);
+  A4=iso(A3,A5);
+  A7-A5=A1-A3;
+  A6=iso(A5,A7);
+  A8=iso(A7,A1);
+  O=iso(A1,A5);
+  
+  A9=A1;
+  %
+  for k=1 upto 8:
+    Bc[k-1]=polygone(A[k],A[k+1],O);
+  endfor;
+  depart:=BinaireDecimalInv(p);
+  $=image(%
+    for k=7 downto 0:
+      reste:=depart mod 2;
+      if reste=1:
+	remplis Bc[7-k];
+      fi;
+      depart:=depart div 2;
+    endfor;
+    drawoptions(withcolor gris);
+    trace polygone(A2,A4,A6,A8);
+    trace segment(A8,A4);
+    trace segment(A6,A2);
+    drawoptions();
+    trace polygone(A1,A3,A5,A7) withcolor 0.5white;
+    );
+  $
+enddef;
+
+%Cinquième ensemble de mosaique : type 2 en binaire.
+vardef MosaiqueCinq(expr p)=
+  save $; picture $;
+  %
+  pair A[],O;
+  path Bc[];
+  
+  A1=u*(0,0);
+  A3-A1=u*(1,0);
+  A2=iso(A1,A3);
+  A5=rotation(A1,A3,-90);
+  A4=iso(A3,A5);
+  A7-A5=A1-A3;
+  A6=iso(A5,A7);
+  A8=iso(A7,A1);
+  O=iso(A1,A5);
+  
+  A9=A1;
+  
+  Bc[0]=polygone(A[1],A[2],A[8]);
+  Bc[1]=polygone(A[8],A[2],O);
+  Bc[2]=polygone(A[4],A[2],O);
+  Bc[3]=polygone(A[3],A[2],A[4]);
+  Bc[4]=polygone(A[5],A[4],A[6]);
+  Bc[5]=polygone(A[4],A[6],O);
+  Bc[6]=polygone(A[6],A[8],O);
+  Bc[7]=polygone(A[6],A[7],A[8]);
+  %
+  depart:=BinaireDecimalInv(p);
+  $=image(%
+    for k=7 downto 0:
+      reste:=depart mod 2;
+      if reste=1:
+	remplis Bc[7-k];
+      fi;
+      depart:=depart div 2;
+    endfor;
+    drawoptions(withcolor gris);
+    trace polygone(A2,A4,A6,A8);
+    trace segment(A8,A4);
+    trace segment(A6,A2);
+    drawoptions();
+    trace polygone(A1,A3,A5,A7) withcolor 0.5white;
+    );
+  $
+enddef;

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -11,6 +11,7 @@
 color OTFc[][][];%pour m\xE9moriser les diff\xE9rents sommets de chaque objet;
 color OTFc[][].iso;
 color coul[][];%pour memoriser la couleur de chacune des faces de l'objet;
+color coulfaceX,coulfaceY,coulfaceZ;%pour colorer les faces parall\xE8les aux plans avec la m\xEAme couleur.
 color Outcolor[],Incolor[];%Permet de g\xE9rer la gestion des couleurs d'un objet lors d'un d\xE9placement de cet objet
 boolean Vue[][];
 
@@ -710,6 +711,61 @@
   endfor;
 enddef;
 
+vardef DessineFusionTroisCouleurs=
+  save _fusion;
+  picture _fusion;
+  tapj:=0;
+  color Fc[][];color cou[];
+  for l=1 upto nbobj:
+    for k=0 upto apj[l]:
+      cpt[tapj]:=tapj;
+      Fc[tapj].nb:=OTFc[l][k].nb;
+      for p=1 upto Fc[tapj].nb:
+	Fc[tapj][p]:=OTFc[l][k][p];
+      endfor;
+      Fc[tapj].iso:=OTFc[l][k].iso;
+      if ProduitScalaire((1,0,0),Normal(Fc[tapj].iso,Fc[tapj][1],Fc[tapj][2]))<>0:
+	cou[tapj]:=coulfaceX;
+      else:
+	if ProduitScalaire((0,1,0),Normal(Fc[tapj].iso,Fc[tapj][1],Fc[tapj][2]))<>0:
+	  cou[tapj]:=coulfaceY;
+	else:
+	  cou[tapj]:=coulfaceZ;
+	fi;
+      fi;
+      ALT[tapj]:=ALT[l][k];
+      Vue[tapj]:=Vue[l][k];
+      if Ferme[l]:
+	if Vue[tapj]=false:
+	  tapj:=tapj-1;
+	fi;
+      fi;
+      tapj:=tapj+1;
+    endfor;
+  endfor;
+  tapj:=tapj-1;
+  QS(0,tapj);
+  for k=0 upto tapj:
+    fill for l=1 upto Fc[cpt[k]].nb:
+	Projette(Fc[cpt[k]][l])--
+    endfor
+    cycle withcolor cou[cpt[k]];
+    if traits:
+      draw for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withpen pencircle scaled0.25bp;
+      %add by cp 22/08/2011
+    else:
+      draw for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor cou[cpt[k]];
+%	  %fin add
+    fi;
+  endfor;
+enddef;
+
 vardef Objettore[](expr Rn,rn)=
   Outcolor.@:=outcolor;
   Incolor.@:=incolor;

Added: trunk/Master/texmf-dist/metapost/profcollege/PfCPattern.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCPattern.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCPattern.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,242 @@
+input PfCSolid;
+
+ecartcube=5pt;
+
+vardef fakecube=
+  save $;picture $;
+  $=image(
+      fill polygone((0,0),u*(1,0),u*(1,1),u*(0,1)) withcolor CouleurFond;
+    fill polygone(u*(1,0),u*(1,1),u*(1,1)+u*sqrt(2)*0.25*(1,1),u*(1,0)+u*sqrt(2)*0.25*(1,1)) withcolor CouleurFond;
+    fill polygone(u*(0,1),u*(1,1),u*(1,1)+u*sqrt(2)*0.25*(1,1),u*(0,1)+u*sqrt(2)*0.25*(1,1)) withcolor CouleurFond;
+    trace polygone((0,0),u*(1,0),u*(1,1),u*(0,1));
+    trace polygone(u*(1,0),u*(1,1),u*(1,1)+u*sqrt(2)*0.25*(1,1),u*(1,0)+u*sqrt(2)*0.25*(1,1));
+    trace polygone(u*(0,1),u*(1,1),u*(1,1)+u*sqrt(2)*0.25*(1,1),u*(0,1)+u*sqrt(2)*0.25*(1,1));
+    );
+  larg:=(abs(lrcorner $ - llcorner $)+ecartcube);
+  haut:=(abs(urcorner $ - lrcorner $)+ecartcube);
+  $:=$ shifted(llcorner $-center $);
+  $
+enddef;
+
+vardef bouchon=
+  save $;picture $;
+  $=image(
+      path ccbase,ccbaseh;
+    ccbase=cercles(u*(0.5,0),0.5u) yscaled 0.25;
+    ccbaseh=ccbase shifted(u*(0,0.25));
+    fill (point(0) of ccbase)--(point(0) of ccbaseh)--(subpath(0,length ccbaseh/2) of ccbaseh)--(subpath(length ccbase/2,length ccbase) of ccbase)--cycle withcolor CouleurFond;
+    trace (point(length ccbaseh/2) of ccbaseh)--(subpath(length ccbase/2,length ccbase) of ccbase)--(point(0) of ccbaseh);
+    trace ccbaseh;
+    );
+  larg:=(abs(lrcorner $ - llcorner $)+ecartcube);
+  haut:=(abs(urcorner $ - lrcorner $)+ecartcube);
+  $:=$ shifted(llcorner $-center $);
+  $
+enddef;
+
+vardef cubeespace=
+  typerepre:="proj";
+  save $;picture $;
+  picture PourLarg;
+  intensite:=1.5;
+  Ferme[0]:=false;
+  outcolor:=LightSteelBlue;
+  incolor:=white;
+  nb:=1;subh:=1;
+  creux:=true;
+  %
+  PourLarg=image(%
+    Initialisation(5,10,20,25);
+    Objetcube1("a=0.25");
+    AffichageObjet1;
+  );
+  larg:=(abs(lrcorner PourLarg - llcorner PourLarg)+2pt);
+  haut:=(abs(urcorner PourLarg - lrcorner PourLarg)+2pt);
+  $=PourLarg;
+  $
+enddef;
+
+vardef carre=
+  save $;picture $;
+  $=image(
+    fill ((unitsquare scaled u) shifted (-0.5u,-0.5u)) withcolor CouleurFond;
+    trace (unitsquare scaled u) shifted (-0.5u,-0.5u);
+  );
+  $
+enddef;
+
+vardef kappla=
+  save $;picture $;
+  $=image(
+    fill ((unitsquare xscaled u yscaled 0.25u) shifted(-0.5u,-0.125u)) withcolor CouleurFond;
+    trace (unitsquare xscaled u yscaled 0.25u) shifted(-0.5u,-0.125u);
+  );
+  $
+enddef;
+
+vardef rectangleh=
+  save $;picture $;
+  %haut:=0.5u;
+  $=image(
+    fill ((unitsquare xscaled u yscaled 0.5u) shifted(-0.5u,-0.25u)) withcolor CouleurFond;
+    trace (unitsquare xscaled u yscaled 0.5u) shifted(-0.5u,-0.25u);
+  );
+  $
+enddef;
+
+vardef rectanglev=
+  save $;picture $;
+  %larg:=0.5u;
+  $=image(
+    fill ((unitsquare xscaled 0.5u yscaled u) shifted(-0.25u,-0.5u)) withcolor CouleurFond;
+    trace (unitsquare xscaled 0.5u yscaled u) shifted(-0.25u,-0.5u);
+  );
+  $
+enddef;
+
+vardef carrecroix=
+  save $;picture $;
+  path CarreCroix;
+  CarreCroix=(unitsquare scaled u) shifted(-0.5u,-0.5u);
+  $=image(
+      fill CarreCroix withcolor CouleurFond;
+      trace CarreCroix;
+    trace 0.75[point(0) of CarreCroix,point(2) of CarreCroix]--0.75[point(2) of CarreCroix,point(0) of CarreCroix];
+    trace 0.75[point(1) of CarreCroix,point(3) of CarreCroix]--0.75[point(3) of CarreCroix,point(1) of CarreCroix];
+    );
+  $
+enddef;
+
+vardef carrearrondi=
+  save $;picture $;
+  path CarreArrondi,CarreArrondiA;
+  CarreArrondi=(unitsquare scaled u) shifted(-0.5u,-0.5u);
+  CarreArrondiA=0.1[point(0) of CarreArrondi,point(1) of CarreArrondi]--0.90[point(0) of CarreArrondi,point(1) of CarreArrondi]{dir0}..{dir90}(0.1[point(1) of CarreArrondi,point(2) of CarreArrondi])--0.90[point(1) of CarreArrondi,point(2) of CarreArrondi]{dir90}..{dir180}(0.1[point(2) of CarreArrondi,point(3) of CarreArrondi])--0.90[point(2) of CarreArrondi,point(3) of CarreArrondi]{dir180}..{dir990}(0.1[point(3) of CarreArrondi,point(0) of CarreArrondi])--0.90[point(3) of CarreArrondi,point(0) of CarreArrondi]{dir-90}..cycle;
+  $=image(%
+    fill CarreArrondiA withcolor CouleurFond;
+    trace CarreArrondiA;
+  );
+  $
+enddef;
+
+vardef disque=
+  save $;picture $;
+  $=image(
+    fill cercles((0,0),0.5u) withcolor CouleurFond;
+    trace cercles((0,0),0.5u);
+  );
+  $
+enddef;
+
+vardef diamant=
+  save $;picture $;
+  $=image(
+      %trace rotation(carre scaled(sqrt(2)/2),(0,0),45);
+      fill rotation((unitsquare scaled (u*sqrt(2)/2)) shifted ((0.5*sqrt(2))*(-0.5u,-0.5u)),(0,0),45) withcolor CouleurFond;
+    trace rotation((unitsquare scaled (u*sqrt(2)/2)) shifted ((0.5*sqrt(2))*(-0.5u,-0.5u)),(0,0),45);
+  );
+  $
+enddef;
+
+vardef pentagone=
+  save $; picture $;
+  path Pentagonecc,Pentagonecd;
+  Pentagonecc=cercles((0,0),0.5u);
+  Pentagonecd=pointarc(Pentagonecc,18) for t=1 upto 5:--pointarc(Pentagonecc,18+t*72) endfor--cycle;
+  $=image(
+    fill Pentagonecd withcolor CouleurFond;
+    trace Pentagonecd;
+  );
+  $
+enddef;
+
+vardef etoile=
+  save $; picture $;
+  path Etoilecc;
+  Etoilecc=cercles((0,0),0.5u);
+  pair Etoilept[];
+  for k=0 step 2 until 8:
+  Etoilept[k]=pointarc(Etoilecc,18+(k div 2)*72);
+  endfor;
+  Etoilept[1]=chemin(Etoilept[0],Etoilept[4]) intersectionpoint chemin(Etoilept[2],Etoilept[8]);
+  Etoilept[3]=chemin(Etoilept[0],Etoilept[4]) intersectionpoint chemin(Etoilept[2],Etoilept[6]);
+  Etoilept[5]=chemin(Etoilept[2],Etoilept[6]) intersectionpoint chemin(Etoilept[4],Etoilept[8]);
+  Etoilept[7]=chemin(Etoilept[0],Etoilept[6]) intersectionpoint chemin(Etoilept[4],Etoilept[8]);
+  Etoilept[9]=chemin(Etoilept[0],Etoilept[6]) intersectionpoint chemin(Etoilept[2],Etoilept[8]);
+  path EtoileFin;
+  EtoileFin=Etoilept[0] for k=1 upto 9:--Etoilept[k] endfor -- cycle;
+  $=image(
+      fill EtoileFin withcolor CouleurFond;
+    trace EtoileFin;
+    );
+  $
+enddef;
+
+vardef hexagone=
+  save $; picture $;
+  path Hexagonecc,Hexagonecd;
+  Hexagonecc=cercles((0,0),0.5u);
+  Hexagonecd=pointarc(Hexagonecc,30) for t=1 upto 6:--pointarc(Hexagonecc,30+t*60) endfor--cycle;
+  $=image(
+    fill Hexagonecd withcolor CouleurFond;
+    trace Hexagonecd;
+  );
+  $
+enddef;
+
+vardef hexagonea=
+  save $; picture $;
+  path Hexagonecc,Hexagonecd;
+  Hexagonecc=cercles((0,0),0.5u);
+  Hexagonecd=pointarc(Hexagonecc,-60) for t=1 upto 6:--pointarc(Hexagonecc,-60+t*60) endfor--cycle;
+  $=image(
+    fill Hexagonecd withcolor CouleurFond;
+    trace Hexagonecd;
+  );
+  $
+enddef;
+
+vardef demihexagonea=
+  save $; picture $;
+  path Hexagonecc,Hexagonecd;
+  Hexagonecc=cercles((0,0),0.5u);
+  Hexagonecd=pointarc(Hexagonecc,-60) for t=1 upto 3:--pointarc(Hexagonecc,-60-t*60) endfor--cycle;
+  $=image(
+    fill Hexagonecd withcolor CouleurFond;
+    trace Hexagonecd;
+  );
+  $
+enddef;
+
+vardef equilateral=
+  save $; picture $;
+  path Equilateralcc,Equilateralcd;
+  Equilateralcc=cercles((0,0),0.5u);
+  Equilateralcd=pointarc(Equilateralcc,-30) for t=1 upto 3:--pointarc(Equilateralcc,-30+t*120) endfor--cycle;
+  $=image(
+    fill Equilateralcd withcolor CouleurFond;
+    trace Equilateralcd;
+  );
+  $
+enddef;
+
+vardef boussole=
+  save $; picture $;
+  path Boussolecc,Boussolecd;
+  Boussolecc=cercles((0,0),0.5u);
+  Boussolecd=0.9[(0,0),pointarc(Boussolecc,0)] for t=1 upto 4:--0.33[(0,0),pointarc(Boussolecc,(t-1)*90+22.5)]--0.66[(0,0),pointarc(Boussolecc,(t-1)*90+45)]--0.33[(0,0),pointarc(Boussolecc,(t-1)*90+67.5)]--0.9[(0,0),pointarc(Boussolecc,t*90)] endfor--cycle;
+  $=image(
+    fill Boussolecd withcolor CouleurFond;
+    trace Boussolecd;
+  );
+  $
+enddef;
+
+vardef dot=
+  save $;
+  picture $;
+  $=image(fill fullcircle scaled 2mm withcolor CouleurFond; trace fullcircle scaled 2mm;);
+  $
+enddef;
+
+endinput;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCPattern.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/metapost/profcollege/PfCPeople.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCPeople.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCPeople.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,229 @@
+picture skin[];
+
+nbhair=6;
+
+path hair[], shirt, undershirt, shirthigh,undershirthigh,rayure,laniere;
+
+hair1=pointarc(tete,150)..(pointarc(tete,150)+u*((0.4+uniformdeviate(0.2))*0.7,-0.05+uniformdeviate(0.1)))..pointarc(tete,40+uniformdeviate(20))..arccercle(pointarc(tete,60),pointarc(tete,150),center tete)--cycle;
+%2
+hair2=pointarc(tete,180){dir70}..{dir-70}(pointarc(tete,90)+u*(0,-0.5+uniformdeviate(0.15))){dir70}..{dir-70}pointarc(tete,0)..arccercle(pointarc(tete,0),pointarc(tete,180),center tete)--cycle;
+%3
+hair3=pointarc(tete,180-uniformdeviate(10)){dir(60+uniformdeviate(10))}..{dir(-60-uniformdeviate(10))}pointarc(tete,uniformdeviate(10))..arccercle(pointarc(tete,10),pointarc(tete,180),center tete)--cycle;
+%4
+hair4=pointarc(tete,180-uniformdeviate(10)){dir85}..(pointarc(tete,150)+u*(0.1,0))--(pointarc(tete,150)+u*(0.1+0.1*uniformdeviate(1),-0.1+0.1*uniformdeviate(1)))--(pointarc(tete,150)+u*(0.3+0.1*uniformdeviate(1),0.1*uniformdeviate(1)))--(pointarc(tete,150)+u*(0.5+0.1*uniformdeviate(1),-0.1+0.1*uniformdeviate(1)))--(pointarc(tete,150)+u*(0.7+0.1*uniformdeviate(1),0.1*uniformdeviate(1)))--(pointarc(tete,150)+u*(0.8+0.1*uniformdeviate(1),-0.1+0.1*uniformdeviate(1)))..{dir-90}pointarc(tete,uniformdeviate(10))..arccercle(pointarc(tete,10),pointarc(tete,170),center tete)--cycle;
+%
+hair5=pointarc(tete,180-uniformdeviate(10)){dir85}..{dir90}(pointarc(tete,85+uniformdeviate(10))+u*(0,-0.1-uniformdeviate(0.3))){dir-90}..{dir-90}pointarc(tete,uniformdeviate(10))..arccercle(pointarc(tete,10),pointarc(tete,170),center tete)--cycle;
+%
+hair6:=pointarc(tete,180-uniformdeviate(10)){dir85}..{dir0}(pointarc(tete,120)+u*(0,-0.2)){dir-10}..{dir10}(pointarc(tete,60)+u*(0,-0.2)){dir0}..{dir-85}arccercle(pointarc(tete,10),pointarc(tete,170),center tete)--cycle;
+%
+skin1=image(
+  fill corps withcolor ColCorps;
+trace corps;
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+shirthigh=pointarc(corps,55){dir-150}..{dir150}pointarc(corps,125);
+shirt=shirthigh..arccercle(pointarc(corps,125),pointarc(corps,55),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+);
+%%%%%%%%%%%%%%%%%%%%%
+skin2=image(
+  fill corps withcolor ColCorps;
+trace corps;
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+shirthigh:=pointarc(corps,55){dir-150}..{dir150}pointarc(corps,125);
+shirt:=shirthigh..arccercle(pointarc(corps,125),pointarc(corps,55),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+  undershirthigh:=shirthigh cutbefore chemin((point(0.25*length shirthigh) of shirthigh),(point(0.25*length shirthigh) of shirthigh)) cutafter chemin((point(0.75*length shirthigh) of shirthigh),(point(0.75*length shirthigh) of shirthigh));
+  undershirt:=(point(0.25*length shirthigh) of shirthigh){dir-90}..{dir-90}(center corps){dir90}..{dir90}(point(0.75*length shirthigh) of shirthigh)--reverse(undershirthigh)--cycle;
+  fill undershirt withcolor ColSShirt;
+  trace undershirt;
+);
+%%%%%%%%%%%%%%%%%%%%%%%
+skin3=image(
+  fill corps withcolor ColCorps;
+trace corps;
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+shirthigh:=pointarc(corps,55){dir-150}..{dir150}pointarc(corps,125);
+shirt:=shirthigh..arccercle(pointarc(corps,125),pointarc(corps,55),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+rayure=(shirt cutbefore ((center corps--pointarc(corps,150))) cutafter ((center corps--pointarc(corps,160)))){dir-30}..{dir30}pointarc(corps,20)--(shirt cutbefore ((center corps--pointarc(corps,30))) cutafter ((center corps--pointarc(corps,30)))){dir-150}..{dir150}pointarc(corps,150)--cycle;
+fill rayure withcolor ColSShirt;
+  trace rayure;
+);
+%%%%%%%%%%%%%%%%%%%%%%%
+pair lanierea,laniereb;
+skin4=image(
+  fill corps withcolor ColCorps;
+trace corps;
+shirthigh:=pointarc(corps,45){dir-150}..{dir150}pointarc(corps,135);
+shirt:=shirthigh..arccercle(pointarc(corps,135),pointarc(corps,45),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+rayure:=(shirt cutbefore ((center corps--pointarc(corps,135))) cutafter ((center corps--pointarc(corps,155)))){dir-30}..{dir30}pointarc(corps,25)--(shirt cutbefore ((center corps--pointarc(corps,25))) cutafter ((center corps--pointarc(corps,45)))){dir-150}..{dir150}pointarc(corps,135)--cycle;
+fill rayure withcolor ColSShirt;
+trace rayure;
+lanierea=pointarc(corps,110);
+laniereb=pointarc(corps,125);
+laniere=arccercle(lanierea,laniereb,center corps)--(laniereb+u*(0,-0.75))--(laniereb+u*(0.1,-0.85))--(laniereb+u*(0.2,-0.75))--lanierea--cycle;
+fill laniere withcolor 0.15[ColShirt,black];
+trace laniere;
+fill cercles(laniereb+u*(0.1,-0.75),0.025u) withcolor ColBouton;
+fill symetrie(laniere,center corps,center tete) withcolor 0.15[ColShirt,black];
+trace symetrie(laniere,center corps,center tete);
+fill symetrie(cercles(laniereb+u*(0.1,-0.75),0.025u),center corps,center tete) withcolor ColBouton;
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+);
+%%%%%%%%%%%%%%%%%%%%%%%
+skin5=image(
+  fill corps withcolor ColCorps;
+trace corps;
+shirthigh:=pointarc(corps,75){dir-150}..{dir150}pointarc(corps,105);
+shirt:=shirthigh..arccercle(pointarc(corps,105),pointarc(corps,75),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+path fermeture;
+fermeture=(point(0.5*length shirthigh) of shirthigh)--center corps;
+trace fermeture;
+for k=1 step 2 until 9:
+  fill cercles((point(0.1*k*length fermeture) of fermeture) shifted(u*(0.05,0)),0.025u) withcolor ColBouton;
+endfor;
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+skin6=image(
+  fill corps withcolor ColCorps;
+trace corps;
+shirthigh:=pointarc(corps,75){dir-150}..{dir150}pointarc(corps,105);
+shirt:=shirthigh..arccercle(pointarc(corps,105),pointarc(corps,75),center corps)--cycle;
+fill shirt withcolor ColShirt;
+trace shirt;
+path doublure;
+doublure=arccercle(pointarc(corps,110),pointarc(corps,120),center corps)--(pointarc(corps,120)+u*(-0.1,-0.2))--(pointarc(corps,120)+u*(0.05,-0.25))--(pointarc(corps,120)+u*(0,-0.3))--(point(6) of corps){dir90}..{dir90}cycle;
+fill symetrie((point(6) of corps){dir90}..{dir90}pointarc(corps,110),center corps,center tete)--arccercle(pointarc(corps,70),pointarc(corps,110),center corps)--reverse((point(6) of corps){dir90}..{dir90}pointarc(corps,110))--cycle withcolor ColSShirt;
+trace doublure;
+trace symetrie(doublure,center corps,center tete);
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+  trace hair[typehair];
+  fi;
+  );
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+skin7=image(
+  fill corps withcolor ColCorps;
+trace corps;
+shirthigh:=pointarc(corps,75){dir-150}..{dir150}pointarc(corps,105);
+shirt:=shirthigh..arccercle(pointarc(corps,105),pointarc(corps,75),center corps)--cycle;
+fill shirt withcolor ColShirt;
+  trace shirt;
+  fill (center corps+u*(0,0.5))--arccercle(pointarc(corps,70),pointarc(corps,110),center corps)--cycle withcolor ColCorps;
+path col;
+col=arccercle(pointarc(corps,110),pointarc(corps,120),center corps)--(pointarc(corps,120)+u*(-0.1,-0.2))--(pointarc(corps,120)+u*(-0.15,-0.25))--(pointarc(corps,120)+u*(0.15,-0.2))--(center corps+u*(0,0.5))--cycle;
+trace col;
+trace symetrie(col,center corps,center tete);
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+  trace hair[typehair];
+  fi;
+  );
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+skin8=image(
+  fill corps withcolor ColCorps;
+  trace corps;
+  shirthigh:=pointarc(corps,75){dir-150}..{dir150}pointarc(corps,105);
+  shirt:=arccercle(pointarc(corps,120),pointarc(corps,60),center corps)--reverse((center corps+u*(0,-0.15)){dir85}..{dir90}pointarc(corps,60))--reverse(pointarc(corps,120){dir-90}..{dir-85}(center corps+u*(0,-0.15)))--cycle;
+  path col;
+  col=pointarc(corps,120){dir-90}..{dir-85}(center corps+u*(0,-0.15)){dir85}..{dir90}pointarc(corps,60)--cycle;
+  fill col withcolor ColSShirt;
+  trace col;
+  path noeud,cravate;
+  noeud=pointarc(tete,265)--(pointarc(tete,265)+u*(-0.02,-0.1))--(pointarc(tete,275)+u*(0.02,-0.1))--pointarc(tete,275)--cycle;
+  fill noeud withcolor ColCravate;
+  cravate=(pointarc(tete,265)+u*(-0.02,-0.1))--(pointarc(tete,265)+u*(-0.1,-0.15))--(pointarc(tete,265)+u*(-0.05,-1))--(pointarc(tete,275)+u*(0.05,-1))--(pointarc(tete,275)+u*(0.1,-0.15))--(pointarc(tete,275)+u*(0.02,-0.1))--cycle;
+  fill cravate withcolor ColCravate;
+  trace noeud;
+  trace cravate;
+  fill shirt withcolor ColShirt;
+  trace shirt;
+  fill tete withcolor ColCorps;
+  trace tete;
+  if typehair<nbhair+1:
+    fill hair[typehair] withcolor ColCheveu;
+    trace hair[typehair];
+  fi;
+  );
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+skin9=image(
+  fill tete withcolor ColCorps;
+  trace arccercle(pointarc(tete,330),pointarc(tete,210),center tete);
+  path menton;
+  menton=arccercle(pointarc(tete,210),pointarc(tete,330),center tete){dir-170}..{dir170}cycle;
+  fill corps withcolor ColShirt;
+  fill menton withcolor ColShirt;
+  trace corps cutafter arccercle(pointarc(tete,270),pointarc(tete,0),center tete);
+  trace corps cutbefore arccercle(pointarc(tete,180),pointarc(tete,270),center tete);
+  trace menton cutafter arccercle(pointarc(corps,110),pointarc(corps,180),center corps);
+  trace menton cutbefore arccercle(pointarc(corps,0),pointarc(corps,70),center corps);
+  trace ((center tete--center Etiquette) cutbefore (pointarc(tete,330){dir-170}..{dir170}pointarc(tete,210)) cutafter Etiquette) withpen pensquare scaled 1.5;
+  trace ((center tete--center Etiquette) cutbefore (pointarc(tete,330){dir-170}..{dir170}pointarc(tete,210)) cutafter Etiquette) withpen pensquare scaled 1.05 withcolor white;
+  path bonnet;
+  bonnet=pointarc(tete,10)--(xpart(pointarc(tete,10)),ypart(pointarc(tete,30)))--pointarc(tete,30)--arccercle(pointarc(tete,30),pointarc(tete,150),center tete)--(xpart(pointarc(tete,170)),ypart(pointarc(tete,150)))--pointarc(tete,170)--cycle;
+  fill bonnet withcolor 0.5[white,ColBonnet];
+  trace (xpart(pointarc(tete,10)),ypart(pointarc(tete,30)))--(xpart(pointarc(tete,170)),ypart(pointarc(tete,150)));
+  trace bonnet;
+);
+%%%%%%%%%%%%%%%%%%%%%%%
+skin10=image(
+  fill corps withcolor ColCorps;
+  trace corps;
+  shirthigh:=pointarc(corps,75){dir-150}..{dir150}pointarc(corps,105);
+  shirt:=shirthigh..arccercle(pointarc(corps,105),pointarc(corps,75),center corps)--cycle;
+  fill shirt withcolor ColShirt;
+  trace shirt;
+  path fermeture;
+  fermeture=pointarc(corps,120)--(xpart(pointarc(corps,120)),ypart(center corps));
+  trace fermeture;
+  for k=1 step 2 until 9:
+  fill cercles((point(0.1*k*length fermeture) of fermeture) shifted(u*(0.05,0)),0.025u) withcolor ColBouton;
+  endfor;
+  path poche;
+  poche=(center corps+u*(0.25,0.2))..(center corps+u*(0.45,0.2)){dir60}..(center corps+u*(0.5,0.45))--(center corps+u*(0.2,0.45))..{dir-60}cycle;
+  trace poche;
+  trace (center corps+u*(0.5,0.425))--(center corps+u*(0.5,0.425));
+fill tete withcolor ColCorps;
+trace tete;
+if typehair<nbhair+1:
+fill hair[typehair] withcolor ColCheveu;
+trace hair[typehair];
+fi;
+);


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCPeople.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/metapost/profcollege/PfCScrabble.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCScrabble.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCScrabble.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,343 @@
+primarydef p ! k=((100-k)/100)[p,white] enddef;
+
+def Place expr o =
+  if path o: draw o else: draw o fi
+enddef;
+
+string AlphabetComplet;
+AlphabetComplet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzàéèùç!?:()[],;.+-=*/ 0123456789";
+
+n:=0;
+
+for p_=1,3,3,2,1,4,2,4,1,8,10,1,1,1,1,3,8,1,1,1,1,4,10,10,10,10,1,3,3,2,1,4,2,4,1,8,10,1,1,1,1,3,8,1,1,1,1,4,10,10,10,10,1,1,1,1,3:
+  Points[n]=p_;
+  n:=n+1;
+endfor;
+
+color CouleurJeton;
+CouleurJeton=Yellow!40;
+
+Gap=0;
+
+boolean NonNumerote;
+NonNumerote=false;
+
+path JetonSC;
+JetonSC=((0.05[point(0) of unitsquare,point(1) of unitsquare])
+    --(0.95[point(0) of unitsquare,point(1) of unitsquare]){dir0}..{dir90}(0.05[point(1) of unitsquare,point(2) of unitsquare])
+    --(0.95[point(1) of unitsquare,point(2) of unitsquare]){dir90}..{dir180}(0.05[point(2) of unitsquare,point(3) of unitsquare])
+    --(0.95[point(2) of unitsquare,point(3) of unitsquare]){dir180}..{dir-90}(0.05[point(3) of unitsquare,point(4) of unitsquare])
+    --(0.95[point(3) of unitsquare,point(4) of unitsquare]){dir-90}..{dir0}cycle) scaled u;
+
+picture BaseDeformation,BaseDeformationa;
+BaseDeformation=image(label(TEX("M"),(0,0)));
+BaseDeformationa=image(label(TEX("\footnotesize 8"),(0,0)));
+coefmise=0.6*u*sqrt(2)/abs(urcorner BaseDeformation-llcorner BaseDeformation);
+coefmisea=0.15*u*sqrt(2)/abs(urcorner BaseDeformationa-llcorner BaseDeformationa);
+
+vardef DessineJeton(expr lettre,position)=
+  save $;
+  picture $;
+  picture ALettre,ANombre;
+  if position<57:
+    ALettre=image(
+	if lettre="à":
+	  label(TEX("\sffamily\bfseries A"),(0,0));
+	elseif lettre="é":
+	  label(TEX("\sffamily\bfseries E"),(0,0));
+	elseif lettre="è":
+	  label(TEX("\sffamily\bfseries E"),(0,0));
+	elseif lettre="ù":
+	  label(TEX("\sffamily\bfseries U"),(0,0));
+	elseif lettre="ç":
+	  label(TEX("\sffamily\bfseries C"),(0,0));
+	else:
+	  label(TEX("\sffamily\bfseries \MakeUppercase{"&lettre&"}"),(0,0));
+	fi;
+     );
+    ANombre=image(
+	label(TEX("\sffamily\bfseries\scriptsize "&decimal(Points[position])),(0,0));
+      );
+  elseif position<82:
+    ALettre=image(
+	if lettre="*":
+	  label(TEX("\sffamily\bfseries $\times$"),(0,0));
+	elseif lettre="+":
+	  label(TEX("\sffamily\bfseries$+$"),(0,0));
+	elseif lettre="-":
+	  label(TEX("\sffamily\bfseries$-$"),(0,0));
+	elseif lettre="=":
+	  label(TEX("\sffamily\bfseries$=$"),(0,0));
+	else:
+	  label(TEX("\sffamily\bfseries "&lettre),(0,0));
+	fi;
+      );
+  fi;
+  $=image(
+      fill JetonSC withcolor if print:0.8white else:CouleurJeton fi;
+    trace JetonSC;
+    if position<57:
+      trace (ALettre scaled (coefmise)) shifted center JetonSC;
+      if NonNumerote=false:trace (ANombre scaled (coefmisea)) shifted (lrcorner JetonSC+u*(-0.15,0.15)-center ANombre) fi;
+    elseif position<82:
+      trace (ALettre scaled (coefmise)) shifted center JetonSC;
+    fi;
+    );
+  $
+enddef;
+
+vardef DessineJetonRapide(expr position)=
+  save $;
+  picture $;
+  picture ALettre;
+  ALettre=image(%
+      label(TEX("\sffamily\bfseries "&substring(position,position+1) of AlphabetComplet),(0,0));
+    );
+  $=image(
+      fill JetonSC withcolor if print:0.8white else:CouleurJeton fi;
+    trace JetonSC;
+    trace (ALettre scaled (coefmise)) shifted center JetonSC;
+    );
+  $
+enddef;
+
+vardef Scrabble(expr mot)=
+  save $;
+  picture $;
+  string Lettre;
+  boolean Trouve;
+  Trouve=false;
+  $=image(
+    longmot:=mpliblength mot;
+    for k=0 upto longmot-1:
+      Lettre:=mplibsubstring(k,k+1) of mot;
+      pos:=-1;
+      forever: exitif Trouve;
+	pos:=pos+1;
+	if Lettre=mplibsubstring(pos,pos+1) of AlphabetComplet:
+	  Trouve:=true;
+	fi;
+     endfor;
+      if pos=81:
+	Trouve:=true;
+     else:
+	trace DessineJeton(Lettre,pos) shifted(k*(u*(1+Gap),0));
+	Trouve:=false;
+     fi;
+    endfor;
+    );
+  $
+enddef;
+
+vardef Scrabbleh(expr mot,casea,caseb)=
+  save $;
+  picture $;
+  string Lettre;
+  boolean Trouve;
+
+  Trouve=false;
+  $=image(
+      longmot:=length mot;
+    if Restreint:
+      Casea:=casea-Ligne;
+      Caseb:=caseb-Colonne;
+    else:
+      Casea:=casea;
+      Caseb:=caseb;
+    fi;
+    for k=0 upto longmot-1:
+      Lettre:=substring(k,k+1) of mot;
+      pos:=-1;
+      forever: exitif Trouve;
+	pos:=pos+1;
+	if Lettre=substring(pos,pos+1) of AlphabetComplet:
+	  Trouve:=true;
+	fi;
+      endfor;
+      trace DessineJeton(Lettre,pos) shifted(k*(u*(1+Gap),0)+(center Case[Casea+Ligne][Caseb+Colonne]-u*(0.5,0.5)));
+      Trouve:=false;
+    endfor;
+    );
+  $
+enddef;
+
+vardef Scrabblev(expr mot,casea,caseb)=
+  save $;
+  picture $;
+  string Lettre;
+  boolean Trouve;
+  Trouve=false;
+  $=image(
+      longmot:=length mot;
+        if Restreint:
+      Casea:=casea-Ligne;
+      Caseb:=caseb-Colonne;
+    else:
+      Casea:=casea;
+      Caseb:=caseb;
+    fi;
+    for k=0 upto longmot-1:
+      Lettre:=substring(k,k+1) of mot;
+      pos:=-1;
+      forever: exitif Trouve;
+	pos:=pos+1;
+	if Lettre=substring(pos,pos+1) of AlphabetComplet:
+	  Trouve:=true;
+	fi;
+      endfor;
+      trace DessineJeton(Lettre,pos) shifted(k*(0,-u*(1+Gap))+(center Case[Casea+Ligne][Caseb+Colonne]-u*(0.5,0.5)));
+      Trouve:=false;
+    endfor;
+    );
+  $
+enddef;
+  
+vardef Melange(expr total)=
+  numeric a[],b[];
+  for k=1 upto total:
+    a[k]=k;
+  endfor;
+  for k=total downto 1:
+    ll:=ceiling(uniformdeviate(k));
+    b[total-k+1]=a[ll];
+    for p=ll+1 upto k:
+      a[p-1]:=a[p];
+    endfor;
+  endfor;
+enddef;
+  
+vardef Tirage(expr mot)=
+  save $;
+  picture $;
+  string Lettre;
+  boolean Trouve;
+  Trouve=false;
+  $=image(
+      longmot:=length mot;
+    Melange(longmot);
+    for k=0 upto longmot-1:
+      Lettre:=substring(b[k+1]-1,b[k+1]) of mot;
+      pos:=-1;
+      forever: exitif Trouve;
+	pos:=pos+1;
+	if Lettre=substring(pos,pos+1) of AlphabetComplet:
+	  Trouve:=true;
+	fi;
+     endfor;
+      trace DessineJeton(Lettre,pos) shifted(k*(u*(1+Gap),0));
+      Trouve:=false;
+    endfor;
+    );
+  $
+enddef;
+
+path BaseCase,BaseCaseL;
+BaseCase=unitsquare scaled u;
+BaseCaseL=unitsquare scaled 0.9u;
+
+color CouleurMarque[];
+CouleurMarque[6]=red!40;
+CouleurMarque[4]=Pink!40;
+CouleurMarque[3]=blue!40;
+CouleurMarque[2]=LightSteelBlue!40;
+CouleurMarque[0]=LightGreen;
+
+vardef CaseSc(expr aa)=
+  save $;
+  picture $;
+  $=image(
+      fill BaseCase shifted (aa-(center BaseCase)) withcolor if print:0.95white else: LightGreen fi;
+    trace BaseCase shifted (aa-(center BaseCase)) withcolor if print:black else: Green!50 fi;
+    );
+  $
+enddef;
+
+picture TexteScore[];
+TexteScore[6]=image(label(TEX("\begin{tabular}{c}Mot\\Triple\end{tabular}"),(0,0)););
+TexteScore[4]=image(label(TEX("\begin{tabular}{c}Mot\\Double\end{tabular}"),(0,0)););
+TexteScore[3]=image(label(TEX("\begin{tabular}{c}Lettre\\Triple\end{tabular}"),(0,0)););
+TexteScore[2]=image(label(TEX("\begin{tabular}{c}Lettre\\Double\end{tabular}"),(0,0)););
+
+vardef MarqueSc(expr bb,aa)=
+  save $;
+  picture $;
+  $=image(
+      fill rotation(BaseCaseL,center BaseCaseL,45) shifted (aa-(center BaseCaseL)) withcolor if print:0.8white else: CouleurMarque[bb] fi;
+    trace rotation(BaseCaseL,center BaseCaseL,45) shifted (aa-(center BaseCaseL)) ;
+    fill BaseCase shifted (aa-(center BaseCase)) withcolor if print:(1-bb/16)*white else:CouleurMarque[bb] fi;
+    trace BaseCase shifted (aa-(center BaseCase));
+    if bb>0:
+      trace (TexteScore[bb] scaled (0.3coefmise)) shifted aa;
+    fi;
+    );
+  $
+enddef;
+
+vardef Grille(text t)=
+  save $;
+  picture $;
+  picture Case[][],Marque[][];
+  $=image(
+      NumCase:=0;
+    for p_=t:
+      Case[1+(NumCase div 8)][1+(NumCase mod 8)]:=CaseSc((u*(NumCase mod 8),-u*(NumCase div 8)));
+      trace Case[1+(NumCase div 8)][1+(NumCase mod 8)];
+      NumCase:=NumCase+1;
+    endfor;
+    NumCase:=0;
+    for p_=t:
+      if p_>0:
+      Marque[1+(NumCase div 8)][1+(NumCase mod 8)]:=MarqueSc(p_,(u*(NumCase mod 8),-u*(NumCase div 8)));
+	trace Marque[1+(NumCase div 8)][1+(NumCase mod 8)];
+      else:
+	Marque[1+(NumCase div 8)][1+(NumCase mod 8)]:=nullpicture;
+      fi;
+      NumCase:=NumCase+1;
+    endfor;
+    );
+  $
+enddef;
+
+vardef GrilleCompleteMP(text t)=
+  save $;
+  picture $;
+  picture Case[][],Marque[][];
+  $=image(
+      NumCase:=0;
+    for p_=t:
+      Case[1+(NumCase div 15)][1+(NumCase mod 15)]:=CaseSc((u*(NumCase mod 15),-u*(NumCase div 15)));
+      trace Case[1+(NumCase div 15)][1+(NumCase mod 15)];
+      NumCase:=NumCase+1;
+    endfor;
+    NumCase:=0;
+    for p_=t:
+      if p_>0:
+      Marque[1+(NumCase div 15)][1+(NumCase mod 15)]:=MarqueSc(p_,(u*(NumCase mod 15),-u*(NumCase div 15)));
+	trace Marque[1+(NumCase div 15)][1+(NumCase mod 15)];
+      else:
+	Marque[1+(NumCase div 15)][1+(NumCase mod 15)]:=nullpicture;
+      fi;
+      NumCase:=NumCase+1;
+    endfor;
+    );
+  $
+enddef;
+
+picture GrilleComplete;
+GrilleComplete=GrilleCompleteMP(%
+    6,0,0,2,0,0,0,6,0,0,0,2,0,0,6,%
+    0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,%
+    0,0,4,0,0,0,2,0,2,0,0,0,4,0,0,%
+    2,0,0,4,0,0,0,2,0,0,0,4,0,0,2,%
+    0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,%
+    0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,%
+    0,0,2,0,0,0,2,0,2,0,0,0,2,0,0,%
+    6,0,0,2,0,0,0,4,0,0,0,2,0,0,6,
+    0,0,2,0,0,0,2,0,2,0,0,0,2,0,0,%
+    0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,%
+    0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,%
+    2,0,0,4,0,0,0,2,0,0,0,4,0,0,2,%
+    0,0,4,0,0,0,2,0,2,0,0,0,4,0,0,%
+    0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,%
+    6,0,0,2,0,0,0,6,0,0,0,2,0,0,6%
+    );


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCScrabble.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp	2025-08-27 20:13:06 UTC (rev 76163)
@@ -103,34 +103,34 @@
 lum:=1;
 
 %Coordonn\xE9es dans le rep\xE8re Oeil
-vardef GCoord(expr NN)=
-  (-Xpart(NN)*Aux1+Ypart(NN)*Aux3,-Xpart(NN)*Aux5-Ypart(NN)*Aux6+Zpart(NN)*Aux4,-Xpart(NN)*Aux7-Ypart(NN)*Aux8-Zpart(NN)*Aux2+Rho)
+vardef GCoord(expr N)=
+  (-Xpart(N)*Aux1+Ypart(N)*Aux3,-Xpart(N)*Aux5-Ypart(N)*Aux6+Zpart(N)*Aux4,-Xpart(N)*Aux7-Ypart(N)*Aux8-Zpart(N)*Aux2+Rho)
 enddef;
 
-vardef GCoordcabinet(expr NN)=
-  (-(Xpart(NN)*sind(30)*0.5)*Aux1+Ypart(NN)*cosd(30)*Aux3,-(Xpart(NN)*cosd(30)*0.5)*Aux5-Ypart(NN)*Aux6+Zpart(NN)*Aux4,-Xpart(NN)*Aux7-Ypart(NN)*Aux8-Zpart(NN)*Aux2+Rho)
+vardef GCoordcabinet(expr N)=
+  (-(Xpart(N)*sind(30)*0.5)*Aux1+Ypart(N)*cosd(30)*Aux3,-(Xpart(N)*cosd(30)*0.5)*Aux5-Ypart(N)*Aux6+Zpart(N)*Aux4,-Xpart(N)*Aux7-Ypart(N)*Aux8-Zpart(N)*Aux2+Rho)
 enddef;
 
 unit:=1;%pour les mises \xE0 l'\xE9chelle :) Merci pst-solides3d
 
-vardef Projette(expr MM)=
+vardef Projette(expr M)=
   if typerepre="proj":
-    ((Xpart(GCoord(MM)),Ypart(GCoord(MM)))/Zpart(GCoord(MM)))*DE*10%
+    ((Xpart(GCoord(M)),Ypart(GCoord(M)))/Zpart(GCoord(M)))*DE*10%
   elseif typerepre="persp":
-    (Xpart(GCoord(MM)),Ypart(GCoord(MM)))*unit*DE
+    (Xpart(GCoord(M)),Ypart(GCoord(M)))*unit*DE
   elseif typerepre="cabinet":
-%    (0.5*cosd(30)*Xpart(GCoord(MM)),0.75*sind(30)*Ypart(GCoord(MM)))*unit*DE
-%    (Xpart(MM)+0.5*cosd(30)*Zpart(MM),Ypart(MM)+0.5*sind(30)*Zpart(MM))*20
-%    (Xpart(MM)+0.5*cosd(30)*Ypart(MM),Zpart(MM)+0.5*sind(30)*Ypart(MM))*20
-%    (Ypart(MM)+0.5*cosd(30)*Xpart(MM),Zpart(MM)+0.5*sind(30)*Xpart(MM))*20%Good avec Theta=-20/Phi=-10
-    %(Ypart(GCoord(MM))+0.5*cosd(-30)*Xpart(GCoord(MM)),Zpart(GCoord(MM))+0.5*sind(-30)*Xpart(GCoord(MM)))*20%Good avec Theta=-20/Phi=-10
-%    (Xpart(GCoord(MM))*cosd(90-30),Ypart(GCoord(MM))*sind(90-30)*0.5)*DE%\xE0 garder peut-\xEAtre ?
-%    (Xpart(GCoordcabinet(MM)),Ypart(GCoordcabinet(MM)))*DE%<-last good :)
-    ((Xpart(GCoordcabinet(MM)),Ypart(GCoordcabinet(MM)))/Zpart(GCoordcabinet(MM)))*DE
-    %(Zpart(GCoord(MM))+0.5*cosd(-30)*Ypart(GCoord(MM)),Xpart(GCoord(MM))+0.5*sind(-30)*Ypart(GCoord(MM)))*20
-%    (0.5*cosd(45)*Xpart(GCoord(MM)),0.5*sind(45)*Ypart(GCoord(MM)))*unit*DE
-%    (Xpart(GCoord(MM)),Ypart(GCoord(MM)))*unit*DE
-    %(Xpart(GCoord(MM)),Ypart(GCoord(MM)))*10
+%    (0.5*cosd(30)*Xpart(GCoord(M)),0.75*sind(30)*Ypart(GCoord(M)))*unit*DE
+%    (Xpart(M)+0.5*cosd(30)*Zpart(M),Ypart(M)+0.5*sind(30)*Zpart(M))*20
+%    (Xpart(M)+0.5*cosd(30)*Ypart(M),Zpart(M)+0.5*sind(30)*Ypart(M))*20
+%    (Ypart(M)+0.5*cosd(30)*Xpart(M),Zpart(M)+0.5*sind(30)*Xpart(M))*20%Good avec Theta=-20/Phi=-10
+    %(Ypart(GCoord(M))+0.5*cosd(-30)*Xpart(GCoord(M)),Zpart(GCoord(M))+0.5*sind(-30)*Xpart(GCoord(M)))*20%Good avec Theta=-20/Phi=-10
+%    (Xpart(GCoord(M))*cosd(90-30),Ypart(GCoord(M))*sind(90-30)*0.5)*DE%\xE0 garder peut-\xEAtre ?
+%    (Xpart(GCoordcabinet(M)),Ypart(GCoordcabinet(M)))*DE%<-last good :)
+    ((Xpart(GCoordcabinet(M)),Ypart(GCoordcabinet(M)))/Zpart(GCoordcabinet(M)))*DE
+    %(Zpart(GCoord(M))+0.5*cosd(-30)*Ypart(GCoord(M)),Xpart(GCoord(M))+0.5*sind(-30)*Ypart(GCoord(M)))*20
+%    (0.5*cosd(45)*Xpart(GCoord(M)),0.5*sind(45)*Ypart(GCoord(M)))*unit*DE
+%    (Xpart(GCoord(M)),Ypart(GCoord(M)))*unit*DE
+    %(Xpart(GCoord(M)),Ypart(GCoord(M)))*10
   fi
 enddef;
 

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCAireSimple.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCAireSimple.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCAireSimple.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -31,19 +31,19 @@
           for l=1 upto LargQuad:
             if Impossible[k][l]=true:
               if Impossible[k-1][l]=false:
-                draw subpath(0,1) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 1.25;
+                draw subpath(0,1) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 2;
                 peri:=peri+1;
               fi;
               if Impossible[k][l-1]=false:
-                draw subpath(3,4) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 1.25;
+                draw subpath(3,4) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 2;
                 peri:=peri+1;
               fi;
               if Impossible[k+1][l]=false:
-                draw subpath(2,3) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 1.25;
+                draw subpath(2,3) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 2;
                 peri:=peri+1;
               fi;
               if Impossible[k][l+1]=false:
-                draw subpath(1,2) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 1.25;
+                draw subpath(1,2) of (BriqueBase shifted (PasQuad*(l-1,k-1))) withpen pencircle scaled 2;
                 peri:=peri+1;
               fi;
             fi;  
@@ -152,7 +152,7 @@
       color CouleurAire;%
       CouleurAire=\useKV[ClesAireSimple]{CouleurAire};
       %
-      boolean Trou,Triangle,AireTriangle,Graines,SIS;
+      boolean Trou,Triangle,AireTriangle,Graines,SIS,SansAire,SansLongueur;
       SIS=\useKV[ClesAireSimple]{SIS};
       Graines=\useKV[ClesAireSimple]{Graines};
       if Graines:
@@ -159,6 +159,8 @@
         randomseed:=\useKV[ClesAireSimple]{Graine};
       fi;
       Trou=\useKV[ClesAireSimple]{Trou};
+      SansAire=\useKV[ClesAireSimple]{SansAire};
+      SansLongueur=\useKV[ClesAireSimple]{SansLongueur};
       Triangle=\useKV[ClesAireSimple]{Triangle};
       AireTriangle=\useKV[ClesAireSimple]{AireTriangle};
       HautQuad=\useKV[ClesAireSimple]{HautQuad};
@@ -244,6 +246,7 @@
         fi;
         drawoptions();
         if Trou=false:
+          if SansLongueur=false:
           trace segment(B+PasQuad*(0,1),B+PasQuad*(1,1));
           marque_s:=marque_s/3;
           trace marquesegment(B+PasQuad*(0,1),B+PasQuad*(1,1));
@@ -251,20 +254,23 @@
             label.top(TEX("\useKV[ClesAireSimple]{SIl}"),B+PasQuad*(0.5,1));
           else:
             label.bot(TEX("1 u.$\ell$."),B+PasQuad*(0.5,1));
+            fi;
+            fi;
+        fi;
+        if SansAire=false:
+          if AireTriangle:
+            fill polygone(B+PasQuad*(0,2),B+PasQuad*(1,2),B+PasQuad*(0,3)) withcolor PfCdblue;
+            trace polygone(B+PasQuad*(0,2),B+PasQuad*(1,2),B+PasQuad*(0,3));
+          else:
+            fill polygone(B+PasQuad*(0,2),B+PasQuad*(#3,2),B+PasQuad*(#3,2+#4),B+PasQuad*(0,2+#4)) withcolor PfCdblue;
+            trace polygone(B+PasQuad*(0,2),B+PasQuad*(#3,2),B+PasQuad*(#3,2+#4),B+PasQuad*(0,2+#4));
           fi;
-        fi;
-        if AireTriangle:
-          fill polygone(B+PasQuad*(0,2),B+PasQuad*(1,2),B+PasQuad*(0,3)) withcolor PfCdblue;
-          trace polygone(B+PasQuad*(0,2),B+PasQuad*(1,2),B+PasQuad*(0,3));
-        else:
-          fill polygone(B+PasQuad*(0,2),B+PasQuad*(#3,2),B+PasQuad*(#3,2+#4),B+PasQuad*(0,2+#4)) withcolor PfCdblue;
-          trace polygone(B+PasQuad*(0,2),B+PasQuad*(#3,2),B+PasQuad*(#3,2+#4),B+PasQuad*(0,2+#4));
-        fi;
-        if SIS:
-          label.top(TEX("\useKV[ClesAireSimple]{SI}"),B+PasQuad*(0.5*#3,2+#4));
-        else:
-          label.top(TEX("1 u.a."),B+PasQuad*(0.5*#3,2+#4));
-        fi;
+          if SIS:
+            label.top(TEX("\useKV[ClesAireSimple]{SI}"),B+PasQuad*(0.5*#3,2+#4));
+          else:
+             label.top(TEX("1 u.a."),B+PasQuad*(0.5*#3,2+#4));
+         fi;
+       fi;
         trace Toto;
         RetrouvePolygone;
         if Trou=false:
@@ -426,9 +432,11 @@
       color CouleurAire;%,CouleurUniteAire;
       CouleurAire=\useKV[ClesAireSimple]{CouleurAire};
       %
-      boolean Trou,Triangle,AireTriangle,Graines,SIS;
+      boolean Trou,Triangle,AireTriangle,Graines,SIS,SansAire,SansLongueur;
       SIS=\useKV[ClesAireSimple]{SIS};
       Graines=\useKV[ClesAireSimple]{Graines};
+      SansAire=\useKV[ClesAireSimple]{SansAire};
+      SansLongueur=\useKV[ClesAireSimple]{SansLongueur};
       if Graines:
         randomseed:=\useKV[ClesAireSimple]{Graine};
       fi;
@@ -516,6 +524,7 @@
         fi;
         drawoptions();
         if Trou=false:
+         if SansLongueur=false:
           trace segment(B+PasQuady*(0,1),B+(PasQuadx,PasQuady));
           trace segment(B+(PasQuadx,2*PasQuady),B+(PasQuadx,PasQuady));
           marque_s:=marque_s/3;
@@ -526,8 +535,10 @@
           else:
            label.bot(TEX("1 u.$\ell$."),B+(PasQuadx*0.5,PasQuady));
            label.rt(TEX("1 u.$v$."),B+(PasQuadx,PasQuady*1.5));
-          fi;
+           fi;
+         fi;
         fi;
+        if SansAire=false:  
         if AireTriangle:
           fill polygone(B+PasQuady*(0,3),B+(PasQuadx,3*PasQuady),B+PasQuady*(0,4)) withcolor PfCdblue;
           trace polygone(B+PasQuady*(0,3),B+(PasQuadx,3*PasQuady),B+PasQuady*(0,4));
@@ -540,6 +551,7 @@
         else:
           label.top(TEX("1 u.a."),B+(PasQuadx*0.5*#3,PasQuady*(3+#4)));
         fi;
+        fi;  
         RetrouvePolygone;
         if Trou=false:
           write decimal(periu) to "PfCPerimetre.tex";
@@ -564,45 +576,45 @@
             if (l mod 2)=0:
               if k=1:
                 periu:=periu+1;
-                trace subpath(0,1) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(0,1) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 2;
               fi;
               % même ligne, colonne avant
               if Impossible[k][l-1]=false:
                 periv:=periv+1;
-                trace subpath(2,3) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(2,3) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 2;
               fi;
               % même ligne, colonne après
               if Impossible[k][l+1]=false:
                 periu:=periu+1;
-                trace subpath(1,2) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(1,2) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 2;
               fi;
               % ligne précédente, colonne précédente
               if Impossible[k-1][l-1]=false:
                 periu:=periu+1;
-                trace subpath(0,1) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 1.1;      
+                trace subpath(0,1) of (Case2 shifted(5mm*(l div 2,k))) withpen pencircle scaled 2;      
               fi;
             else:
               if l=1:
                 periu:=periu+1;
-                trace subpath(2,3) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(2,3) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 2;
               fi;
               if k=HautQuad:
                 periu:=periu+1;
-                trace subpath(1,2) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(1,2) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 2;
               fi;
               if Impossible[k][l-1]=false:
                 periu:=periu+1;
-                trace subpath(2,3) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(2,3) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 2;
               fi;
               % même ligne, colonne après
               if Impossible[k][l+1]=false:
                 periv:=periv+1;
-                trace subpath(0,1) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 1.1;
+                trace subpath(0,1) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 2;
               fi;
               % ligne suivante, colonne suivante
               if Impossible[k+1][l+1]=false:
                 periu:=periu+1;
-                 trace subpath(1,2) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 1.1;
+                 trace subpath(1,2) of (Case1 shifted(5mm*((l+1) div 2,k))) withpen pencircle scaled 2;
                fi;
             fi;
           fi;
@@ -750,9 +762,11 @@
       color CouleurAire;
       CouleurAire=\useKV[ClesAireSimple]{CouleurAire};
       %
-      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS;
+      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS,SansAire,SansLongueur;
       SIS=\useKV[ClesAireSimple]{SIS};
       Graines=\useKV[ClesAireSimple]{Graines};
+      SansAire=\useKV[ClesAireSimple]{SansAire};
+      SansLongueur=\useKV[ClesAireSimple]{SansLongueur};
       if Graines:
       randomseed:=\useKV[ClesAireSimple]{Graine};
       fi;
@@ -838,6 +852,7 @@
           k:=k+1;
         endfor;
         drawoptions();
+        if SansAire=false:
         if AireCarre:
           fill polygone(B+5mm*(0,2),B+5mm*(#3,2),B+5mm*(#3,2+#4),B+5mm*(0,2+#4)) withcolor PfCdblue;
           trace polygone(B+5mm*(0,2),B+5mm*(#3,2),B+5mm*(#3,2+#4),B+5mm*(0,2+#4));
@@ -844,11 +859,17 @@
         else:
           fill polygone(B+5mm*(0,2),B+5mm*(1,2),B+5mm*(1,3)) withcolor PfCdblue;
           trace polygone(B+5mm*(0,2),B+5mm*(1,2),B+5mm*(1,3));
+          fi;
         fi;
         if SIS:
+          if SansAire=false:
           label.top(TEX("\useKV[ClesAireSimple]{SI}"),B+5mm*(0.5*#3,2+#4));
+          fi;
         else:
+          if SansAire=false:
           label.top(TEX("1 u.a."),B+5mm*(0.5*#3,2+#4));
+          fi;
+          if SansLongueur=false:
           trace segment(B+5mm*(0,1),B+5mm*(1,1));
           trace segment(B+5mm*(2,1),B+5mm*(3,2));
           marque_s:=marque_s/3;
@@ -856,6 +877,7 @@
           trace marquesegment(B+5mm*(2,1),B+5mm*(3,2));
           label.bot(TEX("1 u."),B+5mm*(0.5,1));
           label.ulft(TEX("1 v."),B+5mm*(2.5,1.5));
+          fi;
         fi;
         RetrouvePolygone;
         write decimal(periu) to "PfCPerimetre.tex";
@@ -889,7 +911,7 @@
                if Impossible[k-1][l]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                  periu:=periu+1;
-                 trace (subpath(0,1) of Case2) shifted(5mm*(l div 2,k));
+                 trace (subpath(0,1) of Case2) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                fi;
                %if Impossible[k+1][l]=false:
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
@@ -899,12 +921,12 @@
                if Impossible[k][l-1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                  periv:=periv+1;
-                 trace (subpath(2,3) of Case2) shifted(5mm*(l div 2,k));
+                 trace (subpath(2,3) of Case2) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                  periv:=periv+1;
-                 trace (subpath(1,2) of Case2) shifted(5mm*(l div 2,k));
+                 trace (subpath(1,2) of Case2) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                fi;
               else:
                 if Impossible[k-1][l]=false:
@@ -915,18 +937,18 @@
                if Impossible[k+1][l]=false:
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                  periu:=periu+1;
-                 trace (subpath(2,3) of Case1) shifted(5mm*(l div 2+0.5,k));
+                 trace (subpath(2,3) of Case1) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                  % rien à tracer car on est sur la pointe de Case2
                fi;
                if Impossible[k][l-1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
-                 trace (subpath(0,1) of Case1) shifted(5mm*(l div 2+0.5,k));
+                 trace (subpath(0,1) of Case1) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
-                 trace (subpath(1,2) of Case1) shifted(5mm*(l div 2+0.5,k));
+                 trace (subpath(1,2) of Case1) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                fi;
               fi;
             else:
@@ -939,23 +961,23 @@
                 if Impossible[k+1][l]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                   periu:=periu+1;
-                  trace (subpath(2,3) of Case1) shifted(5mm*(l div 2,k));
+                  trace (subpath(2,3) of Case1) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k][l-1]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
                   periv:=periv+1;
-                  trace (subpath(0,1) of Case1) shifted(5mm*(l div 2,k));
+                  trace (subpath(0,1) of Case1) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k][l+1]=false:
                   periv:=periv+1;
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
-                  trace (subpath(1,2) of Case1) shifted(5mm*(l div 2,k));
+                  trace (subpath(1,2) of Case1) shifted(5mm*(l div 2,k)) withpen pencircle scaled 2;
                 fi;
               else:
                 if Impossible[k-1][l]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+1,k));
                   periu:=periu+1;
-                   trace (subpath(0,1) of Case2) shifted(5mm*(l div 2+0.5,k));
+                   trace (subpath(0,1) of Case2) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k+1][l]=false:
                 %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+0.5,k));
@@ -965,12 +987,12 @@
                if Impossible[k][l-1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+1,k));
                  periv:=periv+1;
-                 trace (subpath(2,3) of Case2) shifted(5mm*(l div 2+0.5,k));
+                 trace (subpath(2,3) of Case2) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),5mm*(l div 2+1,k));
-                 trace (subpath(1,2) of Case2) shifted(5mm*(l div 2+0.5,k));
+                 trace (subpath(1,2) of Case2) shifted(5mm*(l div 2+0.5,k)) withpen pencircle scaled 2;
                fi;
               fi;
           % 
@@ -1178,9 +1200,11 @@
       color CouleurAire;
       CouleurAire=\useKV[ClesAireSimple]{CouleurAire};
       %
-      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS;
+      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS,SansAire,SansLongueur;
       SIS=\useKV[ClesAireSimple]{SIS};
       Graines=\useKV[ClesAireSimple]{Graines};
+      SansAire=\useKV[ClesAireSimple]{SansAire};
+      SansLongueur=\useKV[ClesAireSimple]{SansLongueur};
       if Graines:
       randomseed:=\useKV[ClesAireSimple]{Graine};
       fi;
@@ -1265,11 +1289,14 @@
       marque_s:=marque_s/3;
       if (colonnemax mod 2)=0:
         if (lignemax mod 2)=0:
+          if SansAire=false:
           fill Case2 shifted (5mm*((colonnemax div 2)+2,lignemax)) withcolor NavyBlue;
           trace Case2 shifted (5mm*((colonnemax div 2)+2,lignemax));
           labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),(center Case2) shifted (5mm*((colonnemax div 2)+2,lignemax)));
           labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace segment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4,lignemax)) withpen pencircle scaled 1.025;
           label.bot(TEX("$u$"),(2.5mm,0) shifted (5mm*((colonnemax div 2)+4,lignemax)));
@@ -1277,12 +1304,16 @@
           trace segment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+6,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+6,lignemax)) withpen pencircle scaled 1.025;
           label.lrt(TEX("$v$"),(1.25mm,2.5mm) shifted (5mm*((colonnemax div 2)+6,lignemax)));
+          fi;
         else:
+          if SansAire=false:
           fill Case1 shifted (5mm*((colonnemax div 2)+2,lignemax)) withcolor NavyBlue;
           trace Case1 shifted (5mm*((colonnemax div 2)+2,lignemax));
           labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),(center Case1) shifted (5mm*((colonnemax div 2)+2,lignemax)));
           labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace segment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+3.5,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+3.5,lignemax)) withpen pencircle scaled 1.025;
           label.bot(TEX("$u$"),(2.5mm,0) shifted (5mm*((colonnemax div 2)+3.5,lignemax)));
@@ -1290,14 +1321,18 @@
           trace segment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+5.5,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+5.5,lignemax)) withpen pencircle scaled 1.025;
           label.lrt(TEX("$v$"),(1.25mm,2.5mm) shifted (5mm*((colonnemax div 2)+5.5,lignemax)));
+          fi;
         fi;
       else:
         if (lignemax mod 2)=0:
+          if SansAire=false:
           fill Case1 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax)) withcolor NavyBlue;
           trace Case1 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax));
           labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),(center Case1) shifted (5mm*((colonnemax div 2)+2+0.5,lignemax)));
           labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace segment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4,lignemax)) withpen pencircle scaled 1.025;
           label.bot(TEX("$u$"),(2.5mm,0) shifted (5mm*((colonnemax div 2)+4,lignemax)));
@@ -1305,12 +1340,16 @@
           trace segment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+6,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+6,lignemax)) withpen pencircle scaled 1.025;
           label.lrt(TEX("$v$"),(1.25mm,2.5mm) shifted (5mm*((colonnemax div 2)+6,lignemax)));
+          fi;
         else:
-fill Case2 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax)) withcolor NavyBlue;
-trace Case2 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax));
+          if SansAire=false:
+          fill Case2 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax)) withcolor NavyBlue;
+          trace Case2 shifted (5mm*((colonnemax div 2)+2+0.5,lignemax));
           labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),(center Case2) shifted (5mm*((colonnemax div 2)+2+0.5,lignemax)));
           labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace segment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4+0.5,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(5mm,0)) shifted (5mm*((colonnemax div 2)+4+0.5,lignemax)) withpen pencircle scaled 1.025;
           label.bot(TEX("$u$"),(2.5mm,0) shifted (5mm*((colonnemax div 2)+4+0.5,lignemax)));
@@ -1318,6 +1357,7 @@
           trace segment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+4+2.5,lignemax)) withpen pencircle scaled 1.025;
           trace marquesegment((0,0),(2.5mm,5mm)) shifted (5mm*((colonnemax div 2)+4+2.5,lignemax)) withpen pencircle scaled 1.025;
           label.lrt(TEX("$v$"),(1.25mm,2.5mm) shifted (5mm*((colonnemax div 2)+4+2.5,lignemax)));
+          fi;
         fi;
         fi;
         );
@@ -1372,7 +1412,7 @@
                if Impossible[k-1][l]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                  periu:=periu+1;
-                 trace (subpath(0,1) of Case2) shifted(PasQuad*(l div 2,echelleequi*k));
+                 trace (subpath(0,1) of Case2) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                fi;
                %if Impossible[k+1][l]=false:
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
@@ -1382,12 +1422,12 @@
                if Impossible[k][l-1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                  periv:=periv+1;
-                 trace (subpath(2,3) of Case2) shifted(PasQuad*(l div 2,echelleequi*k));
+                 trace (subpath(2,3) of Case2) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                  periv:=periv+1;
-                 trace (subpath(1,2) of Case2) shifted(PasQuad*(l div 2,echelleequi*k));
+                 trace (subpath(1,2) of Case2) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                fi;
               else:
                 if Impossible[k-1][l]=false:
@@ -1398,18 +1438,18 @@
                if Impossible[k+1][l]=false:
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                  periu:=periu+1;
-                 trace (subpath(2,3) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                 trace (subpath(2,3) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                  % rien à tracer car on est sur la pointe de Case2
                fi;
                if Impossible[k][l-1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
-                 trace (subpath(0,1) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                 trace (subpath(0,1) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
-                 trace (subpath(1,2) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                 trace (subpath(1,2) of Case1) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                fi;
               fi;
             else:
@@ -1422,23 +1462,23 @@
                 if Impossible[k+1][l]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                   periu:=periu+1;
-                  trace (subpath(2,3) of Case1) shifted(PasQuad*(l div 2,echelleequi*k));
+                  trace (subpath(2,3) of Case1) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k][l-1]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
                   periv:=periv+1;
-                  trace (subpath(0,1) of Case1) shifted(PasQuad*(l div 2,echelleequi*k));
+                  trace (subpath(0,1) of Case1) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k][l+1]=false:
                   periv:=periv+1;
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
-                  trace (subpath(1,2) of Case1) shifted(PasQuad*(l div 2,echelleequi*k));
+                  trace (subpath(1,2) of Case1) shifted(PasQuad*(l div 2,echelleequi*k)) withpen pencircle scaled 2;
                 fi;
               else:
                 if Impossible[k-1][l]=false:
                   % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+1,k));
                   periu:=periu+1;
-                   trace (subpath(0,1) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                   trace (subpath(0,1) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                 fi;
                 if Impossible[k+1][l]=false:
                 %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+0.5,k));
@@ -1448,15 +1488,14 @@
                if Impossible[k][l-1]=false:
                  % label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+1,k));
                  periv:=periv+1;
-                 trace (subpath(2,3) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                 trace (subpath(2,3) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                fi;
                if Impossible[k][l+1]=false:
                  periv:=periv+1;
                  %label(TEX("\tiny"&decimal(k)&"--"&decimal(l)),PasQuad*(l div 2+1,k));
-                 trace (subpath(1,2) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k));
+                 trace (subpath(1,2) of Case2) shifted(PasQuad*(l div 2+0.5,echelleequi*k)) withpen pencircle scaled 2;
                fi;
               fi;
-          % 
             fi;
           fi;
         endfor;
@@ -1661,9 +1700,11 @@
       color CouleurAire;
       CouleurAire=\useKV[ClesAireSimple]{CouleurAire};
       %
-      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS;
+      boolean Trou,Triangle,AireTriangle,Graines,AireCarre,SIS,SansAire,SansLongueur;
       SIS=\useKV[ClesAireSimple]{SIS};
       Graines=\useKV[ClesAireSimple]{Graines};
+      SansAire=\useKV[ClesAireSimple]{SansAire};
+      SansLongueur=\useKV[ClesAireSimple]{SansLongueur};
       if Graines:
       randomseed:=\useKV[ClesAireSimple]{Graine};
       fi;
@@ -1747,51 +1788,67 @@
       marque_s:=marque_s/3;
       if (colonnemax mod 2)=0:
         if (lignemax mod 2)=0:
+          if SansAire=false:
           fill Case2 shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax)) withcolor NavyBlue;
           trace Case2 shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax));
           %labeloffset:=labeloffset*3;
-          label.top(TEX("1 u.a"),1/2[point(0) of Case2,point(1) of Case2] shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax)));
-          %labeloffset:=labeloffset/3;
+          label.bot(TEX("1 u.a"),1/2[point(0) of Case2,point(1) of Case2] shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax)));
+          % labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace Case2 shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax));
           marque_s:=marque_s/3;
           trace Codelongueur(point 0 of Case2,point 1 of Case2,point 1 of Case2,point 2 of Case2,point 2 of Case2,point 3 of Case2,2) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax));
           marque_s:=marque_s*3;
-          label.bot(TEX("$u$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax)));
+          label.bot(TEX("u.$\ell$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax)));
+          fi;
         else:
+          if SansAire=false:
           fill Case1 shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax)) withcolor NavyBlue;
           trace Case1 shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax));
           %labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),1/2[point(2) of Case1,point(0) of Case1] shifted (PasQuad*((colonnemax div 2)+2,echelleequi*lignemax)));
-          %labeloffset:=labeloffset/3;
+          % labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace Case2 shifted (PasQuad*((colonnemax div 2)+3.5,echelleequi*lignemax));
           marque_s:=marque_s/3;
           trace Codelongueur(point 0 of Case2,point 1 of Case2,point 1 of Case2,point 2 of Case2,point 2 of Case2,point 3 of Case2,2) shifted (PasQuad*((colonnemax div 2)+3.5,echelleequi*lignemax));
           marque_s:=marque_s*3;
-          label.bot(TEX("$u$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+3.5,echelleequi*lignemax)));
+          label.bot(TEX("u.$\ell$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+3.5,echelleequi*lignemax)));
+          fi;
         fi;
       else:
         if (lignemax mod 2)=0:
+          if SansAire=false:
           fill Case1 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)) withcolor NavyBlue;
           trace Case1 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax));
 %          labeloffset:=labeloffset*3;
           label.top(TEX("1 u.a"),1/2[point(0) of Case1,point(2) of Case1] shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)));
-%          labeloffset:=labeloffset/3;
+          % labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace Case2 shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax));
           marque_s:=marque_s/3;
           trace Codelongueur(point 0 of Case2,point 1 of Case2,point 1 of Case2,point 2 of Case2,point 2 of Case2,point 3 of Case2,2) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax));
           marque_s:=marque_s*3;
-          label.bot(TEX("$u$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax)));
+          label.bot(TEX("u.$\ell$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4,echelleequi*lignemax)));
+          fi;
         else:
-        fill Case2 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)) withcolor NavyBlue;
-        trace Case2 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax));
-          %labeloffset:=labeloffset*3;
-          label.top(TEX("1 u.a"),1/2[point(0) of Case2,point(1) of Case2] shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)));
-          %labeloffset:=labeloffset/3;
+          if SansAire=false:
+          fill Case2 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)) withcolor NavyBlue;
+          trace Case2 shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax));
+          % labeloffset:=labeloffset*3;
+          label.bot(TEX("1 u.a"),1/2[point(0) of Case2,point(1) of Case2] shifted (PasQuad*((colonnemax div 2)+2+0.5,echelleequi*lignemax)));
+          % labeloffset:=labeloffset/3;
+          fi;
+          if SansLongueur=false:
           trace Case2 shifted (PasQuad*((colonnemax div 2)+4.5,echelleequi*lignemax));
           marque_s:=marque_s/3;
           trace Codelongueur(point 0 of Case2,point 1 of Case2,point 1 of Case2,point 2 of Case2,point 2 of Case2,point 3 of Case2,2) shifted (PasQuad*((colonnemax div 2)+4.5,echelleequi*lignemax));
           marque_s:=marque_s*3;
-          label.bot(TEX("$u$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4+0.5,echelleequi*lignemax)));
+          label.bot(TEX("u.$\ell$"),(0.5*PasQuad,0) shifted (PasQuad*((colonnemax div 2)+4+0.5,echelleequi*lignemax)));
+          fi;
         fi;
         fi;
         );
@@ -1817,7 +1874,7 @@
   \fi
 }%
 
-\setKVdefault[ClesAireSimple]{Trou=false,UniteAire=1x1,HautQuad=15,LargQuad=15,CouleurAire=LightSteelBlue,SansLegende=false,PasQuad=5mm,Tentatives=10,Triangle=false,AireTriangle=false,PolyRec=false,PolyTri=false,PolyTriIso=false,PolyTriEqui=false,Graines=false,AireCarre=false,SIS=false,PasQuadx=8mm,PasQuady=6mm,Graine={},SI={},SIl={}}%
+\setKVdefault[ClesAireSimple]{Trou=false,UniteAire=1x1,HautQuad=15,LargQuad=15,CouleurAire=LightSteelBlue,SansLegende=false,SansAire=false,SansLongueur=false,PasQuad=5mm,Tentatives=10,Triangle=false,AireTriangle=false,PolyRec=false,PolyTri=false,PolyTriIso=false,PolyTriEqui=false,Graines=false,AireCarre=false,SIS=false,PasQuadx=8mm,PasQuady=6mm,Graine={},SI={},SIl={}}%
 \defKV[ClesAireSimple]{%
   Graine=\ifempty{#1}{}{\setKV[ClesAireSimple]{Graines}},%
   SI=\ifempty{#1}{}{\setKV[ClesAireSimple]{SIS}},%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCBalance.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCBalance.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCBalance.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -10,8 +10,7 @@
 \def\UpdatetoksPlateauGauche#1\nil{\addtotok\tokPlateauGauche{#1,}}%
 \def\UpdatetoksPlateauDroit#1\nil{\addtotok\tokPlateauDroit{#1,}}%
 %
-\setKVdefault[Balance]{Inf=false,Sup=false,Masse=false,Codes=false,Traces={}}%
-\defKV[Balance]{Traces=\ifempty{#1}{}{\setKV[Balance]{Codes}}}%
+\setKVdefault[Balance]{Inf=false,Sup=false,Masse=false,Codes=false,Traces={},Ecarth=0}%
 %
 \NewDocumentCommand\Balance{omm}{%
   \tokPlateauGauche{}%
@@ -35,11 +34,8 @@
   \ifluatex
     \mplibforcehmode
     \begin{mplibcode}
-      boolean Codes;
-      Codes=\useKV[Balance]{Codes};
-      if Codes:
-      \useKV[Balance]{Traces};
-      fi;
+      ecarth=\useKV[Balance]{Ecarth};
+      \ifemptyKV[Balance]{Traces}{}{\useKV[Balance]{Traces};}
       %
       vardef Poids=
       save poids;

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCBandeNumerique.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCBandeNumerique.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCBandeNumerique.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -18,7 +18,7 @@
 \NewDocumentCommand\BandeNumerique{o}{%
   \useKVdefault[BandeNum]%
   \setKV[BandeNum]{#1}%
-  \ifPfCPfMScratchDys\relax\setKV[BandeNum]{Dys}\fi
+  \ifPfCPfMScratchDys\relax\setKV[BandeNum]{Dys}\fi%
   \xdef\PfCBandeNumElementsAv{\useKV[BandeNum]{Elements}}%
   \setsepchar{,}\ignoreemptyitems%
   \readlist*\ListeBandeNumElmts{\PfCBandeNumElementsAv}%

Added: trunk/Master/texmf-dist/tex/latex/profcollege/PfCBoiteADix.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCBoiteADix.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCBoiteADix.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,92 @@
+%%%
+% Boite à dix
+%%%
+\def\filedateBoiteADix{2025/08/24}%
+\def\fileversionBoiteADix{0.1}%
+\message{-- \filedateBoiteADix\space v\fileversionBoiteADix}%
+%
+\makeatletter
+\setKVdefault[BoiteDix]{Couleur=black,CouleurComplement={},Echelle=0.5,Vertical=false}
+
+\NewDocumentCommand\BoiteADix{om}{%
+  \useKVdefault[BoiteDix]%
+  \setKV[BoiteDix]{#1}%
+  \ifx\bla#1\bla%
+    \PfM at BuildBoiteDix{0}%
+  \else
+    \PfM at BuildBoiteDix{#2}%
+  \fi
+}%
+
+\NewDocumentCommand\PfM at BuildBoiteDix{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      u:=\useKV[BoiteDix]{Echelle}*1cm;
+      %
+      path base,disqueh[],disquev[];
+      base=fullcircle scaled u;
+      %
+      color CouleurFond,CouleurComp;
+      CouleurFond=\useKV[BoiteDix]{Couleur};
+      \ifemptyKV[BoiteDix]{CouleurComplement}{CouleurComp=white}{CouleurComp=\useKV[BoiteDix]{CouleurComplement}};%
+      %
+      nb:=0;
+      for k=0 upto 1:
+        for l=0 upto 4:
+          nb:=nb+1;
+          disqueh[nb]=base shifted(1.2*u*(l,-k));
+          disquev[nb]=base shifted(1.2*u*(k,-l));
+        endfor;
+      endfor;
+      %      
+      vardef BoiteDixHorizontale(expr AA)=
+        save BDix;
+        picture BDix;
+        BDix=image(
+          for k=1 upto AA:
+            fill disqueh[k] withcolor CouleurFond;
+            trace disqueh[k];
+          endfor;
+          for k=AA+1 upto 10:
+            fill disqueh[k] withcolor CouleurComp;
+            trace disqueh[k];
+          endfor;
+          trace u*(-0.7,0.7)--u*(5.5,0.7)--u*(5.5,-1.9)--u*(-0.7,-1.9)--cycle;
+        );
+        BDix
+      enddef;
+      %
+      vardef BoiteDixVerticale(expr AA)=
+        save BDixV;
+        picture BDixV;
+        BDixV=image(
+          for k=1 upto AA:
+            fill disquev[k] withcolor CouleurFond;
+            trace disquev[k];
+          endfor;
+          for k=AA+1 upto 10:
+            fill disquev[k] withcolor CouleurComp;
+            trace disquev[k];
+          endfor;
+          trace u*(-0.7,0.7)--u*(1.9,0.7)--u*(1.9,-5.5)--u*(-0.7,-5.5)--cycle;
+        );
+        BDixV
+      enddef;
+      quotient:=#1 div 10;
+      reste:=#1 mod 10;
+      if \useKV[BoiteDix]{Vertical}:
+        for k=1 upto quotient:
+          trace BoiteDixVerticale(10) shifted (k*u*(2.8,0));
+        endfor;
+        trace BoiteDixVerticale(reste) shifted ((quotient+1)*u*(2.8,0));
+      else:
+        for k=1 upto quotient:
+          trace BoiteDixHorizontale(10) shifted (k*u*(0,-2.8));
+        endfor;
+        trace BoiteDixHorizontale(reste) shifted ((quotient+1)*u*(0,-2.8));
+      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+\makeatother
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/profcollege/PfCBoiteADix.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCCalculsFractions.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCCalculsFractions.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCCalculsFractions.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,8 +1,8 @@
 %%%
 % Calculs fractions
 %
-\def\filedateCalculsFractions{2025/05/26}%
-\def\fileversionCalculsFractions{0.1a}%
+\def\filedateCalculsFractions{2025/08/23}%
+\def\fileversionCalculsFractions{0.1b}%
 \message{-- \filedateCalculsFractions\space v\fileversionCalculsFractions}%
 %
 \setKVdefault[CalculsFractions]{Couleurs=false,Negatif=false,Seul=false,Couleur={}}%
@@ -73,10 +73,16 @@
   \xdef\PfCDeuxiemeMul{\fpeval{\ListeFractions[1,2]/\the\pgcd}}%
   \xdef\PfCAddNumFin{\fpeval{(\ListeFractions[1,1])*(\PfCPremierMul)\PfCFractionOp(\ListeFractions[2,1])*(\PfCDeuxiemeMul)}}%
   \xdef\PfCAddDenoFin{\fpeval{(\ListeFractions[1,2])*(\PfCPremierMul)}}%
-  \PGCD{\fpeval{abs(\PfCAddNumFin)}}{\fpeval{abs(\PfCAddDenoFin)}}\xdef\PfCAddPgcd{\the\pgcd}%
-  \xdef\PfCAddNumSimp{\fpeval{\PfCAddNumFin/\PfCAddPgcd}}%
-  \xdef\PfCAddDenoSimp{\fpeval{\PfCAddDenoFin/\PfCAddPgcd}}%
-  \xdef\PfCAddSumSimp{\PfCAddNumSimp/\PfCAddDenoSimp}%
+  \ifnum\PfCAddNumFin=0\relax
+    \xdef\PfCAddNumSimp{0}%
+    \xdef\PfCAddDenoSimp{\PfCAddDenoFin}%
+    \xdef\PfCAddSumSimp{0}%
+  \else%
+    \PGCD{\fpeval{abs(\PfCAddNumFin)}}{\fpeval{abs(\PfCAddDenoFin)}}\xdef\PfCAddPgcd{\the\pgcd}%
+    \xdef\PfCAddNumSimp{\fpeval{\PfCAddNumFin/\PfCAddPgcd}}%
+    \xdef\PfCAddDenoSimp{\fpeval{\PfCAddDenoFin/\PfCAddPgcd}}%
+    \xdef\PfCAddSumSimp{\PfCAddNumSimp/\PfCAddDenoSimp}%
+  \fi
   \IfValueT{#6}{\xdef#6{\PfCAddSumSimp}}%
   \ifboolKV[CalculsFractions]{Seul}{}{%
   % Partie affichage

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCCritere.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCCritere.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCCritere.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,132 +1,140 @@
 %%%
 % Criteres de divisibilite
 %%%
-\def\filedateCritere{2024/08/04}%
-\def\fileversionCritere{0.1}%
+\def\filedateCritere{2025/07/13}%
+\def\fileversionCritere{0.1a}%
 \message{-- \filedateCritere\space v\fileversionCritere}%
 %
 \setKVdefault[Critere]{Div=2,Remarque=false,All=false,RemarqueAll=false}
 
+\makeatletter
 \NewDocumentCommand\Critere{om}{%
   \useKVdefault[Critere]%
   \setKV[Critere]{#1}%
-  \xdef\PfCListeARetenirCriteres{}%
+  \edef\PfC at ListeARetenirCriteres{}%
   \ifboolKV[Critere]{All}{%
       \begin{itemize}
-      \item \CritereDeux{#2}%
-      \item \CritereTrois{#2}
-      \item \CritereQuatre{#2}
-      \item \CritereCinq{#2}
-      \item \CritereNeuf{#2}
-      \item \CritereDix{#2}
+      \item \PfC at CritereDeux{#2}%
+      \item \PfC at CritereTrois{#2}
+      \item \PfC at CritereQuatre{#2}
+      \item \PfC at CritereCinq{#2}
+      \item \PfC at CritereNeuf{#2}
+      \item \PfC at CritereDix{#2}
       \end{itemize}
-    \ifx\bla\PfCListeARetenirCriteres\bla%
+    \ifx\bla\PfC at ListeARetenirCriteres\bla%
     \else
       \setsepchar{,}\ignoreemptyitems%
-      \readlist*\PfCAfficheDivCriteres{\PfCListeARetenirCriteres}%
+      \readlist*\PfC at AfficheDivCriteres{\PfC at ListeARetenirCriteres}%
       \reademptyitems%
-      \xdef\PfCNumListe{}%
-      En appliquant les critères de divisibilité connus, \num{#2} est donc divisible par \num{\PfCAfficheDivCriteres[1]}%
-      \xintifboolexpr{\PfCAfficheDivCritereslen>1}{\xintFor* ##1 in{\xintSeq{2}{\PfCAfficheDivCritereslen}}\do{%
-          \xintifForLast{ et }{ ; }\num{\PfCAfficheDivCriteres[##1]}%
+      \edef\PfC at NumListe{}%
+      En appliquant les critères de divisibilité connus, \num{#2} est donc divisible par \num{\PfC at AfficheDivCriteres[1]}%
+      \xintifboolexpr{\PfC at AfficheDivCritereslen>1}{\xintFor* ##1 in{\xintSeq{2}{\PfC at AfficheDivCritereslen}}\do{%
+          \xintifForLast{ et }{ ; }\num{\PfC at AfficheDivCriteres[##1]}%
         }%
       }{}.%
       \ifboolKV[Critere]{RemarqueAll}{\\\textbf{Remarque} : La liste des diviseurs de \num{#2} est \ListeDiviseur{#2}.}{}%
     \fi%
   }{%
-    \IfStrEqCase{\useKV[Critere]{Div}}{%
-      {2}{\CritereDeux{#2}}%
-      {3}{\CritereTrois{#2}}%
-      {4}{\CritereQuatre{#2}}%
-      {5}{\CritereCinq{#2}}%
-      {9}{\CritereNeuf{#2}}%
-      {10}{\CritereDix{#2}}%
-    }%
+    \edef\PfC at ListeDesCriteresATesterAv{\useKV[Critere]{Div}}%
+    \setsepchar{,}\ignoreemptyitems%
+    \readlist*\PfC at ListeDesCriteresATester{\PfC at ListeDesCriteresATesterAv}%
+    \reademptyitems%
+    \foreachitem\PfC at DivTest\in\PfC at ListeDesCriteresATester{%
+      \IfStrEqCase{\PfC at DivTest}{%
+        {2}{\PfC at CritereDeux{#2}}%
+        {3}{\PfC at CritereTrois{#2}}%
+        {4}{\PfC at CritereQuatre{#2}}%
+        {5}{\PfC at CritereCinq{#2}}%
+        {9}{\PfC at CritereNeuf{#2}}%
+        {10}{\PfC at CritereDix{#2}}%
+      }\par%
+    }% 
   }%
 }%
 
-\NewDocumentCommand\CritereDeux{m}{%
-  \StrRight{#1}{1}[\PfCCriDeuxUnite]%
-  Le chiffre des unités de \num{#1} est \num{\PfCCriDeuxUnite}. Donc \num{#1} %
-  \modulo{\PfCCriDeuxUnite}{2}%
+\NewDocumentCommand\PfC at CritereDeux{m}{%
+  \StrRight{#1}{1}[\PfC at CriDeuxUnite]%
+  Le chiffre des unités de \num{#1} est \num{\PfC at CriDeuxUnite}. Donc \num{#1} %
+  \modulo{\PfC at CriDeuxUnite}{2}%
   \ifnum\remainder=0\relax%
   est divisible par 2.%
   \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/2}}\times2$.}{}%
-  \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,2}%
+  \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,2}%
   \else%
   n'est pas divisible par 2.%
   \fi%
 }%
 
-\NewDocumentCommand\CritereTrois{m}{%
+\NewDocumentCommand\PfC at CritereTrois{m}{%
   La somme des chiffres de \num{#1} est \PfCSommeChiffres{#1}. Comme \num{\PfCSMSomme} %
   \modulo{\PfCSMSomme}{3}%
   \ifnum\remainder=0\relax%
   est divisible par 3, alors \num{#1} est aussi divisible par 3.%
   \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/3}}\times3$.}{}%
-  \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,3}%
+  \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,3}%
   \else%
   n'est pas divisible par 3, alors \num{#1} n'est pas divisible par 3.%
   \fi%
 }%
 
-\NewDocumentCommand\CritereQuatre{m}{%
+\NewDocumentCommand\PfC at CritereQuatre{m}{%
   \ifnum#1<100%
     \quotient{#1}{4}%
     \modulo{#1}{4}%
     \ifnum\remainder=0\relax
       Comme $\num{#1}=\num{\the\intquotient}\times4$ alors \num{#1} est divisible par 4.
-      \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,4}%
+      \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,4}%
     \else
       Comme $\num{#1}=\num{\the\intquotient}\times4+\num{\the\remainder}$ alors \num{#1} n'est pas divisible par 4.
     \fi
   \else
-    \StrRight{#1}{2}[\PfCCriQuatreUnite]%
-    \num{#1} se termine par \num{\PfCCriQuatreUnite}. %
-    \modulo{\PfCCriQuatreUnite}{4}%
+    \StrRight{#1}{2}[\PfC at CriQuatreUnite]%
+    \num{#1} se termine par \num{\PfC at CriQuatreUnite}. %
+    \modulo{\PfC at CriQuatreUnite}{4}%
     \ifnum\remainder=0\relax%
-      Comme \num{\PfCCriQuatreUnite} est divisible par 4, alors \num{#1} est divisible par 4.%
+      Comme \num{\PfC at CriQuatreUnite} est divisible par 4, alors \num{#1} est divisible par 4.%
       \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/4}}\times4$.}{}%
-      \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,4}%
+      \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,4}%
     \else%
-      Comme \num{\PfCCriQuatreUnite} n'est pas divisible par 4, alors \num{#1} n'est pas divisible par 4.%
+      Comme \num{\PfC at CriQuatreUnite} n'est pas divisible par 4, alors \num{#1} n'est pas divisible par 4.%
     \fi%
  \fi
 }%
 
-\NewDocumentCommand\CritereCinq{m}{%
-  \StrRight{#1}{1}[\PfCCriCinqUnite]%
-  Le chiffre des unités de \num{#1} est \num{\PfCCriCinqUnite}. Donc \num{#1} %
-  \modulo{\PfCCriCinqUnite}{5}%
+\NewDocumentCommand\PfC at CritereCinq{m}{%
+  \StrRight{#1}{1}[\PfC at CriCinqUnite]%
+  Le chiffre des unités de \num{#1} est \num{\PfC at CriCinqUnite}. Donc \num{#1} %
+  \modulo{\PfC at CriCinqUnite}{5}%
   \ifnum\remainder=0\relax%
   est divisible par 5.%
   \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/5}}\times5$.}{}%
-    \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,5}%
+    \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,5}%
   \else%
   n'est pas divisible par 5.%
   \fi%
 }%
 
-\NewDocumentCommand\CritereNeuf{m}{%
+\NewDocumentCommand\PfC at CritereNeuf{m}{%
   La somme des chiffres de \num{#1} est \PfCSommeChiffres{#1}. Comme \num{\PfCSMSomme} %
   \modulo{\PfCSMSomme}{9}%
   \ifnum\remainder=0\relax%
   est divisible par 9, alors \num{#1} est aussi divisible par 9.%
   \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/9}}\times9$.}{}%
-  \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,9}%
+  \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,9}%
   \else%
   n'est pas divisible par 9, alors \num{#1} n'est pas divisible par 9.%
   \fi%
 }%
 
-\NewDocumentCommand\CritereDix{m}{%
-  \StrRight{#1}{1}[\PfCCriDixUnite]%
-  Le chiffre des unités de \num{#1} est \num{\PfCCriDixUnite}. Donc \num{#1} %
-  \ifnum\PfCCriDixUnite=0\relax
+\NewDocumentCommand\PfC at CritereDix{m}{%
+  \StrRight{#1}{1}[\PfC at CriDixUnite]%
+  Le chiffre des unités de \num{#1} est \num{\PfC at CriDixUnite}. Donc \num{#1} %
+  \ifnum\PfC at CriDixUnite=0\relax
   est divisible par 10.%
   \ifboolKV[Critere]{Remarque}{\\\textbf{Remarque} : $\num{#1}=\num{\fpeval{#1/10}}\times10$.}{}%
-  \xdef\PfCListeARetenirCriteres{\PfCListeARetenirCriteres,10}%
+  \edef\PfC at ListeARetenirCriteres{\PfC at ListeARetenirCriteres,10}%
   \else%
   n'est pas divisible par 10.%
   \fi%
-}%
\ No newline at end of file
+}%
+\makeatother
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCDefiTables.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCDefiTables.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCDefiTables.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -9,7 +9,9 @@
 \newcounter{PfCNbDefiTableRestore}%
 \setcounter{PfCNbDefiTable}{0}%
 
-\setKVdefault[DefiTable]{Solution=false,Math=false,LargeurT=5mm,Graines=false,Creation=false,ValeurMin=1,ValeurMax=10,Restreint=false,Stretch=1,Restores=false,Graine={},Restore={}}%
+\newlength{\PfCDefiTableLargTab}
+
+\setKVdefault[DefiTable]{Solution=false,Math=false,Largeur=1em,LargeurT=5mm,Graines=false,Creation=false,ValeurMin=1,ValeurMax=10,Restreint=false,Stretch=1,Restores=false,Graine={},Restore={}}%
 \defKV[DefiTable]{%
   Graine=\ifempty{#1}{}{\setKV[DefiTable]{Graines}},%
   Restore=\ifempty{#1}{}{\setKV[DefiTable]{Restores}}%
@@ -144,6 +146,7 @@
 }%
 
 \NewDocumentCommand\BuildTabDefiTable{m}{%
+  \setlength{\PfCDefiTableLargTab}{\useKV[DefiTable]{Largeur}}%
   \setcounter{PfCNbDefiTableRestore}{#1}%
   \ifcsname ListeFinaleDesCaracteresRetenusDansOrdre\Roman{PfCNbDefiTableRestore}\endcsname
     \xdef\PfCFooRetiens{\csname ListeFinaleDesCaracteresRetenusDansOrdre\Roman{PfCNbDefiTableRestore}\endcsname}%
@@ -150,7 +153,7 @@
     \setsepchar[*]{/}\ignoreemptyitems%
     \readlist*\ListeAAfficherOrdre{\PfCFooRetiens}%
     \reademptyitems%
-    \begin{tabular}{|>{\columncolor{gray!15}\rule[-1.375\tabcolsep]{0pt}{1em+2.125\tabcolsep}\centering\arraybackslash}m{1em}|*{10}{>{\rule[-1.375\tabcolsep]{0pt}{1em+2.125\tabcolsep}\centering\arraybackslash}m{1em}|}}
+    \begin{tabular}{|>{\columncolor{gray!15}\rule[-1.375\tabcolsep]{0pt}{\PfCDefiTableLargTab+2.125\tabcolsep}\centering\arraybackslash}m{\PfCDefiTableLargTab}|*{10}{>{\rule[-1.375\tabcolsep]{0pt}{\PfCDefiTableLargTab+2.125\tabcolsep}\centering\arraybackslash}m{\PfCDefiTableLargTab}|}}
       \hline
       \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{%
                                   \xintifForFirst{}{&}##1%
@@ -163,7 +166,7 @@
     \end{tabular}%
   \else
     \xdef\PfCFooSauvToutTab{}%
-    \begin{tabular}{|>{\columncolor{gray!15}\rule[-1.375\tabcolsep]{0pt}{1em+2.125\tabcolsep}\centering\arraybackslash}m{1em}|*{10}{>{\rule[-1.375\tabcolsep]{0pt}{1em+2.125\tabcolsep}\centering\arraybackslash}m{1em}|}}
+    \begin{tabular}{|>{\columncolor{gray!15}\rule[-1.375\tabcolsep]{0pt}{\PfCDefiTableLargTab+2.125\tabcolsep}\centering\arraybackslash}m{\PfCDefiTableLargTab}|*{10}{>{\rule[-1.375\tabcolsep]{0pt}{\PfCDefiTableLargTab+2.125\tabcolsep}\centering\arraybackslash}m{\PfCDefiTableLargTab}|}}
       \hline
       \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{%
                                   \xintifForFirst{}{&}##1%
@@ -292,7 +295,7 @@
     }{%
       \setsepchar[*]{§* }%
       \readlist*\ListeDefiTableCode{#2}%
-      \begin{NiceTabular}{>{\columncolor{gray!15}}{c}*{10}{c}}[hvlines,color-inside]
+      \begin{NiceTabular}{>{\columncolor{gray!15}}{c}*{10}{c}}[hvlines]%,color-inside]
         \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{%
           \xintifForFirst{}{&}##1}
         \\

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCDistributivite.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCDistributivite.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCDistributivite.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -17,22 +17,22 @@
     \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}
-}
+  \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}
-}
+  \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}
-}
+  \end{tikzpicture}%
+}%
 
 \newcounter{NbDistri}%
 \setcounter{NbDistri}{0}%
@@ -45,9 +45,9 @@
 \defKV[ClesDistributivite]{CouleurReduction=\ifempty{#1}{}{\colorlet{DCReduction}{#1}\setKV[ClesDistributivite]{Reduction}}}%
 %
 \newcommand\Tuile[4]{%
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
     boolean Vide,Reperes,Print;
     Vide=\useKV[ClesDistributivite]{Vide};
     Reperes=\useKV[ClesDistributivite]{Reperes};
@@ -262,8 +262,8 @@
     endfor;
     fi;
     fi;
-  \end{mplibcode}
-  \else
+  \end{mplibcode}%
+  \else%
   \begin{mpost}[mpsettings={boolean Vide,Print; Vide=\useKV[ClesDistributivite]{Vide}; Print=\useKV[ClesDistributivite]{Impression};}]
     pair _CoinTuilev;
     _CoinTuilev=(0,0);
@@ -431,8 +431,8 @@
     fi;
     fi;
   \end{mpost}
-  \fi
-}
+  \fi%
+}%
 
 \NewDocumentCommand\Affichage{sommm}{%
   \setKV[ClesDistributivite]{#2}%On lit les arguments optionnels
@@ -539,14 +539,14 @@
                   \num{\fpeval{#2+#3}}^2=(\num{#2}+\num{#3})^2=\num{#2}^2+2\times\num{#2}\times\num{#3}+\num{#3}^2=\num{\fpeval{#2*#2}}+\num{\fpeval{2*#2*#3}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)**2}}
                 }{%
                   \num{\fpeval{#2+#3}}^2=(\num{#2}\num{#3})^2=\num{#2}^2-2\times\num{#2}\times\num{\fpeval{-#3}}+\num{\fpeval{-#3}}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{2*#2*abs(#3)}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2-abs(#3))**2}}
-                }
-                \else
+                }%
+                \else%
                 \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}=(\num{#2}+\num{#3})\times(\num{#4}\num{#5})=\num{#2}^2-\num{#3}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)*(#2-#3)}}
                 \fi%
               }{%
               \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}}{}%
@@ -624,13 +624,17 @@
                   % Etape 1
                   \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
                     %cpt=\theNbCalculDistri%
-                    \xintifboolexpr{#2==0}{%
-                    }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
+                    \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
                     \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}\mathcolor{black}{}}{}%
-                    \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%
+                      %A
+                      \xintifboolexpr{#3>0}{
+                        \xintifboolexpr{#2==0}{}{+}
+                      }{
+                        \xintifboolexpr{#3<0}{\xintifboolexpr{#2==0}{{-}}{-}}{}
+                      }\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%B%
                     \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}\mathcolor{black}{}}{}%
-                    \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}%
-                    % 
+                      \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
                     % 
@@ -651,7 +655,7 @@
                         \DrawArrow%
                       }%
                     }{}\setcounter{NbDistri}{0}%
-                  }{}
+                  }{}%
                   % Etape 2
                   \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
                     %cpt=\theNbCalculDistri%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcrireunQCM.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcrireunQCM.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcrireunQCM.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -207,7 +207,7 @@
         \xdef\ListeNom{\useKV[ClesQCM]{Noms}}%
         \setsepchar[*]{/}%
         \readlist*\ListeNomsMul{\ListeNom}%
-        \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+        \begin{longtable}{|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{%
@@ -222,7 +222,7 @@
             }\\
           }%
           \hline%
-        \end{tabular}%
+        \end{longtable}%
         \renewcommand{\arraystretch}{1}%
       }{%
         \ifboolKV[ClesQCM]{VF}{%
@@ -230,7 +230,7 @@
           \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}%
           \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}%
           \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
-          \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+          \begin{longtable}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
             \cline{2-\NBcases}%
             \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\
             \hline%
@@ -241,7 +241,7 @@
               }\\
             }%
             \hline%
-          \end{tabular}
+          \end{longtable}
         }{%
           \ifboolKV[ClesQCM]{ACompleter}{%
             \xdef\PfCTotalCases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
@@ -250,7 +250,7 @@
           }%
           \setlength{\LargeurQCM}{\fpeval{(\linewidth-2*\tabcolsep-\PfCTotalCases*(2*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
           \xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}%
-          \begin{tabular}{|p{\LargeurQCM}|*{\PfCTotalCases}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+          \begin{longtable}{|p{\LargeurQCM}|*{\PfCTotalCases}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
             \ifboolKV[ClesQCM]{Titre}{%
               \cline{2-\fpeval{\PfCTotalCases+1}}%
               \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
@@ -265,7 +265,7 @@
                }\ifnum\fpeval{\PfCTotalCases-\useKV[ClesQCM]{Reponses}}>0\relax\uppercase{&}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{PfCCouleurAlterneQCM}\fi}{}\fi\\
             }%
             \hline%
-          \end{tabular}%
+          \end{longtable}%
         }%
       }%
       \renewcommand{\arraystretch}{1}%
@@ -321,7 +321,7 @@
           \xdef\ListeNom{\useKV[ClesQCM]{Noms}}%
           \setsepchar[*]{/}%
           \readlist*\ListeNomsMul{\ListeNom}%
-          \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+          \begin{longtable}{|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{%
@@ -336,7 +336,7 @@
               }\\
             }%
             \hline%
-          \end{tabular}%
+          \end{longtable}%
           \renewcommand{\arraystretch}{1}%
         }{%
           \ifboolKV[ClesQCM]{VF}{%
@@ -344,7 +344,7 @@
             \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}%
             \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}%
             \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
-            \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+            \begin{longtable}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
               \cline{2-\NBcases}%
               \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\
               \hline%
@@ -355,7 +355,7 @@
                 }\\
               }%
               \hline%
-            \end{tabular}
+            \end{longtable}
           }{%
             \ifboolKV[ClesQCM]{ACompleter}{%
               \xdef\PfCTotalCases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
@@ -364,7 +364,7 @@
             }%
             \setlength{\LargeurQCM}{\fpeval{(\linewidth-2*\tabcolsep-\PfCTotalCases*(2*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
             \xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}%
-            \begin{tabular}{|p{\LargeurQCM}|*{\PfCTotalCases}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
+            \begin{longtable}{|p{\LargeurQCM}|*{\PfCTotalCases}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}%
               \ifboolKV[ClesQCM]{Titre}{%
                 \cline{2-\fpeval{\PfCTotalCases+1}}%
                 \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{%
@@ -379,7 +379,7 @@
                 }\ifnum\fpeval{\PfCTotalCases-\useKV[ClesQCM]{Reponses}}>0\relax\uppercase{&}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{PfCCouleurAlterneQCM}\fi}{}\fi\\
               }%
               \hline%
-            \end{tabular}%
+            \end{longtable}%
           }%
         }%
         \renewcommand{\arraystretch}{1}%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcritureUnites.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcritureUnites.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCEcritureUnites.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,8 +1,8 @@
 %%%
 % Ecritures d'unit\'es
 %%%
-\def\filedateEcrireUnites{2025/05/26}%
-\def\fileversionEcrireUnites{0.1a}%
+\def\filedateEcrireUnites{2025/07/17}%
+\def\fileversionEcrireUnites{0.1b}%
 \message{-- \filedateEcrireUnites\space v\fileversionEcrireUnites}%
 %
 \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,kgL=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,Nombre,US=false,UK=false,CFA=false,CFP=false,CHF=false,Euro=false,Precision=2,Dots={}}%
@@ -95,10 +95,9 @@
   }%
 }%
 
-\NewDocumentCommand \Horaire {o o > { \SplitArgument { 2 } { ; } } m }
-{%
+\NewDocumentCommand\Horaire{oo>{\SplitArgument{2}{;}}m}{%
   \useKVdefault[Unites]%
-  \setKV[Unites]{#1}
+  \setKV[Unites]{#1}%
   \group_begin:%
   \IfNoValueF{#2}
   { \keys_set:nn { siunitx } {#2} }
@@ -141,6 +140,91 @@
     }%
   }%
 }%
+
+\NewDocumentCommand \Duree {o o > { \SplitArgument { 5 } { ; } } m }
+{%
+  \useKVdefault[Unites]%
+  \setKV[Unites]{#1}%
+  \group_begin:%
+  \IfNoValueF{#2}%
+  { \keys_set:nn { siunitx } {#2} }%
+  \siunitx_duree_output:nnn #3%
+  \group_end:%
+}%
+\cs_new_protected:Npn \siunitx_duree_output:nnn #1#2#3#4#5#6
+{%
+  \IfNoValueF{#1}%
+  {%
+    \tl_if_blank:nF {#1}%
+    {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#1>1\relax\SI{#1}{\annee\xintifboolexpr{#1>1}{s}{}}\fi%
+      }{%
+      \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+      \pointilles[\PfCLgUnites]~\si{\annee(s)}}%
+      \IfNoValueF{#2}{~}%
+    }%
+  }%
+  \IfNoValueF{#2}%
+  {%
+    \tl_if_blank:nF {#2}%
+    {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#2>0\relax\SI{#2}{\mois}\fi%
+      }{%
+      \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+      \pointilles[\PfCLgUnites]~\si{\mois}}%
+      \IfNoValueF{#3}{~}%
+    }%
+  }%
+  \IfNoValueF{#3}%
+  {%
+    \tl_if_blank:nF {#3}%
+    {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#3>0\relax\SI{#3}{\jour}\fi%
+      }{%
+      \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+      \pointilles[\PfCLgUnites]~\si{\jour}}%      
+      \IfNoValueF{#4}{~}%
+    }%
+  }%
+  \IfNoValueF{#4}%
+  {%
+    \tl_if_blank:nF {#4}%
+    {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#4>0\relax\SI{#4}{\hour}\fi%
+      }{%
+      \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+      \pointilles[\PfCLgUnites]~\si{\hour}%
+          }%
+      \IfNoValueF{#5}{\ifnum#4>0\relax{}~\fi}%
+    }%
+  }%
+  \IfNoValueF{#5}%
+  {%
+    \tl_if_blank:nF {#5}%
+    {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#5>0\relax\SI[minimum-integer-digits=2]{#5}{\minute}\fi%
+      }{%
+      \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+      \pointilles[\PfCLgUnites]~\si{\minute}}%
+      \IfNoValueF{#6}{~}%
+    }%
+  }%
+  \IfNoValueF{#6}%
+  {%
+    \tl_if_blank:nF {#6} {%
+      \ifboolKV[Unites]{Nombre}{%
+        \ifnum#6>0\relax\SI{#6}{\second}\fi%
+      }{%
+        \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}%
+        \pointilles[\PfCLgUnites]~\si{\second}}%
+    }%
+  }%
+}%
 \ExplSyntaxOff
 
 \NewDocumentCommand\Temp{o m}{%

Added: trunk/Master/texmf-dist/tex/latex/profcollege/PfCIteration.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCIteration.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCIteration.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,195 @@
+%%%
+% Itération
+%%%
+\def\filedateIteration{2025/07/30}%
+\def\fileversionIteration{0.1a}%
+\message{-- \filedateIteration\space v\fileversionIteration}%
+%
+\setKVdefault[Iteration]{Depart=4,Repetitions=3,Images=false,Ratio=false,Fleches=false,Debord=1,Completer=false,Solution=false,CouleurSol=Evidence,Ecart={ ; }}%
+
+\makeatletter
+\NewDocumentCommand\PfM at TikzMark{m}{%
+  \tikz[remember picture,baseline,inner sep=0pt]{%
+    \node[name=Iteration-\theNbDistri,anchor=base] {$#1$};}%
+  \stepcounter{NbDistri}%
+}%
+
+\NewDocumentCommand\Iteration{om}{%
+  \setcounter{NbDistri}{0}%
+  \useKVdefault[Iteration]%
+  \setKV[Iteration]{#1}%
+  \setsepchar{ }\ignoreemptyitems%
+  \readlist*\PfM at ListeOp{#2}%
+  \reademptyitems%
+%  Lecture Itération : \showitems\PfM at ListeOp[]\par
+  \ifboolKV[Iteration]{Ratio}{%
+    \edef\PfM at ListeCompoAMelanger{}%
+    \edef\PfM at RetiensLesIterations{0}%
+    \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfM at ListeOplen/2}}}\do{%
+      \xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfM at ListeOp[\fpeval{##1*2-1}]*\useKV[Iteration]{Repetitions}}}}\do{%
+        \edef\PfM at ListeCompoAMelanger{\PfM at ListeCompoAMelanger,##1}%
+        \edef\PfM at RetiensLesIterations{\fpeval{\PfM at RetiensLesIterations+1}}%
+      }%
+    }%
+    % Ajout d'éléments par la clé Debord.
+    \ifnum\useKV[Iteration]{Debord}>0\relax%
+      \edef\PfM at NbElements{0}%
+      \xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfM at ListeOplen/2}}}\do{%
+        \xintFor* ##3 in{\xintSeq{1}{\PfM at ListeOp[\fpeval{##2*2-1}]}}\do{%
+          \edef\PfM at NbElements{\fpeval{\PfM at NbElements+1}}%
+          \ifnum\useKV[Iteration]{Debord}<\PfM at NbElements\relax%
+          \else%
+            % \PfM at ListeOp[\fpeval{2*##2}]%
+            \edef\PfM at ListeCompoAMelanger{\PfM at ListeCompoAMelanger,##2}%
+            \edef\PfM at RetiensLesIterations{\fpeval{\PfM at RetiensLesIterations+1}}%
+          \fi%
+        }%
+      }%
+    \fi%
+    \MelangeListe{\PfM at ListeCompoAMelanger}{\PfM at RetiensLesIterations}%
+    \setsepchar{,}\ignoreemptyitems%
+    \readlist*\PfM at ListeRatioAAfficher{\faa}%
+    \reademptyitems%
+    \xintFor* ##1 in{\xintSeq{1}{\PfM at RetiensLesIterations}}\do{%
+      \itemtomacro\PfM at ListeRatioAAfficher[##1]\PfM at RatioTiti%
+      \PfM at ListeOp[\fpeval{2*\PfM at RatioTiti}]%
+    }%
+  }{%
+    \ifboolKV[Iteration]{Images}{%
+      \xintFor* ##1 in{\xintSeq{1}{\useKV[Iteration]{Repetitions}}}\do{%
+        \xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfM at ListeOplen/2}}}\do{%
+          \xintFor* ##3 in{\xintSeq{1}{\PfM at ListeOp[\fpeval{##2*2-1}]}}\do{%
+            \PfM at ListeOp[\fpeval{2*##2}]%
+          }%
+        }%
+      }%
+      % Ajout d'éléments par la clé Debord.
+      \ifnum\useKV[Iteration]{Debord}>0\relax%
+        \edef\PfM at NbElements{0}%
+        \xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfM at ListeOplen/2}}}\do{%
+          \xintFor* ##3 in{\xintSeq{1}{\PfM at ListeOp[\fpeval{##2*2-1}]}}\do{%
+            \edef\PfM at NbElements{\fpeval{\PfM at NbElements+1}}%
+            \ifnum\useKV[Iteration]{Debord}<\PfM at NbElements\relax%
+            \else%
+              \PfM at ListeOp[\fpeval{2*##2}]%
+            \fi%
+          }%
+        }%
+      \fi%
+    }{%
+      \ifboolKV[Iteration]{Completer}{\edef\PfM at Repetitions{\fpeval{\useKV[Iteration]{Repetitions}-1}}}{\edef\PfM at Repetitions{\fpeval{\useKV[Iteration]{Repetitions}}}}%
+      \edef\PfM at ValeurIntermediaire{\useKV[Iteration]{Depart}}%
+      \edef\PfM at ListeSuiteNb{\useKV[Iteration]{Depart}}%
+      \xintFor* ##1 in{\xintSeq{1}{\PfM at Repetitions}}\do{%
+        \edef\PfMk{##1}%
+        \xintFor* ##2 in{\xintSeq{1}{\PfM at ListeOplen}}\do{%
+          \edef\PfM at ValeurIntermediaire{\fpeval{\PfM at ValeurIntermediaire\PfM at ListeOp[##2]}}%
+          \edef\PfM at ListeSuiteNb{\PfM at ListeSuiteNb,\PfM at ValeurIntermediaire}%
+        }%
+      }%
+      \ifboolKV[Iteration]{Completer}{%
+        \xintFor* ##3 in{\xintSeq{1}{\useKV[Iteration]{Debord}}}\do{%
+          \xintFor* ##2 in{\xintSeq{1}{\PfM at ListeOplen}}\do{%
+            \edef\PfMk{\fpeval{\PfMk+1}}%
+            \edef\PfM at ValeurIntermediaire{\fpeval{\PfM at ValeurIntermediaire\PfM at ListeOp[##2]}}%
+            \edef\PfM at ListeSuiteNb{\PfM at ListeSuiteNb,\PfM at ValeurIntermediaire}%
+          }%
+        }%
+      }{}%
+      \setsepchar{,}\ignoreemptyitems%
+      \readlist*\PfM at ListeRecupere{\PfM at ListeSuiteNb}%
+      \reademptyitems%
+      \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfM at ListeOplen*\PfM at Repetitions+1}}}\do{%
+        \PfM at TikzMark{\num{\PfM at ListeRecupere[##1]}}\xintifForLast{}{\useKV[Iteration]{Ecart}}%
+      }%
+      \ifboolKV[Iteration]{Completer}{%
+        \ifboolKV[Iteration]{Solution}{%
+          \xintFor* ##3 in{\xintSeq{1}{\useKV[Iteration]{Debord}}}\do{%
+            \xintFor* ##1 in{\xintSeq{1}{\PfM at ListeOplen}}\do{%
+              \edef\PfM at Titi{\fpeval{\PfM at ListeOplen*\PfM at Repetitions+1+##1+(##3-1)*\PfM at ListeOplen}}%
+              \useKV[Iteration]{Ecart}\PfM at TikzMark{\textcolor{\useKV[Iteration]{CouleurSol}}{\num{\PfM at ListeRecupere[\PfM at Titi]}}}%
+            }%
+          }%
+        }{%
+          \xintFor* ##3 in{\xintSeq{1}{\useKV[Iteration]{Debord}}}\do{%
+            \xintFor* ##1 in{\xintSeq{1}{\PfM at ListeOplen}}\do{%
+             \useKV[Iteration]{Ecart}\pointilles[25pt]{}%
+            }%
+          }%
+        }%
+      }{}%
+      .%
+      \ifboolKV[Iteration]{Fleches}{%
+        \ifnum\PfM at ListeOplen=1\relax%
+          %Fleches avec une opération !
+          \IfSubStr{\PfM at ListeOp[1]}{*}{%
+            \IfSubStr{\PfM at ListeOp[1]}{+}{%
+%              Une multiplication et une addition :)
+              \StrBefore{\PfM at ListeOp[1]}{+}[\PfMPartieMul]%
+%              PartieMul : \PfMPartieMul\par
+              \StrBehind{\PfM at ListeOp[1]}{+}[\PfMPartiePlus]%
+%              PartiePlus : \PfMPartiePlus\par
+              \StrSubstitute{\PfMPartieMul}{*}{\times}[\PfMPartieMul]%
+%              PartieMul : \PfMPartieMul\par
+              \xintFor* ##4 in{\xintSeq{0}{\fpeval{\theNbDistri-2}}}\do{%
+                \begin{tikzpicture}[remember picture,overlay]%
+                  \coordinate[xshift=0em,yshift=2em] (IterationA) at ($(Iteration-##4)!0.5!(Iteration-\fpeval{##4+1})$);
+                  \draw[-stealth,transform canvas={yshift=0.5em}] (Iteration-##4.north) to node[pos=0.65,below]{\footnotesize$\PfMPartieMul$}(IterationA);%
+                  \draw[-stealth,transform canvas={yshift=0.5em}] (IterationA) to node[pos=0.65,above]{\footnotesize$+\num{\PfMPartiePlus}$}(Iteration-\fpeval{##4+1}.north);%
+                \end{tikzpicture}%
+              }%
+            }{\IfSubStr{\PfM at ListeOp[1]}{-}{%
+%                une multiplication et une soustraction :)
+                \StrBefore{\PfM at ListeOp[1]}{-}[\PfMPartieMul]%
+                \StrBehind{\PfM at ListeOp[1]}{-}[\PfMPartieMoins]%
+                \StrSubstitute{\PfMPartieMul}{*}{\times}[\PfMPartieMul]%
+                \xintFor* ##4 in{\xintSeq{0}{\fpeval{\theNbDistri-2}}}\do{%
+                \begin{tikzpicture}[remember picture,overlay]%
+                  \coordinate[xshift=0em,yshift=2em] (IterationA) at ($(Iteration-##4)!0.5!(Iteration-\fpeval{##4+1})$);
+                  \draw[-stealth,transform canvas={yshift=0.5em}] (Iteration-##4.north) to node[pos=0.65,below]{\footnotesize$\PfMPartieMul$}(IterationA);%
+                  \draw[-stealth,transform canvas={yshift=0.5em}] (IterationA) to node[pos=0.65,above]{\footnotesize$-\num{\PfMPartieMoins}$}(Iteration-\fpeval{##4+1}.north);%
+                \end{tikzpicture}
+                }%
+              }{%
+%                une seule et unique opération : \PfM at ListeOp[1]
+                \xintFor* ##4 in{\xintSeq{0}{\fpeval{\theNbDistri-2}}}\do{%
+                  \IfSubStr{\PfM at ListeOp[1]}{*}{\StrBehind{\PfM at ListeOp[1]}{*}[\PfMPartieMul]\edef\PfMTiti{\times\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{/}{\StrBehind{\PfM at ListeOp[1]}{/}[\PfMPartieMul]\edef\PfMTiti{\div\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{+}{\StrBehind{\PfM at ListeOp[1]}{+}[\PfMPartieMul]\edef\PfMTiti{+\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{-}{\StrBehind{\PfM at ListeOp[1]}{-}[\PfMPartieMul]\edef\PfMTiti{-\num{\PfMPartieMul}}}{}%
+                  \begin{tikzpicture}[remember picture,overlay]%
+                    \draw[-stealth,out=30,in=150,transform canvas={yshift=0.5em}] (Iteration-##4.north) to node[midway,above]{\footnotesize$\PfMTiti$}(Iteration-\fpeval{##4+1}.north);%
+                  \end{tikzpicture}%
+                }%
+              }%
+            }%
+          }{%
+%            une seule et unique opération : \PfM at ListeOp[1]
+            \xintFor* ##4 in{\xintSeq{0}{\fpeval{\theNbDistri-2}}}\do{%
+              \IfSubStr{\PfM at ListeOp[1]}{*}{\StrBehind{\PfM at ListeOp[1]}{*}[\PfMPartieMul]\edef\PfMTiti{\times\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{/}{\StrBehind{\PfM at ListeOp[1]}{/}[\PfMPartieMul]\edef\PfMTiti{\div\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{+}{\StrBehind{\PfM at ListeOp[1]}{+}[\PfMPartieMul]\edef\PfMTiti{+\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at ListeOp[1]}{-}{\StrBehind{\PfM at ListeOp[1]}{-}[\PfMPartieMul]\edef\PfMTiti{-\num{\PfMPartieMul}}}{}%
+              \begin{tikzpicture}[remember picture,overlay]
+                \draw[-stealth,out=30,in=150,transform canvas={yshift=0.5em}] (Iteration-##4.north) to node[midway,above]{\footnotesize$\PfMTiti$}(Iteration-\fpeval{##4+1}.north);%
+              \end{tikzpicture}%
+            }%
+          }%
+        \else%
+          \xintFor* ##4 in{\xintSeq{0}{\fpeval{\theNbDistri-2}}}\do{%
+            \modulo{##4}{\PfM at ListeOplen}%
+            \edef\PfM at Test{\PfM at ListeOp[\fpeval{\the\remainder+1}]}%
+            \IfSubStr{\PfM at Test}{*}{\StrBehind{\PfM at Test}{*}[\PfMPartieMul]\edef\PfMTiti{\times\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at Test}{/}{\StrBehind{\PfM at Test}{/}[\PfMPartieMul]\edef\PfMTiti{\div\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at Test}{+}{\StrBehind{\PfM at Test}{+}[\PfMPartieMul]\edef\PfMTiti{+\num{\PfMPartieMul}}}{}%
+                  \IfSubStr{\PfM at Test}{-}{\StrBehind{\PfM at Test}{-}[\PfMPartieMul]\edef\PfMTiti{-\num{\PfMPartieMul}}}{}%
+            \begin{tikzpicture}[remember picture,overlay]
+              \draw[-stealth,out=30,in=150,transform canvas={yshift=0.5em}] (Iteration-##4.north) to node[midway,above]{\footnotesize$\PfMTiti$}(Iteration-\fpeval{##4+1}.north);%
+            \end{tikzpicture}%
+          }%
+        \fi%
+      }{}%
+    }%
+  }%
+}%
+\makeatother
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/profcollege/PfCIteration.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCJeton.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCJeton.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCJeton.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,8 +1,8 @@
 %%%
 % Jeton
 %%%
-\def\filedateJeton{2024/08/04}%
-\def\fileversionJeton{0.1}%
+\def\filedateJeton{2025/08/14}%
+\def\fileversionJeton{0.1a}%
 \message{-- \filedateJeton\space v\fileversionJeton}%
 %
 \setKVdefault[Jeton]{Diametre=5mm,Impression=false}%
@@ -38,7 +38,7 @@
       Intensite:=0.3+uniformdeviate(2)/10;
       draw woodenThing(p,JetonAngle) withcolor Intensite*Fond;
       draw p;
-      label(TEX("\bfseries "&decimal(#1)),(0,0));
+      label(TEX("\bfseries \num{#1}"),(0,0));
     \end{mplibcode}
   \fi%
 }%
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCKakuro.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCKakuro.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCKakuro.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -30,7 +30,7 @@
   }{}%
   \savecomparemode%
   \comparestrict%
-  \begin{NiceTabular}{*{\useKV[Kakuro]{TLargeur}}{m{\useKV[Kakuro]{Largeur}}}}[hvlines,color-inside]%
+  \begin{NiceTabular}{*{\useKV[Kakuro]{TLargeur}}{m{\useKV[Kakuro]{Largeur}}}}[hvlines]%,color-inside]%
     \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Kakuro]{THauteur}-1}}}\do{%
       \xintFor* ##2 in {\xintSeq{1}{\useKV[Kakuro]{TLargeur}}}\do{%
         \rule{0pt}{\PfCKakuro}%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCKenKen.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCKenKen.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCKenKen.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -19,7 +19,7 @@
   \ignoreemptyitems%
   \savecomparemode%
   \comparestrict%
-  \begin{NiceTabular}{*{\useKV[ClesKK]{Taille}}{m{\useKV[ClesKK]{Largeur}}}}[color-inside]%
+  \begin{NiceTabular}{*{\useKV[ClesKK]{Taille}}{m{\useKV[ClesKK]{Largeur}}}}%[color-inside]%
     \CodeBefore
     \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{%
       \tikz\draw[gray] (##1-|1) -- (##1-|last);%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCModeleBarre.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCModeleBarre.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCModeleBarre.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -427,9 +427,11 @@
   if nbfois>0:
   label(TEX(t),iso((0,0),(u*abs(nbfois),Hauteur)));
   else:
+  if t<>"":
   label.bot(TEX(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
   drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
   fi;
+  fi;
   );
   $
   enddef;
@@ -449,9 +451,11 @@
   if nbfois>0:
   label(LATEX(t),iso((0,0),(u*abs(nbfois),Hauteur)));
   else:
+  if t<>"":
   label.bot(LATEX(t),iso((0,0),(u*abs(nbfois),-Hauteur)));
   drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur);
   fi;
+  fi;
   );
   $
   enddef;

Added: trunk/Master/texmf-dist/tex/latex/profcollege/PfCMonnaieEuro.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCMonnaieEuro.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCMonnaieEuro.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,91 @@
+%%%
+% Monnaie
+%%%
+\def\filedateMonnaie{2025/08/13}%
+\def\fileversionMonnaie{0.1}%
+\message{-- \filedateMonnaie\space v\fileversionMonnaie}%
+
+\setKVdefault[PfCMonnaie]{Echelle=0.5,Ecart=10pt,EcartPiece=10pt,EcartVH=1.2875cm,Vertical,Impression}%
+
+\makeatletter
+\NewDocumentCommand\Monnaie{om}{%
+  \useKVdefault[PfCMonnaie]%
+  \setKV[PfCMonnaie]{#1}%
+  \edef\PfC at ListeMonnaieAv{#2}%
+  \setsepchar{,}\ignoreemptyitems%
+  \readlist*\PfC at ListeMonnaie{\PfC at ListeMonnaieAv}%
+  \reademptyitems%
+  \edef\PfC at scale{\useKV[PfCMonnaie]{Echelle}}%
+  \ifboolKV[PfCMonnaie]{Impression}{%
+    \ifboolKV[PfCMonnaie]{Vertical}{%
+      \xintFor* ##1 in{\xintSeq{1}{\PfC at ListeMonnaielen}}\do{%
+        \StrCount{\PfC at ListeMonnaie[##1]}{*}[\PfC at RecupStar]%
+        \ifnum\PfC at RecupStar=0\relax%
+          \itemtomacro\PfC at ListeMonnaie[##1]\PfCsuffixemonnaie%
+          \includegraphics[scale=\PfC at scale]{PfCPiece\PfCsuffixemonnaie.pdf}%
+        \else%
+          \StrBefore{\PfC at ListeMonnaie[##1]}{*}[\PfC at Facteur]%
+          \StrBehind{\PfC at ListeMonnaie[##1]}{*}[\PfC at Image]%
+          \begin{tikzpicture}
+            \foreach \PfCi in {1,...,\PfC at Facteur}{%
+              \draw (0,{-1*(\PfCi-1)*\useKV[PfCMonnaie]{EcartPiece}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPiece\PfC at Image.pdf}};%
+            }%
+          \end{tikzpicture}%
+        \fi%
+        \xintifForLast{}{\hspace*{\useKV[PfCMonnaie]{Ecart}}}%
+      }%
+    }{%
+      \begin{tikzpicture}
+        \xintFor* ##1 in{\xintSeq{1}{\PfC at ListeMonnaielen}}\do{%
+          \StrCount{\PfC at ListeMonnaie[##1]}{*}[\PfC at RecupStar]%
+          \ifnum\PfC at RecupStar=0\relax%
+            \itemtomacro\PfC at ListeMonnaie[##1]\PfC at Image%
+            \draw (0,{-1*(##1-1)*\useKV[PfCMonnaie]{EcartVH}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPiece\PfC at Image.pdf}};%
+          \else%
+            \StrBefore{\PfC at ListeMonnaie[##1]}{*}[\PfC at Facteur]%
+            \StrBehind{\PfC at ListeMonnaie[##1]}{*}[\PfC at Image]%
+            \foreach \PfCi in {1,...,\PfC at Facteur}{%
+              \draw ({-1*(\PfCi-1)*\useKV[PfCMonnaie]{EcartPiece}},{-1*(##1-1)*\useKV[PfCMonnaie]{EcartVH}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPiece\PfC at Image.pdf}};%
+            }%
+          \fi%
+        }%
+      \end{tikzpicture}%
+    }%
+  }{%Couleur
+    \ifboolKV[PfCMonnaie]{Vertical}{%
+      \xintFor* ##1 in{\xintSeq{1}{\PfC at ListeMonnaielen}}\do{%
+        \StrCount{\PfC at ListeMonnaie[##1]}{*}[\PfC at RecupStar]%
+        \ifnum\PfC at RecupStar=0\relax%
+          \itemtomacro\PfC at ListeMonnaie[##1]\PfCsuffixemonnaie%
+          \includegraphics[scale=\PfC at scale]{PfCPieceCoul\PfCsuffixemonnaie.pdf}%
+        \else%
+          \StrBefore{\PfC at ListeMonnaie[##1]}{*}[\PfC at Facteur]%
+          \StrBehind{\PfC at ListeMonnaie[##1]}{*}[\PfC at Image]%
+          \begin{tikzpicture}
+            \foreach \PfCi in {1,...,\PfC at Facteur}{%
+              \draw (0,{-1*(\PfCi-1)*\useKV[PfCMonnaie]{EcartPiece}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPieceCoul\PfC at Image.pdf}};%
+            }%
+          \end{tikzpicture}%
+        \fi%
+        \xintifForLast{}{\hspace*{\useKV[PfCMonnaie]{Ecart}}}%
+      }%
+    }{%
+      \begin{tikzpicture}
+        \xintFor* ##1 in{\xintSeq{1}{\PfC at ListeMonnaielen}}\do{%
+          \StrCount{\PfC at ListeMonnaie[##1]}{*}[\PfC at RecupStar]%
+          \ifnum\PfC at RecupStar=0\relax%
+            \itemtomacro\PfC at ListeMonnaie[##1]\PfC at Image%
+            \draw (0,{-1*(##1-1)*\useKV[PfCMonnaie]{EcartVH}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPieceCoul\PfC at Image.pdf}};%
+          \else%
+            \StrBefore{\PfC at ListeMonnaie[##1]}{*}[\PfC at Facteur]%
+            \StrBehind{\PfC at ListeMonnaie[##1]}{*}[\PfC at Image]%
+            \foreach \PfCi in {1,...,\PfC at Facteur}{%
+              \draw ({-1*(\PfCi-1)*\useKV[PfCMonnaie]{EcartPiece}},{-1*(##1-1)*\useKV[PfCMonnaie]{EcartVH}}) node[inner sep=0pt]{\includegraphics[scale=\PfC at scale]{PfCPieceCoul\PfC at Image.pdf}};%
+            }%
+          \fi%
+        }%
+      \end{tikzpicture}%
+    }%
+  }%
+}%
+\makeatother
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/profcollege/PfCMonnaieEuro.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCMotsCodes.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCMotsCodes.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCMotsCodes.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -14,7 +14,7 @@
   \readlist*\ListeMotsCodes{#2}%
   \xdef\ListeMotsCodesPas{\fpeval{\ListeMotsCodeslen/\useKV[MotsCodes]{Colonnes}}}%
   % \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{Largeur}}}}[color-inside]
-    \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{m{\useKV[MotsCodes]{Largeur}}}}[color-inside]
+    \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{m{\useKV[MotsCodes]{Largeur}}}}%[color-inside]
     \xintFor* ##1 in {\xintSeq {1}{\ListeMotsCodesPas}}\do{%
       \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{%
         \xintifForFirst{}{&}\Block[draw=black]{4-1}{}%
@@ -43,7 +43,7 @@
   \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}}}}[color-inside]
+  \begin{NiceTabular}{*{\fpeval{\ListeMotsCodesMax}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{LargeurT}}}}%[color-inside]
     \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsCodesTableaulen}}}\do{%
       \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{%
         \xintifForFirst{}{&}\ifboolKV[MotsCodes]{Solution}{%

Added: trunk/Master/texmf-dist/tex/latex/profcollege/PfCMulEthiopie.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCMulEthiopie.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCMulEthiopie.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,148 @@
+%%%
+% Multiplication Japonaise
+%%%
+\def\filedateMulEthiopie{2025/08/01}%
+\def\fileversionMulEthiopie{0.1}%
+\message{-- \filedateMulEthiopie\space v\fileversionMulEthiopie}%
+%
+\setKVdefault[MulEthiopie]{Etape=0,CouleurInter=Crimson,Details=false,Aide=false}
+
+\makeatletter
+\NewDocumentCommand\MulEthiopie{om}{%
+  \useKVdefault[MulEthiopie]%
+  \setKV[MulEthiopie]{#1}%
+  \setsepchar{x}\ignoreemptyitems%
+  \readlist*\PfC at MulEthiopie{#2}%
+  \reademptyitems%
+  \ifboolKV[MulEthiopie]{Details}{%
+    \PfM at BuildTabMulEthiopieDetaille%
+  }{%
+    \PfM at BuildTabMulEthiopie%
+  }%
+}%
+
+\NewDocumentCommand\PfM at BuildTabMulEthiopie{}{%
+  % Combien de lignes
+  \edef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+  \edef\PfC at FacteurB{\PfC at MulEthiopie[2]}%
+  \edef\PfC at ProduitFinal{\fpeval{\PfC at FacteurA*\PfC at FacteurB}}%
+  \StrLen{\PfC at ProduitFinal}[\PfC at LongueurTab]%
+  \edef\PfC at MulEthiopieTotalEtape{0}%
+  \whiledo{\PfC at FacteurA>1}{%
+    \quotient{\PfC at FacteurA}{2}%
+    \edef\PfC at FacteurA{\the\intquotient}%
+    \edef\PfC at MulEthiopieTotalEtape{\fpeval{\PfC at MulEthiopieTotalEtape+1}}%
+  }%
+  \colorlet{PfCCouleurMulEthiopie}{\useKV[MulEthiopie]{CouleurInter}}%
+  \ifnum\useKV[MulEthiopie]{Etape}<3\relax%
+    \begin{NiceTabular}{m{\fpeval{0.5*\PfC at LongueurTab}em}m{\fpeval{0.5*\PfC at LongueurTab}em}}%
+      \CodeBefore
+      \ifnum\useKV[MulEthiopie]{Etape}=2\relax%
+        \xdef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+        \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfC at MulEthiopieTotalEtape+1}}}\do{%
+          \ifodd\PfC at FacteurA\relax%
+            \ifboolKV[MulEthiopie]{Aide}{\tikz \draw[fill=LightGreen] (\fpeval{##1+1+1}-|1) rectangle (\fpeval{##1+1}-|2);}{}%
+          \else%
+          \fi%
+          \quotient{\PfC at FacteurA}{2}%
+          \xdef\PfC at FacteurA{\the\intquotient}%
+        }%
+      \fi%
+      \Body%
+      \Block[draw,fill=Cornsilk]{1-2}{$\num{\PfC at MulEthiopie[1]}\times\num{\PfC at MulEthiopie[2]}$}&\\
+      \ifnum\useKV[MulEthiopie]{Etape}=0\relax%
+        \num{\PfC at MulEthiopie[1]}&\num{\PfC at MulEthiopie[2]}\\%
+        \xintFor* ##1 in{\xintSeq{1}{\PfC at MulEthiopieTotalEtape}}\do{%
+          &\\%
+        }%
+      \fi%
+      \ifnum\useKV[MulEthiopie]{Etape}>0\relax%
+        \xdef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+        \xdef\PfC at FacteurB{\PfC at MulEthiopie[2]}%
+        \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfC at MulEthiopieTotalEtape+1}}}\do{%
+          \num{\PfC at FacteurA}&%
+          \ifodd\PfC at FacteurA\relax%
+            \ifnum\useKV[MulEthiopie]{Etape}=2\relax%
+              \textcolor{PfCCouleurMulEthiopie}{\num{\PfC at FacteurB}}%
+            \else%
+              \num{\PfC at FacteurB}%
+            \fi%
+          \else%
+            \num{\PfC at FacteurB}%
+          \fi%
+          \quotient{\PfC at FacteurA}{2}%
+          \xdef\PfC at FacteurA{\the\intquotient}%
+          \xdef\PfC at FacteurB{\fpeval{\PfC at FacteurB*2}}%
+          \\
+        }%
+      \fi%
+      \CodeAfter%
+      \tikz \draw[line width=1pt] (2-|2) to (last-|2);%
+      \ifnum\useKV[MulEthiopie]{Etape}=2\relax%
+        \xdef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+        \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfC at MulEthiopieTotalEtape+1}}}\do{%
+          \ifodd\PfC at FacteurA\relax%
+          \else%
+            \tikz \draw[line width=1pt] (\fpeval{##1+1+0.5}-|1) to (\fpeval{##1+1+0.5}-|3);%
+          \fi%
+          \quotient{\PfC at FacteurA}{2}%
+          \xdef\PfC at FacteurA{\the\intquotient}%
+        }%
+      \fi%
+    \end{NiceTabular}%
+  \else%
+    \begin{align*}
+      \num{\PfC at MulEthiopie[1]}\times\num{\PfC at MulEthiopie[2]}&=
+                                                      \xdef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+                                                      \xdef\PfC at FacteurB{\PfC at MulEthiopie[2]}%
+                                                      \xintFor* ## 1in{\xintSeq{1}{\fpeval{\PfC at MulEthiopieTotalEtape+1}}}\do{%
+                                                      \ifodd\PfC at FacteurA\relax%
+                                                      \num{\PfC at FacteurB}\xintifForLast{}{+}%
+                                                      \fi%
+                                                      \quotient{\PfC at FacteurA}{2}%
+                                                      \xdef\PfC at FacteurA{\the\intquotient}%
+                                                      \xdef\PfC at FacteurB{\fpeval{\PfC at FacteurB*2}}%
+                                                      }\\
+      \num{\PfC at MulEthiopie[1]}\times\num{\PfC at MulEthiopie[2]}&=\mathcolor{Evidence}{\num{\fpeval{\PfC at MulEthiopie[1]*\PfC at MulEthiopie[2]}}}
+    \end{align*}
+  \fi%
+}%
+
+\NewDocumentCommand\PfM at BuildTabMulEthiopieDetaille{}{%
+  % Combien de lignes
+  \edef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+  \edef\PfC at FacteurB{\PfC at MulEthiopie[1]}%
+  \edef\PfC at ProduitFinal{\fpeval{\PfC at FacteurA*\PfC at FacteurB}}%
+  \StrLen{\PfC at ProduitFinal}[\PfC at LongueurTab]%
+  \edef\PfC at MulEthiopieTotalEtape{0}%
+  \whiledo{\PfC at FacteurA>1}{%
+    \quotient{\PfC at FacteurA}{2}%
+    \edef\PfC at FacteurA{\the\intquotient}%
+    \edef\PfC at MulEthiopieTotalEtape{\fpeval{\PfC at MulEthiopieTotalEtape+1}}%
+  }%
+  \ifnum\useKV[MulEthiopie]{Etape}>\fpeval{\PfC at MulEthiopieTotalEtape+1}\relax%
+    \message{Le nombre d'étapes demandé est supérieur aux \fpeval{\PfC at MulEthiopieTotalEtape+1} nécessaires à la multiplication \PfC at FacteurA x \PfC at FacteurB}%
+  \else%
+    \colorlet{PfCCouleurMulEthiopie}{\useKV[MulEthiopie]{CouleurInter}}%
+    \begin{NiceTabular}{m{\fpeval{0.5*\PfC at LongueurTab}em}m{\fpeval{0.5*\PfC at LongueurTab}em}}%
+      \Block[draw,fill=Cornsilk]{1-2}{$\num{\PfC at MulEthiopie[1]}\times\num{\PfC at MulEthiopie[2]}$}&\\
+      \xdef\PfC at FacteurA{\PfC at MulEthiopie[1]}%
+      \xdef\PfC at FacteurB{\PfC at MulEthiopie[2]}%
+      \xintFor* ##1 in{\xintSeq{1}{\useKV[MulEthiopie]{Etape}}}\do{%
+        \num{\PfC at FacteurA}&\num{\PfC at FacteurB}%
+        \quotient{\PfC at FacteurA}{2}%
+        \xdef\PfC at FacteurA{\the\intquotient}%
+        \xdef\PfC at FacteurB{\fpeval{\PfC at FacteurB*2}}%
+        \\
+      }%
+      \ifnum\useKV[MulEthiopie]{Etape}<\fpeval{\PfC at MulEthiopieTotalEtape+1}\relax%
+        \xintFor* ##1 in{\xintSeq{\fpeval{\useKV[MulEthiopie]{Etape}+1}}{\fpeval{\PfC at MulEthiopieTotalEtape+1}}}\do{%
+          &\\
+        }%
+      \fi%
+      \CodeAfter
+      \tikz \draw[line width=1pt] (2-|2) to (last-|2);
+    \end{NiceTabular}%
+  \fi%
+}%
+\makeatother
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/profcollege/PfCMulEthiopie.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCNotionFonction.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCNotionFonction.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCNotionFonction.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1298,7 +1298,7 @@
     pi*angle((x,sqrt(1-x**2)))/180
   enddef;
   def enplace=
-    xscaled xu yscaled yu shifted (Origine*cm)
+    xscaled xu yscaled yu shifted (Origine*u)
   enddef;
   vardef placepoint(expr q,r)=
    (q,r) enplace

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCOpCroisees.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCOpCroisees.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCOpCroisees.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -74,7 +74,7 @@
   \setcounter{PfCOCVer}{0}%
   %
   \begin{center}
-      \begin{NiceTabular}{c*{\PfCOCTaille}{m{\useKV[OpCroisees]{Largeur}}}}[color-inside]%
+      \begin{NiceTabular}{c*{\PfCOCTaille}{m{\useKV[OpCroisees]{Largeur}}}}%[color-inside]%
     \Block{}{\rule{0pt}{\PfCOpCroisees}}\xintFor* ##1 in {\xintSeq{1}{\PfCOCTaille}}\do{%
       &\Block{}{\modulo{##1}{2}\ifnum\remainder=1\relax\stepcounter{PfCOCHor}\Roman{PfCOCHor}\fi}%
     }\\

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCPatronPaves.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCPatronPaves.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCPatronPaves.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -336,9 +336,9 @@
 }%
 
 \def\MPPatronPave#1#2{%
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
     \MPPatronPaveCode
     n:=0;
     for p_=#2:
@@ -432,8 +432,8 @@
     endfor;
     fi;
     EffectuerTraces;
-  \end{mplibcode}
-  \else
+  \end{mplibcode}%
+  \else%
   \begin{mpost}[mpsettings={\MPPatronPaveCode;}]
     n:=0;
     for p_=#2:
@@ -448,8 +448,8 @@
     LectureLargeur(#1);
     Patron(#1);
     EffectuerTraces;
-  \end{mpost}
-  \fi
+  \end{mpost}%
+  \fi%
 }%
 
 \def\MPPatronCubeCode{%
@@ -523,8 +523,8 @@
 }%
 
 \def\MPPatronCube#1#2{%
-  \ifluatex
-  \mplibforcehmode
+  \ifluatex%
+  \mplibforcehmode%
   \begin{mplibcode}%
     \MPPatronCubeCode
     %
@@ -682,7 +682,7 @@
 \def\MPPatronCubeold#1#2{%
   \ifluatex
   \mplibforcehmode
-  \begin{mplibcode}
+  \begin{mplibcode}%
     \MPPatronCubeCode
     %
     n:=0;
@@ -697,9 +697,9 @@
     %    
     Patron(#1);
     EffectuerTraces;
-  \end{mplibcode}
-  \else
-  \begin{mpost}[mpsettings={\MPPatronCubeCode;}]
+  \end{mplibcode}%
+  \else%
+  \begin{mpost}[mpsettings={\MPPatronCubeCode;}]%
     %
     n:=0;
     for p_=#2:
@@ -713,9 +713,9 @@
     %    
     Patron(#1);
     EffectuerTraces;
-  \end{mpost}
-  \fi
-}
+  \end{mpost}%
+  \fi%
+}%
 
 \def\MPPatronPaveCodeold{%
   Largeur=\useKV[ClesPatron]{Largeur};
@@ -857,7 +857,7 @@
     Patron(#1);
     %EffectuerTraces;
   \end{mplibcode}
-  \else
+  \else%
   \begin{mpost}[mpsettings={\MPPatronPaveCode;}]
     n:=0;
     for p_=#2:
@@ -873,5 +873,5 @@
     Patron(#1);
     EffectuerTraces;
   \end{mpost}
-  \fi
+  \fi%
 }%
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCPattern.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCPattern.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCPattern.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,220 +1,1859 @@
 %%%
 % Visual Pattern
 %%%
-\def\filedatePattern{2024/08/04}%
-\def\fileversionPattern{0.1}%
+\def\filedatePattern{2025/06/30}%
+\def\fileversionPattern{0.1a}%
 \message{-- \filedatePattern\space v\fileversionPattern}%
 %
-\setKVdefault[Pattern]{Type=1,Etape=3}
+\setKVdefault[Pattern]{Type=1,Etape=3,Base=carre,Basea=disque,Couleur={},Echelle={},Tableau=false,TableauV=false,Grille=false,Solution=false,CouleurSolution={},Calcul=false,Inverse=false,Formule=false,Litteral={},Resultat=false}
 
+\makeatletter
 \NewDocumentCommand\VisualPattern{o}{%
   \useKVdefault[Pattern]%
   \setKV[Pattern]{#1}%
-  \IfStrEqCase{\useKV[Pattern]{Type}}{%
-    {284}{\BuildPatternDeuxCentQuatreVingtQuatre}%
-    {254}{\BuildPatternDeuxCentCinquanteQuatre}%
-    {156}{\BuildPatternCentCinquanteSix}%
-    {155}{\BuildPatternCentCinquanteCinq}%
-    {55}{\BuildPatternCinquanteCinq}%
-    {53}{\BuildPatternCinquanteTrois}%
-    {48}{\BuildPatternQuaranteHuit}%
-    {46}{\BuildPatternQuaranteSix}%
-    {45}{\BuildPatternQuaranteCinq}%
-    {39}{\BuildPatternTrenteNeuf}%
-    {30}{\BuildPatternTrente}%
-    {24}{\BuildPatternVingtQuatre}%
-    {20}{\BuildPatternVingt}%
-    {19}{\BuildPatternDixNeuf}%
-    {18}{\BuildPatternDixHuit}%
-    {15}{\BuildPatternQuinze}%
-    {14}{\BuildPatternQuatorze}%
-    {6}{\BuildPatternSix}%
-    {5}{\BuildPatternCinq}%
-    {4}{\BuildPatternQuatre}%
-    {3}{\BuildPatternTrois}%
-    {2}{\BuildPatternDeux}%
-    {1}{\BuildPatternUn}%
+  \edef\PfM at NumType{\useKV[Pattern]{Type}}%
+  \edef\etape{1}%
+  \ifboolKV[Pattern]{Grille}{\edef\PfMRetiensEtape{\useKV[Pattern]{Etape}}\setKV[Pattern]{Tableau=false,TableauV=false}}{}%
+  \ifboolKV[Pattern]{Tableau}{%
+    \edef\PfM at NumEtapeTotal{\useKV[Pattern]{Etape}}%
+    \begin{tabular}{*{\PfM at NumEtapeTotal}{c}}
+      \xintFor* ##1 in{\xintSeq{1}{\useKV[Pattern]{Etape}}}\do{%
+      \ifcsname BuildPattern@\PfM at NumType\endcsname%
+      \setKV[Pattern]{Etape=##1}
+      \csname BuildPattern@\PfM at NumType\endcsname%
+      \fi%
+      \xintifForLast{\\}{&}
+                           }%\\
+      \xintFor* ##9 in{\xintSeq{1}{\PfM at NumEtapeTotal}}\do{%
+      Étape \num{##9}\xintifForLast{\\}{&}%\\
+      }%
+    \end{tabular}
+  }{%
+    \ifboolKV[Pattern]{TableauV}{%
+      \edef\PfM at NumEtapeTotal{\useKV[Pattern]{Etape}}%
+      \begin{tabular}{rc}
+        \xintFor* ##1 in{\xintSeq{1}{\useKV[Pattern]{Etape}}}\do{%
+        Étape \num{##1}&\\
+        &\ifcsname BuildPattern@\PfM at NumType\endcsname%
+        \setKV[Pattern]{Etape=##1}
+        \csname BuildPattern@\PfM at NumType\endcsname%
+        \fi%
+        \\
+        }%
+      \end{tabular}
+    }{%
+      \ifcsname BuildPattern@\PfM at NumType\endcsname%
+        \csname BuildPattern@\PfM at NumType\endcsname%
+      \fi%
+    }%
   }%
 }%
 
-%284
-\NewDocumentCommand\BuildPatternDeuxCentQuatreVingtQuatre{}{
+\expandafter\def\csname BuildPattern at 1\endcsname{\BuildPatternUn{\useKV[Pattern]{Base}}}
+\expandafter\def\csname BuildPattern at 1a\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternUna}{\BuildPatternUna[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 2\endcsname{\BuildPatternDeux}%
+\expandafter\def\csname BuildPattern at 3\endcsname{\BuildPatternTroisa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 4\endcsname{\BuildPatternQuatrea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 5\endcsname{\BuildPatternCinqa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 6\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternSix}{\BuildPatternSix[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 7\endcsname{\BuildPatternSepta{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 8\endcsname{\BuildPatternHuita{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 9\endcsname{\BuildPatternNeufa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 10\endcsname{\BuildPatternDixa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 11\endcsname{\BuildPatternOnzea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 12\endcsname{\BuildPatternDouzea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 13\endcsname{\BuildPatternTreizea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 14\endcsname{\BuildPatternQuatorzea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 15\endcsname{\BuildPatternQuinzea{\useKV[Pattern]{Base}}{\useKV[Pattern]{Basea}}}%
+\expandafter\def\csname BuildPattern at 16\endcsname{\BuildPatternSeizea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 17\endcsname{\BuildPatternDixSepta{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 18\endcsname{\BuildPatternDixHuita{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 19\endcsname{\BuildPatternDixNeufa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 20\endcsname{\BuildPatternVingta{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 21\endcsname{\BuildPatternVingtEtUna{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 22\endcsname{\BuildPatternTreizea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 23\endcsname{\BuildPatternVingtTroisa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 24\endcsname{\BuildPatternVingtQuatrea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 25\endcsname{\BuildPatternVingtCinqa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 26\endcsname{\BuildPatternVingtSixa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 27\endcsname{\BuildPatternVingtSepta{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 28\endcsname{\BuildPatternVingtHuit}%
+\expandafter\def\csname BuildPattern at 29\endcsname{Pattern 29 non reproduit.}%
+\expandafter\def\csname BuildPattern at 30\endcsname{\BuildPatternTrentea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 31\endcsname{\BuildPatternTrenteEtUna{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 32\endcsname{\BuildPatternTrenteDeuxa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 33\endcsname{\BuildPatternTrenteTroisa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 34\endcsname{\BuildPatternTrenteQuatrea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 35\endcsname{\BuildPatternTrenteCinq}%
+\expandafter\def\csname BuildPattern at 36\endcsname{\BuildPatternTrenteSix}%
+\expandafter\def\csname BuildPattern at 37\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternTrenteSept}{\BuildPatternTrenteSept[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 38\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternSix}{\BuildPatternSix[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 39\endcsname{\BuildPatternTrenteNeuf}%
+\expandafter\def\csname BuildPattern at 40\endcsname{\BuildPatternQuarante}%
+\expandafter\def\csname BuildPattern at 41\endcsname{Pattern 41 non reproduit.}%
+\expandafter\def\csname BuildPattern at 42\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternQuaranteDeux}{\BuildPatternQuaranteDeux[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 43\endcsname{\BuildPatternQuaranteTroisa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 44\endcsname{\BuildPatternQuaranteQuatrea{hexagonea}}%
+\expandafter\def\csname BuildPattern at 45\endcsname{\BuildPatternQuaranteCinqa{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 46\endcsname{\BuildPatternQuaranteSix}%
+\expandafter\def\csname BuildPattern at 47\endcsname{Pattern 47 non reproduit.}%
+\expandafter\def\csname BuildPattern at 48\endcsname{\BuildPatternQuaranteHuit}%
+\expandafter\def\csname BuildPattern at 49\endcsname{\BuildPatternQuaranteNeuf}%
+\expandafter\def\csname BuildPattern at 50\endcsname{\BuildPatternCinquante}%
+\expandafter\def\csname BuildPattern at 50a\endcsname{\BuildPatternCinquantea}%
+\expandafter\def\csname BuildPattern at 50b\endcsname{\BuildPatternCinquanteb}%
+\expandafter\def\csname BuildPattern at 50c\endcsname{\BuildPatternCinquantec}%
+\expandafter\def\csname BuildPattern at 50d\endcsname{\BuildPatternCinquanted}%
+\expandafter\def\csname BuildPattern at 50e\endcsname{\BuildPatternCinquantee}%
+\expandafter\def\csname BuildPattern at 50f\endcsname{\BuildPatternCinquantef}%
+\expandafter\def\csname BuildPattern at 50g\endcsname{\BuildPatternCinquanteg}%
+\expandafter\def\csname BuildPattern at 51\endcsname{\BuildPatternCinquanteEtUna{hexagonea}}%
+\expandafter\def\csname BuildPattern at 52\endcsname{\BuildPatternCinquanteDeux}%
+\expandafter\def\csname BuildPattern at 53\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteTrois}{\BuildPatternCinquanteTrois[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 54\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteQuatre}{\BuildPatternCinquanteQuatre[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 55\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteCinq}{\BuildPatternCinquanteCinq[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 56\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteSix}{\BuildPatternCinquanteSix[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 56a\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteSixa}{\BuildPatternCinquanteSixa[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 57\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteSept}{\BuildPatternCinquanteSept[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 58\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternCinquanteHuit}{\BuildPatternCinquanteHuit[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 59\endcsname{\BuildPatternCinquanteNeufa{\useKV[Pattern]{Base}}{\useKV[Pattern]{Basea}}}%
+\expandafter\def\csname BuildPattern at 60\endcsname{\BuildPatternSoixantea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 61\endcsname{Pattern 61 non reproduit.}%
+\expandafter\def\csname BuildPattern at 62\endcsname{Pattern 62 non reproduit.}%
+\expandafter\def\csname BuildPattern at 63\endcsname{Pattern 63 non reproduit.}%
+\expandafter\def\csname BuildPattern at 64\endcsname{Pattern 64 non reproduit.}%
+\expandafter\def\csname BuildPattern at 65\endcsname{Pattern 65 non reproduit.}%
+\expandafter\def\csname BuildPattern at 66\endcsname{\BuildPatternSoixanteSix}%
+\expandafter\def\csname BuildPattern at 67\endcsname{Pattern 67 non reproduit.}%
+\expandafter\def\csname BuildPattern at 68\endcsname{\BuildPatternSoixanteHuita{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 69\endcsname{\BuildPatternSoixanteNeufa{hexagonea}}%
+\expandafter\def\csname BuildPattern at 70\endcsname{Pattern 70 non reproduit.}%
+\expandafter\def\csname BuildPattern at 71\endcsname{Pattern 71 non reproduit.}%
+\expandafter\def\csname BuildPattern at 72\endcsname{\BuildPatternSoixanteDouzea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 73\endcsname{Pattern 73 non reproduit.}%
+\expandafter\def\csname BuildPattern at 74\endcsname{Pattern 74 non reproduit.}%
+\expandafter\def\csname BuildPattern at 75\endcsname{\BuildPatternSoixanteQuinzea{dot}}%
+\expandafter\def\csname BuildPattern at 76\endcsname{\BuildPatternSoixanteSeizea{dot}}%
+\expandafter\def\csname BuildPattern at 77\endcsname{\BuildPatternSoixanteDixSept}%
+\expandafter\def\csname BuildPattern at 77a\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternSoixanteDixSepta}{\BuildPatternSoixanteDixSepta[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 77b\endcsname{\BuildPatternSoixanteDixSeptb}%
+\expandafter\def\csname BuildPattern at 78\endcsname{\BuildPatternSoixanteDixHuit}%
+\expandafter\def\csname BuildPattern at 78a\endcsname{\ifemptyKV[Pattern]{Echelle}{\BuildPatternSoixanteDixHuita}{\BuildPatternSoixanteDixHuita[\useKV[Pattern]{Echelle}]}}%
+\expandafter\def\csname BuildPattern at 78b\endcsname{\BuildPatternSoixanteDixHuitb}%
+\expandafter\def\csname BuildPattern at 79\endcsname{\BuildPatternSoixanteDixNeuf}%
+\expandafter\def\csname BuildPattern at 80\endcsname{Pattern 80 non reproduit.}%
+\expandafter\def\csname BuildPattern at 81\endcsname{Pattern 81 non reproduit.}%
+\expandafter\def\csname BuildPattern at 82\endcsname{\BuildPatternQuatreVingtDeux}%
+\expandafter\def\csname BuildPattern at 83\endcsname{\BuildPatternQuatreVingtTrois}%
+\expandafter\def\csname BuildPattern at 84\endcsname{\BuildPatternQuatreVingtQuatre}%
+\expandafter\def\csname BuildPattern at 85\endcsname{\BuildPatternQuatreVingtCinq{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 86\endcsname{\BuildPatternQuatreVingtSix{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 87\endcsname{\BuildPatternQuatreVingtSept{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 88\endcsname{\BuildPatternQuatreVingtHuit{\useKV[Pattern]{Base}}}%
+%Ajout du 3/7/25
+\expandafter\def\csname BuildPattern at 89\endcsname{Pattern 89 non reproduit.}%
+\expandafter\def\csname BuildPattern at 90\endcsname{\BuildPatternQuatreVingtDix{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 91\endcsname{\BuildPatternQuatreVingtOnze{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 92\endcsname{\BuildPatternQuatreVingtDouze{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 93\endcsname{\BuildPatternQuatreVingtTreize{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 94\endcsname{\BuildPatternQuatreVingtQuatorze{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 95\endcsname{\BuildPatternQuatreVingtQuinze{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 95a\endcsname{\BuildPatternQuatreVingtQuinzea{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 96\endcsname{\BuildPatternQuatreVingtSeize{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 97\endcsname{\BuildPatternQuatreVingtDixSept{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 98\endcsname{\BuildPatternQuatreVingtDixHuit}%
+\expandafter\def\csname BuildPattern at 99\endcsname{\BuildPatternQuatreVingtDixNeuf}%
+\expandafter\def\csname BuildPattern at 99a\endcsname{\BuildPatternQuatreVingtDixNeufa}%
+\expandafter\def\csname BuildPattern at 100\endcsname{\BuildPatternCinquante}%
+\expandafter\def\csname BuildPattern at 101\endcsname{\BuildPatternCentUn{\useKV[Pattern]{Base}}}%
+%\expandafter\def\csname BuildPattern at 101*\endcsname{\BuildPatternCentUn*{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 102\endcsname{\BuildPatternCentDeux{\useKV[Pattern]{Base}}}%
+%\expandafter\def\csname BuildPattern at 102*\endcsname{\BuildPatternCentDeux*{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 103\endcsname{\BuildPatternCentTrois{\useKV[Pattern]{Base}}}%
+%\expandafter\def\csname BuildPattern at 103*\endcsname{\BuildPatternCentTrois*{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 104\endcsname{\BuildPatternCentQuatre{\useKV[Pattern]{Base}}}%
+%\expandafter\def\csname BuildPattern at 104*\endcsname{\BuildPatternCentQuatre*{\useKV[Pattern]{Base}}}%
+\expandafter\def\csname BuildPattern at 155\endcsname{\BuildPatternCentCinquanteCinq}%
+\expandafter\def\csname BuildPattern at 156\endcsname{\BuildPatternCentCinquanteSix}%
+\expandafter\def\csname BuildPattern at 254\endcsname{\BuildPatternDeuxCentCinquanteQuatre}%
+\expandafter\def\csname BuildPattern at 284\endcsname{\BuildPatternDeuxCentQuatreVingtQuatre}%
+\makeatother
+
+%\setsepchar{,}\ignoreemptyitems
+%\readlist\ListePattern{1,1a,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23}
+%\reademptyitems
+
+\def\BuildPatternCode{%
+  input PfCPattern;
+  %
+  u:=5mm;
+  %
+  Etape:=\useKV[Pattern]{Etape};
+  %
+  color CouleurFond;
+  \ifemptyKV[Pattern]{Couleur}{%
+    CouleurFond=LightSteelBlue;
+  }{%
+    CouleurFond=\useKV[Pattern]{Couleur};
+  }%
+  pair depla;
+  %
+  extra_endfig := "\ifemptyKV[Pattern]{Echelle}{}{picture Retiens;Retiens=currentpicture;currentpicture:=nullpicture;draw Retiens scaled \useKV[Pattern]{Echelle};}" & extra_endfig;
+}%
+%
+\def\BuildPatternCodeA#1{%
+  picture TestA;
+  if picture #1:
+    TestA=#1;
+  else:
+    TestA=image(label(TEX(#1),(0,0)););
+  fi;
+  if unknown larg:
+    larg:=(abs(lrcorner TestA-llcorner TestA));
+  fi;
+  if unknown haut:
+    haut:=(abs(urcorner TestA-lrcorner TestA));
+  fi;
+}%
+\def\BuildPatternCodeB{%
+  vardef AV=
+  save $; pair $;
+  $=Arela[rela-1]+u*(1,0);
+  $
+enddef;
+%
+vardef RE=
+  save $; pair $;
+  $=Arela[rela-1]+u*(-1,0);
+  $
+enddef;
+%
+vardef MO=
+  save $; pair $;
+  $=Arela[rela-1]+u*(0,1);
+  $
+enddef;
+%
+vardef DE=
+  save $; pair $;
+  $=Arela[rela-1]+u*(0,-1);
+  $
+enddef;
+%
+vardef polygonerela(text t)=
+  pair Arela[];
+  rela:=0;
+  for pliste=t:
+    rela:=rela+1;
+    if pair pliste:
+      Arela[rela]=pliste;
+    else:
+      Arela[rela]=scantokens(pliste);
+    fi;
+  endfor;
+  Arela[rela+1]:=Arela[1];
+  save $;path $;
+  $=Arela[1]--
+    for k=2 upto rela:
+      Arela[k]--
+    endfor
+  cycle;
+  $
+  enddef;
+  u:=5mm;
+  Etape:=\useKV[Pattern]{Etape};
+  path cc[];
+  trace grille(0.5) withcolor 0.8white;
+  color CouleurEtape,CouleurSol;
+  \ifemptyKV[Pattern]{Couleur}{CouleurEtape=Purple;}{CouleurEtape=\useKV[Pattern]{Couleur};}
+  \ifemptyKV[Pattern]{CouleurSolution}{CouleurSol=Evidence;}{CouleurSol=\useKV[Pattern]{CouleurSolution};}
+   %
+  extra_endfig := "\ifemptyKV[Pattern]{Echelle}{}{picture Retiens;Retiens=currentpicture;currentpicture:=nullpicture;draw Retiens scaled \useKV[Pattern]{Echelle};}" & extra_endfig;
+  }%
+\def\BuildPatternCodeC{%
+    u:=5mm;
+    pair Apat[],Cpat,Dpat;
+    %
+    vardef AffichageEtape(suffix pos)(expr nb,paspat,bpat,cpat)=
+      if nb<bpat:
+        label.pos(TEX("Étape "&decimal(nb+paspat)),cpat);
+      else:
+        if \useKV[Pattern]{Solution}:
+          label.pos(TEX("Étape "&decimal(nb+paspat)),cpat);
+        else:
+          label.pos(TEX("Étape "&decimal(nb+paspat)&" ?"),cpat);
+        fi;
+      fi;
+    enddef;
+    %
+  vardef AV=
+  save $; pair $;
+  $=Arela[rela-1]+u*(1,0);
+  $
+enddef;
+%
+vardef RE=
+  save $; pair $;
+  $=Arela[rela-1]+u*(-1,0);
+  $
+enddef;
+%
+vardef MO=
+  save $; pair $;
+  $=Arela[rela-1]+u*(0,1);
+  $
+enddef;
+%
+vardef DE=
+  save $; pair $;
+  $=Arela[rela-1]+u*(0,-1);
+  $
+enddef;
+%
+vardef polygonerela(text t)=
+  pair Arela[];
+  rela:=0;
+  for pliste=t:
+    rela:=rela+1;
+    if pair pliste:
+      Arela[rela]=pliste;
+    else:
+      Arela[rela]=scantokens(pliste);
+    fi;
+  endfor;
+  Arela[rela+1]:=Arela[1];
+  save $;path $;
+  $=Arela[1]--
+    for k=2 upto rela:
+      Arela[k]--
+    endfor
+  cycle;
+  $
+  enddef;
+  %
+  vardef GrillePattern=
+    Dpat=(urcorner currentpicture)+(u*(1,1));
+    currentpicture:=nullpicture;
+    k:=0;
+    forever:exitif xpart(k*(u,0))>xpart(Dpat);
+    trace ((0,0)--(0,ypart(Dpat))) shifted (k*(u,0)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+    k:=0;
+    forever:exitif ypart(k*(0,u))>ypart(Dpat);
+    trace ((0,0)--(xpart(Dpat),0)) shifted (k*(0,u)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+  enddef;
+  %
+  vardef AffichagePattern(expr patd,patf)=
+    for k=patd upto patf:
+      if k<patf:
+        fill cc[k] withcolor CouleurEtape withtransparency (1,0.35);
+        trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurEtape;
+      else:
+        if \useKV[Pattern]{Solution}:
+          fill cc[k] withcolor CouleurSol withtransparency (1,0.35);
+          trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurSol;
+        fi;
+      fi;
+    endfor;
+  enddef;
+  %
+  Etape:=\useKV[Pattern]{Etape};
+  path cc[];
+  color CouleurEtape,CouleurSol;
+  \ifemptyKV[Pattern]{Couleur}{CouleurEtape=Purple;}{CouleurEtape=\useKV[Pattern]{Couleur};}
+  \ifemptyKV[Pattern]{CouleurSolution}{CouleurSol=Evidence;}{CouleurSol=\useKV[Pattern]{CouleurSolution};}
+   %
+  extra_endfig := "\ifemptyKV[Pattern]{Echelle}{}{picture Retiens;Retiens=currentpicture;currentpicture:=nullpicture;draw Retiens scaled \useKV[Pattern]{Echelle};}" & extra_endfig;
+  }%
+\def\BuildPatternCodeIso{%
+  u:=2.5mm;
+  pair ptpattern[];
+    pair Apat,Bpat,Cpat,Dpat;
+    %
+    vardef GrillePatternIso=
+    coinbg:=(llcorner currentpicture)+(u*(-alpha,-0.5));
+    coinbd:=(lrcorner currentpicture)+(u*(alpha,-0.5));
+    coinhd:=(urcorner currentpicture)+(u*(alpha,0.5));
+    coinhg:=(ulcorner currentpicture)+(u*(-alpha,0.5));
+    currentpicture:=nullpicture;
+    k:=0;
+    forever:exitif ypart(k*(0,u))>ypart(coinhg);
+        trace ((coinbg+u*(-alpha,0))--(coinbg+u*(-alpha,0)+u*100*(alpha,0.5))) shifted (k*(0,u)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+    k:=0;
+    forever:exitif xpart(k*(u*alpha,0))>xpart(coinbd);
+    trace ((coinbg+u*(alpha,0))--(coinbg+u*(alpha,0)+u*100*(alpha,0.5))) shifted (k*(2*alpha*u,0)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+    k:=0;
+    forever:exitif ypart(k*(0,u))>ypart(coinhg);
+    trace ((coinbg+u*(alpha,0))--(coinbg+u*(alpha,0)+u*100*(alpha,-0.5))) shifted (k*(0,u)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+    k:=0;
+    forever:exitif xpart(k*(u*alpha,0))>xpart(2[coinbg,coinbd]);
+    trace ((coinbg+u*(-alpha,0))--(coinbg+u*(-alpha,0)+u*100*(-alpha,0.5))) shifted (k*(2*alpha*u,0)) withcolor 0.7white;
+    k:=k+1;
+    endfor;
+    %
+    clip currentpicture to polygone(coinbg,coinbd,coinhd,coinhg);
+  enddef;
+  %
+  vardef AffichagePattern(expr patd,patf)=
+    for k=patd upto patf:
+      if k<patf:
+         trace cc[k];
+      else:
+        if \useKV[Pattern]{Solution}:
+          trace cc[k];
+        fi;
+      fi;
+    endfor;
+  enddef;
+  %
+  Etape:=\useKV[Pattern]{Etape};
+  picture cc[];
+  color CouleurEtape,CouleurSol;
+  \ifemptyKV[Pattern]{Couleur}{CouleurEtape=Purple;}{CouleurEtape=\useKV[Pattern]{Couleur};}
+  \ifemptyKV[Pattern]{CouleurSolution}{CouleurSol=Evidence;}{CouleurSol=\useKV[Pattern]{CouleurSolution};}
+   % 
+   picture cadrecube,cadrecubesol,TypeCube;
+   pair A[];
+   alpha:=cosd(30);
+   beta:=sind(30);
+   A1=u*(0,2*(Etape+1)*beta);
+   A2-A1=u*(alpha,-beta);
+   A3-A2=u*(alpha,beta);
+   A4-A3=u*(0,2*beta);
+   A5-A4=u*(-alpha,beta);
+   A6-A5=u*(-alpha,-beta);
+   A7-A6=u*(alpha,-beta);
+   boolean Solution;
+   Solution=\useKV[Pattern]{Solution};
+   cadrecube=image(%
+     fill polygone(A1,A2,A3,A4,A5,A6) withcolor CouleurEtape;
+     drawoptions(withcolor 0.7white);
+     trace polygone(A1,A2,A3,A4,A5,A6);
+     trace A6--A7--A2;
+     trace A7--A4;
+     drawoptions();
+   );
+   cadrecubesol=image(%
+     fill polygone(A1,A2,A3,A4,A5,A6) withcolor CouleurSol;
+     drawoptions(withcolor 0.7white);
+     trace polygone(A1,A2,A3,A4,A5,A6);
+     trace A6--A7--A2;
+     trace A7--A4;
+     drawoptions();
+   );  
+   % 
+  extra_endfig := "\ifemptyKV[Pattern]{Echelle}{}{picture Retiens;Retiens=currentpicture;currentpicture:=nullpicture;draw Retiens scaled \useKV[Pattern]{Echelle};}" & extra_endfig;
+}%
+% 104
+\NewDocumentCommand\BuildPatternCentQuatre{m}{%
   \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+         cc[k]=polygonerela(Apat[k],"AV","AV","AV","MO","MO" for l=1 upto k:,"AV" endfor for l=0 upto 6+2*k:,"MO" endfor for l=0 upto 2+k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+(u*(2,0));
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+      \begin{mplibcode}%
+        \BuildPatternCode
+        ecartcube:=1pt;
+        \BuildPatternCodeA{#1}
+        for k=0 upto Etape+1:
+          for l=0 upto 2*Etape+6:
+            if ((l>2*Etape+4) and (k>2)):
+            else:
+              trace TestA shifted(k*larg,-l*haut);
+            fi;
+          endfor;
+        endfor;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 103
+\NewDocumentCommand\BuildPatternCentTrois{sm}{%
+  \ifluatex%
     \mplibforcehmode%
+    \IfBooleanTF{#1}{%
+      \edef\PfMRetiensEtape{\useKV[Pattern]{Etape}}%
+      \begin{Geometrie}[CoinHD={0.5*u*(3+0.5*((\PfMRetiensEtape+1) mod 2)+(4+4+\useKV[Pattern]{Etape}+1)*(\useKV[Pattern]{Etape}+1)/2,4+1+\useKV[Pattern]{Etape}+1)}]
+        \BuildPatternCodeB
+        pair A;
+        A=pp(1,1);
+        for k=0 upto Etape-1:
+        cc[k]=polygone(pp(0,0),pp(4+k,0),pp(4+k,4+k),pp(0,4+k)) shifted A;
+        fill cc[k] withcolor CouleurEtape withtransparency (1,0.25);
+        trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurEtape;
+        label.lrt(TEX("Étape "&decimal(k+1)),llcorner cc[k]);
+        A:=lrcorner cc[k]+pp(1,0);
+        endfor;
+        if \useKV[Pattern]{Solution}:
+        for k=Etape upto Etape:
+        cc[k]=polygone(pp(0,0),pp(4+k,0),pp(4+k,4+k),pp(0,4+k)) shifted A;
+        fill cc[k] withcolor CouleurSol withtransparency (1,0.25);
+        trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurSol;
+        label.lrt(TEX("Étape "&decimal(k+1)),llcorner cc[k]);
+        endfor;
+        else:
+        label.lrt(TEX("Étape "&decimal(Etape+1)&" ?"),A);
+        fi;
+      \end{Geometrie}
+    }{%
+      \begin{mplibcode}%
+        \BuildPatternCode
+        ecartcube:=1pt;
+        \BuildPatternCodeA{#2}
+        for k=0 upto Etape+2:
+          for l=0 upto Etape+2:
+            trace TestA shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 102
+\NewDocumentCommand\BuildPatternCentDeux{sm}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \IfBooleanTF{#1}{%
+      \edef\PfMRetiensEtape{\useKV[Pattern]{Etape}}%
+      \begin{Geometrie}[CoinHD={0.5*u*(4+0.5*((\PfMRetiensEtape+1) mod 2)+(2+\PfMRetiensEtape+1)*(\PfMRetiensEtape+1)/2,1+\useKV[Pattern]{Etape}+2)}]
+        \BuildPatternCodeB
+        pair A;
+        A=pp(4,1);
+        for k=0 upto Etape-1:
+          if k>0:
+            cc[k]=polygone(pp(0,0),pp(1+k,0),pp(1+k,k),pp(k,k),pp(k,k+1),pp(0,k+1)) shifted A;
+            fill cc[k] withcolor CouleurEtape withtransparency (1,0.35);
+            trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurEtape;
+            label.lrt(TEX("Étape "&decimal(k+1)),llcorner cc[k]);
+            A:=lrcorner cc[k]+pp(1,0);
+          else:
+            label.lrt(TEX("Étape "&decimal(k+1)),pp(1,1));
+            label.urt(TEX("Rien"),pp(1,1));
+          fi;
+        endfor;
+        if \useKV[Pattern]{Solution}:
+          for k=Etape upto Etape:
+            cc[k]=polygone(pp(0,0),pp(1+k,0),pp(1+k,k),pp(k,k),pp(k,k+1),pp(0,k+1)) shifted A;
+            fill cc[k] withcolor CouleurSol withtransparency (1,0.35);
+            trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurSol;
+            label.lrt(TEX("Étape "&decimal(k+1)),llcorner cc[k]);
+           endfor;
+        else:
+          label.lrt(TEX("Étape "&decimal(Etape+1)&" ?"),A);
+        fi;
+      \end{Geometrie}
+    }{%
+      \begin{mplibcode}%
+        \BuildPatternCode
+        ecartcube:=1pt;
+        \BuildPatternCodeA{#2}
+        for k=0 upto Etape-1:
+          for l=0 upto Etape-1:
+            if ((k=Etape-1) and (l=Etape-1)):
+            else:
+              trace TestA shifted(k*larg,l*haut);
+            fi;
+          endfor;
+        endfor;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 101
+\NewDocumentCommand\BuildPatternCentUn{sm}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \IfBooleanTF{#1}{%
+      \edef\PfMRetiensEtape{\useKV[Pattern]{Etape}}%
+      \edef\PfMLargeurQuad{\fpeval{1+\PfMRetiensEtape+(3+\PfMRetiensEtape+1+2)*(\PfMRetiensEtape+1)/2}}%
+      \begin{Geometrie}[CoinHD={0.5*u*(((\PfMLargeurQuad div 2)+1)*2,1+\PfMRetiensEtape+2+2)}]
+        \BuildPatternCodeB
+        pair A;
+        A=pp(1,1+\PfMRetiensEtape+3);
+        for k=0 upto Etape-1:
+          cc[k]=polygone(pp(0,3+k),pp(0,2+k),pp(3+k,2+k),pp(3+k,3+k),pp(2+k,3+k),pp(2+k,0),pp(3+k,0),pp(3+k,1),pp(0,1),pp(0,0),pp(1,0),pp(1,3+k)) shifted (A-pp(0,3+k));
+          fill cc[k] withcolor CouleurEtape withtransparency (1,0.35);
+          trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurEtape;
+          label.urt(TEX("Étape "&decimal(k+1)),ulcorner cc[k]);
+          A:=urcorner cc[k]+pp(1,0);
+        endfor;
+        if \useKV[Pattern]{Solution}:
+          for k=Etape upto Etape:
+            cc[k]=polygone(pp(0,3+k),pp(0,2+k),pp(3+k,2+k),pp(3+k,3+k),pp(2+k,3+k),pp(2+k,0),pp(3+k,0),pp(3+k,1),pp(0,1),pp(0,0),pp(1,0),pp(1,3+k)) shifted (A-pp(0,3+k));
+            fill cc[k] withcolor CouleurSol withtransparency (1,0.35);
+            trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurSol;
+            label.urt(TEX("Étape "&decimal(k+1)),ulcorner cc[k]);
+           endfor;
+        else:
+          label.lrt(TEX("Étape "&decimal(Etape+1)&" ?"),A+pp(0,1));
+        fi;
+      \end{Geometrie}
+    }{%
+      \begin{mplibcode}%
+        \BuildPatternCode
+        ecartcube:=2pt;
+        \BuildPatternCodeA{#2}
+        for k=0 upto Etape-1:
+          for l=0 upto Etape-1:
+            trace TestA shifted(l*larg,k*haut);
+          endfor;
+        endfor;
+        trace TestA shifted(-larg,-haut);
+        trace TestA shifted(Etape*larg,-haut);
+        trace TestA shifted(Etape*larg,Etape*haut);
+        trace TestA shifted(-larg,Etape*haut);
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 99a
+\NewDocumentCommand\BuildPatternQuatreVingtDixNeufa{}{%
+  \ifluatex%
+    \mplibforcehmode
     \begin{mplibcode}
+      Etape=\useKV[Pattern]{Etape};
+      %
+      input PfCLego;
+      %
+      \ifemptyKV[Pattern]{Echelle}{magnification:=0.25;}{%
+        magnification:=\useKV[Pattern]{Echelle};
+      }
+      lego_unit        :=magnification*0.8cm; % official
+      lego_height      :=1.2lego_unit;        % official
+      lego_plate_height:=0.4lego_unit;        % official
+      lego_thickness   :=1/6lego_unit;
+      lego_eps         :=1/20lego_unit;
+      lego_overshoot   :=lego_plate_height-lego_thickness;%0.2133lego_unit;
+      lego_diam        :=lego_unit-2lego_thickness;
+      lego_Diam        :=(sqrt 2)*lego_unit-lego_diam;
+      %
+      color CouleurBrique,CouleurBriqueA;
+      \ifemptyKV[Pattern]{Couleur}{CouleurBrique=LightSteelBlue;}{CouleurBrique=\useKV[Pattern]{Couleur};}%
+      %
+      Longueur=2;
+      Largeur=2;
+      %
+      euler(-20,10,15);
+      for k=Etape downto 1:
+        w:=k mod 2;
+        for l=-k+1 upto k-1:
+          TR:=(Longueur*l,0,1-k);
+          if (l mod 2)=w:CouleurBriqueA:=Cornsilk else: CouleurBriqueA:=CouleurBrique fi;
+          Lego_box(Longueur,Largeur,CouleurBriqueA);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%99
+\NewDocumentCommand\BuildPatternQuatreVingtDixNeuf{}{%
+  \ifluatex%
+    \mplibforcehmode
+    \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-           
+
       intensite:=1.5;
       Ferme[0]:=false;
-      outcolor:=LightSteelBlue;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
       incolor:=white;
       nb:=1;subh:=1;
-      creux:=true;
-           
-      Initialisation(2500,40,20,50);
+      creux:=false;
+
+      Initialisation(2500,30,20,50);
       Objetcube1("a=0.25");
       nbobj:=1;
-      TR:=(0,a,0);
-      %base
-      for k=1 upto 2:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+      for k=2 upto Etape:
+        for l=-k+1 upto k-1:
+          TR:=a*(0,l,1-k);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
       endfor;
-      % barre gauche
+      DessineFusion;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 98
+\NewDocumentCommand\BuildPatternQuatreVingtDixHuit{}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      Etape=\useKV[Pattern]{Etape};
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.7white;}{CouleurFond=\useKV[Pattern]{Couleur};}
+      u:=5mm;
+      pair M[],A,B;
+      path cc[];
+      A=(0,0);
+      B-A=u*(4,0);
       for k=1 upto Etape:
-      TR:=(0,0,k*a);
-      NBobj:=1;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+        for l=1 step 2 until (2**k-1):
+        M[l]:=(l/(2**k))[A,B];
+        cc[l]:=cercles(M[l],abs(A-B)/(2**k));
+        if (k mod 2)=1:
+        fill cc[l] withcolor CouleurFond;
+        else:
+        fill cc[l] withcolor white;
+        fi;
+        trace cc[l];
+        endfor;
       endfor;
-      %barre gauche
-      for k=1 upto Etape-1:
-      TR:=(0,2*a,k*a);
-      NBobj:=1;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 97
+\NewDocumentCommand\BuildPatternQuatreVingtDixSept{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto (2**Etape-1):
+        trace TestA shifted(0,k*haut);
       endfor;
-      DessineFusion;
-    \end{mplibcode}
-  \fi
+      for k=0 upto 2:
+      trace TestA shifted(larg,k*haut);
+      endfor;
+      for k=0 upto Etape-1:
+        trace TestA shifted(2*larg,k*haut);
+      endfor;
+    \end{mplibcode}%
+  \fi%
 }%
 
-% 254
-\NewDocumentCommand\BuildPatternDeuxCentCinquanteQuatre{}{
+% 96
+\NewDocumentCommand\BuildPatternQuatreVingtSeize{m}{%
   \ifluatex%
     \mplibforcehmode%
-    \begin{mplibcode}
-      Etape:=\useKV[Pattern]{Etape};
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape+1:
+        trace TestA shifted(0,k*haut);
+      endfor;
+      for k=1 upto Etape:
+        for l=0 upto 1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+      for k=0 upto Etape+1:
+        trace TestA shifted((Etape+1)*larg,(1-k)*haut);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 95a
+\NewDocumentCommand\BuildPatternQuatreVingtQuinzea{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape:
+        trace TestA shifted(0,k*haut);
+      endfor;
+      for k=0 upto Etape:
+        trace TestA shifted(2*larg,k*haut);
+      endfor;
+      for k=0 upto Etape:
+        trace TestA shifted(larg,(k+Etape)*haut);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 95
+\NewDocumentCommand\BuildPatternQuatreVingtQuinze{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto 2*Etape-1:
+        trace TestA shifted(0,k*haut);
+      endfor;
+      for k=0 upto 2*Etape-1:
+        trace TestA shifted(2*larg,k*haut);
+      endfor;
+      for k=0 upto Etape:
+        trace TestA shifted(larg,(k+2*Etape-1)*haut);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 94
+\NewDocumentCommand\BuildPatternQuatreVingtQuatorze{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
       for k=0 upto Etape-1:
-      for l=0 upto Etape-1:
-      fill ((fullcircle scaled 4mm) shifted (5mm*(l,k))) withcolor LightSteelBlue;
-      trace ((fullcircle scaled 4mm) shifted (5mm*(l,k)));
+        for l=Etape-1 downto k:
+          trace TestA shifted((Etape-1-l)*larg,k*haut);
+        endfor;
       endfor;
+      trace TestA shifted(-larg,0);
+      trace TestA shifted(Etape*larg,0);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 93
+\NewDocumentCommand\BuildPatternQuatreVingtTreize{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape-1:
+        for l=0 upto 2*Etape+1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
       endfor;
-      fill ((fullcircle scaled 4mm) shifted (5mm*(0,-1))) withcolor LightSteelBlue;
-      trace ((fullcircle scaled 4mm) shifted (5mm*(0,-1)));
-      fill ((fullcircle scaled 4mm) shifted (5mm*(-1,0))) withcolor LightSteelBlue;
-      trace ((fullcircle scaled 4mm) shifted (5mm*(-1,0)));
-      fill ((fullcircle scaled 4mm) shifted (5mm*(0,Etape))) withcolor LightSteelBlue;
-      trace ((fullcircle scaled 4mm) shifted (5mm*(0,Etape)));
-    \end{mplibcode}
-  \fi
+      trace TestA shifted(-larg,haut);
+      trace TestA shifted(Etape*larg,haut);
+    \end{mplibcode}%
+  \fi%
 }%
 
-%156
-\NewDocumentCommand\BuildPatternCentCinquanteSix{}{
+%92
+\NewDocumentCommand\BuildPatternQuatreVingtDouze{m}{%
   \ifluatex%
     \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=1pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          if ((k=Etape-1) and (l>Etape-3)) or ((l=Etape-1) and (k>0)):
+          else:
+           trace TestA shifted(k*larg,l*haut);
+         fi;
+       endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%91
+\NewDocumentCommand\BuildPatternQuatreVingtOnze{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape-1:
+        trace TestA shifted(k*larg,0);
+      endfor;
+      for k=Etape upto 2*Etape:
+        for l=0 upto Etape:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+      for k=0 upto Etape:
+        trace TestA shifted((2*Etape+1+k)*larg,Etape*haut);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%90
+\NewDocumentCommand\BuildPatternQuatreVingtDix{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0;
+      \BuildPatternCodeA{#1}
+      for k=0 downto -2:
+        trace TestA shifted (0,2*k*haut);
+      endfor;
+      for k=1 upto Etape:
+        for l=0 downto -1:
+          trace TestA shifted ((2*k-1)*larg,(2*l-1)*haut);
+        endfor;
+        for l=0 downto -2:
+          trace TestA shifted ((2*k*larg,2*l*haut));
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%88
+\NewDocumentCommand\BuildPatternQuatreVingtHuit{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape:
+        for l=0 upto Etape-1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%87
+\NewDocumentCommand\BuildPatternQuatreVingtSept{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for k=1 upto 3*(Etape-1):
+        trace TestA shifted((k-1)*(larg,0));
+      endfor;
+      for k=1 upto Etape-1:
+        for l=1 upto 3*(Etape-1)-k:
+          trace TestA shifted((l-1)*larg,k*haut);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%86
+\NewDocumentCommand\BuildPatternQuatreVingtSix{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape+1:
+        for l=0 upto Etape+1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+      for k=0 upto Etape:
+        for l=0 upto Etape:
+          trace TestA shifted((3+k)*larg,(3+l)*haut);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%85
+\NewDocumentCommand\BuildPatternQuatreVingtCinq{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape:
+        for l=0 upto Etape:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          trace TestA shifted((k+Etape)*larg,(l+Etape)*haut);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 84
+\NewDocumentCommand\BuildPatternQuatreVingtQuatre{}{%
+  \ifluatex%
+    \mplibforcehmode
     \begin{mplibcode}
+      Etape=\useKV[Pattern]{Etape};
+      %
+      input PfCLego;
+      %
+      \ifemptyKV[Pattern]{Echelle}{magnification:=0.25;}{%
+        magnification:=\useKV[Pattern]{Echelle};
+      }
+      lego_unit        :=magnification*0.8cm; % official
+      lego_height      :=1.2lego_unit;        % official
+      lego_plate_height:=0.4lego_unit;        % official
+      lego_thickness   :=1/6lego_unit;
+      lego_eps         :=1/20lego_unit;
+      lego_overshoot   :=lego_plate_height-lego_thickness;%0.2133lego_unit;
+      lego_diam        :=lego_unit-2lego_thickness;
+      lego_Diam        :=(sqrt 2)*lego_unit-lego_diam;
+      %
+      color CouleurBrique,CouleurBriqueA;
+      \ifemptyKV[Pattern]{Couleur}{CouleurBrique=LightSteelBlue;}{CouleurBrique=\useKV[Pattern]{Couleur};}%
+      %
+      Longueur=2;
+      Largeur=4;
+      %
+      euler(-20,10,15);
+      Lego_box(Longueur,Largeur,CouleurBrique);
+      for k=2 upto Etape:
+        if (k mod 2)=0:CouleurBriqueA:=Cornsilk else: CouleurBriqueA:=CouleurBrique fi;
+        TR:=(-k+1,0,k-1);
+        Lego_box(Longueur,Largeur,CouleurBriqueA);
+        TR:=(k-1,0,k-1);
+        Lego_box(Longueur,Largeur,CouleurBriqueA);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 83
+\NewDocumentCommand\BuildPatternQuatreVingtTrois{}{%
+  \ifluatex%
+    \mplibforcehmode
+    \begin{mplibcode}
+      Etape=\useKV[Pattern]{Etape};
+      %
+      input PfCLego;
+      %
+      \ifemptyKV[Pattern]{Echelle}{magnification:=0.25;}{%
+        magnification:=\useKV[Pattern]{Echelle};
+      }%
+      lego_unit        :=magnification*0.8cm; % official
+      lego_height      :=1.2lego_unit;        % official
+      lego_plate_height:=0.4lego_unit;        % official
+      lego_thickness   :=1/6lego_unit;
+      lego_eps         :=1/20lego_unit;
+      lego_overshoot   :=lego_plate_height-lego_thickness;%0.2133lego_unit;
+      lego_diam        :=lego_unit-2lego_thickness;
+      lego_Diam        :=(sqrt 2)*lego_unit-lego_diam;
+      %
+      color CouleurBrique,CouleurBriqueA;
+      \ifemptyKV[Pattern]{Couleur}{CouleurBrique=LightSteelBlue;}{CouleurBrique=\useKV[Pattern]{Couleur};}%
+      %
+      Longueur=2;
+      Largeur=4;
+      Longueura=4;
+      Largeura=2;
+%      %
+      euler(22,0,0);
+      for k=1 upto Etape:
+        if (k mod 2)=0:CouleurBriqueA:=Cornsilk else: CouleurBriqueA:=CouleurBrique fi;
+        TR:=(-2,1,2*(k-1));
+        Lego_box(Longueur,Largeur,CouleurBriqueA);
+        TR:=(2,1,2*(k-1));
+        Lego_box(Longueur,Largeur,CouleurBriqueA);
+        TR:=(0,0,2*k-1);
+        Lego_box(Longueura,Largeura,CouleurBriqueA);
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+%82
+\NewDocumentCommand\BuildPatternQuatreVingtDeux{}{%
+  \ifluatex%
+    \mplibforcehmode
+    \begin{mplibcode}
+      Etape=\useKV[Pattern]{Etape};
+
+      input PfCLego;
+      %
+      \ifemptyKV[Pattern]{Echelle}{magnification:=0.25;}{%
+        magnification:=\useKV[Pattern]{Echelle};
+      }%
+      lego_unit        :=magnification*0.8cm; % official
+      lego_height      :=1.2lego_unit;        % official
+      lego_plate_height:=0.4lego_unit;        % official
+      lego_thickness   :=1/6lego_unit;
+      lego_eps         :=1/20lego_unit;
+      lego_overshoot   :=lego_plate_height-lego_thickness;%0.2133lego_unit;
+      lego_diam        :=lego_unit-2lego_thickness;
+      lego_Diam        :=(sqrt 2)*lego_unit-lego_diam;
+      %
+      color CouleurBrique;
+      \ifemptyKV[Pattern]{Couleur}{CouleurBrique=LightSteelBlue;}{CouleurBrique=\useKV[Pattern]{Couleur};}%
+      %
+      Longueur=2;
+      Largeura=4;
+%      %
+      euler(-30,10,0);
+      for k=Etape downto 2:
+        TR:=(-k+1,0,-k+1);
+        Lego_box(Longueur,Largeura,CouleurBrique);
+        TR:=(k-1,0,-k+1);
+        Lego_box(Longueur,Largeura,CouleurBrique);
+      endfor;
+      TR:=(0,0,0);
+      Lego_box(Longueur,Largeura,CouleurBrique);
+    \end{mplibcode}%
+  \fi%
+}%
+
+%79
+\NewDocumentCommand\BuildPatternSoixanteDixNeuf{}{%
+  \ifluatex%
+    \mplibforcehmode
+    \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-           
+
       intensite:=1.5;
       Ferme[0]:=false;
-      outcolor:=LightSteelBlue;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
       incolor:=white;
       nb:=1;subh:=1;
-      creux:=true;
-           
-      Initialisation(2500,40,20,50);
+      creux:=false;
+
+      Initialisation(2500,30,20,50);
       Objetcube1("a=0.25");
       nbobj:=1;
-      TR:=(0,a,0);
+      Pro:=-1;
+      for k=2 upto Etape:
+        for l=0 upto k-1:
+          for p=0 upto k-1:
+            for q=0 upto k-1:
+              TR:=a*(l,p,Pro-q);
+              nbobj:=nbobj+1;
+              ObjetDeplacement[nbobj](1);
+            endfor;
+          endfor;
+        endfor;
+        Pro:=Pro-k;
+      endfor;
+      DessineFusion;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 78b
+\NewDocumentCommand\BuildPatternSoixanteDixHuitb{O{1}}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=2+Etape;
+      HautMax=3;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      picture debut;
+      debut=image(
+      trace dot;
+      trace dot shifted(u*(1,1));
+      trace dot shifted(u*(0,-1));
+      trace dot shifted(u*(1,-2));
+      trace dot shifted(u*(0,-1));
+      trace dot shifted(u*(1,0));
+      trace dot shifted(u*(1,-1));
+      );
+      trace debut;
+      trace symetrie(debut,(0,0),(0,1)) shifted(u*(Etape+1,0));
+      %verticales
       for k=1 upto Etape:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+      trace dot shifted(u*((1,1)+(k-1)*(1,0)));
+      trace dot shifted(u*((1,0)+(k-1)*(1,0)));
+      trace dot shifted(u*((1,-1)+(k-1)*(1,0)));
+      trace dot shifted(u*((1,-2)+(k-1)*(1,0)));
       endfor;
-      TR:=(0,0,-0.25);
+      drawoptions();
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 78a
+\NewDocumentCommand\BuildPatternSoixanteDixHuita{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      LargMax=2+Etape;
+      HautMax=3;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      picture debut;
+      debut=image(
+      trace Allu(0.10[(0,0),u*(1,1)],0.90[(0,0),u*(1,1)]);
+      trace Allu(0.10[u*(0,-1),u*(1,-2)],0.90[u*(0,-1),u*(1,-2)]);
+      trace Allu(0.10[(0,0),u*(0,-1)],0.90[(0,0),u*(0,-1)]);
+      trace Allu(0.10[(0,0),u*(1,0)],0.90[(0,0),u*(1,0)]);
+      trace Allu(0.10[u*(0,-1),u*(1,-1)],0.90[u*(0,-1),u*(1,-1)]);
+      );
+      trace debut;
+      trace symetrie(debut,(0,0),(0,1)) shifted(u*(Etape+1,0));
+      %verticales
       for k=1 upto Etape:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+        trace Allu(0.10[u*(1,1),u*(1,0)],0.90[u*(1,1),u*(1,0)]) shifted(u*(k-1)*(1,0));
+        trace Allu(0.10[u*(1,0),u*(1,-1)],0.90[u*(1,0),u*(1,-1)]) shifted(u*(k-1)*(1,0));
+        trace Allu(0.10[u*(1,-1),u*(1,-2)],0.90[u*(1,-1),u*(1,-2)]) shifted(u*(k-1)*(1,0));
       endfor;
-      TR:=(0,0.25,0);
+      %horizontales
+      for k=1 upto Etape-1:
+        trace Allu(0.10[u*(k,1),u*(k+1,1)],0.90[u*(k,1),u*(k+1,1)]);
+        trace Allu(0.10[u*(k,0),u*(k+1,0)],0.90[u*(k,0),u*(k+1,0)]);
+        trace Allu(0.10[u*(k,-1),u*(k+1,-1)],0.90[u*(k,-1),u*(k+1,-1)]);
+        trace Allu(0.10[u*(k,-2),u*(k+1,-2)],0.90[u*(k,-2),u*(k+1,-2)]);
+      endfor;
+      drawoptions();
+      \end{Allumettes}
+  \fi%
+}%
+
+% 78
+\NewDocumentCommand\BuildPatternSoixanteDixHuit{O{1}}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=2+Etape;
+      HautMax=3;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      picture debut;
+      debut=image(
+      trace 0.15[(0,0),u*(1,1)]--0.85[(0,0),u*(1,1)];
+      trace 0.15[u*(0,-1),u*(1,-2)]--0.85[u*(0,-1),u*(1,-2)];
+      trace 0.15[(0,0),u*(0,-1)]--0.85[(0,0),u*(0,-1)];
+      trace 0.15[(0,0),u*(1,0)]--0.85[(0,0),u*(1,0)];
+      trace 0.15[u*(0,-1),u*(1,-1)]--0.85[u*(0,-1),u*(1,-1)];
+      );
+      trace debut;
+      trace symetrie(debut,(0,0),(0,1)) shifted(u*(Etape+1,0));
+      %verticales
       for k=1 upto Etape:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+        trace (0.15[u*(1,1),u*(1,0)]--0.85[u*(1,1),u*(1,0)]) shifted(u*(k-1)*(1,0));
+        trace (0.15[u*(1,0),u*(1,-1)]--0.85[u*(1,0),u*(1,-1)]) shifted(u*(k-1)*(1,0));
+        trace (0.15[u*(1,-1),u*(1,-2)]--0.85[u*(1,-1),u*(1,-2)]) shifted(u*(k-1)*(1,0));
       endfor;
-      %nbobj=4;
-      DessineFusion;
-    \end{mplibcode}
-  \fi
+      %horizontales
+      for k=1 upto Etape-1:
+        trace (0.15[u*(k,1),u*(k+1,1)]--0.85[u*(k,1),u*(k+1,1)]);
+        trace (0.15[u*(k,0),u*(k+1,0)]--0.85[u*(k,0),u*(k+1,0)]);
+        trace (0.15[u*(k,-1),u*(k+1,-1)]--0.85[u*(k,-1),u*(k+1,-1)]);
+        trace (0.15[u*(k,-2),u*(k+1,-2)]--0.85[u*(k,-2),u*(k+1,-2)]);
+      endfor;
+      drawoptions();
+    \end{mplibcode}%
+  \fi%
 }%
 
-%155
-\NewDocumentCommand\BuildPatternCentCinquanteCinq{}{
+% 77b
+\NewDocumentCommand\BuildPatternSoixanteDixSeptb{}{%
   \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=2+Etape;
+      HautMax=2+Etape-1;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      for k=0 upto Etape-1:
+        pair K;
+        K=u*(1+k/2,-k/2);
+        picture quart;
+        quart=image(
+        trace dot;
+        trace dot shifted(u*(1,1));
+        for l=1 upto k:
+        trace dot shifted(u*(0,-l+1));
+        trace dot shifted(u*(0,-l));
+        endfor;
+        );
+        trace rotation(quart,K,0);
+        trace rotation(quart,K,90);
+        trace rotation(quart,K,180);
+        trace rotation(quart,K,-90);
+      endfor;
+      drawoptions();
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 77a
+\NewDocumentCommand\BuildPatternSoixanteDixSepta{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      LargMax=2+Etape;
+      HautMax=2+Etape-1;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      for k=0 upto Etape-1:
+        pair K;
+        K=u*(1+k/2,-k/2);
+        picture quart;
+        quart=image(
+          trace Allu(0.15[(0,0),u*(1,1)],0.85[(0,0),u*(1,1)]);
+          for l=1 upto k:
+            trace Allu(0.15[u*(0,-l+1),u*(0,-l)],0.85[u*(0,-l+1),u*(0,-l)]);
+          endfor;
+          );
+        trace rotation(quart,K,0);
+        trace rotation(quart,K,90);
+        trace rotation(quart,K,180);
+        trace rotation(quart,K,-90);
+      endfor;
+      drawoptions();
+    \end{Allumettes}%
+  \fi%
+}%
+
+% 77
+\NewDocumentCommand\BuildPatternSoixanteDixSept{O{1}}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=2+Etape;
+      HautMax=2+Etape-1;
+      for k=-1 upto LargMax:
+        trace (u*(0,2)--u*(0,-HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=2 downto -HautMax:
+        trace (u*(-1,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      drawoptions(withpen pencircle scaled 1.1);
+      for k=0 upto Etape-1:
+        pair K;
+        K=u*(1+k/2,-k/2);
+        picture quart;
+        quart=image(
+          trace 0.15[(0,0),u*(1,1)]--0.85[(0,0),u*(1,1)];
+          for l=1 upto k:
+            trace 0.15[u*(0,-l+1),u*(0,-l)]--0.85[u*(0,-l+1),u*(0,-l)];
+          endfor;
+          );
+        trace rotation(quart,K,0);
+        trace rotation(quart,K,90);
+        trace rotation(quart,K,180);
+        trace rotation(quart,K,-90);
+      endfor;
+      drawoptions();
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 76
+\NewDocumentCommand\BuildPatternSoixanteSeizea{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=4+Etape;
+      HautMax=2*(Etape+1);
+      for k=0 upto LargMax:
+        trace ((0,0)--u*(0,HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=0 upto HautMax:
+        trace ((0,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      for k=1 upto Etape+2:
+        for l=1 upto Etape+1:
+        trace dot shifted(u*(k,l));
+        endfor;
+      endfor;
+      for l=1 upto Etape:
+      for k=l+1 upto Etape+2:
+        trace dot shifted(u*(k,Etape+l+1));
+      endfor;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 75
+\NewDocumentCommand\BuildPatternSoixanteQuinzea{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      LargMax=4+2*(Etape-1);
+      HautMax=2+Etape;
+      for k=0 upto LargMax:
+        trace ((0,0)--u*(0,HautMax)) shifted(u*(k,0)) withcolor 0.7white;
+      endfor;
+      for k=0 upto HautMax:
+        trace ((0,0)--u*(LargMax,0)) shifted(u*(0,k)) withcolor 0.7white;
+      endfor;
+      trace dot shifted(u*(LargMax div 2,HautMax-1));
+      for k=0 upto 2:
+        trace dot shifted(u*((LargMax div 2)-1+k,HautMax-2));
+      endfor;
+      for k=2 upto Etape:
+        trace dot shifted(u*((LargMax div 2)-k,HautMax-k-1));
+        trace dot shifted(u*((LargMax div 2)-k+1,HautMax-k-1));
+        trace dot shifted(u*((LargMax div 2)+k-1,HautMax-k-1));
+        trace dot shifted(u*((LargMax div 2)+k,HautMax-k-1));
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 72
+\NewDocumentCommand\BuildPatternSoixanteDouzea{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      if picture #1:
+        CouleurFond:=white;
+        for k=0 upto 4*Etape:
+          for l=0 upto 4*Etape:
+            depla:=(k*larg,l*haut);
+            trace #1 shifted depla;
+          endfor;
+        endfor;
+        \ifemptyKV[Pattern]{Couleur}{%
+          CouleurFond:=Orange;
+        }{%
+          CouleurFond:=\useKV[Pattern]{Couleur};
+        }%
+        for k=0 upto Etape-1:
+          for l=0 upto Etape-1:
+          trace #1 shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+        for k=3*Etape+1 upto 4*Etape:
+          for l=0 upto Etape-1:
+            trace #1 shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+        for k=0 upto Etape-1:
+          for l=3*Etape+1 upto 4*Etape:
+            trace #1 shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+        for k=3*Etape+1 upto 4*Etape:
+          for l=3*Etape+1 upto 4*Etape:
+            trace #1 shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+        for k=Etape upto 3*Etape:
+          for l=Etape upto 3*Etape:
+            trace #1 shifted(k*larg,l*haut);
+          endfor;
+        endfor;
+      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 69
+\NewDocumentCommand\BuildPatternSoixanteNeufa{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      if picture #1:
+        for k=0 upto Etape-1:
+          for l=0 upto Etape-1:
+            depla:=(k*larg,l*haut);
+            trace #1 shifted depla;
+          endfor;
+        endfor;
+        for k=0 upto (Etape div 2)-1:
+          trace #1 shifted(Etape*larg,k*haut);
+        endfor;
+        if Etape mod 2=1:
+          trace demihexagonea  shifted(Etape*larg,(Etape div 2)*haut);
+        fi;
+      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+%68
+\NewDocumentCommand\BuildPatternSoixanteHuita{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k+1:,"AV" endfor,"MO","MO" if k>0:for l=1 upto k:,"MO" endfor for l=0 upto k+1:,"RE" endfor for l=1 upto k:,"DE" endfor for l=0 upto k:,"AV" endfor else:,"RE" fi,"DE" for l=1 upto k+1:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape);
+        for k=0 upto Etape:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=1pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for k=1 upto Etape:
+        trace TestA shifted(-k*larg,0);
+        trace TestA shifted(0,k*haut);
+      endfor;
+      for p=1 upto Etape-1:
+        for l=2 upto Etape+1:
+          depla:=((1-l)*larg,(1+p)*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+%66
+\NewDocumentCommand\BuildPatternSoixanteSix{}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeIso
+        somme:=1;
+        for nbe=1 upto Etape+1:
+          ptpattern[nbe]:=u*(alpha*somme,(somme mod 2)*0.5);
+          if nbe=Etape+1:
+            TypeCube:=cadrecubesol;
+          else:
+            TypeCube:=cadrecube;
+          fi;
+          cc[nbe]=image(
+          for k=0 upto 1:
+            trace TypeCube shifted(ptpattern[nbe]+k*u*(alpha,-0.5)+u*(0,-1));%bas droite
+          endfor;
+          for l=1 upto 3:
+            for k=l upto nbe+1:%
+                  trace TypeCube shifted(ptpattern[nbe]+k*u*(alpha,-0.5)+(l-1)*u*(0,1));%bas droite
+                endfor;
+            endfor;
+          );
+          trace cc[nbe];
+          somme:=somme+2*nbe+1+3;
+        endfor;
+        GrillePatternIso;
+        AffichagePattern(1,Etape+1);
+      \end{Geometrie}
+    }{%
     \mplibforcehmode
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-      
+
       intensite:=1.5;
       Ferme[0]:=false;
-      outcolor:=LightSteelBlue;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-      
-      Initialisation(2500,40,20,50);
-      angx:=-40;
+
+      Initialisation(2500,30,20,50);
       Objetcube1("a=0.25");
-      angx:=0;
       nbobj:=1;
-      TR:=(0,a*cosd(-40),a*sind(-40));
-      for k=0 upto Etape-2:
-      NBobj:=nbobj;
       nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+      TR:=a*(0,1,0);
+      ObjetDeplacement[nbobj](1);
+      for l=1 upto 3:
+      for k=1 upto Etape+2-l:
+          TR:=a*(0,k+l-1,l);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
       endfor;
-      NBobj:=1;
-      TR:=(0,-a*cosd(-40),-a*sind(-40));
-      for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+      DessineFusion;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+%60
+\NewDocumentCommand\BuildPatternSoixantea{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto k:,"MO" endfor ,"RE" for l=0 upto k:,"DE" endfor for l=1 upto k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape);
+        for k=0 upto Etape:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=1pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
       endfor;
-      NBobj:=1;
-      TR:=(0,a*sind(-40),-a*cosd(-40));
-      for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+      for l=0 upto Etape-1:
+        depla:=(Etape-1)*(larg,haut)+l*(0,haut);
+        trace TestA shifted depla;
       endfor;
-      NBobj:=1;
-      TR:=(0,-a*sind(-40),a*cosd(-40));
-      for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+%59
+\NewDocumentCommand\BuildPatternCinquanteNeufa{mm}{%
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}
+    \BuildPatternCode
+    bboxmargin:=0pt;
+    if picture #1:
+      trace #1;
+    else:
+      label(TEX(#1),(0,0));
+    fi;
+    if picture #2:
+      trace #2;
+    else:
+      label(TEX(#2),(0,0));
+    fi;
+    Largeur:=abs(lrcorner currentpicture-llcorner currentpicture);
+    Hauteur:=abs(urcorner currentpicture-lrcorner currentpicture);
+    currentpicture:=nullpicture;
+    depla:=(0,0);
+    if picture #1:
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          trace #1 shifted ((k*Largeur,l*Hauteur));
+        endfor;
       endfor;
-      NBobj:=1;
-      TR:=(a,0,0);%
+    else:
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          label(TEX(#1),(k*Largeur,l*Hauteur));
+        endfor;
+      endfor;
+    fi;
+    if picture #2:
+      for k=-1 upto Etape:
+        trace #2 shifted ((k*Largeur,-Hauteur));
+        trace #2 shifted ((k*Largeur,Etape*Hauteur));
+      endfor;
+      for k=-1 upto Etape:
+        trace #2 shifted ((-Largeur,k*Hauteur));
+        trace #2 shifted ((Etape*Largeur,k*Hauteur));
+      endfor;
+    else:
+      for k=-1 upto Etape:
+        label(TEX(#2),(k*Largeur,-Hauteur));
+        label(TEX(#2),(k*Largeur,Etape*Hauteur));
+      endfor;
+      for k=-1 upto Etape:
+        label(TEX(#2),(-Largeur,k*Hauteur));
+        label(TEX(#2),(Etape*Largeur,k*Hauteur));
+      endfor;
+    fi;
+  \end{mplibcode}
+  \fi%
+}%
+
+%58
+\NewDocumentCommand\BuildPatternCinquanteHuit{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[];
+      A0=(0,0);
+      A1-A0=u*(1,0);
+      A2=rotation(A0,A1,-108);
+      A3=rotation(A1,A2,-108);
+      A4=rotation(A2,A3,-108);
+      picture TriEquiA,TriEquiB;
+      TriEquiA=image(
+      trace Allu(A0,A1);
+      trace Allu(A1,A2);
+      trace Allu(A2,A3);
+      trace Allu(A3,A4);
+      trace Allu(A4,A0);
+      );
+      TriEquiB=image(
+      trace Allu(A1,symetrie(A0,A1,A2));
+      trace Allu(symetrie(A0,A1,A2),symetrie(A4,A1,A2));
+      trace Allu(symetrie(A4,A1,A2),symetrie(A3,A1,A2));
+      trace Allu(symetrie(A3,A1,A2),A2);
+      );
+      for k=0 upto Etape-1:
+        if (k mod 2)=0:
+          trace TriEquiA shifted((k div 2)*(A1-A0+A2-A4));
+        else:
+          trace TriEquiB shifted((k div 2)*(A1-A0+A2-A4));
+        fi;
+      endfor;
+    \end{Allumettes}
+  \fi%
+}%
+
+%57
+\NewDocumentCommand\BuildPatternCinquanteSept{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[];
+      A0=(0,0);
+      B0=A0;
+      B1-B0=u*(0,1);
+      B2=rotation(B0,B1,90);
+      B3-B2=B0-B1;
+      A1=B1;
+      A2-A1=u*(-1,0);
+      A3-A0=A2-A1;
+      trace Allu(B0,B1);
+      trace Allu(B1,B2);
+      trace Allu(B2,B3);
+      trace Allu(B3,B0);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        trace Allu(A3,A0) shifted(k*u*(-1,0));
+        trace Allu(A1,A2) shifted(k*u*(-1,0));
+        trace Allu(A2,A3) shifted(k*u*(-1,0));
       endfor;
-      NBobj:=1;
-      TR:=(-a,0,0);
+    \end{Allumettes}
+  \fi%
+}%
+
+%56a
+\NewDocumentCommand\BuildPatternCinquanteSixa{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[];
+      A0=(0,0);
+      A1-A0=u*(1,0);
+      A2=rotation(A1,A0,60);
+      picture TriEquiA,TriEquiB;
+      TriEquiA=image(
+      trace Allu(A0,A1);
+      trace Allu(A2,A0);
+      );
+      TriEquiB=image(
+      trace Allu(A1,symetrie(A0,A1,A2));
+      trace Allu(symetrie(A0,A1,A2),A2);
+      );
+      trace Allu(A0,A2);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        if (k mod 2)=0:
+          trace Allu(A0,A1) shifted((k div 2)*(A1-A0));
+        else:
+          trace Allu(symetrie(A0,A1,A2),A2) shifted((k div 2)*(A1-A0));
+        fi;
       endfor;
-      DessineFusion;
-    \end{mplibcode}
+      if (Etape mod 2)=1:
+      trace Allu(A0,A1) shifted((Etape div 2)*u*(1,0));
+      trace Allu(A1,A2) shifted((Etape div 2)*u*(1,0));
+      else:
+      trace Allu(A1,symetrie(A0,A1,A2)) shifted(((Etape div 2)-1)*u*(1,0));
+      trace Allu(symetrie(A0,A1,A2),A2) shifted(((Etape div 2)-1)*u*(1,0));
+      fi;
+    \end{Allumettes}
   \fi%
 }%
 
+%56
+\NewDocumentCommand\BuildPatternCinquanteSix{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[];
+      A0=(0,0);
+      A1-A0=u*(1,0);
+      A2=rotation(A1,A0,60);
+      picture TriEquiA,TriEquiB;
+      TriEquiA=image(
+      trace Allu(A0,A1);
+      trace Allu(A1,A2);
+      trace Allu(A2,A0);
+      );
+      TriEquiB=image(
+      trace Allu(A1,symetrie(A0,A1,A2));
+      trace Allu(symetrie(A0,A1,A2),A2);
+      );
+      for k=0 upto Etape-1:
+        if (k mod 2)=0:
+          trace TriEquiA shifted((k div 2)*(A1-A0));
+        else:
+          trace TriEquiB shifted((k div 2)*(A1-A0));
+        fi;
+      endfor;
+    \end{Allumettes}
+  \fi%
+}%
+
 %55
-\NewDocumentCommand\BuildPatternCinquanteCinq{}{%
+\NewDocumentCommand\BuildPatternCinquanteCinq{O{1}}{%
   \ifluatex%
-    \begin{Allumettes}[Echelle=0.35]
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
       Etape=\useKV[Pattern]{Etape};
       pair A[],B[],C[],D[],E[];
       A0=(0,0);
@@ -236,14 +1875,41 @@
       trace Allu(A1,A2) shifted(k*u*(-1,0));
       trace Allu(A2,A3) shifted(k*u*(-1,0));
       endfor;
-    \end{Allumettes}    
+    \end{Allumettes}%
   \fi%
 }%
 
+%54
+\NewDocumentCommand\BuildPatternCinquanteQuatre{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[];
+      A0=(0,0);
+      B0=A0;
+      B1-B0=u*(0,1);
+      B2=rotation(B0,B1,90);
+      B3-B2=B0-B1;
+      A1=B1;
+      A2-A1=u*(-1,0);
+      A3-A0=A2-A1;
+      trace Allu(B0,B1);
+      trace Allu(B1,B2);
+      trace Allu(B2,B3);
+      trace Allu(B3,B0);
+      for k=0 upto Etape-1:
+        trace Allu(A3,A0) shifted(k*u*(-1,0));
+        trace Allu(A1,A2) shifted(k*u*(-1,0));
+        trace Allu(A2,A3) shifted(k*u*(-1,0));
+      endfor;
+    \end{Allumettes}
+  \fi%
+}%
+
 %53
-\NewDocumentCommand\BuildPatternCinquanteTrois{}{%
+\NewDocumentCommand\BuildPatternCinquanteTrois{O{1}}{%
   \ifluatex%
-    \begin{Allumettes}[Echelle=0.35]
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
       Etape=\useKV[Pattern]{Etape};
       pair A[],B[],C[],D[],E[];
       A0=(0,0);
@@ -261,140 +1927,875 @@
       trace Allu(A1,A2) shifted(k*u*(-1,0));
       trace Allu(A2,A3) shifted(k*u*(-1,0));
       endfor;
-    \end{Allumettes}    
+    \end{Allumettes}
   \fi%
 }%
 
+%52
+\NewDocumentCommand\BuildPatternCinquanteDeux{}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeIso
+        somme:=1;
+        for nbe=1 upto Etape+1:
+          ptpattern[nbe]:=u*(alpha*somme,(somme mod 2)*0.5);
+          if nbe=Etape+1:
+            TypeCube:=cadrecubesol;
+          else:
+            TypeCube:=cadrecube;
+          fi;
+          cc[nbe]=image(
+            for k=nbe downto 1:
+              for l=1 upto nbe-k:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(alpha,0.5)+(l-1)*u*(0,1));%haut droite
+              endfor;
+            endfor;
+            for k=nbe downto 1:
+              for l=1 upto nbe-k:
+               trace TypeCube shifted(ptpattern[nbe]+k*u*(-alpha,0.5)+(l-1)*u*(0,1));%haut gauche
+              endfor;
+            endfor;
+            for k=0 upto nbe:% downto 0:
+              for l=1 upto nbe-k:
+                trace TypeCube shifted(ptpattern[nbe]+k*u*(-alpha,-0.5)+(l-1)*u*(0,1));%bas gauche
+              endfor;
+            endfor;
+            for k=1 upto nbe:% downto 0:
+                for l=1 upto nbe-k:
+                  trace TypeCube shifted(ptpattern[nbe]+k*u*(alpha,-0.5)+(l-1)*u*(0,1));%bas droite
+                endfor;
+            endfor;
+          );
+          trace cc[nbe];
+          somme:=somme+2*nbe+1+3;
+        endfor;
+        GrillePatternIso;
+        AffichagePattern(1,Etape+1);
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode
+    \begin{mplibcode}
+      Etape:=\useKV[Pattern]{Etape};
+      input PfCSolid;
+
+      intensite:=1.5;
+      Ferme[0]:=false;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+
+      Initialisation(2500,30,20,50);
+      Objetcube0("a=0.25");
+      nbobj:=0;
+      for k=Etape downto 1:
+        for l=0 upto k:
+          TR:=a*(l,0,-k);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](0);
+          TR:=a*(-l,0,-k);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](0);
+          TR:=a*(0,l,-k);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](0);
+          TR:=a*(0,-l,-k);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](0);
+        endfor;
+      endfor;
+      TR:=a*(0,0,0);
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](0);
+      DessineFusion;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+%51
+\NewDocumentCommand\BuildPatternCinquanteEtUna{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      if picture #1:
+        larg:=abs(lrcorner #1-llcorner #1);
+        picture maxihexa;
+        path cc;
+        cc=cercles((0,0),larg);
+        maxihexa=image(
+          trace #1;
+          trace #1 shifted (0.5*larg*(1.5,sqrt(3)/2));
+          trace #1 shifted (0.5*larg*(1.5,-sqrt(3)/2));
+          trace #1 shifted (larg*(1.5,0));
+        );
+        for l=0 upto Etape-1:
+          depla:=(l*1.5*larg,0);
+          trace maxihexa shifted depla;
+        endfor;
+      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50g
+%d'après Troy Henderson
+\NewDocumentCommand\BuildPatternCinquanteg{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+        %
+        vardef gasket(expr t, s, ss, limit) =
+        if limit<2:
+        fill ss withcolor CouleurFond;
+        draw ss;
+        else:
+        save little_t; path little_t; little_t = t scaled s;
+        save little_s; path little_s; little_s = ss scaled s;
+        for i=1 upto length t:
+        gasket(little_t shifted (point i of t - point i of little_t), s, little_s shifted (point i of t - point i of little_t), limit-1);
+        endfor
+        fi
+        enddef;
+
+        Etape:=\useKV[Pattern]{Etape};
+        %
+        pair A,B,C;
+        B=(0,0);
+        C-B=(220,0);
+        A=rotation(C,B,-60);
+        trace polygone(A,B,C);
+        path T,S; T = for i = 1 upto 3: 220 up rotated (120i) -- endfor cycle;
+        S=A{dir90}..{dir60}2/3[A,C]{dir60}..{dir-90}(1/2[B,C]+(0,-5)){dir90}..{dir-60}2/3[A,B]{dir-60}..{dir-90}cycle;
+        gasket(T,1/2,S,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50f
+% D'après Vincent Pantaloni
+\NewDocumentCommand\BuildPatternCinquantef{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+      %
+      vardef sierpinski(expr Aa,Ba,Ca,n)=
+        if n>0:
+          sierpinski(Aa,1/2[Aa,Ba],1/2[Aa,Ca],n-1);
+          sierpinski(1/2[Aa,Ba],Ba,1/2[Ba,Ca],n-1);
+          sierpinski(1/2[Aa,Ca],1/2[Ba,Ca],Ca,n-1);
+        else:
+        trace Ca--2/3[Ca,Aa]{dir-80}..{dir90}(1/2[Aa,Ba]+(0,10/(Etape+1))){dir-90}..{dir80}2/3[Ca,Ba]--cycle withcolor CouleurFond;
+        fi;
+      enddef;
+      %
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      u:=3cm;
+      pair A,B,C;
+      A=(0,0);
+      B-A=(u,0);
+      C=rotation(B,A,60);
+      sierpinski(A,B,C,Etape);
+      currentpicture:=rotation(currentpicture,iso(A,B,C),180);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50e
+% d'après Troy Henderson
+\NewDocumentCommand\BuildPatternCinquantee{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+        %
+        vardef gasket(expr t, s, limit) =
+        if limit<2:
+        fill t withcolor CouleurFond;
+        draw t;
+        else:
+        save little_t; path little_t; little_t = t scaled s;
+        for i=1 upto length t:
+        gasket(little_t shifted (point i of t - point i of little_t), s, limit-1);
+        endfor
+        fi;
+        enddef;
+        %
+        Etape:=\useKV[Pattern]{Etape};
+        %
+        path T; T = for i = 1 upto 5: 50 up rotated (144i) -- endfor cycle;
+        gasket(T,(3-sqrt(5))/2,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50d
+% d'après Troy Henderson
+\NewDocumentCommand\BuildPatternCinquanted{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+        %
+        vardef gasket(expr t, s, limit) =
+        if limit<2:
+        fill t withcolor CouleurFond;
+        draw t;
+        else:
+        save little_t; path little_t; little_t = t scaled s;
+        for i=1 upto length t:
+        gasket(little_t shifted (point i of t - point i of little_t), s, limit-1);
+        endfor
+        fi;
+        enddef;
+
+        Etape:=\useKV[Pattern]{Etape};
+        %
+        path T; T = for i = 1 upto 5: 50 up rotated (72i) -- endfor cycle;
+        gasket(T,(3-sqrt(5))/2,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50c
+% d'après Troy Henderson
+\NewDocumentCommand\BuildPatternCinquantec{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+        %
+        vardef gasket(expr t, s, limit) =
+        if limit<2:
+        fill t withcolor CouleurFond;
+        draw t;
+        else:
+        save little_t; path little_t; little_t = t scaled s;
+        for i=1 upto length t:
+        gasket(little_t shifted (point i of t - point i of little_t), s, limit-1);
+        endfor
+        fi;
+        enddef;
+
+        Etape:=\useKV[Pattern]{Etape};
+        %
+        path T; T = for i = 1 upto 6: 50 up rotated (60i) -- endfor cycle;
+        gasket(T, 1/3,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50b
+% d'après Vincent Pantaloni
+\NewDocumentCommand\BuildPatternCinquanteb{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+      %
+      vardef sierpinski(expr Aa,Ba,Ca,Da,n)=
+        if n>0:
+          sierpinski(Aa,1/3[Aa,Ba],1/3[Aa,Ca],1/3[Aa,Da],n-1);
+          sierpinski(1/3[Aa,Ba],1/3[Aa,Ca],1/3[Ba,Da],1/3[Ba,Aa],n-1);
+          sierpinski(2/3[Aa,Ba],Ba,1/3[Ba,Ca],1/3[Ba,Da],n-1);
+          sierpinski(1/3[Ba,Ca],2/3[Ba,Ca],2/3[Aa,Ca],1/3[Ba,Da],n-1);
+          sierpinski(2/3[Ba,Ca],Ca,1/3[Ca,Da],1/3[Ca,Aa],n-1);
+          sierpinski(1/3[Ca,Da],1/3[Ca,Aa],2/3[Ba,Da],2/3[Ca,Da],n-1);
+          sierpinski(2/3[Ba,Da],1/3[Da,Ca],Da,1/3[Da,Aa],n-1);
+          sierpinski(2/3[Ba,Da],1/3[Da,Aa],2/3[Da,Aa],1/3[Aa,Ca],n-1);
+        else:
+        fill Aa--Ba--Ca--Da--cycle withcolor CouleurFond;
+        trace Aa--Ba--Ca--Da--cycle;
+        fi;
+      enddef;
+      %
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      u:=3cm;
+      pair A,B,C,D;
+      A=(0,0);
+      B-A=(u,0);
+      C=rotation(A,B,90);
+      D-C=A-B;
+      sierpinski(A,B,C,D,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50a
+% d'après Vincent Pantaloni
+\NewDocumentCommand\BuildPatternCinquantea{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+      %
+      vardef sierpinski(expr Aa,Ba,Ca,Da,n)=
+        if n>0:
+          sierpinski(Aa,1/3[Aa,Ba],1/3[Aa,Ca],1/3[Aa,Da],n-1);
+          sierpinski(2/3[Aa,Ba],Ba,1/3[Ba,Ca],1/3[Ba,Da],n-1);
+          sierpinski(2/3[Ba,Ca],Ca,1/3[Ca,Da],1/3[Ca,Aa],n-1);
+          sierpinski(2/3[Ba,Da],1/3[Da,Ca],Da,1/3[Da,Aa],n-1);
+        else:
+        fill Aa--Ba--Ca--Da--cycle withcolor CouleurFond;
+        trace Aa--Ba--Ca--Da--cycle;
+        fi;
+      enddef;
+      %
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      u:=3cm;
+      pair A,B,C,D;
+      A=(0,0);
+      B-A=(u,0);
+      C=rotation(A,B,90);
+      D-C=A-B;
+      sierpinski(A,B,C,D,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 50
+% d'après Vincent Pantaloni
+\NewDocumentCommand\BuildPatternCinquante{}{%
+  \ifluatex
+    \mplibforcehmode
+    \begin{mplibcode}%
+      color CouleurFond;
+      \ifemptyKV[Pattern]{Couleur}{CouleurFond=0.8white;}{CouleurFond=\useKV[Pattern]{Couleur};}%
+      %
+      vardef sierpinski(expr Aa,Ba,Ca,n)=
+        if n>0:
+          sierpinski(Aa,1/2[Aa,Ba],1/2[Aa,Ca],n-1);
+          sierpinski(1/2[Aa,Ba],Ba,1/2[Ba,Ca],n-1);
+          sierpinski(1/2[Aa,Ca],1/2[Ba,Ca],Ca,n-1);
+        else:
+        fill Aa--Ba--Ca--cycle withcolor CouleurFond;
+        trace Aa--Ba--Ca--cycle;
+        fi;
+      enddef;
+      %
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      u:=3cm;
+      pair A,B,C;
+      A=(0,0);
+      B-A=(u,0);
+      C=rotation(B,A,60);
+      sierpinski(A,B,C,Etape);
+    \end{mplibcode}%
+  \fi%
+}%
+
+%49
+\NewDocumentCommand\BuildPatternQuaranteNeuf{}{
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeIso
+        somme:=1;
+        for nbe=0 upto Etape:
+          ptpattern[nbe]:=u*(somme,(somme mod 2)*0.5);
+          if nbe=Etape:
+            TypeCube:=cadrecubesol;
+          else:
+            TypeCube:=cadrecube;
+          fi;
+          cc[nbe]=image(
+          if nbe mod 2=0:
+            for k=0 upto (2**(nbe div 2))-1:
+              for l=0 upto (2**((nbe-1) div 2))-1:
+                trace TypeCube shifted(ptpattern[nbe]+k*u*(1,-0.5)+l*u*(0,1));
+              endfor;
+            endfor;
+          else:
+            for k=0 upto (2**((nbe-1) div 2))-1:
+              for l=0 upto (2**((nbe-1) div 2))-1:
+                trace TypeCube shifted(ptpattern[nbe]+k*u*(1,-0.5)+l*u*(0,1));
+              endfor;
+            endfor;
+          fi;
+          );
+          trace cc[nbe];
+          somme:=somme+nbe+2+1;
+        endfor;
+        GrillePatternIso;
+        AffichagePattern(0,Etape);
+      \end{Geometrie}
+    }{%
+      \mplibforcehmode
+      \begin{mplibcode}
+        Etape:=\useKV[Pattern]{Etape};
+        input PfCSolid;
+
+        intensite:=1.5;
+        Ferme[0]:=false;
+        \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
+        incolor:=white;
+        nb:=1;subh:=1;
+        creux:=false;
+        
+        Initialisation(2500,40,20,50);
+        Objetcube0("a=0.25");
+        nbobj:=0;
+        if (Etape mod 2)=0:
+          for k=0 upto (2**(Etape div 2))-1:
+            for l=0 upto (2**((Etape-1) div 2))-1:
+              nbobj:=nbobj+1;
+              TR:=0.25*(0,k,l);
+              ObjetDeplacement[nbobj](0);
+            endfor;
+          endfor;
+        else:
+          for k=0 upto (2**((Etape-1) div 2))-1:
+            for l=0 upto (2**((Etape-1) div 2))-1:
+              nbobj:=nbobj+1;
+              TR:=0.25*(0,k,l);
+              ObjetDeplacement[nbobj](0);
+            endfor;
+          endfor;
+        fi;
+        DessineFusion;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+
 %48
-\NewDocumentCommand\BuildPatternQuaranteHuit{}{
+\NewDocumentCommand\BuildPatternQuaranteHuit{}{%
   \ifluatex%
+        \ifboolKV[Pattern]{Grille}{%
+        \begin{Geometrie}[Cadre="aucun"]
+          \BuildPatternCodeIso
+          somme:=1;
+          for nbe=0 upto Etape:
+            ptpattern[nbe]:=u*(somme,if (somme mod 2)=0:0 else: -0.5 fi);
+            if nbe=Etape:
+            TypeCube:=cadrecubesol;
+            else:
+            TypeCube:=cadrecube;
+            fi;
+            cc[nbe]=image(
+            trace TypeCube shifted(ptpattern[nbe]);
+            for k=nbe downto 1:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(1,0.5));%haut droite
+            endfor;
+            %for k=nbe downto 1:
+            %  trace TypeCube shifted(ptpattern[nbe]+k*u*(-1,0.5));%haut gauche
+            %endfor;
+            %for k=1 upto nbe:% downto 0:
+            %  trace TypeCube shifted(ptpattern[nbe]+k*u*(-1,-0.5));%bas gauche
+            %endfor;
+            for k=1 upto nbe:% downto 0:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(1,-0.5));%bas droite
+            endfor;
+            for k=1 upto nbe:% downto 0:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(0,1));%haut
+              endfor;
+              );
+              trace cc[nbe];
+            somme:=somme+nbe+2+1;
+            endfor;
+            GrillePatternIso;
+            AffichagePattern(0,Etape);
+      \end{Geometrie}
+      }{%
     \mplibforcehmode
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-      
+
       intensite:=1.5;
       Ferme[0]:=false;
-      outcolor:=LightSteelBlue;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-      
+
       Initialisation(2500,40,20,50);
       Objetcube1("a=0.25");
       nbobj:=1;
       TR:=(0,a,0);
       for k=0 upto Etape-2:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
       endfor;
       NBobj:=1;
       TR:=(-a,0,0);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       NBobj:=1;
       TR:=(0,0,a);%
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       DessineFusion;
     \end{mplibcode}
+    }%
   \fi%
 }%
 
 %46
-\NewDocumentCommand\BuildPatternQuaranteSix{}{
+\NewDocumentCommand\BuildPatternQuaranteSix{}{%
   \ifluatex%
-    \mplibforcehmode
+    \ifboolKV[Pattern]{Grille}{%
+        \begin{Geometrie}[Cadre="aucun"]
+          \BuildPatternCodeIso
+          somme:=1;
+          for nbe=0 upto Etape:
+            ptpattern[nbe]:=u*(somme,if (somme mod 2)=0:-0.5 else: 0.5 fi);
+            if nbe=Etape:
+            TypeCube:=cadrecubesol;
+            else:
+            TypeCube:=cadrecube;
+            fi;
+            cc[nbe]=image(
+            trace TypeCube shifted(ptpattern[nbe]);
+            for k=nbe downto 1:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(1,0.5));%haut droite
+            endfor;
+            for k=nbe downto 1:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(-1,0.5));%haut gauche
+            endfor;
+            for k=1 upto nbe:% downto 0:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(-1,-0.5));%bas gauche
+            endfor;
+            for k=1 upto nbe:% downto 0:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(1,-0.5));%bas droite
+            endfor;
+            for k=1 upto nbe:% downto 0:
+              trace TypeCube shifted(ptpattern[nbe]+k*u*(0,1));%haut
+              endfor;
+              );
+              trace cc[nbe];
+            somme:=somme+2*nbe+1+3;
+            endfor;
+            GrillePatternIso;
+            AffichagePattern(0,Etape);
+      \end{Geometrie}
+      }{%
+        \mplibforcehmode
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-      
+
       intensite:=1.5;
       Ferme[0]:=false;
-      outcolor:=LightSteelBlue;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}%
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-      
+
       Initialisation(2500,40,20,50);
       Objetcube1("a=0.25");
       nbobj:=1;
       TR:=(0,a,0);
       for k=0 upto Etape-2:
-      NBobj:=nbobj;
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
       endfor;
       NBobj:=1;
       TR:=(0,-a,0);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       NBobj:=1;
       TR:=(a,0,0);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       NBobj:=1;
       TR:=(-a,0,0);
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       NBobj:=1;
       TR:=(0,0,a);%
       for k=0 upto Etape-2:
-      nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](NBobj);
-      NBobj:=nbobj;
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](NBobj);
+        NBobj:=nbobj;
       endfor;
       DessineFusion;
-    \end{mplibcode}
+    \end{mplibcode}%
+    }%
   \fi%
 }%
 
 %45
-\NewDocumentCommand\BuildPatternQuaranteCinq{}{%
+\NewDocumentCommand\BuildPatternQuaranteCinqa{m}{%
   \ifluatex%
-  \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    A[0]=(0,0);
-    path piece;
-    piece=unitsquare scaled 5mm shifted(-2.5mm,-2.5mm);
-    for k=0 upto (2*Etape):
-    for l=0 upto Etape:
-    if (k=Etape) and (l=0):
-    else:
-    trace piece shifted(5mm*(k,l));
-    fi;
-    endfor;
-    endfor;
-  \end{mplibcode}
-  \fi
-}
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor ,"MO","AV","DE" for l=0 upto k:,"AV" endfor for l=0 upto k+1:,"MO" endfor for l=0 upto 2*(k+1):,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape);
+        for k=0 upto Etape:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+      \mplibforcehmode%
+      \begin{mplibcode}
+        \BuildPatternCode
+        if picture #1:
+          for k=0 upto (2*Etape):
+            for l=0 upto Etape:
+              if (k=Etape) and (l=0):
+              else:
+                trace #1 shifted(5mm*(k,l));
+              fi;
+            endfor;
+          endfor;
+        fi;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
 
+%44
+\NewDocumentCommand\BuildPatternQuaranteQuatrea{m}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      if picture #1:
+        larg:=abs(lrcorner #1-llcorner #1);
+        picture maxihexa;
+        path cc;
+        cc=cercles((0,0),larg);
+        maxihexa=image(
+          trace #1 shifted (0.5*larg*(1.5,sqrt(3)/2));
+          trace #1 shifted (0.5*larg*(1.5,-sqrt(3)/2));
+          trace #1 shifted (0.5*larg*(-1.5,sqrt(3)/2));
+          trace #1 shifted (0.5*larg*(-1.5,-sqrt(3)/2));
+          trace #1 shifted (0.5*larg*(0,sqrt(3)));
+          trace #1 shifted (0.5*larg*(0,-sqrt(3)));
+        );
+        for l=0 upto Etape-1:
+          depla:=(l*1.5*larg,0);
+          trace maxihexa shifted depla;
+        endfor;
+      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 43
+\NewDocumentCommand\BuildPatternQuaranteTroisa{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto 3+k:,"AV" endfor ,"MO" for l=0 upto k+1:,"AV" endfor,"MO" for l=0 upto k+2:,"RE" endfor,"DE" for l=0 upto k+1:,"RE" endfor for l=0 upto k+2:,"MO" endfor,"RE");
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape);
+        for k=0 upto Etape:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for l=1 upto Etape+2:
+        depla:=(0,l*haut);
+        trace TestA shifted depla;
+        depla:=(l*larg,0);
+        trace TestA shifted depla;
+        depla:=(Etape+1)*(larg,0)+(l*larg,haut);
+        trace TestA shifted depla;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+%42
+\NewDocumentCommand\BuildPatternQuaranteDeux{O{1}}{%
+  \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[],C[],D[],E[];
+      A0=(0,0);
+      path cc;
+      cc=cercles(A0,u);
+      for k=0 upto 6:
+        B[k]=pointarc(cc,-30+k*60);
+      endfor;
+      picture UnitHexd,UnitHexi;
+      UnitHexd=image(
+      trace Allu(B1,B2);
+      trace Allu(B2,B3);
+      trace Allu(B3,B4);
+      trace Allu(B4,B5);
+      trace Allu(B5,B6);
+      );
+      UnitHexi=image(
+      trace Allu(B1,B2);
+      trace Allu(B2,B3);
+      trace Allu(B4,B5);
+      trace Allu(B5,B6);
+      );
+      currentpicture:=nullpicture;
+      trace UnitHexd;
+      for k=1 upto Etape-1:
+        trace UnitHexi shifted(2*k*(iso(B0,B1)-A0));
+      endfor;
+      trace Allu(B0,B1) shifted(2*(Etape-1)*(iso(B0,B1)-A0));
+    \end{Allumettes}%
+  \fi%
+}%
+
+%40
+\NewDocumentCommand\BuildPatternQuarante{}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      Etape:=\useKV[Pattern]{Etape};
+      input PfCSolid;
+
+      intensite:=1.5;
+      Ferme[0]:=false;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=white;}{outcolor:=\useKV[Pattern]{Couleur};}
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      %
+      Initialisation(2500,22,20,50);
+      Objetcube0("a=0.25");
+      nbobj:=0;
+      for k=0 upto Etape-1:
+      for l=0 upto Etape-1:
+      for p=0 upto Etape-1:
+      TR:=a*(k,l,p);
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](0);
+      TR:=a*(k,l+2*Etape,p);
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](0);
+      endfor;
+      endfor;
+      endfor;
+      for k=0 upto 3*Etape-1:
+        for l=0 upto Etape-1:
+          nbobj:=nbobj+1;
+         TR:=0.25*(l,k,-1);
+         ObjetDeplacement[nbobj](0);
+      endfor;
+      endfor;
+      DessineFusion;
+    \end{mplibcode}%
+  \fi%
+}%
+
+
 %39
 \NewDocumentCommand\BuildPatternTrenteNeuf{}{
   \ifluatex%
+        \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[CoinHD={5*u*(0.5*(\useKV[Pattern]{Etape}*(\useKV[Pattern]{Etape}+1)/2),0.5*(\useKV[Pattern]{Etape}+2))}]
+        Etape:=\useKV[Pattern]{Etape};
+        color CouleurEtape,CouleurSol;
+        \ifemptyKV[Pattern]{Couleur}{CouleurEtape=Purple;}{CouleurEtape=\useKV[Pattern]{Couleur};}
+        \ifemptyKV[Pattern]{CouleurSolution}{CouleurSol=Evidence;}{CouleurSol=\useKV[Pattern]{CouleurSolution};}
+        u:=2.5mm;
+        trace papierisometriqueu withcolor 0.7white;
+        picture cadrecube,cadrecubesol;
+        pair A[];
+        A1=pp(0,2*(Etape+1)-1);
+        A2-A1=pp(1,-0.5);
+        A3-A2=pp(1,0.5);
+        A4-A3=pp(0,1);
+        A5-A4=pp(-1,0.5);
+        A6-A5=pp(-1,-0.5);
+        A7-A6=pp(1,-0.5);
+        boolean Solution;
+        Solution=\useKV[Pattern]{Solution};
+        cadrecube=image(%
+        fill polygone(A1,A2,A3,A4,A5,A6) withcolor CouleurEtape;
+        drawoptions(withcolor white);
+        trace polygone(A1,A2,A3,A4,A5,A6);
+        trace A6--A7--A2;
+        trace A7--A4;
+        drawoptions();
+        );
+        somme:=2;
+        for nbe=0 upto Etape-2:
+        for k=nbe downto 0:
+          for p=0 upto k:
+          for l=0 upto nbe:
+          trace cadrecube shifted(pp(somme,(somme mod 2)*0.5)+(l-1)*pp(1,-0.5)+p*pp(-1,-0.5)+(-k)*pp(0,1));
+          endfor;
+          endfor;
+        endfor;
+        somme:=somme+nbe+5;
+        endfor;
+        if Solution:
+        cadrecubesol=image(%
+        fill polygone(A1,A2,A3,A4,A5,A6) withcolor CouleurSol;
+        drawoptions(withcolor white);
+        trace polygone(A1,A2,A3,A4,A5,A6);
+        trace A6--A7--A2;
+        trace A7--A4;
+        drawoptions();
+        );
+        for nbe=Etape-1 upto Etape-1:
+        for k=nbe downto 0:
+          for p=0 upto k:
+          for l=0 upto nbe:
+          trace cadrecubesol shifted(pp(somme,(somme mod 2)*0.5)+(l-1)*pp(1,-0.5)+p*pp(-1,-0.5)+(-k)*pp(0,1));
+          endfor;
+          endfor;
+        endfor;
+        endfor;
+        fi;
+      \end{Geometrie}
+    }{%
     \mplibforcehmode%
-    \begin{mplibcode}
+    \begin{mplibcode}%
       Etape:=\useKV[Pattern]{Etape};
       input PfCSolid;
-           
+
       intensite:=1.5;
       Ferme[0]:=false;
       outcolor:=Orange;
@@ -401,7 +2802,7 @@
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-           
+
       Initialisation(2500,40,20,50);
       Objetcube1("a=0.25");
       nbobj:=1;
@@ -415,51 +2816,334 @@
       endfor;
       endfor;
       DessineFusion;
-    \end{mplibcode}
-  \fi
+    \end{mplibcode}%
+    }%
+  \fi%
 }%
 
-%30
-\NewDocumentCommand\BuildPatternTrente{}{%
+%37
+\NewDocumentCommand\BuildPatternTrenteSept{O{1}}{%
   \ifluatex%
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
+      Etape=\useKV[Pattern]{Etape};
+      pair A[],B[],C[],D[],E[];
+      A0=(0,0);
+      path cc;
+      cc=cercles(A0,u);
+      for k=0 upto 6:
+        B[k]=pointarc(cc,-30+k*60);
+      endfor;
+      picture UnitHexa;
+      UnitHexa=image(
+      trace Allu(B4,B5);
+      trace Allu(B5,B6);
+      trace Allu(B0,B1);
+      trace Allu(B1,B2);
+      trace Allu(B2,B3);
+      );
+      currentpicture:=nullpicture;
+      trace Allu(B3,B4);
+      for k=0 upto Etape-1:
+        trace UnitHexa shifted(2*k*(iso(B0,B1)-A0));
+      endfor;
+    \end{Allumettes}%
+  \fi%
+}%
+
+% 36
+\NewDocumentCommand\BuildPatternTrenteSix{}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      input PfCSolid;
+      %
+      intensite:=1.5;
+      Ferme[0]:=false;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      %
+      Initialisation(2500,22,20,50);
+      Objetpave0("L=1","H=0.2","P=0.2");
+      %Objetpave1("L=0.2","H=0.2","P=1");
+      nbobj:=0;
+      angz:=90;
+      for k=Etape downto 1:
+        TR:=0.2*(0,0,-k);
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](0);
+      endfor;
+      for k=Etape downto 1:
+        TR:=0.2*(0,1,-k);
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](0);
+      endfor;
+      for k=Etape downto 1:
+        TR:=0.2*(0,3,-k);
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](0);
+      endfor;
+      for k=Etape downto 1:
+        TR:=0.2*(0,4,-k);
+        nbobj:=nbobj+1;
+        ObjetDeplacement[nbobj](0);
+      endfor;
+      angz:=0;
+      for k=4 downto 0:
+        nbobj:=nbobj+1;
+        TR:=0.2*(-k+2,2,0);
+        ObjetDeplacement[nbobj](0);
+      endfor;
+      % DessineFusion;
+      for k=1 upto nbobj:
+        AffichageObjet[k];
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 35
+\NewDocumentCommand\BuildPatternTrenteCinq{}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      bboxmargin:=0pt;
+      larg:=abs(lrcorner kappla-llcorner kappla);
+      haut:=abs(urcorner kappla-lrcorner kappla);
+      trace kappla;
+      picture Pi;
+      Pi=image(
+      trace rotation(kappla,lrcorner kappla,-90);
+      trace rotation(kappla,lrcorner kappla,-90) shifted(larg-haut,0);
+      trace kappla shifted((larg,larg));
+      trace kappla shifted(2*larg,0);
+      );
+      for l=0 upto Etape-1:
+        trace Pi shifted(l*(2*larg,0));
+      endfor;
+    \end{mplibcode}%
+  \fi%
+}%
+
+% 34
+\NewDocumentCommand\BuildPatternTrenteQuatrea{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto 2*(k+1)-1:,"AV" endfor for l=0 upto k:,"MO","RE" endfor for l=0 upto k:,"RE","DE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape);
+        for k=0 upto Etape:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0pt;
+      \BuildPatternCodeA{#1}
+      for l=1 upto Etape:
+        for k=0 upto 2*l-1:
+          depla:=((-l+k)*larg,-l*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 33
+\NewDocumentCommand\BuildPatternTrenteTroisa{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,\PfMRetiensEtape+2);
+        picture cc[];
+        for nbe=0 upto Etape-2:
+        path TestA;
+        pair depla;
+        cc[nbe]=image(
+        TestA:=polygonerela(Apat[nbe],"DE","AV","MO");
+        fill TestA withcolor if nbe<Etape:CouleurEtape else:CouleurSol fi withtransparency(1,0.35);
+        trace TestA withpen pencircle scaled 1.1 withcolor if nbe<Etape:CouleurEtape else:CouleurSol fi;
+        for l=1 upto nbe:
+          for k=-l upto l:
+            if (k mod 2)=(l mod 2):
+              depla:=u*(k,l);
+              fill (TestA shifted depla) withcolor if k<Etape:CouleurEtape else:CouleurSol fi withtransparency(1,0.35);
+              trace TestA shifted depla withpen pencircle scaled 1.1 withcolor if k<Etape:CouleurEtape else:CouleurSol fi;
+              depla:=u*(k,-l);
+              fill (TestA shifted depla) withcolor if k<Etape:CouleurEtape else:CouleurSol fi withtransparency(1,0.35);
+              trace TestA shifted depla withpen pencircle scaled 1.1 withcolor if k<Etape:CouleurEtape else:CouleurSol fi;
+            fi;
+          endfor;
+        endfor;
+        );
+        trace cc[nbe];
+        Apat[nbe+1]:=Apat[nbe]+u*(2*nbe+4,0);
+        endfor;
+        GrillePattern;
+        for k=0 upto Etape-1:
+          if k<Etape-1:
+            trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurEtape;
+          else:
+            if \useKV[Pattern]{Solution}:
+              trace cc[k] withpen pencircle scaled 1.1 withcolor CouleurSol;
+            fi;
+          fi;
+        endfor;
+        for k=0 upto Etape-1:
+          AffichageEtape(urt)(k,1,Etape,(xpart(ulcorner cc[k]),ypart(ulcorner cc[Etape])));
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for l=1 upto Etape-1:
+        for k=-l upto l:
+          if (k mod 2)=(l mod 2):
+            depla:=(k*larg,l*haut);
+            trace TestA shifted depla;
+            depla:=(k*larg,-l*haut);
+            trace TestA shifted depla;
+          fi;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 32
+\NewDocumentCommand\BuildPatternTrenteDeuxa{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,\PfMRetiensEtape+3);
+        for k=0 upto Etape-1:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k+1:,"DE" endfor for l=0 upto k:,"AV" endfor for l=0 upto k+1:,"MO" endfor);
+          trace cc[k];
+          Apat[k+1]:=urcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(urt)(k,1,Etape,ulcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=0 upto Etape:
+          depla:=(l*larg,k*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 31
+\NewDocumentCommand\BuildPatternTrenteEtUna{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,2);
+        for k=0 upto Etape-1:
+        cc[k]=polygonerela(Apat[k],"AV","DE" for l=0 upto k:,"AV" endfor ,"MO","AV","MO","RE","MO" for l=0 upto k:,"RE" endfor,"DE","RE");
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,1);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=0pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=0 upto 2:
+          depla:=(l*larg,k*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+      depla:=(-larg,haut);
+      trace TestA shifted depla;
+      depla:=(Etape*larg,haut);
+      trace TestA shifted depla;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 30
+\NewDocumentCommand\BuildPatternTrentea{m}{%
+  \ifluatex%
   \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    A[0]=(0,0);
-    Etape:=\useKV[Pattern]{Etape};
+  \begin{mplibcode}%
+    \BuildPatternCode
+    ecartcube:=5pt;
     picture Cle;
-    path piece;
-    piece=(unitsquare scaled 3mm) shifted(-1.5mm,-1.5mm);
+    \BuildPatternCodeA{#1}
     if (Etape mod 2)=0:
-    A0:=(0,1.75mm)+(Etape div 2)*(0,3.5mm);
-    for k=0 upto Etape-1:
-    for l=0 upto Etape-1:
-    if (k*l)<>(Etape-1)*(Etape-1):
-    draw piece shifted(A[0]+3.5mm*(-k,l));
-    draw symetrie(piece shifted(A[0]+3.5mm*(-k,l)),(0,0));
-    fi;
-    endfor;
-    endfor;
-    for k=0 upto ((Etape div 2)-1):
-    draw piece shifted((0,1.75mm)+k*(0,3.5mm));
-    draw symetrie(piece shifted((0,1.75mm)+k*(0,3.5mm)),(0,0));
-    endfor;
+      depla:=(0,0.5*haut)+(Etape div 2)*(0,haut);
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          if (k*l)<>(Etape-1)*(Etape-1):
+            draw TestA shifted(depla+(-k*larg,l*haut));
+            draw TestA shifted(symetrie(depla+(-k*larg,l*haut),(0,0)));
+          fi;
+        endfor;
+      endfor;
+      for k=0 upto ((Etape div 2)-1):
+        draw TestA shifted((0,0.5*haut)+k*(0,haut));
+        draw TestA shifted(symetrie((0,haut*0.5)+k*(0,haut),(0,0)));
+      endfor;
     else:
-    A0:=(0,0)+((Etape div 2)+1)*(0,3.5mm);
-    for k=0 upto Etape-1:
-    for l=0 upto Etape-1:
-    if (k*l)<>(Etape-1)*(Etape-1):
-    draw piece shifted(A[0]+3.5mm*(-k,l));
-    draw symetrie(piece shifted(A[0]+3.5mm*(-k,l)),(0,0));
+      depla:=(0,0)+((Etape div 2)+1)*(0,haut);
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          if (k*l)<>(Etape-1)*(Etape-1):
+            draw TestA shifted(depla+(-k*larg,l*haut));
+            draw TestA shifted(symetrie(depla+(-k*larg,l*haut),(0,0)));
+          fi;
+        endfor;
+      endfor;
+      for k=1 upto (Etape div 2):
+        draw TestA shifted(k*(0,haut));
+        draw TestA shifted(symetrie(k*(0,haut),(0,0)));
+      endfor;
+      draw TestA;
     fi;
-    endfor;
-    endfor;
-    for k=1 upto (Etape div 2):
-    draw piece shifted(k*(0,3.5mm));
-    draw symetrie(piece shifted(k*(0,3.5mm)),(0,0));
-    endfor;
-    draw piece;
-    fi;
     Cle=currentpicture;
     currentpicture:=nullpicture;
     draw rotation(Cle,(0,0),40);
@@ -467,123 +3151,804 @@
   \fi%
 }%
 
+% 28
+\NewDocumentCommand\BuildPatternVingtHuit{}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      Etape:=\useKV[Pattern]{Etape};
+      %
+      input PfCSolid;
+      %
+      intensite:=1.5;
+      Ferme[0]:=false;
+      \ifemptyKV[Pattern]{Couleur}{outcolor:=LightSteelBlue;}{outcolor:=\useKV[Pattern]{Couleur};}
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      %
+      Initialisation(2500,40,20,50);
+      Objetcube0("a=0.25");
+      nbobj:=0;
+      for k=0 upto Etape-1:
+        for l=0 upto Etape-1:
+          nbobj:=nbobj+1;
+          TR:=0.25*(k,l,0);
+          ObjetDeplacement[nbobj](0);
+        endfor;
+      endfor;
+      for l=1 upto Etape-1:
+        for k=0 upto Etape-1:
+          TR:=0.25*(k,0,l);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
+        for k=0 upto Etape-1:
+          TR:=0.25*(0,k,l);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
+      endfor;
+      DessineFusion;
+    \end{mplibcode}
+  \fi%
+}%
+
+% 27
+\NewDocumentCommand\BuildPatternVingtSepta{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+        cc[k]=polygonerela(Apat[k] for l=0 upto 2*(k+1)-1:,"AV" endfor ,"MO" for l=0 upto k:,"RE" endfor for l=1 upto k:,"MO" endfor for l=0 upto k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=0 upto Etape-1:
+          depla:=(l*larg,k*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+      for l=0 upto Etape-1:
+        depla:=((Etape+l)*larg,0);
+        trace TestA shifted depla;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 26
+\NewDocumentCommand\BuildPatternVingtSixa{m}{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,\PfMRetiensEtape+3);
+        for k=0 upto Etape-1:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k:,"DE" endfor if k>0: ,"DE" for l=1 upto k:,"AV" endfor ,"MO","AV" for l=0 upto k-1:,"MO" endfor for l=0 upto k-1:,"AV" endfor ,"MO" else: ,"AV","MO","RE" fi);
+          trace cc[k];
+          Apat[k+1]:=urcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(urt)(k,1,Etape,ulcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=0 upto Etape-1:
+          trace TestA shifted(l*larg,-k*haut);
+        endfor;
+      endfor;
+      %
+      trace TestA shifted(Etape*(larg,0));
+      trace TestA shifted(Etape*(0,-haut));
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+
+% 25
+\NewDocumentCommand\BuildPatternVingtCinqa{m}{%
+    \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{3+\useKV[Pattern]{Etape}*2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*2 +3,? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*2 ++3}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif se décompose en un rectangle de 3 \PfCDescriptionMotif[2] et de \num{\useKV[Pattern]{Etape}} rectangles de 2 \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que le motif est composé de « étape » rectangles de 2 \PfCDescriptionMotif[3] et d'un rectangle de largeur 1 et de longueur 3.\par
+        Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times2+3.\]
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[2\times e+3.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k+2:,"AV" endfor ,"MO","RE","RE" if k>0:,"MO" for l=1 upto k:,"RE" endfor ,"MO","RE" else: ,"MO","MO","RE" fi);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for l=1 upto Etape+1:
+        depla:=l*(larg,0);
+        trace TestA shifted depla;
+      endfor;
+      for l=0 upto Etape-1:
+        depla:=(l*larg,haut);
+        trace TestA shifted depla;
+      endfor;
+      trace TestA shifted(0,2*haut);
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
 %24
-\NewDocumentCommand\BuildPatternVingtQuatre{}{%
+\NewDocumentCommand\BuildPatternVingtQuatrea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{3+\useKV[Pattern]{Etape}*2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*2 +3,? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*2 ++3}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif se décompose en un rectangle de 3 \PfCDescriptionMotif[2] et de \num{\useKV[Pattern]{Etape}} rectangles de 2 \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que le motif est composé d'un rectangle de longueur « étape » et de largeur 2 et d'un rectangle de largeur 1 et de longueur 3.
+        Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times2+3.\]
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[2\times e+3.\]
+      }%
+    }{%
   \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k+1:,"AV" endfor ,"MO","MO" for l=0 upto k:,"RE" endfor ,"MO","RE");
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
   \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    A[0]=(0,0);
-    path piece;
-    piece=unitsquare scaled 5mm shifted(-2.5mm,-2.5mm);
-    drawoptions(withcolor Orange);
+  \begin{mplibcode}%
+    \BuildPatternCode
+    ecartcube:=2pt;
+    \BuildPatternCodeA{#1}
     for k=0 upto Etape+1:
-    for l=0 upto Etape-1:
-    fill piece shifted(5mm*(k,l));
+      for l=0 upto 1:
+        trace TestA shifted(k*larg,l*haut);
+      endfor;
     endfor;
-    endfor;
-    fill (piece shifted(0,Etape*5mm));
-    drawoptions();
-    for k=0 upto Etape+1:
-    for l=0 upto Etape-1:
-    trace piece shifted(5mm*(k,l));
-    endfor;
-    endfor;
-    trace (piece shifted(0,Etape*5mm));
-  \end{mplibcode}
-  \fi
-}
+    trace TestA shifted(0,2*haut);
+  \end{mplibcode}%
+  }%
+  \fi%
+}%
+}%
+}%
+}%
 
-%20
-\NewDocumentCommand\BuildPatternVingt{}{%
+% 23
+\NewDocumentCommand\BuildPatternVingtTroisa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+\useKV[Pattern]{Etape}*2+\useKV[Pattern]{Etape}**3}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[1+?+?\times3\times?=\num{\PfMCalculNbMotif}.\]
+        Après essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. Le motif 4 peut se décomposer ainsi :
+        \begin{center}
+          \begin{Geometrie}[Cadre="aucun"]
+            \BuildPatternCodeC
+            u:=3mm;
+            Apat[0]=u*(1,1);
+            for k=3 upto 3:
+            cc[k]=polygonerela(Apat[0] for l=0 upto k+2:,"AV" endfor ,"MO","RE" for l=1 upto 2*k+1:,"MO" endfor ,"RE" for l=2 upto k*k:,"MO" endfor for l=0 upto k:,"RE" endfor);
+            trace cc[k];
+            %Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+            endfor;
+            GrillePattern;
+            for k=4 upto 4:
+            cc[1]:=polygonerela(Apat[0] for l=0 upto k-1:,"AV" endfor for l=0 upto 3*k:,"MO" endfor ,for l=0 upto k-1:,"RE" endfor);
+            cc[2]:=polygonerela(lrcorner cc[1] ,"AV" for l=0 upto 2*k:,"MO" endfor ,"RE");
+            cc[3]:=polygonerela(lrcorner cc[2],"AV","MO","RE");
+            fill cc[1] withcolor CouleurEtape withtransparency(1,0.35);
+            trace cc[1];
+            fill cc[2] withcolor 0.5[CouleurEtape,CouleurSol] withtransparency(1,0.35);
+            trace cc[2];
+            fill cc[3] withcolor CouleurSol withtransparency(1,0.35);
+            trace cc[3];
+            endfor;
+      \end{Geometrie}
+        \end{center}
+        Le motif est donc composé d'un rectangle de largeur \num{\useKV[Pattern]{Etape}} et d'une longueur égale à \num{\fpeval{3*\useKV[Pattern]{Etape}}} ; d'un rectangle de largeur 1 et de longueur \num{\fpeval{2*\useKV[Pattern]{Etape}}} et d'un \PfCDescriptionMotif[1]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que le motif est composé d'un rectangle de largeur « étape » et de longueur $\text{« étape »}\times\text{« étape »}$; d'un rectangle de largeur 1 et de longueur $2\times\text{« étape »}$ et d'un \PfCDescriptionMotif[1].\par
+        Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times\text{« étape »}\times\text{« étape »}+2\times\text{« étape »}+1).\]
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[e\times e\times e+2\times e+1\text{ ou }e^3+2e+1.\]
+      }%
+    }{%
   \ifluatex%
-  \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    A[0]=(0,0);
-    for l=0 upto Etape-1:
-    for k=0 upto Etape+1:
-    draw (unitsquare scaled 5mm) shifted(A[0]+5mm*(k,l));
-    endfor;
-    endfor;
-  \end{mplibcode}
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+        cc[k]=if k=0:polygonerela(Apat[k] for l=0 upto k+2:,"AV" endfor ,"MO","RE","MO","RE","DE","RE");
+        else:polygonerela(Apat[k] for l=0 upto k+2:,"AV" endfor ,"MO","RE" for l=1 upto 2*k+1:,"MO" endfor ,"RE" for l=2 upto k*k:,"MO" endfor for l=0 upto k:,"RE" endfor);fi;
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=1 upto Etape*Etape:
+          trace TestA shifted(l*larg,(k-1)*haut);
+        endfor;
+      endfor;
+      %
+      depla:=Etape*(larg,0);
+      for l=0 upto 2*Etape-1:
+        trace TestA shifted(depla+(0,l*haut));
+      endfor;
+      %
+      depla:=(Etape+1)*(larg,0);
+      trace TestA shifted depla;
+    \end{mplibcode}%
+    }%
   \fi%
 }%
+}%
+}%
+}%
+% 21
+\NewDocumentCommand\BuildPatternVingtEtUna{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{2+\useKV[Pattern]{Etape}*2*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[2+?\times2\times?=\num{\PfMCalculNbMotif}.\]
+        Après essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2].
+        \begin{center}
+          \begin{Geometrie}[Cadre="aucun"]
+          \BuildPatternCodeC
+          u:=2.5mm;
+        Apat[0]=u*(1,1);
+        for k=Etape-1 upto Etape-1:
+          cc[k]=polygonerela(Apat[0] for l=0 upto k:,"AV" endfor ,"AV","MO","MO","RE" for l=1 upto 2*k:,"MO" endfor for l=0 upto k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        cc[1]=polygonerela(Apat[0] for l=0 upto Etape-1:,"AV" endfor for l=1 upto 2*(Etape-1):,"MO" endfor for l=0 upto Etape-1:,"RE" endfor);
+        fill cc[1] withcolor CouleurEtape withtransparency(1,0.35);
+        trace cc[1];
+        cc2:=polygonerela(lrcorner cc[1],"AV","MO","MO","RE");
+        fill cc[2] withcolor CouleurSol withtransparency(1,0.35);
+        trace cc[2];
+      \end{Geometrie}
+        \end{center}
+        En effet, le motif est composé d'un rectangle de largeur \num{\useKV[Pattern]{Etape}} et d'une longueur égale à \num{\fpeval{2*\useKV[Pattern]{Etape}}} auquel on ajoute 2 \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que le motif est composé d'un rectangle de largeur « étape » et de longueur $2\times\text{« étape »}$ auquel on ajoute 2 \PfCDescriptionMotif[2].
+        Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times(2\times\text{« étape »}+1).\]
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[e\times(2\times e+1).\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor ,"AV","MO","MO","RE" for l=1 upto 2*k:,"MO" endfor for l=0 upto k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=1 upto 2*Etape:
+          trace TestA shifted(l*larg,k*haut);
+        endfor;
+      endfor;
+      for k=1 upto 2:
+        trace TestA shifted(Etape*larg,k*haut);
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
 
+% 20
+\NewDocumentCommand\BuildPatternVingta{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{\useKV[Pattern]{Etape}*(2*\useKV[Pattern]{Etape}+1)}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[?\times (2\times?+1)=\num{\PfMCalculNbMotif}.\]
+        Après essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé d'un rectangle de largeur \num{\useKV[Pattern]{Etape}} et d'une longueur égale à \num{\fpeval{2*\useKV[Pattern]{Etape}+1}}%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que le motif est composé d'un rectangle de largeur « étape » et de longueur $2\times\text{« étape »}+1$.
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times(2\times\text{« étape »}+1).\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[e\times(2\times e+1).\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+        \setKV[Pattern]{Echelle=0.7}%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto 2*(k+1):,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto 2*(k+1):,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for k=0 upto Etape+1:
+          trace TestA shifted(k*larg,l*haut);
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
 %19
-\NewDocumentCommand\BuildPatternDixNeuf{}{%
+\NewDocumentCommand\BuildPatternDixNeufa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{\useKV[Pattern]{Etape}*(2+\useKV[Pattern]{Etape})+2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[?\times (?+1)+2=\num{\PfMCalculNbMotif}.\]
+    L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé d'un rectangle de largeur \num{\useKV[Pattern]{Etape}} et d'une longueur égale à \num{\fpeval{2+\useKV[Pattern]{Etape}}} auquel on ajoute 2 \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que le motif est composé d'un rectangle de largeur « étape » et de longueur $\text{« étape »}+2$; auquel on ajoute 2.\par
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}\times(\text{« étape »}+2)+2.\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[e\times(e+2)+2.\]
+      }%
+    }{%
   \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,2);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] ,"AV","DE","AV","MO" for l=0 upto k:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto k:,"RE" endfor ,"MO" ,"RE", "DE", "RE");
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,1);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
   \mplibforcehmode%
   \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    A[0]=(0,0);
-    path piece;
-    piece=unitsquare scaled 5mm shifted(-2.5mm,-2.5mm);
-    drawoptions(withcolor LightGreen);
+    \BuildPatternCode
+    ecartcube:=2pt;
+    \BuildPatternCodeA{#1}
     for k=0 upto Etape+1:
-    for l=0 upto Etape-1:
-    fill piece shifted(5mm*(k,l));
+      for l=0 upto Etape-1:
+        depla:=(k*larg,l*haut);
+        trace TestA shifted depla;
+      endfor;
     endfor;
-    endfor;
-    fill (piece shifted(5mm,-5mm));
-    fill (piece shifted(5mm,Etape*5mm));
-    drawoptions();
-    for k=0 upto Etape+1:
-    for l=0 upto Etape-1:
-    trace piece shifted(5mm*(k,l));
-    endfor;
-    endfor;
-    trace (piece shifted(5mm,-5mm));
-    trace (piece shifted(5mm,Etape*5mm));
-  \end{mplibcode}
+    trace TestA shifted(larg,-haut);
+    trace TestA shifted(larg,Etape*haut);
+  \end{mplibcode}%
+  }%
   \fi%
 }%
+}%
+}%
+}%
 
 %18
-\NewDocumentCommand\BuildPatternDixHuit{}{%
+\NewDocumentCommand\BuildPatternDixHuita{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{3*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[3\times ?=\num{\PfMCalculNbMotif}.\]
+    L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé de 3 \PfCDescriptionMotif[2] reproduits \num{\useKV[Pattern]{Etape}} fois%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que le même motif est répété « étape » fois.\par
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[3\times\text{« étape »}.\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[3\times e.\]
+      }%
+    }{%
   \ifluatex%
-  \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    Somme=0;
-    for k=0 upto Etape-1:
-    A[k]=(0,0)+Somme*5mm*(2,-1);
-    for l=0 upto k:
-    fill polygone(A[k],A[k]+5mm*(2,0),A[k]+5mm*(2,1),A[k]+5mm*(1,1),A[k]+5mm*(1,2),A[k]+5mm*(0,2)) withcolor LightGreen;
-    endfor;
-    for l=0 upto k:
-    trace polygone(A[k],A[k]+5mm*(2,0),A[k]+5mm*(2,1),A[k]+5mm*(1,1),A[k]+5mm*(1,2),A[k]+5mm*(0,2));
-    trace chemin(A[k]+5mm*(1,0),A[k]+5mm*(1,1),A[k]+5mm*(0,1));
-    endfor;
-    Somme:=Somme+1;
-    endfor;
-  \end{mplibcode}
-  \fi
-}
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,\PfMRetiensEtape+2);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k:,"DE","AV","AV" endfor ,"MO","RE" for l=1 upto k:,"MO","RE","RE" endfor ,"MO","RE");
+          trace cc[k];
+          Apat[k+1]:=urcorner cc[k]+u*(1,-1);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(urt)(k,1,Etape,ulcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for k=0 upto Etape-1:
+        depla:=(0,0)+k*(2*larg,-haut);
+        for l=0 upto k:
+          trace TestA shifted depla;
+          trace TestA shifted (depla+(0,-haut));
+          trace TestA shifted (depla+(larg,-haut));
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }
+  \fi%
+}%
+}%
+}%
+}%
 
+%17
+\NewDocumentCommand\BuildPatternDixSepta{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+3*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*3 +1,? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*3 ++1}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé de trois fois \num{\useKV[Pattern]{Etape}} \PfCDescriptionMotif[2] auxquels il faut ajouter 1 \PfCDescriptionMotif[1]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On considère le \PfCDescriptionMotif[1] « central ». On remarque qu'à chaque étape on ajoute 3 carrés.\par
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[1+3\times\text{« étape »}.\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[1+3\times e.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+        \setKV[Pattern]{Echelle=0.75}%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto 2*(k+1):,"AV" endfor ,"MO" for l=0 upto k:,"RE" endfor for l=0 upto k:,"MO" endfor ,"RE" for l=0 upto k:,"DE" endfor for l=0 upto k:,"RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}%
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for l=1 upto Etape:
+        depla:=l*(larg,0);
+        trace TestA shifted depla;
+        depla:=l*(-larg,0);
+        trace TestA shifted depla;
+        depla:=l*(0,haut);
+        trace TestA shifted depla;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
+%16
+\NewDocumentCommand\BuildPatternSeizea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{((1+2*\useKV[Pattern]{Etape}-1)/2)**2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[1+3+5+\dots=\num{\PfMCalculNbMotif}.\]
+    Après essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé de :
+        \[1+3+5+\dots+\num{\fpeval{2*\useKV[Pattern]{Etape}+1}}~\text{\PfCDescriptionMotif[2]}\]
+        soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que les lignes comportent un nombre impair \PfCDescriptionMotif[3] et que la dernière ligne est composée  d'un nombre \PfCDescriptionMotif[3] égal à $2\times\text{« étape »}-1$.\par
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[1+3+5+\dots+2\times\text{« étape »}-1.\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[1+3+5+\dots+2\times e-1.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto 2*(k+1)-2:,"AV" endfor for l=0 upto k:,"MO","RE" endfor for l=1 upto k:,"DE","RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=1 upto Etape:
+        for p=1 upto 2*(l-1)+1:
+          depla:=(larg*(p-l),-haut*(l-1));
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
 %15
-\NewDocumentCommand\BuildPatternQuinze{}{%
+\NewDocumentCommand\BuildPatternQuinzea{mm}{%
   \ifluatex%
   \mplibforcehmode%
   \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    Somme=0;
-    trace (fullcircle scaled 3mm);
-    for k=0 upto Etape-1:
-    A[k]=(0,0)+Somme*4mm*(1,0);
-    %for l=0 upto k:
-    fill ((unitsquare scaled 3mm) shifted(A[k]+4mm*(1,0)-(center (unitsquare scaled 3mm)))) withcolor 0.7white;
-    trace ((unitsquare scaled 3mm) shifted(A[k]+4mm*(1,0)-(center (unitsquare scaled 3mm))));
-    trace (fullcircle scaled 3mm) shifted(A[k]+4mm*(1,-1));
-    trace (fullcircle scaled 3mm) shifted(A[k]+4mm*(1,1));
-    trace (fullcircle scaled 3mm) shifted(A[k]+4mm*(2,0));
-    %endfor;
-    Somme:=Somme+2;
+    \BuildPatternCode
+    bboxmargin:=0pt;
+    ecartcube:=2pt;
+    if picture #1:
+      trace #1;
+    else:
+      label(TEX(#1),(0,0));
+    fi;
+    if picture #2:
+      trace #2;
+    else:
+      label(TEX(#2),(0,0));
+    fi;
+    Largeur:=abs(lrcorner currentpicture-llcorner currentpicture);
+    Hauteur:=abs(urcorner currentpicture-lrcorner currentpicture);
+    currentpicture:=nullpicture;
+    if picture #1:
+      trace #1;
+    else:
+      label(TEX(#1),(0,0));
+    fi;
+    depla:=(0,0);
+    for k=1 upto Etape:
+      if picture #1:
+        trace #1 shifted (depla+(Largeur,Hauteur));
+        trace #1 shifted (depla+(Largeur,-Hauteur));
+        trace #1 shifted (depla+(2*Largeur,0));
+      else:
+        label(TEX(#1),depla+(Largeur,Hauteur));
+        label(TEX(#1),depla+(Largeur,-Hauteur));
+        label(TEX(#1),depla+(2*Largeur,0));
+      fi;
+      depla:=depla+(Largeur,0);
+            if picture #2:
+        trace #2 shifted depla;
+      else:
+        label(TEX(#2),depla);
+      fi;
+      depla:=depla+(Largeur,0);
     endfor;
   \end{mplibcode}
   \fi%
@@ -590,27 +3955,561 @@
 }%
 
 %14
-\NewDocumentCommand\BuildPatternQuatorze{}{%
+\NewDocumentCommand\BuildPatternQuatorzea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+6*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*6 +1,? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*6 ++1}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le motif est composé d'un rectangle de longueur 6 et de largeur 8 auquel on ajoute 1 \PfCDescriptionMotif[1]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[6\times\text{« étape »}+1.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[6\times\useKV[Pattern]{Litteral}+1.\]
+      }%
+    }{%
   \ifluatex%
-  \mplibforcehmode%
-  \begin{mplibcode}
-    pair A[];
-    Etape:=\useKV[Pattern]{Etape};
-    A[0]=(0,0);
-    for l=0 upto Etape-1:
-    for m=0 upto 5:
-    draw (unitsquare scaled 5mm) shifted(A[0]+5mm*(-m,l));
-    endfor;
-    endfor;
-    draw (unitsquare scaled 5mm) shifted(A[0]+5mm*(-5,Etape));
-  \end{mplibcode}
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto 5:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto 4:,"RE" endfor,"MO","RE");
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+        AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=0 upto Etape-1:
+        for m=0 upto 5:
+          depla:=(-m*larg,l*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+      depla:=(-5*larg,Etape*haut);
+      trace TestA shifted depla;
+    \end{mplibcode}%
+    }%
   \fi%
 }%
+}%
+}%
+}%
+% 13
+\NewDocumentCommand\BuildPatternTreizea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{(\useKV[Pattern]{Etape}+1)*\useKV[Pattern]{Etape}/2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          Il faut trouver un nombre tel que
+        \[1+2+\dots=\num{\PfMCalculNbMotif}.\]
+        Par essais successifs, on trouve que l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]. En effet, le nombre de  \PfCDescriptionMotif[2] est:
+      \[1+2+3+\dots+\num{\useKV[Pattern]{Etape}}\]
+      soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[1+(1+2+3+\dots+\text{« étape »}).\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[1+(1+2+3+\dots+\useKV[Pattern]{Litteral}).\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor for l=0 upto k:,"MO","RE" endfor);
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+        AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=1 upto Etape:
+        for p=Etape downto l:
+          depla:=(larg*(Etape-p+1),haut*(l-1));
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+%12
+\NewDocumentCommand\BuildPatternDouzea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{(\useKV[Pattern]{Etape}+1)*(\useKV[Pattern]{Etape}+1)}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit trouver le nombre dont le produit par lui-même est égal à \PfMCalculNbMotif.\par Par essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, le motif est un carré de côté \num{\fpeval{\useKV[Pattern]{Etape}+1}} \PfCDescriptionMotif[2]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que chaque motif est un carré de côté $\text{« étape »}+1$.
+        \par Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[(\text{« étape »}+1)\times(\text{« étape »}+1).\]%
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[(\useKV[Pattern]{Litteral}+1)\times(\useKV[Pattern]{Litteral}+1).\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k+1:,"AV" endfor for l=0 upto k+1:,"MO" endfor for l=0 upto k+1:,"RE" endfor for l=0 upto k+1:,"DE" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(k+1+2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+        AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      for l=1 upto Etape+1:
+        for p=1 upto Etape+1:
+          depla:=(p*larg,l*haut);
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+% 11
+\NewDocumentCommand\BuildPatternOnzea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+2*(\useKV[Pattern]{Etape}-1)}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,-1 *2 +1,? ? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},-1 *2 ++1}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a 1 \PfCDescriptionMotif[1] de l'étape 1 et \num{\fpeval{\useKV[Pattern]{Etape}-1}} fois 2 carrés%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que chaque motif est constitué du \PfCDescriptionMotif[1] de l'étape 1 et 2 \PfCDescriptionMotif[2] sont ajoutés à chaque étape {\em à partir de la deuxième étape}.
+        \par Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[2\times(\text{« étape »}-1)+1.\]%
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[2\times(\useKV[Pattern]{Litteral}-1)+1.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,\PfMRetiensEtape+1);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor,"MO" for l=0 upto k-1:,"RE" endfor for l=0 upto k-1:,"MO" endfor,"RE");
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(k+1+2,-1);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+        AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      trace TestA;
+      for l=1 upto Etape:
+        depla:=l*(larg,0);
+        trace TestA shifted depla;
+        depla:=l*(0,haut);
+        trace TestA shifted depla;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+% 10
+\NewDocumentCommand\BuildPatternDixa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+2*(\useKV[Pattern]{Etape}-1)}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,-1 *2 +1,? ? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},-1 *2 ++1}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a 1 \PfCDescriptionMotif[1] de l'étape 1 et \num{\fpeval{\useKV[Pattern]{Etape}-1}} fois 2 carrés%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que chaque motif est constitué du \PfCDescriptionMotif[1] de l'étape 1 et 2 \PfCDescriptionMotif[2] sont ajoutés à chaque étape {\em à partir de la deuxième étape}.
+        \par Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[2\times(\text{« étape »}-1)+1.\]%
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[2\times(\useKV[Pattern]{Litteral}-1)+1.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,2);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] ,"AV","MO","RE" for l=1 upto k:,"RE" endfor if k>0:,"DE","DE" fi for l=1 upto k:,"AV" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(k+2+2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+        AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      for p=1 upto Etape:
+        depla:=(larg*(p-1),0);
+        trace TestA shifted depla;
+      endfor;
+      for p=1 upto Etape-1:
+        depla:=(larg*(p-1),-haut);
+        trace TestA shifted depla;
+      endfor;
+    \end{mplibcode}%
+  \fi%
+  }%
+}%
+}%
+}%
+}%
+% 9
+\NewDocumentCommand\BuildPatternNeufa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{6+3*(\useKV[Pattern]{Etape}-1)}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+        \ifboolKV[Pattern]{Inverse}{%
+            On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*3 +6,? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*3 ++6}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a les 6 carrés de l'étape 1 et \num{\fpeval{\useKV[Pattern]{Etape}-1}} fois 3 carrés%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          On remarque que chaque motif est constitué « de l'escalier » de l'étape 1 et 3 \PfCDescriptionMotif[2] sont ajoutés à chaque étape {\em à partir de la deuxième étape}.
+        \par Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[3\times(\text{« étape »}-1)+6.\]%
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[3\times(\useKV[Pattern]{Litteral}-1)+6.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[1]=u*(1,1);
+        for k=1 upto Etape:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k+1:,"AV" endfor for l=0 upto 2:,"MO","RE" endfor for l=1 upto k-1:,"RE" endfor for l=0 upto 2:,"DE" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(k+1+2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(1,Etape);
+        for k=1 upto Etape:
+        AffichageEtape(lrt)(k,0,Etape,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      for l=1 upto 3:
+        for p=Etape+2 downto l:
+          depla:=(larg*(Etape-p+1),haut*(l-1));
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
 
+% 8
+\NewDocumentCommand\BuildPatternHuita{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{1+(\useKV[Pattern]{Etape}+1)*\useKV[Pattern]{Etape}/2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          Il faut trouver un nombre tel que
+        \[1+(1+2+\dots)=\num{\PfMCalculNbMotif}.\]
+        Par essais successifs, on trouve que l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a :
+      \[1+2+3+\dots+\num{\useKV[Pattern]{Etape}}=\num{\fpeval{\useKV[Pattern]{Etape}*(\useKV[Pattern]{Etape}+1)/2}}~\text{\PfCDescriptionMotif[2]}\]
+      et 1 \PfCDescriptionMotif[1]%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+          Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[1+(1+2+3+\dots+\text{« étape »}).\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[1+(1+2+3+\dots+\useKV[Pattern]{Litteral}).\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[1]=u*(1,1);
+        for k=1 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=0 upto k:,"AV" endfor,"MO","RE","RE" for l=1 upto k-1:,"MO","RE" endfor for l=0 upto k-1:,"DE" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(k+1+2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(1,Etape);
+        for k=1 upto Etape:
+        AffichageEtape(lrt)(k,0,Etape,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      for l=0 upto Etape:
+        depla:=(larg*(l-1),0);
+        trace TestA shifted depla;
+      endfor;
+      for l=Etape downto 2:
+        for p=l downto 2:
+          depla:=(larg*(l-p-1),haut*(Etape-l+1));
+          trace TestA shifted depla;
+        endfor;
+      endfor;
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
+% 7
+\NewDocumentCommand\BuildPatternSepta{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{2*(\useKV[Pattern]{Etape}-1)+3}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,-1 *2 +3,? ? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},-1 *2 ++3}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        $2\times(\num{\useKV[Pattern]{Etape}}-1)+3$~\PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi{} soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que chaque motif est constitué d'une barre de trois carrés et 2 \PfCDescriptionMotif[2] sont ajoutés à chaque étape {\em à partir de la deuxième étape}.
+        \par Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[2\times(\text{« étape »}-1)+3.\]%
+        \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+          \[2\times(\useKV[Pattern]{Litteral}+1)+3.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[1]=u*(1,1);
+        for k=1 upto Etape:
+        cc[k]=polygonerela(Apat[k] for l=1 upto 3:,"AV" endfor,"MO","RE", for l=1 upto k-1:,"MO" endfor for l=0 upto 1:,"RE" endfor for l=0 upto k-1:,"DE" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(5,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(1,Etape);
+        for k=1 upto Etape:
+          AffichageEtape(lrt)(k,0,Etape,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      depla:=(larg,0);
+      trace TestA;
+      trace TestA shifted depla;
+      trace TestA shifted (2*depla);
+      for l=2 upto Etape:
+        depla:=(0,haut*(l-1));
+        trace TestA shifted depla;
+        trace TestA shifted (depla+(larg,0));
+      endfor;
+    \end{mplibcode}%
+    }
+  \fi%
+}%
+}%
+}%
+}%
+
 %6
-\NewDocumentCommand\BuildPatternSix{}{%
+\NewDocumentCommand\BuildPatternSix{O{1}}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{allumette,allumettes,d'allumettes}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{3*(\useKV[Pattern]{Etape}+1)*\useKV[Pattern]{Etape}/2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+  \ifboolKV[Pattern]{Calcul}{%
+    \ifboolKV[Pattern]{Inverse}{%
+        Il faut trouver un nombre tel que
+        \[3\times(1+2+\dots)=\num{\PfMCalculNbMotif}.\]
+        Par essais successifs, on trouve que l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+      \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a :
+      \[1+2+3+\dots+\num{\useKV[Pattern]{Etape}}=\num{\fpeval{\useKV[Pattern]{Etape}*(\useKV[Pattern]{Etape}+1)/2}}~\text{triangles}\]
+      et il y a 3 allumettes par triangle%
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[3\times(1+2+3+\dots+\text{« étape »}).\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[3\times(1+2+3+\dots+\useKV[Pattern]{Litteral}).\]
+      }%
+    }{%
   \ifluatex%
-    \begin{Allumettes}[Echelle=0.35]
+    \begin{Allumettes}[Echelle=\fpeval{0.30*#1}]
       Etape=\useKV[Pattern]{Etape};
       pair A[],B[],C[],D[],E[];
       A0=(0,0);
@@ -628,104 +4527,554 @@
       trace UnitTriangle shifted(A0+k*(B0-A0)+l*(C0-B0));
       endfor;
       endfor;
-    \end{Allumettes}    
+    \end{Allumettes}
   \fi%
 }%
-
+}%
+}%
+}%
 %5
-\NewDocumentCommand\BuildPatternCinq{}{%
+\NewDocumentCommand\BuildPatternCinqa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{2*\useKV[Pattern]{Etape}*(\useKV[Pattern]{Etape}+1)+3}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \begin{center}
+          \ProgCalcul*[SansCalcul]{?,*\fpeval{\useKV[Pattern]{Etape}+1} *2 +3,? ? \num{\PfMCalculNbMotif}}
+        \end{center}
+        Donc on remonte le programme de calcul :
+        \begin{center}
+          \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*\fpeval{\useKV[Pattern]{Etape}+1} *2 ++3}
+        \end{center}
+        L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+      }{%
+        $2\times\num{\useKV[Pattern]{Etape}}\num{\fpeval{\useKV[Pattern]{Etape}+1}}+2$~\PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi{} soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi%
+      }%
+    }{%
+      \ifboolKV[Pattern]{Formule}{%
+        On remarque que chaque motif est constitué de deux rectangles identiques de longueur $\text{« etape »}+1$ et de largeur $\text{« etape »}$ et 3 \PfCDescriptionMotif[2] sont ajoutés à chaque étape :
+        \begin{center}
+          \begin{Geometrie}[Cadre="aucun"]
+            \BuildPatternCodeC
+        Apat[Etape]=u*(5,Etape);
+        for k=Etape upto Etape:
+        cc[k]=polygonerela(Apat[k],"AV","MO" for l=1 upto k-1:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto k:,"RE" endfor ,"DE","AV" for l=0 upto k-1:,"DE" endfor for l=0 upto k-1:,"RE" endfor ,"MO","RE" for l=0 upto k:,"DE" endfor for l=0 upto k:,"AV" endfor for l=1 upto k-1:,"MO" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(2+k+k+1,0);
+        endfor;
+        GrillePattern;
+        trace cc[Etape];
+        Apat[1]:=u*(1,1);
+        for k=Etape upto Etape:
+        cc[1]:=polygonerela(Apat[1],for l=0 upto k:,"AV" endfor for l=0 upto k-1:,"MO" endfor for l=0 upto k:,"RE" endfor);
+        Apat[2]:=urcorner cc[1];
+        cc[2]:=polygonerela(Apat[2],for l=0 upto k-1:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto k-1:,"RE" endfor);
+        Apat[3]:=ulcorner cc[1];
+        cc[3]:=polygonerela(Apat[3],"AV","MO","RE");
+        Apat[4]:=urcorner cc[1];
+        cc[4]:=polygonerela(Apat[4],"DE","AV","MO");
+        Apat[5]:=ulcorner cc[2];
+        cc[5]:=polygonerela(Apat[5],"RE","DE","AV");
+        endfor;
+        for k=1 upto 2:
+        fill cc[k] withcolor CouleurEtape withtransparency(1,0.35);
+        endfor;
+        for k=3 upto 5:
+        fill cc[k] withcolor CouleurSol withtransparency(1,0.35);
+        endfor;
+        for k=1 upto 5:
+        trace cc[k];
+        endfor;
+        \end{Geometrie}
+        \end{center}
+        Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[2\times\text{« étape »}\times(\text{« étape »}+1)+3.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[2\times\useKV[Pattern]{Litteral}\times(\times\useKV[Pattern]{Litteral}+1)+3.\]
+      }%
+    }{%
   \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+        \setKV[Pattern]{Echelle=0.7}
+        \begin{Geometrie}[Cadre="aucun"]
+          \BuildPatternCodeC
+        Apat[1]=u*(3,\PfMRetiensEtape+1);
+        for k=1 upto Etape:
+        cc[k]=polygonerela(Apat[k],"AV","MO" for l=1 upto k-1:,"AV" endfor for l=0 upto k:,"MO" endfor for l=0 upto k:,"RE" endfor ,"DE","AV" for l=0 upto k-1:,"DE" endfor for l=0 upto k-1:,"RE" endfor ,"MO","RE" for l=0 upto k:,"DE" endfor for l=0 upto k:,"AV" endfor for l=1 upto k-1:,"MO" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(2+k+k+1,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(1,Etape);
+        for k=1 upto Etape:
+          AffichageEtape(lrt)(k,0,Etape,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
     \mplibforcehmode%
-    \begin{mplibcode}
-      pair A[];
-      Etape:=\useKV[Pattern]{Etape};
-      A0=(0,0);
-      for k=Etape-1 upto Etape-1:
-      drawoptions(withcolor LightSteelBlue);
-      fill (fullcircle scaled 3mm) shifted A[0];
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      k=Etape-1;
+      trace TestA;
       for l=0 upto k:
-      for m=1 upto k+2:
-      fill (fullcircle scaled 3mm) shifted(A[0]+5mm*(l,m));
-      fill symetrie((fullcircle scaled 3mm) shifted(A[0]+5mm*(l,m)),A[0],A[0]+(-1,1));
+        for m=1 upto k+2:
+          depla:=(larg*l,haut*m);
+          trace TestA shifted depla;
+          trace TestA shifted symetrie(depla,(0,0),(-1,1));
+        endfor;
       endfor;
+      depla:=(-larg,haut*(k+2));
+      trace TestA shifted depla;
+      trace TestA shifted symetrie(depla,(0,0),(-1,1));
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
+%4
+\NewDocumentCommand\BuildPatternQuatrea{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{4*\useKV[Pattern]{Etape}+1}}%
+  \ifboolKV[Pattern]{Resultat}{%
+      \num{\PfMCalculNbMotif}%
+      }{%
+  \ifboolKV[Pattern]{Calcul}{%
+    \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+          \begin{center}
+            \ProgCalcul*[SansCalcul]{?,*4 +1,? \num{\PfMCalculNbMotif}}
+          \end{center}
+          Donc on remonte le programme de calcul :
+          \begin{center}
+            \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*4 ++1}
+          \end{center}
+          L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+      $4\times\num{\useKV[Pattern]{Etape}}+1$~\PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi{} soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi%
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{On remarque que chaque motif est constitué d'un \PfCDescriptionMotif[2] central et 4 \PfCDescriptionMotif[2] sont ajoutés à chaque étape. Le nombre de \PfCDescriptionMotif[2] se calcule sous la forme :\[1+\text{« étape »}\times4.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[4\useKV[Pattern]{Litteral}+1.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+                \setKV[Pattern]{Echelle=0.7}%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(3,\PfMRetiensEtape+2);
+        for k=0 upto Etape-1:
+          cc[k]=polygonerela(Apat[k] for l=0 upto k:,"DE","AV" endfor for l=0 upto k:,"MO","RE" endfor ,"MO" for l=0 upto k:,"AV","MO" endfor for l=0 upto k:,"RE","DE" endfor ,"RE" for l=0 upto k:,"MO","RE" endfor for l=0 upto k:,"DE","AV" endfor, "DE" for l=0 upto k:,"RE","DE" endfor for l=0 upto k:,"AV","MO" endfor);
+          trace cc[k];
+          Apat[k+1]:=(point(0) of cc[k])+u*(2+k+3+k,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      %
+      trace TestA;
+      for l=1 upto Etape:
+        for p=1 upto l:
+          depla:=p*(larg,haut);
+          trace TestA shifted depla;
+          depla:=p*(larg,-haut);
+          trace TestA shifted depla;
+          depla:=p*(-larg,-haut);
+          trace TestA shifted depla;
+          depla:=p*(-larg,haut);
+          trace TestA shifted depla;
+        endfor;
       endfor;
-      fill (fullcircle scaled 3mm) shifted(A[0]+5mm*(-1,k+2));
-      fill symetrie((fullcircle scaled 3mm) shifted(A[0]+5mm*(-1,k+2)),A[0],A[0]+(-1,1));
-      % trace
-      drawoptions();
-      trace (fullcircle scaled 3mm) shifted A[0];
-      for l=0 upto k:
-      for m=1 upto k+2:
-      trace (fullcircle scaled 3mm) shifted(A[0]+5mm*(l,m));
-      trace symetrie((fullcircle scaled 3mm) shifted(A[0]+5mm*(l,m)),A[0],A[0]+(-1,1));
+    \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
+
+%3
+\NewDocumentCommand\BuildPatternTroisa{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{\useKV[Pattern]{Etape}*(\useKV[Pattern]{Etape}+1)/2}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+        On doit réussir à trouver le nombre entier tel :
+        \[1+2+\dots=\num{\PfMCalculNbMotif}.\]
+      Par essais successifs, l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+      $1+2+3+\dots+\num{\useKV[Pattern]{Etape}}$~\PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi{} soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi%
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{%
+        On double le motif pour observer la situation suivante :
+        \begin{center}
+          \begin{Geometrie}[Cadre="aucun"]
+            \BuildPatternCodeC
+            Apat[0]=u*(1,1);
+            for k=0 upto Etape:
+              cc[k]=(u*(0,k+2)--u*(0,0)--u*(k+2,0) for l=1 upto k+2:--u*(k+3-l,0+l)--u*(k+2-l,0+l) endfor--cycle) shifted (Apat[k]-u*(0,0));
+              trace cc[k];
+              Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+            endfor;
+            GrillePattern;
+            for k=0 upto Etape:
+            fill cc[k] withcolor CouleurEtape withtransparency(1,0.35);
+              fill (symetrie(cc[k],iso(lrcorner cc[k],ulcorner cc[k])) shifted(u*(1,0))) withcolor CouleurSol withtransparency(1,0.35);
+              trace cc[k];
+              trace symetrie(cc[k],iso(lrcorner cc[k],ulcorner cc[k])) shifted(u*(1,0));
+            endfor;
+        \end{Geometrie}
+      \end{center}
+      À chaque fois, un rectangle de longueur $\text{« étape »}+1$ et de largeur « étape  ». Donc la formule pour déterminer le nombre \PfCDescriptionMotif[3] est :
+      \[(\text{« étape »}+1)\times\text{« étape »}\div2.\]
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[(\useKV[Pattern]{Litteral}+1)\times\useKV[Pattern]{Litteral}\div2.\]
+      }%
+    }{%
+  \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+          cc[k]=(u*(0,k+2)--u*(0,0)--u*(k+2,0) for l=1 upto k+2:--u*(k+3-l,0+l)--u*(k+2-l,0+l) endfor--cycle) shifted (Apat[k]-u*(0,0));
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+u*(2,0);
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape,llcorner cc[k]);
+        endfor;
+        \end{Geometrie}
+    }{%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      \BuildPatternCode
+      ecartcube:=2pt;
+      \BuildPatternCodeA{#1}
+      for l=1 upto Etape+1:
+        for p=Etape+1 downto l:
+          depla:=(larg*(Etape-p+1),haut*(l-1));
+          trace TestA shifted depla;
+        endfor;
       endfor;
-      endfor;
-      trace (fullcircle scaled 3mm) shifted(A[0]+5mm*(-1,k+2));
-      trace symetrie((fullcircle scaled 3mm) shifted(A[0]+5mm*(-1,k+2)),A[0],A[0]+(-1,1));
-      endfor;    
-    \end{mplibcode}
+    \end{mplibcode}%
+    }
   \fi%
-}
+}%
+}%
+}%
+}%
 
-\NewDocumentCommand\BuildPatternQuatre{}{%
+%2
+\NewDocumentCommand\BuildPatternDeux{}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{cube,cubes,de cubes}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{2*\useKV[Pattern]{Etape}-1}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+    \ifboolKV[Pattern]{Calcul}{%
+      \ifboolKV[Pattern]{Inverse}{%
+          On doit réussir à trouver le nombre entier tel :
+          \begin{center}
+            \ProgCalcul*[SansCalcul]{?,*2 -1,? \num{\PfMCalculNbMotif}}
+          \end{center}
+          Donc on remonte le programme de calcul :
+          \begin{center}
+            \ProgCalcul*[Direct=false]{\useKV[Pattern]{Etape},*2 -1}
+          \end{center}
+          L'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+    \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a une ligne horizontale de \num{\useKV[Pattern]{Etape}}~\PfCDescriptionMotif[1]\ifnum\useKV[Pattern]{Etape}>1\relax s\fi{} et une ligne verticale de \num{\fpeval{\useKV[Pattern]{Etape}-1}}~\PfCDescriptionMotif[1]\ifnum\fpeval{\useKV[Pattern]{Etape}-1}>1\relax s\fi%
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[\text{« étape »}+\text{« étape »}-1.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[2\times\useKV[Pattern]{Litteral}-1.\]
+      }%
+    }{%
   \ifluatex%
     \mplibforcehmode%
+    \ifboolKV[Pattern]{Grille}{%
+       \begin{Geometrie}[Cadre="aucun"]
+         \BuildPatternCodeIso  
+        somme:=1;
+        for nbe=1 upto Etape:
+          ptpattern[nbe]:=u*(alpha*somme,(somme mod 2)*beta);%+beta*somme);
+          if nbe=Etape:
+            TypeCube:=cadrecubesol;
+          else:
+            TypeCube:=cadrecube;
+          fi;
+          cc[nbe]=image(
+          for k=1 upto nbe:
+            trace TypeCube shifted(ptpattern[nbe]+k*u*(alpha,-beta));
+            endfor;
+          for k=2 upto nbe:
+            trace TypeCube shifted(ptpattern[nbe]+nbe*u*(alpha,-beta)+(k-1)*u*(0,1));
+          endfor;
+          );
+          trace cc[nbe];
+          somme:=somme+nbe+2;
+        endfor;
+        GrillePatternIso;
+        AffichagePattern(1,Etape);
+      \end{Geometrie}
+    }%
+    {%
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
       %
-      fill ((unitsquare scaled 5mm) shifted (5mm*0*(1,1))) withcolor LightSteelBlue;
-      trace ((unitsquare scaled 5mm) shifted (5mm*0*(1,1)));
-      for k=1 upto Etape:
-      for l=1 upto k:
-      fill ((unitsquare scaled 5mm) shifted (5mm*l*(1,1))) withcolor LightSteelBlue;
-      fill ((unitsquare scaled 5mm) shifted (5mm*l*(1,-1)))withcolor LightSteelBlue;
-      fill ((unitsquare scaled 5mm) shifted (5mm*l*(-1,1))) withcolor LightSteelBlue;
-      fill ((unitsquare scaled 5mm) shifted (5mm*l*(-1,-1))) withcolor LightSteelBlue;
-      endfor;
-      endfor;
+      input PfCSolid;
       %
+      intensite:=1.5;
+      Ferme[0]:=false;
+      outcolor:=LightSteelBlue;
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      %
+      Initialisation(2500,40,20,50);
+      Objetcube0("a=0.25");
       for k=1 upto Etape:
-      for l=1 upto k:
-      trace ((unitsquare scaled 5mm) shifted (5mm*l*(1,1)));
-      trace ((unitsquare scaled 5mm) shifted (5mm*l*(1,-1)));
-      trace ((unitsquare scaled 5mm) shifted (5mm*l*(-1,1)));
-      trace ((unitsquare scaled 5mm) shifted (5mm*l*(-1,-1)));
+        TR:=(0,2*k,0);
+        ObjetDeplacement1(0);
+        nbobj:=1;
+        for l=1 upto k-1:
+          TR:=(0,0.25*l,0);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
+        for l=1 upto k-1:
+          TR:=(0,0.25*(k-1),0.25*l);
+          nbobj:=nbobj+1;
+          ObjetDeplacement[nbobj](1);
+        endfor;
       endfor;
-      endfor;
-      %
+      DessineFusion;
     \end{mplibcode}
+    }%
   \fi%
 }%
+}%
+}%
+}%
+%1a
+\NewDocumentCommand\BuildPatternUna{O{1}}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{allumette,allumettes,d'allumettes}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{2*(\useKV[Pattern]{Etape}+1)*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+      \num{\PfMCalculNbMotif}%
+      }{%
+  \ifboolKV[Pattern]{Calcul}{%
+    \ifboolKV[Pattern]{Inverse}{%
+        Il faut trouver un nombre dont son produit par son suivant  est égal à
+        \[\num{\PfMCalculNbMotif}\div2=\num{\fpeval{\PfMCalculNbMotif/2}}.\]
+        Par essais successifs, on trouve que l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+    \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi. En effet, il y a \num{\fpeval{\useKV[Pattern]{Etape}+1}} lignes horizontales de \num{\useKV[Pattern]{Etape}}~\PfCDescriptionMotif[1]\ifnum\useKV[Pattern]{Etape}>1\relax s\fi{} et \num{\fpeval{\useKV[Pattern]{Etape}+1}} lignes verticales de \num{\useKV[Pattern]{Etape}}~\PfCDescriptionMotif[1]\ifnum\useKV[Pattern]{Etape}>1\relax s\fi{} 
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{Le nombre \PfCDescriptionMotif[3] se calcule sous la forme :\[2\times(\text{« étape »}+1)\times\text{« étape »}.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[2\times(\useKV[Pattern]{Litteral}+1)\times\useKV[Pattern]{Litteral}.\]
+      }%
+    }{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{Allumettes}[Echelle=\fpeval{0.2*#1}]%
+      Etape=\useKV[Pattern]{Etape};
+      %
+      pair depla;
+      %
+      pair A[];
+      A0=(0,0);
+      A1-A0=u*(1,0);
+      A3-A0=u*(0,1);
+      A2-A1=A3-A0;
+      %
+      for l=0 upto Etape-1:
+        for p=0 upto Etape-1:
+          depla:=u*(p,l);
+          trace Allu(A0,A1) shifted depla;
+          trace Allu(A0,A3) shifted depla;
+          trace Allu(A1,A2) shifted depla;
+          trace Allu(A2,A3) shifted depla;
+        endfor;
+      endfor;
+    \end{Allumettes}%
+  \fi%
+}%
+}%
+}%
+}%
+%1
+\NewDocumentCommand\BuildPatternUn{m}{%
+  \setsepchar{,}\ignoreemptyitems%
+  \greadlist*\PfCDescriptionMotif{carré,carrés,de carrés}%
+  \reademptyitems%
+  \edef\PfMCalculNbMotif{\fpeval{\useKV[Pattern]{Etape}*\useKV[Pattern]{Etape}}}%
+  \ifboolKV[Pattern]{Resultat}{%
+    \num{\PfMCalculNbMotif}%
+  }{%
+  \ifboolKV[Pattern]{Calcul}{%
+    \ifboolKV[Pattern]{Inverse}{%
+      Comme $\num{\useKV[Pattern]{Etape}}\times\num{\useKV[Pattern]{Etape}}=\num{\PfMCalculNbMotif}$ alors l'étape correspondante au motif cherché est l'étape \num{\useKV[Pattern]{Etape}}.%
+    }{%
+    $\num{\useKV[Pattern]{Etape}}\times\num{\useKV[Pattern]{Etape}}$~\PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi{} soit \num{\PfMCalculNbMotif} \PfCDescriptionMotif[1]\ifnum\PfMCalculNbMotif>1\relax s\fi%
+    }%
+  }{%
+    \ifboolKV[Pattern]{Formule}{L'aire du motif se calcule sous la forme :\[\text{« étape »}\times\text{« étape »}.\]%
+      \ifemptyKV[Pattern]{Litteral}{}{Si on appelle $\useKV[Pattern]{Litteral}$ le numéro de l'étape alors la formule s'écrit :
+        \[\useKV[Pattern]{Litteral}\times\useKV[Pattern]{Litteral}\text{ ou }\useKV[Pattern]{Litteral}^2.\]
+      }%
+    }{%
+      \ifluatex%
+    \ifboolKV[Pattern]{Grille}{%
+      \begin{Geometrie}[Cadre="aucun"]
+        \BuildPatternCodeC
+        Apat[0]=u*(1,1);
+        for k=0 upto Etape-1:
+         cc[k]=polygone(u*(0,0),u*(k+1,0),u*(k+1,k+1),u*(0,k+1)) shifted (Apat[k]-u*(0,0));
+          trace cc[k];
+          Apat[k+1]:=lrcorner cc[k]+(u*(2,0));
+        endfor;
+        GrillePattern;
+        AffichagePattern(0,Etape-1);
+        for k=0 upto Etape-1:
+          AffichageEtape(lrt)(k,1,Etape-1,llcorner cc[k]);
+        endfor;
+      \end{Geometrie}
+    }{%
+      \mplibforcehmode%
+      \begin{mplibcode}%
+        \BuildPatternCode
+        ecartcube:=2pt;
+        \BuildPatternCodeA{#1}
+        %
+        for l=1 upto Etape:
+          for p=1 upto Etape:
+            depla:=(p*larg,l*haut);
+            trace TestA shifted depla;
+          endfor;
+        endfor;
+      \end{mplibcode}%
+    }%
+  \fi%
+}%
+}%
+}%
+}%
 
-\NewDocumentCommand\BuildPatternTrois{}{%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%284
+\NewDocumentCommand\BuildPatternDeuxCentQuatreVingtQuatre{}{
   \ifluatex%
     \mplibforcehmode%
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
-      %
+      input PfCSolid;
+
+      intensite:=1.5;
+      Ferme[0]:=false;
+      outcolor:=LightSteelBlue;
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+
+      Initialisation(2500,40,20,50);
+      Objetcube1("a=0.25");
+      nbobj:=1;
+      TR:=(0,a,0);
+      %base
+      for k=1 upto 2:
+      NBobj:=nbobj;
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      endfor;
+      % barre gauche
       for k=1 upto Etape:
-      for l=Etape downto k:
-      fill ((unitsquare scaled 5mm) shifted (5mm*(Etape-l+1,k-1))) withcolor LightSteelBlue;
+      TR:=(0,0,k*a);
+      NBobj:=1;
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
+      %barre gauche
+      for k=1 upto Etape-1:
+      TR:=(0,2*a,k*a);
+      NBobj:=1;
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
-      for k=1 upto Etape:
-      for l=Etape downto k:
-      trace ((unitsquare scaled 5mm) shifted (5mm*(Etape-l+1,k-1))) withcolor white;
+      DessineFusion;
+    \end{mplibcode}
+  \fi
+}%
+
+% 254
+\NewDocumentCommand\BuildPatternDeuxCentCinquanteQuatre{}{
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}
+      Etape:=\useKV[Pattern]{Etape};
+      for k=0 upto Etape-1:
+      for l=0 upto Etape-1:
+      fill ((fullcircle scaled 4mm) shifted (5mm*(l,k))) withcolor LightSteelBlue;
+      trace ((fullcircle scaled 4mm) shifted (5mm*(l,k)));
       endfor;
       endfor;
-      %
+      fill ((fullcircle scaled 4mm) shifted (5mm*(0,-1))) withcolor LightSteelBlue;
+      trace ((fullcircle scaled 4mm) shifted (5mm*(0,-1)));
+      fill ((fullcircle scaled 4mm) shifted (5mm*(-1,0))) withcolor LightSteelBlue;
+      trace ((fullcircle scaled 4mm) shifted (5mm*(-1,0)));
+      fill ((fullcircle scaled 4mm) shifted (5mm*(0,Etape))) withcolor LightSteelBlue;
+      trace ((fullcircle scaled 4mm) shifted (5mm*(0,Etape)));
     \end{mplibcode}
-  \fi%
+  \fi
 }%
 
-\NewDocumentCommand\BuildPatternDeux{}{%
+%156
+\NewDocumentCommand\BuildPatternCentCinquanteSix{}{
   \ifluatex%
     \mplibforcehmode%
     \begin{mplibcode}
       Etape:=\useKV[Pattern]{Etape};
-      %
       input PfCSolid;
-      % 
+
       intensite:=1.5;
       Ferme[0]:=false;
       outcolor:=LightSteelBlue;
@@ -732,52 +5081,96 @@
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-      % 
+
       Initialisation(2500,40,20,50);
-      Objetcube0("a=0.25");
+      Objetcube1("a=0.25");
+      nbobj:=1;
+      TR:=(0,a,0);
       for k=1 upto Etape:
-      TR:=(0,2*k,0);
-      ObjetDeplacement1(0);
-      nbobj:=1;
-      for l=1 upto k-1:
-      TR:=(0,0.25*l,0);
+      NBobj:=nbobj;
       nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](1);
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
-      for l=1 upto k-1:
-      TR:=(0,0.25*(k-1),0.25*l);
+      TR:=(0,0,-0.25);
+      for k=1 upto Etape:
+      NBobj:=nbobj;
       nbobj:=nbobj+1;
-      ObjetDeplacement[nbobj](1);
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
+      TR:=(0,0.25,0);
+      for k=1 upto Etape:
+      NBobj:=nbobj;
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
-      %nbobj=13;
+      %nbobj=4;
       DessineFusion;
     \end{mplibcode}
-  \fi%
+  \fi
 }%
 
-\NewDocumentCommand\BuildPatternUn{}{%
+%155
+\NewDocumentCommand\BuildPatternCentCinquanteCinq{}{
   \ifluatex%
-    \mplibforcehmode%
+    \mplibforcehmode
     \begin{mplibcode}
-      u:=5mm;
-      pair A[],O[];
-      path cc[],dd[];
-      Etape=\useKV[Pattern]{Etape};
-      %
-      k:=Etape;
-      O[k]=(0,0);
-      dd[k]=unitsquare scaled (k*u);
-      cc[k]=dd[k] shifted (O[k]-center(dd[k]));
-      trace cc[k];
-      for l=1 upto 4:
-      A[l]:=point l of cc[k];
+      Etape:=\useKV[Pattern]{Etape};
+      input PfCSolid;
+
+      intensite:=1.5;
+      Ferme[0]:=false;
+      outcolor:=LightSteelBlue;
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+
+      Initialisation(2500,40,20,50);
+      angx:=-40;
+      Objetcube1("a=0.25");
+      angx:=0;
+      nbobj:=1;
+      TR:=(0,a*cosd(-40),a*sind(-40));
+      for k=0 upto Etape-2:
+      NBobj:=nbobj;
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
       endfor;
-      %horizontales et verticales
-      for m=1 upto k-1:
-      trace ((m/k)[A1,A4])--((m/k)[A2,A3]);
-      trace ((m/k)[A1,A2])--((m/k)[A4,A3]);
+      NBobj:=1;
+      TR:=(0,-a*cosd(-40),-a*sind(-40));
+      for k=0 upto Etape-2:
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      NBobj:=nbobj;
       endfor;
+      NBobj:=1;
+      TR:=(0,a*sind(-40),-a*cosd(-40));
+      for k=0 upto Etape-2:
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      NBobj:=nbobj;
+      endfor;
+      NBobj:=1;
+      TR:=(0,-a*sind(-40),a*cosd(-40));
+      for k=0 upto Etape-2:
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      NBobj:=nbobj;
+      endfor;
+      NBobj:=1;
+      TR:=(a,0,0);%
+      for k=0 upto Etape-2:
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      NBobj:=nbobj;
+      endfor;
+      NBobj:=1;
+      TR:=(-a,0,0);
+      for k=0 upto Etape-2:
+      nbobj:=nbobj+1;
+      ObjetDeplacement[nbobj](NBobj);
+      NBobj:=nbobj;
+      endfor;
+      DessineFusion;
     \end{mplibcode}
   \fi%
-}%
\ No newline at end of file
+}%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCPourcentage.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCPourcentage.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCPourcentage.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,19 +1,22 @@
 %%%
 % Application : pourcentage
 %%%
-\def\filedatePourcentage{2025/05/27}%
-\def\fileversionPourcentage{0.1a}%
+\def\filedatePourcentage{2025/08/08}%
+\def\fileversionPourcentage{0.1b}%
 \message{-- \filedatePourcentage\space v\fileversionPourcentage}%
 %
-\setKVdefault[ClesPourcentage]{Appliquer,Calculer=false,Augmenter=false,Reduire=false,Fractionnaire=false,Decimal,Formule=false,Concret=false,GrandeurA=Grandeur A,GrandeurB=Total,Largeur=1cm,MotReduction=diminution,AideTableau=false,ColorFill=white,CouleurTab=gray!15,Unite={}}
-\defKV[ClesPourcentage]{Unite=\ifempty{#1}{}{\setKV[ClesPourcentage]{Concret}}}%
-\newcommand\Pourcentage[3][]{%
+\setKVdefault[ClesPourcentage]{Appliquer,Calculer=false,Augmenter=false,Reduire=false,Fractionnaire=false,Decimal,Formule=false,GrandeurA=Grandeur A,GrandeurB=Total,Largeur=1cm,MotReduction=diminution,AideTableau=false,ColorFill=white,CouleurTab=gray!15,Unite={},EchellePourcent=false,Vide=false,CouleurEchelle=LightSteelBlue,ACompleter=false}
+%
+\NewDocumentCommand\Pourcentage{omm}{%
   \useKVdefault[ClesPourcentage]%
   \setKV[ClesPourcentage]{#1}%
+  \ifboolKV[ClesPourcentage]{EchellePourcent}{%
+    \PfMBuildEchellePourcentage[#1]{#2}{#3}%
+  }{%
   \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}}}{}\]
+        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}\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}} de \num{#2}~\%, cela donne :
+        \[\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times\left(1-\frac{\num{#2}}{100}\right)=\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times(1-\num{\fpeval{#2/100}})=\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times\num{\fpeval{(1-#2/100)}}=\num{\fpeval{#3*(1-#2/100)}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}.\]
       }{%
         Calculons ce que repr\'esente la \useKV[ClesPourcentage]{MotReduction} de \num{#2}~\%.
         \ifboolKV[ClesPourcentage]{AideTableau}{%
@@ -25,16 +28,16 @@
             \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}}{}.}
-      }
+          On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#2/100}}\times\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*#2/100}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}. Donc un total de $\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}-\num{\fpeval{#3*#2/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*(1-#2/100)}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.%
+        }{Pour calculer \num{#2}~\% de \num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}, on effectue le calcul :
+        \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}}{}.\]%
+       On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#3*#2/100}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.\\Donc un total de $\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}-\num{\fpeval{#3*#2/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*(1-#2/100)}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\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}}}{}\]
+        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}\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}} de \num{#2}~\%, cela donne :
+        \[\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times\left(1+\frac{\num{#2}}{100}\right)=\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times(1+\num{\fpeval{#2/100}})=\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\times\num{\fpeval{(1+#2/100)}}=\num{\fpeval{#3*(1+#2/100)}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}.\]
       }{%
         Calculons ce que repr\'esente l'augmentation de \num{#2}~\%. %
         \ifboolKV[ClesPourcentage]{AideTableau}{%
@@ -46,11 +49,11 @@
             \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}}{}.}
-      }
+          On obtient une augmentation de $\num{\fpeval{#2/100}}\times\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*#2/100}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.\\Donc un total de $\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}+\num{\fpeval{#3*#2/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*(1+#2/100)}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.%
+        }{Pour calculer \num{#2}~\% de \num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}, on effectue le calcul :
+          \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}}{}.\]%
+          On obtient une augmentation de $\num{\fpeval{#3*#2/100}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.\\Donc un total de $\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}+\num{\fpeval{#3*#2/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\num{\fpeval{#3*(1+#2/100)}}$\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}.}%
+      }%
     }{%
       \ifboolKV[ClesPourcentage]{Calculer}{%
         \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}%
@@ -63,9 +66,85 @@
         \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}}}{}}{}\]%
+        Pour calculer \num{#2}~\% de \num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\useKV[ClesPourcentage]{Unite}}, on effectue le calcul :%
+        \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifemptyKV[ClesPourcentage]{Unite}{}{~\text{\useKV[ClesPourcentage]{Unite}}}}{}.\]%
       }%
     }%
   }%
+}%
+}%
+
+\NewDocumentCommand\PfMBuildEchellePourcentage{omm}{%
+  \setKV[ClesPourcentage]{#1}%
+  \modulo{#2}{10}
+  \ifnum\remainder=0\relax%
+    \PfMBuildEchellePourcentageMP{10}{#2}{#3}%
+  \else%
+    \modulo{#2}{5}
+    \ifnum\remainder=0\relax%
+      \PfMBuildEchellePourcentageMP{5}{#2}{#3}%
+    \else%
+      Le pourcentage choisi n'est pas adapté à une échelle de pourcentage.%
+    \fi%
+  \fi%
+}%
+
+\NewDocumentCommand\PfMBuildEchellePourcentageMP{mmm}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{Geometrie}[Cadre="aucun"]
+      boolean Vide,ACompleter;
+      Vide=\useKV[ClesPourcentage]{Vide};
+      ACompleter=\useKV[ClesPourcentage]{ACompleter};
+      color CoulFond;
+      CoulFond=\useKV[ClesPourcentage]{CouleurEchelle};
+      %
+      pair A[],B[],M[],N[],O[],P[];
+      A1=u*(0,1.5);
+      A2-A1=u*(7,0);
+      A3-A2=u*(0,1);
+      A4-A3=A1-A2;
+      B1=u*(0,0);
+      B2-B1=u*(7,0);
+      B3-B2=u*(0,1);
+      B4-B3=B1-B2;
+      base=100/#1;
+      for k=0 upto base:
+        M[k]=(k/base)[A1,A2];
+        N[k]=(k/base)[A4,A3];
+        O[k]=(k/base)[B1,B2];
+        P[k]=(k/base)[B4,B3];
+      endfor;
+      if Vide=false:
+        fill polygone(M0,M[#2/#1],N[#2/#1],N0) withcolor CoulFond;
+        fill polygone(O0,O[#2/#1],P[#2/#1],P0) withcolor CoulFond;
+      fi;
+      if ACompleter=false:
+        for k=1 step (10/#1) until base-1:
+          label.top(TEX("\rule[-1pt]{0pt}{0pt}\scriptsize\num{\fpeval{"&decimal(k)&"*#1*#3/100}}\ifempty{Unite}{}{~\useKV[ClesPourcentage]{Unite}}"),P[k]);
+        endfor;
+      fi;
+      k:=0;  
+      label.top(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"*#1*#3/100}}\ifempty{Unite}{}{~\useKV[ClesPourcentage]{Unite}}"),P[k]);
+      k:=base;
+      label.top(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"*#1*#3/100}}\ifempty{Unite}{}{~\useKV[ClesPourcentage]{Unite}}"),P[k]);  
+      for k=1 step (10/#1) until base-1:
+        label.top(TEX("\scriptsize\SI{"&decimal(k*#1)&"}{\percent}"),N[k]);
+      endfor;
+      label.top(TEX("\footnotesize\SI{"&decimal(0)&"}{\percent}"),N[0]);
+      label.top(TEX("\footnotesize\SI{"&decimal(100)&"}{\percent}"),N[base]);
+      for k=0 upto base:
+        trace M[k]--N[k];
+        trace O[k]--P[k];
+      endfor;
+      drawoptions(withpen pencircle scaled 1.02);  
+      for k=0 step (10/#1) until base:
+        trace M[k]--N[k];
+        trace O[k]--P[k];
+      endfor;
+      trace polygone(A1,A2,A3,A4);
+      trace polygone(B1,B2,B3,B4);  
+      drawoptions();
+    \end{Geometrie}%
+  \fi%
 }%
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCPythagore.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCPythagore.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCPythagore.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -5,7 +5,7 @@
 \def\fileversionPythagore{0.1a}%
 \message{-- \filedatePythagore\space v\fileversionPythagore}%
 %
-\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,Perso=false,AllPerso=false,SansMots=false,Decalage=5mm,ModeleCouleur=5,ValeurA={},ValeurB={},ValeurC={}}%
+\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,Perso=false,AllPerso=false,SansMots=false,Decalage=5mm,ModeleCouleur=5,ValeurA={},ValeurB={},ValeurC={},Dys=false}%
 \defKV[ClesPythagore]{%
   ValeurA=\ifempty{#1}{}{\setKV[ClesPythagore]{EnchaineA}},%
   ValeurB=\ifempty{#1}{}{\setKV[ClesPythagore]{EnchaineB}},%
@@ -29,6 +29,9 @@
     \mplibforcehmode%
     \begin{mplibcode}
       defaultcolormodel := \useKV[ClesPythagore]{ModeleCouleur};
+
+      boolean Dys;
+      Dys=\useKV[ClesPythagore]{Dys};
       
     u:=\useKV[ClesPythagore]{Echelle};
     pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
@@ -52,7 +55,11 @@
     draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)};
     draw D--E--F;
     numeric decalage;
-    decalage=3mm;
+    if Dys:
+    decalage=2*\useKV[ClesPythagore]{Decalage};
+    else:
+    decalage=\useKV[ClesPythagore]{Decalage};
+    fi;
     if (#4<#5) or (#4=#5) :
     if ypart(B)>ypart(O) :
         label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B)));
@@ -136,8 +143,10 @@
    \mplibforcehmode
    \begin{mplibcode}
      defaultcolormodel := \useKV[ClesPythagore]{ModeleCouleur};
-    u:=\useKV[ClesPythagore]{Echelle};
-    decalage=\useKV[ClesPythagore]{Decalage};
+     u:=\useKV[ClesPythagore]{Echelle};
+     boolean Dys;
+     Dys=\useKV[ClesPythagore]{Dys};
+     decalage=if Dys:2* fi \useKV[ClesPythagore]{Decalage};
     pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit
     O=u*(2.5,2.5);
     path cc;
@@ -200,7 +209,11 @@
    \mplibforcehmode
    \begin{mplibcode}
      defaultcolormodel := \useKV[ClesPythagore]{ModeleCouleur};
-    u:=\useKV[ClesPythagore]{Echelle};
+     u:=\useKV[ClesPythagore]{Echelle};
+     boolean Dys;
+     Dys=\useKV[ClesPythagore]{Dys};
+     numeric decalage;
+     decalage=if Dys:2* fi \useKV[ClesPythagore]{Decalage};
     pair A,B,C,O,D,E,F,L[],M[],N[];%B est le sommet de l'angle droit
     O=u*(2.5,2.5);
     path cc;
@@ -228,8 +241,6 @@
     N1=rotation(A,C,90);
     N2-N1=A-C;
     trace chemin(C,N1,N2,A);    
-    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)));
@@ -412,6 +423,7 @@
   % #5 Troisi\`eme longueur (\'eventuellement vide)
   \useKVdefault[ClesPythagore]%
   \setKV[ClesPythagore]{#1}%
+  \ifPfCPfMScratchDys\relax\setKV[BandeNum]{Dys}\fi%
   \DeclareSIUnit{\PfCPythaUnit}{\useKV[ClesPythagore]{Unite}}%
   \ifboolKV[ClesPythagore]{Reciproque}{%
     % On retient les noms des sommets

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCReperage.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCReperage.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCReperage.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -39,18 +39,28 @@
       \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksrepere\compteur\nil}%
       \MPEspaceSphere{\the\toklistepointrepere}{\useKV[ClesReperage]{EchelleEspace}}%
     }{%
-      \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksespace\compteur\nil}%
+      \edef\RetiensListePoints{}%
+      \foreachitem\compteur\in\ListePointEspace{%
+        \edef\RetiensListePoints{\RetiensListePoints\ListePointEspace[\compteurcnt,1],}%
+        \edef\RetiensListePoints{\RetiensListePoints\ListePointEspace[\compteurcnt,2],}%
+        \edef\RetiensListePoints{\RetiensListePoints\ListePointEspace[\compteurcnt,3],}%
+        \IfStrEq{\ListePointEspace[\compteurcnt,4]}{ }{%
+          \edef\RetiensListePoints{\RetiensListePoints"",}%
+        }{%
+          \edef\RetiensListePoints{\RetiensListePoints"\ListePointEspace[\compteurcnt,4]",}%
+        }%
+      }%
       \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}}{\RetiensListePoints}{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}}%
+          \MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\RetiensListePoints}{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}}{\RetiensListePoints}{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}}%
+          \MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\RetiensListePoints}{0}{\useKV[ClesReperage]{EchelleEspace}}%
         }%
       }%
     }%
@@ -454,6 +464,8 @@
       CoulTrace=(0,0,0,1);
       gris=0.1(0,0,0,1);
       fi;
+      boolean Tiret;
+      Tiret=\useKV[ClesReperage]{Tiret};
       color CouleurX,CouleurY,CouleurZ;
       CouleurX=\useKV[ClesReperage]{CouleurX};
       CouleurY=\useKV[ClesReperage]{CouleurY};
@@ -460,7 +472,7 @@
       CouleurZ=\useKV[ClesReperage]{CouleurZ};
       typetrace:="3D";
       typerepre:="persp";
-      Figure(-20u,-20u,20u,20u);
+%      Figure(-20u,-20u,20u,20u);
       Initialisation(1500,30,20,abs(#9));
       % marque_r:=marque_r/2;
       marque_p:="plein";
@@ -470,23 +482,35 @@
       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.top(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]));
+      label.top(TEX("$x$"),Projette(1.5[D,A]));
+      label.top(TEX("$y$"),Projette(1.5[D,C]));
+      label.top(TEX("$z$"),Projette(1.5[D,E]));
+      dotlabel.ulft(TEX("1"),Projette((1/#2)[D,A]));
+      dotlabel.bot(TEX("1"),Projette((1/#4)[D,C]));
+      dotlabel.lft(TEX("1"),Projette((1/#6)[D,E]));
       drawoptions(withcolor CouleurX);
       for k=1 upto (#2):
+      if Tiret:
+      trace chemin(D+0.02*(E-D),D,D+0.02*(C-D)) shifted Projette((k/#2)[D,A]);
+      else:
       pointe((k/#2)[D,A]);
+      fi;
       endfor;
       drawoptions(withcolor CouleurY);
       for k=1 upto (#4):
+      if Tiret:
+      trace chemin(D+0.02*(E-D),D,D+0.02*(A-D)) shifted Projette((k/#4)[D,C]);
+      else:
       pointe((k/#4)[D,C]);
+      fi;
       endfor;
       drawoptions(withcolor CouleurZ);
       for k=1 upto (#6):
+      if Tiret:
+      trace chemin(D+0.02*(A-D),D,D+0.02*(C-D)) shifted Projette((k/#6)[D,E]);
+      else:
       pointe((k/#6)[D,E]);
+      fi;
       endfor;
       drawoptions();
       else:
@@ -493,12 +517,12 @@
       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]));
+      label.lrt(TEX("$x$"),Projette(1.5[A,D]));
+      label.top(TEX("$y$"),Projette(1.5[A,B]));
+      label.top(TEX("$z$"),Projette(1.5[A,F]));
+      dotlabel.ulft(TEX("1"),Projette((1/#2)[A,D]));
+      dotlabel.bot(TEX("1"),Projette((1/#4)[A,B]));
+      dotlabel.lft(TEX("1"),Projette((1/#6)[A,F]));
       drawoptions(withcolor CouleurX);
       for k=1 upto (#2):
       pointe((k/#2)[A,D]);
@@ -588,8 +612,8 @@
       enddef;
       if #9>0:
       tata(#7);
-      else:
-      toto(#7);
+%      else:
+%      toto(#7);
       fi;
       draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5);
       if \useKV[ClesReperage]{Code}:
@@ -2489,8 +2513,9 @@
     \setKV[ClesReperage]{Unitex=2,Unitey=2.5,Unitez=1.5}%
     \ifboolKV[ClesReperage]{Sphere}{\setKV[ClesReperage]{EchelleEspace=75}}{}%
     \setKV[ClesReperage]{#1}%
-    \setsepchar[*]{,*/}\ignoreemptyitems%
+    \setsepchar[*]{,*/}\reademptyitems%
     \readlist*\ListePointEspace{#2}%
+    \reademptyitems%
     \buildespace%
   }{\ifboolKV[ClesReperage]{Plan}{%
       \setsepchar[*]{,*/}%\ignoreemptyitems%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterFraction.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterFraction.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterFraction.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -1,29 +1,48 @@
 %%%
 % Fractions
 %%%
-\def\filedateRepFrac{2025/03/11}%
-\def\fileversionRepFrac{0.1b}%
+\def\filedateRepFrac{2025/07/16}%
+\def\fileversionRepFrac{0.1c}%
 \message{-- \filedateRepFrac\space v\fileversionRepFrac}%
 %
-\setKVdefault[ClesFraction]{Rayon=2cm,Disque,Regulier=false,Segment=false,Rectangle=false,Longueur=5cm,Largeur=2cm,Cotes=5,Triangle=false,Parts=3,Eprouvette=false,Couleur=green,Reponse=false,Multiple=1,Hachures=false,Epaisseur=1,Aleatoire=false,Gradue=false,Muette=false,Decimal=false,LabelF=false,UniteComplete=false,Part=0,Hauteur=1.5cm}%
+\setKVdefault[ClesFraction]{Rayon=2cm,Disque,Regulier=false,Segment=false,Rectangle=false,Longueur=5cm,Largeur=2cm,Cotes=5,Triangle=false,Parts=3,Eprouvette=false,Couleur=green,Reponse=false,Multiple=1,Hachures=false,Epaisseur=1,Aleatoire=false,Gradue=false,Muette=false,Decimal=false,LabelF=false,UniteComplete=false,Part=0,Hauteur=1.5cm,SansPart=false,SansPartA=false,Graine={},Ecart=1cm}%
 
-\def\MPFractionSegmentGradueCode{%
+\def\MPFractionBaseCode{%
   Longueur=\useKV[ClesFraction]{Longueur};
+  Largeur=\useKV[ClesFraction]{Largeur};
   Hauteur=\useKV[ClesFraction]{Hauteur};
-  color ColSegment;
+  HauteurEp=\useKV[ClesFraction]{Longueur};
+  Ecart=\useKV[ClesFraction]{Ecart};
+  Rayon=\useKV[ClesFraction]{Rayon};
+  Cotes=\useKV[ClesFraction]{Cotes};
+  nbparts:=\useKV[ClesFraction]{Parts};
+  Multiple=\useKV[ClesFraction]{Multiple};
+  Epaisseur=\useKV[ClesFraction]{Epaisseur};
+  Part=\useKV[ClesFraction]{Part};
+  %
+  color ColSegment,ColEprou,ColPolyReg,ColTriangle,ColRectangle,ColDisque,ColSegment;
   ColSegment=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
+  ColRectangle=\useKV[ClesFraction]{Couleur};
+  ColSegment=\useKV[ClesFraction]{Couleur};
+  ColEprou=\useKV[ClesFraction]{Couleur};%
+  ColPolyReg=\useKV[ClesFraction]{Couleur};
+  ColTriangle=\useKV[ClesFraction]{Couleur};
+  ColDisque=\useKV[ClesFraction]{Couleur};
+  %
+  boolean Hachures,Reponse,SansPart,SansPartA,TypeDecimal,LabelF,UniteComplete,Muette;%
   Reponse=\useKV[ClesFraction]{Reponse};
   Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  Part=\useKV[ClesFraction]{Part};
+  SansPart=\useKV[ClesFraction]{SansPart};
+  SansPartA=\useKV[ClesFraction]{SansPartA};
   %
-  boolean TypeDecimal,LabelF,UniteComplete,Muette;
   TypeDecimal=\useKV[ClesFraction]{Decimal};
   LabelF=\useKV[ClesFraction]{LabelF};
   UniteComplete=\useKV[ClesFraction]{UniteComplete};
   Muette=\useKV[ClesFraction]{Muette};
   %
+  \ifemptyKV[ClesFraction]{Graine}{}{randomseed:=\useKV[ClesFraction]{Graine};}%
+}%
+\def\MPFractionSegmentGradueCode{%
   pair A,C,B[];
   A=(0,0);
   C-A=(Longueur,0);
@@ -99,7 +118,7 @@
             draw Etiquette shifted(iso(B[k],B[k+1])+m*(Longueur,0));
           fi;
         endfor;
-        draw segment(A,C) shifted(m*(Longueur,0));  
+        draw segment(A,C) shifted(m*(Longueur,0));
       fi;
       if Hachures:drawoptions(withpen pencircle scaled Epaisseur);fi;
       draw (segment(B[0],B[Nume mod deno]) shifted(m*(Longueur,0)));
@@ -130,7 +149,7 @@
         fi;
       endfor;
     endfor;
-    %% 
+    %%
     if TypeDecimal:
       for l=0 upto m-1:
         for k=1 upto 9:
@@ -166,7 +185,7 @@
         endfor;
         pointe(C shifted(m*(Longueur,0)));
         label.bot(TEX("\num{"&decimal(m+1)&"}"),C shifted(m*(Longueur,0)));
-      fi;    
+      fi;
     else:
       if Muette=false:
         if TypeDecimal=false:
@@ -180,43 +199,59 @@
 }%
 
 \NewDocumentCommand\MPFractionSegmentGradue{mm}{%
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
+    \MPFractionBaseCode
     \MPFractionSegmentGradueCode
     trace FractionSegment(#1,#2);
-  \end{mplibcode}
+  \end{mplibcode}%
   \fi%
 }%
 
 \def\MPFractionEprouvetteCode{%
-  Hauteur=\useKV[ClesFraction]{Longueur};
-  color ColEprou;%
-  ColEprou=\useKV[ClesFraction]{Couleur};%
-  boolean Hachures,Reponse;%
-  Reponse=\useKV[ClesFraction]{Reponse};%
-  Hachures=\useKV[ClesFraction]{Hachures};%
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
+  vardef TraceGradEprouvette(expr denoa,numea)=
+    picture TraceEprouGrad;
+    TraceEprouGrad=image(
+    drawoptions(withpen pencircle scaled 1.1);
+    if SansPart=false:
+      if SansPartA=false:
+        for k=1 upto (denoa-1):
+          trace (subpath(length Cc/2,length Cc*0.7) of Cc) shifted ((k/denoa)*(0,HauteurEp));
+        endfor;
+      else:
+        la:=1+floor(uniformdeviate((numea mod denoa)-2));
+        lb:=((numea mod denoa)+1)+floor(uniformdeviate(denoa-(numea mod denoa)-1));
+        for k=1 upto (denoa-1):
+          if (k=la) or (k=lb):
+          else:
+            trace (subpath(length Cc/2,length Cc*0.7) of Cc) shifted ((k/denoa)*(0,HauteurEp));
+          fi;
+        endfor;
+      fi;
+    fi;
+    drawoptions();
+    );
+    TraceEprouGrad
+  enddef;
+  %
   vardef eprouvette(expr deno,nume)=
-  picture PfCEprou,PfCEprouGrad;
-  path Cc;
-  Cc=cercles((0,0),1u) yscaled 0.2;
-  PfCEprouGrad=image(
-  trace Cc shifted((0,Hauteur));
-  trace subpath(0,length Cc/2) of Cc dashed evenly;
-  trace subpath(length Cc/2,length Cc) of Cc;
-  trace segment(point(0) of Cc,point(0) of Cc shifted((0,Hauteur)));
-  trace segment(point(length Cc/2) of Cc,point(length Cc/2) of (Cc shifted((0,Hauteur))));
-  for k=1 upto (deno-1):
-  trace (subpath(length Cc/2,length Cc*0.7) of Cc) shifted ((k/deno)*(0,Hauteur));
-  endfor;
-  );
+    picture PfCEprou,PfCEprouGrad;
+    path Cc;
+    Cc=cercles((0,0),1u) yscaled 0.2;
+    PfCEprouGrad=image(%
+      trace Cc shifted((0,HauteurEp));
+      trace subpath(0,length Cc/2) of Cc dashed evenly;
+      trace subpath(length Cc/2,length Cc) of Cc;
+      trace segment(point(0) of Cc,point(0) of Cc shifted((0,HauteurEp)));
+      trace segment(point(length Cc/2) of Cc,point(length Cc/2) of (Cc shifted((0,HauteurEp))));
+    );
   m=nume div deno;
   if (nume mod deno)=0:m:=m-1; fi;
   PfCEprou=image(%
   path Volume,VolumeComplet;
-  Volume=(point(0) of Cc)--(subpath(0,length Cc/2) of Cc shifted(((nume mod deno)/deno)*(0,Hauteur)))--(point(length Cc/2) of Cc shifted(((nume mod deno)/deno)*(0,Hauteur)))--(subpath(length Cc/2,length Cc) of Cc)--cycle;
-  VolumeComplet=(point(0) of Cc)--(subpath(0,length Cc/2) of Cc shifted((0,Hauteur)))--(point(length Cc/2) of Cc)--(subpath(length Cc/2,length Cc) of Cc)--cycle;
+  Volume=(point(0) of Cc)--(subpath(0,length Cc/2) of Cc shifted(((nume mod deno)/deno)*(0,HauteurEp)))--(point(length Cc/2) of Cc shifted(((nume mod deno)/deno)*(0,HauteurEp)))--(subpath(length Cc/2,length Cc) of Cc)--cycle;
+  VolumeComplet=(point(0) of Cc)--(subpath(0,length Cc/2) of Cc shifted((0,HauteurEp)))--(point(length Cc/2) of Cc)--(subpath(length Cc/2,length Cc) of Cc)--cycle;
   if m>0:
   for l=0 upto (m-1):
   if Reponse:
@@ -223,7 +258,7 @@
   if Hachures:
   drawoptions(withpen pencircle scaled Epaisseur);
   trace hachurage(VolumeComplet shifted(l*(3u,0)),60,0.2,0) withcolor ColEprou;
-  drawoptions(withpen pencircle scaled Epaisseur);
+  drawoptions();
   else:
   remplis (VolumeComplet shifted(l*(3u,0))) withcolor ColEprou;
   fi;
@@ -235,11 +270,11 @@
   if Hachures:
   drawoptions(withpen pencircle scaled Epaisseur);
   trace hachurage(Volume shifted(m*(3u,0)),60,0.2,0) withcolor ColEprou;
-  drawoptions(withpen pencircle scaled Epaisseur);
+  drawoptions();
   else:
   remplis (Volume shifted(m*(3u,0))) withcolor ColEprou;
   fi;
-  trace (Cc shifted(((nume mod deno)/deno)*(0,Hauteur))) shifted(m*(3u,0));
+  trace (Cc shifted(((nume mod deno)/deno)*(0,HauteurEp))) shifted(m*(3u,0));
   fi;
   else:
   if Reponse:
@@ -254,38 +289,32 @@
   fi;
   for k=0 upto m:
   trace PfCEprouGrad shifted((3u*k,0));
+  trace TraceGradEprouvette(deno,nume) shifted((3u*k,0));
   endfor;
   );
   PfCEprou
   enddef;
 }
-  
+
 \def\MPFractionEprouvette#1#2{%
   % #1 num
   % #2 d\'eno
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
     % Pas d'aléa ici : l'eau ne peut pas être en lévitation :)
+    \MPFractionBaseCode
     \MPFractionEprouvetteCode
     trace eprouvette(#2,#1);
-  \end{mplibcode}
-  \else
-  \begin{mpost}[mpsettings={\MPFractionEprouvetteCode}]
+  \end{mplibcode}%
+  \else%
+  \begin{mpost}[mpsettings={\MPFractionBaseCode;\MPFractionEprouvetteCode}]
     trace eprouvette(#2,#1);
-  \end{mpost}
-  \fi
-}
+  \end{mpost}%
+  \fi%
+}%
 
 \def\MPFractionRegulierCodeAlea{%
-  Rayon=\useKV[ClesFraction]{Rayon};
-  Cotes=\useKV[ClesFraction]{Cotes};
-  color ColPolyReg;
-  ColPolyReg=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
   pair O,A[],B[];
   O=u*(0,0);
   path cc,cd;
@@ -307,7 +336,7 @@
   if (nume mod deno)=0:m:=m-1; fi;
   picture RetourFraction;
   RetourFraction=image(%
-  Reste=((nume div deno)+1)*deno;
+  Reste=if (nume mod deno)=0:nume else:((nume div deno)+1)*deno fi;
   RetiensPart=0;
   if Reponse:
     if m>0:
@@ -324,6 +353,7 @@
                 else:
                   fill part[k] shifted(l*(2*Rayon+0.5cm,0)) withcolor ColPolyReg;
                 fi;
+                trace part[k] shifted(l*(2*Rayon+0.5cm,0));
               fi;
             else:
               RetiensPart:=RetiensPart+1;
@@ -333,11 +363,12 @@
               else:
                 fill part[k] shifted(l*(2*Rayon+0.5cm,0)) withcolor ColPolyReg;
               fi;
+              trace part[k] shifted(l*(2*Rayon+0.5cm,0));
             fi;
           fi;
         Reste:=Reste-1;
         endfor;
-      endfor;  
+      endfor;
     fi;
     for k=0 upto deno-1:
       if RetiensPart<nume:
@@ -351,6 +382,7 @@
             else:
               fill part[k] shifted(m*(2*Rayon+0.5cm,0)) withcolor ColPolyReg;
             fi;
+            trace part[k] shifted(m*(2*Rayon+0.5cm,0));
           fi;
         else:
           RetiensPart:=RetiensPart+1;
@@ -360,17 +392,20 @@
           else:
             fill part[k] shifted(m*(2*Rayon+0.5cm,0)) withcolor ColPolyReg;
           fi;
+          trace part[k] shifted(m*(2*Rayon+0.5cm,0));
         fi;
       fi;
-      Reste:=Reste-1;  
+      Reste:=Reste-1;
     endfor;
   fi;
   drawoptions(withpen pencircle scaled Epaisseur);
   for l=0 upto m:
     draw cd shifted(l*(2*Rayon+0.5cm,0));
-    for k=0 upto (deno-1):
-      draw segment(O,B[k]) shifted(l*(2*Rayon+0.5cm,0));
-    endfor;
+    if SansPart=false:
+      for k=0 upto (deno-1):
+        draw segment(O,B[k]) shifted(l*(2*Rayon+0.5cm,0));
+      endfor;
+    fi;
   endfor;
   drawoptions();
   );
@@ -379,14 +414,6 @@
 }%
 
 \def\MPFractionRegulierCode{%
-  Rayon=\useKV[ClesFraction]{Rayon};
-  Cotes=\useKV[ClesFraction]{Cotes};
-  color ColPolyReg;
-  ColPolyReg=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
   pair O,A[],B[];
   O=u*(0,0);
   path cc,cd;
@@ -401,51 +428,95 @@
   endfor;
   picture fondcolore,FractionPoly;
   fondcolore=image(
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(O--arccercle(B[0],B[nume mod deno],O)--cycle,1.5*360/Cotes,0.25,0) withcolor ColPolyReg;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  remplis O--arccercle(B[0],B[nume mod deno],O)--cycle withcolor ColPolyReg;
-  fi;
-  clip currentpicture to cd;
-  for k=0 upto deno-1:
-  draw segment(O,B[k]) cutafter cd;
-  endfor;
-  trace cd;
+    if Hachures:
+      drawoptions(withpen pencircle scaled Epaisseur);
+      trace hachurage(O--arccercle(B[0],B[nume mod deno],O)--cycle,1.5*360/Cotes,0.25,0) withcolor ColPolyReg;
+      drawoptions();
+    else:
+      remplis O--arccercle(B[0],B[nume mod deno],O)--cycle withcolor ColPolyReg;
+    fi;
+    clip currentpicture to cd;
+    drawoptions(withpen pencircle scaled Epaisseur);
+    if SansPart:
+      draw B[0]--O--B[nume mod deno];
+%    elseif SansPartA:
+%      la:=floor(uniformdeviate(deno-2));
+%      for k=0 upto deno-1:
+%        if k<>la:
+%        draw segment(O,B[k]) cutafter cd;
+%        fi;
+%      endfor;
+%    else:
+%      for k=0 upto deno-1:
+%        draw segment(O,B[k]) cutafter cd;
+%      endfor;
+    fi;
+    trace cd;
+    drawoptions();
   );
   currentpicture:=nullpicture;
   m=nume div deno;
   if (nume mod deno)=0:m:=m-1; fi;
   FractionPoly=image(
-  if m>0:
-  for l=0 upto (m-1):
-  if Reponse:
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(cd shifted(l*(Rayon*2+0.5cm,0)),1.5*360/Cotes,0.25,0) withcolor ColPolyReg;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  fill cd shifted(l*(Rayon*2+0.5cm,0)) withcolor ColPolyReg;
-  fi;
-  fi;
-  trace cd shifted(l*(Rayon*2+0.5cm,0));
-  if deno>1:
-  for k=0 upto deno-1:
-  draw (segment(O,B[k]) cutafter cd) shifted(l*(Rayon*2+0.5cm,0));
-  endfor;
-  fi;
-  endfor;
-  fi;
-  if Reponse:
-  draw fondcolore shifted(m*(Rayon*2+0.5cm,0));
-  fi;
-  draw cd shifted(m*(Rayon*2+0.5cm,0));
-  if deno>1:
-  for k=0 upto deno-1:
-  draw (segment(O,B[k]) cutafter cd) shifted(m*(Rayon*2+0.5cm,0));
-  endfor;
-  fi;
+    if m>0:
+      for l=0 upto (m-1):
+        if Reponse:
+          if Hachures:
+            drawoptions(withpen pencircle scaled Epaisseur);
+            trace hachurage(cd shifted(l*(Rayon*2+0.5cm,0)),1.5*360/Cotes,0.25,0) withcolor ColPolyReg;
+            drawoptions();
+          else:
+            fill cd shifted(l*(Rayon*2+0.5cm,0)) withcolor ColPolyReg;
+          fi;
+        fi;
+        drawoptions(withpen pencircle scaled Epaisseur);
+        trace cd shifted(l*(Rayon*2+0.5cm,0));
+        if SansPart:
+        elseif SansPartA:
+          if deno>1:
+            la:=1+floor(uniformdeviate(deno-2));
+            for k=0 upto (deno-1):
+              if k<>la:
+                draw (segment(O,B[k]) cutafter cd) shifted(l*(2*Rayon+0.5cm,0));
+              fi;
+            endfor;
+          fi;
+        else:
+          if deno>1:
+            for k=0 upto deno-1:
+              draw (segment(O,B[k]) cutafter cd) shifted(l*(Rayon*2+0.5cm,0));
+            endfor;
+          fi;
+        fi;
+        drawoptions();
+      endfor;
+    fi;
+    if Reponse:
+      draw fondcolore shifted(m*(Rayon*2+0.5cm,0));
+    fi;
+    drawoptions(withpen pencircle scaled Epaisseur);
+    draw cd shifted(m*(Rayon*2+0.5cm,0));
+    if deno>1:
+      if SansPart:
+        %trace (0,0)--(50,50) withpen pencircle scaled 2;
+        %trace (B[0]--O--B[nume mod deno];
+      elseif SansPartA:
+%        draw (0,0)--(50,50) withpen pencircle scaled 2;
+        if deno>1:
+          la:=1+floor(uniformdeviate(deno-2));
+          for k=0 upto (deno-1):
+            if k<>la:
+              draw (segment(O,B[k]) cutafter cd) shifted(m*(2*Rayon+0.5cm,0));
+            fi;
+          endfor;
+        fi;
+      else:
+        for k=0 upto deno-1:
+          draw (segment(O,B[k]) cutafter cd) shifted(m*(Rayon*2+0.5cm,0));
+        endfor;
+      fi;
+    fi;
+    drawoptions();
   );
   FractionPoly
   enddef;
@@ -453,9 +524,10 @@
 
 \def\MPFractionRegulier#1#2{%
   % #1 num, #2 deno
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
+    \MPFractionBaseCode
     boolean Alea;
     Alea=\useKV[ClesFraction]{Aleatoire};
     if Alea:
@@ -464,24 +536,17 @@
     \MPFractionRegulierCode
     fi;
     trace FractionPolyReg(#1,#2);
-  \end{mplibcode}
-  \else
-  \begin{mpost}[mpsettings={\MPFractionRegulierCode}]
+  \end{mplibcode}%
+  \else%
+  \begin{mpost}[mpsettings={\MPFractionBaseCode;\MPFractionRegulierCode}]%
     trace FractionPolyReg(#1,#2);
-  \end{mpost}
-  \fi
+  \end{mpost}%
+  \fi%
 }%
 
 \def\MPFractionTriangleCodeAlea{%
-  Longueur:=\useKV[ClesFraction]{Longueur};
-  nbparts:=\useKV[ClesFraction]{Parts};
-  color ColTriangle;
-  ColTriangle=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
   nbtriangle=0;
+  boolean Allume[];
   %
   vardef Ligne(expr longueur)=
     for k=0 upto 2*(longueur-1):
@@ -491,6 +556,7 @@
       else:
         M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A));
       fi;
+      Allume[nbtriangle]=false;
     endfor;
   enddef;
   %
@@ -521,7 +587,7 @@
   fi;
   picture RetourFraction;
   RetourFraction=image(
-    Reste=((nume div deno)+1)*deno;
+    Reste=if (nume mod deno)=0:nume else:((nume div deno)+1)*deno fi;
     RetiensPart=0;
     if Reponse:
       if m>0:
@@ -533,27 +599,33 @@
                 if test>0.5:
                   RetiensPart:=RetiensPart+1;
                   if Hachures:
-                    drawoptions(withpen pencircle scaled Epaisseur);
-                    draw hachurage(M[k] shifted(l*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
+                    %drawoptions(withpen pencircle scaled Epaisseur);
+                    draw hachurage(M[k] shifted(l*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
                   else:
-                    fill M[k] shifted(l*(Longueur+1cm,0)) withcolor ColTriangle;
+                    fill M[k] shifted(l*(Longueur+Ecart,0)) withcolor ColTriangle;
                   fi;
+                  Allume[k]:=true;
                 fi;
               else:
                 RetiensPart:=RetiensPart+1;
                 if Hachures:
-                  drawoptions(withpen pencircle scaled Epaisseur);
-                  draw hachurage(M[k] shifted(l*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
+                  %drawoptions(withpen pencircle scaled Epaisseur);
+                  draw hachurage(M[k] shifted(l*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
                 else:
-                  fill M[k] shifted(l*(Longueur+1cm,0)) withcolor ColTriangle;
+                  fill M[k] shifted(l*(Longueur+Ecart,0)) withcolor ColTriangle;
                 fi;
+                Allume[k]:=true;
               fi;
             fi;
             Reste:=Reste-1;
           endfor;
-        endfor;  
+          for k=1 upto nbtriangle:
+            if Allume[k]=false:trace M[k] shifted(l*(Longueur+Ecart,0)) fi;
+          endfor;
+        endfor;
       fi;
       for k=1 upto nbtriangle:
+        Allume[k]:=false;
         if RetiensPart<nume:
           if Reste>(nume-RetiensPart):
             test:=uniformdeviate(1);
@@ -560,54 +632,62 @@
             if test>0.5:
               RetiensPart:=RetiensPart+1;
               if Hachures:
-                drawoptions(withpen pencircle scaled Epaisseur);
-                draw hachurage(M[k] shifted(m*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
+                %drawoptions(withpen pencircle scaled Epaisseur);
+                draw hachurage(M[k] shifted(m*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
               else:
-                fill M[k] shifted(m*(Longueur+1cm,0)) withcolor ColTriangle;
+                fill M[k] shifted(m*(Longueur+Ecart,0)) withcolor ColTriangle;
               fi;
+              Allume[k]:=true;
             fi;
           else:
             RetiensPart:=RetiensPart+1;
             if Hachures:
-              drawoptions(withpen pencircle scaled Epaisseur);
-              draw hachurage(M[k] shifted(m*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
+              %drawoptions(withpen pencircle scaled Epaisseur);
+              draw hachurage(M[k] shifted(m*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
             else:
-              fill M[k] shifted(m*(Longueur+1cm,0)) withcolor ColTriangle;
+              fill M[k] shifted(m*(Longueur+Ecart,0)) withcolor ColTriangle;
             fi;
+            Allume[k]:=true;
           fi;
         fi;
-        Reste:=Reste-1;  
+        Reste:=Reste-1;
       endfor;
+      for k=1 upto nbtriangle:
+        if Allume[k]=false:trace M[k] shifted(m*(Longueur+Ecart,0)) fi;
+      endfor;
     fi;
-    drawoptions(withpen pencircle scaled Epaisseur);
-    for l=0 upto m:
-      trace FondTriangle shifted(l*(Longueur+1cm,0));
-    endfor;
+    % drawoptions(withpen pencircle scaled Epaisseur);
+    if SansPart:
+      for l=0 upto m:
+        trace polygone(A,B,C) shifted(l*(Longueur+Ecart,0));
+      endfor;
+    elseif SansPartA:
+    %
+    else:
+      for l=0 upto m:
+        trace FondTriangle shifted(l*(Longueur+Ecart,0));
+      endfor;
+    fi;
   );
+  drawoptions(withpen pencircle scaled Epaisseur);
   RetourFraction
 enddef;
 }%
 
 \def\MPFractionTriangleCode{%
-  Longueur:=\useKV[ClesFraction]{Longueur};
-  nbparts:=\useKV[ClesFraction]{Parts};
-  color ColTriangle;
-  ColTriangle=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
   nbtriangle=0;
+  boolean Allume[];
   %
   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;
+    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;
+      Allume[nbtriangle]=false;
+    endfor;
   enddef;
   %
   pair A,B,C;
@@ -620,56 +700,142 @@
   Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]);
   %
   for k=nbparts downto 1:
-  Ligne(k);
+    Ligne(k);
   endfor;
   %
   vardef FractionTriangle(expr nume,deno)=
-  m:=nume div deno;
-  picture RetourFraction;
-  RetourFraction=image(
-  for l=1 upto (nume mod deno):
-  if Reponse:
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(M[l] shifted(m*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  fill (M[l] shifted(m*(Longueur+1cm,0))) withcolor ColTriangle;
-  fi;
-  fi;
-  for k=1 upto nbparts:
-  trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(Longueur+1cm,0));
-  trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(Longueur+1cm,0));
-  trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(Longueur+1cm,0));
-  endfor;
-  endfor;
-  % 
-  for l=0 upto (m-1):
-  if Reponse:
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(polygone(A,B,C) shifted(l*(Longueur+1cm,0)),90,0.2,0) withcolor ColTriangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  remplis polygone(A,B,C) withcolor ColTriangle;
-  fi;
-  fi;
-  for k=1 upto nbparts:
-  trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(l*(Longueur+1cm,0));
-  trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(l*(Longueur+1cm,0));
-  trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(l*(Longueur+1cm,0));
-  endfor;
-  endfor;
-  );
-  RetourFraction
+    m:=nume div deno;
+    picture RetourFraction;
+    RetourFraction=image(
+    for l=1 upto (nume mod deno):
+      if Reponse:
+        if Hachures:
+          % drawoptions(withpen pencircle scaled Epaisseur);
+          trace hachurage(M[l] shifted(m*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
+          % drawoptions();
+        else:
+          fill (M[l] shifted(m*(Longueur+Ecart,0))) withcolor ColTriangle;
+          trace (M[l] shifted(m*(Longueur+Ecart,0))) withcolor ColTriangle;
+        fi;
+        Allume[l]:=true;
+      fi;
+      if SansPart:
+        trace polygone(A,B,C) shifted(m*(Longueur+Ecart,0));
+      elseif SansPartA:
+        if deno>1:
+          la:=1+floor(uniformdeviate(nbparts-2));
+          for k=1 upto nbparts:
+            if k<>la:
+            trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(Longueur+Ecart,0));
+            fi;
+          endfor;
+        fi;
+        trace polygone(A,B,C) shifted(m*(Longueur+Ecart,0));
+        %la:=1+floor(uniformdeviate(nbtriangle div 2));
+        %lb:=(nbtriangle div 2)+1 +floor(uniformdeviate((nbtriangle-1) div 2));
+        %for k=1 upto nbtriangle:
+        %  if (k<>la) and (k<>lb):
+        %    trace M[k] shifted(l*(Longueur+Ecart,0));
+        %  fi;
+        %endfor;
+        %trace polygone(A,B,C) shifted(l*(Longueur+Ecart,0));
+      else:
+        if deno>1:
+          for k=1 upto nbparts:
+            trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(Longueur+Ecart,0));
+          endfor;
+        else:
+          trace polygone(A,B,C) shifted(m*(Longueur+Ecart,0));
+        fi;
+      fi;
+    endfor;
+%    for l=1 upto nbtriangle:
+%      label(decimal(l),center M[l]);
+%    endfor;
+    % Suite du sans part
+    if SansPart:
+      nbtriangle:=0;
+      pair Ak[];
+      path morceauxg[],morceauxb[];
+      for nb=nbparts downto 1:
+        Ak[nb]:=((nbparts-nb+1)/nbparts)[A,C];
+        for k=0 upto 2*(nb-1):
+          nbtriangle:=nbtriangle+1;
+          if Allume[nbtriangle]:
+            %if nb<nbparts:
+            %  fill M[nbtriangle] withcolor ColTriangle;
+            %  trace M[nbtriangle] withcolor ColTriangle;
+            %fi;
+            if (k mod 2)=0:
+              morceauxg[nb]:=subpath(1,2) of M[nbtriangle];
+              Ak[nb+1]:=point(1) of M[nbtriangle]% morceauxb[nb]:=A--A;%subpath(0,1) of M[nbtriangle];
+            else:
+            morceauxg[nb]:=subpath(1,0) of M[nbtriangle];
+%            morceauxb[nb]:=subpath(2,3) of M[nbtriangle];
+            fi;
+          fi;
+        endfor;
+        %if known morceauxg[nb]:trace morceauxg[nb]--((nbparts-nb+1)/nbparts)[A,C] fi;
+      endfor;
+      for k=nbparts downto 1:
+      if known morceauxg[k]:trace (morceauxg[k]--Ak[k]) shifted(m*(Longueur+Ecart,0)) fi;
+      endfor;
+      %trace polygone(A,B,C);% shifted(l*(Longueur+Ecart,0));
+    fi;
+    %
+    %
+    for l=0 upto (m-1):
+      if Reponse:
+        if Hachures:
+          % drawoptions(withpen pencircle scaled Epaisseur);
+          trace hachurage(polygone(A,B,C) shifted(l*(Longueur+Ecart,0)),90,0.2,0) withcolor ColTriangle;
+          % drawoptions();
+        else:
+          remplis polygone(A,B,C) withcolor ColTriangle;
+        fi;
+      fi;
+      if SansPart:
+        trace polygone(A,B,C) shifted(l*(Longueur+Ecart,0));
+      elseif SansPartA:
+        if deno>1:
+          la:=1+floor(uniformdeviate(nbparts-2));
+          for k=1 upto nbparts:
+            if k<>la:
+            trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(l*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(l*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(l*(Longueur+Ecart,0));
+            fi;
+          endfor;
+        fi;
+        trace polygone(A,B,C) shifted(l*(Longueur+Ecart,0));
+      else:
+        if deno>1:
+          for k=1 upto nbparts:
+            trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(l*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(l*(Longueur+Ecart,0));
+            trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(l*(Longueur+Ecart,0));
+          endfor;
+        else:
+          trace polygone(A,B,C) shifted(l*(Longueur+Ecart,0));
+        fi;
+      fi;
+    endfor;
+    );
+    drawoptions(withpen pencircle scaled Epaisseur);
+    RetourFraction
   enddef;
 }%
 
 \def\MPFractionTriangle#1#2{%
   % #1 num #2 d\'eno (attention : = partage^2)
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
+    \MPFractionBaseCode
     boolean Alea;
     Alea=\useKV[ClesFraction]{Aleatoire};
     if Alea:
@@ -678,25 +844,15 @@
     \MPFractionTriangleCode;
     fi;
     draw FractionTriangle(#1,#2);
-  \end{mplibcode}
-  \else
-  \begin{mpost}[mpsettings={\MPFractionTriangleCode}]
+  \end{mplibcode}%
+  \else%
+  \begin{mpost}[mpsettings={\MPFractionBaseCode;\MPFractionTriangleCode}]%
     draw FractionTriangle(#1,#2);
-  \end{mpost}
-  \fi
+  \end{mpost}%
+  \fi%
 }%
 
 \def\MPFractionRectangleCodeAlea{%
-  Longueur=\useKV[ClesFraction]{Longueur};
-  Largeur=\useKV[ClesFraction]{Largeur};
-  color ColRectangle;
-  ColRectangle=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  Multiple=\useKV[ClesFraction]{Multiple};
-  %
   pair A,B,C,D,M[],N[],R[],S[];
   A=(0,0);
   B-A=(Longueur,0);
@@ -721,17 +877,20 @@
     fi;
     picture FondRectangle;
     FondRectangle=image(%
+    trace polygone(A,B,C,D);
       path case[];
       for k=0 upto Multiple-1:
         for l=0 step Multiple until (deno-1):
           case[k*(deno div Multiple)+(l div Multiple)]=(unitsquare xscaled (Multiple*abs(A-B)/deno) yscaled (abs(D-A)/Multiple)) shifted (((l/deno)[A,B]-A)+((k/Multiple)[A,D]-A));
-          trace case[k*(deno div Multiple)+(l div Multiple)];
+          if SansPart=false:
+            trace case[k*(deno div Multiple)+(l div Multiple)];
+          fi;
         endfor;
       endfor;
     );
     picture RetourRectangle;
     RetourRectangle=image(
-      Reste=((nume div deno)+1)*deno;
+      Reste=if (nume mod deno)=0:nume else:((nume div deno)+1)*deno fi;
       RetiensPart=0;
       if Reponse:
         if m>0:
@@ -744,24 +903,26 @@
                     RetiensPart:=RetiensPart+1;
                     if Hachures:
                       drawoptions(withpen pencircle scaled Epaisseur);
-                      draw hachurage(case[k] shifted(l*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
+                      draw hachurage(case[k] shifted(l*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
                     else:
-                      fill case[k] shifted(l*(Longueur+1cm,0)) withcolor ColRectangle;
+                      fill case[k] shifted(l*(Longueur+Ecart,0)) withcolor ColRectangle;
                     fi;
+                    if SansPart:trace case[k] fi;
                   fi;
                 else:
                   RetiensPart:=RetiensPart+1;
                   if Hachures:
                     drawoptions(withpen pencircle scaled Epaisseur);
-                    draw hachurage(case[k] shifted(l*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
+                    draw hachurage(case[k] shifted(l*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
                   else:
-                    fill case[k] shifted(l*(Longueur+1cm,0)) withcolor ColRectangle;
+                    fill case[k] shifted(l*(Longueur+Ecart,0)) withcolor ColRectangle;
                   fi;
+                  if SansPart:trace case[k] fi;
                 fi;
               fi;
               Reste:=Reste-1;
             endfor;
-          endfor;  
+          endfor;
         fi;
         for k=0 upto deno-1:
           if RetiensPart<nume:
@@ -771,43 +932,36 @@
                 RetiensPart:=RetiensPart+1;
                 if Hachures:
                   drawoptions(withpen pencircle scaled Epaisseur);
-                  draw hachurage(case[k] shifted(m*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
+                  draw hachurage(case[k] shifted(m*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
                 else:
-                  fill case[k] shifted(m*(Longueur+1cm,0)) withcolor ColRectangle;
+                  fill case[k] shifted(m*(Longueur+Ecart,0)) withcolor ColRectangle;
                 fi;
+                if SansPart:trace case[k] fi;
               fi;
             else:
               RetiensPart:=RetiensPart+1;
               if Hachures:
                 drawoptions(withpen pencircle scaled Epaisseur);
-                draw hachurage(case[k] shifted(m*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
+                draw hachurage(case[k] shifted(m*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
               else:
-                fill case[k] shifted(m*(Longueur+1cm,0)) withcolor ColRectangle;
+                fill case[k] shifted(m*(Longueur+Ecart,0)) withcolor ColRectangle;
               fi;
+              if SansPart:trace case[k] fi;
             fi;
           fi;
-          Reste:=Reste-1;  
+          Reste:=Reste-1;
         endfor;
       fi;
       for l=0 upto m:
-        trace FondRectangle shifted(l*(Longueur+1cm,0));
+        trace FondRectangle shifted(l*(Longueur+Ecart,0));
       endfor;
     );
+    drawoptions(withpen pencircle scaled Epaisseur);
     RetourRectangle
   enddef;
 }%
 
 \def\MPFractionRectangleCode{%
-  Longueur=\useKV[ClesFraction]{Longueur};
-  Largeur=\useKV[ClesFraction]{Largeur};
-  color ColRectangle;
-  ColRectangle=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  Multiple=\useKV[ClesFraction]{Multiple};
-  %
   pair A,B,C,D,M[],N[],R[],S[];
   A=(1,1);
   B-A=(Longueur,0);
@@ -814,88 +968,135 @@
   C-B=(0,Largeur);
   D-C=A-B;
   vardef FractionRectangle(expr nume,deno)=
-  m=nume div deno;
-  if (nume mod deno)=0:m:=m-1; fi;
-  numeric parts;
-  parts=(deno div Multiple);
-  for k=0 upto parts:
-  M[k]=(k/parts)[A,B];
-  N[k]=(k/parts)[D,C];
-  endfor;
-  if Multiple>1:
-  for k=0 upto Multiple:
-  R[k]=(k/Multiple)[A,D];
-  S[k]=(k/Multiple)[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 Multiple>1:
-  for k=1 upto (Multiple-1):
-  draw segment(R[k],S[k]);
-  endfor;
-  fi;
+    m=nume div deno;
+    if (nume mod deno)=0:m:=m-1; fi;
+    numeric parts;
+    parts=(deno div Multiple);
+    for k=0 upto parts:
+      M[k]=(k/parts)[A,B];
+      N[k]=(k/parts)[D,C];
+    endfor;
+    if Multiple>1:
+      for k=0 upto Multiple:
+        R[k]=(k/Multiple)[A,D];
+        S[k]=(k/Multiple)[B,C];
+      endfor;
+    fi;
+    picture FondRectangle;
+    FondRectangle=image(%
+      draw polygone(A,B,C,D);
+    );
+    picture FondRectangleColorie;
+    FondRectangleColorie=image(%
+    if Multiple=1:
+      if Hachures:
+      % drawoptions(withpen pencircle scaled Epaisseur);
+        trace hachurage(polygone(A,M[nume mod deno],N[nume mod deno],D),45,0.25,0) withcolor ColRectangle;
+%  drawoptions(withpen pencircle scaled Epaisseur);
+      else:
+        remplis polygone(A,M[nume mod deno],N[nume mod deno],D) withcolor ColRectangle;
+        trace polygone(A,M[nume mod deno],N[nume mod deno],D);% withcolor ColRectangle;
+      fi;
+    else:
+      DDiv=(nume mod deno) div parts;
+      MMod=(nume mod deno) mod parts;
+      if Hachures:
+        % drawoptions(withpen pencircle scaled Epaisseur);
+        trace hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor ColRectangle;
+        % drawoptions(withpen pencircle scaled Epaisseur);
+        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 ColRectangle;
+        % drawoptions(withpen pencircle scaled Epaisseur);
+      else:
+        remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor ColRectangle;
+        remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor ColRectangle;
+        trace polygone(A,B,S[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]);
+      fi;
+    fi;
   );
-  picture FondRectangleColorie;
-  FondRectangleColorie=image(%
-  if Multiple=1:
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(polygone(A,M[nume mod deno],N[nume mod deno],D),45,0.25,0) withcolor ColRectangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  remplis polygone(A,M[nume mod deno],N[nume mod deno],D) withcolor ColRectangle;
-  fi;
-  else:
-  DDiv=(nume mod deno) div parts;
-  MMod=(nume mod deno) mod parts;
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor ColRectangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  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 ColRectangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor ColRectangle;
-  remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor ColRectangle;
-  fi;
-  fi;
-  );
   picture RetourRectangle;
   RetourRectangle=image(
-  if m>0:
-  for l=0 upto m-1:
-  if Reponse:
-  if Hachures:
+    if m>0:
+      for l=0 upto m-1:
+        if Reponse:
+          if Hachures:
+          % drawoptions(withpen pencircle scaled Epaisseur);
+            trace hachurage(polygone(A,B,C,D) shifted(l*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
+            % drawoptions(withpen pencircle scaled Epaisseur);
+          else:
+            remplis (polygone(A,B,C,D) shifted(l*(Longueur+Ecart,0))) withcolor ColRectangle;
+          fi;
+        fi;
+         trace FondRectangle shifted(l*(Longueur+Ecart,0));
+        if SansPart:
+        elseif SansPartA:
+          la:=1+floor(uniformdeviate(parts-2));
+          for k=1 upto (parts-1):
+            if k<>la:
+              draw segment(M[k],N[k])shifted(l*(Longueur+Ecart,0));
+            fi;
+          endfor;
+          if Multiple>1:
+          la:=1+floor(uniformdeviate(Multiple-2));
+          for k=1 upto (Multiple-1):
+            if k<>la:
+            draw segment(R[k],S[k]) shifted(l*(Longueur+Ecart,0));
+            fi;
+          endfor;
+        fi;
+        else:
+        for k=1 upto (parts-1):
+          draw segment(M[k],N[k]) shifted(l*(Longueur+Ecart,0));
+        endfor;
+        if Multiple>1:
+          for k=1 upto (Multiple-1):
+            draw segment(R[k],S[k]) shifted(l*(Longueur+Ecart,0));
+          endfor;
+        fi;
+      fi;
+      endfor;
+    fi;
+    if (nume mod deno)<>0:
+      if Reponse:
+        trace FondRectangleColorie shifted(m*(Longueur+Ecart,0));
+      fi;
+    else:
+      if Reponse:
+        if Hachures:
+          trace hachurage(polygone(A,B,C,D) shifted(m*(Longueur+Ecart,0)),45,0.25,0) withcolor ColRectangle;
+        else:
+          remplis (polygone(A,B,C,D) shifted(m*(Longueur+Ecart,0))) withcolor ColRectangle;
+        fi;
+      fi;
+    fi;
+    trace FondRectangle shifted(m*(Longueur+Ecart,0));
+    if SansPart:
+    elseif SansPartA:
+      la:=1+floor(uniformdeviate(parts-2));
+      for k=1 upto (parts-1):
+        if k<>la:
+          draw segment(M[k],N[k])shifted(m*(Longueur+Ecart,0));
+        fi;
+      endfor;
+      if Multiple>1:
+        la:=1+floor(uniformdeviate(Multiple-2));
+        for k=1 upto (Multiple-1):
+          if k<>la:
+            draw segment(R[k],S[k]) shifted(m*(Longueur+Ecart,0));
+          fi;
+        endfor;
+      fi;
+    else:
+      for k=1 upto (parts-1):
+        draw segment(M[k],N[k]) shifted(m*(Longueur+Ecart,0));
+      endfor;
+      if Multiple>1:
+        for k=1 upto (Multiple-1):
+          draw segment(R[k],S[k]) shifted(m*(Longueur+Ecart,0));
+        endfor;
+      fi;
+    fi;
+  );
   drawoptions(withpen pencircle scaled Epaisseur);
-  trace hachurage(polygone(A,B,C,D) shifted(l*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  else:
-  remplis (polygone(A,B,C,D) shifted(l*(Longueur+1cm,0))) withcolor ColRectangle;
-  fi;
-  fi;
-  trace FondRectangle shifted(l*(Longueur+1cm,0));
-  endfor;
-  fi;
-  if (nume mod deno)<>0:
-  if Reponse:
-  trace FondRectangleColorie shifted(m*(Longueur+1cm,0));
-  fi;
-  else:
-  if Reponse:
-  if Hachures:
-  trace hachurage(polygone(A,B,C,D) shifted(m*(Longueur+1cm,0)),45,0.25,0) withcolor ColRectangle;
-  else:
-  remplis (polygone(A,B,C,D) shifted(m*(Longueur+1cm,0))) withcolor ColRectangle;
-  fi;
-  fi;
-  fi;
-  trace FondRectangle shifted(m*(Longueur+1cm,0));
-  );
   RetourRectangle
   enddef;
 }%
@@ -904,7 +1105,8 @@
   % #1 num, #2 deno
   \ifluatex%
   \mplibforcehmode%
-  \begin{mplibcode}
+  \begin{mplibcode}%
+    \MPFractionBaseCode;
     boolean Alea;
     Alea=\useKV[ClesFraction]{Aleatoire};
     if Alea:
@@ -913,22 +1115,15 @@
     \MPFractionRectangleCode;
     fi;
     trace FractionRectangle(#1,#2);
-  \end{mplibcode}
+  \end{mplibcode}%
   \else%
-  \begin{mpost}[mpsettings={\MPFractionRectangleCode;color ColRectangle;ColRectangle=\useKV[ClesFraction]{Couleur};}]
+  \begin{mpost}[mpsettings={\MPFractionBaseCode;\MPFractionRectangleCode;}]
     trace FractionRectangle(#1,#2);
-  \end{mpost}
+  \end{mpost}%
   \fi%
 }%
 
 \def\MPFractionDisqueCodeAlea{%
-  Rayon=\useKV[ClesFraction]{Rayon};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  color ColDisque;
-  ColDisque=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Reponse:=\useKV[ClesFraction]{Reponse};
   %
   pair A,B[];
   A=(0,0);
@@ -945,7 +1140,7 @@
   if (nume mod deno)=0:m:=m-1; fi;
   picture RetourFraction;
   RetourFraction=image(%
-  Reste=((nume div deno)+1)*deno;
+  Reste=if (nume mod deno)=0:nume else:((nume div deno)+1)*deno fi;
   RetiensPart=0;
   if Reponse:
     if m>0:
@@ -958,24 +1153,26 @@
                 RetiensPart:=RetiensPart+1;
                 if Hachures:
                   drawoptions(withpen pencircle scaled Epaisseur);
-                  draw hachurage(part[k] shifted(l*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+                  draw hachurage(part[k] shifted(l*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
                 else:
-                  fill part[k] shifted(l*(2*Rayon+1cm,0)) withcolor ColDisque;
+                  fill part[k] shifted(l*(2*Rayon+Ecart,0)) withcolor ColDisque;
                 fi;
+                trace part[k] shifted(l*(2*Rayon+Ecart,0));  
               fi;
             else:
               RetiensPart:=RetiensPart+1;
               if Hachures:
                 drawoptions(withpen pencircle scaled Epaisseur);
-                draw hachurage(part[k] shifted(l*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+                draw hachurage(part[k] shifted(l*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
               else:
-                fill part[k] shifted(l*(2*Rayon+1cm,0)) withcolor ColDisque;
+                fill part[k] shifted(l*(2*Rayon+Ecart,0)) withcolor ColDisque;
               fi;
+              trace part[k] shifted(l*(2*Rayon+Ecart,0));  
             fi;
           fi;
         Reste:=Reste-1;
         endfor;
-      endfor;  
+      endfor;
     fi;
     for k=0 upto deno-1:
       if RetiensPart<nume:
@@ -985,30 +1182,34 @@
             RetiensPart:=RetiensPart+1;
             if Hachures:
               drawoptions(withpen pencircle scaled Epaisseur);
-              draw hachurage(part[k] shifted(m*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+              draw hachurage(part[k] shifted(m*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
             else:
-              fill part[k] shifted(m*(2*Rayon+1cm,0)) withcolor ColDisque;
+              fill part[k] shifted(m*(2*Rayon+Ecart,0)) withcolor ColDisque;
             fi;
+            trace part[k] shifted(m*(2*Rayon+Ecart,0));  
           fi;
         else:
           RetiensPart:=RetiensPart+1;
           if Hachures:
             drawoptions(withpen pencircle scaled Epaisseur);
-            draw hachurage(part[k] shifted(m*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+            draw hachurage(part[k] shifted(m*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
           else:
-            fill part[k] shifted(m*(2*Rayon+1cm,0)) withcolor ColDisque;
+            fill part[k] shifted(m*(2*Rayon+Ecart,0)) withcolor ColDisque;
           fi;
+          trace part[k] shifted(m*(2*Rayon+Ecart,0));
         fi;
       fi;
-      Reste:=Reste-1;  
+      Reste:=Reste-1;
     endfor;
   fi;
   drawoptions(withpen pencircle scaled Epaisseur);
   for l=0 upto m:
-    draw cc shifted(l*(2*Rayon+1cm,0));
-    for k=0 upto (deno-1):
-      draw segment(A,B[k]) shifted(l*(2*Rayon+1cm,0));
-    endfor;
+    draw cc shifted(l*(2*Rayon+Ecart,0));
+    if SansPart=false:
+      for k=0 upto (deno-1):
+        draw segment(A,B[k]) shifted(l*(2*Rayon+Ecart,0));
+      endfor;
+    fi;
   endfor;
   drawoptions();
   );
@@ -1017,61 +1218,71 @@
 }%
 
 \def\MPFractionDisqueCode{%
-  Rayon=\useKV[ClesFraction]{Rayon};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  color ColDisque;
-  ColDisque=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Reponse:=\useKV[ClesFraction]{Reponse};
-  %
   pair A,B[];
   A=(0,0);
   path cc;
   cc=cercles(A,Rayon);
   vardef FractionDisque(expr nume,deno)=
-  for k=0 upto deno:
-  B[k]=pointarc(cc,(360/deno)*k);
-  endfor;
-  m=(nume div deno);
-  if (nume mod deno)=0:m:=m-1; fi;
-  picture RetourFraction;
-  RetourFraction=image(%
-  if Reponse:
-  if m>0:
-  for l=0 upto (m-1):
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  draw hachurage(cc shifted(l*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
-  else:
-  fill cc shifted(l*(2*Rayon+1cm,0)) withcolor ColDisque;
-  fi;
-  endfor;
-  fi;
-  if Hachures:
-  drawoptions(withpen pencircle scaled Epaisseur);
-  draw hachurage((A--B0--arccercle(B[0],B[nume mod deno],A)--cycle) shifted(m*(2*Rayon+1cm,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
-  else:
-  fill ((A--B0--arccercle(B[0],B[nume mod deno],A)--cycle) shifted (m*(2*Rayon+1cm,0))) withcolor ColDisque;
-  fi;
-  fi;
-  drawoptions(withpen pencircle scaled Epaisseur);
-  for l=0 upto m:
-  draw cc shifted(l*(2*Rayon+1cm,0));
-  for k=0 upto (deno-1):
-  draw segment(A,B[k]) shifted(l*(2*Rayon+1cm,0));
-  endfor;
-  endfor;
-  drawoptions();
-  );
-  RetourFraction
+    for k=0 upto deno:
+      B[k]=pointarc(cc,(360/deno)*k);
+    endfor;
+    m=(nume div deno);
+    if (nume mod deno)=0:m:=m-1; fi;
+    picture RetourFraction;
+    RetourFraction=image(%
+      if Reponse:
+        if m>0:
+          for l=0 upto (m-1):
+            if Hachures:
+              drawoptions(withpen pencircle scaled Epaisseur);
+              draw hachurage(cc shifted(l*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+            else:
+              fill cc shifted(l*(2*Rayon+Ecart,0)) withcolor ColDisque;
+            fi;
+          endfor;
+        fi;
+        if Hachures:
+          drawoptions(withpen pencircle scaled Epaisseur);
+          draw hachurage((A--B0--arccercle(B[0],B[nume mod deno],A)--cycle) shifted(m*(2*Rayon+Ecart,0)),1.5*360/deno,0.25,0) withcolor ColDisque;
+        else:
+          fill ((A--B0--arccercle(B[0],B[nume mod deno],A)--cycle) shifted (m*(2*Rayon+Ecart,0))) withcolor ColDisque;
+        fi;
+      fi;
+      drawoptions(withpen pencircle scaled Epaisseur);
+      for l=0 upto m:
+        draw cc shifted(l*(2*Rayon+Ecart,0));
+        if SansPart:
+          if l=m:
+            draw (B0--A--B[nume mod deno]) shifted(l*(2*Rayon+Ecart,0));
+          fi;
+        elseif SansPartA:
+          if deno>1:
+            la:=1+floor(uniformdeviate(deno-2));
+            for k=0 upto (deno-1):
+              if k<>la:
+                draw segment(A,B[k]) shifted(l*(2*Rayon+Ecart,0));
+              fi;
+            endfor;
+          fi;
+        else:
+          if deno>1:
+            for k=0 upto (deno-1):
+              draw segment(A,B[k]) shifted(l*(2*Rayon+Ecart,0));
+            endfor;
+          fi;
+        fi;
+      endfor;
+      drawoptions();
+    );
+    RetourFraction
   enddef;
 }%
 
 \NewDocumentCommand\MPFractionDisque{mm}{%
-  \ifluatex
+  \ifluatex%
   \mplibforcehmode%
-  \begin{mplibcode}
+  \begin{mplibcode}%
+    \MPFractionBaseCode
     boolean Alea;
     Alea=\useKV[ClesFraction]{Aleatoire};
     if Alea:
@@ -1080,23 +1291,15 @@
     \MPFractionDisqueCode
     fi;
     trace FractionDisque(#1,#2);
-  \end{mplibcode}
+  \end{mplibcode}%
   \else%
-  \begin{mpost}[mpsettings={\MPFractionDisqueCode}]
+  \begin{mpost}[mpsettings={\MPFractionBaseCode,\MPFractionDisqueCode}]%
     trace FractionDisque(#1,#2);
-  \end{mpost}
-  \fi
+  \end{mpost}%
+  \fi%
 }%
 
 \def\MPFractionSegmentCodeAlea{%
-  Longueur=\useKV[ClesFraction]{Longueur};
-  color ColSegment;
-  ColSegment=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  %
   pair A,C,B[];
   A=(0,0);
   C-A=(Longueur,0);
@@ -1113,7 +1316,7 @@
   m=nume div deno;
   picture RetourFraction;
   RetourFraction=image(
-  Reste=((nume div deno)+1)*deno;
+  Reste=if (nume mod deno)=0:nume else:((nume div deno)+1)*deno fi;
   RetiensPart=0;
   % Reponse
   if Reponse:
@@ -1127,10 +1330,10 @@
                 RetiensPart:=RetiensPart+1;
                 if Hachures:
                   drawoptions(withpen pencircle scaled Epaisseur);
-                  draw hachurage(part[k] shifted(l*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+                  draw hachurage(part[k] shifted(l*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
                   drawoptions();
                 else:
-                  draw (segment(B[k],B[k+1]) shifted(l*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
+                  draw (segment(B[k],B[k+1]) shifted(l*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
                 fi;
               fi;
             else:
@@ -1137,16 +1340,16 @@
               RetiensPart:=RetiensPart+1;
               if Hachures:
                 drawoptions(withpen pencircle scaled Epaisseur);
-                draw hachurage(part[k] shifted(l*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+                draw hachurage(part[k] shifted(l*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
                 drawoptions();
               else:
-                draw (segment(B[k],B[k+1]) shifted(l*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
+                draw (segment(B[k],B[k+1]) shifted(l*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
               fi;
             fi;
           fi;
         Reste:=Reste-1;
         endfor;
-      endfor;  
+      endfor;
     fi;
     for k=0 upto deno-1:
       if RetiensPart<nume:
@@ -1156,10 +1359,10 @@
             RetiensPart:=RetiensPart+1;
             if Hachures:
               drawoptions(withpen pencircle scaled Epaisseur);
-              draw hachurage(part[k] shifted(m*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+              draw hachurage(part[k] shifted(m*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
               drawoptions();
             else:
-              draw (segment(B[k],B[k+1]) shifted(m*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
+              draw (segment(B[k],B[k+1]) shifted(m*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
             fi;
           fi;
         else:
@@ -1166,30 +1369,30 @@
           RetiensPart:=RetiensPart+1;
           if Hachures:
             drawoptions(withpen pencircle scaled Epaisseur);
-            draw hachurage(part[k] shifted(m*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+            draw hachurage(part[k] shifted(m*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
           else:
-            draw (segment(B[k],B[k+1]) shifted(m*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
+            draw (segment(B[k],B[k+1]) shifted(m*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
           fi;
         fi;
       fi;
-      Reste:=Reste-1;  
+      Reste:=Reste-1;
     endfor;
   fi;
   %fin Reponse
   if Hachures:drawoptions(withpen pencircle scaled Epaisseur);fi;
-  % draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+1cm,0)));
+  % draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+Ecart,0)));
   for l=0 upto m:
-  draw segment(A,C) shifted(l*(Longueur+1cm,0));
+  draw segment(A,C) shifted(l*(Longueur+Ecart,0));
   endfor;
   marque_p:="tiretv";
   for l=0 upto m-1:
   for k=0 upto deno:
-  pointe(B[k] shifted(l*(Longueur+1cm,0)));
+  pointe(B[k] shifted(l*(Longueur+Ecart,0)));
   endfor;
   endfor;
   if (nume mod deno)<>0:
   for k=0 upto deno:
-  pointe(B[k] shifted(m*(Longueur+1cm,0)));
+  pointe(B[k] shifted(m*(Longueur+Ecart,0)));
   endfor;
   fi;
   );
@@ -1198,14 +1401,6 @@
 }
 
 \def\MPFractionSegmentCode{%
-  Longueur=\useKV[ClesFraction]{Longueur};
-  color ColSegment;
-  ColSegment=\useKV[ClesFraction]{Couleur};
-  boolean Hachures,Reponse;
-  Reponse=\useKV[ClesFraction]{Reponse};
-  Hachures=\useKV[ClesFraction]{Hachures};
-  Epaisseur=\useKV[ClesFraction]{Epaisseur};
-  %
   pair A,C,B[];
   A=(0,0);
   C-A=(Longueur,0);
@@ -1222,13 +1417,13 @@
   if Reponse:
   if Hachures:
   drawoptions(withpen pencircle scaled Epaisseur);
-  draw hachurage(polygone(B[0]+u*(0,-0.15),B[deno]+u*(0,-0.15),B[deno]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+  draw hachurage(polygone(B[0]+u*(0,-0.15),B[deno]+u*(0,-0.15),B[deno]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
   drawoptions();
   else:
-  draw (segment(B[0],B[deno]) shifted(l*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
+  draw (segment(B[0],B[deno]) shifted(l*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
   fi;
   fi;
-  draw (segment(B[0],B[deno]) shifted(l*(Longueur+1cm,0)));
+  draw (segment(B[0],B[deno]) shifted(l*(Longueur+Ecart,0)));
   endfor;
   fi;
   if (nume mod deno)<>0:
@@ -1235,29 +1430,53 @@
   if Reponse:
   if Hachures:
   drawoptions(withpen pencircle scaled Epaisseur);
-  draw hachurage(polygone(B[0]+u*(0,-0.15),B[nume mod deno]+u*(0,-0.15),B[nume mod deno]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(Longueur+1cm,0)),120,0.2,0) withcolor ColSegment;
+  draw hachurage(polygone(B[0]+u*(0,-0.15),B[nume mod deno]+u*(0,-0.15),B[nume mod deno]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(Longueur+Ecart,0)),120,0.2,0) withcolor ColSegment;
   drawoptions();
   else:
-  draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+1cm,0))) withpen pencircle scaled 2 withcolor ColSegment;
-  draw segment(A,C) shifted(m*(Longueur+1cm,0));
+  draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+Ecart,0))) withpen pencircle scaled 2 withcolor ColSegment;
+  draw segment(A,C) shifted(m*(Longueur+Ecart,0));
   fi;
   fi;
   if Hachures:drawoptions(withpen pencircle scaled Epaisseur);fi;
-  draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+1cm,0)));
-  draw segment(A,C) shifted(m*(Longueur+1cm,0));
+  draw (segment(B[0],B[nume mod deno]) shifted(m*(Longueur+Ecart,0)));
+  draw segment(A,C) shifted(m*(Longueur+Ecart,0));
   %drawoptions();
   fi;
   if Hachures:drawoptions(withpen pencircle scaled Epaisseur);fi;
   marque_p:="tiretv";
-  for l=0 upto m-1:
-  for k=0 upto deno:
-  pointe(B[k] shifted(l*(Longueur+1cm,0)));
-  endfor;
-  endfor;
-  if (nume mod deno)<>0:
-  for k=0 upto deno:
-  pointe(B[k] shifted(m*(Longueur+1cm,0)));
-  endfor;
+  if SansPart:
+    for l=0 upto m:
+      pointe(A shifted(l*(Longueur+Ecart,0)));
+      pointe(C shifted(l*(Longueur+Ecart,0)));
+    endfor;
+  elseif SansPartA:
+    for l=0 upto m-1:
+      la:=1+floor(uniformdeviate(deno-2));
+      for k=0 upto deno:
+        if k<>la:
+          pointe(B[k] shifted(l*(Longueur+Ecart,0)));
+        fi;
+      endfor;
+    endfor;
+    if (nume mod deno)<>0:
+      la:=1+floor(uniformdeviate(deno-2));
+      for k=0 upto deno:
+        if k<>la:
+          pointe(B[k] shifted(m*(Longueur+Ecart,0)));
+        fi;
+      endfor;
+    fi;
+  else:
+    for l=0 upto m-1:
+      for k=0 upto deno:
+        pointe(B[k] shifted(l*(Longueur+Ecart,0)));
+      endfor;
+    endfor;
+    if (nume mod deno)<>0:
+      for k=0 upto deno:
+        pointe(B[k] shifted(m*(Longueur+Ecart,0)));
+      endfor;
+    fi;
   fi;
   );
   RetourFraction
@@ -1265,9 +1484,10 @@
 }%
 
 \NewDocumentCommand\MPFractionSegment{mm}{%
-  \ifluatex
-  \mplibforcehmode
-  \begin{mplibcode}
+  \ifluatex%
+  \mplibforcehmode%
+  \begin{mplibcode}%
+    \MPFractionBaseCode
     boolean Alea;
     Alea=\useKV[ClesFraction]{Aleatoire};
     if Alea:
@@ -1276,11 +1496,11 @@
     \MPFractionSegmentCode
     fi;
     trace FractionSegment(#1,#2);
-  \end{mplibcode}
-  \else
-  \begin{mpost}[mpsettings={\MPFractionSegmentCode}]
+  \end{mplibcode}%
+  \else%
+  \begin{mpost}[mpsettings={\MPFractionSegmentCode}]%
     trace FractionSegment(#1,#2);
-  \end{mpost}
+  \end{mpost}%
   \fi%
 }%
 
@@ -1292,26 +1512,26 @@
   \ifboolKV[ClesFraction]{Gradue}{%
     \MPFractionSegmentGradue{\ListeFraction[1]}{\ListeFraction[2]}%
   }{%
-  \ifboolKV[ClesFraction]{Eprouvette}{%
-    \MPFractionEprouvette{\ListeFraction[1]}{\ListeFraction[2]}%
-  }{%
-    \ifboolKV[ClesFraction]{Triangle}{%
-      \MPFractionTriangle{\ListeFraction[1]}{\ListeFraction[2]}%
+    \ifboolKV[ClesFraction]{Eprouvette}{%
+      \MPFractionEprouvette{\ListeFraction[1]}{\ListeFraction[2]}%
     }{%
-      \ifboolKV[ClesFraction]{Regulier}{%
-        \MPFractionRegulier{\ListeFraction[1]}{\ListeFraction[2]}%
+      \ifboolKV[ClesFraction]{Triangle}{%
+        \MPFractionTriangle{\ListeFraction[1]}{\ListeFraction[2]}%
       }{%
-        \ifboolKV[ClesFraction]{Segment}{%
-          \MPFractionSegment{\ListeFraction[1]}{\ListeFraction[2]}%
+        \ifboolKV[ClesFraction]{Regulier}{%
+          \MPFractionRegulier{\ListeFraction[1]}{\ListeFraction[2]}%
         }{%
-          \ifboolKV[ClesFraction]{Rectangle}{%
-            \MPFractionRectangle{\ListeFraction[1]}{\ListeFraction[2]}%
+          \ifboolKV[ClesFraction]{Segment}{%
+            \MPFractionSegment{\ListeFraction[1]}{\ListeFraction[2]}%
           }{%
-            \MPFractionDisque{\ListeFraction[1]}{\ListeFraction[2]}%
+            \ifboolKV[ClesFraction]{Rectangle}{%
+              \MPFractionRectangle{\ListeFraction[1]}{\ListeFraction[2]}%
+            }{%
+              \MPFractionDisque{\ListeFraction[1]}{\ListeFraction[2]}%
+            }%
           }%
         }%
       }%
     }%
   }%
-}%
 }%
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterTableur.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterTableur.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCRepresenterTableur.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -110,10 +110,10 @@
   \addtot at bs{\\\hline&}%
   \collectcp at bodys
   }{%
-  \setlength{\PfCLongInter}{-40pt+\fpeval{\useKV[Tableur]{LargeurUn}}pt+\fpeval{(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}}pt+\fpeval{2*\useKV[Tableur]{Colonnes}-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+2}\arrayrulewidth}%  
+                       \setlength{\PfCLongInter}{\fpeval{-60+\useKV[Tableur]{LargeurNombre}+\useKV[Tableur]{LargeurUn}+(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}}pt+\fpeval{2*\useKV[Tableur]{Colonnes}-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+2}\arrayrulewidth}%
   \ifboolKV[Tableur]{Bandeau}{%
     \begin{NiceTabular}{p{\PfCTableurLargeur}p{10pt}p{50pt}p{\PfCLongInter}}%
-      \Block[draw,l]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\
+      \Block[l,hvlines]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\
       \CodeAfter
       \ifboolKV[Tableur]{ApresBandeau}{%
         \useKV[Tableur]{CodeAfterBandeau}%
@@ -134,7 +134,7 @@
             \xintifboolexpr{\cntlin>\fpeval{\useKV[Tableur]{Ligne}} 'and' \cntlin<\fpeval{\useKV[Tableur]{Ligne}+\useKV[Tableur]{PasL}+1}}{\textcolor{white}{\fpeval{\cntlin+\Affichecntlin-1}}}{\fpeval{\cntlin+\Affichecntlin-1}}%
             }{\fpeval{\cntlin+\Affichecntlin-1}}%
         \fi}%
-        wc{20pt}A*{\fpeval{\useKV[Tableur]{Colonnes}-1}}{B}}[hvlines]%,color-inside
+        wc{\PfCTableurLargeurZero}A*{\fpeval{\useKV[Tableur]{Colonnes}-1}}{B}}[hvlines]%,color-inside
       \CodeBefore
       % on colorie en gris toute la première ligne
       \tikz\fill[gray!15](row-1-|col-1) rectangle (row-2-|last);%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCSimplifierFraction.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCSimplifierFraction.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCSimplifierFraction.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -21,6 +21,15 @@
   \fi}%
 \makeatother
 
+\def\PfCSimplifiable#1#2{%
+  \ensuremath{%
+    \PGCD{#1}{#2}%
+    \ifnum\pgcd>1\relax
+      \text{ ou }\Simplification{#1}{#2}%
+    \fi
+  }%
+}%
+
 \def\SSimplifie#1#2{%
   % Simplification d'une \'ecriture #1/#2
   \ensuremath{

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCSolides.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCSolides.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCSolides.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -5,7 +5,7 @@
 \def\fileversionSolides{0.1b}%
 \message{-- \filedateSolides\space v\fileversionSolides}%
 %
-\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,Arete=1,RayonCone=1,HauteurCone=2,HauteurPrisme=2,SommetsPrisme=6,HauteurPyramide=2,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B},Traces={},Section={},CouleurSection={}}%
+\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,Arete=1,RayonCone=1,HauteurCone=2,HauteurPrisme=2,SommetsPrisme=6,HauteurPyramide=2,RayonPyramide=1,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B},Traces={},Section={},CouleurSection={}}%
 \defKV[ClesSolides]{
   Traces=\ifempty{#1}{}{\setKV[ClesSolides]{Code}},%
   Section=\ifempty{#1}{}{\setKV[ClesSolides]{Sections}},%
@@ -219,7 +219,7 @@
     outcolor:=PfCOutColor;
     Ferme1:=true;
     angx:=anglerotationx;
-    Objetcylindre1("r="&decimal(rayoncylindre),"h="&decimal(hauteurcylindre));
+    Objetcylindre1("r=rayoncylindre","h=hauteurcylindre");
     eclairage:=false;
 %    traits:=false;
 %    AffichageObjet1;
@@ -357,6 +357,7 @@
     CoefSection=\useKV[ClesSolides]{CoefSection};
     anglerotationx=\useKV[ClesSolides]{Anglex};
     hauteurpyramide=\useKV[ClesSolides]{HauteurPyramide};
+    rayonpyramide=\useKV[ClesSolides]{RayonPyramide};
     nombresommets=\useKV[ClesSolides]{SommetsPyramide};
     color PfCOutColor,DecalageSommet;
     PfCOutColor=\useKV[ClesSolides]{Couleur};
@@ -385,7 +386,7 @@
     else:
     repereangle:=(k-2)*ecartangle+(ecartangle*0.25+uniformdeviate(floor(ecartangle/2)));
     fi;
-    Sommet[k]:=(cosd(repereangle),-sind(repereangle),0);
+    Sommet[k]:=rayonpyramide*(cosd(repereangle),-sind(repereangle),0);
     endfor;
     Sommet[NbS+1]:=Sommet[2];
 
@@ -585,7 +586,7 @@
     outcolor:=PfCOutColor;
     Ferme1:=true;
     angx:=anglerotationx;
-    Objetcone1("r="&decimal(rayoncone),"h="&decimal(hauteurcone));
+    Objetcone1("r=rayoncone","h=hauteurcone");
     traits:=false;
     AffichageObjet1;
 
@@ -920,7 +921,7 @@
     outcolor:=white;%PfCOutColor;
     Ferme1:=true;
     angx:=anglerotationx;
-    Objetsphere1("R="&decimal(rayonsphere));
+    Objetsphere1("R=rayonsphere");
     % traits:=false;
     % AffichageObjet1;
     color Sommet[],SommetN,SommetS,SommetB;
@@ -995,7 +996,7 @@
     % Ferme1:=false;
     creux:=true;
     angx:=anglerotationx;
-    Objetdemispherebasse1("R="&decimal(rayonsphere));
+    Objetdemispherebasse1("R=rayonsphere");
     % traits:=false;
     AffichageObjet1;
     color Sommet[],SommetN,SommetS,SommetB;

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCStatistiques.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCStatistiques.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCStatistiques.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -2715,6 +2715,7 @@
 
 \NewDocumentCommand\buildmoustacheMP{m}{%
   \ifluatex%
+    \setbox1=\hbox{,}
   \mplibforcehmode%
   \begin{mplibcode}
     pasx=\useKV[ClesStat]{Pasx};
@@ -2747,12 +2748,12 @@
         if (k>1) and (k<5):
           if Lecture=false:
             trace segment((xpart(P[k]),0.5cm),(xpart(P[k]),0)) dashed evenly;
-            label.top(TEX("\scriptsize\num{"&decimal(val[k])&"}"),(xpart(P[k]),1.5cm));
+            label.top(TEX("\rule[-\dp1]{0pt}{0pt}\scriptsize\num{"&decimal(val[k])&"}"),(xpart(P[k]),1.5cm));
           fi;
         else:
           if Lecture=false:
             trace segment(P[k],(xpart(P[k]),0)) dashed evenly;
-            label.top(TEX("\scriptsize\num{"&decimal(val[k])&"}"),(xpart(P[k]),1.2cm));
+            label.top(TEX("\rule[-\dp1]{0pt}{0pt}\scriptsize\num{"&decimal(val[k])&"}"),(xpart(P[k]),1.2cm));
           fi;
         fi;
       endfor;
@@ -2772,7 +2773,7 @@
     R1=(u*(floor(val1/pasx)*pasx),0);
     R2=(u*(ceiling(val5/pasx)*pasx),0);
     %
-    for k=0 upto 20:
+    for k=0 upto 20/PasGrilley:
       draw (R1--R2) shifted (0,k*PasGrilley*1mm) withcolor 0.8white;
     endfor;
     k=0;

Added: trunk/Master/texmf-dist/tex/latex/profcollege/PfCSystemeImage.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCSystemeImage.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCSystemeImage.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -0,0 +1,57 @@
+%%%
+% Systèmes images
+%%%
+\def\filedateSystemeImage{2025/07/27}%
+\def\fileversionSystemeImage{0.1}%
+\message{-- \filedateSystemeImage\space v\fileversionSystemeImage}%
+%
+\setKVdefault[SystemeImage]{Images={A,B,C},Solutions=false,Solution={},Inconnues={A,B,C}}
+
+\makeatletter
+\NewDocumentCommand\SystemeImage{om}{%
+  \useKVdefault[SystemeImage]%
+  \setKV[SystemeImage]{#1}%
+  \ifemptyKV[SystemeImage]{Solution}{}{\setKV[SystemeImage]{Solutions}}%
+  \edef\PfM at PrepaImages{\useKV[SystemeImage]{Images}}%
+  \edef\PfM at PrepaInconnues{\useKV[SystemeImage]{Inconnues}}%
+  \setsepchar{,}\ignoreemptyitems%
+  \readlist*\PfM at ListeImages{\PfM at PrepaImages}%
+  \readlist*\PfM at ListeInconnues{\PfM at PrepaInconnues}%
+  \setsepchar{§}\ignoreemptyitems%
+  \readlist*\PfM at ListeEqua{#2}%
+  \reademptyitems%
+%  Equa : $\showitems\PfM at ListeEqua[]$\par
+%  Inconnues : \showitems\PfM at ListeInconnues[]\par
+%  Images : \showitems\PfM at ListeImages[]\par
+  \ifboolKV[SystemeImage]{Solutions}{%
+    \edef\PfM at PrepaSolutions{\useKV[SystemeImage]{Solution}}%
+    \setsepchar{,}\ignoreemptyitems%
+    \readlist*\PfM at ListeSolutions{\PfM at PrepaSolutions}%
+    \reademptyitems%
+    \begin{align*}
+      \xintFor* ##1 in{\xintSeq{1}{\PfM at ListeEqualen}}\do{%
+      &\edef\PfM at Test{\PfM at ListeEqua[##1]}%
+        \xintFor* ##2 in{\xintSeq{1}{\PfM at ListeImageslen}}\do{%
+        \expandarg%
+        \edef\PfM at Titi{\PfM at ListeInconnues[##2]}%
+        \StrSubstitute{\PfM at Test}{\PfM at Titi}{\mathcolor{Evidence}{\PfM at ListeSolutions[##2]}}[\PfM at Test]%
+        }%
+        \PfM at Test\xintifboolexpr{##1==\PfM at ListeEqualen}{}{\\}
+      }%
+    \end{align*}
+  }{%
+    \begin{align*}
+      \xintFor* ##1 in{\xintSeq{1}{\PfM at ListeEqualen}}\do{%
+      &\edef\PfM at Test{\PfM at ListeEqua[##1]}%
+        \xintFor* ##2 in{\xintSeq{1}{\PfM at ListeImageslen}}\do{%
+        \expandarg%
+        \edef\PfM at Titi{\PfM at ListeInconnues[##2]}%
+        %
+        \StrSubstitute{\PfM at Test}{\PfM at Titi}{\raisebox{-0.25\height}{\text{\PfM at ListeImages[##2]}}}[\PfM at Test]%
+        }\PfM at Test\xintifboolexpr{##1==\PfM at ListeEqualen}{}{\\}
+      }%
+    \end{align*}
+  }%
+}%
+\makeatother
+%
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/profcollege/PfCSystemeImage.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCTortueBase.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCTortueBase.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCTortueBase.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -190,8 +190,8 @@
       \immediate\write\turtle at out{drawoptions(withcolor DarkGreen);label(TEX("\noexpand\useKV[Tortue]{Personnage}") rotated RetiensAngle[0] scaled 1.5,A[0]);}%
   }{}%
   \ifboolKV[Tortue]{Etapes}{%
-    \immediate\write\turtle at out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[Total] scaled 1.5,A[Total]);}%
-  }{\ifboolKV[Tortue]{TortueF}{\immediate\write\turtle at out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[k] scaled 1.5,A[k]);}}{}}%
+    \immediate\write\turtle at out{drawoptions(withcolor DarkGreen);label(TEX("\noexpand\useKV[Tortue]{Personnage}") rotated RetiensAngle[Total] scaled 1.5,A[Total]);}%
+  }{\ifboolKV[Tortue]{TortueF}{\immediate\write\turtle at out{drawoptions(withcolor DarkGreen);label(TEX("\noexpand\useKV[Tortue]{Personnage}") rotated RetiensAngle[k] scaled 1.5,A[k]);}}{}}%
   \immediate\write\turtle at out{drawoptions();}%
   \ifboolKV[Tortue]{Trace}{%
     \immediate\write\turtle at out{\useKV[Tortue]{Traces}}%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCUrneProba.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCUrneProba.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCUrneProba.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -13,7 +13,7 @@
 \def\UpdatetoksUrneNombres#1\nil{\addtotok\tokUrneListeNombres{"#1",}}%
 \def\UpdatetoksUrneColonnes#1\nil{\addtotok\tokUrneListeColonnes{"#1",}}%
 
-\setKVdefault[PfCUrne]{Couleurs=false,Nombres=false,Pas=4,Echelle=1,Repartition={1,2,3},Double=false,RepartitionC={1,2,3},RepartitionN={1,2,3},Roue=false,Rayon=3,Tableau=false,SansRemise=false,Solution=false,Codes=false,CouleurLigne=0.85white,CouleurColonne=0.85white,Different=false,RepartitionLigne={1,2,3},RepartitionColonne={1,2,3},Impression,Casino=false,Traces={},ListeCouleurs={},ListeNombres={},ListeColonne={},ListeLigne={}}%
+\setKVdefault[PfCUrne]{Couleurs=false,Nombres=false,Pas=4,Echelle=1,Repartition={1,2,3},Double=false,RepartitionC={1,2,3},RepartitionN={1,2,3},Roue=false,Rayon=3,Tableau=false,SansRemise=false,Solution=false,Codes=false,CouleurLigne=0.85white,CouleurColonne=0.85white,Different=false,RepartitionLigne={1,2,3},RepartitionColonne={1,2,3},Impression,Casino=false,Traces={},ListeCouleurs={},ListeNombres={},ListeColonne={},ListeLigne={},Orientation=false,CoefEcart=17}%
 \defKV[PfCUrne]{%
   Traces=\ifempty{#1}{}{\setKV[PfCUrne]{Codes}},%
   ListeCouleurs=\ifempty{#1}{}{\setKV[PfCUrne]{Couleurs}\setsepchar{,}\ignoreemptyitems\readlist*\ListeCouleursAv{#1}\reademptyitems},
@@ -393,47 +393,49 @@
       u:=\useKV[PfCUrne]{Echelle}*1cm;
       numeric RetiensNum[];
       vardef RecupRepartition(text t)=
-      n:=0;
-      for p_=t:
-      RetiensNum[n]=p_;
-      n:=n+1;
-      endfor;
-      totalboules=n;
+        n:=0;
+        for p_=t:
+          RetiensNum[n]=p_;
+          n:=n+1;
+        endfor;
+        totalboules=n;
       enddef;
 
       color Col[];
       vardef RecuperationCouleurs(text t)=
-      n:=0;
-      for p_=t:
-      n:=n+1;
-      Col[n]=p_;
-      endfor;
+        n:=0;
+        for p_=t:
+          n:=n+1;
+          Col[n]=p_;
+        endfor;
       enddef;
 
       string Nombres[];
       vardef RecuperationNombres(text t)=
-      n:=0;
-      for p_=t:
-      n:=n+1;
-      Nombres[n]=p_;
-      endfor;
+        n:=0;
+        for p_=t:
+          n:=n+1;
+          Nombres[n]=p_;
+        endfor;
       enddef;
       
-      numeric Pas,Rayon;
+      numeric Pas,Rayon,CoefEcart;
+      CoefEcart=\useKV[PfCUrne]{CoefEcart};
       Pas=\useKV[PfCUrne]{Pas};
       Rayon=\useKV[PfCUrne]{Rayon};
       
-      boolean Couleurs, Nombres, Roue;
+      boolean Couleurs, Nombres, Roue, Orientation;
       Couleurs=\useKV[PfCUrne]{Couleurs};
       Nombres=\useKV[PfCUrne]{Nombres};
       Roue=\useKV[PfCUrne]{Roue};
+      Orientation=\useKV[PfCUrne]{Orientation};
       
       RecupRepartition(#3);
       if Couleurs:
-      RecuperationCouleurs(#1);
+        RecuperationCouleurs(#1);
       fi;
       if Nombres:
-      RecuperationNombres(#2);
+        RecuperationNombres(#2);
       fi;
 
       pair O;
@@ -440,71 +442,75 @@
       pair A[],B[];
 
       if Roue:
-      O=(0,0);
-      path cc;
-      cc=cercles(O,Rayon*u);
-      angd=180/totalboules;
-      angr=360/totalboules;
-      for k=1 upto totalboules:
-      A[k]=17/20[O,pointarc(cc,angd+(k-1)*angr)];
-      endfor;
-      drawarrow rotation((O+u*(0,1.35*Rayon))--(O+u*(0,1.1*Rayon)),O,angd);
-      % trace cc;
-      B[0]=pointarc(cc,0);
-      for k=1 upto totalboules:
-      B[k]=pointarc(cc,k*angr);
-      if Couleurs:
-      fill O--arccercle(B[k-1],B[k],O)--cycle withcolor if unknown Col[RetiensNum[k-1]]:white else: Col[RetiensNum[k-1]] fi;
-      else:
-      label(TEX(Nombres[RetiensNum[k-1]]),A[k]);
-      fi;
-      endfor;
-      trace cc;
-      for k=1 upto totalboules:
-      trace O--B[k];
-      endfor;
+        O=(0,0);
+        path cc;
+        cc=cercles(O,Rayon*u);
+        angd=180/totalboules;
+        angr=360/totalboules;
+        for k=1 upto totalboules:
+          A[k]=(CoefEcart/20)[O,pointarc(cc,angd+(k-1)*angr)];
+        endfor;
+        drawarrow rotation((O+u*(0,1.35*Rayon))--(O+u*(0,1.1*Rayon)),O,angd);
+        % trace cc;
+        B[0]=pointarc(cc,0);
+        for k=1 upto totalboules:
+          B[k]=pointarc(cc,k*angr);
+          if Couleurs:
+            fill O--arccercle(B[k-1],B[k],O)--cycle withcolor if unknown Col[RetiensNum[k-1]]:white else: Col[RetiensNum[k-1]] fi;
+          else:
+            if Orientation:
+              label(TEX(Nombres[RetiensNum[k-1]]) rotated angle(A[k]-O),iso(O,A[k]));
+            else:
+              label(TEX(Nombres[RetiensNum[k-1]]),A[k]);
+            fi;
+          fi;
+        endfor;
+        trace cc;
+        for k=1 upto totalboules:
+          trace O--B[k];
+        endfor;
       else:      
-      for k=0 upto (totalboules div Pas)-1:
-      for l=0 upto Pas-1:
-      rang:=k*Pas+l;
-      A[rang]=u*(0.5,0.5)+u*(l,k);
-      if Couleurs:
-      fill cercles(A[rang],0.5u) withcolor if unknown Col[RetiensNum[rang]]:white else: Col[RetiensNum[rang]] fi;
-      else:
-      label(TEX(Nombres[RetiensNum[rang]]),A[rang]);
+        for k=0 upto (totalboules div Pas)-1:
+          for l=0 upto Pas-1:
+            rang:=k*Pas+l;
+            A[rang]=u*(0.5,0.5)+u*(l,k);
+            if Couleurs:
+              fill cercles(A[rang],0.5u) withcolor if unknown Col[RetiensNum[rang]]:white else: Col[RetiensNum[rang]] fi;
+            else:
+              label(TEX(Nombres[RetiensNum[rang]]),A[rang]);
+            fi;
+            % trace cercles(A[k*Pas+l],0.5u);
+          endfor;
+        endfor;
+        for k=0 upto (totalboules mod Pas)-1:
+          rang:=(totalboules div Pas)*Pas+k;
+          A[rang]=u*(0.5,0.5)+u*(k+0.5,totalboules div Pas-1+cosd(30));
+          if Couleurs:
+            fill cercles(A[rang],0.5u) withcolor if unknown Col[RetiensNum[rang]]:white else: Col[RetiensNum[rang]] fi;
+          else:
+            label(TEX(Nombres[RetiensNum[rang]]),A[rang]);
+          fi;
+          % trace cercles(A[(totalboules div Pas)*Pas+k],0.5u);
+        endfor;
+        % 
+        for k=0 upto (totalboules div Pas)-1:
+          for l=0 upto Pas-1:
+            rang:=k*Pas+l;
+            trace cercles(A[rang],0.5u);
+          endfor;
+        endfor;
+        for k=0 upto (totalboules mod Pas)-1:
+          rang:=(totalboules div Pas)*Pas+k;
+          trace cercles(A[rang],0.5u);
+        endfor;
+        % 
+        drawoptions(withpen pencircle scaled 1.2);
+        if totalboules<Pas:
+          trace u*(0,(totalboules div Pas)+1.15)--u*(0,0-(1-cosd(30)))--u*(Pas,0-(1-cosd(30)))--u*(Pas,(totalboules div Pas)+1.15);
+        else:
+          trace u*(0,(totalboules div Pas)+1.15)--u*(0,0)--u*(Pas,0)--u*(Pas,(totalboules div Pas)+1.15);
+        fi;
       fi;
-      %trace cercles(A[k*Pas+l],0.5u);
-      endfor;
-      endfor;
-      for k=0 upto (totalboules mod Pas)-1:
-      rang:=(totalboules div Pas)*Pas+k;
-      A[rang]=u*(0.5,0.5)+u*(k+0.5,totalboules div Pas-1+cosd(30));
-      if Couleurs:
-      fill cercles(A[rang],0.5u) withcolor if unknown Col[RetiensNum[rang]]:white else: Col[RetiensNum[rang]] fi;
-      else:
-      label(TEX(Nombres[RetiensNum[rang]]),A[rang]);
-      fi;
-      %trace cercles(A[(totalboules div Pas)*Pas+k],0.5u);
-      endfor;
-      %
-      for k=0 upto (totalboules div Pas)-1:
-      for l=0 upto Pas-1:
-      rang:=k*Pas+l;
-      trace cercles(A[rang],0.5u);
-      endfor;
-      endfor;
-      for k=0 upto (totalboules mod Pas)-1:
-      rang:=(totalboules div Pas)*Pas+k;
-      trace cercles(A[rang],0.5u);
-      endfor;
-      %
-      drawoptions(withpen pencircle scaled 1.2);
-      if totalboules<Pas:
-      trace u*(0,(totalboules div Pas)+1.15)--u*(0,0-(1-cosd(30)))--u*(Pas,0-(1-cosd(30)))--u*(Pas,(totalboules div Pas)+1.15);
-      else:
-      trace u*(0,(totalboules div Pas)+1.15)--u*(0,0)--u*(Pas,0)--u*(Pas,(totalboules div Pas)+1.15);
-      fi;
-      fi;
     \end{mplibcode}
   \else
     \begin{mpost}[mpsettings={u:=\useKV[PfCUrne]{Echelle}*1cm;numeric Pas;Pas=\useKV[PfCUrne]{Pas}; boolean Couleurs, Nombres; Couleurs=\useKV[PfCUrne]{Couleurs}; Nombres=\useKV[PfCUrne]{Nombres};}]
@@ -818,26 +824,27 @@
   }{%
     \ifboolKV[PfCUrne]{Tableau}{%
       \ifboolKV[PfCUrne]{Different}{%
-        \xdef\PfCFooRepartitionC{\useKV[PfCUrne]{RepartitionColonne}}%
-        \xdef\PfCFooRepartitionL{\useKV[PfCUrne]{RepartitionLigne}}%
+        \edef\PfCFooRepartitionC{\useKV[PfCUrne]{RepartitionColonne}}%
+        \edef\PfCFooRepartitionL{\useKV[PfCUrne]{RepartitionLigne}}%
         \setsepchar{,}\ignoreemptyitems%
         \readlist*\ListeRepartitionCAv{\PfCFooRepartitionC}%
         \readlist*\ListeRepartitionLAv{\PfCFooRepartitionL}%
+        \reademptyitems%
         % Repartition : \showitems\ListeRepartitionAv[]%
-        \xdef\PfCFooListeRepartitionC{}%
-        \xdef\PfCFooListeRepartitionL{}%
-        \xdef\PfCTotalC{0}%
-        \xdef\PfCTotalL{0}%
+        \edef\PfCFooListeRepartitionC{}%
+        \edef\PfCFooListeRepartitionL{}%
+        \edef\PfCTotalC{0}%
+        \edef\PfCTotalL{0}%
         \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionCAvlen}}\do{%
           \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionCAv[##1]}}\do{%
-            \xdef\PfCFooListeRepartitionC{\PfCFooListeRepartitionC,##1}%
-            \xdef\PfCTotalC{\fpeval{\PfCTotalC+1}}%
+            \edef\PfCFooListeRepartitionC{\PfCFooListeRepartitionC,##1}%
+            \edef\PfCTotalC{\fpeval{\PfCTotalC+1}}%
           }%
         }%
         \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionLAvlen}}\do{%
           \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionLAv[##1]}}\do{%
-            \xdef\PfCFooListeRepartitionL{\PfCFooListeRepartitionL,##1}%
-            \xdef\PfCTotalL{\fpeval{\PfCTotalL+1}}%
+            \edef\PfCFooListeRepartitionL{\PfCFooListeRepartitionL,##1}%
+            \edef\PfCTotalL{\fpeval{\PfCTotalL+1}}%
           }%
         }%
         \foreachitem\compteur\in\ListeCouleursAv{\expandafter\UpdatetoksUrneColonnes\compteur\nil}%
@@ -844,15 +851,16 @@
         \foreachitem\compteur\in\ListeNombresAv{\expandafter\UpdatetoksUrneNombres\compteur\nil}%    
         \BuildTableauDoubleEntreeDifferent{\the\tokUrneListeColonnes}{\the\tokUrneListeNombres}{\PfCFooListeRepartitionC}{\PfCFooListeRepartitionL}%
      }{%
-       \xdef\PfCFooRepartition{\useKV[PfCUrne]{Repartition}}%
+       \edef\PfCFooRepartition{\useKV[PfCUrne]{Repartition}}%
        \setsepchar{,}\ignoreemptyitems%
        \readlist*\ListeRepartitionAv{\PfCFooRepartition}%
-       \xdef\PfCFooListeRepartition{}%
-       \xdef\PfCTotal{0}%
+       \reademptyitems%
+       \edef\PfCFooListeRepartition{}%
+       \edef\PfCTotal{0}%
        \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionAvlen}}\do{%
          \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionAv[##1]}}\do{%
-           \xdef\PfCFooListeRepartition{\PfCFooListeRepartition,##1}%
-           \xdef\PfCTotal{\fpeval{\PfCTotal+1}}%
+           \edef\PfCFooListeRepartition{\PfCFooListeRepartition,##1}%
+           \edef\PfCTotal{\fpeval{\PfCTotal+1}}%
          }%
        }%
        \ifboolKV[PfCUrne]{Couleurs}{%
@@ -867,53 +875,55 @@
      }%
    }{%
      \ifboolKV[PfCUrne]{Double}{%
-       \xdef\PfCFooRepartitionC{\useKV[PfCUrne]{RepartitionC}}%
-       \xdef\PfCFooRepartitionN{\useKV[PfCUrne]{RepartitionN}}%
+       \edef\PfCFooRepartitionC{\useKV[PfCUrne]{RepartitionC}}%
+       \edef\PfCFooRepartitionN{\useKV[PfCUrne]{RepartitionN}}%
        \setsepchar{,}\ignoreemptyitems%
        \readlist*\ListeRepartitionCAv{\PfCFooRepartitionC}%
        \readlist*\ListeRepartitionNAv{\PfCFooRepartitionN}%
        % Repartition : \showitems\ListeRepartitionAv[]%
-       \xdef\PfCFooListeRepartitionC{}%
-       \xdef\PfCFooListeRepartitionN{}%
-       \xdef\PfCTotalC{0}%
-       \xdef\PfCTotalN{0}%
+       \reademptyitems%
+       \edef\PfCFooListeRepartitionC{}%
+       \edef\PfCFooListeRepartitionN{}%
+       \edef\PfCTotalC{0}%
+       \edef\PfCTotalN{0}%
        \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionCAvlen}}\do{%
          \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionCAv[##1]}}\do{%
-           \xdef\PfCFooListeRepartitionC{\PfCFooListeRepartitionC,##1}%
-           \xdef\PfCTotalC{\fpeval{\PfCTotalC+1}}%
+           \edef\PfCFooListeRepartitionC{\PfCFooListeRepartitionC,##1}%
+           \edef\PfCTotalC{\fpeval{\PfCTotalC+1}}%
          }%
        }%
        \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionNAvlen}}\do{%
          \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionNAv[##1]}}\do{%
-           \xdef\PfCFooListeRepartitionN{\PfCFooListeRepartitionN,##1}%
-           \xdef\PfCTotalN{\fpeval{\PfCTotalN+1}}%
+           \edef\PfCFooListeRepartitionN{\PfCFooListeRepartitionN,##1}%
+           \edef\PfCTotalN{\fpeval{\PfCTotalN+1}}%
          }%
        }%
        \MelangeListe{\PfCFooListeRepartitionC}{\PfCTotalC}%
-       \xdef\ListeRepartitionCouleurs{\faa}%
+       \edef\ListeRepartitionCouleurs{\faa}%
        \foreachitem\compteur\in\ListeCouleursAv{\expandafter\UpdatetoksUrneCouleurs\compteur\nil}%
        \MelangeListe{\PfCFooListeRepartitionN}{\PfCTotalN}%
-       \xdef\ListeRepartitionNombres{\faa}%
+       \edef\ListeRepartitionNombres{\faa}%
        \foreachitem\compteur\in\ListeNombresAv{\expandafter\UpdatetoksUrneNombres\compteur\nil}%    
        \BuildUrneDouble{\the\tokUrneListeCouleurs}{\the\tokUrneListeNombres}{\ListeRepartitionCouleurs}{\ListeRepartitionNombres}%
      }{%
-       \xdef\PfCFooRepartition{\useKV[PfCUrne]{Repartition}}%
+       \edef\PfCFooRepartition{\useKV[PfCUrne]{Repartition}}%
        \setsepchar{,}\ignoreemptyitems%
        \readlist*\ListeRepartitionAv{\PfCFooRepartition}%
        % Repartition : \showitems\ListeRepartitionAv[]%
-       \xdef\PfCFooListeRepartition{}%
-       \xdef\PfCTotal{0}%
+       \reademptyitems%
+       \edef\PfCFooListeRepartition{}%
+       \edef\PfCTotal{0}%
        \xintFor* ##1 in{\xintSeq{1}{\ListeRepartitionAvlen}}\do{%
          \xintFor* ##2 in{\xintSeq{1}{\ListeRepartitionAv[##1]}}\do{%
-           \xdef\PfCFooListeRepartition{\PfCFooListeRepartition,##1}%
-           \xdef\PfCTotal{\fpeval{\PfCTotal+1}}%
+           \edef\PfCFooListeRepartition{\PfCFooListeRepartition,##1}%
+           \edef\PfCTotal{\fpeval{\PfCTotal+1}}%
          }%
        }%
        \ifboolKV[PfCUrne]{Couleurs}{%
-         \xdef\ListeAvantCouleurs{\useKV[PfCUrne]{ListeCouleurs}}%
+         \edef\ListeAvantCouleurs{\useKV[PfCUrne]{ListeCouleurs}}%
          % Couleurs = \ListeAvantCouleurs
          \MelangeListe{\PfCFooListeRepartition}{\PfCTotal}%
-         \xdef\ListeRepartitionCouleurs{\faa}%
+         \edef\ListeRepartitionCouleurs{\faa}%
          % \foreachitem\compteur\in\ListeCouleursAv{\expandafter\UpdatetoksUrneCouleurs\compteur\nil}%
          % Couleurs :\\
          % La répartition est : \ListeRepartitionCouleurs\\
@@ -923,11 +933,11 @@
        }{%
          \ifboolKV[PfCUrne]{Nombres}{%
            \MelangeListe{\PfCFooListeRepartition}{\PfCTotal}%
-           \xdef\ListeRepartitionNombres{\faa}%
+           \edef\ListeRepartitionNombres{\faa}%
            \foreachitem\compteur\in\ListeNombresAv{\expandafter\UpdatetoksUrneNombres\compteur\nil}%
-           % Nombres :\\
-           % La répartition est : \ListeRepartitionNombres\\
-           % Les nombres sont : \the\tokUrneListeNombres.\\
+%            Nombres :\\
+%            La répartition est : \ListeRepartitionNombres\\
+%            Les nombres sont : \the\tokUrneListeNombres.\\
            \BuildUrne{}{\the\tokUrneListeNombres}{\ListeRepartitionNombres}%
          }{}%
        }%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/PfCVueCubes.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/PfCVueCubes.tex	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/PfCVueCubes.tex	2025-08-27 20:13:06 UTC (rev 76163)
@@ -5,7 +5,7 @@
 \def\fileversionVueCubes{0.1c}%
 \message{-- \filedateVueCubes\space v\fileversionVueCubes}%
 %
-\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false,Seul=false,Perso=false,EclateX=0,EclateZ=0,EclateY=0,TroisCouleur=false,TroisCouleurs={},Colores=false,ListeCouleurs={},Theta=20,Codes=false,Traces={},Visualisation=false}
+\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false,Seul=false,Perso=false,EclateX=0,EclateZ=0,EclateY=0,TroisCouleur=false,TroisCouleurs={},Colores=false,ListeCouleurs={},Theta=20,Codes=false,Traces={},Visualisation=false,Ecart=\qquad}
 \defKV[VueCubes]{%
   TroisCouleurs=\ifempty{#1}{}{\setKV[VueCubes]{TroisCouleur}\setsepchar{,}\ignoreemptyitems\readlist*\ListeCouleursVueCubes{#1}},%
   ListeCouleurs=\ifempty{#1}{}{\setKV[VueCubes]{Colores}\setsepchar{,}\ignoreemptyitems\readlist*\ListeCouleursVueCubes{#1}},%
@@ -17,7 +17,7 @@
 \def\UpdatetoksEmpilementPerso#1\nil{\addtotok\toklisteVueCube{"#1",}}%
 
 \NewDocumentCommand\VueCubes{o m}{%
-  \newtoks\toklistecouleur\toklistecouleur{}
+  \newtoks\toklistecouleur\toklistecouleur{}%
   \useKVdefault[VueCubes]%
   \setKV[VueCubes]{#1}%
   \toklisteVueCube{}%
@@ -61,76 +61,77 @@
 \NewDocumentCommand\BuildMPEmpilementPerso{mmmm}{%
   \ifluatex%
     \mplibforcehmode%
-    \begin{mplibcode}
+    \begin{mplibcode}%
       nbcouches=#2;
       nblignes:=#3;
-      
+      %
       input PfCSolid;
-
+      %
       boolean TroisCouleur;
       TroisCouleur=\useKV[VueCubes]{TroisCouleur};
-      
+      %
       intensite:=1.5;
-      
+      %
       Ferme[0]:=false;
       outcolor:=\useKV[VueCubes]{CouleurCube};%
       incolor:=white;
       nb:=1;subh:=1;
       creux:=true;
-
+      %
       Phi := \useKV[VueCubes]{Angle};
+      Theta := \useKV[VueCubes]{Theta};
       Echelle:=\useKV[VueCubes]{Echelle};
       EclateX:=\useKV[VueCubes]{EclateX};
       EclateY:=\useKV[VueCubes]{EclateY};
       EclateZ:=\useKV[VueCubes]{EclateZ};
-
+      %
       string LesSymboles[];
       string LesLignes[][];
-
+      %
       TotalObj:=0;
-
+      %
       vardef CreationSolide(text t)=
-      n:=0;
-      for p_=t:
-      n:=n+1;
-      LesSymboles[n]=p_;
-      endfor;
-      for l=nbcouches downto 1:
-      for k=nblignes downto 1:
-      LesLignes[l][k]=LesSymboles[(nbcouches-l)*nblignes+(nblignes-k+1)];
-      endfor;
-      endfor;
-      for l=nbcouches downto 1:
-      for k=nblignes downto 1:
-      for m=0 upto (length(LesLignes[l][k])-1):
-      if (substring((m,m+1)) of LesLignes[l][k])="x":
-      TotalObj:=incr TotalObj;
-      TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ);
-      ObjetDeplacement[TotalObj](0);
-      fi;
-      endfor;
-      endfor;
-      endfor;
+        n:=0;
+        for pk=t:
+          n:=n+1;
+          LesSymboles[n]=pk;
+        endfor;
+        for l=nbcouches downto 1:
+          for k=nblignes downto 1:
+            LesLignes[l][k]=LesSymboles[(nbcouches-l)*nblignes+(nblignes-k+1)];
+          endfor;
+        endfor;
+        for l=nbcouches downto 1:
+          for k=nblignes downto 1:
+            for m=0 upto (length(LesLignes[l][k])-1):
+              if (substring((m,m+1)) of LesLignes[l][k])="x":
+                TotalObj:=incr TotalObj;
+                TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ);
+                ObjetDeplacement[TotalObj](0);
+              fi;
+            endfor;
+          endfor;
+        endfor;
       enddef;
-
-      Initialisation(2500,Phi,20,50);
-      Objetcube0("a="&decimal(Echelle));
-
+      %
+      Initialisation(2500,Phi,Theta,50);
+      Objetcube0("a=Echelle");%&decimal(Echelle));
+      %
       CreationSolide(#1);
       nbobj:=TotalObj;
       if TroisCouleur:
-      color retienscoul[];
-      n:=0;
-      for p_=#4:
-      n:=n+1;
-      retienscoul[n]=p_;
-      endfor;
-      coulfaceX:=retienscoul[1];
-      coulfaceY:=retienscoul[2];
-      coulfaceZ:=retienscoul[3];
-      DessineFusionTroisCouleurs;
+        color retienscoul[];
+        n:=0;
+        for pk=#4:
+          n:=n+1;
+          retienscoul[n]=pk;
+        endfor;
+        coulfaceX:=retienscoul[1];
+        coulfaceY:=retienscoul[2];
+        coulfaceZ:=retienscoul[3];
+        DessineFusionTroisCouleurs;
       else:
-      DessineFusion;
+        DessineFusion;
       fi;
     \end{mplibcode}%
   \fi%
@@ -137,8 +138,8 @@
 }%
 
 \NewDocumentCommand\BuildVueCubes{m m m m}{%
-  \ifluatex
-  \mplibforcehmode
+  \ifluatex%
+  \mplibforcehmode%
   \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}%
   \begin{mplibcode}[\PfCVueCubeNom]
     string NomRetenu;
@@ -161,8 +162,12 @@
     Largeur:=\useKV[VueCubes]{Largeur};
     Hauteur:=\useKV[VueCubes]{Hauteur};
     Phi:=#1;
+    Theta:=\useKV[VueCubes]{Theta};
     Echelle:=\useKV[VueCubes]{Echelle};
-
+    EclateX:=\useKV[VueCubes]{EclateX};
+    EclateY:=\useKV[VueCubes]{EclateY};
+    EclateZ:=\useKV[VueCubes]{EclateZ};
+    
     color CouleurFleche;
     CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
     
@@ -182,7 +187,8 @@
     hauteurtour[m+1][k+1]:=p_;
     for l=1 upto hauteurtour[m+1][k+1]:
     TotalObj:=incr TotalObj;
-    TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2);
+    % TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2);
+    TR:=(Echelle*(Largeur-k)+Echelle*(Largeur-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(Hauteur-l)*EclateZ);
     ObjetDeplacement[TotalObj](0);
     endfor;
     PfCnbcubes:=incr PfCnbcubes;
@@ -189,7 +195,7 @@
     endfor;
     enddef;
 
-    Initialisation(2500,Phi,20,50);
+    Initialisation(2500,Phi,Theta,50);
     Objetcube0("a="&decimal(Echelle));
     
     if Creation:
@@ -295,10 +301,10 @@
     draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]);
     endfor;
     fi;
-  \end{mplibcode}
+  \end{mplibcode}%
   \ifboolKV[VueCubes]{Seul}{}{%
   \ifboolKV[VueCubes]{Grilles}{}{%
-%    \hspace*{1.5cm}
+    \useKV[VueCubes]{Ecart}%
     \begin{mplibcode}[\PfCVueCubeNom]
       input PfCSolid;
 
@@ -366,10 +372,10 @@
       else:
       DessineFusion;
       fi;      
-    \end{mplibcode}
+    \end{mplibcode}%
   }%
   }%
-  \fi
+  \fi%
 }%
 
 \NewDocumentCommand\BuildVueCubesSolution{}{%
@@ -495,9 +501,9 @@
 }%
 
 \NewDocumentCommand\BuildMPEmpilementPersoColore{mmmm}{%
-  \ifluatex
-    \mplibforcehmode
-    \begin{mplibcode}
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
       nbcouches=#2;
       nblignes:=#3;
       %
@@ -588,8 +594,88 @@
         label.lft(TEX("E"),Projette(Echelle*((nblignes-1)/2,-3.5,((nbcouches+1)/2))));     
       fi;
       
-      if Codes:
-        \useKV[VueCubes]{Traces};
+      \ifemptyKV[VueCubes]{Traces}{}{\useKV[VueCubes]{Traces}};
+%      if Codes:
+%        \useKV[VueCubes]{Traces};
+%      fi;
+    \end{mplibcode}%
+  \fi%
+}%
+
+\NewDocumentCommand\VueCubesSimple{mmmm}{%
+  \ifluatex%
+    \mplibforcehmode%
+    \begin{mplibcode}%
+      nbcouches=#2;
+      nblignes:=#3;
+      %
+      input PfCSolid;
+      %
+      boolean TroisCouleur;
+      TroisCouleur=\useKV[VueCubes]{TroisCouleur};
+      %
+      intensite:=1.5;
+      %
+      Ferme[0]:=false;
+      outcolor:=\useKV[VueCubes]{CouleurCube};%
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      %
+      Phi := \useKV[VueCubes]{Angle};
+      Theta := \useKV[VueCubes]{Theta};
+      Echelle:=\useKV[VueCubes]{Echelle};
+      EclateX:=\useKV[VueCubes]{EclateX};
+      EclateY:=\useKV[VueCubes]{EclateY};
+      EclateZ:=\useKV[VueCubes]{EclateZ};
+      %
+      string LesSymboles[];
+      string LesLignes[][];
+      %
+      TotalObj:=0;
+      %
+      vardef CreationSolide(text t)=
+        n:=0;
+        for pk=t:
+          n:=n+1;
+          LesSymboles[n]=pk;
+        endfor;
+        for l=nbcouches downto 1:
+          for k=nblignes downto 1:
+            LesLignes[l][k]=LesSymboles[(nbcouches-l)*nblignes+(nblignes-k+1)];
+          endfor;
+        endfor;
+        for l=nbcouches downto 1:
+          for k=nblignes downto 1:
+            for m=0 upto (length(LesLignes[l][k])-1):
+              if (substring((m,m+1)) of LesLignes[l][k])="x":
+                TotalObj:=incr TotalObj;
+                TR:=(Echelle*(nblignes-k)+Echelle*(nblignes-k)*EclateX,Echelle*(m+m*EclateY),Echelle*l-Echelle*(nbcouches-l)*EclateZ);
+                ObjetDeplacement[TotalObj](0);
+              fi;
+            endfor;
+          endfor;
+        endfor;
+      enddef;
+      %
+      Initialisation(2500,Phi,Theta,50);
+      Objetcube0("a=Echelle");%&decimal(Echelle));
+      %
+      CreationSolide(#1);
+      nbobj:=TotalObj;
+      if TroisCouleur:
+        color retienscoul[];
+        n:=0;
+        for pk=#4:
+          n:=n+1;
+          retienscoul[n]=pk;
+        endfor;
+        coulfaceX:=retienscoul[1];
+        coulfaceY:=retienscoul[2];
+        coulfaceZ:=retienscoul[3];
+        DessineFusionTroisCouleurs;
+      else:
+        DessineFusion;
       fi;
     \end{mplibcode}%
   \fi%

Modified: trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2025-08-27 20:12:29 UTC (rev 76162)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2025-08-27 20:13:06 UTC (rev 76163)
@@ -2,9 +2,9 @@
 % licence    : Released under the LaTeX Project Public License v1.3c
 % or later, see http://www.latex-project.org/lppl.txtf
 \NeedsTeXFormat{LaTeX2e}%
-\def\filedate{2025/06/12}%
+\def\filedate{2025/08/26}%
 \let\PfCfiledate\filedate%
-\def\fileversion{0.99-A-l}%
+\def\fileversion{0.99-A-m}%
 \let\PfCfileversion\fileversion%
 \ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college]%
 
@@ -948,6 +948,11 @@
 
 \def\PfCieme{\up{e}\xspace}%from french.ldf
 
+\input{PfCBoiteADix}
+\input{PfCMonnaieEuro}
+\input{PfCMulEthiopie}
+\input{PfCIteration}
+\input{PfCSystemeImage}
 \input{PfCPanneauxRoutiers}
 \input{PfCAireSimple}
 \input{PfCDecompFrac}
@@ -1100,7 +1105,22 @@
 % \newcommand\Puissances[2]{%
 \NewDocumentCommand\Puissances{mm}{%
   \ensuremath{%
-    \xintifboolexpr{#2==0}{1}{\xintifboolexpr{#2>0}{\xdef\TotalP{\fpeval{#2-1}}#1\xintFor* ##1 in{\xintSeq{1}{\TotalP}}\do{\times#1}}{\xdef\TotalP{\fpeval{-#2-1}}\frac{1}{#1\xintFor* ##1 in{\xintSeq{1}{\TotalP}}\do{\times#1}}}}%
+    % \xintifboolexpr{#2==0}{1}{\xintifboolexpr{#2>0}{\ifnum#2=1\relax#1\else\xdef\TotalP{\fpeval{#2-1}}#1\xintFor* ##1 in{\xintSeq{1}{\TotalP}}\do{\times#1}\fi}{\xdef\TotalP{\fpeval{-#2-1}}\frac{1}{#1\xintFor* ##1 in{\xintSeq{1}{\TotalP}}\do{\times#1}}}}%
+    \ifnum#2=0\relax%
+      1%
+    \else%
+      \ifnum#2>0\relax%
+        \xintFor* ##1 in{\xintSeq{1}{#2}}\do{%
+          #1\xintifForLast{}{\times}%
+        }%
+      \else%
+        \frac{1}{%
+          \xintFor* ##1 in{\xintSeq{1}{\fpeval{abs(#2)}}}\do{%
+            #1\xintifForLast{}{\times}%
+          }%
+        }%
+      \fi%
+    \fi%
   }%
 }%
 



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