%%% % Représenter des tuiles %%% \def\filedateAireSimple{2026/05/23}% \def\fileversionAireSimple{0.1a}% \message{-- \filedateAireSimple\space v\fileversionAireSimple}% % \NewDocumentCommand\SachetTuile{om}{% \mplibforcehmode% \begin{mplibcode} u:=3mm; dizaine=#2 div 10; unite=#2 mod 10; path reglettediz, regletteunit; reglettediz = (0,0)--u*(1,0)--u*(1,5)--u*(0,5)--cycle; regletteunit = (0,0)--u*(1,0)--u*(1,1)--u*(0,1)--cycle; for k=1 upto dizaine: fill (reglettediz shifted(u*(k-1)*(1.1,0))) withcolor red; trace (reglettediz shifted(u*(k-1)*(1.1,0))); endfor; for k=1 upto unite: if (k mod 2)=1: fill regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-1) div 2)+u*(0,0.1*(k-1))) withcolor Evidence; trace regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-1) div 2)+u*(0,0.1*(k-1))); else: fill regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))) withcolor Evidence; trace regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))); fi; endfor; path Sachet; pair Msa[]; Msa1=(llcorner currentpicture+u*(-2,-1)); Msa2=(lrcorner currentpicture+u*(2,-1)); Msa3=(urcorner currentpicture+u*(2,1)); Msa4=(ulcorner currentpicture+u*(-2,2)); Msa5=(ulcorner currentpicture+u*(-2,1)); Msa6=Msa3+u*(0,0.2); Msa7=Msa5+u*(0,0.2); Sachet=Msa1{dir5}..{dir-5}Msa2{dir93}..{dir87}Msa3--(urcorner currentpicture+u*(2,2))--Msa4--Msa5{dir-87}..{dir-93}cycle; fill Sachet withcolor LightGray withtransparency(1,0.25); trace Sachet withcolor \mpcolor{LightGray!15!black}; fill polygone(Msa3,Msa6,Msa7,Msa5) withcolor \mpcolor{NavyBlue!50!white}; trace Msa5--Msa3 withpen pensquare scaled 1.25 withcolor NavyBlue; trace Msa6--Msa7 withpen pensquare scaled 1.25 withcolor NavyBlue; \end{mplibcode}% }% \NewDocumentCommand\SachetTuileRegroupe{om}{% \StrCut{#2}{*}{\PfMFacteurSachet}{\PfMContenuSachet}% \mplibforcehmode% \begin{mplibcode} u:=3mm; dizaine=\PfMContenuSachet div 10; unite=\PfMContenuSachet mod 10; path reglettediz, regletteunit; reglettediz = (0,0)--u*(1,0)--u*(1,5)--u*(0,5)--cycle; regletteunit = (0,0)--u*(1,0)--u*(1,1)--u*(0,1)--cycle; for k=1 upto dizaine: fill (reglettediz shifted(u*(k-1)*(1.1,0))) withcolor red; trace (reglettediz shifted(u*(k-1)*(1.1,0))); endfor; for k=1 upto unite: if (k mod 2)=1: fill regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-1) div 2)+u*(0,0.1*(k-1))) withcolor Evidence; trace regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-1) div 2)+u*(0,0.1*(k-1))); else: fill regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))) withcolor Evidence; trace regletteunit shifted(u*(dizaine*1.1+0.15,0)+u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))); fi; endfor; picture VersionUne; VersionUne=currentpicture; for k=2 upto \PfMFacteurSachet: trace VersionUne shifted((k-1)*(abs(lrcorner VersionUne-llcorner VersionUne)+3mm),0); endfor; \end{mplibcode}% }% \NewDocumentCommand\SachetTuileDegroupe{om}{% \StrCut{#2}{*}{\PfMFacteurSachet}{\PfMContenuSachet}% \mplibforcehmode% \begin{mplibcode} u:=3mm; dizaine=\PfMContenuSachet div 10; unite=\PfMContenuSachet mod 10; path reglettediz, regletteunit; reglettediz = (0,0)--u*(1,0)--u*(1,5)--u*(0,5)--cycle; regletteunit = (0,0)--u*(1,0)--u*(1,1)--u*(0,1)--cycle; for l=1 upto \PfMFacteurSachet: for k=1 upto dizaine: fill (reglettediz shifted(u*(k-1)*(1.1,0)+u*(l-1)*(dizaine+0.2,0))) withcolor red; trace (reglettediz shifted(u*(k-1)*(1.1,0)+u*(l-1)*(dizaine+0.2,0))); endfor; endfor; picture Unites; Unites=image( for k=1 upto unite: if (k mod 2)=1: fill regletteunit shifted(u*(0,(k-1) div 2)+u*(0,0.1*(k-1))) withcolor Evidence; trace regletteunit shifted(u*(0,(k-1) div 2)+u*(0,0.1*(k-1))); else: fill regletteunit shifted(u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))) withcolor Evidence; trace regletteunit shifted(u*(0,(k-2) div 2)+u*(1.15,0.1*(k-2))); fi; endfor; ); for l=1 upto \PfMFacteurSachet: trace Unites shifted(\PfMFacteurSachet*u*(dizaine+0.2,0)+u*(0.15,0)+(l-1)*(abs(lrcorner Unites-llcorner Unites)+u*0.15,0)); endfor; \end{mplibcode}% }% \setKVdefault[TuileLibre]{EcartH=2mm,EcartV=2mm,Unite=5mm,CouleurPositif=LightGreen,CouleurNegatif=LightCoral,Affichage} \makeatletter \NewDocumentCommand\TuileLibre{som}{% \useKVdefault[TuileLibre]% \setKV[TuileLibre]{#2}% \IfBooleanT{#1}{\setKV[TuileLibre]{Affichage=false}}% \edef\PfCArobaseChaineATuiler{}% \edef\PfC@ExpressionTest{#3}% % On enleve le + initial \StrChar{\PfC@ExpressionTest}{1}[\PfC@CharUn]% \IfStrEq{\PfC@CharUn}{+}{\StrGobbleLeft{\PfC@ExpressionTest}{1}[\PfC@ExpressionTest]}{}% % On substitue les + par * \StrSubstitute{\PfC@ExpressionTest}{+}{*}[\PfC@ExpressionTest]% % On substitue les - par *- \StrSubstitute{\PfC@ExpressionTest}{-}{*-}[\PfC@ExpressionTest]% % On supprime * si elle est en premier (cela indiquant qu'il y a un -) \StrChar{\PfC@ExpressionTest}{1}[\PfC@CharUn]% \IfStrEq{\PfC@CharUn}{*}{\StrGobbleLeft{\PfC@ExpressionTest}{1}[\PfC@ExpressionTest]}{}% %Finalement, ExpressionTest : $\PfC@ExpressionTest$.\par % On découpe \StrCount{\PfC@ExpressionTest}{*}[\PfC@NbSigneEtoile]% \ifnum\PfC@NbSigneEtoile=0\relax% \edef\PfCArobaseChaineATuiler{\PfCArobaseChaineATuiler"\PfC@ExpressionTest",}% \else% \ifnum\PfC@NbSigneEtoile=1\relax% \StrCut{\PfC@ExpressionTest}{*}{\PfC@PartieA}{\PfC@PartieB}% % PartieA : $\PfC@PartieA$\par% % PartieB : $\PfC@PartieB$\par \edef\PfCArobaseChaineATuiler{\PfCArobaseChaineATuiler,"\PfC@PartieA","\PfC@PartieB"}% \else% \edef\PfC@SupportExpression{\PfC@ExpressionTest}% \xintFor* ##1 in {\xintSeq{1}{\PfC@NbSigneEtoile}}\do{% \StrCut{\PfC@SupportExpression}{*}{\PfC@ExpressionAjouteeA}{\PfC@SupportExpression}% % Ajout ##1 : $\PfC@ExpressionAjouteeA$\par% \edef\PfCArobaseChaineATuiler{\PfCArobaseChaineATuiler,"\PfC@ExpressionAjouteeA"}% }% \edef\PfCArobaseChaineATuiler{\PfCArobaseChaineATuiler,"\PfC@SupportExpression"}% \fi% \fi% % Expression ajoutée :$\PfCArobaseChaineATuiler$\par \PfC@BuildTuile{\PfCArobaseChaineATuiler}% }% \NewDocumentCommand\PfC@BuildTuile{m}{% \mplibforcehmode% \setbox1=\hbox{\scriptsize$3^2$} \begin{mplibcode} u:=\useKV[TuileLibre]{Unite}; ecartv:=\useKV[TuileLibre]{EcartV}; ecarth:=\useKV[TuileLibre]{EcartH}; % boolean Affichage; Affichage:=\useKV[TuileLibre]{Affichage}; % decalage:=0; color CouleurP,CouleurN,CouleurXCarreP,CouleurXCarreN,CouleurXP,CouleurXN,CouleurConstanteP,CouleurConstanteN; CouleurP=\useKV[TuileLibre]{CouleurPositif}; CouleurN=\useKV[TuileLibre]{CouleurNegatif}; path TConstante,TX,TXCarre; TXCarre= unitsquare scaled 3u; TX=unitsquare xscaled u yscaled 3u; TConstante=unitsquare scaled u; picture ITConstanteP,ITConstanteN,ITXP,ITXN,ITXCarreP,ITXCarreN; ITXCarreP=image( fill TXCarre withcolor CouleurP; draw TXCarre; ); ITXCarreN=image( fill TXCarre withcolor CouleurN; draw TXCarre; ); ITXP=image( fill TX withcolor CouleurP; draw TX; ); ITXN=image( fill TX withcolor CouleurN; draw TX; ); ITConstanteP=image( fill TConstante withcolor CouleurP; draw TConstante; ); ITConstanteN=image( fill TConstante withcolor CouleurN; draw TConstante; ); lgxcarre=abs(lrcorner ITXCarreP-llcorner ITXCarreP); lgx=abs(lrcorner ITXP-llcorner ITXP); lgconstante=abs(lrcorner ITConstanteP-llcorner ITConstanteP); string labelisation; pair Accog,Accod; for p_=#1: alpha:=scantokens p_; if known alpha: for k=1 upto abs(alpha): trace if alpha>0:ITConstanteP else: ITConstanteN fi shifted (decalage,(k-1)*(lgconstante+ecartv)); endfor; Accog:=(decalage-ecarth/3,0); decalage:=decalage+lgconstante+ecarth; if Affichage: Accod:=(decalage-2*ecarth/3,0); label.bot(TEX("$\underbrace{\hbox to"&decimal(abs(Accod-Accog))&"pt{}}_{\rule{0pt}{\ht1}"&p_&"}$"),iso(Accog,Accod)); fi; else: if substring(-1+length p_,length p_) of p_ = "2": if length p_=3: beta:=1; elseif substring(0,length p_-3) of p_="-": beta:=-1; else: beta:=scantokens(substring(0,length p_-3) of p_); fi; for k=1 upto abs(beta): trace if beta>0:ITXCarreP else: ITXCarreN fi shifted (decalage+(k-1)*(lgxcarre+ecarth),0); endfor; Accog:=(decalage-ecarth/3,0); decalage:=decalage+abs(beta)*(lgxcarre+ecarth); if Affichage: Accod:=(decalage-2*ecarth/3,0); label.bot(TEX("$\underbrace{\hbox to"&decimal(abs(Accod-Accog))&"pt{}}_{"&p_&"}$"),iso(Accog,Accod)); fi; else: if length p_=1: gamma:=1; elseif substring(0,length p_-1) of p_="-": gamma:=-1; else: gamma:=scantokens(substring(0,length p_-1) of p_); fi; for k=1 upto abs(gamma): trace if gamma>0:ITXP else: ITXN fi shifted (decalage+(k-1)*(lgx+ecarth),0); endfor; Accog:=(decalage-ecarth/3,0); decalage:=decalage+abs(gamma)*(lgx+ecarth); if Affichage: Accod:=(decalage-2*ecarth/3,0); % labeloffset:=labeloffset+0.75; label.bot(TEX("$\underbrace{\hbox to"&decimal(abs(Accod-Accog))&"pt{}}_{\rule{0pt}{\ht1}"&p_&"}$"),iso(Accog,Accod)); % labeloffset:=labeloffset-0.75; fi; fi; fi; %draw (0,0)--(nb+50,nb) withcolor CoulFond; %nb:=nb+10; endfor; \end{mplibcode} } \makeatother