%%%
% Fractions
% Author : Thomas Dehon
%%%
\def\filedateCuisinaire{2026/09/13}%
\def\fileversionCuisinaire{0.1}%
\message{-- \filedateCuisinaire\space v\fileversionCuisinaire}%
%

\def\MPBriqueFractionCuisinaire{%
  numeric HBriqueFraction,LBriqueFraction;
  HBriqueFraction:=1.5;
  LBriqueFraction:=5;
  %
  boolean Impression, Hachures;
  Impression:=false;
  Hachures:=false;
  %
  def CouleurBriqueFraction(expr n)=
    begingroup
    save m; numeric m;
    m:=1+(n-1) mod 12;
    if m=1:  (0.90,0.74,0.55)
    elseif m=2: (0.95,0.86,0.60)
    elseif m=3: (0.82,0.90,0.70)
    elseif m=4: (0.68,0.86,0.72)
    elseif m=5: (0.93,0.74,0.80)
    elseif m=6: (0.76,0.60,0.84)
    elseif m=7: (0.55,0.80,0.95)
    elseif m=8: (0.60,0.66,0.85)
    elseif m=9: (0.67,0.86,0.86)
    elseif m=10:(0.77,0.90,0.95)
    elseif m=11:(0.46,0.70,0.50)
    elseif m=12:(0.82,0.82,0.82)
    else:       (1,1,1)
    fi
    endgroup
  enddef;
  % 
  % hachureBloc(chemin):
  % dessine des hachures diagonales (45°), découpées selon "chemin",
  % pour donner l'aspect d'un bloc "à supprimer".
  % 
  def hachureBloc(expr chemin)=
    begingroup
    save img,pas,i,xmin,xmax,ymin,ymax,diag;
    picture img;
    numeric pas,i,xmin,xmax,ymin,ymax,diag;
    pas:=0.2u;
    xmin:=xpart llcorner chemin;
    xmax:=xpart urcorner chemin;
    ymin:=ypart llcorner chemin;
    ymax:=ypart urcorner chemin;
    diag:=ymax-ymin;
    img:=image(
      for i=xmin-diag step pas until xmax+diag:
        draw (i,ymin)--(i+diag,ymax) withpen pencircle scaled 0.5 withcolor 0.25[Crimson,white];
      endfor
    );
    clip img to chemin;
    draw img;
    endgroup
  enddef;
  %
  % PreserveLabel(img,marge) :
  % renvoie un rectangle correspondant à la boîte englobante de "img" (texte, picture...) agrandie de "marge" de chaque côté.
  % Sert à définir la zone centrale (le texte) à préserver des hachures.
  % 
  def PreserveLabel(expr img, marge) =
    ((xpart llcorner img - marge, ypart llcorner img - marge)--
    (xpart urcorner img + marge, ypart llcorner img - marge)--
    (xpart urcorner img + marge, ypart urcorner img + marge)--
    (xpart llcorner img - marge, ypart urcorner img + marge)--cycle)
  enddef;
  %
  % Pour des fractions de numérateur 1 
  def BriqueFraction(expr coin,couleur,denominateur)=
    remplis polygone(
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,0),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,-HBriqueFraction),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
      ) withcolor (if Impression: white else: couleur fi);
    % 
    if Hachures:
      save cbloc; path cbloc;
      cbloc:=polygone(
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,0),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,-HBriqueFraction),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
      );
      hachureBloc(cbloc);
    fi;
    %
    trace polygone(
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,0),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,-HBriqueFraction),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
    );
    %
    string TexteFraction;
    save lbl; picture lbl;
    if denominateur=1:
      lbl:=thelabel(btex $1$ etex, (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/2,-HBriqueFraction/2));
    else:
      TexteFraction="$\noexpand\frac{1}{" & decimal denominateur & "}$";
      lbl:=thelabel(textext(TexteFraction),(u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/(2*denominateur),-HBriqueFraction/2));
    fi;
    if Hachures:
      fill PreserveLabel(lbl,1bp) withcolor (if Impression: white else: couleur fi);
    fi;
    draw lbl;
  enddef;
  %
  % AssemblageBriqueFraction("n1/d1,n2/d2,..."):
  % empile une ligne de n briques de dénominateur d pour chaque couple "n/d" donné
  % (chaîne unique, virgules entre les couples, "/" entre n et d),
  % chaque ligne étant décalée verticalement de HBriqueFraction 
  % et coloriée par CouleurBriqueFraction(numéro de ligne), qui boucle sur 12 teintes.
  % 
  def AssemblageBriqueFraction(expr texte)=
    save nb,ligne,i,j,k,posSlash,n,d;
    save parties,sousChaine;
    numeric nb,ligne,i,j,k,posSlash,n,d;
    string parties[],sousChaine;
    %
    % découpe "texte" en sous-chaînes séparées par ","
    nb:=0;
    j:=0;
    for i=0 upto length(texte):
      if (i=length(texte)) or (substring(i,i+1) of texte=","):
        parties[nb]:=substring(j,i) of texte;
        nb:=nb+1;
        j:=i+1;
      fi
    endfor;
    %
    ligne:=0;
    for k=0 upto nb-1:
      sousChaine:=parties[k];
      % repère la position du "/" dans "n/d"
      posSlash:=-1;
      for i=0 upto length(sousChaine)-1:
        if (posSlash=-1) and (substring(i,i+1) of sousChaine="/"):
          posSlash:=i;
        fi
      endfor;
      n:=scantokens(substring(0,posSlash) of sousChaine);
      d:=scantokens(substring(posSlash+1,infinity) of sousChaine);
      for i=0 upto n-1:
        BriqueFraction((i/d,-ligne),CouleurBriqueFraction(d),d);
      endfor;
      ligne:=ligne+1;
    endfor;
  enddef;
  %
  % Pour des fractions plus complexes
  % BriqueFractionCompo(coin,couleur,fraction,texte):
  % trace un bloc de largeur LBriqueFraction*n/d (fraction "n/d" donnée en
  % chaîne), rempli entièrement de couleur, 
  % avec "texte" centré sur le bloc entier.
  % 
  def BriqueFractionCompo(expr coin,couleur,fraction,texte)=
    save posSlash,i,n,d,largeur;
    numeric posSlash,i,n,d,largeur;
    % repère la position du "/" dans "n/d"
    posSlash:=-1;
    for i=0 upto length(fraction)-1:
      if (posSlash=-1) and (substring(i,i+1) of fraction="/"):
        posSlash:=i;
      fi
    endfor;
    n:=scantokens(substring(0,posSlash) of fraction);
    d:=scantokens(substring(posSlash+1,infinity) of fraction);
    %
    largeur:=LBriqueFraction*n/d;
    % remplit tout le bloc (largeur = n/d bricks)
    remplis polygone(
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,0),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,-HBriqueFraction),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
      ) withcolor (if Impression: white else: couleur fi);
    if Hachures:
      save cbloc; path cbloc;
      cbloc:=polygone(
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,0),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,-HBriqueFraction),
        (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
      );
      hachureBloc(cbloc);
    fi;
    % contour du bloc entier (même largeur que le remplissage)
    trace polygone(
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,0),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur,-HBriqueFraction),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
    );
    % texte centré sur le bloc entier
    save lbl; picture lbl;
    lbl:=thelabel(textext(texte),(u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(largeur/2,-HBriqueFraction/2));
    if Hachures:
      fill PreserveLabel(lbl,1bp) withcolor (if Impression: white else: couleur fi);
    fi;
    draw lbl;
  enddef;
  %
  % Pour construire des briques vides et laisser construire les fractions "à la main" 
  def BriqueFractionVide(expr coin,couleur,denominateur)=
    trace polygone(
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,0),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(LBriqueFraction/denominateur,-HBriqueFraction),
      (u*LBriqueFraction*xpart coin,u*HBriqueFraction*ypart coin)+u*(0,-HBriqueFraction)
    ) withcolor couleur;
  enddef;
}%

%-------------------------------------------------- 
% Quelques commandes internes
%
\setKVdefault[AssemblageFraction]{%
  AssemblagePerso=false,
  CoinBG={u*(-0.5,-30)},
  CoinHD={u*(20.5,0.5)},
  HBrique=1, 
  LBrique=5, 
  Unite=8mm,
  EpaisseurTrait=0.5,
  Concatene=true, 				% pour la représentation de l'addition 
  CompleteUnite=false,
  Impression=false,
  Vide=false
}
%
\newif\ifErreurAssembleFraction%
\ErreurAssembleFractionfalse%
%-------------------------------------------------- 
% Assembler des fractions 
%
\NewDocumentCommand{\AssembleFraction}{O{}m}{%
	\useKVdefault[AssemblageFraction]%
	\setKV[AssemblageFraction]{#1}%
	\ifboolKV[AssemblageFraction]{AssemblagePerso}%
		{%
		\ErreurAssembleFractionfalse%
		\edef\CommandeFractionMP{#2}%
	  \begin{Geometrie}[CoinBG={\useKV[AssemblageFraction]{CoinBG}},CoinHD={\useKV[AssemblageFraction]{CoinHD}}] 
			\MPBriqueFractionCuisinaire
			currentpen:=pencircle scaled \useKV[AssemblageFraction]{EpaisseurTrait};
			\ifboolKV[AssemblageFraction]{Impression}{Impression:=true;}{}
			u:=\useKV[AssemblageFraction]{Unite};
			HBriqueFraction:=\useKV[AssemblageFraction]{HBrique}; 
			LBriqueFraction:=\useKV[AssemblageFraction]{LBrique}; 
			\CommandeFractionMP
		\end{Geometrie}
		}%
		{%
		\IfSubStr{#2}{?}{% comprendre une fraction 
			\ErreurAssembleFractionfalse%
			\StrBefore{#2}{?}[\Brique]%
			\StrBefore{\Brique}{/}[\Numerateur]%
			\StrBehind{\Brique}{/}[\Denominateur]%
			\def\NbUnite{\fpeval{trunc(\Brique)+1}}%
			%
			\ifboolKV[AssemblageFraction]{Vide}%
				{%
				\edef\CommandeFractionMP{%
					for i=1 upto \fpeval{\NbUnite*\Denominateur}:%
  					BriqueFractionVide(((i-1)/\Denominateur,-1),0.5[DodgerBlue,white],\Denominateur);
					endfor;%
					AssemblageBriqueFraction("\NbUnite/1");
				}%
				}%
				{%
				\ifboolKV[AssemblageFraction]{CompleteUnite}%
					{\edef\ListeFractions{\NbUnite/1,\Brique,\Denominateur/\Denominateur}}%
					{\edef\ListeFractions{\NbUnite/1,\Brique}}%
				\edef\CommandeFractionMP{AssemblageBriqueFraction("\ListeFractions")}%
				}%
			%
			\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-3*\useKV[AssemblageFraction]{HBrique}-0.5})}%
			\edef\AssemblageCoinHD{u*(\fpeval{(trunc(\Brique)+1)*\useKV[AssemblageFraction]{LBrique}},0.5)}%
		}{}%
		\IfSubStr{#2}{:}{% décomposer une fraction 
			\ErreurAssembleFractionfalse%
			\StrBefore{#2}{:}[\Brique]
			\def\NbUnite{\fpeval{trunc(\Brique)}}
			\ifboolKV[AssemblageFraction]{Vide}%
				{%
				\StrBehind{\Brique}{/}[\Denominateur]%
				\edef\CommandeFractionMP{%
					for i=1 upto \fpeval{(\NbUnite+1)*\Denominateur}:%
  					BriqueFractionVide(((i-1)/\Denominateur,-1),0.5[DodgerBlue,white],\Denominateur);
					endfor;%
					AssemblageBriqueFraction("\NbUnite/1");
				}%
				}%
				{%
				\edef\ListeFractions{\NbUnite/1,\Brique}
				\edef\CommandeFractionMP{AssemblageBriqueFraction("\ListeFractions")}%
				}%
			%
			\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-3*\useKV[AssemblageFraction]{HBrique}})}%
			\edef\AssemblageCoinHD{u*(\fpeval{(trunc(\Brique)+1)*\useKV[AssemblageFraction]{LBrique}},0.5)}%
		}{}%
		\IfSubStr{#2}{&}{% comparer des fractions  
			\ErreurAssembleFractionfalse%
			\StrBefore{#2}{&}[\BriqueUn]
			\StrBehind{#2}{&}[\BriqueDeux]
			\def\NbUnite{\fpeval{max(trunc(\BriqueUn),trunc(\BriqueDeux))+1}}
			\ifboolKV[AssemblageFraction]{Vide}%
				{%
				\StrBehind{\BriqueUn}{/}[\DenominateurUn]%
				\StrBehind{\BriqueDeux}{/}[\DenominateurDeux]%
				\edef\CommandeFractionMP{%
					for i=1 upto \fpeval{\NbUnite*\DenominateurUn}:%
  					BriqueFractionVide(((i-1)/\DenominateurUn,-1),0.5[DodgerBlue,white],\DenominateurUn);
					endfor;%
					for i=1 upto \fpeval{\NbUnite*\DenominateurDeux}:%
  					BriqueFractionVide(((i-1)/\DenominateurDeux,-2),0.5[DodgerBlue,white],\DenominateurDeux);
					endfor;%
					AssemblageBriqueFraction("\NbUnite/1");
				}%
				}%
				{%
				\edef\ListeFractions{\NbUnite/1,\BriqueUn,\BriqueDeux}
				\edef\CommandeFractionMP{AssemblageBriqueFraction("\ListeFractions")}%
				}%
			%
			\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-3*\useKV[AssemblageFraction]{HBrique}-0.5})}%
			\edef\AssemblageCoinHD{u*(\fpeval{\NbUnite*\useKV[AssemblageFraction]{LBrique}},0.5)}%
		}{}%
		\IfSubStr{#2}{+}{% additionner des fractions 
			\ErreurAssembleFractionfalse% 
			\StrBefore{#2}{+}[\BriqueUn]%
				\StrBefore{\BriqueUn}{/}[\NumerateurUn]%
				\StrBehind{\BriqueUn}{/}[\DenominateurUn]%
			\StrBehind{#2}{+}[\BriqueDeux]%
				\StrBefore{\BriqueDeux}{/}[\NumerateurDeux]%
				\StrBehind{\BriqueDeux}{/}[\DenominateurDeux]%
			\PPCM{\fpeval{\DenominateurUn}}{\fpeval{\DenominateurDeux}}% commande interne à ProfCollege (fichier PfCThales.tex) 
				\def\DenomCommun{\the\ppcm}%
				\def\CoeffUn{\fpeval{\DenomCommun/\DenominateurUn}}%
				\def\CoeffDeux{\fpeval{\DenomCommun/\DenominateurDeux}}%
			\def\NbUnite{\fpeval{trunc(#2)+1}}%
			\PGCD{\fpeval{\NumerateurUn*\CoeffUn+\NumerateurDeux*\CoeffDeux}}{\DenomCommun}% permettra une éventuelle simplification de la somme 
			\ifboolKV[AssemblageFraction]{Vide}%
				{%
				\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-4*\useKV[AssemblageFraction]{HBrique}-0.5})}%
				\edef\AssemblageCoinHD{u*(\fpeval{(\NbUnite+1)*\useKV[AssemblageFraction]{LBrique}},0.5)}%
				%
				\def\NbUnite{\fpeval{trunc(\BriqueUn)+1+trunc(\BriqueDeux)+1}}%
				\edef\CommandeFractionMP{%
					for i=1 upto \fpeval{(trunc(\BriqueUn)+1)*\DenominateurUn}:%
  					BriqueFractionVide(((i-1)/\DenominateurUn,-1),0.5[DodgerBlue,white],\DenominateurUn);%
					endfor;%
					for i=1 upto \fpeval{(trunc(\BriqueDeux)+1)*\DenominateurDeux}:%
  					BriqueFractionVide((\fpeval{trunc(\BriqueUn)+1}+(i-1)/\DenominateurDeux,-1),0.5[DodgerBlue,white],\DenominateurDeux);%
					endfor;%
					for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
  					BriqueFractionVide(((i-1)/\DenomCommun,-2),0.5[DodgerBlue,white],\DenomCommun);%
					endfor;%
					for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
  					BriqueFractionVide(((i-1)/\DenomCommun,-3),0.5[DodgerBlue,white],\DenomCommun);%
					endfor;%
					\xintifboolexpr{\the\pgcd==1}%
						{}% la somme obtenue est une fraction irréductible : pas besoin de simplifier 
						{%
						for i=1 upto \fpeval{\NbUnite*\DenomCommun/\the\pgcd}:%
		  					BriqueFractionVide(((i-1)/(\DenomCommun/\the\pgcd),-4),white,\fpeval{\DenomCommun/\the\pgcd});
						endfor;%
						}%
					AssemblageBriqueFraction("\NbUnite/1");
				}%
				}%
				{%
				\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-4*\useKV[AssemblageFraction]{HBrique}-0.5})}%
				\edef\AssemblageCoinHD{u*(\fpeval{(\NbUnite+1)*\useKV[AssemblageFraction]{LBrique}},0.5)}%
				%
				\ifboolKV[AssemblageFraction]{Concatene}%
					{%
					\edef\ListeFractions{%
						\NbUnite/1,%
						\BriqueUn,%
						(\NumerateurUn*\CoeffUn+\NumerateurDeux*\CoeffDeux)/\DenomCommun%
					}%
					\edef\CommandeFractionMP{%
						AssemblageBriqueFraction("\ListeFractions");%
						for i=1 upto \NumerateurDeux:%
			  				BriqueFraction((\NumerateurUn/\DenominateurUn+(i-1)/\DenominateurDeux,-1),CouleurBriqueFraction(\DenominateurDeux),\DenominateurDeux);%
						endfor;%
						\xintifboolexpr{\the\pgcd==1}%
							{}% la somme obtenue est une fraction irréductible : pas besoin de simplifier 
							{%
							for i=1 upto \fpeval{(\NumerateurUn*\CoeffUn+\NumerateurDeux*\CoeffDeux)/\the\pgcd}:%
			  					BriqueFraction(((i-1)/(\DenomCommun/\the\pgcd),-3),CouleurBriqueFraction(\fpeval{\DenomCommun/\the\pgcd}),\fpeval{\DenomCommun/\the\pgcd});
							endfor;%
							}%
						}%
					}%
					{%
					\def\NbUnite{\fpeval{trunc(\BriqueUn)+1+trunc(\BriqueDeux)+1}}%
					\edef\ListeFractions{%
						\NbUnite/1,%
						\BriqueUn,%
						\NumerateurUn*\CoeffUn/\DenomCommun,%
						(\NumerateurUn*\CoeffUn+\NumerateurDeux*\CoeffDeux)/\DenomCommun%
					}%
					\edef\CommandeFractionMP{%
						for i=1 upto \fpeval{(trunc(\BriqueUn)+1)*\DenominateurUn}:%
	  					BriqueFractionVide(((i-1)/\DenominateurUn,-1),0.5[DodgerBlue,white],\DenominateurUn);%
						endfor;%
						for i=1 upto \fpeval{(trunc(\BriqueDeux)+1)*\DenominateurDeux}:%
	  					BriqueFractionVide((\fpeval{trunc(\BriqueUn)+1}+(i-1)/\DenominateurDeux,-1),0.5[DodgerBlue,white],\DenominateurDeux);%
						endfor;%
						for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
	  					BriqueFractionVide(((i-1)/\DenomCommun,-2),0.5[DodgerBlue,white],\DenomCommun);%
						endfor;%
						for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
	  					BriqueFractionVide(((i-1)/\DenomCommun,-3),0.5[DodgerBlue,white],\DenomCommun);%
						endfor;%
						AssemblageBriqueFraction("\ListeFractions");%
						for i=1 upto \NumerateurDeux:%
			  			BriqueFraction((\fpeval{trunc(\BriqueUn)+1}+(i-1)/\DenominateurDeux,-1),CouleurBriqueFraction(\DenominateurDeux),\DenominateurDeux);%
						endfor;%
						for i=1 upto \fpeval{\NumerateurDeux*\CoeffDeux}:%
			  			BriqueFraction((\fpeval{trunc(\BriqueUn)+1}+(i-1)/\DenomCommun,-2),CouleurBriqueFraction(\DenomCommun),\DenomCommun);%
						endfor;%
						\xintifboolexpr{\the\pgcd==1}%
							{}% la somme obtenue est une fraction irréductible : pas besoin de simplifier 
							{%
							for i=1 upto \fpeval{(\NumerateurUn*\CoeffUn+\NumerateurDeux*\CoeffDeux)/\the\pgcd}:%
			  					BriqueFraction(((i-1)/(\DenomCommun/\the\pgcd),-4),CouleurBriqueFraction(\fpeval{\DenomCommun/\the\pgcd}),\fpeval{\DenomCommun/\the\pgcd});
							endfor;%
							}%
					}%
					}%
				}%
		}{}%
		\IfSubStr{#2}{-}{% soustraire des fractions 
			\ErreurAssembleFractionfalse%
			\xintifboolexpr{#2<=0}%
				{%
				Attention : pour \texttt{#2}, la différence obtenue n'est pas strictement positive, je ne peux pas la représenter !
				\par\bigskip%
				\ErreurAssembleFractiontrue%
				}%
				{%
				\StrBefore{#2}{-}[\BriqueUn]%
					\StrBefore{\BriqueUn}{/}[\NumerateurUn]%
					\StrBehind{\BriqueUn}{/}[\DenominateurUn]%
				\StrBehind{#2}{-}[\BriqueDeux]%
					\StrBefore{\BriqueDeux}{/}[\NumerateurDeux]%
					\StrBehind{\BriqueDeux}{/}[\DenominateurDeux]%
				\PPCM{\fpeval{\DenominateurUn}}{\fpeval{\DenominateurDeux}}% commande interne à ProfCollege (fichier PfCThales.tex) 
					\def\DenomCommun{\the\ppcm}%
					\def\CoeffUn{\fpeval{\DenomCommun/\DenominateurUn}}%
					\def\CoeffDeux{\fpeval{\DenomCommun/\DenominateurDeux}}%
				\def\NbUnite{\fpeval{trunc(\BriqueUn)+1}}%
				\PGCD{\fpeval{\NumerateurUn*\CoeffUn-\NumerateurDeux*\CoeffDeux}}{\DenomCommun}% permettra une éventuelle simplification de la différence  
				%
				\edef\AssemblageCoinBG{u*(-0.5,\fpeval{-5*\useKV[AssemblageFraction]{HBrique}-0.5})}%
				\edef\AssemblageCoinHD{u*(\fpeval{(\NbUnite+1)*\useKV[AssemblageFraction]{LBrique}},0.5)}%
				%
				\ifboolKV[AssemblageFraction]{Vide}%
					{%
					\edef\CommandeFractionMP{%
						for i=1 upto \fpeval{(trunc(\BriqueUn)+1)*\DenominateurUn}:%
	  					BriqueFractionVide(((i-1)/\DenominateurUn,-1),0.5[DodgerBlue,white],\DenominateurUn);%
						endfor;%
						for i=1 upto \fpeval{\NbUnite*\DenominateurDeux}:%
	  					BriqueFractionVide(((i-1)/\DenominateurDeux,-2),0.5[DodgerBlue,white],\DenominateurDeux);%
						endfor;%
						for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
	  					BriqueFractionVide(((i-1)/\DenomCommun,-3),0.5[DodgerBlue,white],\DenomCommun);%
						endfor;%
						for i=1 upto \fpeval{\NbUnite*\DenomCommun}:%
	  					BriqueFractionVide(((i-1)/\DenomCommun,-4),0.5[DodgerBlue,white],\DenomCommun);%
						endfor;%
						AssemblageBriqueFraction("\NbUnite/1");%
						\xintifboolexpr{\the\pgcd==1}%
							{}% la différence obtenue est une fraction irréductible : pas besoin de simplifier 
							{%
							for i=1 upto \fpeval{\NbUnite*\DenomCommun/\the\pgcd}:%
			  					BriqueFractionVide(((i-1)/(\DenomCommun/\the\pgcd),-5),white,\fpeval{\DenomCommun/\the\pgcd});
							endfor;%
							}%
					}%					
					}%
					{%
					\edef\ListeFractions{%
						\NbUnite/1,%
						\BriqueUn,%
						\BriqueDeux,%
						\NumerateurUn*\CoeffUn/\DenomCommun%
						}%
					\edef\CommandeFractionMP{%
						AssemblageBriqueFraction("\ListeFractions");%
						Hachures:=true;%
						for i=1 upto \fpeval{\NumerateurDeux*\CoeffDeux}:%
		  				BriqueFraction(((i-1)/\DenomCommun,-3),CouleurBriqueFraction(\DenomCommun),\DenomCommun);%
						endfor;%
						Hachures:=false;
						for i=1 upto \fpeval{\NumerateurUn*\CoeffUn-\NumerateurDeux*\CoeffDeux}:%
		  				BriqueFraction((\NumerateurDeux/\DenominateurDeux+(i-1)/\DenomCommun,-4),CouleurBriqueFraction(\DenomCommun),\DenomCommun);%
						endfor;%
						\xintifboolexpr{\the\pgcd==1}%
							{}% la différence obtenue est une fraction irréductible : pas besoin de simplifier 
							{%
							for i=1 upto \fpeval{(\NumerateurUn*\CoeffUn-\NumerateurDeux*\CoeffDeux)/\the\pgcd}:%
		  					BriqueFraction((\NumerateurDeux/\DenominateurDeux+(i-1)/(\DenomCommun/\the\pgcd),-5),CouleurBriqueFraction(\fpeval{\DenomCommun/\the\pgcd}),\fpeval{\DenomCommun/\the\pgcd});
							endfor;%
							}%
						}%
					}%
				}%
		}{}%
  	\ifErreurAssembleFraction%
  		% une erreur détectée dans les tests, on ne représente rien
  	\else%
  		\begin{Geometrie}[CoinBG={\AssemblageCoinBG},CoinHD={\AssemblageCoinHD}] 
				\MPBriqueFractionCuisinaire
				currentpen:=pencircle scaled \useKV[AssemblageFraction]{EpaisseurTrait};
				\ifboolKV[AssemblageFraction]{Impression}{Impression:=true;}{}
				u:=\useKV[AssemblageFraction]{Unite};
				HBriqueFraction:=\useKV[AssemblageFraction]{HBrique}; 
				LBriqueFraction:=\useKV[AssemblageFraction]{LBrique}; 
				\CommandeFractionMP;
			\end{Geometrie}
		\fi%
		}%
}%