%%%
% Numerations anciennes
%%%
\def\filedateNumAnciennes{2024/08/04}%
\def\fileversionNumAnciennes{0.1}%
\message{-- \filedateNumAnciennes\space v\fileversionNumAnciennes}%
%
\setKVdefault[NumerationAncienne]{Couleur=black}%

\NewDocumentCommand\Chinoise{om}{%
  \useKVdefault[NumerationAncienne]%
  \setKV[NumerationAncienne]{#1}%
  \BuildNumerationChinoise{#2}%
}%

\NewDocumentCommand\Maya{om}{%
  \useKVdefault[NumerationAncienne]%
  \setKV[NumerationAncienne]{#1}%
  \BuildNumerationMaya{#2}%
}%

\NewDocumentCommand\Babylone{om}{%
  \useKVdefault[NumerationAncienne]%
  \setKV[NumerationAncienne]{#1}%
  \BuildNumerationBabylone{#2}%
}%

\NewDocumentCommand\BuildNumerationChinoise{m}{%
  \ifluatex
    \mplibnumbersystem{double}%
    \mplibforcehmode
    \begin{mplibcode}
      color CouleurTrace;
      CouleurTrace=\useKV[NumerationAncienne]{Couleur};
      drawoptions(withpen pencircle scaled 1.5 withcolor CouleurTrace);
      ecart:=0.15u;
      vardef Chiffre(expr t,a)=
      picture Chinois;
      Chinois=image(
      if t<6:
        if (a mod 2)=1:
          if (t mod 2)=0:
            for k=0 upto t-1:
              draw ((0,0)--(u,0)) shifted(k*(0,ecart));
            endfor;
          else:
            for k=1 upto t:
              draw ((0,0)--(u,0)) shifted((k-1)*(0,ecart));
            endfor;
          fi;
        else:
          for k=0 upto t-1:
            draw ((0,0)--(0,u)) shifted(k*(ecart,0));
          endfor;
        fi;
      else:%t>5
      if (a mod 2)=1:
      for k=1 upto (t-5):
      draw ((0,0)--(1u,0)) shifted((k-1)*(0,ecart));
      endfor;
      draw ((0.5u,(t-5-1)*ecart))--(0.5u,u);
      else:
      if ((t-5) mod 2)=0:
      for k=1 upto ((t-5) div 2):
      draw ((0,0)--(0,u)) shifted((3*ecart,0)+(k-1)*(ecart,0));
      draw ((0,0)--(0,u)) shifted((2*ecart,0)-(k-1)*(ecart,0));
      endfor;
      else:
      draw ((2.5*ecart,0)--(2.5*ecart,u));
      for k=1 upto ((t-5) div 2):
      draw ((0,0)--(0,u)) shifted((2.5*ecart,0)+k*(ecart,0));
      draw ((0,0)--(0,u)) shifted((2.5*ecart,0)-k*(ecart,0));
      endfor;
      fi;
      draw ((0,u)--(5*ecart,u));
      fi;
      fi;
      );
      if (a mod 2)=0:
      Chinois:=Chinois shifted(u*(0.5,0.5)-center Chinois);
      fi;
      Chinois
      enddef;
      % On détermine l'exposant de la base le plus petit tel que 10^a>nombre
      exposant=0;
      Power=1;
      forever: exitif Power>#1;
      exposant:=exposant+1;
      Power:=1 for l=1 upto exposant:*10 endfor;
      endfor;
      % On détermine les chiffres
      Depart=#1;
      %
      for k=exposant-1 downto 0:
      Power:=1 for l=1 upto k:*10 endfor;
      Retiens:=Depart div Power;
      RetiensChiffre[exposant-1-k]=Retiens;
      Depart:=Depart-(Retiens*Power);
      endfor;
      %On affiche
      for k=exposant-1 downto 0:
      draw Chiffre(RetiensChiffre[exposant-1-k],k) shifted((exposant-1-k)*7*ecart,0);
      endfor;
    \end{mplibcode}
    \mplibnumbersystem{scaled}%
  \fi%
}%

\NewDocumentCommand\BuildNumerationMaya{m}{%
  \ifluatex
    \mplibnumbersystem{double}%
    \mplibforcehmode
    \begin{mplibcode}
      color CouleurTrace;
      CouleurTrace=\useKV[NumerationAncienne]{Couleur};
      drawoptions(withpen pencircle scaled 1.5 withcolor CouleurTrace);
      %
      picture MayaZero;
      MayaZero=image(
      path cc,cd;
      cc=cercles((0,0),0.3u);
      cc:=cc yscaled 0.4;
      cd=(point(0.45*length cc) of cc){dir-30}..{dir30}(point(0.05*length cc) of cc);
      trace cd;
      trace (point(0.2*length cc) of cc){dir-130}..{dir-50}(point(0.65*length cd) of cd);
      trace (point(0.25*length cc) of cc){dir-130}..{dir-50}(point(0.5*length cd) of cd);
      trace (point(0.3*length cc) of cc){dir-130}..{dir-50}(point(0.35*length cd) of cd);      
      trace cc;
      );
      % 
      vardef Chiffre(expr t,a)=
      picture Maya;
      Maya=image(%
        if t=0:
          trace MayaZero;
          else:
          drawoptions(withpen pensquare);
          for k=1 upto (t div 5):
          draw ((-0.3u,0)--(0.3u,0)) shifted ((k-1)*u*(0,0.15));
          endfor;
          drawoptions();
          if (t mod 5)>0:
          if ((t mod 5) mod 2)=0:
          for k=0 upto (t mod 5)-1:
          fill (fullcircle scaled 1mm) shifted(k*u*(0.15,0)+(t div 5)*u*(0,0.15)-0.5*u*((t mod 5)-1)*(0.15,0));
          endfor;
          else:
          for k=0 upto ((t mod 5)-1):
          fill (fullcircle scaled 1mm) shifted((t div 5)*u*(0,0.15)+k*u*(0.15,0)-0.5*((t mod 5)-1)*u*(0.15,0));
          endfor;
          fi;
          fi;
        fi;
      );
      Maya
      enddef;
      % On détermine l'exposant de la base le plus petit tel que 10^a>nombre
      exposant=0;
      Power=1;
      if #1=0:
      exposant:=1;
      else:
      forever: exitif Power>#1;
      exposant:=exposant+1;
      Power:=1 for l=1 upto exposant:*20 endfor;
      endfor;
      fi;
      % On détermine les chiffres
      Depart=#1;
      %
      for k=exposant-1 downto 0:
      Power:=1 for l=1 upto k:*20 endfor;
      Retiens:=Depart div Power;
      RetiensChiffre[exposant-1-k]=Retiens;
      Depart:=Depart-(Retiens*Power);
      endfor;
      % On affiche
      for k=exposant-1 downto 0:
      draw Chiffre(RetiensChiffre[exposant-1-k],exposant-1-k) shifted(u*(0,-(exposant-1-k)*4*0.25));
      endfor;
    \end{mplibcode}
    \mplibnumbersystem{scaled}%
  \fi%
}%

\NewDocumentCommand\BuildNumerationBabylone{m}{%
  \ifluatex%
    \mplibnumbersystem{double}%
    \mplibforcehmode%
    \begin{mplibcode}
      u:=8mm;
      color CouleurTrace;
      CouleurTrace=\useKV[NumerationAncienne]{Couleur};
      drawoptions(withpen pencircle scaled 1.5 withcolor CouleurTrace);
      %
      picture Chevron,Clou;
      Chevron=image(%
      draw chemin(u*(0.4,0.4),(0,0),u*(0.4,-0.4));%
      draw segment(u*(0.15,0.15),u*(0.15,-0.15));%
      );%
      Clou=image(%
      draw chemin(u*(0.4,0.3),u*(0.3,0.4),u*(0.5,0.4),u*(0.4,0.3),u*(0.4,-0.4));
      );
      vardef Chiffre(expr t)=
      picture Babylone;
      Babylone=image(%
      diz:=t div 10;
      un:=t-diz*10;
      k:=0;
      forever: exitif k>diz-1;
      g:=k div 2;
      h:=k mod 2;
      draw Chevron shifted(u*(0.5*h,g));
      k:=k+1;
      endfor;
      %
      ecartH:=ecartH+ecart+ecartu+1;% pour avoir un ecart entre les divers exposants
      %
      k:=0;
      ecart:=if diz<2: diz else:2 fi;
      forever: exitif k>un-1;
      g:=k div 3;
      h:=k mod 3;
      draw Clou shifted(u*(0.5*(h+ecart),g));
      k:=k+1;
      endfor;
      ecartu:=if un<3: un else:3 fi;
%      label.top(TEX("e="&decimal(ecart)&";eu"&decimal(ecartu)),u*(ecartH*0.5,5));
      );
      Babylone
      enddef;
      % On détermine l'exposant de la base le plus petit tel que 60^a>nombre
      exposant=0;
      Power=1;
      forever: exitif Power>#1;
      exposant:=exposant+1;
      Power:=1 for l=1 upto exposant:*60 endfor;
      endfor;
      % On détermine les chiffres
      Depart=#1;
      %
      if Depart=0:
      RetiensChiffre[0]=Retiens;
      else:
      for k=exposant-1 downto 0:
      Power:=1 for l=1 upto k:*60 endfor;
      Retiens:=Depart div Power;
      RetiensChiffre[exposant-1-k]=Retiens;
      Depart:=Depart-(Retiens*Power);
      endfor;
      fi;
      % On affiche
      ecart:=0;
      ecartu:=0;
      ecartH:=0;
      for k=exposant-1 downto 0:
      gg:=RetiensChiffre[exposant-1-k];
      draw Chiffre(gg) shifted(u*(ecartH*0.5,0));
%      draw (u*(ecartH*0.5,0)--u*(ecartH*0.5,5)) withcolor blue;
      endfor;
    \end{mplibcode}
    \mplibnumbersystem{scaled}%
  \fi%
}%