%%%
% Op\'erations pos\'es à trou
%%%
\def\filedateOpTrou{2024/08/04}%
\def\fileversionOpTrou{0.1}%
\message{-- \filedateOpTrou\space v\fileversionOpTrou}%
%
%% D'après https://tex.stackexchange.com/questions/277246/drawing-a-circle-around-the-numbers-in-xlop-package

\newcommand\PfCministrut{\rule{0pt}{1.6ex}}% Top strut

\newcommand\PfCchiffre[2]{\tikz[remember picture] \node[inner sep=0pt](#1){#2};}

\newcommand\PfCentoure[2]{%
\ifboolKV[ClesOperations]{Gabarit}{%
\tikz[remember picture,overlay] \node[preaction={draw={\useKV[ClesOperations]{CouleurCadre}},ultra thick,opacity=1,fill=white,
transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};
}{\tikz[remember picture,overlay] \node[preaction={draw={\useKV[ClesOperations]{CouleurCadre}},ultra thick,opacity=1,
transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};
}
}

\newcommand\PfCentouredys[2]{\tikz[remember picture,overlay] \node[preaction={draw={\useKV[ClesOperations]{CouleurCadre}},opacity=1,
transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,inner sep=4pt,fit=(#1.center)(#2.center)]{};}%ultra thick,

\newcommand\PfCchiffreclip[2]{%
  \ifboolKV[ClesOperations]{Solution}{%
    \xintFor* ##1 in{\xintSeq{1}{\PfCListeTroulen}}\do{%
      \xintifboolexpr{\thedivxlop==\PfCListeTrou[##1]}{%
        \color{PfCSolOp}}{}%
    }%
  }{}%
  \tikz[remember picture] \node[inner sep=0pt](#1){#2};%
}%

\newcommand\PfCentoureclip[2]{\tikz[remember picture,overlay] \node[preaction={draw={\useKV[ClesOperations]{CouleurCadre}},ultra thick,opacity=1,
transform canvas={xshift=0em,yshift=0em}},rectangle,fill=PfCSolOp,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};}

\newcounter{divxlop}%
%\newcounter{mulxlop}%
%\newcounter{addxlop}%
%\newcounter{subxlop}%

\setKVdefault[ClesOperations]{Solution=false,CouleurCadre=LightSteelBlue,CouleurSolution=red,CouleurFond=white,CouleurVirgule=white,CouleurVirguleSol=red,Listes=false,Gabarit=false,CouleursColorees={blue,green,red},Retenue,Liste={}}%
\defKV[ClesOperations]{Liste=\ifempty{#1}{}{\setKV[ClesOperations]{Listes}\xdef\PfCFooListeTrou{#1}}}%

\newcommand\Division[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \ifboolKV[ClesOperations]{Listes}{%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\PfCListeTrou{\PfCFooListeTrou}%
    \reademptyitems%
    %,displayintermediary=all
    \opidiv[lineheight=1.75em,columnwidth=1.5em,voperator=bottom,operandstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},intermediarystyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},remainderstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop}]{#2}{#3}%
    \ifboolKV[ClesOperations]{Solution}{}{%
      \foreachitem\compteur\in\PfCListeTrou{%
        \xdef\PfCRetiensTrou{\PfCListeTrou[\compteurcnt]}%
        \PfCentoureclip{A\PfCRetiensTrou}{A\PfCRetiensTrou}%
      }%
    }%
  }{%
      \opidiv[lineheight=1.5em,columnwidth=1.25em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},remainderstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop}]{#2}{#3}%
    \foreach \i in {1,...,\thedivxlop}{%
      \PfCentoure{A\i}{A\i}%
    }%
  }%
}%

\newcommand\DivisionD[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirguleSol}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opdiv[decimalsepsymbol={,},lineheight=1.5em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},remainderstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \foreach \i in {1,...,\thedivxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

\newcommand\Multiplication[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirguleSol}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \ifboolKV[ClesOperations]{Listes}{%
  \setsepchar{,}\ignoreemptyitems%
  \readlist*\PfCListeTrou{\PfCFooListeTrou}%
  \reademptyitems%
  \begingroup
  \setlength{\baselineskip}{1.75em}
  \StrLen{#3}[\PfCLongueurFacteurDeux]
  \ifnum\PfCLongueurFacteurDeux=1\relax
  \opset{lineheight=\baselineskip} % nécessaire
  \else
  \opset{lineheight=\baselineskip,displayintermediary=all,displayshiftintermediary=all} % nécessaire
  \fi
  \opmul[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom,operandstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},intermediarystyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \endgroup%
  \ifboolKV[ClesOperations]{Solution}{}{%
    \foreachitem\compteur\in\PfCListeTrou{%
      \xdef\PfCRetiensTrou{\PfCListeTrou[\compteurcnt]}%
      \PfCentoureclip{A\PfCRetiensTrou}{A\PfCRetiensTrou}%
    }%
  }%
  }{%
  \begingroup
  \setlength{\baselineskip}{2em}
  \StrLen{#3}[\PfCLongueurFacteurDeux]
  \ifnum\PfCLongueurFacteurDeux=1\relax
  \opset{lineheight=\baselineskip} % nécessaire
  \else
  \opset{lineheight=\baselineskip,displayintermediary=all,displayshiftintermediary=all} % nécessaire
  \fi
  \opmul[decimalsepsymbol={,},lineheight=2em,columnwidth=1.5em,voperator=bottom,intermediarystyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
  \foreach \i in {1,...,\thedivxlop}{%
     \PfCentoure{A\i}{A\i}%
  }%
  \endgroup
  }
}%

\newcommand\Addition[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\opset{carryadd,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirguleSol}}}{\opset{carryadd=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \ifboolKV[ClesOperations]{Listes}{%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\PfCListeTrou{\PfCFooListeTrou}%
    \reademptyitems%
    \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom,operandstyle.1=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},operandstyle.2=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
    \ifboolKV[ClesOperations]{Solution}{}{%
      \foreachitem\compteur\in\PfCListeTrou{%
        \xdef\PfCRetiensTrou{\PfCListeTrou[\compteurcnt]}%
        \PfCentoureclip{A\PfCRetiensTrou}{A\PfCRetiensTrou}%
      }%
    }%
  }{%
    \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom,resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}
    \foreach \i in {1,...,\thedivxlop}{%
      \PfCentoure{A\i}{A\i}%
    }%
  }%
}%

\newcommand\Soustraction[3][]{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\opset{carrysub,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirguleSol}}}{\opset{carrysub=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \ifboolKV[ClesOperations]{Listes}{%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\PfCListeTrou{\PfCFooListeTrou}%
    \reademptyitems%
    \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom,operandstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle=\stepcounter{divxlop}\PfCchiffreclip{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
    \ifboolKV[ClesOperations]{Solution}{}{%
      \foreachitem\compteur\in\PfCListeTrou{%
        \xdef\PfCRetiensTrou{\PfCListeTrou[\compteurcnt]}%
        \PfCentoureclip{A\PfCRetiensTrou}{A\PfCRetiensTrou}%
      }%
    }%
  }{%
    \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom,resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}%
    \foreach \i in {1,...,\thedivxlop}{%
      \PfCentoure{A\i}{A\i}
    }%
  }%
}%

\NewDocumentCommand\MultiAddition{om}{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{divxlop}{0}%
  \ifboolKV[ClesOperations]{Solution}{\opset{carryadd,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirguleSol}}}{\opset{carryadd=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}%
  \opmanyadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,vmanyoperator=bottom,resultstyle=\stepcounter{divxlop}\color{PfCSolOp}\PfCchiffre{A\thedivxlop},resultstyle.d=\color{PfCCouleurVirgule}]#2
  \foreach \i in {1,...,\thedivxlop}{%
    \PfCentoure{A\i}{A\i}%
  }%
}%

%%%%%%%%%%%%%%%%%%%%% Colorees %%%%%%%%%%%%%%%%%%%
% Merci JCC
%%% Seule ligne à modifier selon la convenance %%%
\newcommand\couleurs{blue,red,green,blue,red,green,blue,red,green,blue,red,green}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcounter{PfCcarry}
\setcounter{PfCcarry}{0}

\def\blaa{1}

\makeatletter
\NewDocumentCommand\EncadreRetenue{m}{%
\stepcounter{PfCcarry}%
 \setlength{\fboxsep}{1pt}%
 \ifnum\thePfCcarry<\fpeval{\PfMLongRetenue}\relax%
  \ifboolKV[ClesOperations]{Solution}{#1}{\begin{mplibcode}draw unitsquare scaled \mpdim{1em} dashed evenly withcolor Purple;\end{mplibcode}}%
\fi
}

\NewDocumentCommand\EncadreRetenueSous{m}{%
  \setlength{\fboxsep}{1pt}%
  \xdef\blab{#1}%
  \ifx\blab\blaa\relax\fbox{\ifboolKV[ClesOperations]{Solution}{}{\color{white}}\tiny#1}\fi
}
\makeatother
\newcommand\PfCchiffrer[2]{\tikz[remember picture] \node[inner sep=0pt](#1){\tiny#2};}

\newcount\numint%
\newcount\indint%
\newcount\ind%
\def\nnil{\nil}%
\def\ExtraitCouleurs{%
   \ind=0%
   \expandafter\ExtraitCouleursAux\couleurs,\nil,%
}%
\def\ExtraitCouleurscp#1{%
   \ind=#1%
   \expandafter\ExtraitCouleursAux\couleurs,\nil,%
}%
\def\ExtraitCouleursAux#1,{%
  \def\arg{#1}%
  \ifx\arg\nnil%
     \edef\cmax{\the\ind}%
   \else%
     \def\couleur{#1}%
     \stepcounter{coulxlop}%
     \stepcounter{coulxlopa}%
     \stepcounter{coulxlopd}%
     \expandafter\edef\csname PfCOpCouleurs\Roman{coulxlop}\endcsname{\couleur}%
     \expandafter\edef
     \csname op@operandstyle.1.\the\numexpr\ind+1\endcsname{%
       \noexpand\PfCchiffre{CA\Roman{PfCNumOp}\thecoulxlop}%
     }%
     \expandafter\edef
     \csname op@operandstyle.2.\the\numexpr\ind+1\endcsname{%
       \noexpand\PfCchiffre{CB\Roman{PfCNumOp}\thecoulxlopa}%
     }%
     \expandafter\edef
     \csname op@resultstyle.\the\numexpr\ind+1\endcsname{%
       \noexpand\PfCchiffre{CC\Roman{PfCNumOp}\thecoulxlopd}%
     }%
     \numint = \numexpr\ind+1
     \indint = 1
     \ConstruitIntermediaire
     \advance\ind by 1
     \expandafter\ExtraitCouleursAux
   \fi
}
\def\ConstruitIntermediaire{%
  \ifnum\numint>0
    \stepcounter{coulxlopi}%
    \expandafter\edef\csname PfCOpCouleursi\Roman{coulxlopi}\endcsname{\couleur}%
     \expandafter\edef
     \csname op@intermediarystyle.\the\numint.\the\indint\endcsname{%
       \noexpand\PfCchiffre{CD\Roman{PfCNumOp}\thecoulxlopi}%
     }%
     \advance\indint by 1
     \advance\numint by -1
     \expandafter\ConstruitIntermediaire
   \fi
 }
 \def\ConstruitRemainder{%
  \ifnum\numint>0
    \stepcounter{coulxlopidiv}%
    \expandafter\edef\csname PfCOpCouleursid\Roman{coulxlopidiv}\endcsname{\couleur}%
     \expandafter\edef
     \csname op@remainderystyle.\the\numint.\the\indint\endcsname{%
       \noexpand\PfCchiffre{CE\Roman{PfCNumOp}\thecoulxlopidiv}%
     }%
     \advance\indint by 1
     \advance\numint by -1
     \expandafter\ConstruitRemainder
   \fi
 }

\newcounter{coulxlop}%
\newcounter{coulxlopi}%
\newcounter{coulxlopa}%
\newcounter{coulxlopd}%
\newcounter{coulxlopidiv}%
\newcounter{coulxlopcoul}%
\newcounter{PfCNumOp}%
\setcounter{PfCNumOp}{0}%

\NewDocumentCommand\PfCentoureColor{mm}{%
  \expandafter\edef\csname RetiensCouleur\endcsname{\csname PfCOpCouleurs\Roman{coulxlopcoul}\endcsname}\colorlet{CouleurCadre}{\RetiensCouleur}%
  \ifboolKV[ClesOperations]{Gabarit}{%
    \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},fill=white,ultra thick,opacity=1,transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};%
  }{%
    \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},ultra thick,opacity=1,transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};%
  }%
}%

\NewDocumentCommand\PfCentoureColorR{mm}{%
  \expandafter\edef\csname RetiensCouleur\endcsname{\csname PfCOpCouleurs\Roman{coulxlopcoul}\endcsname}\colorlet{CouleurCadre}{\RetiensCouleur}%
  \ifboolKV[ClesOperations]{Gabarit}{
\tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},fill=white,ultra thick,opacity=1, transform canvas={xshift=0em,yshift=0em}},fill=PfCSolOp,rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};
}{
  \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},ultra thick,opacity=1, transform canvas={xshift=0em,yshift=0em}},fill=PfCSolOp,rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};
}
}
\NewDocumentCommand\PfCentoureColorI{mm}{%
  \expandafter\edef\csname RetiensCouleur\endcsname{\csname PfCOpCouleursi\Roman{coulxlopcoul}\endcsname}\colorlet{CouleurCadre}{\RetiensCouleur}%
  \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},ultra thick,opacity=1,
    transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};}

\NewDocumentCommand\PfCentoureColorIR{mm}{%
  \expandafter\edef\csname RetiensCouleur\endcsname{\csname PfCOpCouleursi\Roman{coulxlopcoul}\endcsname}\colorlet{CouleurCadre}{\RetiensCouleur}%
    \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},ultra thick,opacity=1,
    transform canvas={xshift=0em,yshift=0em}},rectangle,fill=PfCSolOp,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};
}%

\NewDocumentCommand\PfCentoureColorIdiv{mm}{%
  \expandafter\edef\csname RetiensCouleur\endcsname{\csname PfCOpCouleursid\Roman{coulxlopcoul}\endcsname}\colorlet{CouleurCadre}{\RetiensCouleur}%
  \tikz[remember picture,overlay] \node[preaction={draw={CouleurCadre},ultra thick,opacity=1,
transform canvas={xshift=0em,yshift=0em}},rectangle,rounded corners,ultra thick,inner sep=.55em,fit=(#1.center)(#2.center)]{};}

\makeatletter
\long\def\ifnodedefined#1#2#3{%
    \@ifundefined{pgf@sh@ns@#1}{#3}{#2}%
}
\makeatother

\NewDocumentCommand\MultiplicationColore{omm}{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setsepchar{,}\ignoreemptyitems%
  \xdef\PfMRetiensColorees{\useKV[ClesOperations]{CouleursColorees}}%
  \readlist*\ListeTestTC{\PfMRetiensColorees}%
  \reademptyitems%
  \itemtomacro\ListeTestTC[1]\PfMCouleurA%
  \itemtomacro\ListeTestTC[2]\PfMCouleurB%
  \itemtomacro\ListeTestTC[3]\PfMCouleurC%
  \def\couleurs{\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \setcounter{coulxlop}{0}%
  \setcounter{coulxlopa}{0}%
  \setcounter{coulxlopd}{0}%
  \setcounter{coulxlopi}{0}%
  \setcounter{coulxlopcoul}{0}%
  \stepcounter{PfCNumOp}%
  \StrCut{#2}{.}\PfMRien\PfMNbDeciA%
  \StrCut{#3}{.}\PfMRien\PfMNbDeciB%
  \StrLen{\PfMNbDeciA}[\PfMLongDeciA]%
  \StrLen{\PfMNbDeciB}[\PfMLongDeciB]%
  \ifnum\fpeval{max(\PfMLongDeciA,\PfMLongDeciB)}=0\relax%
  \xdef\PfMAjoutDeci{0}%
  \ExtraitCouleurs%
  \else%
    \xdef\PfMAjoutDeci{1}%
  \ExtraitCouleurscp{\fpeval{-(\PfMLongDeciA+\PfMLongDeciB)-1}}%
  \fi%
  \begingroup%
  \setlength{\baselineskip}{1.75em}%
  \StrLen{#3}[\PfCLongueurFacteurDeux]%
  \ifnum\PfCLongueurFacteurDeux=1\relax%
  \opset{lineheight=\baselineskip}% nécessaire
  \else%
    \opset{lineheight=\baselineskip,displayintermediary=all,displayshiftintermediary=all} % nécessaire
  \fi%
  \opmul[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
  \endgroup%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlop}{%
    \ifnum\i>\fpeval{\PfMLongDeciA+\PfMLongDeciB+\PfMAjoutDeci}\relax%
    \stepcounter{coulxlopcoul}%
  \else%
    \setcounter{coulxlopcoul}{0}%
  \fi%
     \ifnodedefined{CA\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul=0\relax%
         \PfCentoure{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \else%
         \PfCentoureColor{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \fi%
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopa}{%
    \ifnum\i>\fpeval{\PfMLongDeciA+\PfMLongDeciB+\PfMAjoutDeci}\relax%
    \stepcounter{coulxlopcoul}%
  \else%
    \setcounter{coulxlopcoul}{0}%
  \fi%
     \ifnodedefined{CB\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul=0\relax%
         \PfCentoure{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
       \else%
         \PfCentoureColor{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
       \fi%
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopi}{%
    \setKV[ClesOperations]{CouleurCadre=DimGray}%
    \stepcounter{coulxlopcoul}%
    \ifnodedefined{CD\Roman{PfCNumOp}\i}{%
        \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CD\Roman{PfCNumOp}\i}{CD\Roman{PfCNumOp}\i}}{\PfCentoure{CD\Roman{PfCNumOp}\i}{CD\Roman{PfCNumOp}\i}}%
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopd}{%
    \ifnum\i>\fpeval{\PfMLongDeciA+\PfMLongDeciB+\PfMAjoutDeci}\relax%
    \stepcounter{coulxlopcoul}%
  \else%
    \setcounter{coulxlopcoul}{0}%
  \fi%
     \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul=0\relax%
                \ifnum\i<\fpeval{\PfMLongDeciA+\PfMLongDeciB+\PfMAjoutDeci}\relax%
         \PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}%
         \fi%
       \else%
         \PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}%
       \fi%
    }{}%
  }%
}%

\NewDocumentCommand\AdditionColore{omm}{%
  \setcounter{PfCcarry}{0}
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setsepchar{,}\ignoreemptyitems
  \xdef\PfMRetiensColorees{\useKV[ClesOperations]{CouleursColorees}}
  \readlist*\ListeTestTC{\PfMRetiensColorees}%
  \reademptyitems%
  \itemtomacro\ListeTestTC[1]\PfMCouleurA%
  \itemtomacro\ListeTestTC[2]\PfMCouleurB%
  \itemtomacro\ListeTestTC[3]\PfMCouleurC%
  \def\couleurs{\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \setcounter{PfCcarry}{0}%
  \setcounter{coulxlop}{0}%
  \setcounter{coulxlopa}{0}%
  \setcounter{coulxlopd}{0}%
  \setcounter{coulxlopi}{0}%
  \setcounter{coulxlopcoul}{0}%
  \stepcounter{PfCNumOp}%
  \StrLen{#2}[\PfMLongTermeA]
  \StrLen{#3}[\PfMLongTermeB]
  \StrCut{#2}{.}\PfMRien\PfMNbDeciA%
  \StrCut{#3}{.}\PfMRien\PfMNbDeciB%
  \StrLen{\PfMNbDeciA}[\PfMLongDeciA]%
  \StrLen{\PfMNbDeciB}[\PfMLongDeciB]%
  \ifnum\fpeval{max(\PfMLongDeciA,\PfMLongDeciB)}=0\relax
  \xdef\PfMLongRetenue{\fpeval{max(\PfMLongTermeA,\PfMLongTermeB)}}%
  \ExtraitCouleurs
  \else
  \ExtraitCouleurscp{\fpeval{-max(\PfMLongDeciA,\PfMLongDeciB)-1}}%
  \xdef\PfMLongRetenue{\fpeval{max(\PfMLongTermeA,\PfMLongTermeB)-1}}%
  \fi
  \ifboolKV[ClesOperations]{Solution}{%
    \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
  }{%
  \ifboolKV[ClesOperations]{Retenue}{\opset{carrystyle=\EncadreRetenue}}{\opset{carryadd=false}}%
  \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
}%
  \foreach \i in {1,...,\thecoulxlop}{%
  \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
    \ifnodedefined{CA\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
         \PfCentoure{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \else%
         \PfCentoureColor{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \fi%
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopa}{%
    \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
    \ifnodedefined{CB\Roman{PfCNumOp}\i}{%
           \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \PfCentoure{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
      \else
      \PfCentoureColor{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
      \fi
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopd}{%
     \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
  \ifnum\fpeval{max(\PfMLongDeciA,\PfMLongDeciB)}=0\relax
    \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\setKV[ClesOperations]{Gabarit}\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}\setKV[ClesOperations]{Gabarit=false}}%
      \else
            \ifboolKV[ClesOperations]{Solution}{\PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\PfCentoureColorR{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}%
            \fi
    }{}%
\else
    \ifnum\i=\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))+1}\relax%
        \else%
    \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\setKV[ClesOperations]{Gabarit}\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}\setKV[ClesOperations]{Gabarit=false}}%
      \else
            \ifboolKV[ClesOperations]{Solution}{\PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\PfCentoureColorR{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}%
            \fi
    }{}%
    \fi%
    \fi 
  }%
}%

\NewDocumentCommand\SoustractionColore{omm}{%
  \setcounter{PfCcarry}{0}
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setsepchar{,}\ignoreemptyitems%
  \xdef\PfMRetiensColorees{\useKV[ClesOperations]{CouleursColorees}}%
  \readlist*\ListeTestTC{\PfMRetiensColorees}%
  \reademptyitems%
  \itemtomacro\ListeTestTC[1]\PfMCouleurA%
  \itemtomacro\ListeTestTC[2]\PfMCouleurB%
  \itemtomacro\ListeTestTC[3]\PfMCouleurC%
  \def\couleurs{\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC,\PfMCouleurA,\PfMCouleurB,\PfMCouleurC}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \setcounter{PfCcarry}{0}%
  \setcounter{coulxlop}{0}%
  \setcounter{coulxlopa}{0}%
  \setcounter{coulxlopd}{0}%
  \setcounter{coulxlopi}{0}%
  \setcounter{coulxlopcoul}{0}%
  \stepcounter{PfCNumOp}%
  \StrLen{#2}[\PfMLongTermeA]
  \StrLen{#3}[\PfMLongTermeB]
  \StrCut{#2}{.}\PfMRien\PfMNbDeciA%
  \StrCut{#3}{.}\PfMRien\PfMNbDeciB%
  \StrLen{\PfMNbDeciA}[\PfMLongDeciA]%
  \StrLen{\PfMNbDeciB}[\PfMLongDeciB]%
  \ifnum\fpeval{max(\PfMLongDeciA,\PfMLongDeciB)}=0\relax
  \xdef\PfMLongRetenue{\fpeval{max(\PfMLongTermeA,\PfMLongTermeB)}}%
  \ExtraitCouleurs
  \else
  \ExtraitCouleurscp{\fpeval{-max(\PfMLongDeciA,\PfMLongDeciB)-1}}%
  \xdef\PfMLongRetenue{\fpeval{max(\PfMLongTermeA,\PfMLongTermeB)-1}}%
  \fi
  \ifboolKV[ClesOperations]{Solution}{%
    \opsub[carrysub,lastcarry,offsetcarry=-0.5,decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
  }{%
  \ifboolKV[ClesOperations]{Retenue}{\opset{lastcarry,carrysub,carrystyle=\EncadreRetenueSous,offsetcarry=-0.5}}{\opset{carrysub=false}}%
  \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
}%
  \foreach \i in {1,...,\thecoulxlop}{%
  \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
    \ifnodedefined{CA\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
         \PfCentoure{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \else%
         \PfCentoureColor{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
       \fi%
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopa}{%
    \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
    \ifnodedefined{CB\Roman{PfCNumOp}\i}{%
           \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \PfCentoure{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
      \else
      \PfCentoureColor{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
      \fi
    }{}%
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopd}{%
     \ifnum\i>\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))-1}\relax
    \stepcounter{coulxlopcoul}%
  \else
    \setcounter{coulxlopcoul}{1}%
  \fi
  \ifnum\fpeval{max(\PfMLongDeciA,\PfMLongDeciB)}=0\relax
    \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\setKV[ClesOperations]{Gabarit}\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}\setKV[ClesOperations]{Gabarit=false}}%
      \else
            \ifboolKV[ClesOperations]{Solution}{\PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\PfCentoureColorR{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}%
            \fi
    }{}%
\else
    \ifnum\i=\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB))+1}\relax%
        \else%
    \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
       \ifnum\thecoulxlopcoul<\fpeval{(max(\PfMLongDeciA,\PfMLongDeciB)+1)}\relax%
      \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\setKV[ClesOperations]{Gabarit}\PfCentoure{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}\setKV[ClesOperations]{Gabarit=false}}%
      \else
            \ifboolKV[ClesOperations]{Solution}{\PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\PfCentoureColorR{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}%
            \fi
    }{}%
    \fi%
    \fi 
  }%
}%

\NewDocumentCommand\DivisionColore{omm}{%
  \useKVdefault[ClesOperations]%
  \setKV[ClesOperations]{#1}%
  \setcounter{coulxlop}{0}%
  \setcounter{coulxlopa}{0}%
  \setcounter{coulxlopd}{0}%
  \setcounter{coulxlopi}{0}%
  \setcounter{coulxlopcoul}{0}%
  \stepcounter{PfCNumOp}%
  \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}%
  \ExtraitCouleurs%
  \begingroup%
  \setlength{\baselineskip}{1.75em}%
  \StrLen{#3}[\PfCLongueurFacteurDeux]%
  \ifnum\PfCLongueurFacteurDeux=1\relax%
  \opset{lineheight=\baselineskip} % nécessaire
  \else%
    %\opset{lineheight=\baselineskip,displayintermediary=all,displayshiftintermediary=all} % nécessaire
    \opset{lineheight=\baselineskip,displayintermediary=all} % nécessaire
  \fi%
  \opidiv[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,voperator=bottom]{#2}{#3}%
  \endgroup%
  \foreach \i in {1,...,\thecoulxlop}{%
    \stepcounter{coulxlopcoul}%
        \ifnodedefined{CA\Roman{PfCNumOp}\i}{%
            \PfCentoureColor{CA\Roman{PfCNumOp}\i}{CA\Roman{PfCNumOp}\i}%
            }{}
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopa}{%
    \stepcounter{coulxlopcoul}%
        \ifnodedefined{CB\Roman{PfCNumOp}\i}{%
            \PfCentoureColor{CB\Roman{PfCNumOp}\i}{CB\Roman{PfCNumOp}\i}%
            }{}
          }%
          \setcounter{coulxlopcoul}{0}%
    \foreach \i in {1,...,\thecoulxlopd}{%
    \stepcounter{coulxlopcoul}%
        \ifnodedefined{CC\Roman{PfCNumOp}\i}{%
      \ifboolKV[ClesOperations]{Solution}{\PfCentoureColor{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}{\PfCentoureColorR{CC\Roman{PfCNumOp}\i}{CC\Roman{PfCNumOp}\i}}%
            }{}
  }%
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopi}{%
    \stepcounter{coulxlopcoul}%
    \ifnodedefined{CD\Roman{PfCNumOp}\i}{%
        \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CD\Roman{PfCNumOp}\i}{CD\Roman{PfCNumOp}\i}}{\PfCentoure{CD\Roman{PfCNumOp}\i}{CD\Roman{PfCNumOp}\i}}%
    }{}%
    \ifnodedefined{CE\Roman{PfCNumOp}\i}{%
        \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CE\Roman{PfCNumOp}\i}{CE\Roman{PfCNumOp}\i}}{\PfCentoure{CE\Roman{PfCNumOp}\i}{CE\Roman{PfCNumOp}\i}}%
    }{}%
  }%
  coulxlopidiv = \thecoulxlopidiv\\
  \setcounter{coulxlopcoul}{0}%
  \foreach \i in {1,...,\thecoulxlopidiv}{%
    \stepcounter{coulxlopcoul}%
    La !
    \ifnodedefined{CE\Roman{PfCNumOp}\i}{%
    Ici !
        \ifboolKV[ClesOperations]{Solution}{\PfCentoure{CE\Roman{PfCNumOp}\i}{CE\Roman{PfCNumOp}\i}}{\PfCentoure{CE\Roman{PfCNumOp}\i}{CE\Roman{PfCNumOp}\i}}%
    }{}%
  }%
}%

%% by StevenSStevens
\def\decchar{.}
\newcounter{digits}
\newcounter{decrements}

\newcommand\showdiff[2]{%
  \let\savediff\relax%
  \def\borrow{}%
  \xdef\borrowed{0}%
  \setcounter{digits}{0}%
  \let\savediff\relax%
  \whereischar[q]{#1}{\decchar}%
  \xdef\locA{\theresult}%
  \whereischar[q]{#2}{\decchar}%
  \xdef\locB{\theresult}%
  \ifnum\numexpr\locA+\locB=0\relax%
    \def\decloc{-1}%
    \ifnum#1<#2\relax
      {\Longstack[r]{#1\,{} \underline{-#2\,} {< 0\,}}}\else
      \showdiffengine{#1}{#2}\fi
  \else
    \ifnum\locA=0\relax%
      \xdef\numA{#1\decchar}%
      \whereischar[q]{\numA}{\decchar}%
      \xdef\locA{\theresult}%
    \else
      \xdef\numA{#1}%
    \fi
    \stringlength[q]{\numA}%
    \xdef\lenA{\theresult}%
    \substring[q]{\numA}{1}{\numexpr\locA-1\relax}%
    \xdef\preA{\thestring}%
    \substring[q]{\numA}{\numexpr\locA+1\relax}{$}%
    \xdef\postA{\thestring}%
    \ifnum\locB=0\relax%
      \xdef\numB{#2\decchar}%
      \whereischar[q]{\numB}{\decchar}%
      \xdef\locB{\theresult}%
    \else
      \xdef\numB{#2}%
    \fi
    \stringlength[q]{\numB}%
    \xdef\lenB{\theresult}%
    \substring[q]{\numB}{1}{\numexpr\locB-1\relax}%
    \xdef\preB{\thestring}%
    \substring[q]{\numB}{\numexpr\locB+1\relax}{$}%
    \xdef\postB{\thestring}%
    \def\decsA{\numexpr\lenA-\locA}%
    \def\decsB{\numexpr\lenB-\locB}%
    \ifnum\decsA=\decsB%
    \xdef\decloc{\decsA}%
    \else\ifnum\decsA>\decsB%
        \xdef\decloc{\decsA}%
        \setcounter{decrements}{\the\numexpr\decsA-\decsB}%
        \paddecimal[0]{\postB}%
      \else%
        \xdef\decloc{\decsB}%
        \setcounter{decrements}{\the\numexpr\decsB-\decsA}%
        \paddecimal[0]{\postA}%
      \fi%
    \fi%
    \ifnum\preA\postA<\preB\postB\relax
      {\Longstack[r]{%
        \preA.\postA\,{} \underline{-\preB.\postB\,} {< 0\,}}}
    \else
      \showdiffengine{\preA\postA}{\preB\postB}
    \fi
  \fi
}
\newcommand\showdiffengine[2]{%
  \ifnum\value{digits}=\decloc\relax\savestack\savediff{%
    \Longstack{. \underline{.} .}\savediff}\fi
  \stepcounter{digits}%
  \xdef\opA{#1}%
  \xdef\opB{#2}%
  \lastdigits{\opA}{\opB}%
  \ifnum\borrowed=1\relax\xdef\XdigA{\the\numexpr\digA-1}\else\xdef\XdigA{\digA}\fi%
  \ifnum\XdigA<0\relax\xdef\XdigA{9}\xdef\futureborrowed{1}\else
    \xdef\futureborrowed{0}\fi
  \edef\coldiff{\the\numexpr\XdigA-\digB\relax}%
  \ifnum\coldiff<0\relax%
    \xdef\borrow{1}%
    \edef\coldiff{\the\numexpr\borrow\XdigA-\digB\relax}%
  \else
    \xdef\borrow{}%
  \fi
  \ifnum\borrowed=0\relax%
    \savestack{\thediff}{\Longstack[l]{%
      \tiny\bllap[1.5\baselineskip]{\borrow} \XdigA{} \underline{\VdigB\kern3pt} %
        \coldiff}}%
  \else
    \savestack{\thediff}{\Longstack[l]{%
     \tiny\brlap[.7\baselineskip]{\borrow\the\numexpr\XdigA} \crossout{\digA} %
        \underline{\VdigB\kern3pt} \coldiff}}%
  \fi
  \if\relax\borrow\relax\xdef\borrowed{0}\else\xdef\borrowed{1}\fi
  \savestack{\savediff}{\thediff\savediff}%
  \ifnum\futureborrowed>0\relax\xdef\borrowed{1}\xdef\futureborrowed{0}\fi
  \nextcolumn{\opA}{\opB}%
  \ifnum\numexpr0\opA+0\opB>0\relax\showdiffengine{\opA}{\opB}%
  \else
    \Longstack{\underline{$-$\,} {}}\savediff\fi%
}
\newcommand\crossout[1]{\stackengine{0pt}{#1}{/}{O}{c}{F}{F}{L}}
\newcommand\lastdigits[2]{%
  \substring[q]{#1}{$}{$}%
  \xdef\digA{\thestring}%
  \xdef\VdigA{\digA}\if0\digA\ifnum#1=0\relax\xdef\VdigA{~}\fi\fi%
  \substring[q]{#2}{$}{$}%
  \xdef\digB{\thestring}%
  \xdef\VdigB{\digB}\if0\digB\ifnum#2=0\relax\xdef\VdigB{~}\fi\fi%
}
\newcommand\nextcolumn[2]{%
  \substring[q]{#1}{1}{$-1}%
  \xdef\opA{0\thestring}%
  \substring[q]{#2}{1}{$-1}%
  \xdef\opB{0\thestring}%
}
\newcommand\showsum[2]{%
  \setcounter{digits}{0}%
  \xdef\remainder{0}%
  \xdef\Vremainder{~}%
  \let\savesum\relax%
  \whereischar[q]{#1}{\decchar}%
  \xdef\locA{\theresult}%
  \whereischar[q]{#2}{\decchar}%
  \xdef\locB{\theresult}%
  \ifnum\numexpr\locA+\locB=0\relax%
    \def\decloc{-1}%
    \showsumengine{#1}{#2}%
  \else
    \ifnum\locA=0\relax%
      \xdef\numA{#1\decchar}%
      \whereischar[q]{\numA}{\decchar}%
      \xdef\locA{\theresult}%
    \else
      \xdef\numA{#1}%
    \fi
    \stringlength[q]{\numA}%
    \xdef\lenA{\theresult}%
    \substring[q]{\numA}{1}{\numexpr\locA-1\relax}%
    \xdef\preA{\thestring}%
    \substring[q]{\numA}{\numexpr\locA+1\relax}{$}%
    \xdef\postA{\thestring}%
    \ifnum\locB=0\relax%
      \xdef\numB{#2\decchar}%
      \whereischar[q]{\numB}{\decchar}%
      \xdef\locB{\theresult}%
    \else
      \xdef\numB{#2}%
    \fi
    \stringlength[q]{\numB}%
    \xdef\lenB{\theresult}%
    \substring[q]{\numB}{1}{\numexpr\locB-1\relax}%
    \xdef\preB{\thestring}%
    \substring[q]{\numB}{\numexpr\locB+1\relax}{$}%
    \xdef\postB{\thestring}%
    \def\decsA{\numexpr\lenA-\locA}%
    \def\decsB{\numexpr\lenB-\locB}%
    \ifnum\decsA=\decsB%
    \xdef\decloc{\decsA}%
    \else\ifnum\decsA>\decsB%
        \xdef\decloc{\decsA}%
        \setcounter{decrements}{\the\numexpr\decsA-\decsB}%
        \paddecimal{\postB}%
      \else%
        \xdef\decloc{\decsB}%
        \setcounter{decrements}{\the\numexpr\decsB-\decsA}%
        \paddecimal{\postA}%
      \fi%
    \fi%
    \showsumengine{\preA\postA}{\preB\postB}%
  \fi%
}
\newcommand\showsumengine[2]{%
  \ifnum\value{digits}=\decloc\relax\savestack\savesum{%
    \Longstack{. \underline{.} .}\savesum}\fi
  \stepcounter{digits}%
  \xdef\opA{#1}%
  \xdef\opB{#2}%
  \lastdigits{\opA}{\opB}%
  \edef\colsum{\the\numexpr\digA+\digB+0\remainder\relax}%
  \substring[q]{\colsum}{$}{$}%
  \savestack{\thesum}{\Longstack[l]{%
    \tiny\brlap[.7\baselineskip]{\Vremainder} \VdigA{} \underline{\VdigB\,} \thestring}}%
  \substring[q]{\colsum}{1}{$-1}%
  \xdef\remainder{\thestring}%
  \if\relax\remainder\relax\xdef\Vremainder{}\else\xdef\Vremainder{\remainder}\fi%
  \savestack{\savesum}{\thesum\savesum}%
  \nextcolumn{\opA}{\opB}%
  \ifnum\numexpr0\opA+0\opB+0\remainder>0\relax\showsumengine{\opA}{\opB}\else
    \Longstack{\underline{$+$\,} {}}\savesum\fi%
}
\newcommand\paddecimal[2][ ]{%
  \xdef#2{#2#1}%
  \addtocounter{decrements}{-1}%
  \ifnum\value{decrements}>0\relax\paddecimal[#1]{#2}\fi%
}%