summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex')
-rw-r--r--macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex306
1 files changed, 306 insertions, 0 deletions
diff --git a/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex b/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
index 9b2d9eb653..01cb4722c4 100644
--- a/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
+++ b/macros/latex/contrib/proflycee/tex/proflycee-tools-arithm.tex
@@ -933,4 +933,310 @@
\IfBooleanT{#1}{~avec $0 \leqslant \num{\xintiiRem{#3}{#4}} < \xintifboolexpr{#4 < 0}{\lvert\num{#4}\rvert}{\num{#4}}$}%
}
+%====ADDITIONS POSÉES ?
+\newlength{\colspecbinadd}
+\setlength{\colspecbinadd}{2pt}
+
+\NewDocumentCommand\PosRetenue{ O{red} m }{%
+ %\tmptextcircled[#1]{#2}%
+ \textcolor{#1}{\scalebox{\addbinposescret}[\addbinposescret]{#2}}%
+}
+
+\defKV[AddBinaire]{%
+ CouleurRetenue=\def\addbinposecol{#1},%
+ Espacement=\setlength{\colspecbinadd}{#1},%
+ Police=\def\addbinposefont{#1},%
+ EchelleRetenue=\def\addbinposescret{#1},%
+ Base=\def\addbinposebase{#1}
+}
+
+\setKVdefault[AddBinaire]{%
+ CouleurRetenue=red,%
+ Espacement=2pt,%
+ Police=\normalsize\normalfont,%
+ EchelleRetenue=0.4,%
+ Base=dec,%
+ Egal=true
+}
+
+\NewDocumentCommand\PoseAddition{ O{} m m }{%
+ \restoreKV[AddBinaire]%
+ \setKV[AddBinaire]{#1}%
+ %le résultat
+ \IfStrEq{\addbinposebase}{dec}%
+ {\xdef\tmpresultat{\xinteval{#2+#3}}}%
+ {}%
+ \IfStrEq{\addbinposebase}{bin}%
+ {\xdef\tmpresultat{\xintDecToBin{\xinteval{\xintBinToDec{#2}+\xintBinToDec{#3}}}}}%
+ {}%
+ \IfStrEq{\addbinposebase}{hex}%
+ {\xdef\tmpresultat{\xintDecToHex{\xinteval{\xintHexToDec{#2}+\xintHexToDec{#3}}}}}%
+ {}%
+ %\xdef\tmpresultat{\xintDecToBin{\xinteval{\xintBinToDec{#2}+\xintBinToDec{#3}}}}%
+ %les calculs
+ \StrLen{#2}[\longueurA]\StrLen{#3}[\longueurB]\StrLen{\tmpresultat}[\longueurC]%
+ \xdef\longueurMax{\xinteval{max(\longueurA,\longueurB,\longueurC)}}%\longueurMax
+ %le tableau
+ \xintifboolexpr{\longueurB > \longueurA}%
+ {%
+ \xdef\ArgLigneHaut{#3}\xdef\ArgLigneBas{#2}%
+ \xdef\addposeehaut{#3}\xdef\addposeebas{#2}%
+ }%
+ {%
+ \xdef\ArgLigneHaut{#2}\xdef\ArgLigneBas{#3}%
+ \xdef\addposeehaut{#2}\xdef\addposeebas{#3}%
+ }%
+ %création de la ligne du haut
+ \StrLen{\ArgLigneHaut}[\LgHaut]%
+ \StrChar{\ArgLigneHaut}{\LgHaut}[\LigneBinAdd]%
+ \foreach \i in {1,...,\inteval{\LgHaut-1}}%
+ {%
+ \xdef\tmpcoeff{\xinteval{\LgHaut-\i}}%
+ \StrChar{\ArgLigneHaut}{\tmpcoeff}[\TmpHaut]%
+ \xdef\LigneBinAdd{\TmpHaut & \LigneBinAdd}%
+ }%
+ \xintifboolexpr{\longueurMax > \LgHaut}%
+ {%
+ \foreach \i in {1,...,\inteval{\longueurMax-\LgHaut}}%
+ {\xdef\LigneBinAdd{& \LigneBinAdd}}%
+ }%
+ {}%
+ %création de la ligne du bas
+ \StrLen{\ArgLigneBas}[\LgBas]%
+ \StrChar{\ArgLigneBas}{\LgBas}[\LigneBinAddB]%
+ \foreach \i in {1,...,\inteval{\LgBas-1}}%
+ {%
+ \xdef\tmpcoeff{\xinteval{\LgBas-\i}}%
+ \StrChar{\ArgLigneBas}{\tmpcoeff}[\TmpBas]%
+ \xdef\LigneBinAddB{\TmpBas & \LigneBinAddB}%
+ }%
+ \xintifboolexpr{\longueurMax > \LgBas}%
+ {%
+ \foreach \i in {1,...,\inteval{\longueurMax-\LgBas}}%
+ {\xdef\LigneBinAddB{& \LigneBinAddB}}%
+ }%
+ {}%
+ %création de la ligne du résultat
+ \StrLen{\tmpresultat}[\LgRes]%
+ \StrChar{\tmpresultat}{\LgRes}[\LigneBinRes]%
+ \foreach \i in {1,...,\inteval{\LgRes-1}}%
+ {%
+ \xdef\tmpcoeff{\xinteval{\LgRes-\i}}%
+ \StrChar{\tmpresultat}{\tmpcoeff}[\TmpRes]%
+ \xdef\LigneBinRes{\TmpRes & \LigneBinRes}%
+ }%
+ %création des retenues...
+ \xdef\ArgBasZeros{\ArgLigneBas}%
+ \xintifboolexpr{\LgHaut > \LgBas}%
+ {%
+ \foreach \i in {1,...,\inteval{\LgHaut-\LgBas}}%
+ {\xdef\ArgBasZeros{0\ArgBasZeros}}%
+ }%
+ {}%
+ %\ArgBasZeros\par
+ \xdef\listeretenues{0}%
+ \xdef\longueurmax{\xinteval{max(\longueurA,\longueurB)}}%\longueurMax
+ \foreach \i in {1,...,\longueurmax}%
+ {%
+ \readlist*\lstretenues{\listeretenues}%
+ \xdef\tmpcoeff{\xinteval{\longueurmax-\i+1}}%
+ \itemtomacro\lstretenues[-\i]{\TmPNbR}%
+ \StrChar{\ArgLigneHaut}{\tmpcoeff}[\TmPNbH]%
+ \StrChar{\ArgBasZeros}{\tmpcoeff}[\TmPNbB]%
+ %cas de la base
+ \IfStrEq{\addbinposebase}{dec}%
+ {\xdef\tmpresultat{\xinteval{\TmPNbR+\TmPNbH+\TmPNbB}}}%
+ {}%
+ \IfStrEq{\addbinposebase}{bin}%
+ {\xdef\tmpresultat{\xintDecToBin{\xinteval{\xintBinToDec{\TmPNbR}+\xintBinToDec{\TmPNbH}+\xintBinToDec{\TmPNbB}}}}}%
+ {}%
+ \IfStrEq{\addbinposebase}{hex}%
+ {\xdef\tmpresultat{\xintDecToHex{\xinteval{\xintHexToDec{\TmPNbR}+\xintHexToDec{\TmPNbH}+\xintHexToDec{\TmPNbB}}}}}%
+ {}%
+ %suite
+ %\xdef\tmpresultat{\xintDecToBin{\xinteval{\xintBinToDec{\TmPNbR}+\xintBinToDec{\TmPNbH}+\xintBinToDec{\TmPNbB}}}}%
+ \StrLen{\tmpresultat}[\LgRetenue]%
+ \xintifboolexpr{\LgRetenue == 1}%si on met une retenue...
+ {%
+ \xdef\listeretenues{0,\listeretenues}%
+ }%
+ {%
+ \StrGobbleRight{\tmpresultat}{1}[\tmpretenue]%
+ \xdef\listeretenues{\tmpretenue,\listeretenues}%
+ }%
+ }%
+ %On compte le nombre de zéros dans la ligne des retenues
+ \StrCount{\listeretenues}{0}[\nbretenues]%\listeretenues\par\nbretenues\par%
+ \readlist*\lstretenues{\listeretenues}%
+ %\showitems*{\lstretenues}\par
+ \xdef\LigneBinAddRet{\xintifboolexpr{\lstretenues[-1] == 0}{}{\PosRetenue[\addbinposecol]{\lstretenues[-1]}}}%
+ \foreach \i in {2,...,\longueurMax}%
+ {%
+ \xdef\LigneBinAddRet{\xintifboolexpr{\lstretenues[-\i] == 0}{}{\PosRetenue[\addbinposecol]{\lstretenues[-\i]}} & \LigneBinAddRet}%
+ }%
+ %et on passe au tableau
+ \xdef\longueurcasesope{\xinteval{\longueurMax-1}}%
+ \xdef\longueurtotale{\xinteval{\longueurMax+1}}%
+ \setlength{\tabcolsep}{\colspecbinadd}%
+ %\begin{tabular}{@{\hskip0.5\colspecbinadd}c@{\hskip0.5\colspecbinadd}*{\longueurcasesope}{c@{\hskip\colspecbinadd}}c@{\hskip0.5\colspecbinadd}}
+ \begin{NiceTabular}{c*{\longueurMax}{c}}
+ \xintifboolexpr{\nbretenues > \longueurmax}{}{\RowStyle[cell-space-limits=1pt]{\addbinposefont} & \LigneBinAddRet \\}
+ \RowStyle[nb-rows=*,cell-space-limits=2pt]{\addbinposefont}
+ &\LigneBinAdd \\
+ +&\LigneBinAddB \\
+ \hline
+ \ifboolKV[AddBinaire]{Egal}{=}{}&\LigneBinRes \\
+ \end{NiceTabular}
+ %\end{tabular}%
+}
+
+\ifluatex
+
+\RequirePackage{lualinalg}
+
+\defKV[addbinlua]{%
+ CouleurRetenue=\def\addbinluacol{#1},%
+ Espacement=\def\addbinluaspace{#1},%
+ Police=\def\addbinluafonte{#1},%
+ Base=\def\addbinluabase{#1},%
+ EchelleRetenue=\def\addbinluascret{#1}
+}
+
+\setKVdefault[addbinlua]{%
+ CouleurRetenue=red,%
+ Espacement=2pt,%
+ Police=\normalsize\normalfont,%
+ Egal=true,%
+ Base=dec,%
+ EchelleRetenue=0.4
+}
+
+\NewDocumentCommand\SommeElementsMatriceBin{ m m m m O{\poseretenue} }{%
+ %1=matrice
+ %2=colonne
+ %3=ligne début
+ %4=ligne arrivée
+ \xdef\tmpsomme{0}%
+ \foreach \lig in {#3,...,#4}{%
+ \xdef\tmpsomme{\xinteval{\tmpsomme+\xintBinToDec{\matrixGetElement{#1}{\lig}{#2}}}}%calcul intermédiaire en binaire
+ }%
+ \xdef#5{\xintDecToBin{\tmpsomme}}%
+}
+
+\NewDocumentCommand\SommeElementsMatriceDec{ m m m m O{\poseretenue} }{%
+ %1=matrice
+ %2=colonne
+ %3=ligne début
+ %4=ligne arrivée
+ \xdef\tmpsomme{0}%
+ \foreach \lig in {#3,...,#4}{%
+ \xdef\tmpsomme{\xinteval{\tmpsomme+\matrixGetElement{#1}{\lig}{#2}}}%calcul intermédiaire en binaire
+ }%
+ \xdef#5{\tmpsomme}%
+}
+
+\NewDocumentCommand\PoseAdditionLua{ O{} m }{%
+ \restoreKV[addbinlua]%
+ \setKV[addbinlua]{#1}%
+ \setsepchar{+}%
+ \readlist*\addbinlstoper{#2}%
+ \xdef\nboperandes{\addbinlstoperlen}%
+ \xdef\nboperandesmat{\xinteval{\addbinlstoperlen+1}}%
+ %le résultat du calcul en binaire
+ \xdef\tmpres{0}%
+ \foreach \i in {1,...,\addbinlstoperlen}{%
+ \itemtomacro\addbinlstoper[\i]{\tmpinteroper}%
+ \IfStrEq{\addbinluabase}{dec}%
+ {\xdef\tmpres{\xinteval{\tmpres+\tmpinteroper}}}%
+ {}%
+ \IfStrEq{\addbinluabase}{bin}%
+ {\xdef\tmpres{\xinteval{\tmpres+\xintBinToDec{\tmpinteroper}}}}%
+ {}%
+ %\xdef\tmpres{\xinteval{\tmpres+\xintBinToDec{\tmpinteroper}}}%
+ }%
+ \IfStrEq{\addbinluabase}{dec}%
+ {\xdef\tmpresultat{\tmpres}}%
+ {}%
+ \IfStrEq{\addbinluabase}{bin}%
+ {\xdef\tmpresultat{\xintDecToBin{\tmpres}}}%
+ {}%
+ %\xdef\tmpresultat{\xintDecToBin{\tmpres}}%\tmpresultat%
+ \StrLen{\tmpresultat}[\nbtotalchiffresres]%\nbtotalchiffresres%
+ \xdef\nblignesmatriceintertmp{\xinteval{1+\nboperandes}}%
+ \xdef\nblignesmatricetmp{\xinteval{2+\nboperandes}}%
+ \matrixNew{MATINTER}{\nblignesmatricetmp,\nbtotalchiffresres,'zero'}%
+ %création des lignes intermédiaires
+ \foreach \nblig [count=\xi] in {2,...,\nblignesmatriceintertmp}{%
+ \itemtomacro\addbinlstoper[\xi]{\tmpinteroper}%on extrait l'opérande
+ \StrLen{\tmpinteroper}[\nbchiiffres]%on extrait son nb de chiffres
+ \xdef\tmpoffset{\xinteval{\nbtotalchiffresres-\nbchiiffres+1}}%on calcule la position du 1er chiffre
+ \foreach \poschar [count=\xii] in {\tmpoffset,...,\nbtotalchiffresres}{%
+ \StrChar{\tmpinteroper}{\xii}[\tmpcoeffaddbin]%
+ \matrixSetElement{MATINTER}{\nblig}{\poschar}{\tmpcoeffaddbin}%
+ }%
+ }%
+ %création de la ligne résultat
+ \foreach \j in {1,...,\nbtotalchiffresres}{%
+ \StrChar{\tmpresultat}{\j}[\tmpcoeffaddbin]%
+ \matrixSetElement{MATINTER}{\nblignesmatricetmp}{\j}{\tmpcoeffaddbin}%
+ }%
+ %gestion des retenues, de la droite vers la gauche
+ \foreach \nbcol in {\nbtotalchiffresres,...,2}{%
+ \IfStrEq{\addbinluabase}{dec}%
+ {\SommeElementsMatriceDec{MATINTER}{\nbcol}{1}{\nboperandesmat}[\poseretenue]}%
+ {}%
+ \IfStrEq{\addbinluabase}{bin}%
+ {\SommeElementsMatriceBin{MATINTER}{\nbcol}{1}{\nboperandesmat}[\poseretenue]}%
+ {}%
+ %\SommeElementsMatriceBin{MATINTER}{\nbcol}{1}{\nboperandesmat}[\poseretenue]%
+ \xdef\nbcolmun{\xinteval{\nbcol-1}}%
+ \StrLen{\poseretenue}[\nbchiffresretenue]%
+ \xintifboolexpr{\nbchiffresretenue > 1}%
+ {\StrGobbleRight{\poseretenue}{1}[\RETENUE]}%
+ {\xdef\RETENUE{\poseretenue}}%
+ \matrixSetElement{MATINTER}{1}{\nbcolmun}{\RETENUE}%
+ }%
+ %ligne des retenues pour savoir si il y en a !
+ \matrixSubmatrix{MATINTERRETENUE}{MATINTER}{1}{1}{1}{\nbtotalchiffresres}%
+ %création de la ligne des retenues
+ \xdef\LigneBinAddRet{}%
+ \foreach \i in {1,...,\nbtotalchiffresres}{%
+ \xintifboolexpr{\matrixGetElement{MATINTER}{1}{\i} == 0}%
+ {\xdef\LigneBinAddRet{\LigneBinAddRet &}}%
+ {\xdef\LigneBinAddRet{\LigneBinAddRet & \textcolor{\addbinluacol}{\scalebox{\addbinluascret}[\addbinluascret]{\matrixGetElement{MATINTER}{1}{\i}}}}}%
+ }%
+ %création des lignes intermédiaires
+ \xdef\LignesOperande{}%
+ \foreach \i in {1,...,\nboperandes}{%
+ \xdef\xxi{\xinteval{\i+1}}%
+ \itemtomacro\addbinlstoper[\i]{\tmpinteroper}%on extrait l'opérande
+ \StrLen{\tmpinteroper}[\nbchiiffres]%on extrait son nb de chiffres
+ \xdef\tmpoffset{\xinteval{\nbtotalchiffresres-\nbchiiffres}}%on calcule le nombre de cases vides
+ \xintifboolexpr{\i == 1}{}{\xdef\LignesOperande{\LignesOperande + }}%
+ \xintifboolexpr{\tmpoffset == 0}%
+ {}%
+ {
+ \foreach \k in {1,...,\tmpoffset}{%
+ \xdef\LignesOperande{\LignesOperande &}%
+ }%
+ }%
+ \foreach \j in {\inteval{\tmpoffset+1},...,\nbtotalchiffresres}{%
+ \xdef\LignesOperande{\LignesOperande & \matrixGetElement{MATINTER}{\xxi}{\j}}%
+ }%
+ \xdef\LignesOperande{\LignesOperande \\}%
+ }%
+ %et le tableau !!
+ \setlength{\tabcolsep}{\addbinluaspace}%
+ \begin{NiceTabular}{c*{\nbtotalchiffresres}{c}}
+ \xintifboolexpr{\matrixNormOne{MATINTERRETENUE} == 0}{}{\RowStyle[cell-space-limits=1pt]{\addbinluafonte} \LigneBinAddRet \\}
+ \RowStyle[nb-rows=*,cell-space-limits=2pt]{\addbinluafonte}
+ \LignesOperande
+ \hline
+ \ifboolKV[addbinlua]{Egal}{=}{} \xintFor* ##1 in {\xintSeq{1}{\nbtotalchiffresres}}\do{& \matrixGetElement{MATINTER}{\nblignesmatricetmp}{##1}} \\
+ \end{NiceTabular}%
+ %\(\matrixPrint{MATINTER}\)
+}
+
+\fi
+
\endinput \ No newline at end of file