%%% % PixelArt %%% \newtoks\toklistePANombre% \def\UpdatetoksPANombre#1\nil{\addtotok\toklistePANombre{"#1",}}% \setKVdefault[ClesPixelArt]{Largeur=29,Hauteur=29,Solution=false,Lettres=ABCDEFGHIJK,Nombres=false,ListeCouleurs={Orange,Red,LightGray,Maroon,Purple,black,black,Plum,Orange,White,White},Unite=5mm,Geant=false,HauteurD=1,LargeurD=1,Complet=false,Numero=1,Separations=false}% \defKV[ClesPixelArt]{ListeNombres=\setKV[ClesPixelArt]{Nombres}}% \NewDocumentCommand\PixelArt{o m}{% \toklistePANombre{}% \useKVdefault[ClesPixelArt]% \setKV[ClesPixelArt]{#1}% \xdef\ListeAvantCouleurs{\useKV[ClesPixelArt]{ListeCouleurs}}% \xdef\ListeAvantNombres{\useKV[ClesPixelArt]{ListeNombres}}% \setsepchar{,}% \readlist*\ListePANombre{\ListeAvantNombres}% \foreachitem\compteur\in\ListePANombre{\expandafter\UpdatetoksPANombre\compteur\nil}% \ifboolKV[ClesPixelArt]{Geant}{% % Découpe en hauteur : \fpeval{\useKV[ClesPixelArt]{Hauteur}/\useKV[ClesPixelArt]{HauteurD}}\\ % Découpe en largeur : \fpeval{\useKV[ClesPixelArt]{Largeur}/\useKV[ClesPixelArt]{LargeurD}-1}}\par \ifboolKV[ClesPixelArt]{Complet}{% \xintFor* ##1 in{\xintSeq{0}{\fpeval{\useKV[ClesPixelArt]{Hauteur}/\useKV[ClesPixelArt]{HauteurD}-1}}}\do{% \xintFor* ##2 in{\xintSeq{0}{\fpeval{\useKV[ClesPixelArt]{Largeur}/\useKV[ClesPixelArt]{LargeurD}-1}}}\do{% \fpeval{##1*\useKV[ClesPixelArt]{Hauteur}/\useKV[ClesPixelArt]{HauteurD}+##2} : \BuildPixelArtGeant{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}{##1}{##2}\\% }% }% }{% \quotient{\fpeval{\useKV[ClesPixelArt]{Numero}-1}}{\fpeval{\useKV[ClesPixelArt]{Hauteur}/\useKV[ClesPixelArt]{HauteurD}}}% \modulo{\fpeval{\useKV[ClesPixelArt]{Numero}-1}}{\fpeval{\useKV[ClesPixelArt]{Hauteur}/\useKV[ClesPixelArt]{HauteurD}}}% % quotient = \the\intquotient -- remainder = \the\remainder : \BuildPixelArtGeant{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}{\the\intquotient}{\the\remainder}% }% }{% \BuildPixelArt{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}% }% }% \NewDocumentCommand\BuildPixelArt{m m m m}{% \ifluatex \mplibforcehmode \begin{mplibcode} largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; largeurd:=\useKV[ClesPixelArt]{LargeurD}; hauteurd:=\useKV[ClesPixelArt]{HauteurD}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres,Separations; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres}; Separations:=\useKV[ClesPixelArt]{Separations}; string BaseLettres; BaseLettres=str #2; numeric EchelleScale; EchelleScale=Unite/5mm; color ColorEntier[],ColFond; n:=0; for p_=#3: n:=n+1; ColorEntier[n]:=p_; endfor; string RetiensNombres[]; if Nombres: n:=0; for p_=#4: n:=n+1; RetiensNombres[n]=p_; endfor; fi; vardef Lecturecsv(expr nomfichier)= for h=hauteur downto 1: string p_; p_=readfrom nomfichier; l:=0; for p=0 step 2 until 2*largeur-2: l:=l+1; if (substring(p,p+1) of p_)="-": else: if Nombres: for m=0 upto (length BaseLettres-1): if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: label(TEX(RetiensNombres[m+1]) scaled EchelleScale,((l-1)*Unite,(h-1)*Unite)); fi; endfor; else: label(TEX(substring(p,p+1) of p_) scaled EchelleScale,((l-1)*Unite,(h-1)*Unite)); fi; if Solution: for m=0 upto (length BaseLettres-1): if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: ColFond:=ColorEntier[m+1]; fi; endfor; if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; fi; trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); fi; endfor; endfor; closefrom nomfichier; enddef; Lecturecsv("#1"); if Separations: drawoptions(withcolor Purple); for k=hauteur step -hauteurd until 0: draw (Unite*(-1,k-0.5)--Unite*(largeur,k-0.5)) withpen pencircle scaled 1.25; endfor; for k=0 step largeurd until largeur: draw (Unite*(k-0.5,hauteur+0.125)--Unite*(k-0.5,-0.875)) withpen pencircle scaled 1.25; endfor; drawoptions(); fi; \end{mplibcode} \else \begin{mpost}[mpsettings={largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres};}] string BaseLettres; BaseLettres=str #2; color ColorEntier[],ColFond; n:=0; for p_=#3: n:=n+1; ColorEntier[n]:=p_; endfor; string RetiensNombres[]; if Nombres: n:=0; for p_=#4: n:=n+1; RetiensNombres[n]=p_; endfor; fi; vardef Lecturecsv(expr nomfichier)= for h=hauteur downto 1: string p_; p_=readfrom nomfichier; l:=0; for p=0 step 2 until 2*largeur-2: l:=l+1; if (substring(p,p+1) of p_)="-": else: if Nombres: for m=0 upto (length BaseLettres-1): if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: label(LATEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite)); fi; endfor; else: label(LATEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite)); fi; if Solution: for m=0 upto (length BaseLettres-1): if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: ColFond:=ColorEntier[m+1]; fi; endfor; if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; fi; trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); fi; endfor; endfor; closefrom nomfichier; enddef; Lecturecsv("#1"); \end{mpost} \fi } \NewDocumentCommand\BuildPixelArtGeant{m m m m m m}{% \ifluatex \mplibforcehmode \begin{mplibcode} largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; largeurd:=\useKV[ClesPixelArt]{LargeurD}; hauteurd:=\useKV[ClesPixelArt]{HauteurD}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres}; string BaseLettres; BaseLettres=str #2; numeric EchelleScale; EchelleScale=Unite/5mm; color ColorEntier[],ColFond; n:=0; for p_=#3: n:=n+1; ColorEntier[n]:=p_; endfor; string RetiensNombres[]; if Nombres: n:=0; for p_=#4: n:=n+1; RetiensNombres[n]=p_; endfor; fi; vardef Lecturecsv(expr nomfichier)= % for h=hauteur-#5*hauteurd downto hauteur-(#5+1)*hauteurd: for h=hauteur downto 1: string p_; p_=readfrom nomfichier; l:=0; if (h>hauteur-(#5+1)*hauteurd) and (h