%%% % Lego %%% \def\filedateLego{2024/09/01}% \def\fileversionLego{0.1a}% \message{-- \filedateLego\space v\fileversionLego}% % \setKVdefault[Lego]{Echelle=1,Couleur=LightSteelBlue,Unite=8,Diviseur=2,Perso=false,Plaque=false,Largeura=2,Largeurb=2,Unique=false}% \defKV[Lego]{ListePerso=\setKV[Lego]{Perso}\xdef\PfCFooLegoListePerso{#1}}% \NewDocumentCommand\ChoixCouleur{m}{% \xdef\ListeCouleurs{Maroon,PeachPuff,Yellow,red,Gray,Crimson,Cornsilk,Purple,Cornsilk,Salmon}% \readlist*\PfCListeCouleurs{\ListeCouleurs}% \xintifboolexpr{\fpeval{#1+1}>\PfCListeCouleurslen}{\textbf{! Vous demandez trop de couleurs !}}{% \MelangeListe{1,2,3,4,5,6,7,8,9,10}{\fpeval{#1+1}}% \setsepchar{,}\ignoreemptyitems% \readlist*\ListeRotation{\faa}% \reademptyitems% \xintFor* ##2 in{\xintSeq{1}{#1}}\do{% \xdef\RetiensCouleur{\ListeRotation[##2]}% \xintifForFirst{\xdef\FooCouleur{\PfCListeCouleurs[\RetiensCouleur]}}{\xdef\FooCouleur{\FooCouleur,\PfCListeCouleurs[\RetiensCouleur]}}% }% }% }% \NewDocumentCommand\Lego{o}{% \useKVdefault[Lego]% \setKV[Lego]{#1}% \xintifboolexpr{\useKV[Lego]{Unite}==1 || \useKV[Lego]{Unique}}{% \xdef\PfCNbCouleurs{1}% }{% \xdef\PfCNbCouleurs{\fpeval{floor(\useKV[Lego]{Unite}/\useKV[Lego]{Diviseur})}}% }% \ifboolKV[Lego]{Perso}{% \setsepchar{,}\ignoreemptyitems% \readlist*\ListeAvantChoixCouleurs{\PfCFooLegoListePerso}% \ChoixCouleur{\ListeAvantChoixCouleurslen}% \reademptyitems% \BuildBarreLego{\FooCouleur}{\PfCFooLegoListePerso}% }{% \ChoixCouleur{\PfCNbCouleurs}% \BuildBarreLego{\FooCouleur}{}% }% }% \NewDocumentCommand\BuildBarreLego{mm}{% \ifluatex% \mplibforcehmode% \begin{mplibcode}% boolean Plaque,Unique; Plaque=\useKV[Lego]{Plaque}; Unique=\useKV[Lego]{Unique}; Echelle=\useKV[Lego]{Echelle}; input PfCLego; % vardef ChoixCouleur(text t)= color Brique[]; nbc:=0; for p_=t: Brique[nbc]=p_; nbc:=nbc+1; endfor; enddef; % vardef ListePerso(text t)= nbperso=0; for p_=t: Diviseurs[nbperso]=p_; nbperso:=nbperso+1; endfor; enddef; % ChoixCouleur(#1); % Longueur=\useKV[Lego]{Unite}; Largeura=\useKV[Lego]{Largeura}; Largeurb=\useKV[Lego]{Largeurb}; Diviseur=\useKV[Lego]{Diviseur}; color BriqueUnite; BriqueUnite=\useKV[Lego]{Couleur}; boolean Perso; Perso=\useKV[Lego]{Perso}; % euler(-45,0,0); if Plaque: lego_height_old:=lego_height; lego_height:=lego_thickness; TR:=(0,1,0); Lego_box(2*Longueur,4*Largeura,Gold); TR:=(0,0,0); lego_height:=lego_height_old; fi; Lego_box(Longueur,Largeura,BriqueUnite); if Unique=false: if Perso: Somme=0; ListePerso(#2); for k=0 upto (nbperso-1): TR:=(0.5*(Longueur-Diviseurs[k]-Somme),Largeura+0.5*(Largeurb-Largeura),0); Lego_box(Diviseurs[k],Largeurb,Brique[k]); Somme:=Somme+2*Diviseurs[k]; endfor; else: for k=0 upto ((Longueur div Diviseur)-1): TR:=(0.5*(Longueur-Diviseur)-k*Diviseur,Largeura+0.5*(Largeurb-Largeura),0); Lego_box(Diviseur,Largeurb,Brique[k]); endfor; fi; fi; picture RetiensLego; RetiensLego=currentpicture; currentpicture:=nullpicture; draw RetiensLego scaled Echelle; \end{mplibcode}% \else% \begin{mpost}% input PfCLego; % vardef ChoixCouleur(text t)= color Brique[]; nbc:=0; for p_=t: Brique[nbc]=p_; nbc:=nbc+1; endfor; enddef; % vardef ListePerso(text t)= nbperso=0; for p_=t: Diviseurs[nbperso]=p_; nbperso:=nbperso+1; endfor; enddef; % ChoixCouleur(#1); % Longueur=\useKV[Lego]{Unite}; Largeur=2; Diviseur=\useKV[Lego]{Diviseur}; color BriqueUnite; BriqueUnite=\useKV[Lego]{Couleur}; boolean Perso; Perso=\useKV[Lego]{Perso}; % euler(-45,0,0); Lego_box(Longueur,Largeur,BriqueUnite); if Perso: Somme=0; ListePerso(#2); for k=0 upto (nbperso-1): TR:=(0.5*(Longueur-Diviseurs[k]-Somme),2,0); Lego_box(Diviseurs[k],2,Brique[k]); Somme:=Somme+2*Diviseurs[k]; endfor; else: for k=0 upto ((Longueur div Diviseur)-1): TR:=(0.5*(Longueur-Diviseur)-k*Diviseur,2,0); Lego_box(Diviseur,2,Brique[k]); endfor; fi; \end{mpost}% \fi% }%