%%%
% PfCCheque
%%%
\def\filedateCheque{2024/09/03}%
\def\fileversionCheque{0.1}%
\message{-- \filedateCheque\space v\fileversionCheque}%
\newlength{\oldbaseline}
\newlength{\PfCTailleCursive}

\setKVdefault[Cheque]{Sigle=CMF,Banque=Crédit Mathématique de France,Date=\today,Lieu={},Lire=false,Destinataire=Institut Curie,Solution=false,Longueur=15,Taille=\normalsize,Ajust=0pt}

%https://tex.stackexchange.com/questions/406015/defining-macro-gsetlength-as-global-setlength-reliable
\makeatletter
\gdef\gsetlength#1#2{%
  \begingroup
    \setlength\skip@{#2}% Local assignment to a scratch register.
    \global#1=\skip@    % Global assignement to #1;
                        % \relax is not necessary because of the following \endgroup.
  \endgroup             % \skip@ is restored by end of group.
}
\makeatother

\NewDocumentCommand{\Cheque}{om}{%
  \useKVdefault[Cheque]%
  \setKV[Cheque]{#1}%
  \setbox1=\hbox{\useKV[Cheque]{Taille}\myfontCursive abcdefghijklmnopqrstuvwxyz}%
  {\useKV[Cheque]{Taille}\myfontCursive\gsetlength{\oldbaseline}{\baselineskip}\normalsize}%
  \setlength{\PfCTailleCursive}{0.5\ht1+\useKV[Cheque]{Ajust}}%
  \BuildCheque{#2}%
}%

\NewDocumentCommand{\BuildCheque}{m}{%
  \ifluatex
    \mplibforcehmode
    \begin{mplibcode}
      boolean Solution,Lire;
      Solution=\useKV[Cheque]{Solution};
      Lire=\useKV[Cheque]{Lire};
      Longueur=\useKV[Cheque]{Longueur};
      baselinecp=\fpeval{\oldbaseline};
      %
      pair A,B,C,D,M[],N[];
      A=(0,0);
      B-A=u*(Longueur,0);
      C-B=u*(0,5);
      D-C=A-B;
      %
      M1=1/3[D,A];
      %
      picture Payez;
      Payez=image(
      label.rt(TEX("Payez contre ce chèque"),M1);
      );
      %
      M20=(xpart(M1),ypart(llcorner Payez));
      M2-M20=(0,-baselinecp);
      M3-M2=u*(0,-0.5);
      M4-M3=M2-M1;
      M5-M4=u*(0.4*Longueur,-0.25);
      M6-M4=u*(0,-0.25)+u*(0.5,0);
      M7-M6=u*(2,0);
      %
      A:=(xpart(M4),ypart(M6)-1u);
      B:=A+C-D;
      %
      N1=1/2[M1,M2]+0.8*(B-A);
      N2-N1=M2-M1;
      N3-N2=0.18*(B-A);
      N4-N3=N1-N2;
      drawoptions(withcolor NavyBlue);
      picture BaseLettre;
      %%%%%%%%%%%%%%%% 
      fill polygone(A,B,C,D) withcolor 0.8[LightSteelBlue,white];
      trace polygone(A,B,C,D);
      draw Payez;
      label.rt(TEX("{\sffamily \Huge \useKV[Cheque]{Sigle}}"),D+u*(0,-0.5));
      label.rt(TEX("{\sffamily \useKV[Cheque]{Banque}}"),D+u*(0,-1));
      trace (lrcorner Payez)--(0.75[(xpart(M1),ypart(lrcorner Payez)),(xpart(M1+B-A),ypart(lrcorner Payez))]);
      label.rt(TEX("\tiny non endossable sauf au profit d'une banque ou d'un établissement assimilé."),M1+u*(0,-0.300));
      trace 1/90[M2,M2+B-A]--(0.75[M2,M2+B-A]);
      label.rt(TEX("À \useKV[Cheque]{Destinataire}"),M3);
      trace 1/45[M3+u*(0,-0.2),M3+u*(0,-0.2)+B-A]--(0.75[M3+u*(0,-0.2),M3+u*(0,-0.2)+B-A]);
      fill polygone(N1,N2,N3,N4) withcolor white;
      trace polygone(N1,N2,N3,N4) withpen pencircle scaled 1.2 withcolor NavyBlue;
      if Lire=false:
      label.rt(TEX("\si{\EuRo}~#1"),iso(N1,N2));
      else:
      if Solution:
      label.rt(TEX("\si{\EuRo}~\num{#1}"),iso(N1,N2));
      fi;
      fi;
      label.rt(TEX("À~\hbox to"&decimal(Longueur/5)&"cm{\hrulefill}\quad Le~\hbox to"&decimal(Longueur/5)&"cm{\hrulefill}"),M5);
      label.top(TEX("\Huge \si{\EuRo}uro"),iso(N4,N1)+u*(0,1));
      label(TEX("\tiny « à régler exclusivement en euros »"),iso(N4,N1)+u*(-0.5,1));
      label(TEX("\ChoixAlea{100000}{999999}{\numcheque}\numcheque"),iso(M6,M7));
      trace cotationmil(M6,M7,2.5mm,25,TEX("\scriptsize chèque \no"));
      %%
%      drawoptions(withcolor red);
%      draw (llcorner Payez)--(llcorner Payez+B-A);
%      draw M2--(M2+B-A);
%      drawoptions();
      picture Sous;
      Sous=image(%
      label(TEX("\begin{minipage}{\fpeval{0.75*"&decimal(Longueur)&"}cm}
        \hspace{"&decimal(abs(lrcorner Payez-llcorner Payez))&"pt}\myfontCursive\useKV[Cheque]{Taille}\Ecriture{#1}~euros
      \end{minipage}"),(0,0));
      );
      pair PointBase,PointTest,Decalage;
      PointBase=1/2[M20,M2+(u*0.75Longueur,0)];
      PointTest=(0,0);%
      if abs(llcorner Sous-ulcorner Sous)>baselinecp:
      Decalage=(8pt,\fpeval{\PfCTailleCursive});
      else:
      Decalage=(8pt,2*\fpeval{\PfCTailleCursive});
      fi;
      if Lire:
      draw Sous shifted (PointBase-PointTest+Decalage);
      else:
      if Solution:
      draw Sous shifted (PointBase-PointTest+Decalage);
      fi;
      fi;      
    \end{mplibcode}
  \fi%
}%