%%%
% Engrenages
%%%
\newtoks\tokPfCEngrenages%
\def\UpdatetoksEngrenages#1/#2\nil{\addtotok\tokPfCEngrenages{#1,#2,}}%

\setKVdefault[Engrenages]{Couleur=LightSteelBlue,Unite=3mm}

\NewDocumentCommand\Engrenages{o m}{%
  \tokPfCEngrenages{}
  \useKVdefault[Engrenages]%
  \setKV[Engrenages]{#1}%
  \setsepchar[*]{,*/}%
  \ignoreemptyitems
  \readlist*\ListePfCEngrenages{#2}%
  \setsepchar{,}
  \xdef\PfCFooEngrenages{}
  % \foreachitem\compteur\in\ListePfCEngrenages{\expandafter\UpdatetoksEngrenages\compteur\nil}%
  \foreachitem\compteur\in\ListePfCEngrenages{%
    \xdef\PfCFooEngrenages{\PfCFooEngrenages \ListePfCEngrenages[\compteurcnt,1],\ListePfCEngrenages[\compteurcnt,2],}%
  }%
  \BuildEngrenages{\PfCFooEngrenages}%
}%

\NewDocumentCommand\BuildEngrenages{m}{%
  \ifluatex
  \mplibforcehmode
  \begin{mplibcode}
    input PfCEngrenages;
    
    u:=\useKV[Engrenages]{Unite};
    CouleurEngrenage=\useKV[Engrenages]{Couleur};
    
    vardef LectureDonnees(text t)=
    n:=0;k=0;l=0;
    for p_=t:
    n:=n+1;
    if (n mod 2)=0:
    l:=l+1;
    Zz[l]=p_;
    else:
    k:=k+1;
    Mm[k]=p_;
    fi;
    endfor;
    enddef;
    
    LectureDonnees(#1);

    pair K;
    K=(0,0);

    trace Engrenage(Mm[1],Zz[1],(0,0));
    
    Signe=1;
    
    for w=2 upto (n div 2):
    K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0);
    AngleRot[w]:=360/(2*Zz[w]);
    if w=2:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    if (Zz[w] mod 2)=0:
    Signe:=Signe*(-1);
    fi;
    else:
    if (Zz[w] mod 2)=1:
    if Signe=-1:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
    else:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    fi;
    else:
    Signe:=Signe*(-1);
    if Signe=1:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
    else:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    fi;
    fi;
    fi;
    endfor;
  \end{mplibcode}
  \else
  \begin{mpost}[mpsettings={input PfCEngrenages;u:=\useKV[Engrenages]{Unite};CouleurEngrenage=\useKV[Engrenages]{Couleur};}]
    vardef LectureDonnees(text t)=
    n:=0;k=0;l=0;
    for p_=t:
    n:=n+1;
    if (n mod 2)=0:
    l:=l+1;
    Zz[l]=p_;
    else:
    k:=k+1;
    Mm[k]=p_;
    fi;
    endfor;
    enddef;
    
    LectureDonnees(#1);

    pair K;
    K=(0,0);

    trace Engrenage(Mm[1],Zz[1],(0,0));
    
    Signe=1;
    
    for w=2 upto (n div 2):
    K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0);
    AngleRot[w]:=360/(2*Zz[w]);
    if w=2:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    if (Zz[w] mod 2)=0:
    Signe:=Signe*(-1);
    fi;
    else:
    if (Zz[w] mod 2)=1:
    if Signe=-1:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
    else:
    trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    fi;
    else:
    Signe:=Signe*(-1);
    if Signe=1:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180);
    else:
trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]);
    fi;
    fi;
    fi;
    endfor;
  \end{mpost}
  \fi
}