texlive[64918] Master/texmf-dist: profcollege (3nov22)

commits+karl at tug.org commits+karl at tug.org
Thu Nov 3 21:07:39 CET 2022


Revision: 64918
          http://tug.org/svn/texlive?view=revision&revision=64918
Author:   karl
Date:     2022-11-03 21:07:39 +0100 (Thu, 03 Nov 2022)
Log Message:
-----------
profcollege (3nov22)

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/PfCPseudo.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp
    trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
    trunk/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp

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)

Added: trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -0,0 +1,2085 @@
+%01/08/2011
+%Ajout de l'option trait dans le trac\xE9 des surfaces.
+
+%24/01/2011
+%Gestion des couleurs dans l'objet Deplacement.
+
+%27/11/2010
+%Manque plusieurs : dans la d\xE9finition de ObjetNew
+
+%07/02/2009
+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 Outcolor[],Incolor[];%Permet de g\xE9rer la gestion des couleurs d'un objet lors d'un d\xE9placement de cet objet
+boolean Vue[][];
+
+boolean creux;  creux=false;%pour g\xE9rer les solides creux
+boolean transformation; transformation=false;%pour g\xE9rer les transformations
+boolean Ferme[];%pour g\xE9rer les faces : si le solide est ferm\xE9, toutes les faces non vues ne sont pas int\xE9gr\xE9es aux calculs
+boolean perso[];%pour g\xE9rer les gestions personnelles des couleurs
+for k=0 upto 100:
+  perso[k]=false;
+endfor;
+boolean numeroteface;
+numeroteface:=false;
+
+string couleurperso;
+
+defaultfont:="cmr5";
+
+vardef Image(expr dep)=
+  if transformation:
+    Transform(dep)
+  else:
+    RotXYZ(dep)
+  fi
+  +TR
+enddef;
+
+boolean Transparence;
+Transparence:=false;
+boolean couleurz;%pour g\xE9rer l'affichage "des lignes" de niveaux
+couleurz:=false;
+
+vardef AffichageObjet[]=
+  save _affi;
+  picture _affi;
+  color Fc[][];color cou[];
+  tapj:=0;
+  for k=0 upto apj.@:
+    cpt[tapj]:=tapj;
+    Fc[tapj].nb:=OTFc.@[k].nb;
+    for l=1 upto Fc[tapj].nb:
+      Fc[tapj][l]:=OTFc.@[k][l];
+    endfor;
+    Fc[tapj].iso:=OTFc.@[k].iso;
+    cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
+    ALT[tapj]:=ALT.@[k];
+    Vue[tapj]:=Vue.@[k];
+    tapj:=tapj+1;
+  endfor;
+  tapj:=tapj-1;
+  QS(0,tapj);
+  if Transparence :
+    for k=0 upto tapj:
+      if Vue[cpt[k]]=false:
+	fill for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor abs(lumin(cpt[k]))*cou[cpt[k]];
+	if traits=true:
+	  draw for l=1 upto Fc[cpt[k]].nb:
+	    Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle dashed evenly withpen pencircle scaled0.25bp;
+	fi;
+      fi;
+    endfor;
+    for k=0 upto tapj:
+      if Vue[cpt[k]]:
+	transparence for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle;
+	if traits=true:
+	  draw for l=1 upto Fc[cpt[k]].nb:
+	    Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle withpen pencircle scaled0.25bp;
+	fi;
+      fi;
+    endfor;
+  else:
+    if Ferme.@:
+      for k=0 upto tapj:
+	if Vue[cpt[k]]=true:
+	  fill for l=1 upto Fc[cpt[k]].nb:
+	    Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle withcolor
+	    if couleurz:
+	    if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+	    else:
+	      ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+	    fi
+	  elseif arcenciel=true:
+	    lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	  else:
+	    lumin(cpt[k])*cou[cpt[k]]
+	  fi;
+	  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 01/08/11
+	  else:
+	    draw for l=1 upto Fc[cpt[k]].nb:
+	      Projette(Fc[cpt[k]][l])--
+	    endfor
+	    cycle withcolor
+	      if couleurz:
+	    if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+	    else:
+	      ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+	    fi
+	  elseif arcenciel=true:
+	      lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	    else:
+	      lumin(cpt[k])*cou[cpt[k]]
+	    fi;
+	    %fin add
+	  fi;
+	fi;
+      endfor;
+    else:
+      for k=0 upto tapj:%apj downto 1:
+	fill for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor if Vue[cpt[k]]:
+	   if couleurz:
+	    if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+	    else:
+	      ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+	    fi
+	  elseif arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	  else:lumin(cpt[k])*cou[cpt[k]] fi
+	else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+	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 01/08/2011
+	else:
+	  draw for l=1 upto Fc[cpt[k]].nb:
+	      Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle withcolor if Vue[cpt[k]]:
+	      if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	    else:lumin(cpt[k])*cou[cpt[k]] fi
+	  else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+	  %fin add
+	fi;
+      endfor;
+    fi;
+  fi;
+  if numeroteface=true:
+    for k=0 upto tapj:
+      if Vue[k]:
+	label(""&decimal(k)&"",Projette(Fc[k].iso));
+      fi;
+    endfor;
+  fi;
+enddef;
+
+
+vardef AffichageObjetold[]=
+  save _affi;
+  picture _affi;
+  color Fc[][];color cou[];
+  tapj:=0;
+  for k=0 upto apj.@:
+    cpt[tapj]:=tapj;
+    Fc[tapj].nb:=OTFc.@[k].nb;
+    for l=1 upto Fc[tapj].nb:
+      Fc[tapj][l]:=OTFc.@[k][l];
+    endfor;
+    Fc[tapj].iso:=OTFc.@[k].iso;
+    cou[tapj]:=if perso.@:scantokens(couleurperso) else: coul.@[k] fi;
+    ALT[tapj]:=ALT.@[k];
+    Vue[tapj]:=Vue.@[k];
+    tapj:=tapj+1;
+  endfor;
+  tapj:=tapj-1;
+  QS(0,tapj);
+  if Ferme.@:
+    for k=0 upto tapj:
+      if Vue[cpt[k]]=true:
+	fill for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor
+	if arcenciel=true:
+	  lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	else:
+	  lumin(cpt[k])*cou[cpt[k]]
+	fi;
+	draw for l=1 upto Fc[cpt[k]].nb:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withpen pencircle scaled0.25bp;
+      fi;
+    endfor;
+  else:
+    for k=0 upto tapj:%apj downto 1:
+      fill for l=1 upto Fc[cpt[k]].nb:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor if Vue[cpt[k]]:
+	if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	else:lumin(cpt[k])*cou[cpt[k]] fi
+      else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+      draw for l=1 upto Fc[cpt[k]].nb:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withpen pencircle scaled0.25bp;
+    endfor;
+  fi;
+  if numeroteface=true:
+    for k=0 upto tapj:
+      if Vue[k]:
+	label(""&decimal(k)&"",Projette(Fc[k].iso));
+      fi;
+    endfor;
+  fi;
+enddef;
+
+vardef DessineFusion=
+  save _fusion;
+  picture _fusion;
+  tapj:=0;
+  color Fc[][];color cou[];
+  for l=1 upto nbobj:
+    for k=0 upto apj[l]:
+      cpt[tapj]:=tapj;
+      cou[tapj]:=if perso[l]:scantokens(couleurperso) else: coul[l][k] fi;
+      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;
+      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 if Vue[cpt[k]]:
+      if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+      else:lumin(cpt[k])*cou[cpt[k]] fi
+    else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+    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 if Vue[cpt[k]]:
+	      if arcenciel: lumin(cpt[k])*Hsvtorgb(((cpt[k]/tapj)*360,satu,lum))
+	    else:lumin(cpt[k])*cou[cpt[k]] fi
+	  else: abs(lumin(cpt[k]))*cou[cpt[k]] fi;
+	  %fin add
+    fi;
+  endfor;
+enddef;
+
+vardef Objettore[](expr Rn,rn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux:
+    Ferme.@:=false
+  else:
+    Ferme.@:=true;
+  fi;
+  scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+  scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+  vardef Famille(expr u,v)=((R+r*cos(u))*cos(v),(R+r*cos(u))*sin(v),r*sin(u)) enddef;
+  umin:=-pi; umax:=pi; upas:=2*pi/nb;
+  vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+  apj:=0;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetTube[](expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,param\xE8tre d\xE9part,nb points, pas
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("vardef F(expr t)="&Fn&" enddef;");
+  scantokens("vardef Fp(expr t)="&dp&" enddef;");
+  color G[][];
+  NB:=nbp;%nb de pas
+  nn:=pas;
+  %pour g\xE9rer le "flip" aux points d'inflexion
+  color VNbisprec[];
+  VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
+  %
+  ang:=360/nb;
+  for l=0 upto NB:
+    for k=0 upto nb:
+      G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
+    endfor;
+  endfor;
+  apj:=0;
+  if creux=false:
+    Ferme.@:=true;
+    nbsp:=nb;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsp;
+    for k=1 upto nbsp:
+      OTFc.@[apj][k]:=Image(G[0][nbsp+1-k]);
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsp;
+    for k=nbsp downto 1:
+      OTFc.@[apj][k]:=Image(G[NB][k]);
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  for l=0 upto (NB-1):
+    for k=0 upto nb-1:
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(G[l][k]);
+      OTFc.@[apj][2]:=Image(G[l][k+1]);
+      OTFc.@[apj][3]:=Image(G[l+1][k+1]);
+      OTFc.@[apj][4]:=Image(G[l+1][k]);
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef ObjetCylindre[](expr fn,umin,umax,vmin,vmax)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
+  apj:=0;
+  upas:=(umax-umin)/nb;vpas:=(vmax-vmin)/subh;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  %for k=umin step upas until umax:
+  %  for l=vmin step vpas until vmax:
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef Objetcylindre[](expr rn,hn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  vardef Famille(expr u,v)=(r*cos(u),r*sin(u),v) enddef;
+  umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+  vmin:=0; vmax:=h; vpas:=h/subh;
+  nbsp:=nb;
+  apj:=0;
+  if creux=false:
+    Ferme.@:=true;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsp;
+    for k=1 upto nb:
+      OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsp;
+    for k=1 upto nbsp:
+      OTFc.@[apj][k]:=Image(Famille(umin+(nbsp-k)*upas,vmax));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image((Famille(umin+k*upas,vmin+l*vpas)));
+      OTFc.@[apj][3]:=Image((Famille(umin+k*upas,vmin+(l+1)*vpas)));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef ObjetCone[](expr fn,umin,umax,zbas,orign)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("vardef Famille(expr u)="&fn&" enddef;");
+  scantokens("color "&substring(0,4) of orign&"; "&orign&";");
+  apj:=0;
+  upas:=(umax-umin)/nb;vpas:=2*abs(zbas)/subh;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (2*subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas)+(l/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
+      OTFc.@[apj][4]:=Image(Famille(umin+k*upas)+(l/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas)+((l+1)/subh)[Famille(umin+k*upas),orig]-Famille(umin+k*upas));
+      OTFc.@[apj][2]:=Image(Famille(umin+(k+1)*upas)+((l+1)/subh)[Famille(umin+(k+1)*upas),orig]-Famille(umin+(k+1)*upas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+subh:=12;
+
+vardef Objetcone[](expr rn,hn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  vardef Famille(expr u,v)=(r*(1-(v/h))*cos(u),r*(1-(v/h))*sin(u),v) enddef;
+  umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+  vmin:=0; vpas:=h/subh; vmax:=h-vpas;
+  apj:=0;
+  Zmin:=0;
+  Zmax:=h;
+  if creux=false:
+    Ferme.@:=true;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nb;
+    for k=0 upto nb:
+      OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+    apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objettronccone[](expr rn,hn,Hn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  scantokens("numeric "&substring(0,1) of Hn&"; "&Hn&";");
+  vardef Famille(expr u,v)=(r*(1-v/H)*cos(u),r*(1-v/H)*sin(u),v) enddef;
+  umin:=pi; umax:=-pi; upas:=-2*pi/nb;
+  vmin:=0; vpas:=h/subh; vmax:=h;
+  apj:=0;
+  if creux=false:
+    Ferme.@:=true;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nb;
+    for k=0 upto nb:
+      OTFc.@[apj][k]:=Image(Famille(umin+k*upas,vmin));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+    apj:=apj+1;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nb;
+    for k=0 upto nb:
+      OTFc.@[apj][nb-k]:=Image(Famille(umin+k*upas,vmax));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nb:+OTFc.@[apj][k] endfor)/nb;
+        apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):%umin step upas until umax-upas:
+    for l=0 upto (subh-1):
+       tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objetsphere[](expr Rn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+  vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
+  umin:=-pi/2; umax:=pi/2; upas:=pi/nb;
+  vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+  apj:=0;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef Objetcalotte[](expr Rn,Phib,Phih)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+  scantokens("numeric "&substring(0,4) of Phib&"; "&Phib&";");
+  scantokens("numeric "&substring(0,4) of Phih&"; "&Phih&";");
+  vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef;
+  umin:=phib; umax:=phih; upas:=(phih-phib)/nb;
+  vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+  apj:=0;
+  nbsp:=subh;
+  if creux=false:
+    Ferme.@:=true;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsp;
+    for l=1 upto nbsp:
+      OTFc.@[apj][l]:=Image(Famille(umin,vmax-l*vpas));
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=subh;
+    for l=1 upto nbsp:
+      OTFc.@[apj][l]:=Image(Famille(umax,vmin+l*vpas));
+     endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsp:+OTFc.@[apj][k] endfor)/nbsp;
+    apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  %for k=umin step upas until umax-upas:
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objetanneau[](expr Rn,rn,hn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux:Ferme.@:=false else:Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of Rn&"; "&Rn&";");
+  scantokens("numeric "&substring(0,1) of rn&"; "&rn&";");
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  path sectionanneau;
+  sectionanneau=(R,0)--(R,h)--(r,h)--(r,0)--cycle;
+  vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef;
+  umin:=0; umax:=4; upas:=4/nb;
+  vmin:=-pi; vpas:=2*pi/subh; vmax:=2*pi;
+  apj:=0;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetAnneau[](expr nbpn,sectionanneau)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,3) of nbpn&"; "&nbpn&";");
+  vardef Famille(expr u,v)=((xpart(point(u) of sectionanneau)*cos(v),xpart(point(u) of sectionanneau)*sin(v),ypart(point(u) of sectionanneau))) enddef;
+  umin:=0; umax:=nbp; upas:=1;
+  vmin:=-pi; vpas:=2*pi/subh; vmax:=pi;
+  apj:=0;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=0 upto (nbp-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Famille(umin+(k+1)*upas,vmin+l*vpas));
+      OTFc.@[apj][2]:=Image(Famille(umin+k*upas,vmin+l*vpas));
+      OTFc.@[apj][3]:=Image(Famille(umin+k*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image(Famille(umin+(k+1)*upas,vmin+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetPrisme[](expr axen,hn)(text tn)=%pb avec certaines positions de l'observateur.->maillage vertical
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  scantokens("color "&substring(0,3) of axen&"; "&axen&";");
+  nbsn:=0;%nb sommets total pour la base
+  for _p=tn:
+    Sommet[nbsn]:=_p;
+    nbsn:=nbsn+1;
+  endfor;
+  apj:=0;
+  if creux=false:
+    Ferme.@:=true;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsn;
+    for k=1 upto nbsn:
+      OTFc.@[apj][k]:=Image(Sommet[nbsn-k]);
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+    apj:=apj+1;
+    tcpt.@[apj]:=apj;
+    OTFc.@[apj].nb:=nbsn;
+    for k=1 upto nbsn:
+      OTFc.@[apj][k]:=Image(Sommet[k-1]+h*axe);
+    endfor;
+    OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+    apj:=apj+1;
+  else:
+    Ferme.@:=false;
+  fi;
+  for k=1 upto nbsn:
+    for l=0 upto (subh-1):
+      for p=0 upto (nb-1):
+	tcpt.@[apj]:=apj;
+	OTFc.@[apj].nb:=4;
+	OTFc.@[apj][1]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
+	OTFc.@[apj][2]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+(l/subh)*(h*axe));
+	OTFc.@[apj][3]:=Image(((p+1)/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
+	OTFc.@[apj][4]:=Image((p/nb)[Sommet[(k-1) mod nbsn],Sommet[k mod nbsn]]+((l+1)/subh)*(h*axe));
+	OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+	apj:=apj+1;
+      endfor;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objetcube[](expr ar)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+  Sommet1:=(a/2,-a/2,-a/2);
+  Sommet2:=(a/2,a/2,-a/2);
+  Sommet3:=(-a/2,a/2,-a/2);
+  Sommet4:=(-a/2,-a/2,-a/2);
+  Sommet5:=(-a/2,-a/2,a/2);
+  Sommet6:=(a/2,-a/2,a/2);
+  Sommet7:=(a/2,a/2,a/2);
+  Sommet8:=(-a/2,a/2,a/2);
+%%Faces
+  apj:=0;
+  for p=1 upto 4:
+    for l=0 upto (subh-1):
+      for k=0 upto (subh-1):
+	OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+	apj:=apj+1;
+      endfor;
+    endfor;
+  endfor;
+  %face du dessous
+  for l=0 upto (subh-1):
+    for k=0 upto (subh-1):
+      OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  %face du dessus
+  for l=0 upto (subh-1):
+    for k=0 upto (subh-1):
+      OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    OTFc.@[k].nb:=4;
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objetpave[](expr Lln,Hhn,Ppn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true: Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of Lln&"; "&Lln&";");
+  scantokens("numeric "&substring(0,1) of Hhn&"; "&Hhn&";");
+  scantokens("numeric "&substring(0,1) of Ppn&"; "&Ppn&";");
+  NbS:=8;
+  Sommet1:=(P/2,-L/2,-H/2);
+  Sommet2:=(P/2,L/2,-H/2);
+  Sommet3:=(-P/2,L/2,-H/2);
+  Sommet4:=(-P/2,-L/2,-H/2);
+  Sommet5:=(-P/2,-L/2,H/2);
+  Sommet6:=(P/2,-L/2,H/2);
+  Sommet7:=(P/2,L/2,H/2);
+  Sommet8:=(-P/2,L/2,H/2);
+%%Faces
+  apj:=0;
+  for p=1 upto 4:
+    for l=0 upto (subh-1):
+      for k=0 upto (subh-1):
+	OTFc.@[apj][1]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+(k/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj][4]:=Image((l/subh)[Sommet[p],Sommet[(p mod 4)+1]]+((k+1)/subh)*(Sommet[(p mod 4)+5]-Sommet[p]));
+	OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+	apj:=apj+1;
+      endfor;
+    endfor;
+  endfor;
+  %face du dessous
+  for l=0 upto (subh-1):
+    for k=0 upto (subh-1):
+      OTFc.@[apj][1]:=Image((l/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet1,Sommet4]+(k/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj][4]:=Image((l/subh)[Sommet1,Sommet4]+((k+1)/subh)*(Sommet2-Sommet1));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  %face du dessus
+  for l=0 upto (subh-1):
+    for k=0 upto (subh-1):
+      OTFc.@[apj][1]:=Image((l/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][2]:=Image(((l+1)/subh)[Sommet6,Sommet7]+(k/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][3]:=Image(((l+1)/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj][4]:=Image((l/subh)[Sommet6,Sommet7]+((k+1)/subh)*(Sommet5-Sommet6));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    OTFc.@[k].nb:=4;
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef Objetgrille[](expr amn,ann,bmn,bnn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  Ferme.@:=false;
+  scantokens("numeric "&substring(0,2) of amn&"; "&amn&";");
+  scantokens("numeric "&substring(0,2) of ann&"; "&ann&";");
+  scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";");
+  scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";");
+  apj:=0;
+  upas:=(an-am)/nb;
+  vpas:=(bn-bm)/subh;
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image((am+k*upas,bm+l*vpas,0));
+      OTFc.@[apj][2]:=Image((am+(k+1)*upas,bm+l*vpas,0));
+      OTFc.@[apj][3]:=Image((am+(k+1)*upas,bm+(l+1)*vpas,0));
+      OTFc.@[apj][4]:=Image((am+k*upas,bm+(l+1)*vpas,0));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetgrilleYZ[](expr amn,ann,bmn,bnn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  Ferme.@:=false;
+  scantokens("numeric "&substring(0,2) of amn&"; "&amn&";");
+  scantokens("numeric "&substring(0,2) of ann&"; "&ann&";");
+  scantokens("numeric "&substring(0,2) of bmn&"; "&bmn&";");
+  scantokens("numeric "&substring(0,2) of bnn&"; "&bnn&";");
+  apj:=0;
+  upas:=(an-am)/nb;
+  vpas:=(bn-bm)/subh;
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image((0,am+k*upas,bm+l*vpas));
+      OTFc.@[apj][2]:=Image((0,am+(k+1)*upas,bm+l*vpas));
+      OTFc.@[apj][3]:=Image((0,am+(k+1)*upas,bm+(l+1)*vpas));
+      OTFc.@[apj][4]:=Image((0,am+k*upas,bm+(l+1)*vpas));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetRuban[](expr hn)(text tn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("numeric "&substring(0,1) of hn&"; "&hn&";");
+  nbsn:=0;%nb sommets total pour la base
+  for _p=tn:
+    Sommet[nbsn]:=_p;
+    nbsn:=nbsn+1;
+  endfor;
+  Ferme.@:=false;
+  apj:=0;
+  for k=1 upto (nbsn-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image(Sommet[k-1]+(l/subh)*(h*(0,0,1)));
+      OTFc.@[apj][2]:=Image(Sommet[k]+(l/subh)*(h*(0,0,1)));
+      OTFc.@[apj][3]:=Image(Sommet[k]+((l+1)/subh)*(h*(0,0,1)));
+      OTFc.@[apj][4]:=Image(Sommet[k-1]+((l+1)/subh)*(h*(0,0,1)));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+vardef ObjetBiface[](text tn)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  nbsn:=0;%nb sommets total pour la base
+  for _p=tn:
+    nbsn:=nbsn+1;
+    Sommet[nbsn]:=_p;
+  endfor;
+  %Ferme.@:=true;
+  apj:=0;
+  tcpt.@[apj]:=apj;
+  OTFc.@[apj].nb:=nbsn;
+  for k=1 upto nbsn:
+    OTFc.@[apj][k]:=Image(Sommet[nbsn+1-k]);
+  endfor;
+  OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+  apj:=apj+1;
+  tcpt.@[apj]:=apj;
+  OTFc.@[apj].nb:=nbsn;
+  for k=1 upto nbsn:
+    OTFc.@[apj][k]:=Image(Sommet[k]);
+  endfor;
+  OTFc.@[apj].iso:=(OTFc.@[apj][1] for k=2 upto nbsn:+OTFc.@[apj][k] endfor)/nbsn;
+  for k=0 upto apj:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+lambda:=3;
+mu:=2;
+
+vardef Objetplan[](expr Ann,Bnn,Cnn)=%\xE0 modifier mais pour l'instant \xE7a marche pour les intersections;
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  Ferme.@:=false;
+  color PPP[];
+  scantokens("color "&substring(0,2) of Ann&"; "&Ann&";");
+  scantokens("color "&substring(0,2) of Bnn&"; "&Bnn&";");
+  scantokens("color "&substring(0,2) of Cnn&"; "&Cnn&";");
+  apj:=0;
+  PPP[0]=Image(An-lambda*(Bn-An)-mu*(Cn-An));
+  PPP[1]=Image(An+lambda*(Bn-An)-mu*(Cn-An));
+  PPP[2]=Image(An+lambda*(Bn-An)+mu*(Cn-An));
+  PPP[3]=Image(An-lambda*(Bn-An)+mu*(Cn-An));
+  for k=0 upto (nb-1):
+    for l=0 upto (subh-1):
+      tcpt.@[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Image((k/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
+      OTFc.@[apj][2]:=Image(((k+1)/subh)[PPP0,PPP1]+(l/subh)*(PPP3-PPP0));
+      OTFc.@[apj][3]:=Image(((k+1)/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
+      OTFc.@[apj][4]:=Image((k/subh)[PPP0,PPP1]+((l+1)/subh)*(PPP3-PPP0));
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef Objettetraedre[](expr ar)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+  Sommet0:=a*(-0.81650,-0.47140,-1/3);
+  Sommet1:=a*(0.81650,-0.471402,-1/3);
+  Sommet2:=a*(0,0.94281,-1/3);
+  Sommet3:=a*(0,0,1);
+  tcpt.@[0]:=0;
+  OTFc.@[0].nb:=3;
+  OTFc.@[0][1]:=Image(Sommet0);
+  OTFc.@[0][2]:=Image(Sommet2);
+  OTFc.@[0][3]:=Image(Sommet1);
+  OTFc.@[0].iso:=(OTFc.@[0][1]+OTFc.@[0][2]+OTFc.@[0][3])/3;
+  tcpt.@[1]:=1;
+  OTFc.@[1].nb:=3;
+  OTFc.@[1][1]:=Image(Sommet0);
+  OTFc.@[1][2]:=Image(Sommet1);
+  OTFc.@[1][3]:=Image(Sommet3);
+  OTFc.@[1].iso:=(OTFc.@[1][1]+OTFc.@[1][2]+OTFc.@[1][3])/3;
+  tcpt.@[2]:=2;
+  OTFc.@[2].nb:=3;
+  OTFc.@[2][1]:=Image(Sommet1);
+  OTFc.@[2][2]:=Image(Sommet2);
+  OTFc.@[2][3]:=Image(Sommet3);
+  OTFc.@[2].iso:=(OTFc.@[2][1]+OTFc.@[2][2]+OTFc.@[2][3])/3;
+  tcpt.@[3]:=3;
+  OTFc.@[3].nb:=3;
+  OTFc.@[3][1]:=Image(Sommet2);
+  OTFc.@[3][2]:=Image(Sommet0);
+  OTFc.@[3][3]:=Image(Sommet3);
+  OTFc.@[3].iso:=(OTFc.@[3][1]+OTFc.@[3][2]+OTFc.@[3][3])/3;
+  for k=0 upto 3:
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=3;
+enddef;
+
+vardef Objetoctaedre[](expr ar)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+  AA=a*sqrt(2)/2;
+  ObjetNew.@((0,0,-a),(-AA,-AA,0),(AA,-AA,0),(AA,AA,0),(-AA,AA,0),(0,0,a))(%
+    3,0,2,1,%
+    3,0,3,2,%
+    3,0,4,3,%
+    3,0,1,4,%
+    3,5,1,2,%
+    3,5,2,3,%
+    3,5,3,4,%
+    3,5,4,1%
+    );
+enddef;
+
+vardef Objeticosaedre[](expr ar)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+  aplus=sqrt((5+sqrt(5))/10);
+  amoins=sqrt((5-sqrt(5))/10);
+  bplus=(5+sqrt(5))/10;
+  bmoins=(5-sqrt(5))/10;
+  Cmp=sqrt(5)/5;
+  ObjetNew.@(a*(0,1,0),a*(amoins,Cmp,-bplus),a*(-amoins,Cmp,-bplus),a*(-aplus,Cmp,bmoins),a*(0,Cmp,2*Cmp),a*(aplus,Cmp,bmoins),a*(amoins,-Cmp,bplus),a*(-amoins,-Cmp,bplus),a*(-aplus,-Cmp,-bmoins),a*(0,-Cmp,-2*Cmp),a*(aplus,-Cmp,-bmoins),a*(0,-1,0))(%
+    3,1,5,6,%
+    3,1,4,5,%
+    3,1,3,4,%
+    3,1,2,3,%
+    3,1,6,2,%
+    3,7,6,5,%
+    3,8,5,4,%
+    3,9,4,3,%
+    3,10,3,2,%
+    3,11,2,6,%
+    3,6,7,11,%
+    3,5,8,7,%
+    3,4,9,8,%
+    3,3,10,9,%
+    3,2,11,10,%
+    3,12,10,11,%
+    3,12,9,10,%
+    3,12,8,9,%
+    3,12,7,8,%
+    3,12,11,7);
+enddef;
+
+vardef Objetdodecaedre[](expr ar)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  if creux=true:Ferme.@:=false else: Ferme.@:=true fi;
+  scantokens("numeric "&substring(0,1) of ar&"; "&ar&";");
+  Ap=a*sqrt((5+2*sqrt(5))/15);
+  Bp=a*sqrt((10+2*sqrt(5))/15);
+  Cp=a*sqrt((5+sqrt(5))/30);
+  Dp=a*(sqrt(15)+sqrt(3))/6;
+  Am=a*sqrt((5-2*sqrt(5))/15);
+  Bm=a*sqrt((10-2*sqrt(5))/15);
+  Cm=a*sqrt((5-sqrt(5))/30);
+  Dm=a*(sqrt(15)-sqrt(3))/6;
+  Ee:=a*sqrt(3)/3;
+  ObjetNew.@((0,Ap,-Bm),(-Ee,Ap,-Am),(-Dm,Ap,Cp),(Dm,Ap,Cp),(Ee,Ap,-Am),(0,Am,-Bp),(-Dp,Am,-Cm),(-Ee,Am,Ap),(Ee,Am,Ap),(Dp,Am,-Cm),(0,-Am,Bp),(Dp,-Am,Cm),(Ee,-Am,-Ap),(-Ee,-Am,-Ap),(-Dp,-Am,Cm),(0,-Ap,Bm),(Ee,-Ap,Am),(Dm,-Ap,-Cp),(-Dm,-Ap,-Cp),(-Ee,-Ap,Am))(%
+    5,5,1,2,3,4,%
+    5,1,5,10,13,6,%
+    5,2,1,6,14,7,%
+    5,3,2,7,15,8,%
+    5,4,3,8,11,9,%
+    5,5,4,9,12,10,%
+    5,6,13,18,19,14,%
+    5,7,14,19,20,15,%
+    5,8,15,20,16,11,%
+    5,9,11,16,17,12,%
+    5,10,12,17,18,13,%
+    5,16,20,19,18,17%
+    );
+enddef;
+
+vardef ObjetNew[](text listesommets)(text listefaces)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  color Sommet[];
+  nbs:=0;
+  mini:=min(listefaces);
+  if mini=0:
+    for _p=listesommets:
+      Sommet[nbs]:=_p;
+      nbs:=nbs+1;
+    endfor;
+  elseif mini=1:
+    for _p=listesommets:
+      nbs:=nbs+1;
+      Sommet[nbs]:=_p;
+    endfor;
+  fi;
+  apj:=0;
+  j:=0;%pour compter le nombre de sommets \xE0 conserver
+  for p_=listefaces:
+    if j=0:
+      OTFc.@[apj].nb:=p_;
+      j:=1;
+      k:=0;
+    else:
+      k:=k+1;
+      if k<>OTFc.@[apj].nb:
+	OTFc.@[apj][k]:=Image(Sommet[p_]);
+      else:
+	OTFc.@[apj][k]:=Image(Sommet[p_]);
+	j:=0;
+	apj:=apj+1;
+      fi;
+    fi;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+enddef;
+
+%Objet lecture externe
+
+vardef ObjetOFF[](expr nomfichier)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  OFF:=true;
+  string s_;
+  s_=readfrom nomfichier;
+  string ss[];
+  if s_<>EOF:
+    ss1 := loptok s_;
+    t_ := if ss1="%": 0 else: 1 fi;
+    forever:
+      ss[incr t_] := loptok s_;
+      exitif ss[t_]="";
+    endfor;
+  %else: false
+    show ss1;
+  fi;
+%  NbS:=round(Mexp Mlog_str ss1);
+%  NF:=round(Mexp Mlog_str ss2);
+%  s_:=readfrom nomfichier;
+%  if debut=0:
+%    for k=0 upto NbS-1:
+%      s_:=readfrom nomfichier;
+%      if s_<>EOF:
+%	ss1 := loptok s_;
+%	n_ := if ss1="%": 0 else: 1 fi;
+%	forever:
+%	  ss[incr n_] := loptok s_;
+%	  exitif ss[n_]="";
+%	endfor
+%      else: false
+%      fi;
+%      Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+%     endfor;
+%  else:
+%    for k=1 upto NbS:
+%      s_:=readfrom nomfichier;
+%      if s_<>EOF:
+%	ss1 := loptok s_;
+%	n_ := if ss1="%": 0 else: 1 fi;
+%	forever:
+%	  ss[incr n_] := loptok s_;
+%	  exitif ss[n_]="";
+%	endfor
+%      else: false
+%      fi;
+%      Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+%    endfor;
+%  fi;
+%  apj:=0;
+%  for nf=-4000 upto (-4000+NF)-1:
+%    s_:=readfrom nomfichier;
+%     if s_<>EOF:
+%      ss1 := loptok s_;
+%      n_ := if ss1="%": 0 else: 1 fi;
+%      forever:
+%	ss[incr n_] := loptok s_;
+%	exitif ss[n_]="";
+%      endfor
+%    else: false
+%    fi;
+%    OTFc.@[apj].nb:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
+%    for nl=1 upto OTFc.@[apj].nb:
+%      if invnormale=1:
+%	OTFc.@[apj][nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
+%      else:
+%	OTFc.@[apj][OTFc.@[apj].nb+1-nl]:=Image(Sommet[round(Mexp Mlog_str ss[nl+1])]);
+  %    fi;
+  %  endfor;
+  %  OTFc.@[apj].iso:=(OTFc.@[apj][1] for l=2 upto OTFc.@[apj].nb:+OTFc.@[apj][l] endfor)/OTFc.@[apj].nb;
+  %  ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+  %  if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+  %    Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+  %  else:
+  %    Vue.@[apj]:=false;coul.@[apj]:=incolor;
+  %  fi;
+  %  apj:=apj+1;
+  %endfor;
+  %apj.@:=apj-1;
+  closefrom nomfichier;
+enddef;
+
+vardef ObjetOBJ[](expr nomfichier)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  string s_;
+  string ss[];
+  nbss:=1;
+  apj:=0;
+  forever:
+    s_:=readfrom nomfichier;
+    if s_<>EOF:
+      ss0 := loptok s_;
+      if ss0="v":
+	n_:=0;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor
+	Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+	nbss:=incr nbss;
+      elseif ss0="f":
+	n_:=0;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor;
+	OTFc.@[apj].nb:=n_-1;
+	for k=1 upto OTFc.@[apj].nb:
+	  if invnormale=1:
+	    OTFc.@[apj][OTFc.@[apj].nb-k+1] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
+	    %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
+	  %  show OTFc.@[apj][OTFc.@[apj].nb-k+1];
+	  %fi;
+	  else:
+	    OTFc.@[apj][k] := Image(Sommet[round(Mexp(Mlog_str ss[k]))])
+	    %if unknown OTFc.@[apj][k]:
+	  %  show OTFc.@[apj][k];
+	  %fi;
+	  fi;
+	  
+	endfor;
+	apj:=apj+1;
+      fi;
+    fi;
+    exitif s_=EOF;
+  endfor;
+  apj:=apj-1;
+  for k=0 upto apj:
+    OTFc.@[k].iso:=(OTFc.@[k][1] for l=2 upto OTFc.@[k].nb:+OTFc.@[k][l] endfor)/OTFc.@[k].nb;
+    ALT.@[k]:=-Zpart(GCoord(OTFc.@[k].iso));
+    if ProduitScalaire(Oeil-OTFc.@[k].iso,Normal(OTFc.@[k].iso,OTFc.@[k][1],OTFc.@[k][2]))>=0:
+      Vue.@[k]:=true;coul.@[k]:=outcolor;
+    else:
+      Vue.@[k]:=false;coul.@[k]:=incolor;
+    fi;
+  endfor;
+  apj.@:=apj;
+  closefrom nomfichier;
+enddef;
+
+
+%%%%%%%Objets travaill\xE9s
+
+vardef ObjetEnleve[](text t)=%les num\xE9ros des faces sont donn\xE9es par ordre croissant.
+  numeric numface[];
+  nface:=0;
+  numface[0]:=0;
+  %r\xE9cup\xE9rer les num\xE9ros des faces.
+  forsuffixes _p=t:
+    nface:=nface+1;
+    numface[nface]=_p-(nface-1);%marchait :)
+  endfor;
+  numface[nface+1]:=apj. at -nface+1;
+  %Mettre dans l'ordre ces num\xE9ros.<-d\xE9j\xE0 fait par l'utilisateur
+  %enlever les num\xE9ros des faces
+  apj:=0;
+  for k=0 upto nface:
+    for l=numface[k] upto (numface[k+1]-1):
+      tcpt.@[apj]:=tcpt.@[apj+k];
+      OTFc.@[apj].nb:=OTFc.@[apj+k].nb;
+      for p=1 upto OTFc.@[apj].nb:
+	OTFc.@[apj][p]:=OTFc.@[apj+k][p];
+      endfor;
+      OTFc.@[apj].iso:=OTFc.@[apj+k].iso;
+      ALT.@[apj]:=ALT.@[apj+k];
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetDeplacement[](text t)=
+  %permet de d\xE9placer un objet en donnant au pr\xE9alable les angles de rotations et la translation. On peut \xE9galement appliquer une transformation.
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  apj:=0;
+  forsuffixes p_=t:
+    Ferme.@:=Ferme[p_];
+    for k=0 upto apj[p_]:
+      cpt.@[apj]:=cpt[p_][k];
+      OTFc.@[apj].nb:=OTFc[p_][k].nb;
+      for l=1 upto OTFc.@[apj].nb:
+	OTFc.@[apj][l]:=Image(OTFc[p_][k][l]);
+      endfor;
+      OTFc.@[apj].iso:=Image(OTFc[p_][k].iso);
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=Outcolor[p_];
+      else:
+	%if Ferme.@=false:
+	  Vue.@[apj]:=false;coul.@[apj]:=Incolor[p_];
+	%else:
+	%  apj:=apj-1;
+	%fi;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef ObjetFusion[](text t)=
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  tapj:=0;
+  Nbobj:=0;
+  forsuffixes p_=t:
+    for k=0 upto apj[p_]:
+      cpt.@[tapj]:=tapj;
+      OTFc.@[tapj].nb:=OTFc[p_][k].nb;
+      for p=1 upto OTFc.@[tapj].nb:
+	OTFc.@[tapj][p]:=Image(OTFc[p_][k][p]);
+      endfor;
+      OTFc.@[tapj].iso:=Image(OTFc[p_][k].iso);
+      ALT.@[tapj]:=-Zpart(GCoord(OTFc.@[tapj].iso));
+      Vue.@[tapj]:=Vue[p_][k];
+      coul.@[tapj]:=coul[p_][k];
+      tapj:=tapj+1;
+    endfor;
+  endfor;
+  apj.@:=tapj-1;
+enddef;
+
+%les intersections d'objets
+
+vardef ProjectionsurPlan(expr aa,bb,cc,dd)=%Projection du point aa sur le plan (bbccdd)
+  save di,vc;
+  color va,vb,vc,vd;
+  vd=Normal(bb,cc,dd);
+  va=vd/Norm(vd);
+  vb=aa-bb;
+  di=-ProduitScalaire(vb,va);
+  va:=di*va;
+  vb:=vb+va;
+  vc=bb+vb;
+  vc
+enddef;
+
+%%denis Roegel----------
+vardef IntersectionPlandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
+  save Int;
+  boolean Int;
+  color gg,caaa[],Caaa[];
+  caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
+  caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
+  caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
+  ww:=ProduitScalaire(caaa2,caaa3);
+  if ww<>0:
+    %if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
+      caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
+      Int:=true;
+    %else:
+    %  Int:=false;
+    %fi;
+  else: % the line is parallel to the plane
+    Int:=false;
+  fi;
+  Int
+enddef;
+
+vardef Intersectionplandroite(expr aa,bb,cc,dd,ee)=%pour les aretes :)
+  save Int;
+  boolean Int;
+  color gg,caaa[],Caaa[];
+  caaa3=Normal(aa,bb,cc)/Norm(Normal(aa,bb,cc));
+  caaa1=aa-dd;if Norm(caaa1)<>0:Caaa1=caaa1/Norm(caaa1) else:Caaa1=caaa1 fi;
+  caaa2=ee-dd;if Norm(caaa2)<>0:Caaa2=caaa2/Norm(caaa2) else:Caaa2=caaa2 fi;
+  ww:=ProduitScalaire(caaa2,caaa3);
+  if ww<>0:
+    if (ProduitScalaire(caaa1,caaa3)*ww>0) and (ProduitScalaire(caaa1,caaa3)/ww<1):
+      %message("ww"&decimal(ww)&" PS"&decimal(ProduitScalaire(caaa1,caaa3))&"");      
+      caaa4=caaa2*(ProduitScalaire(caaa1,caaa3)/ww);
+      Int:=true;
+    else:
+      Int:=false;
+    fi;
+  else: % the line is parallel to the plane
+    Int:=false;
+  fi;
+  Int
+enddef;
+
+vardef IntersectionPlanDroite(expr aa,bb,cc,dd,ee)=%plan (aa,bb,cc) droite(dd,ee)
+  if Intersectionplandroite(aa,bb,cc,dd,ee):
+    gg=dd+caaa4;
+  fi;
+  gg
+enddef;
+
+vardef IPP(expr aa,bb,cc,dd,ee,ff)=
+  %a v\xE9rifier
+  %save da,db,dc;
+  boolean int;
+  da:=Norm(aa-ProjectionsurPlan(aa,dd,ee,ff));
+  db:=Norm(bb-ProjectionsurPlan(bb,dd,ee,ff));
+  dc:=Norm(cc-ProjectionsurPlan(cc,dd,ee,ff));
+  if (da=db) and (db=dc): % the two planes are parallel
+    int:=false;
+  else:
+    int:=true;
+    nbi:=nbi+1;
+  fi;
+enddef;
+%%---------------------
+
+vardef ObjetIntersection[](text t)=%plan n\xB01 solide n\xB02
+  color INTER[][][];%pour avoir les points d'intersection
+  nbsol:=1;
+  forsuffixes p_=t:
+    pp_[nbsol]:=p_;
+    nbsol:=nbsol+1;
+  endfor;
+  nbi:=0;
+  for k=0 upto apj[pp_[2]]:
+      IPP(OTFc[pp_[2]][k][1],OTFc[pp_[2]][k][2],OTFc[pp_[2]][k][3],PPP0,PPP1,PPP2);
+      if int=true:
+	nbint:=0;
+	OTFc[pp_[2]][k][OTFc[pp_[2]][k].nb+1]=OTFc[pp_[2]][k][1];
+      	for l=1 upto (OTFc[pp_[2]][k].nb):
+	  if Intersectionplandroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]):
+	    nbint:=nbint+1;
+	    INTER[pp_2][k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP2,OTFc[pp_[2]][k][l],OTFc[pp_[2]][k][l+1]);
+	  fi;
+	endfor;
+	%%%Pas satisfaisant -> \xE0 travailler
+	%show nbint;
+	if nbint=2:
+	  draw Projette(INTER[pp_2][k][1])--Projette(INTER[pp_2][k][2]) withpen pencircle scaled2bp withcolor violet;
+	fi;
+      fi;
+  endfor;
+enddef;
+  
+vardef ObjetSepare[](expr nbd,nbD)=%nbd pour l'objet du dessous, nbD pour l'objet du dessus.
+  Ferme[nbd]:=Ferme.@;
+  Ferme[nbD]:=Ferme.@;
+  Outcolor[nbd]:=outcolor;
+  Incolor[nbd]:=incolor;
+  Outcolor[nbD]:=outcolor;
+  Incolor[nbD]:=incolor;
+  color INTER[][][];
+  color Nn;color PPP.iso;
+  Nn=Normal(PPP0,PPP1,PPP3);
+  PPP.iso=(PPP0+PPP1+PPP2)/3;
+  apj:=0;bpj:=0;%bpj pour le 2eme solide
+  for k=0 upto apj.@:
+    if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)<=0:
+      nbint:=0;
+      OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
+      for l=1 upto OTFc.@[k].nb:
+	if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
+	  nbint:=nbint+1;
+	  INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
+	  prec.@[k][nbint]:=l;
+	  suiv.@[k][nbint]:=l+1;
+	fi;
+      endfor;
+      if nbint=0:
+	tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
+	for l=1 upto OTFc[nbd][apj].nb:
+	  OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
+	endfor;
+	OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	  Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	else:
+	  Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	fi;
+	apj:=apj+1;
+      fi;
+      if nbint=2:
+	tcpt[nbd][apj]:=apj;
+	if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
+	  compt:=0;
+	  for l=1 upto prec.@[k][1]:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
+	  OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
+	  compt:=compt+2;
+	  for l=suiv.@[k][2] upto OTFc.@[k].nb:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj].nb:=compt;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	  %2eme solide
+	  compt:=1;
+	  OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
+	  for l=suiv.@[k][1] upto prec.@[k][2]:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  compt:=compt+1;
+	  OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
+	  OTFc[nbD][bpj].nb:=compt;
+	  OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
+	  ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+	    Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+	  else:
+	    Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+	  fi;
+	  bpj:=bpj+1;
+	  %fin 2eme solide
+	else:
+	  compt:=1;
+	  OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
+	  for l=suiv.@[k][1] upto prec.@[k][2]:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  compt:=compt+1;
+	  OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
+	  OTFc[nbd][apj].nb:=compt;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	  %2eme solide
+	  compt:=0;
+	  for l=1 upto prec.@[k][1]:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
+	  OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
+	  compt:=compt+2;
+	  for l=suiv.@[k][2] upto OTFc.@[k].nb:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbD][bpj].nb:=compt;
+	  OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
+	  ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+	    Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+	  else:
+	    Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+	  fi;
+	  bpj:=bpj+1;
+	  %fin 2eme solide
+	fi;
+      fi;
+      if nbint=1:
+	compt:=0;%compteur pour le nb de sommets
+	comp:=0;%pour savoir o\xF9 se situe le point \xE0 enlever
+	for l=1 upto OTFc.@[k].nb:
+	  if ProduitScalaire(Nn,OTFc.@[k][l]-PPP.iso)>0:
+	    comp:=comp+1;
+	  fi;
+	endfor;
+	if comp=1:
+	  tcpt[nbd][apj]:=apj;
+	  for l=1 upto prec.@[k][1]-1:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  compt:=compt+1;
+	  OTFc[nbd][apj][compt]:=Image(INTER.@[k][1]);
+	  for l=suiv.@[k][1] upto OTFc.@[k].nb:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj].nb:=compt;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	else:
+	  tcpt[nbd][apj]:=apj; OTFc[nbd][apj].nb:=OTFc.@[k].nb;
+	  for l=1 upto OTFc[nbd][apj].nb:
+	    OTFc[nbd][apj][l]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	fi;
+      fi;
+    fi;
+    if ProduitScalaire(Nn,OTFc.@[k].iso-PPP.iso)>0:
+      nbint:=0;
+      OTFc.@[k][OTFc.@[k].nb+1]:=OTFc.@[k][1];
+      for l=1 upto OTFc.@[k].nb:
+	if Intersectionplandroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]):
+	  nbint:=nbint+1;
+	  INTER.@[k][nbint]=IntersectionPlanDroite(PPP0,PPP1,PPP3,OTFc.@[k][l],OTFc.@[k][l+1]);
+	  prec.@[k][nbint]:=l;
+	  suiv.@[k][nbint]:=l+1;
+	fi;
+      endfor;
+      %2eme solide sans intersection
+      if nbint=0:
+	tcpt[nbD][bpj]:=bpj; OTFc[nbD][bpj].nb:=OTFc.@[k].nb;
+	for l=1 upto OTFc[nbD][bpj].nb:
+	  OTFc[nbD][bpj][l]:=Image(OTFc.@[k][l]);
+	endfor;
+	OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
+	ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+	if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+	  Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+	else:
+	  Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+	fi;
+	bpj:=bpj+1;
+      fi;
+      %fin 2eme solide
+      if nbint=2:
+	tcpt[nbd][apj]:=apj;
+	if ProduitScalaire(Nn,OTFc.@[k][prec.@[k][1]]-PPP.iso)<=0:
+	  compt:=0;
+	  for l=1 upto prec.@[k][1]:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj][compt+1]:=Image(INTER.@[k][1]);
+	  OTFc[nbd][apj][compt+2]:=Image(INTER.@[k][2]);
+	  compt:=compt+2;
+	  for l=suiv.@[k][2] upto OTFc.@[k].nb:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbd][apj].nb:=compt;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	  %2eme solide
+	  compt:=1;
+	  OTFc[nbD][bpj][1]:=Image(INTER.@[k][1]);
+	  for l=suiv.@[k][1] upto prec.@[k][2]:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  compt:=compt+1;
+	  OTFc[nbD][bpj][compt]:=Image(INTER.@[k][2]);
+	  OTFc[nbD][bpj].nb:=compt;
+	  OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
+	  ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+	    Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+	  else:
+	    Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+	  fi;
+	  bpj:=bpj+1;
+	  %fin 2eme solide
+	else:
+	  compt:=1;
+	  OTFc[nbd][apj][1]:=Image(INTER.@[k][1]);
+	  for l=suiv.@[k][1] upto prec.@[k][2]:
+	    compt:=compt+1;
+	    OTFc[nbd][apj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  compt:=compt+1;
+	  OTFc[nbd][apj][compt]:=Image(INTER.@[k][2]);
+	  OTFc[nbd][apj].nb:=compt;
+	  OTFc[nbd][apj].iso:=(OTFc[nbd][apj][1]+for l=2 upto OTFc[nbd][apj].nb:+OTFc[nbd][apj][l] endfor)/OTFc[nbd][apj].nb;
+	  ALT[nbd][apj]:=-Zpart(GCoord(OTFc[nbd][apj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbd][apj].iso,Normal(OTFc[nbd][apj].iso,OTFc[nbd][apj][1],OTFc[nbd][apj][2]))>=0:
+	    Vue[nbd][apj]:=true;coul[nbd][apj]:=outcolor;
+	  else:
+	    Vue[nbd][apj]:=false;coul[nbd][apj]:=incolor;
+	  fi;
+	  apj:=apj+1;
+	  %2eme solide
+	  compt:=0;
+	  for l=1 upto prec.@[k][1]:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbD][bpj][compt+1]:=Image(INTER.@[k][1]);
+	  OTFc[nbD][bpj][compt+2]:=Image(INTER.@[k][2]);
+	  compt:=compt+2;
+	  for l=suiv.@[k][2] upto OTFc.@[k].nb:
+	    compt:=compt+1;
+	    OTFc[nbD][bpj][compt]:=Image(OTFc.@[k][l]);
+	  endfor;
+	  OTFc[nbD][bpj].nb:=compt;
+	  OTFc[nbD][bpj].iso:=(OTFc[nbD][bpj][1]+for l=2 upto OTFc[nbD][bpj].nb:+OTFc[nbD][bpj][l] endfor)/OTFc[nbD][bpj].nb;
+	  ALT[nbD][bpj]:=-Zpart(GCoord(OTFc[nbD][bpj].iso));
+	  if ProduitScalaire(Oeil-OTFc[nbD][bpj].iso,Normal(OTFc[nbD][bpj].iso,OTFc[nbD][bpj][1],OTFc[nbD][bpj][2]))>=0:
+	    Vue[nbD][bpj]:=true;coul[nbD][bpj]:=outcolor;
+	  else:
+	    Vue[nbD][bpj]:=false;coul[nbD][bpj]:=incolor;
+	  fi;
+	  bpj:=bpj+1;
+	  %fin 2eme solide
+	fi;
+      fi;
+    fi;
+  endfor;
+  apj[nbd]:=apj-1;
+  apj[nbD]:=bpj-1;
+enddef;
+
+%pour les lignes de niveaux.
+vardef ObjetSurfaceZ[](expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
+  surfz:=true;
+  Outcolor.@:=outcolor;
+  Incolor.@:=incolor;
+  scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
+  apj:=0;
+  IncX:=(xmax-xmin)/nbpoints;
+  IncY:=(ymax-ymin)/nblignes;
+  color Yc[][],Xc[][],Fc[][];
+  for ligne=0 upto nblignes:
+    y:=ymax-ligne*IncY;
+    x:=xmin;
+    Yc[ligne][0]=(x,y,Fz(x,y));
+    for k=1 upto nbpoints:
+      Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+    endfor;
+  endfor;
+  for k=(nblignes-1) downto 0:
+    for l=(nbpoints-3) step -3 until 0: 
+      cpt[apj]:=apj;
+      OTFc.@[apj].nb:=4;
+      OTFc.@[apj][1]:=Yc[k][l];
+      OTFc.@[apj][2]:=Yc[k+1][l];
+      OTFc.@[apj][3]:=Yc[k+1][l+3];
+      OTFc.@[apj][4]:=Yc[k][l+3];
+      OTFc.@[apj].iso:=(OTFc.@[apj][1]+OTFc.@[apj][2]+OTFc.@[apj][3]+OTFc.@[apj][4])/4;
+      ALT.@[apj]:=-Zpart(GCoord(OTFc.@[apj].iso));
+      if ProduitScalaire(Oeil-OTFc.@[apj].iso,Normal(OTFc.@[apj].iso,OTFc.@[apj][1],OTFc.@[apj][2]))>=0:
+	Vue.@[apj]:=true;coul.@[apj]:=outcolor;
+      else:
+	Vue.@[apj]:=false;coul.@[apj]:=incolor;
+      fi;
+      apj:=apj+1;
+    endfor;
+  endfor;
+  apj.@:=apj-1;
+enddef;
+
+vardef GrilleSurfZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
+  drawoptions(withcolor gris);
+  for k=zmin upto zmax:
+    draw Projette((-xmin,ymin,k))--Projette((-xmax,ymin,k))--Projette((-xmax,ymax,k));
+  endfor;
+  for k=ymin upto ymax:
+    draw Projette((-xmin,k,zmin))--Projette((-xmax,k,zmin))--Projette((-xmax,k,zmax));
+  endfor;
+  for k=xmin upto xmax:
+    draw Projette((-k,ymax,zmin))--Projette((-k,ymin,zmin))--Projette((-k,ymin,zmax));
+  endfor;
+  drawoptions();
+  if Phi<>90:
+    for k=zmin step zpas until zmax:
+      label.lft(""&decimal(zechelle*k)&"",Projette((-xmin,ymin,k)));
+    endfor;
+    for k=ymin step ypas until ymax:
+      label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
+    endfor;
+    for k=xmin step xpas until xmax:
+      label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
+    endfor;
+    labeloffset:=8*labeloffset;
+    label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
+    label.lft(btex $z$ etex,Projette((-xmin,ymin,(zmin+zmax)/2)));
+    label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
+    labeloffset:=labeloffset/8;
+  else:
+    for k=ymin step ypas until ymax:
+      label.bot(""&decimal(k)&"",Projette((-xmin,k,zmin)));
+    endfor;
+    for k=xmin step xpas until xmax:
+      label.rt(""&decimal(k)&"",Projette((-k,ymax,zmin)));
+    endfor;
+    labeloffset:=8*labeloffset;
+    label.bot(btex $y$ etex,Projette((-xmin,(ymin+ymax)/2,zmin)));
+    label.rt(btex $x$ etex,Projette((-(xmin+xmax)/2,ymax,zmin)));
+    labeloffset:=labeloffset/8;
+  fi;
+enddef;
+
+vardef GrilleSurfZZ(expr xmin,xmax,xpas,ymin,ymax,ypas,zmin,zmax,zpas,zechelle)=
+  drawoptions(withcolor gris);
+  for k=zmin upto zmax:
+    draw Projette((xmin,ymin,k))--Projette((xmin,ymax,k))--Projette((xmax,ymax,k));
+  endfor;
+  for k=ymin upto ymax:
+    draw Projette((xmax,k,zmin))--Projette((xmin,k,zmin))--Projette((xmin,k,zmax));
+  endfor;
+  for k=xmin upto xmax:
+    draw Projette((k,ymin,zmin))--Projette((k,ymax,zmin))--Projette((k,ymax,zmax));
+  endfor;
+  drawoptions();
+  if Phi<>90:
+    for k=zmin step zpas until zmax:
+      label.lft(""&decimal(zechelle*k)&"",Projette((xmin,ymin,k)));
+    endfor;
+    for k=ymin step ypas until ymax:
+      label.rt(""&decimal(k)&"",Projette((xmax,k,zmin)));
+    endfor;
+    for k=xmin step xpas until xmax:
+      label.bot(""&decimal(k)&"",Projette((k,ymin,zmin)));
+    endfor;
+    labeloffset:=8*labeloffset;
+    label.rt(btex $y$ etex,Projette((xmax,(ymin+ymax)/2,zmin)));
+    label.lft(btex $z$ etex,Projette((xmin,ymin,(zmin+zmax)/2)));
+    label.bot(btex $x$ etex,Projette(((xmin+xmax)/2,ymin,zmin)));
+    labeloffset:=labeloffset/8;
+  else:
+    for k=ymin step ypas until ymax:
+      label.bot(""&decimal(k)&"",Projette((xmin,k,zmin)));
+    endfor;
+    for k=xmin step xpas until xmax:
+      label.rt(""&decimal(k)&"",Projette((k,ymax,zmin)));
+    endfor;
+    labeloffset:=8*labeloffset;
+    label.bot(btex $y$ etex,Projette((xmin,(ymin+ymax)/2,zmin)));
+    label.rt(btex $x$ etex,Projette(((xmin+xmax)/2,ymax,zmin)));
+    labeloffset:=labeloffset/8;
+  fi;
+enddef;
+
+vardef Legende(expr xmax,ymax,nbplan,zechelle)=
+  path legende[];
+  for k=1 upto nbplan+1:
+    legende[k]=Projette((-xmax,ymax+1,k-0.5))--Projette((-xmax,ymax+1,k))--Projette((-xmax,ymax+2,k))--Projette((-xmax,ymax+2,k-0.5))--cycle;
+  endfor;
+  for k=1 upto nbplan+1:
+    fill legende[k] withcolor Outcolor[k];
+    draw legende[k];
+    label.rt(""&decimal(zechelle*(k-1))&" - "&decimal(zechelle*k)&"",Projette((-xmax,ymax+2,k-0.25)));
+  endfor;
+enddef;
+
+vardef MaillageZ(expr fn,xmin,xmax,ymin,ymax,nblignes,nbpoints)=
+  traits:=true;
+  scantokens("vardef Fz(expr X,Y)="&fn&" enddef;");
+  IncX:=(xmax-xmin)/nbpoints;
+  IncY:=(ymax-ymin)/nblignes;
+  color Yc[][],Xc[][];
+  for ligne=0 upto nblignes:
+    y:=ymax-ligne*IncY;
+    x:=xmin;
+    Yc[ligne][0]=(x,y,Fz(x,y));
+    for k=1 upto nbpoints:
+      Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+    endfor;
+  endfor;
+  for l=0 upto nbpoints:
+    x:=xmax-l*IncX;
+    y:=ymin;
+    Xc[l][0]:=(x,y,Fz(x,y));
+    for k=1 upto nblignes:
+      Xc[l][k]=(x,ymin+k*IncY,Fz(x,ymin+k*IncY));
+    endfor;
+  endfor;
+  for k=nblignes downto 0:
+    draw Projette(Yc[k][nbpoints])
+    for l=(nbpoints-1) downto 0:
+      ..Projette(Yc[k][l])
+    endfor;
+  endfor;
+  for l=nbpoints downto 0:
+    draw Projette(Xc[l][nblignes])
+    for k=nblignes-1 downto 0:
+      ..Projette(Xc[l][k])
+    endfor;
+  endfor;
+enddef;
+
+endinput;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCObjets.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp	2022-11-03 20:06:06 UTC (rev 64917)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCPseudo.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -1436,7 +1436,7 @@
   drawoptions();
   texto=image(
       labeloffset:=0;
-    label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\barre Titi titi titi tit itit tit it it ti}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+    label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
   labeloffset:=3;
   );
 path cadre;
@@ -1778,7 +1778,7 @@
   drawoptions();
   texto=image(
       labeloffset:=0;
-    label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+    label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
   labeloffset:=3;
   );
 path cadre;

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp	2022-11-03 20:06:06 UTC (rev 64917)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCScratch.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -52,9 +52,13 @@
 
 %%%%Alias
 def Place expr o =
-    if path o: draw o else: draw o fi
+  if path o: draw o else: draw o fi
 enddef;
 
+def Placer expr o =
+  if path o: draw o else: draw o fi
+enddef;
+
 %impression
 boolean print;
 print=false;
@@ -1654,7 +1658,7 @@
   drawoptions();
   texto=image(
       labeloffset:=0;
-    label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{~~}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+    label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
   labeloffset:=3;
   );
 path cadre;
@@ -1742,7 +1746,7 @@
   drawoptions();
   texto=image(
       labeloffset:=0;
-    label.lrt(TEX("\hbox to"&decimal(LongRep[numblocrep])&"pt{\phantom{\barre fin du bloc}}"),if unknown _coinprec: (0,0) else:_coinprec fi);
+    label.lrt(TEX("\barre\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi);
   labeloffset:=3;
   );
 path cadre;
@@ -1792,6 +1796,7 @@
 $=image(
     fill cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
   draw cadre withcolor if print : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
+  draw texto;
   if BlocStopAvant=false:
     draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0)){dir180}..
       {dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))--
@@ -1853,7 +1858,7 @@
   drawoptions();
   texto=image(
       labeloffset:=0;
-    label.lrt(TEX("\, \hbox to"&decimal(LongRep[numblocrep])&"pt{\bfseries\barre sinon}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi;
+    label.lrt(TEX("\barre\,\hbox to"&decimal(LongRep[numblocrep])&"pt{}"),if unknown _coinprec: (0,0) else:_coinprec fi) if print=false : withcolor blanc fi;
   labeloffset:=3;
   );
   path cadre;
@@ -1901,7 +1906,9 @@
 $=image(
     fill cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
   draw cadre withcolor if print=true : coefprint*white else : if unknown colControle : LightOrange else : colControle fi fi;
-  draw texto;
+  drawoptions(withcolor white);
+  label.rt(TEX("\longbarre\sffamily\bfseries sinon"),(xpart(llcorner texto),ypart(center texto)));
+  drawoptions();
     if BlocStopAvant=false:
       draw (coindebutbloc[numblocrep]+(0.0625+0.5cm,0)+(eb,0.125)){dir180}..
 	{dir-90}(coindebutbloc[numblocrep]+(0.5cm,0)+(0,-eb))--
@@ -3370,3 +3377,71 @@
   $
 enddef;
 
+vardef Boussole(expr nbpas)=
+  save $; picture $;
+  picture Bouss[];
+  Bouss1=image(
+      draw Orienter("90");
+    );
+  Bouss2=image(
+      _coinprec:=(0,0);
+      draw Orienter("0");
+    );
+  Bouss3=image(
+            _coinprec:=(0,0);
+      draw Orienter("-90");
+    );
+  Bouss4=image(
+            _coinprec:=(0,0);
+      draw Orienter("180");
+    );
+  $=image(
+    draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1));
+    draw Bouss2 shifted ((0,2cm)-(center Bouss2));
+    draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3));
+    draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4));
+    pair PtBous[];
+    PtBous1=(-1.2cm,-1.2cm);
+    PtBous2-PtBous1=(2*1.2cm,0);
+    PtBous3-PtBous2=(0,2*1.2cm);
+    PtBous4-PtBous3=PtBous1-PtBous2;
+    path CadreBous;
+    CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi
+      --cycle;
+    fill CadreBous withcolor BleuMouvTrois;
+    draw CadreBous;
+    path CercleBouss;
+    CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm);
+    fill CercleBouss withcolor 0.2[BleuMouvTrois,white];
+    trace CercleBouss withcolor dBleuMouvTrois;
+    if nbpas="0":
+      fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="90":
+      draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="180":
+      fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="-90":
+      fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;    
+    for k=0 upto 17:
+      draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white;
+    endfor;
+    picture FlecheBouss;
+    FlecheBouss=image(
+	fill fullcircle scaled 4mm withcolor white;
+      draw fullcircle scaled 4mm;
+      drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois;
+      );
+    draw FlecheBouss shifted (point(0) of CercleBouss);
+    draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss);
+    draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss);
+    draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss);
+    );
+  $
+enddef;

Modified: trunk/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp	2022-11-03 20:06:06 UTC (rev 64917)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCScratchpdf.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -3402,3 +3402,71 @@
   $
 enddef;
 
+vardef Boussole(expr nbpas)=
+  save $; picture $;
+  picture Bouss[];
+  Bouss1=image(
+      draw Orienter("90");
+    );
+  Bouss2=image(
+      _coinprec:=(0,0);
+      draw Orienter("0");
+    );
+  Bouss3=image(
+            _coinprec:=(0,0);
+      draw Orienter("-90");
+    );
+  Bouss4=image(
+            _coinprec:=(0,0);
+      draw Orienter("180");
+    );
+  $=image(
+    draw Bouss1 rotatedabout(center Bouss1,-90) shifted ((2cm,0)-(center Bouss1));
+    draw Bouss2 shifted ((0,2cm)-(center Bouss2));
+    draw Bouss3 rotatedabout(center Bouss3,90) shifted((-2cm,0)-(center Bouss3));
+    draw Bouss4 rotatedabout(center Bouss4,180) shifted((0,-2cm)-(center Bouss4));
+    pair PtBous[];
+    PtBous1=(-1.2cm,-1.2cm);
+    PtBous2-PtBous1=(2*1.2cm,0);
+    PtBous3-PtBous2=(0,2*1.2cm);
+    PtBous4-PtBous3=PtBous1-PtBous2;
+    path CadreBous;
+    CadreBous=(PtBous1+(0,eb)){dir-90}..{dir0}(PtBous1+(eb,0)) if nbpas="180":--0.4[PtBous1,PtBous2]--(1/2[PtBous1,PtBous2]+(0,-0.3cm))--0.6[PtBous1,PtBous2] fi--(PtBous2+(-eb,0)){dir 0}..{dir 90}(PtBous2+(0,eb)) if nbpas="90":--0.4[PtBous2,PtBous3]--(1/2[PtBous2,PtBous3]+(0.3cm,0))--0.6[PtBous2,PtBous3] fi--(PtBous3+(0,-eb)){dir90}..{dir180}(PtBous3+(-eb,0)) if nbpas="0":--0.4[PtBous3,PtBous4]--(1/2[PtBous3,PtBous4]+(0,0.3cm))--0.6[PtBous3,PtBous4] fi--(PtBous4+(eb,0)){dir 180}..{dir -90}(PtBous4-(0,eb)) if nbpas="-90":--0.4[PtBous4,PtBous1]--(1/2[PtBous4,PtBous1]+(-0.3cm,0))--0.6[PtBous4,PtBous1] fi
+      --cycle;
+    fill CadreBous withcolor BleuMouvTrois;
+    draw CadreBous;
+    path CercleBouss;
+    CercleBouss=fullcircle scaled (0.55*sqrt(2)*2.4cm);
+    fill CercleBouss withcolor 0.2[BleuMouvTrois,white];
+    trace CercleBouss withcolor dBleuMouvTrois;
+    if nbpas="0":
+      fill ((0,0)--(subpath(0,2) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(2) of CercleBouss)--(0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="90":
+      draw (0,0)--(point(0) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="180":
+      fill ((0,0)--(subpath(6,8) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(6) of CercleBouss)--(0,0)--(point(8) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;
+    if nbpas="-90":
+      fill ((0,0)--(subpath(0,4) of CercleBouss)--cycle) withcolor 0.4[BleuMouvTrois,white];
+      draw (point(0) of CercleBouss)--(0,0)--(point(4) of CercleBouss) withpen pencircle scaled 1.25 withcolor white;
+    fi;    
+    for k=0 upto 17:
+      draw 0.6[(0,0),point ((k/18)*length CercleBouss) of CercleBouss]--0.8[(0,0),point ((k/18)*length CercleBouss) of CercleBouss] withcolor white;
+    endfor;
+    picture FlecheBouss;
+    FlecheBouss=image(
+	fill fullcircle scaled 4mm withcolor white;
+      draw fullcircle scaled 4mm;
+      drawarrow (-1mm,0)--(1mm,0) withpen pencircle scaled 2 withcolor BleuMouvTrois;
+      );
+    draw FlecheBouss shifted (point(0) of CercleBouss);
+    draw (FlecheBouss rotated 90) shifted (point(2) of CercleBouss);
+    draw (FlecheBouss rotated 180) shifted (point(4) of CercleBouss);
+    draw (FlecheBouss rotated -90) shifted (point(6) of CercleBouss);
+    );
+  $
+enddef;

Added: trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -0,0 +1,991 @@
+prologues:=2;
+
+%Constantes
+u:=1cm;
+pi:=3.141592654;
+c:=57.29578; % conversion d'un radian en degr\xE9s
+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);
+blanc=(1,1,1);
+orange=(1,0.5,0);
+violet=blanc-vert;
+rose=(1,0.7,0.7);
+cielfonce=0.9*(0.25,1,1);
+ciel=bleu+vert;
+orangevif=(1,0.25,0.1);
+vert=(0,1,0);
+jaune=blanc-bleu;
+gris=0.8*white;
+
+color CouleurTraits;
+CouleurTraits=black;
+
+input marith;
+input sarith;
+input PfCObjets;
+
+color Sommet[];
+
+%Anthony Phan
+vardef Norm primary z =
+  abs (abs(Xpart z, Ypart z), Zpart z)
+enddef;
+
+let Xpart = redpart;
+let Ypart = greenpart;
+let Zpart = bluepart;
+%
+
+string typerepre,pointilles;
+typerepre:="persp";
+
+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;
+  pointilles:="oui";
+  Lumiere:=Oeil;
+enddef;
+
+vardef Oeil=(Rho*Aux7,Rho*Aux8,Rho*Aux2)
+enddef;
+
+vardef sin(expr t) = sind(c*t) enddef;
+
+vardef cos(expr t) = cosd(c*t) enddef;
+
+vardef tan(expr t) = sin(t)/cos(t) enddef;
+
+vardef exp(expr x) = mexp(256)**x enddef;
+
+vardef Exp primary x = mexp(256)**x enddef;
+
+vardef ln(expr t) = mlog(t)/256 enddef;
+
+vardef log(expr t) = ln(t)/ln(10) enddef;
+
+vardef ch(expr x)=(exp(x)+exp (-x))/2 enddef;
+
+vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef;
+
+vardef th(expr x)=sh(x)/ch(x) enddef;
+
+vardef arcsin(expr x)=%D\xE9finition math\xE9matique en radian
+  pi*angle((sqrt(1-x**2),x))/180
+enddef;
+
+vardef arccos(expr x)=%D\xE9finition math\xE9matique en radian
+  pi*angle((x,sqrt(1-x**2)))/180
+enddef;
+
+vardef arctan(expr x)=arcsin(x/(1++x))
+enddef;
+
+numeric satu,lum;
+satu:=0.45;
+lum:=1;
+
+%Coordonn\xE9es dans le rep\xE8re Oeil
+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;
+
+unit:=1;%pour les mises \xE0 l'\xE9chelle :) Merci pst-solides3d
+
+vardef Projette(expr M)=
+  %if typerepre="proj":
+  %  unit*(DE*(Xpart(GCoord(M)/Zpart(GCoord(M))),(Ypart(GCoord(M))/Zpart(GCoord(M)))))
+  %elseif typerepre="persp":
+    unit*(DE*(Xpart(GCoord(M)),Ypart(GCoord(M))))
+  %fi
+enddef;
+
+vardef TraceAxes=
+  color Origine,Unitex,Unitey,Unitez;
+  Origine=(0,0,0);
+  Unitex=(5,0,0);
+  Unitey=(0,5,0);
+  Unitez=(0,0,5);
+  drawoptions(dashed dashpattern(on 12bp off 6bp on 3bp off 6bp));
+  drawarrow Projette(Origine)--Projette(Unitex) withcolor blue;
+  drawarrow Projette(Origine)--Projette(Unitey) withcolor vert;
+  drawarrow Projette(Origine)--Projette(Unitez);
+  drawoptions();
+enddef;
+
+vardef TraceAxesD(expr xd,yd,zd)=
+  drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp));;
+  drawarrow Projette((0,0,0))--Projette((xd,0,0));
+  drawarrow Projette((0,0,0))--Projette((0,yd,0));
+  drawarrow Projette((0,0,0))--Projette((0,0,zd));
+  drawoptions();
+  label(btex $x$ etex,Projette((xd+0.3,0,0)));
+  label(btex $y$ etex,Projette((0,yd+0.3,0)));
+  label(btex $z$ etex,Projette((0,0,zd+0.3)));
+enddef;
+
+vardef TraceAxesDD(expr xd,yd,zd,xf,yf,zf)=
+  drawoptions(dashed evenly);
+  draw Projette((0,0,0))--Projette((xd,0,0));
+  draw Projette((0,0,0))--Projette((0,yd,0));
+  draw Projette((0,0,0))--Projette((0,0,zd));
+  drawoptions();
+  drawarrow Projette((xd,0,0))--Projette((xf,0,0));
+  drawarrow Projette((0,yd,0))--Projette((0,yf,0));
+  drawarrow Projette((0,0,zd))--Projette((0,0,zf));
+  label(btex $x$ etex,Projette((xf+0.3,0,0)));
+  label(btex $y$ etex,Projette((0,yf+0.3,0)));
+  label(btex $z$ etex,Projette((0,0,zf+0.3)));
+enddef;
+
+vardef TraceGrille(expr NB)=
+  color ppt[];
+  for k=0 upto NB:
+    ppt[k]:=(k,0,0);
+    draw Projette(ppt[k]+(0,0,NB))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
+    ppt[k]:=(0,k,0);
+    draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,0,NB));
+    ppt[k]:=(0,0,k);
+    draw Projette(ppt[k]+(NB,0,0))--Projette(ppt[k])--Projette(ppt[k]+(0,NB,0));
+  endfor;
+enddef;
+
+primarydef u Vectprod v =
+  (Ypart u * Zpart v - Zpart u * Ypart v,
+    Zpart u * Xpart v - Xpart u * Zpart v,
+    Xpart u * Ypart v - Ypart u * Xpart v)
+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)=
+  %Mexp(Mlog redpart(wec) Mmul Mlog redpart(mor))+Mexp(Mlog greenpart(wec) Mmul Mlog greenpart(mor))+Mexp(Mlog bluepart(wec) Mmul Mlog bluepart(mor))
+  Xpart(wec)*Xpart(mor)+Ypart(wec)*Ypart(mor)+Zpart(wec)*Zpart(mor)
+enddef;
+%pour les rotations et translations
+
+vardef RotX(expr ptx)=
+  (Xpart(ptx),Ypart(ptx)*cosd(angx)-Zpart(ptx)*sind(angx),Ypart(ptx)*sind(angx)+Zpart(ptx)*cosd(angx))
+enddef;
+
+vardef RotY(expr ptx)=
+  (Xpart(ptx)*cosd(angy)+Zpart(ptx)*sind(angy),Ypart(ptx),-Xpart(ptx)*sind(angy)+Zpart(ptx)*cosd(angy))
+enddef;
+
+vardef RotZ(expr ptx)=
+  (Xpart(ptx)*cosd(angz)-Ypart(ptx)*sind(angz),Xpart(ptx)*sind(angz)+Ypart(ptx)*cosd(angz),Zpart(ptx))
+enddef;
+
+vardef RotXYZ(expr ptx)=
+  RotZ(RotY(RotX(ptx)))
+enddef;
+
+angx:=0;
+angy:=0;
+angz:=0;
+color TR;
+TR:=(0,0,0);
+%pour les tubes
+vardef VT(expr t)=Fp(t)/Norm(Fp(t))
+enddef;
+
+vardef VN(expr t)=Fd(t)/Norm(Fd(t))
+enddef;
+
+vardef VBN(expr t)=VT(t) Vectprod VN(t)
+enddef;
+
+path feuillet;
+numeric _tfig,_nfig;
+pair coinbg,coinbd,coinhd,coinhg;
+_nfig:=0;
+
+def feuille(expr xa,ya,xb,yb) =
+  feuillet := (xa,ya)--(xa,yb)--(xb,yb)--(xb,ya)--cycle;
+  coinbg := (xa,ya);
+  coinbd := (xb,ya);
+  coinhd := (xb,yb);
+  coinhg := (xa,yb);
+  %modifi\xE9 le 29.09.04
+  z.so=(xpart(coinbg/1cm),ypart(coinbg/1cm));
+  z.ne=(xpart(coinhd/1cm),ypart(coinhd/1cm));
+  %fin modification
+  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);
+    _tfig:= if (xb-xa)>(yb-ya): xb-xa else: yb-ya fi;
+        _tfig:=2*_tfig;
+enddef; 
+
+def finespace=
+endfig;
+enddef;
+
+def QS(expr ndeb,nfin)=
+  begingroup
+    save v,m,x;
+    if ndeb<nfin:
+      v:=ALT[cpt[ndeb]];
+      m:=ndeb;
+      for i=(ndeb+1) upto nfin:
+	if ALT[cpt[i]]<v:
+	  m:=m+1;
+	  x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x;
+	fi
+      endfor;
+      x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x;
+      QS(ndeb,m-1);
+      QS(m+1,nfin);
+    fi
+  endgroup
+enddef;
+
+boolean Pointilles;
+Pointilles:=false;
+
+boolean Vue[];
+color Fc[].iso;
+boolean Creux;
+Creux:=false;
+
+vardef DessineObjetNew=
+  numeric ALT[];
+  %on d\xE9termine les zmax dans le rep\xE8re spatial de l'\xE9cran
+  for k=1 upto apj:
+    Fc[k].iso:=(0,0,0) for l=1 upto ns[k][0]:
+      +Fc[k][l]
+    endfor;
+    Fc[k].iso:=Fc[k].iso/ns[k][0];
+  endfor;
+  for k=1 upto apj:
+    %ALT[k]=-Zpart(GCoord(Fc[k].iso));
+    zmax:=infinity;
+    for l=1 upto ns[k][0]:
+      t:=-Zpart(GCoord(Fc[k][l]));
+      if t<zmax:
+	zmax:=t;
+      fi;
+    endfor;
+    ALT[k]=zmax;
+    cpt[k]:=k;
+  endfor;
+  %On trie suivant les zmax
+  QS(1,apj);
+  %On dessine
+  if Pointilles:
+    for k=1 upto apj:
+      draw for l=1 upto ns[cpt[k]][0]:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle if Vue[cpt[k]]=false: dashed evenly fi;
+    endfor;
+  else:
+    for k=1 upto apj:
+      if Creux=false:
+	if Vue[cpt[k]]:
+	  fill for l=1 upto ns[cpt[k]][0]:
+	    Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle withcolor
+	  if arcenciel:
+	    lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
+	  else:
+	    lumin(cpt[k])*outcolor
+	  fi;
+	  if traits:
+	    draw for l=1 upto ns[cpt[k]][0]:
+	      Projette(Fc[cpt[k]][l])--
+	    endfor
+	    cycle;
+	  fi;
+	fi;
+      else:
+	fill for l=1 upto ns[cpt[k]][0]:
+	  Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor
+	if Vue[cpt[k]]:
+	  if arcenciel:
+	    lumin(cpt[k])*Hsvtorgb(((cpt[k]/apj)*360,satu,lum))
+	  else:
+	    lumin(cpt[k])*outcolor
+	  fi
+	else:
+	  lumin(cpt[k])*incolor
+	fi;
+	if traits:
+	  draw for l=1 upto ns[cpt[k]][0]:
+	    Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle;
+	fi;
+      fi;
+    endfor;
+  fi;
+enddef;
+
+color Fc[][];%repr\xE9sente les sommets des diff\xE9rentes faces;
+
+invnormale:=1;%Parfois dans la lecture des fichiers OFF, il est n\xE9cessaire d'opposer la normale pour obtenir un bon int\xE9rieur-ext\xE9rieur
+boolean OFF,OBJ;%pour utiliser la lumi\xE8re "correctement"
+OFF:=false;
+OBJ:=false;
+
+vardef LectureOFF(expr nomsolide)=
+  OFF:=true;
+  %D\xE9termination du nombre de sommets et de faces.
+  string s_;
+  s_=readfrom nomsolide;
+  string ss[];
+  if s_<>EOF:
+    ss1 := loptok s_;
+    t_ := if ss1="%": 0 else: 1 fi;
+    forever:
+      ss[incr t_] := loptok s_;
+      exitif ss[t_]="";
+    endfor
+  else: false
+  fi;
+  NbS:=round(Mexp Mlog_str ss1);
+  NF:=round(Mexp Mlog_str ss2);
+  message("Il y a "&decimal(NbS)&" sommets.");
+  message("Il y a "&decimal(NF)&" faces au total.");
+  %D\xE9termination des coordonn\xE9es des sommets
+  message("Cr\xE9ation des sommets.");
+  s_:=readfrom nomsolide;
+  if debut=0:
+    for k=0 upto NbS-1:
+      s_:=readfrom nomsolide;
+      if s_<>EOF:
+	ss1 := loptok s_;
+	n_ := if ss1="%": 0 else: 1 fi;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor
+      else: false
+      fi;
+      Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+      %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
+      %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
+    endfor;
+  else:
+    for k=1 upto NbS:
+      s_:=readfrom nomsolide;
+      if s_<>EOF:
+	ss1 := loptok s_;
+	n_ := if ss1="%": 0 else: 1 fi;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor
+      else: false
+      fi;
+      Sommet[k]:=(Mexp ((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+      %Sommet[k]:=(Mexp (Mlog_str ss1),Mexp (Mlog_str ss3),Mexp (Mlog_str ss2))/echelle;
+      %Sommet[k]:=(Mexp (Mlog_str ss1)/echelle,Mexp (Mlog_str ss3)/echelle,Mexp (Mlog_str ss2)/echelle);
+    endfor;
+  fi;
+  message("Cr\xE9ation des faces.");
+  %D\xE9termination des faces
+  apj:=0;color cc,dd;
+  nbfvues:=0;
+  for nf=-4000 upto (-4000+NF)-1:
+    s_:=readfrom nomsolide;
+     if s_<>EOF:
+      ss1 := loptok s_;
+      n_ := if ss1="%": 0 else: 1 fi;
+      forever:
+	ss[incr n_] := loptok s_;
+	exitif ss[n_]="";
+      endfor
+    else: false
+    fi;
+    apj:=apj+1;
+    ns[apj][0]:=Mexp Mlog_str ss1;%pour savoir le nb de sommets par face
+    for nl=1 upto ns[apj][0]:
+      Fc[apj][nl]:=Sommet[round(Mexp Mlog_str ss[nl+1])];
+    endfor;
+    dd:=Oeil-Fc[apj][1];
+    cc:=invnormale*Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]);
+    if (ProduitScalaire(dd,cc)>=0):
+      Vue[apj]:=true;
+      nbfvues:=nbfvues+1;
+    else:
+      if Creux=true:
+	Vue[apj]:=false;
+      else:
+	apj:=apj-1;
+      fi;
+    fi;
+  endfor;
+  message("Faces vues d\xE9terminees : il y en a "&decimal(nbfvues)&".");
+  closefrom nomsolide;
+  DessineObjetNew;
+enddef;
+
+vardef LectureOBJ(expr nomfichier)=
+  OBJ:=true;
+  string s_;
+  string ss[];
+  nbss:=1;
+  apj:=0;
+  forever:
+    s_:=readfrom nomfichier;
+    if s_<>EOF:
+      ss0 := loptok s_;
+      if ss0="v":
+	n_:=0;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor
+	Sommet[nbss]:=(Mexp((Mlog_str ss1) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss3) Mdiv (Mlog echelle)),Mexp ((Mlog_str ss2) Mdiv (Mlog echelle)));
+	nbss:=incr nbss;
+      elseif ss0="f":
+	n_:=0;
+	forever:
+	  ss[incr n_] := loptok s_;
+	  exitif ss[n_]="";
+	endfor;
+	ns[apj][0]:=n_-1;
+	for k=1 upto ns[apj][0]:
+	  if invnormale=1:
+	    Fc[apj][ns[apj][0]-k+1] := Sommet[round(Mexp(Mlog_str ss[k]))]
+	    %if unknown OTFc.@[apj][OTFc.@[apj].nb-k+1]:
+	  %  show OTFc.@[apj][OTFc.@[apj].nb-k+1];
+	  %fi;
+	  else:
+	    Fc[apj][k] := Sommet[round(Mexp(Mlog_str ss[k]))]
+	    %if unknown OTFc.@[apj][k]:
+	  %  show OTFc.@[apj][k];
+	  %fi;
+	  fi;
+	endfor;
+	if ProduitScalaire(Oeil-Fc[apj][1],Normal(Fc[apj][1],Fc[apj][2],Fc[apj][3]))>=0:
+	  Vue[apj]:=true;
+	  apj:=apj+1;
+	else:
+	  if Creux=true:
+	    Vue[apj]:=false;
+	    apj:=apj+1;
+	  fi;
+	fi;
+      fi;
+    fi;
+    exitif s_=EOF;
+  endfor;
+  apj:=apj-1;
+  closefrom nomfichier;
+  DessineObjetNew
+enddef;
+
+nb:=8;
+
+%tube
+vardef Tube(expr Fn,dp,ds,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,param\xE8tre d\xE9part,nb points, pas
+  save _tube;
+  picture _tube;
+  scantokens("vardef F(expr t)="&Fn&" enddef;");
+  scantokens("vardef Fp(expr t)="&dp&" enddef;");
+  scantokens("vardef Fd(expr t)="&ds&" enddef;");
+  color G[][];
+%nb point sur le cercle
+  NB:=nbp;%nb de pas
+  for l=0 upto NB:
+    for k=0 upto nb:
+      G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*(360/nb))*VN(tmin+l*pas)+sind(k*(360/nb))*VBN(tmin+l*pas));
+    endfor;
+  endfor;
+  apj:=0;
+  for l=0 upto (NB-1):
+    for k=0 upto nb-1:
+      apj:=apj+1;
+      cpt[apj]:=apj;
+      Fc[apj][1]:=G[l][k];
+      Fc[apj][2]:=G[l][k+1];
+      Fc[apj][3]:=G[l+1][k+1];
+      Fc[apj][4]:=G[l+1][k];
+      Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+      ALT[apj]:=-Zpart(GCoord(Fc[apj][1]));
+    endfor;
+  endfor;
+  QS(1,apj);
+  _tube=image(
+    for k=1 upto apj:
+      fill for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+	else: lumin(cpt[k])*outcolor fi;
+      draw for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withpen pencircle scaled0.25bp;
+    endfor;
+    );
+  _tube
+enddef;
+
+%Tube new :)
+%pour les tubes new :)
+vardef T(expr t)=Fp(t)
+enddef;
+
+vardef VTn(expr t)=if Norm(T(t))=0:
+    T(t)
+  else:
+    T(t)/Norm(T(t))
+  fi
+enddef;
+
+vardef VNn(expr t)=
+  save _VNBis,__VN;
+  color _VNBis,__VN;
+  __VN=T(t) Vectprod ((T(t+nn)-T(t-nn))/2);
+  if __VN=(0,0,0):
+    _VNBis=(0,0,1);
+  else:
+    __VN:=__VN/Norm(__VN);
+    if ProduitScalaire(VNbisprec[t-nn],__VN)>0:
+      _VNBis=__VN/Norm(__VN)
+    else:
+      _VNBis=-(__VN/Norm(__VN))
+    fi;
+  fi;
+  VNbisprec[t]=_VNBis;
+  _VNBis
+enddef;
+
+vardef VBNn(expr t)=VTn(t) Vectprod VNn(t)
+enddef;
+
+vardef Tuben(expr Fn,dp,rayon,tmin,nbp,pas)=%f,f',f'',rayon du tube,param\xE8tre d\xE9part,nb points, pas
+  save _tuben;
+  picture _tuben;
+  scantokens("vardef F(expr t)="&Fn&" enddef;");
+  scantokens("vardef Fp(expr t)="&dp&" enddef;");
+  color G[][];
+%nb point sur le cercle
+  NB:=nbp;%nb de pas
+  nn:=pas;
+  %pour g\xE9rer le "flip" aux points d'inflexion
+  color VNbisprec[];
+  VNbisprec[tmin-nn]=T(tmin-nn) Vectprod ((T(tmin)-T(tmin-2*nn))/2);
+  %
+  ang:=360/nb;
+  for l=0 upto NB:
+    for k=0 upto nb:
+      G[l][k]=F(tmin+l*pas)+rayon*(cosd(k*ang)*VNn(tmin+l*pas)+sind(k*ang)*VBNn(tmin+l*pas));
+    endfor;
+  endfor;
+  apj:=0;
+  for l=0 upto (NB-1):
+    for k=0 upto nb-1:
+      apj:=apj+1;
+      cpt[apj]:=apj;
+      Fc[apj][1]:=G[l][k];
+      Fc[apj][2]:=G[l][k+1];
+      Fc[apj][3]:=G[l+1][k+1];
+      Fc[apj][4]:=G[l+1][k];
+      Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+      ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+    endfor;
+  endfor;
+  QS(1,apj);
+  _tuben=image(
+    for k=1 upto apj:
+      fill for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+	else: lumin(cpt[k])*outcolor fi;
+      draw for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withpen pencircle scaled0.25bp;
+    endfor;
+    );
+  _tuben
+enddef;
+
+
+vardef Fonction(expr fn,tmin,tmax,pas)=%fonction
+  scantokens("vardef F(expr t)="&fn&" enddef;");
+  save _f;
+  path _f;
+  _f=Projette(F(tmin))
+  for k=tmin+pas step pas until tmax:
+    --Projette(F(k))
+  endfor;
+  _f
+enddef;
+
+color outcolor,incolor,outcolorbis;
+
+boolean Spar;
+Spar:=false;
+
+vardef Sparam(expr fn,umin,umax,upas,vmin,vmax,vpas)=%fonction
+  Spar:=true;
+  save _Sparam;
+  scantokens("vardef Famille(expr u,v)="&fn&" enddef;");
+  apj:=0;
+  picture _Sparam;
+  %On cr\xE9e les facettes et on calcule la profondeur en Z.
+  for k=umin step upas until umax:
+    for l=vmin step vpas until vmax:
+      apj:=apj+1;
+      cpt[apj]:=apj;
+      Fc[apj][1]:=Image(Famille(k+upas,l));
+      Fc[apj][2]:=Image(Famille(k,l));
+      Fc[apj][3]:=Image(Famille(k,l+vpas));
+      Fc[apj][4]:=Image(Famille(k+upas,l+vpas));
+      Fc[apj].iso:=(Fc[apj][1]+Fc[apj][3])/2;%(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+      ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+      if ProduitScalaire(Oeil-Fc[apj].iso,invnormale*Normal(Fc[apj].iso,Fc[apj][1],Fc[apj][2]))>=0:
+	Vue[apj]:=true
+      else:
+	Vue[apj]:=false
+      fi;
+    endfor;
+  endfor;
+  %On range les faces par un QS en fonction de leur profondeur
+  QS(1,apj);
+  %On affiche toutes les faces par ordre d\xE9croissant de profondeur.
+  _Sparam=image(
+    for k=1 upto apj:
+      fill for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor if Vue[cpt[k]]:
+	if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+	else: lumin(cpt[k])*outcolor fi
+      else:lumin(cpt[k])*incolor fi;
+      if traits=true:
+	draw for l=1 upto 4:
+	    Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor CouleurTraits;
+      else:
+	draw for l=1 upto 4:
+	    Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle withcolor if Vue[cpt[k]]:
+	    if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+	  else: lumin(cpt[k])*outcolor fi
+	else:lumin(cpt[k])*incolor fi;
+      fi;
+    endfor;
+    );
+  Spar:=false;
+  _Sparam
+enddef;
+
+vardef Revolution(expr fn,umin,umax,upas,vmin,vmax,vpas)=
+  Sparam("(xpart(point(u) of "&fn&")*cos(v),xpart(point(u) of "&fn&")*sin(v),ypart(point(u) of "&fn&"))",umin,umax,upas,vmin,vmax,vpas)
+enddef;
+
+boolean traits;%sur une id\xE9e d'Herbert Voss \xE0 propos de pst-solides :)
+%sert \xE0 d\xE9sactiver le tracer des traits
+%15/07/08:pour l'instant implanter uniquement pour les surfaces en z
+traits=true;
+
+boolean arcenciel;%pour essayer d'obtenir des d\xE9grad\xE9s tels que pst-solides :)
+arcenciel=false;
+
+boolean surfz;
+surfz:=false;
+boolean couleurz;
+couleurz=false;
+color cz[];
+boolean Mcir;
+Mcir:=false;
+rayd:=0;%sauf si division par 0 :(
+%ajout de angtotal et angd pour les cas dans les diff\xE9rents cadrans
+angtotal:=360;
+angd:=0;
+
+vardef SurfZ(text t_)=
+  surfz:=true;
+  save _SurfZ;
+  picture _SurfZ;
+  color alt[];
+  nbargument:=0;
+  for p_=t_ :
+    if string p_:
+      scantokens("vardef Fz(expr X,Y)="&p_&" enddef;");
+    else:
+      nbargument:=nbargument+1;
+      NN[nbargument]:=p_;
+    fi;
+  endfor;
+  apj:=0;sign:=0;
+  Zmax:=-infinity;
+  Zmin:=infinity;
+  if nbargument=6:
+    xmin:=NN1;
+    xmax:=NN2;
+    ymin:=NN3;
+    ymax:=NN4;
+    nblignes:=NN5;
+    nbpoints:=NN6;
+    IncX:=(xmax-xmin)/nbpoints;
+    IncY:=(ymax-ymin)/nblignes;
+    color Yc[][],Xc[][],Fc[][];
+    for ligne=0 upto nblignes:
+      y:=ymax-ligne*IncY;
+      x:=xmin;
+      Yc[ligne][0]=(x,y,Fz(x,y));
+      for k=1 upto nbpoints:
+	Yc[ligne][k]=((xmin+k*IncX,y,Fz(xmin+k*IncX,y)));
+      endfor;
+    endfor;
+    for k=0 upto (nblignes-1):
+      for l=0 step 3 until (nbpoints-3):
+	apj:=apj+1;
+	cpt[apj]:=apj;
+	Fc[apj][1]:=Yc[k][l];
+	Fc[apj][2]:=Yc[k][l+3];
+	Fc[apj][3]:=Yc[k+1][l+3];
+	Fc[apj][4]:=Yc[k+1][l];
+	Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+	ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+	if Zpart(Fc[apj].iso)>Zmax:
+	  Zmax:=Zpart(Fc[apj].iso);
+	fi;
+	if Zpart(Fc[apj].iso)<Zmin:
+	  Zmin:=Zpart(Fc[apj].iso);
+	fi;
+	if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
+	  Vue[apj]:=true;
+	else:
+	  Vue[apj]:=false
+	fi;
+      endfor;
+    endfor;
+  else:
+    raymax:=NN1;
+    pray:=NN2;
+    nblignes:=NN3;
+      for r=rayd step pray until (raymax-pray):
+      for y=0 step 1 until (nblignes-1):
+	apj:=apj+1;
+	cpt[apj]:=apj;
+	Fc[apj][1]:=(r*cosd(angd+y*(angtotal/nblignes)),r*sind(angd+y*(angtotal/nblignes)),Fz(r*cosd(angd+y*(angtotal/nblignes)),r*sind(angd+y*(angtotal/nblignes))));
+	Fc[apj][2]:=(r*cosd(angd+(y+1)*(angtotal/nblignes)),r*sind(angd+(y+1)*(angtotal/nblignes)),Fz(r*cosd(angd+(y+1)*(angtotal/nblignes)),r*sind(angd+(y+1)*(angtotal/nblignes))));
+	Fc[apj][3]:=((r+pray)*cosd(angd+(y+1)*(angtotal/nblignes)),(r+pray)*sind(angd+(y+1)*(angtotal/nblignes)),Fz((r+pray)*cosd(angd+(y+1)*(angtotal/nblignes)),(r+pray)*sind(angd+(y+1)*(angtotal/nblignes))));
+	Fc[apj][4]:=((r+pray)*cosd(angd+y*(angtotal/nblignes)),(r+pray)*sind(angd+y*(angtotal/nblignes)),Fz((r+pray)*cosd(angd+y*(angtotal/nblignes)),(r+pray)*sind(angd+y*(angtotal/nblignes))));
+	Fc[apj].iso:=(Fc[apj][1]+Fc[apj][2]+Fc[apj][3]+Fc[apj][4])/4;
+	if Zpart(Fc[apj].iso)>Zmax:
+	  Zmax:=Zpart(Fc[apj].iso);
+	fi;
+	if Zpart(Fc[apj].iso)<Zmin:
+	  Zmin:=Zpart(Fc[apj].iso);
+	fi;
+	ALT[apj]:=-Zpart(GCoord(Fc[apj].iso));
+	if ProduitScalaire(Oeil-Fc[apj].iso,Normal(Fc[apj].iso,Fc[apj][2],Fc[apj][1]))>=0:
+	  Vue[apj]:=true;
+	else:
+	  Vue[apj]:=false
+	fi;
+      endfor;
+    endfor;
+  fi;
+  %On range les faces par un QS en fonction de leur profondeur
+  QS(1,apj);
+  %On affiche toutes les faces par ordre d\xE9croissant de profondeur.
+  _SurfZ=image(
+    pickup pencircle scaled 0.25bp;
+    for k=1 upto apj:
+      fill for l=1 upto 4:
+	Projette(Fc[cpt[k]][l])--
+      endfor
+      cycle withcolor if couleurz:
+	  if unknown cz1:Hsvtorgb((floor(((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))*360),satu,lum))
+	else:
+	  ((Zpart(Fc[cpt[k]].iso)-Zmin)/(Zmax-Zmin))[cz2,cz1]
+	fi;
+      else:
+	if Vue[cpt[k]]:
+	  if arcenciel: lumin(cpt[k])*Hsvtorgb((floor((cpt[k]/apj)*360),satu,lum))
+	  else:lumin(cpt[k])*outcolor fi
+	else: lumin(cpt[k])*incolor fi;
+	if traits=true:
+	  draw for l=1 upto 4:
+	      Projette(Fc[cpt[k]][l])--
+	  endfor
+	  cycle;
+	fi;
+      fi;
+      if traits=true:
+	draw for l=1 upto 4:
+	    Projette(Fc[cpt[k]][l])--
+	endfor
+	cycle;
+      fi;
+    endfor;
+    );
+  surfz:=false;
+  _SurfZ
+enddef;
+
+%Objet pr\xE9d\xE9finis
+vardef ObjetCube(expr ar)=
+  NbS:=8;
+  Sommet1:=(ar,0,0);
+  Sommet2:=(ar,ar,0);
+  Sommet3:=(0,ar,0);
+  Sommet4:=(0,0,0);
+  Sommet5:=(0,0,ar);
+  Sommet6:=(ar,0,ar);
+  Sommet7:=(ar,ar,ar);
+  Sommet8:=(0,ar,ar);
+%%Faces
+  NF:=6;
+  ns[1][0]:=4;Fc[1][1]:=Sommet1;Fc[1][2]:=Sommet2;Fc[1][3]:=Sommet3;Fc[1][4]:=Sommet4;
+  ns[2][0]:=4;Fc[2][1]:=Sommet4;Fc[2][2]:=Sommet3;Fc[2][3]:=Sommet8;Fc[2][4]:=Sommet5;
+  ns[3][0]:=4;Fc[3][1]:=Sommet1;Fc[3][2]:=Sommet4;Fc[3][3]:=Sommet5;Fc[3][4]:=Sommet6;
+  ns[4][0]:=4;Fc[4][1]:=Sommet5;Fc[4][2]:=Sommet8;Fc[4][3]:=Sommet7;Fc[4][4]:=Sommet6;
+  ns[5][0]:=4;Fc[5][1]:=Sommet2;Fc[5][2]:=Sommet7;Fc[5][3]:=Sommet8;Fc[5][4]:=Sommet3;
+  ns[6][0]:=4;Fc[6][1]:=Sommet1;Fc[6][2]:=Sommet6;Fc[6][3]:=Sommet7;Fc[6][4]:=Sommet2;
+  %
+  %D\xE9termination des faces
+  apj:=0;color cc,dd;
+  for nf=1 upto NF:
+    apj:=apj+1;
+    dd:=Oeil-Fc[nf][1];
+    cc:=invnormale*Normal(Fc[nf][1],Fc[nf][2],Fc[nf][3]);
+    if (ProduitScalaire(dd,cc)>=0):
+      Vue[apj]=true
+    else:
+      Vue[apj]=false;
+    fi;
+  endfor;
+enddef;
+
+%coloriage et lumi\xE8re
+vardef Hsvtorgb(expr CC)=%CC couleur donn\xE9e en hsv d'apr\xE8s http://en.wikipedia.org/wiki/HSL_color_space
+  save $;
+  color $;
+  SSw:=floor(Xpart(CC)/60);
+  SSh:=SSw mod 6;
+  SSf:=(Xpart(CC)/60)-floor(SSw);
+  SSs:=Ypart((CC));
+  SSv:=Zpart((CC));
+  SSp:=SSv*(1-SSs);
+  SSq:=SSv*(1-SSf*SSs);
+  SSt:=SSv*(1-(1-SSf)*SSs);
+  if SSh=0: $=(SSv,SSt,SSp) elseif SSh=1:$=(SSq,SSv,SSp) elseif SSh=2:$=(SSp,SSv,SSt) elseif SSh=3:$=(SSp,SSq,SSv) elseif SSh=4:$=(SSt,SSp,SSv) elseif SSh=5:$=(SSv,SSp,SSq) fi;
+  $
+enddef;
+
+marron=Hsvtorgb((60,1,0.3));
+
+intensite:=2;
+boolean eclairage;
+eclairage:=true;
+
+color Lumiere;
+
+invnormalelum:=1;
+
+vardef lumin(expr nbt)=
+  save $;
+  numeric $;
+  if eclairage=false:
+    $=1;
+  else:
+    color uu,vv;
+    uu=Lumiere-Fc[nbt].iso;
+    uu:=uu/Norm(uu);
+    vv=invnormalelum*Normal(Fc[nbt].iso,Fc[nbt][1],Fc[nbt][2]);
+    if Norm(vv)<>0:
+      vv:=vv/Norm(vv)
+    fi;
+    if (surfz) or (Spar) or (OFF) or (OBJ):
+      $=intensite*abs(ProduitScalaire(vv,uu))
+    else:
+      $=intensite*(ProduitScalaire(vv,uu));
+    fi;
+    if $>1:
+      $:=1;
+    fi;
+  fi;
+  $
+enddef;
+
+
+%%sucre
+
+%%Transparence fait par Anthony Phan
+picture alphapict_; alphapict_=nullpicture;
+color fillcolor; fillcolor=gris;
+fgalpha := 0.5; % usual alpha parameter
+bgalpha:= 1; % alpha parameter with respect to the background
+
+vardef transparence expr c =
+  alphapict_ := nullpicture;
+  alphafill_(currentpicture, c);
+  addto currentpicture also alphapict_;
+enddef;
+
+def alphafill_(expr p, c) =
+  begingroup
+    save p_, xmax_, xmin_, ymax_, ymin_; picture p_;
+    p_ = nullpicture;
+    (xmin_, ymin_) = llcorner c; (xmax_, ymax_) = urcorner c;
+    addto p_ contour c withcolor bgalpha[background, fillcolor];
+    for p__ within p:
+      numeric xmin__, xmax__, ymin__, ymax__;
+      (xmin__, ymin__) = llcorner p__; (xmax__, ymax__) = urcorner p__;
+      if (xmax__<= xmin_) or (xmin__ >= xmax_):
+      else:
+        if (ymax__<= ymin_) or (ymin__ >= ymax_):
+        else:
+          if (not clipped p__) and (not bounded p__):
+            addto p_ also p__ withcolor
+            fgalpha[(redpart p__, greenpart p__, bluepart p__),
+            fillcolor];
+          else:
+            begingroup save alphapict_;
+              picture alphapict_; alphapict_ = nullpicture;
+              alphafill_(p__, pathpart p__);
+              addto p_ also alphapict_;
+            endgroup;
+          fi
+        fi
+      fi
+    endfor
+    clip p_ to c;
+    addto alphapict_ also p_;
+  endgroup;
+enddef;
+
+endinput;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCSolid.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp
===================================================================
--- trunk/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp	                        (rev 0)
+++ trunk/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp	2022-11-03 20:07:39 UTC (rev 64918)
@@ -0,0 +1,98 @@
+boolean Poser,Etapes,STOP;
+Poser=true;
+STOP=false;
+
+color CouleurRemplis;
+
+vardef Stop=
+  if Etapes:
+    if k>Total-1:
+      STOP:=true;
+    fi;
+  fi;
+enddef;
+
+vardef Av(expr pas)=
+  Stop;
+  if STOP=false:
+    A[k+1]-A[k]=ut*pas*VecteurDpt;
+    B[tt+1]:=A[k+1];
+    RetiensAngle[k+1]:=RetiensAngle[k];
+    if Poser:
+      draw A[k]--A[k+1] withpen pencircle scaled Epaisseur;
+    %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+    fi;
+  fi;
+  k:=k+1;
+  tt:=tt+1;
+enddef;
+
+vardef Re(expr pas)=
+  Stop;
+  if STOP=false:
+    A[k+1]-A[k]=-ut*pas*VecteurDpt;
+    B[tt+1]:=A[k+1];
+    RetiensAngle[k+1]:=RetiensAngle[k];
+    if Poser:
+      draw A[k]--A[k+1] withpen pencircle scaled Epaisseur;
+    %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+    fi;
+  fi;
+  k:=k+1;
+  tt:=tt+1;
+enddef;
+
+vardef Tg(expr pas)=
+  Stop;
+  if STOP=false:
+    VecteurDpt:=rotation(VecteurDpt,(0,0),pas);
+    A[k+1]:=A[k];
+    B[tt+1]:=A[k+1];
+  %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+    RetiensAngle[k+1]:=RetiensAngle[k]+pas;
+    Angle:=Angle+pas;
+  fi;
+  k:=k+1;
+  tt:=tt+1;
+enddef;
+
+vardef Td(expr pas)=
+  Stop;
+  if STOP=false:
+    VecteurDpt:=rotation(VecteurDpt,(0,0),-pas);
+    A[k+1]:=A[k];
+    B[tt+1]:=A[k+1];
+  %drawarrow A[k]--(A[k]+10*VecteurDpt) withcolor blue;
+    RetiensAngle[k+1]:=RetiensAngle[k]-pas;
+    Angle:=Angle-pas;
+  fi;
+  k:=k+1;
+  tt:=tt+1;
+enddef;
+
+vardef Bc=
+  Stop;
+  if STOP=false:
+    Poser:=true;
+  fi;
+enddef;
+
+vardef Lc=
+  Stop;
+  if STOP=false:
+    Poser:=false;
+  fi;
+enddef;
+
+vardef Teleporter(expr xpas,ypas)=
+  Stop;
+  if STOP=false:
+    A[k+1]:=A[k]+ut*(xpas,ypas);
+    B[tt+1]:=A[k+1];
+  fi;
+  k:=k+1;
+  tt:=tt+1;
+enddef;
+
+k=0;
+tt=0;


Property changes on: trunk/Master/texmf-dist/metapost/profcollege/PfCTurtleTestRemplis.mp
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2022-11-03 20:06:06 UTC (rev 64917)
+++ trunk/Master/texmf-dist/tex/latex/profcollege/ProfCollege.sty	2022-11-03 20:07:39 UTC (rev 64918)
@@ -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{2022/10/12}%
+\def\filedate{2022/12/01}%
 \let\PfCfiledate\filedate%
-\def\fileversion{0.99-z-a}%
+\def\fileversion{0.99-z-b}%
 \let\PfCfileversion\fileversion%
 \ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college]
 
@@ -347,6 +347,351 @@
 }
 
 %%%
+% Vue Cubes
+%%%
+\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}
+
+\newtoks\toklisteVueCube%
+\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}%
+
+\NewDocumentCommand\VueCubes{o m}{%
+  \useKVdefault[VueCubes]%
+  \setKV[VueCubes]{#1}
+  \ifboolKV[VueCubes]{Solution}{%
+    \BuildVueCubesSolution%
+  }{%
+    \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit"
+      \ignoreemptyitems%
+      \readlist*\PfCListeHauteursCubes{#2}%
+      \reademptyitems%
+      \toklisteVueCube{}%
+      \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}%
+      \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}%
+    }{%
+      \BuildVueCubes{\useKV[VueCubes]{Angle}}{}%
+    }%
+  }%
+}%
+
+\NewDocumentCommand\BuildVueCubes{m m}{%
+  \ifluatex
+  \mplibforcehmode
+  \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}%
+  \begin{mplibcode}[\PfCVueCubeNom]
+    input PfCSolid;
+
+    intensite:=1.5;
+
+    Ferme[0]:=false;
+    outcolor:=\useKV[VueCubes]{CouleurCube};
+    incolor:=white;
+    nb:=1;subh:=1;
+    creux:=true;
+
+    Profondeur:=\useKV[VueCubes]{Profondeur};
+    Largeur:=\useKV[VueCubes]{Largeur};
+    Hauteur:=\useKV[VueCubes]{Hauteur};
+    Phi:=#1;
+    Echelle:=\useKV[VueCubes]{Echelle};
+
+    color CouleurFleche;
+    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
+    
+    boolean Trou,FaceVue,Creation,Grille;
+    Trou:=\useKV[VueCubes]{Trou};
+    FaceVue:=\useKV[VueCubes]{Face};
+    Creation:=\useKV[VueCubes]{Creation};
+    Grille:=\useKV[VueCubes]{Grilles};
+    
+    TotalObj:=0;
+
+    vardef CreationSolide(text t)=
+    PfCnbcubes:=0;
+    for p_=t:
+    m:=(PfCnbcubes div Profondeur);
+    k:=(PfCnbcubes mod Profondeur);
+    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);
+    ObjetDeplacement[TotalObj](0);
+    endfor;
+    PfCnbcubes:=incr PfCnbcubes;
+    endfor;
+    enddef;
+
+    Initialisation(2500,Phi,20,50);
+    Objetcube0("a="&decimal(Echelle));
+    
+    if Creation:
+    CreationSolide(#2);
+    else:
+    for k=1 upto Profondeur:%4 profondeur
+    hauteurtour[0][k]:=Hauteur;%5 hauteur totale
+    endfor;
+    for m=1 upto Largeur:%3 largeur
+    for k=1 upto Profondeur:%4 profondeur
+    if Trou:
+    if m>1:
+    hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale
+    else:
+    hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale
+    fi;
+    else:
+    hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale
+    fi;
+    for l=1 upto hauteurtour[m][k]:
+    TotalObj:=incr TotalObj;
+    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);
+    ObjetDeplacement[TotalObj](0);
+    endfor;
+    endfor;
+    endfor;
+    fi;
+
+    % Pour la fleche
+    path Fleche;
+    color A[];
+    if FaceVue:
+    A0=Echelle*(1,Largeur/2,0);
+    A1-A0=0.25*(2,2,0);
+    A2-A1=0.25*(0,-1,0);
+    A3-A2=0.25*(2,0,0);
+    A4-A3=0.25*(0,-2,0);
+    A5-A4=A2-A3;
+    A6-A5=A2-A1;
+    Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle;
+    fill Fleche withcolor CouleurFleche;
+    draw Fleche;
+    fi;    
+    
+    nbobj:=TotalObj;
+    DessineFusion;
+
+    if Grille:
+    % dessus
+    color Ad[];
+    Ad0=(0.5Echelle,0.5*Echelle,-0.5);
+    Ad1-Ad0=(0,Largeur*Echelle,0);
+    Ad2-Ad1=(-Profondeur*Echelle,0,0);
+    Ad3-Ad2=Ad0-Ad1;
+    draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle;
+    for k=1 upto Largeur-1:
+    draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]);
+    endfor;
+    for k=1 upto Profondeur-1:
+    draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]);
+    endfor;
+    % face
+    color Af[];
+    Af0=(-1-Profondeur*Echelle,0.5*Echelle,0);
+    Af1-Af0=(0,Largeur*Echelle,0);
+    Af2-Af1=(0,0,Hauteur*Echelle);
+    Af3-Af2=Af0-Af1;
+    draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle;
+    for k=1 upto Largeur-1:
+    draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]);
+    endfor;
+    for k=1 upto Hauteur-1:
+    draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]);
+    endfor;
+    % droite
+    color Adg[];
+    Adg0=(0.5Echelle,-Largeur*Echelle-1,0);
+    Adg1-Adg0=(-Profondeur*Echelle,0,0);
+    Adg2-Adg1=(0,0,Hauteur*Echelle);
+    Adg3-Adg2=Adg0-Adg1;
+    draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle;
+    for k=1 upto Profondeur-1:
+    draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]);
+    endfor;
+    for k=1 upto Hauteur-1:
+    draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]);
+    endfor;
+    fi;
+    
+    %draw (llcorner currentpicture)--(lrcorner currentpicture)--(urcorner currentpicture)--(ulcorner currentpicture)--cycle;
+  \end{mplibcode}
+  \ifboolKV[VueCubes]{Grilles}{}{%
+    \hspace*{1.5cm}
+    \begin{mplibcode}[\PfCVueCubeNom]
+      input PfCSolid;
+      
+      intensite:=1.5;
+      
+      Ferme[0]:=false;
+      outcolor:=\useKV[VueCubes]{CouleurCube};
+      incolor:=white;
+      nb:=1;subh:=1;
+      creux:=true;
+      
+      Profondeur:=\useKV[VueCubes]{Profondeur};
+      Largeur:=\useKV[VueCubes]{Largeur};
+      Hauteur:=\useKV[VueCubes]{Hauteur};
+      Phi:=#1;
+      Echelle:=\useKV[VueCubes]{Echelle};
+      
+      color CouleurFleche;
+      CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
+      
+      TotalObj:=0;
+      
+      Initialisation(2500,Phi+90,30,50);
+      Objetcube0("a="&decimal(Echelle));
+      
+      for m=1 upto Largeur:%3 largeur
+      for k=1 upto Profondeur:%4 profondeur
+      for l=1 upto hauteurtour[m][k]:
+      TotalObj:=incr TotalObj;
+      TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
+      ObjetDeplacement[TotalObj](0);
+      endfor;
+      endfor;
+      endfor;
+      
+      if Grille:
+      undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle;
+      undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle;
+      undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle;
+      fi;
+      
+      path Fleche;
+      if FaceVue:
+      Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle;
+      fill Fleche withcolor CouleurFleche;
+      draw Fleche;
+      fi;
+      
+      nbobj:=TotalObj;
+      DessineFusion;
+    \end{mplibcode}
+  }%
+  \fi
+}%
+
+\NewDocumentCommand\BuildVueCubesSolution{}{%
+  \ifluatex%
+  \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}%
+  \begin{NiceTabular}{ccc}%
+    Vue de face&Vue de dessus&Vue de gauche\\
+    {\begin{mplibcode}[\PfCVueCubeNom]
+        input PfCSolid;
+        
+        intensite:=1.5;
+        
+        Ferme[0]:=false;
+        outcolor:=\useKV[VueCubes]{CouleurCube};
+        incolor:=white;
+        nb:=1;subh:=1;
+        creux:=true;
+        
+        Profondeur:=\useKV[VueCubes]{Profondeur};
+        Largeur:=\useKV[VueCubes]{Largeur};
+        Hauteur:=\useKV[VueCubes]{Hauteur};
+        Phi:=0;
+        Echelle:=\useKV[VueCubes]{Echelle};
+
+        color CouleurFleche;
+        CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
+        
+        TotalObj:=0;
+        
+        Initialisation(2500,Phi,0,50);
+        Objetcube0("a="&decimal(Echelle));
+        
+        for m=1 upto Largeur:%3 largeur
+        for k=1 upto Profondeur:%4 profondeur
+        for l=1 upto hauteurtour[m][k]:
+        TotalObj:=incr TotalObj;
+        TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
+        ObjetDeplacement[TotalObj](0);
+        endfor;
+        endfor;
+        endfor;
+        
+        nbobj:=TotalObj;
+        DessineFusion;
+      \end{mplibcode}}&
+    {\begin{mplibcode}[\PfCVueCubeNom]
+    input PfCSolid;
+    
+    intensite:=1.5;
+    
+    Ferme[0]:=false;
+    outcolor:=\useKV[VueCubes]{CouleurCube};
+    incolor:=white;
+    nb:=1;subh:=1;
+    creux:=true;
+    
+    Profondeur:=\useKV[VueCubes]{Profondeur};
+    Largeur:=\useKV[VueCubes]{Largeur};
+    Hauteur:=\useKV[VueCubes]{Hauteur};
+    Phi:=0;
+    Echelle:=\useKV[VueCubes]{Echelle};
+
+    color CouleurFleche;
+    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
+    
+    TotalObj:=0;
+    
+    Initialisation(2500,Phi,90,50);
+    Objetcube0("a="&decimal(Echelle));
+    
+    for m=1 upto Largeur:%3 largeur
+    for k=1 upto Profondeur:%4 profondeur
+    for l=1 upto hauteurtour[m][k]:
+    TotalObj:=incr TotalObj;
+    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
+    ObjetDeplacement[TotalObj](0);
+    endfor;
+    endfor;
+    endfor;
+
+    nbobj:=TotalObj;
+    DessineFusion;
+  \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom]
+    input PfCSolid;
+    
+    intensite:=1.5;
+    
+    Ferme[0]:=false;
+    outcolor:=\useKV[VueCubes]{CouleurCube};
+    incolor:=white;
+    nb:=1;subh:=1;
+    creux:=true;
+    
+    Profondeur:=\useKV[VueCubes]{Profondeur};
+    Largeur:=\useKV[VueCubes]{Largeur};
+    Hauteur:=\useKV[VueCubes]{Hauteur};
+    Phi:=-90;
+    Echelle:=\useKV[VueCubes]{Echelle};
+
+    color CouleurFleche;
+    CouleurFleche:=\useKV[VueCubes]{CouleurFleche};
+    
+    TotalObj:=0;
+    
+    Initialisation(2500,Phi,0,50);
+    Objetcube0("a="&decimal(Echelle));
+    
+    for m=1 upto Largeur:%3 largeur
+    for k=1 upto Profondeur:%4 profondeur
+    for l=1 upto hauteurtour[m][k]:
+    TotalObj:=incr TotalObj;
+    TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25);
+    ObjetDeplacement[TotalObj](0);
+    endfor;
+    endfor;
+    endfor;
+
+    nbobj:=TotalObj;
+    DessineFusion;
+  \end{mplibcode}}\\
+  \end{NiceTabular}%
+  \fi%
+}%
+
+%%%
 % Codage RLE
 %%%
 \setKVdefault[RLE]{Largeur=10pt,Taille=5,Unite=1cm,Solution=false,Enonce=true}
@@ -641,8 +986,24 @@
 %%%
 % Tortue
 %%%
-\setKVdefault[Tortue]{Pas=0.2mm,Etapes=false,Nom=\jobname,Grille=false,LargeurG=10,HauteurG=10,TortueD=false,TortueF=false,Epaisseur=1,Angle=0,Debut=false,Depart={(0,0)},Axes=false}
-\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}%
+\setKVdefault[Tortue]{%
+  Pas=0.2mm,%Déplacement,
+  Etapes=false,%Pour arrêter la construction à une étape particulière
+  Nom=\jobname,%Pour la sauvegarde du fichier mp
+  Grille=false,%Pour faire apparaître une grille
+  LargeurG=10,%Largeur Grille
+  HauteurG=10,%Hauteur Grille
+  TortueD=false,%Affiche la tortue au départ
+  TortueF=false,%Affiche la tortue à l'arrivée
+  Epaisseur=1,%Epaisseur du tracé
+  Angle=0,%Angle de départ de la tortue
+  Debut=false,%Pour indiquer que rien n'est fait (utile ?)
+  Depart={(0,0)},%Point de départ de la tortue
+  Axes=false,%Affichage des axes ou pas
+  Origine={(0,0)},%Origine des axes
+  Cases=false,%Se déplace-t-on sur des cases ?
+}
+\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}%choix de l'étape d'arrêt
 
 \newcounter{PfCTortue}
 \setcounter{PfCTortue}{0}
@@ -660,12 +1021,13 @@
   \savecomparemode%
   \newwrite\turtle at out%
   \immediate\openout\turtle at out \jobname+t\thePfCTortue.turtle%
-  \immediate\write\turtle at out{numeric ut;}%
-  \immediate\write\turtle at out{ut=\useKV[Tortue]{Pas};}%
-  \immediate\write\turtle at out{Etapes=\useKV[Tortue]{Etapes};}%
-  \immediate\write\turtle at out{if Etapes:Total=\useKV[Tortue]{Etape};fi;}%
-%  \immediate\write\turtle at out{vardef Dessin=}%
-%  \immediate\write\turtle at out{save Tortue; picture Tortue;}%
+  \immediate\write\turtle at out{%
+    numeric ut;
+    ut=\useKV[Tortue]{Pas};
+    pair OrigineAxes;OrigineAxes=\useKV[Tortue]{Origine};
+    Etapes=\useKV[Tortue]{Etapes};
+    if Etapes:Total=\useKV[Tortue]{Etape};fi;
+  }%
   \ifboolKV[Tortue]{Grille}{%
     \immediate\write\turtle at out{%
       larg=\useKV[Tortue]{LargeurG}; haut=\useKV[Tortue]{HauteurG};
@@ -675,68 +1037,110 @@
       for k=-haut upto haut:
       draw 3*ut*(-10larg,10k)--3*ut*(10larg,10k) withcolor 0.75white;
       endfor;
+      %dotlabel("",ut*OrigineAxes);
       if \useKV[Tortue]{Axes}:
-      drawarrow 3*ut*(-10larg,0)--3*ut*(10larg,0);
-      drawarrow 3*ut*(0,-10haut)--3*ut*(0,10haut);
-      label.llft(btex O etex,(0,0));
-      dotlabel.lrt(btex 30 etex,(30*ut,0));
-      dotlabel.ulft(btex 30 etex,(0,30*ut));
+      drawarrow (3*ut*(-10larg,0)--3*ut*(10larg,0)) shifted(ut*(0,ypart(OrigineAxes-(0,0))));
+      drawarrow (3*ut*(0,-10haut)--3*ut*(0,10haut)) shifted(ut*(xpart(OrigineAxes-(0,0)),0));
+      %label.llft(btex O etex,(0,0));
+      dotlabel.lrt(btex 30 etex,(30*ut,0)+ut*(OrigineAxes-(0,0)));
+      dotlabel.ulft(btex 30 etex,(0,30*ut)+ut*(OrigineAxes-(0,0)));
       fi;
+      if \useKV[Tortue]{Cases}:
+      string T[];
+      T1="A";
+      T2="B";
+      T3="C";
+      T4="D";
+      T5="E";
+      T6="F";
+      T7="G";
+      T8="H";
+      T9="I";
+      T10="J";
+      T11="K";
+      T12="L";
+      T13="M";
+      T14="N";
+      T15="O";
+      T16="P";
+      T17="Q";
+      T18="R";
+      T19="S";
+      T20="T";
+      T21="U";
+      T22="V";
+      T23="W";
+      T24="X";
+      T25="Y";
+      T26="Z";
+      for k=-larg upto larg-1:
+      label(TEX(T[k+larg+1]),3*ut*(10k+5,10haut+5));
+      endfor;
+      for k=haut downto -haut+1:
+      label(TEX(decimal(haut-k+1)),3*ut*(-10larg-5,10k-5));
+      endfor;
+      fi;
+      Epaisseur:=1.5;
     }%
   }{}%
   \ifboolKV[Tortue]{Debut}{}{%
     \foreachitem\compteur\in\PfCListeCmdTortue{%
       \comparestrict%
-      \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]%
-      \xintifboolexpr{\PfCTestCrochetO==0}{}{%
-        \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]%
-        \xintifboolexpr{\PfCTestCrochetF==0}{%
-          \immediate\write\turtle at out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}%
-        }{%
-          \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]%
-          \xintifboolexpr{\PfCTestRemplis==0}{%
-            \immediate\write\turtle at out{tt:=0;
-            TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}%
+      \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{MP}[\PfCTestMP]%
+      \xintifboolexpr{\PfCTestMP==0}{%
+        \immediate\write\turtle at out{\PfCListeCmdTortue[\compteurcnt,2]}%
+      }{%
+        \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]%
+        \xintifboolexpr{\PfCTestCrochetO==0}{}{%
+          \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]%
+          \xintifboolexpr{\PfCTestCrochetF==0}{%
+            \immediate\write\turtle at out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}%
           }{%
-            \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]%
-            \xintifboolexpr{\PfCTestFinPour==0}{%
-              \immediate\write\turtle at out{enddef;k:=0;}%
-              \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}%
+            \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]%
+            \xintifboolexpr{\PfCTestRemplis==0}{%
+              \immediate\write\turtle at out{tt:=0;
+                TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}%
             }{%
-              \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]%
-              \xintifboolexpr{\PfCTestPour==0}{%
-                \immediate\write\turtle at out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}%
+              \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]%
+              \xintifboolexpr{\PfCTestFinPour==0}{%
+                \immediate\write\turtle at out{enddef;k:=0;}%
+                \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}%
               }{%
-                \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]%
-                \xintifboolexpr{\PfCTestRep==0}{%
-                  \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}%
-                  \immediate\write\turtle at out{nb[\PfCNbRep]:=0;}%
-                  \immediate\write\turtle at out{forever:}%
-                  \immediate\write\turtle at out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}%
-                  % \immediate\write\turtle at out{nbcomp:=nbcomp+1;}
+                \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]%
+                \xintifboolexpr{\PfCTestPour==0}{%
+                  \immediate\write\turtle at out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}%
                 }{%
-                  \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]%
-                  \xintifboolexpr{\PfCTestParaF==0}{%
-                    \immediate\write\turtle at out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}%
-                    \immediate\write\turtle at out{endfor;}%
-                    \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}%
+                  \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]%
+                  \xintifboolexpr{\PfCTestRep==0}{%
+                    \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}%
+                    \immediate\write\turtle at out{nb[\PfCNbRep]:=0;}%
+                    \immediate\write\turtle at out{forever:}%
+                    \immediate\write\turtle at out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}%
+                    % \immediate\write\turtle at out{nbcomp:=nbcomp+1;}
                   }{%
-                    \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]%
-                    \xintifboolexpr{\PfCTestParaO==0}{%
+                    \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]%
+                    \xintifboolexpr{\PfCTestParaF==0}{%
+                      \immediate\write\turtle at out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}%
+                      \immediate\write\turtle at out{endfor;}%
+                      \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}%
                     }{%
-                      \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]%
-                      \xintifboolexpr{\PfCTestBc==0}{%
-                        \immediate\write\turtle at out{Bc;}%
+                      \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]%
+                      \xintifboolexpr{\PfCTestParaO==0}{%
                       }{%
-                        \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]%
-                        \xintifboolexpr{\PfCTestLc==0}{%
-                          \immediate\write\turtle at out{Lc;}%
+                        \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]%
+                        \xintifboolexpr{\PfCTestBc==0}{%
+                          \immediate\write\turtle at out{Bc;}%
                         }{%
-                          \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]%
-                          \xintifboolexpr{\PfCTestTlp==0}{%
-                            \immediate\write\turtle at out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}%
+                          \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]%
+                          \xintifboolexpr{\PfCTestLc==0}{%
+                            \immediate\write\turtle at out{Lc;}%
                           }{%
-                            \immediate\write\turtle at out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}%
+                            \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]%
+                            \xintifboolexpr{\PfCTestTlp==0}{%
+                              \immediate\write\turtle at out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}%
+                            }{%
+                              \immediate\write\turtle at out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}%
+                            }%
                           }%
                         }%
                       }%
@@ -758,7 +1162,6 @@
   \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{}
   \immediate\closeout\turtle at out%
   \restorecomparemode%
 }%
@@ -778,11 +1181,11 @@
     input PfCTurtleTestRemplis.mp;
 
     pair Depart;
-    Depart=\useKV[Tortue]{Depart};
+    Depart=\useKV[Tortue]{Depart} if \useKV[Tortue]{Cases}:+(15,15)fi;
     pair A[],B[];
     A[0]=\useKV[Tortue]{Pas}*(xpart(Depart),ypart(Depart));
     B[0]=A[0];
-    Epaisseur:=0.25;%\useKV[Tortue]{Epaisseur};
+    Epaisseur:=\useKV[Tortue]{Epaisseur};
     Angle:=0;
     numeric RetiensAngle[];
     RetiensAngle[0]=\useKV[Tortue]{Angle};
@@ -1273,7 +1676,7 @@
   \reademptyitems%
   \setlength{\tabcolsep}{0.25\tabcolsep}
   \renewcommand{\arraystretch}{1.5}
-  \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{2}{m{10pt}}}
+  \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{1}{m{10pt}}}
     \Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}%
     \Block[draw,fill=gray!15]{1-5}{Arrivée}&&&&&\Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}\\
     \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-1}}}\do{%
@@ -2570,11 +2973,12 @@
 %%%
 % Puissances 4
 %%%
-\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,Multiplication,Entier,Nombre,Exposant=false}%
+\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,LargeurUn=2cm,Multiplication,Entier,Nombre,Exposant=false,Libre=false,Texte=false,Echelle=2}%
 \defKV[ClesPQuatre]{Addition=\setKV[ClesPQuatre]{Multiplication=false}}%
 \defKV[ClesPQuatre]{Relatif=\setKV[ClesPQuatre]{Entier=false}}%
 \defKV[ClesPQuatre]{Puissance=\setKV[ClesPQuatre]{Exposant}}%
-\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}}%
+\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}\setKV[ClesPQuatre]{Libre}}%
+\defKV[ClesPQuatre]{Consignes=\setKV[ClesPQuatre]{Texte}}%
 
 \newtoks\toklistePQuatreh%
 \newtoks\toklistePQuatrev%
@@ -2633,19 +3037,43 @@
   \mplibforcehmode%
   \begin{mplibcode}
     Largeur=\useKV[ClesPQuatre]{Largeur};
+    LargeurUn=\useKV[ClesPQuatre]{LargeurUn};
+    Echelle=\useKV[ClesPQuatre]{Echelle};
     color fond;
     fond=\useKV[ClesPQuatre]{Couleur};
-    boolean Multiplication,Addition;
+    boolean Libre,Multiplication,Texte;
+    Libre:=\useKV[ClesPQuatre]{Libre};
     Multiplication=\useKV[ClesPQuatre]{Multiplication};
+    Texte:=\useKV[ClesPQuatre]{Texte};
+
+    if Texte:
+    string Consignes;
+    Consignes=\useKV[ClesPQuatre]{Consignes};
+    fi;
+    
+    % On calcule le nombre de cases
+    nchauteur:=0;
+    for p_=#1:
+    nchauteur:=incr nchauteur;
+    endfor;
+    nclargeur:=0;
+    for p_=#2:
+    nclargeur:=incr nclargeur;
+    endfor;
+    if Libre=false:
+    nchauteur:=7;
+    nclargeur:=7;
+    fi;
+    %On affiche
     pair A,B,C,D,H[],V[],M[][];
     A=(0,0);
-    B-A=Largeur*(7,0);
-    C=rotation(A,B,-90);
+    B-A=Largeur*(nclargeur,0);
+    C-B=Largeur*(0,nchauteur);
     D-C=A-B;
     fill polygone(A,B,C,D) withcolor fond;
     trace polygone(A,B,C,D);
-    for k=0 upto 6:
-    for l=0 upto 6:
+    for k=0 upto (nclargeur-1):
+    for l=0 upto (nchauteur-1):
     M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur);
     fill cercles(M[k][l],0.4*Largeur) withcolor blanc;
     trace cercles(M[k][l],0.4*Largeur);
@@ -2652,28 +3080,30 @@
     endfor;
     endfor;
     labeloffset:=labeloffset*2;
+    if Libre:
+    if Texte:
+    label.llft(TEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A);
+    fi;
+    else:
     if Multiplication:
-    label.llft(btex $\times$ etex scaled 2,A);
+    label.llft(btex $\times$ etex scaled Echelle,A);
     else:
-    label.llft(btex $+$ etex scaled 2,A);
+    label.llft(btex $+$ etex scaled Echelle,A);
     fi;
+    fi;
     labeloffset:=labeloffset/2;
     vardef Vertical(text t)=
     n:=0;
     for p_=t:
-%    if n<7:
-    label.lft(TEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2));
+    label.lft(TEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2));
     n:=n+1;
-%    fi;
     endfor;
     enddef;
     vardef Horizontal(text t)=
     n:=0;
     for p_=t:
-%    if n<7:
-    label.bot(TEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0));
+    label.bot(TEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0));
     n:=n+1;
-%    fi;
     endfor;
     enddef;
     labeloffset:=labeloffset*4;
@@ -2681,42 +3111,60 @@
     Horizontal(#2);
   \end{mplibcode}
   \else%
-  \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Multiplication;Multiplication=\useKV[ClesPQuatre]{Multiplication};}]
+  \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};Largeur=\useKV[ClesPQuatre]{Largeur};LargeurUn=\useKV[ClesPQuatre]{LargeurUn};Echelle=\useKV[ClesPQuatre]{Echelle};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Libre,Multiplication,Texte;Libre:=\useKV[ClesPQuatre]{Libre};Multiplication=\useKV[ClesPQuatre]{Multiplication};Texte:=\useKV[ClesPQuatre]{Texte};if Texte:string Consignes;Consignes=\useKV[ClesPQuatre]{Consignes};fi;}]
+    % On calcule le nombre de cases
+    nchauteur:=0;
+    for p_=#1:
+    nchauteur:=incr nchauteur;
+    endfor;
+    nclargeur:=0;
+    for p_=#2:
+    nclargeur:=incr nclargeur;
+    endfor;
+    if Libre=false:
+    nchauteur:=7;
+    nclargeur:=7;
+    fi;
+    %On affiche
     pair A,B,C,D,H[],V[],M[][];
     A=(0,0);
-    B-A=Largeur*(7,0);
-    C=rotation(A,B,-90);
+    B-A=Largeur*(nclargeur,0);
+    C-B=Largeur*(0,nchauteur);
     D-C=A-B;
     fill polygone(A,B,C,D) withcolor fond;
-    for k=0 upto 7:
-    for l=0 upto 7:
+    trace polygone(A,B,C,D);
+    for k=0 upto (nclargeur-1):
+    for l=0 upto (nchauteur-1):
     M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur);
     fill cercles(M[k][l],0.4*Largeur) withcolor blanc;
+    trace cercles(M[k][l],0.4*Largeur);
     endfor;
     endfor;
     labeloffset:=labeloffset*2;
+    if Libre:
+    if Texte:
+    label.llft(LATEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A);
+    fi;
+    else:
     if Multiplication:
-    label.llft(btex $\times$ etex scaled 2,A);
+    label.llft(btex $\times$ etex scaled Echelle,A);
     else:
-    label.llft(btex $+$ etex scaled 2,A);
+    label.llft(btex $+$ etex scaled Echelle,A);
     fi;
+    fi;
     labeloffset:=labeloffset/2;
     vardef Vertical(text t)=
     n:=0;
     for p_=t:
-    if n<7:
-    label.lft(LATEX(p_) scaled 2,A+(0,n*Largeur+Largeur/2));
+    label.lft(LATEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2));
     n:=n+1;
-    fi;
     endfor;
     enddef;
     vardef Horizontal(text t)=
     n:=0;
     for p_=t:
-    if n<7:
-    label.bot(LATEX(p_) scaled 2,A+(n*Largeur+Largeur/2,0));
+    label.bot(LATEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0));
     n:=n+1;
-    fi;
     endfor;
     enddef;
     labeloffset:=labeloffset*4;
@@ -6450,35 +6898,19 @@
 %%%
 % Labyrinthe Nombre
 %%%
-\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=Brown,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true}
+\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true}
 
 \newcommand\LabyNombre[1][]{%
   \useKVdefault[ClesLabyNb]%
   \setKV[ClesLabyNb]{#1}%
-  \ifboolKV[ClesLabyNb]{EntreeSortie}{%
-    \ifboolKV[ClesLabyNb]{Solution}{%
-      \TraceLabyMathAleaSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-    }{%
-      \TraceLabyMathAlea{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-    }%
+  \ifboolKV[ClesLabyNb]{Solution}{%
+    \TraceLabyFactoSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
   }{%
-    \ifboolKV[ClesLabyNb]{DoubleOperation}{%
-      \ifboolKV[ClesLabyNb]{Solution}{%
-        \TraceDoubleSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-      }{%
-        \TraceLabyNombreDouble{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-      }%
-    }{%
-      \ifboolKV[ClesLabyNb]{Solution}{%
-        \TraceSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-      }{%
-        \TraceLabyNombre{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
-      }%
-    }%
-  }%
+    \TraceLabyFacto{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}%
+  }%    
 }%
 
-\newcommand\TraceLabyMathAlea[6]{%
+\newcommand\TraceLabyFacto[6]{%
   \mplibforcehmode%
   \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
   \begin{mplibcode}[\PfCNomLabyrinthe]
@@ -6490,8 +6922,9 @@
     string Entree,Sortie;
     Entree=\useKV[ClesLabyNb]{Entree};
     Sortie=\useKV[ClesLabyNb]{Sortie};
-    boolean SortieUnique;
+    boolean SortieUnique,EntreeSortie;
     SortieUnique:=\useKV[ClesLabyNb]{SortieUnique};
+    EntreeSortie:=\useKV[ClesLabyNb]{EntreeSortie};
     picture Square;
     Square=image(
     path Test;
@@ -6501,7 +6934,42 @@
     trace subpath(2.85,3.15) of Test;
     trace subpath(3.85,4.15) of Test;
     );
+
+    vardef RemplissagePremier=
+    Totalpremier:=if indiceChemin<62:62 else: indiceChemin fi;
+
+    numeric p[]; boolean n_is_prime; p[1]=2; kis:=1;
+    for nis=3 step 2 until infinity:
+    n_is_prime := true;
+    for jis=2 upto kis:
+    if nis mod p[jis]=0: n_is_prime := false; fi
+    exitif nis/p[jis] < p[jis];
+    endfor
+    if n_is_prime: p[incr kis] := nis; exitif kis=Totalpremier; fi
+    endfor fi
     
+    numeric PR[],pretiens[];
+    
+    for ki=1 upto Totalpremier-1:
+    pretiens[ki]:=p[ki+1];
+    endfor;
+    
+    Kk:=0;
+    
+    for ki=Totalpremier-1 downto 1:
+    alea:=1+floor(uniformdeviate(ki));
+    PR[incr Kk]:=pretiens[alea];
+    % message("k="&decimal(k)&" alea="&decimal(alea)&" Kk="&decimal(Kk)&" PR[Kk]="&decimal(PR[Kk]));
+    Kkl:=0;
+    for li=1 upto ki:
+    if li<>alea:
+      pretiens[incr Kkl]:=pretiens[li];
+      % message("Kkl="&decimal(Kkl));
+      fi;
+    endfor;
+    endfor;
+    enddef;
+    
     numeric Multiple;
     Multiple=#1;
     % Initialisation du labyrinthe
@@ -6572,13 +7040,33 @@
     nbaffiche=0;
     for k=0 upto LargeurLaby-1:
       for l=0 upto LongueurLaby-1:
-        nbaffiche:=nbaffiche+1;
-        NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
+      nbaffiche:=nbaffiche+1;
+      if Multiple=1:%On affichera que des multiples de 2/3/5/9/10 pour afficher un chemin de nombre premiers
+      mathalea:=uniformdeviate(5);
+      if mathalea<1:
+      NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*2;
+      elseif mathalea<2:
+      NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*3;
+      elseif mathalea<3:
+      NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*5;
+      elseif mathalea<4:
+      NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*9;
+      else:  NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*10;
+      fi;
+      else:
+      NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
+      fi;
       endfor;
     endfor;
     % On crée des multiples du nombre choisi
+    RemplissagePremier;
+    
     for k=1 upto indiceChemin:
-      NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
+    if Multiple>1:
+    NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
+    else:
+    NbSol[k]=PR[k];
+    fi;
     endfor;
     % On affiche
     picture Corps;
@@ -6594,7 +7082,11 @@
       remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
       label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
       endfor;
-      % trace TraceLabyrinthe;
+      if EntreeSortie=false:
+      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
+      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
+      trace TraceLabyrinthe;
+      else:
       for k=0 upto LargeurLaby-1:
       for l=0 upto LongueurLaby-1:
       trace Square shifted N[k][l];
@@ -6661,6 +7153,7 @@
       label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0)));
       endfor;
       fi;
+      fi;
       );
     Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
     trace Corps;
@@ -6667,10 +7160,10 @@
   \end{mplibcode}
 }
 
-\newcommand\TraceLabyMathAleaSolution[6]{%
+\newcommand\TraceLabyFactoSolution[6]{%
   \mplibforcehmode%
   \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
-  \begin{mplibcode}[\PfCNomLabyrinthe]%
+  \begin{mplibcode}[\PfCNomLabyrinthe]
     color CouleurChemin;
     CouleurChemin:=\useKV[ClesLabyNb]{CouleurChemin};
     picture CorpsSolution;
@@ -6678,15 +7171,26 @@
     nbaffiche:=0;
       for k=0 upto LargeurLaby-1:
         for l=0 upto LongueurLaby-1:
-	  nbaffiche:=nbaffiche+1;
+          nbaffiche:=nbaffiche+1;
           label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
         endfor;
       endfor;
+      if EntreeSortie=false:
+            remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
+      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
+      for k=2 upto indiceChemin-1:
+        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin};
+        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
+        endfor;
+        else:
       for k=1 upto indiceChemin:
       remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
       label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
       endfor;
-      % trace TraceLabyrinthe;
+      fi;
+      if EntreeSortie=false:
+      trace TraceLabyrinthe;
+      else:
       for k=0 upto LargeurLaby-1:
       for l=0 upto LongueurLaby-1:
       trace Square shifted N[k][l];
@@ -6761,11 +7265,12 @@
       endfor
       --((center unitsquare scaled 10mm) shifted Arrivee)--N[-2][-2];
       trace CheminSolution dashed evenly withcolor CouleurChemin;
+      fi;
       );
       CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
       trace CorpsSolution;
-  \end{mplibcode}%
-}%
+  \end{mplibcode}
+}
 
 \newcommand\TraceLabyNombreDouble[6]{%
   \mplibforcehmode%
@@ -6902,224 +7407,6 @@
   \end{mplibcode}
 }%
 
-\newcommand\TraceLabyNombre[6]{%
-  \mplibforcehmode%
-  \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
-  \begin{mplibcode}[\PfCNomLabyrinthe]
-    input PfCLabyNombre;
-
-    boolean Murs;
-    Murs=\useKV[ClesLabyNb]{Murs};
-    
-    numeric Multiple;
-    Multiple=#1;
-    % Initialisation du labyrinthe
-    InitialisationLabyrinthe(#2,#3);
-    % On initialise les paramètres du parcours
-    numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA;
-    choixligneD=xpart(#4);
-    choixcolonneD=ypart(#4);
-    choixligneA=xpart(#5);
-    choixcolonneA=ypart(#5);%
-    pair Depart;
-    Depart=N[choixligneD][choixcolonneD];
-    pair Arrivee;
-    Arrivee=N[choixligneA][choixcolonneA];
-    pair Mobile;
-    Mobile=Depart;
-    RAZPileChemin;
-    % Exploration du labyrinthe
-    PushChemin((choixligneD,choixcolonneD));
-    CaseExploree[choixligneD][choixcolonneD]:=true;
-    VoisinDispo(choixligneD,choixcolonneD);
-    forever: exitif Mobile=Arrivee;%nb=0;
-    nb:=ceiling(uniformdeviate(nbvoisin));
-    if nb>0:
-      for k=1 upto nbvoisin:
-        CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true;
-      endfor;
-      PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb])));
-      Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])];
-      VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin]));
-    else:
-      PopChemin;
-    fi;
-    endfor;
-    % Affichagefinal
-    % on sauvegarde les nombres aléatoires
-    numeric NbAffiche[];
-    numeric NbSol[];
-    % on écrit des nombres au hasard, mais sans être multiple du nombre choisi
-    numeric nbaffiche;
-    nbaffiche=0;
-    for k=0 upto LargeurLaby-1:
-      for l=0 upto LongueurLaby-1:
-        nbaffiche:=nbaffiche+1;
-        NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
-      endfor;
-    endfor;
-    % On crée des multiples du nombre choisi
-    for k=2 upto indiceChemin-1:
-      NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
-    endfor;
-    % On affiche
-    picture Corps;
-    Corps=image(
-      nbaffiche:=0;
-      for k=0 upto LargeurLaby-1:
-        for l=0 upto LongueurLaby-1:
-	  nbaffiche:=nbaffiche+1;
-          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
-        endfor;
-      endfor;
-      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
-      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
-      for k=2 upto indiceChemin-1:
-        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
-        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
-      endfor;
-      trace TraceLabyrinthe;
-    );
-    Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
-    trace Corps;
-  \end{mplibcode}
-}
-
-\newcommand\TraceSolution[6]{%
-  \mplibforcehmode%
-  \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}%
-  \begin{mplibcode}[\PfCNomLabyrinthe]
-    picture CorpsSolution;
-    CorpsSolution=image(
-      nbaffiche:=0;
-      for k=0 upto #3-1:
-        for l=0 upto #2-1:
-          nbaffiche:=nbaffiche+1;
-          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
-        endfor;
-      endfor;
-      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
-      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
-      for k=2 upto indiceChemin-1:
-        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin};
-        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
-      endfor;
-      trace TraceLabyrinthe;
-      );
-      CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
-      trace CorpsSolution;
-  \end{mplibcode}
-}%
-
-\newcommand\TraceLabyNombreold[6]{%
-  \mplibforcehmode%
-  \begin{mplibcode}
-    input PfCLabyNombre;
-
-    boolean Murs;
-    Murs=\useKV[ClesLabyNb]{Murs};
-    
-    numeric Multiple;
-    Multiple=#1;
-    % Initialisation du labyrinthe
-    InitialisationLabyrinthe(#2,#3);
-    % On initialise les paramètres du parcours
-    numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA;
-    choixligneD=xpart(#4);
-    choixcolonneD=ypart(#4);
-    choixligneA=xpart(#5);
-    choixcolonneA=ypart(#5);%
-    pair Depart;
-    Depart=N[choixligneD][choixcolonneD];
-    pair Arrivee;
-    Arrivee=N[choixligneA][choixcolonneA];
-    pair Mobile;
-    Mobile=Depart;
-    RAZPileChemin;
-    % Exploration du labyrinthe
-    PushChemin((choixligneD,choixcolonneD));
-    CaseExploree[choixligneD][choixcolonneD]:=true;
-    VoisinDispo(choixligneD,choixcolonneD);
-    forever: exitif Mobile=Arrivee;%nb=0;
-    nb:=ceiling(uniformdeviate(nbvoisin));
-    if nb>0:
-      for k=1 upto nbvoisin:
-        CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true;
-      endfor;
-      PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb])));
-      Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])];
-      VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin]));
-    else:
-      PopChemin;
-    fi;
-    endfor;
-    % Affichagefinal
-    % on sauvegarde les nombres aléatoires
-    numeric NbAffiche[];
-    numeric NbSol[];
-    % on écrit des nombres au hasard, mais sans être multiple du nombre choisi
-    numeric nbaffiche;
-    nbaffiche=0;
-    for k=0 upto LargeurLaby-1:
-      for l=0 upto LongueurLaby-1:
-        nbaffiche:=nbaffiche+1;
-        NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1));
-      endfor;
-    endfor;
-    % On crée des multiples du nombre choisi
-    for k=2 upto indiceChemin-1:
-      NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple;
-    endfor;
-    % On affiche
-    picture Corps;
-    Corps=image(
-      nbaffiche:=0;
-      for k=0 upto LargeurLaby-1:
-        for l=0 upto LongueurLaby-1:
-	  nbaffiche:=nbaffiche+1;
-          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
-        endfor;
-      endfor;
-      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
-      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
-      for k=2 upto indiceChemin-1:
-        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white;
-        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
-      endfor;
-      trace TraceLabyrinthe;
-    );
-    Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
-    trace Corps;
-  \end{mplibcode}
-}
-
-\newcommand\TraceSolutionold[6]{%
-  \mplibforcehmode%
-  \mplibcodeinherit{enable}
-  \begin{mplibcode}
-    picture CorpsSolution;
-    CorpsSolution=image(
-      nbaffiche:=0;
-      for k=0 upto #3-1:
-        for l=0 upto #2-1:
-          nbaffiche:=nbaffiche+1;
-          label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]);
-        endfor;
-      endfor;
-      remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur};
-      remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur};
-      for k=2 upto indiceChemin-1:
-        remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor 0.5white;
-        label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]);
-      endfor;
-      trace TraceLabyrinthe;
-      );
-      CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle};
-      trace CorpsSolution;
-  \end{mplibcode}
-  \mplibcodeinherit{disable}
-}%
-
 %%%
 % Mots croisés
 %%%
@@ -7214,7 +7501,7 @@
 }%
 
 %%% Colorilude %%%
-\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false}
+\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false,CartonReponse=false,Resultats=false}
 
 \newcommand\dispogpfc[3][]{%
   \setbox1=\hbox{#2}%
@@ -7404,20 +7691,18 @@
           \xdef\ListeColoriludeMax{\listlen\ListeColorilude[##1]}%
         }{}%
       }%
-      % 
-      % On affiche le tableau
       \setlength{\tabcolsep}{0.2\tabcolsep}%
       \begin{NiceTabular}{*{\fpeval{\ListeColoriludeMax/2}}{rl}}%
         \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{%
           \xintifboolexpr{\listlen\ListeColorilude[##1]==\ListeColoriludeMax}{%
             \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{%
-              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi%
+              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi%
             }%
           }{%
             \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{%
-              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}~\else$\ListeColorilude[##1,##2]$\fi%
+              \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi%
             }%
-            &\hbox to1em{~}&\Cdots%
+            &\hbox to5pt{}&\Cdots%
           }%
           \\[0.5em]%
         }%
@@ -7989,7 +8274,7 @@
         \TraceDessinGradueSolution{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}{\the\toklisteptsgrad}{\the\toklistetracesgrad}%
       }{%
         \TraceDessinGradue{\useKV[DessinGradue]{Lignes}}{\useKV[DessinGradue]{Debut}}{\useKV[DessinGradue]{Fin}}{\useKV[DessinGradue]{Pas}}%
-      }
+      }%
     }{%
       \setsepchar[*]{,*/}%
       \readlist\ListeDefLigne{#2}%
@@ -10127,6 +10412,7 @@
 %%%
 \setKVdefault[ClesQCM]{Reponses=3,Solution=false,Stretch=1,Largeur=2cm,Couleur=gray!15,Titre=false,Nom=R\'eponse,NomV=Vrai,NomF=Faux,Alph=false,AlphT=false,VF=false,Depart=1,Alterne=false,Noms={A/B/C},Multiple=false}%
 \newlength{\LargeurQCM}%
+\newlength{\PfCLargeurQCM}%
 \newcounter{QuestionQCM}%
 \newcounter{TitreQCM}%
 \ifdef{\QCM}{%
@@ -10160,7 +10446,9 @@
       \end{tabular}%
     }{%
       \ifboolKV[ClesQCM]{VF}{%
-        \setKV[ClesQCM]{Reponses=2}
+        \setKV[ClesQCM]{Reponses=2}%
+        \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}%
+        \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}%
         \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
         \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
         \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}%
@@ -10228,9 +10516,10 @@
       \renewcommand{\arraystretch}{1}%
     }{%
       \ifboolKV[ClesQCM]{VF}{%
-        \setKV[ClesQCM]{Reponses=2}
+        \setKV[ClesQCM]{Reponses=2}%
         \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}%
-        \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}%
+        \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}}|}}%
           \cline{2-\NBcases}%
@@ -11066,7 +11355,7 @@
       }{%
         % On d\'emarre la r\'esolution
         \ifboolKV[ClesPythagore]{SansMots}{%
-         \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}
+         \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}%
         }{%
           \ifboolKV[ClesPythagore]{AllPerso}{%
             \RedactionPythagore%
@@ -11160,7 +11449,7 @@
 % y a dans un "seul calcul".
 \setcounter{NbCalculDistri}{0}
 
-\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Impression=false}%,AideAdd=false:inutile ?
+\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Impression=false,Tableau=false}%,AideAdd=false:inutile ?
 
 \newcommand\Tuile[4]{%
   \ifluatex
@@ -11594,183 +11883,187 @@
     \ifboolKV[ClesDistributivite]{Tuile}{%
       \Tuile{#2}{#3}{#4}{#5}%
     }{%
-      \ensuremath{%
-        \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{%
-          \DistriEchange[#1]{#2}{#3}{#4}{#5}%
-        }{%
-          \ifboolKV[ClesDistributivite]{Remarquable}{%
-            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
-              \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi%
-            }{}
-            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{}
-            \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
-              \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
-              \stepcounter{NbCalculDistri}%
-              \ifx\bla#4\bla%
-              \xdef\Multi{\fpeval{#2*#2}}%
-              \xdef\Multij{\fpeval{#2*#3}}%
-              \xdef\Multik{\fpeval{#3*#2}}%
-              \xdef\Multil{\fpeval{#3*#3}}%
-              %% ils sont red\'efinis pour pouvoir envisager la somme de deux
-              %% expressions \`a d\'evelopper
-              \xdef\Multim{\fpeval{#2*#3+#3*#2}}%
-              \ifboolKV[ClesDistributivite]{Oppose}{%
-                \xdef\Multi{\fpeval{-\Multi}}%
-                \xdef\Multim{\fpeval{-\Multim}}%
-                \xdef\Multil{\fpeval{-\Multil}}%
-                \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
-                \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
-                \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
-              }{%
-                \Affichage{\Multi}{\Multim}{\Multil}%
-              }
-              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}%
-              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}%
-              \else%
-              \xdef\Multi{\fpeval{#2*#4}}%
-              \xdef\Multij{\fpeval{#2*#5}}%
-              \xdef\Multik{\fpeval{#3*#4}}%
-              \xdef\Multil{\fpeval{#3*#5}}%
-            %% ils sont red\'efinis pour pouvoir envisager la somme de deux
-            %% expressions \`a d\'evelopper
-              \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
-              \ifboolKV[ClesDistributivite]{Oppose}{%
-                \xdef\Multi{\fpeval{-\Multi}}%
-                \xdef\Multim{\fpeval{-\Multim}}%
-                \xdef\Multil{\fpeval{-\Multil}}%
-                \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
-                \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
-                \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
-              }{%
-                \Affichage{\Multi}{\Multim}{\Multil}%
-              }
-              \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
-              \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
-              \fi%
-            }{}%
+      \ifboolKV[ClesDistributivite]{Tableau}{%
+        \DistriTableau[#1]{#2}{#3}{#4}{#5}%
+      }{%
+        \ensuremath{%
+          \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{%
+            \DistriEchange[#1]{#2}{#3}{#4}{#5}%
           }{%
-            \ifboolKV[ClesDistributivite]{Numerique}{%
-              \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{%
-                \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}%
-              }{%
-                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{%
-                  \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}%
+            \ifboolKV[ClesDistributivite]{Remarquable}{%
+              \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
+                \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi%
+              }{}
+              \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{}
+              \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
+                \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
+                \stepcounter{NbCalculDistri}%
+                \ifx\bla#4\bla%
+                \xdef\Multi{\fpeval{#2*#2}}%
+                \xdef\Multij{\fpeval{#2*#3}}%
+                \xdef\Multik{\fpeval{#3*#2}}%
+                \xdef\Multil{\fpeval{#3*#3}}%
+                %% ils sont red\'efinis pour pouvoir envisager la somme de deux
+                %% expressions \`a d\'evelopper
+                \xdef\Multim{\fpeval{#2*#3+#3*#2}}%
+                \ifboolKV[ClesDistributivite]{Oppose}{%
+                  \xdef\Multi{\fpeval{-\Multi}}%
+                  \xdef\Multim{\fpeval{-\Multim}}%
+                  \xdef\Multil{\fpeval{-\Multil}}%
+                  \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
+                  \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
+                  \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
                 }{%
-                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}%
-                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}%
-                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}%
-                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}%
-                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}%
+                  \Affichage{\Multi}{\Multim}{\Multil}%
+                }
+                \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}%
+                \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}%
+                \else%
+                \xdef\Multi{\fpeval{#2*#4}}%
+                \xdef\Multij{\fpeval{#2*#5}}%
+                \xdef\Multik{\fpeval{#3*#4}}%
+                \xdef\Multil{\fpeval{#3*#5}}%
+                %% ils sont red\'efinis pour pouvoir envisager la somme de deux
+                %% expressions \`a d\'evelopper
+                \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
+                \ifboolKV[ClesDistributivite]{Oppose}{%
+                  \xdef\Multi{\fpeval{-\Multi}}%
+                  \xdef\Multim{\fpeval{-\Multim}}%
+                  \xdef\Multil{\fpeval{-\Multil}}%
+                  \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
+                  \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
+                  \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
+                }{%
+                  \Affichage{\Multi}{\Multim}{\Multil}%
+                }
+                \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
+                \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
+                \fi%
+              }{}%
+            }{%
+              \ifboolKV[ClesDistributivite]{Numerique}{%
+                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{%
+                  \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}%
+                }{%
+                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{%
+                    \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}%
+                  }{%
+                    \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}%
+                    \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}%
+                    \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}%
+                    \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}%
+                    \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}%
+                  }%
                 }%
-              }%
-            }{%
-              \ifboolKV[ClesDistributivite]{All}{%
-                \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}%
-                \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}%
-                \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}%
-                \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do
-                {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}%
-                \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}%
               }{%
-                % Etape 1
-                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
-                  \xintifboolexpr{#2==0}{%
-                  }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
-                  \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
-                  \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%
-                  \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
-                  \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}%
-                  % 
-                  \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double
-                  \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk
-                  % 
-                  \xintifboolexpr{\Multi==0}{\times%
-                    \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
-                  \Tikzmark{\Affichage[#1]{0}{#4}{0}}%
-                  \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
-                  \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}%
-                  \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
-                  \xintifboolexpr{\Multi==0}{%
-                    \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
-                  \ifboolKV[ClesDistributivite]{Fleches}{%
-                    \xdef\Multi{\fpeval{#2*#3*#4*#5}}%
+                \ifboolKV[ClesDistributivite]{All}{%
+                  \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}%
+                  \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}%
+                  \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}%
+                  \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do
+                  {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}%
+                  \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}%
+                }{%
+                  % Etape 1
+                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{%
+                    \xintifboolexpr{#2==0}{%
+                    }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}%
+                    \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}%
+                    \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}%
+                    \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}%
+                    \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}%
+                    % 
+                    \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double
+                    \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk
+                    % 
+                    \xintifboolexpr{\Multi==0}{\times%
+                      \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}%
+                    \Tikzmark{\Affichage[#1]{0}{#4}{0}}%
+                    \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}%
+                    \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}%
+                    \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}%
                     \xintifboolexpr{\Multi==0}{%
-                      \xdef\Multij{\fpeval{#2*#3}}%\relax
-                      \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}%
-                    }{%
-                      \DrawArrow%
+                      \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}%
+                    \ifboolKV[ClesDistributivite]{Fleches}{%
+                      \xdef\Multi{\fpeval{#2*#3*#4*#5}}%
+                      \xintifboolexpr{\Multi==0}{%
+                        \xdef\Multij{\fpeval{#2*#3}}%\relax
+                        \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}%
+                      }{%
+                        \DrawArrow%
+                      }%
+                    }{}\setcounter{NbDistri}{0}%
+                  }{}
+                  % Etape 2
+                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
+                    \xdef\Multi{\fpeval{#2*#4}}%
+                    \xintifboolexpr{\Multi==0}{}{%
+                      \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
+                    }
+                    \xdef\Multij{\fpeval{#2*#5}}%
+                    \xintifboolexpr{\Multij==0}{}{%
+                      \xintifboolexpr{\Multi==0}{}{+}%
+                      \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
                     }%
-                  }{}\setcounter{NbDistri}{0}%
-                }{}
-                % Etape 2
-                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{%
-                  \xdef\Multi{\fpeval{#2*#4}}%
-                  \xintifboolexpr{\Multi==0}{}{%
-                    \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
-                  }
-                  \xdef\Multij{\fpeval{#2*#5}}%
-                  \xintifboolexpr{\Multij==0}{}{%
-                    \xintifboolexpr{\Multi==0}{}{+}%
-                    \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
-                  }%
-                  \xdef\Multik{\fpeval{#3*#4}}%
-                  \xintifboolexpr{\Multik==0}{}{%
-                    \xintifboolexpr{\Multi==0}{}{+}%
-                    \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
-                  }%
-                  \xdef\Multil{\fpeval{#3*#5}}%
-                  \xintifboolexpr{\Multil==0}{}{+%
-                    \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
-                  }%
-                }{}%
-                % Etape 3
-                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
-                  \stepcounter{NbCalculDistri}%
-                  \xdef\Multi{\fpeval{#2*#4}}%
-                  \xdef\Multij{\fpeval{#2*#5}}%
-                  \xdef\Multik{\fpeval{#3*#4}}%
-                  \xdef\Multil{\fpeval{#3*#5}}%
-                  %% ils sont red\'efinis pour pouvoir envisager la somme de deux
-                  %% expressions \`a d\'evelopper
-                  \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}%
-                  \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{%
-                      \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
-                      \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
+                    \xdef\Multik{\fpeval{#3*#4}}%
+                    \xintifboolexpr{\Multik==0}{}{%
+                      \xintifboolexpr{\Multi==0}{}{+}%
+                      \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}%
                     }%
-                  }{%
-                    \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
-                    \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
-                  }%
-                  \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}%
-                }{}%
-                % Etape 4
-                \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{%
-                  \xdef\Multi{\fpeval{#2*#4}}%
-                  \xdef\Multij{\fpeval{#2*#5}}%
-                  \xdef\Multik{\fpeval{#3*#4}}%
-                  \xdef\Multil{\fpeval{#3*#5}}%
-                  %% ils sont red\'efinis pour pouvoir envisager la somme de deux
-                  %% expressions \`a d\'evelopper
-                  \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
-                  \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
-                  \stepcounter{NbCalculDistri}%
-                  \ifboolKV[ClesDistributivite]{Oppose}{%
-                    \xdef\Multi{\fpeval{-\Multi}}%
-                    \xdef\Multim{\fpeval{-\Multim}}%
-                    \xdef\Multil{\fpeval{-\Multil}}%
-                    \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
-                    \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
-                    \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
-                  }{%
+                    \xdef\Multil{\fpeval{#3*#5}}%
+                    \xintifboolexpr{\Multil==0}{}{+%
+                      \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}%
+                    }%
+                  }{}%
+                  % Etape 3
+                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{%
+                    \stepcounter{NbCalculDistri}%
+                    \xdef\Multi{\fpeval{#2*#4}}%
+                    \xdef\Multij{\fpeval{#2*#5}}%
+                    \xdef\Multik{\fpeval{#3*#4}}%
+                    \xdef\Multil{\fpeval{#3*#5}}%
+                    %% ils sont red\'efinis pour pouvoir envisager la somme de deux
+                    %% expressions \`a d\'evelopper
                     \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}%
-                    \xintifboolexpr{\Multim==0}{}{%
-                      \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
+                    \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{%
+                        \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
+                        \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
+                      }%
+                    }{%
+                      \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}%
+                      \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}%
                     }%
-                    \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}%
-                  }
-                  \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
-                  \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
-                }{}%
+                    \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}%
+                  }{}%
+                  % Etape 4
+                  \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{%
+                    \xdef\Multi{\fpeval{#2*#4}}%
+                    \xdef\Multij{\fpeval{#2*#5}}%
+                    \xdef\Multik{\fpeval{#3*#4}}%
+                    \xdef\Multil{\fpeval{#3*#5}}%
+                    %% ils sont red\'efinis pour pouvoir envisager la somme de deux
+                    %% expressions \`a d\'evelopper
+                    \xdef\Multim{\fpeval{#2*#5+#3*#4}}%
+                    \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}%
+                    \stepcounter{NbCalculDistri}%
+                    \ifboolKV[ClesDistributivite]{Oppose}{%
+                      \xdef\Multi{\fpeval{-\Multi}}%
+                      \xdef\Multim{\fpeval{-\Multim}}%
+                      \xdef\Multil{\fpeval{-\Multil}}%
+                      \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}%
+                      \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}%
+                      \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}%
+                    }{%
+                      \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}%
+                      \xintifboolexpr{\Multim==0}{}{%
+                        \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}%
+                      }%
+                      \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}%
+                    }
+                    \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}%
+                    \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}%
+                  }{}%
+                }%
               }%
             }%
           }%
@@ -11780,6 +12073,22 @@
   }%
 }%
 
+\newcommand\DistriTableau[5][]{%
+  \useKVdefault[ClesDistributivite]%
+  \setKV[ClesDistributivite]{#1}%
+  \ensuremath{%
+    \begin{array}{|>{\columncolor{gray!15}}c|c|c|}
+      \hline
+      \rowcolor{gray!15}\times&\Affichage[#1]{0}{#4}{0}&\Affichage[#1]{0}{0}{#5}\\
+      \hline
+      \xintifboolexpr{#2==0}{}{\Affichage[#1]{0}{#2}{0}&\Affichage[#1]{\fpeval{#2*#4}}{0}{0}&\xintifboolexpr{\fpeval{#2*#5}>0}{+}{}\Affichage[#1]{0}{\fpeval{#2*#5}}{0}\\
+      \hline}%
+      \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+}{}\Affichage[#1]{0}{0}{#3}&\xintifboolexpr{\fpeval{#3*#4}>0}{+}{}\Affichage[#1]{0}{\fpeval{#3*#4}}{0}&\xintifboolexpr{\fpeval{#3*#5}>0}{+}{}\Affichage[#1]{0}{0}{\fpeval{#3*#5}}\\
+      \hline}
+    \end{array}
+  }%
+}%
+
 \newcommand\Resultat[1][]{%
   \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels
   \ensuremath{%
@@ -14334,15 +14643,16 @@
   % #4 longueur AB
   % #5 longueur AF
   % #6 longueur AC
+  \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
   \ifboolKV[ClesThales]{FigureSeule}{%
-    \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
+%    \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
     \MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
   }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{%
-      \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
+%      \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
       \MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}%
     }{%
       \ifboolKV[ClesThales]{Figure}{%
-        \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
+%        \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]%
         \begin{multicols}{2}
           {\em La figure est donn\'ee \`a titre indicatif.}
           \[\MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]
@@ -14351,16 +14661,16 @@
           \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}
         \end{multicols}
       }{\ifboolKV[ClesThales]{Figurecroisee}{%
-          \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]
-          \begin{minipage}{0.4\linewidth}
-            {\em La figure est donn\'ee \`a titre indicatif.}
-            \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]
-          \end{minipage}
+%          \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]
+          \fbox{\begin{minipage}{0.4\linewidth}%
+            {\em La figure est donn\'ee \`a titre indicatif.}%
+            \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]%
+          \end{minipage}}
           \hfill
-          \begin{minipage}{0.55\linewidth}
+          \begin{minipage}{0.55\linewidth}%
             \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
             \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
-          \end{minipage}\\%
+          \end{minipage}%
         }{\ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par
           \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}%
         }%
@@ -19109,7 +19419,7 @@
 %%%
 % Diff\'erentes représentations graphiques
 %%%
-\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Relie=false,RelieSegment=false,Marque=dot}
+\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGradX=1,PasGradY=1,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Relie=false,RelieSegment=false,Marque=dot}
 
 \newcommand\TraceGraphique[2][]{%
   \useKVdefault[TraceG]%
@@ -19324,6 +19634,8 @@
     y.u=1cm/\useKV[TraceG]{Ystep};
     grillex=\useKV[TraceG]{PasGrilleX};
     grilley=\useKV[TraceG]{PasGrilleY};
+    gradx=\useKV[TraceG]{PasGradX};
+    grady=\useKV[TraceG]{PasGradY};
     pos=\useKV[TraceG]{LabelC};
 
     color colortrace;
@@ -19395,16 +19707,16 @@
     drawoptions();
     fi;
     if Graduations:
-    for k=1 upto xmax/grillex:
+    for k=gradx step gradx until xmax*gradx/grillex:
     dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm)));
     endfor;
-    for k=-1 downto xmin/grillex:
+    for k=-gradx step -gradx until xmin*gradx/grillex:
     dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm)));
     endfor;
-    for k=1 upto ymax/grilley:
+    for k=grady step grady until ymax*grady/grilley:
     dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm)));
     endfor;
-    for k=-1 downto ymin/grilley:
+    for k=-grady step -grady until ymin*grady/grilley:
     dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm)));
     endfor;
     fi;
@@ -19411,6 +19723,7 @@
     drawoptions(withpen pencircle scaled1.5);
     drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0));
     drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine)));
+    label.llft(btex 0 etex,u*Origine);
     drawoptions();
     draw courbe1(borneinf,bornesup,100)(#2) withcolor colortrace;
     % labelisation
@@ -19430,9 +19743,9 @@
     \usepackage{ProfCollege}
     \setKV[TraceG]{#1}
   }
-  \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};}]
+  \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};
     pair Origine;
-    Origine=(xmin,ymin)+\useKV[TraceG]{Origine};
+    Origine=(xmin,ymin)+\useKV[TraceG]{Origine};}]
 
     vardef sin(expr t) = sind(c*t) enddef;
 
@@ -23318,7 +23631,7 @@
   }%
 }%
 
-\newcommand\Capa[2][]{%
+\NewDocumentCommand\Capa{o m}{%
   \useKVdefault[Unites]%
   \setKV[Unites]{#1}%
   \ifboolKV[Unites]{kL}{%
@@ -24527,8 +24840,10 @@
   %
   \ifboolKV[ClesTableaux]{Cube}{%
     \[\renewcommand{\arraystretch}{1.15}%
-      \setlength{\tabcolsep}{0.625\tabcolsep}%
-      \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}}
+%      \setlength{\tabcolsep}{0.625\tabcolsep}%
+%      \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}}
+      \setlength{\tabcolsep}{0.275\tabcolsep}%
+      \begin{NiceTabular}{*{7}{wc{15pt}wc{15pt}wc{15pt}}}
         \Block[]{1-3}{}%
         &&&\Block[]{1-3}{}%
         &&&\Block[]{1-3}{}%
@@ -24538,7 +24853,7 @@
         &&&\Block[]{1-3}{}\\
         \Block[borders={left,top,right}]{1-3}{km$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{hm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dam$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{m$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{cm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mm$^3$\PfCTBstrut}&&\\
         \ifboolKV[ClesTableaux]{Capacite}{%
-          \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom},l]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\
+          \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\
         }{\hline}%
         \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{%
         &&&&&&&&&&&&&&&&&&&&\\
@@ -25926,15 +26241,14 @@
   \xdef\PapierCouleur{\useKV[Papiers]{Couleur}}%
   \xdef\PapierGrille{\useKV[Papiers]{Grille}}%
   \xdef\PapierGrillePointe{\useKV[Papiers]{GrillePointe}}%
-  \checkoddpage%
-  \ifoddpage%
-  \setlength{\PapierLeftCurrent}{\oddsidemargin}%
-  \else%
-  \setlength{\PapierLeftCurrent}{\evensidemargin}%
-  \fi%
-  \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}%
-  \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}%
   \ifboolKV[Papiers]{ZoneTexte}{%
+    \checkoddpage\ifoddpage%
+    \setlength{\PapierLeftCurrent}{\oddsidemargin}%
+    \else%
+    \setlength{\PapierLeftCurrent}{\evensidemargin}%
+    \fi%
+    \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}%
+    \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}%
     \xdef\PapierHauteur{\fpeval{\textheight/1cm}}%
     \xdef\PapierLargeur{\fpeval{\textwidth/1cm}}%
     \begin{tikzpicture}[remember picture,overlay]%
@@ -25971,6 +26285,13 @@
     \end{tikzpicture}%
   }{%
     \ifboolKV[Papiers]{PageEntiere}{%
+      \checkoddpage\ifoddpage%
+      \setlength{\PapierLeftCurrent}{\oddsidemargin}%
+      \else%
+      \setlength{\PapierLeftCurrent}{\evensidemargin}%
+      \fi%
+      \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}%
+      \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}%
       \xdef\PapierHauteur{\fpeval{\paperheight/1cm}}%
       \xdef\PapierLargeur{\fpeval{\paperwidth/1cm}}%
       \begin{tikzpicture}[remember picture,overlay]%



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