%%%
% D\'ecomposition de fractions d\'ecimales
%%%
\setKVdefault[ClesFracDeci]{Complete=false,SansZero=false,Remediation=false,Longueur=1cm}
\newlength{\PfCLongueurP}%

\newcommand\FractionDecimale[2][]{%
  \useKVdefault[ClesFracDeci]%
  \setKV[ClesFracDeci]{#1}%
  \setlength{\PfCLongueurP}{\useKV[ClesFracDeci]{Longueur}}%
  \setsepchar[*]{/}%
  \readlist*\ListeFractionDecimale{#2}%
  \xdef\FractionDeciNum{\ListeFractionDecimale[1]}%
  \xdef\FractionDeciDeno{\ListeFractionDecimale[2]}%
  \xdef\PartieEntiereFractionDeci{\fpeval{floor(\FractionDeciNum/\FractionDeciDeno)}}%
  \xdef\PartieDecimaleFractionDeci{\fpeval{\FractionDeciNum-floor(\FractionDeciNum/\FractionDeciDeno)*\FractionDeciDeno}}%
  \StrLen{\PartieDecimaleFractionDeci}[\LongueurPartieDecimale]%
  \StrLen{\fpeval{\FractionDeciDeno}}[\LongueurFracDeciDeno]%
  \StrLen{\fpeval{\FractionDeciNum}}[\LongueurFracDeciNum]%
  \xintifboolexpr{\PartieEntiereFractionDeci == 0}{\xdef\LongueurPartieEntiere{0}}{\StrLen{\PartieEntiereFractionDeci}[\LongueurPartieEntiere]}%
  \xintifboolexpr{\PartieEntiereFractionDeci == \fpeval{\FractionDeciNum/\FractionDeciDeno}}{%
    \ensuremath{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\PartieEntiereFractionDeci}}}%
  }{%
    \ifboolKV[ClesFracDeci]{SansZero}{%
      \ensuremath{%
        \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\PartieEntiereFractionDeci}}+}%
        \xintFor* ##1 in {\xintSeq{1}{\LongueurPartieDecimale}}\do{%
          \StrMid{\PartieDecimaleFractionDeci}{##1}{##1}[\ChiffrePartieDecimale]%
          \xintifForFirst{}{\xintifboolexpr{\ChiffrePartieDecimale == 0}{}{+}}\xintifboolexpr{\ChiffrePartieDecimale == 0}{}{\frac{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**(\LongueurFracDeciDeno-1-\LongueurPartieDecimale+##1)}}}}%
        }%
      }%
    }{%
      \ifboolKV[ClesFracDeci]{Complete}{%
        \xintifboolexpr{\FractionDeciNum>\FractionDeciDeno}{%
          \ensuremath{%
            % on affiche la partie entière.
            \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\PartieEntiereFractionDeci}}+}%
            \StrGobbleLeft{\FractionDeciNum}{\fpeval{\LongueurPartieEntiere}}[\DecompositionFracDeciComplete]%
            % on affiche la partie décimale.
            \xintFor* ##1 in {\xintSeq{1}{\fpeval{\LongueurFracDeciNum-\LongueurPartieEntiere}}}\do{%
              \xintifForFirst{}{+}\StrMid{\DecompositionFracDeciComplete}{##1}{##1}[\ChiffrePartieDecimale]\frac{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**##1}}}%
            }%
          }%
        }{%
          \ensuremath{%
            \xintFor* ##1 in {\xintSeq{1}{\LongueurPartieDecimale}}\do{%
              \StrMid{\PartieDecimaleFractionDeci}{##1}{##1}[\ChiffrePartieDecimale]%
              \xintifForFirst{}{+}\frac{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\ChiffrePartieDecimale}}}{\num{\fpeval{10**(\LongueurFracDeciDeno-1-\LongueurPartieDecimale+##1)}}}%
            }%
          }%
        }%
      }{%
        \ensuremath{%
          \xintifboolexpr{\PartieEntiereFractionDeci == 0}{}{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\PartieEntiereFractionDeci}}+}\frac{\ifboolKV[ClesFracDeci]{Remediation}{\pointilles[\PfCLongueurP]}{\num{\PartieDecimaleFractionDeci}}}{\num{\FractionDeciDeno}}%
        }%
      }%
    }%
  }%
}%