diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCMulArt.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCMulArt.tex | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCMulArt.tex b/macros/latex/contrib/profcollege/latex/PfCMulArt.tex new file mode 100644 index 0000000000..601d6e52f1 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMulArt.tex @@ -0,0 +1,472 @@ +%%% +% Mulart +%%% +\setKVdefault[TabMul]{Multiple=2,Cibles=false,Largeur=20pt,Couleurs=false,Graines=false,Operations=false,Enonce=false,SchemaEnonce=false} +\defKV[TabMul]{Couleur=\setKV[TabMul]{Couleurs}} +\defKV[TabMul]{Graine=\setKV[TabMul]{Graines}\PfCGraineAlea{#1}} +\defKV[TabMul]{Cible=\setKV[TabMul]{Cibles}}% + +\newtoks\tokstabmul +\newtoks\tokstabmulpdts +\newtoks\tokstabmulnonpdts +\newtoks\tokstabmulpdtscible +\def\UpdatetoksTabMul#1\nil{\addtotok\tokstabmul{"#1",}}% +\def\UpdatetoksTabMulPdts#1\nil{\addtotok\tokstabmulpdts{"#1",}}% +\def\UpdatetoksTabMulNonPdts#1\nil{\addtotok\tokstabmulnonpdts{"#1",}}% +\def\UpdatetoksTabMulPdtsCible#1\nil{\addtotok\tokstabmulpdtscible{"#1",}}% + +\NewDocumentCommand\TableauMultiplicatif{om}{% + \useKVdefault[TabMul]% + \setKV[TabMul]{#1}% + \setsepchar{,}\ignoreemptyitems% + \readlist*\PfCListeTabMul{#2}% + \reademptyitems% + \StrLen{\PfCListeTabMul[1]}[\TailleTabMul]% + \tokstabmul{}% + \foreachitem\compteur\in\PfCListeTabMul{\expandafter\UpdatetoksTabMul\compteur\nil}% + \savecomparemode% + \comparestrict% + \ifboolKV[TabMul]{Cibles}{% + \tokstabmulpdtscible{}% + \xdef\PfCCompteurX{0}% + \xdef\PfCCompteurO{0}% + \xintFor* ##1 in {\xintSeq{1}{\PfCListeTabMullen}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\TailleTabMul}}\do{% + \StrChar{\PfCListeTabMul[##1]}{##2}[\PfCLettre]% + \IfStrEq{\PfCLettre}{x}{% + \xdef\PfCCompteurX{\fpeval{\PfCCompteurX+1}}% + }{\IfStrEq{\PfCLettre}{o}{% + \xdef\PfCCompteurO{\fpeval{\PfCCompteurO+1}}% + }{}% + }% + }% + }% + \xdef\PfCFooRetiensCible{\useKV[TabMul]{Cible}}% + \readlist*\PfCListeDesNombresCibles{\PfCFooRetiensCible}% + \xintFor* ##2 in{\xintSeq{1}{\PfCListeDesNombresCibleslen}}\do{% + \PfCListeDiviseurs{\PfCListeDesNombresCibles[##2]}% + \setsepchar{,}\ignoreemptyitems% + \readlist*\PfCTabMulDiviseursCible{\PfCListeDiviseursRetour}% + \xdef\PfCFooListePdtCible{$1\times\num{\PfCListeDesNombresCibles[##2]}$,$\num{\PfCListeDesNombresCibles[##2]}\times1$}% + \xintFor* ##1 in {\xintSeq{1}{\PfCNbDiviseurs}}\do{% + \xdef\PfCFooListePdtCible{\PfCFooListePdtCible,$\num{\PfCTabMulDiviseursCible[##1]}\times\num{\fpeval{\PfCListeDesNombresCibles[##2]/\PfCTabMulDiviseursCible[##1]}}$,$\num{\fpeval{\PfCListeDesNombresCibles[##2]/\PfCTabMulDiviseursCible[##1]}}\times\num{\PfCTabMulDiviseursCible[##1]}$}% + }% + }% + \ignoreemptyitems% + \readlist*\PfCListeProduitsCible{\PfCFooListePdtCible}% + \foreachitem\compteur\in\PfCListeProduitsCible{\expandafter\UpdatetoksTabMulPdtsCible\compteur\nil}% + \BuildTabMulCible{\the\tokstabmul}{\the\tokstabmulpdtscible}{\PfCFooRetiensCible}% + }{% + \ifboolKV[TabMul]{Operations}{% + \xdef\PfCTabMulListePdts{4,6,8,9,10,12,14,15,16,18,20,21,24,25,27,28,30,32,35,36,40,42,45,48,49,50,54,56,60,63,64,70,72,80,81,90,100}%37 + \xdef\PfCTabMulListeNonPdts{2,3,5,7,11,13,17,19,22,23,26,29,31,33,34,37,38,39,41,43,44,46,47,51,52,53,55,57,58,59,61,62,65,66,67,68,69,71,73,74,75,76,77,78,79,82,83,84,85,86,87,88,89,91,92,93,94,95,96,97,98,99}%62 + \xdef\PfCCompteurX{0} + \xdef\PfCCompteurO{0} + \xintFor* ##1 in {\xintSeq{1}{\PfCListeTabMullen}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\TailleTabMul}}\do{% + \StrChar{\PfCListeTabMul[##1]}{##2}[\PfCLettre]% + \IfStrEq{\PfCLettre}{x}{% + \xdef\PfCCompteurX{\fpeval{\PfCCompteurX+1}}% + }{\IfStrEq{\PfCLettre}{o}{% + \xdef\PfCCompteurO{\fpeval{\PfCCompteurO+1}}% + }{}% + }% + }% + }% + \xdef\NombreRepetX{\fpeval{ceil(\PfCCompteurX/37)}}% + \xdef\NombreRepetO{\fpeval{ceil(\PfCCompteurO/62)}}% + \xdef\PfCTabMulListeFinalePdts{} + \xdef\PfCTabMulListeFinaleNonPdts{} + \xintFor* ##1 in {\xintSeq{1}{\NombreRepetX}}\do{% + \xdef\PfCTabMulListeFinalePdts{\PfCTabMulListeFinalePdts,\PfCTabMulListePdts} + }% + \xintFor* ##1 in {\xintSeq{1}{\NombreRepetO}}\do{% + \xdef\PfCTabMulListeFinaleNonPdts{\PfCTabMulListeFinaleNonPdts,\PfCTabMulListeNonPdts} + }% + \MelangeListe{\PfCTabMulListeFinalePdts}{\PfCCompteurX} + \ignoreemptyitems + \readlist*\PfCListeProduits{\faa} + \MelangeListe{\PfCTabMulListeFinaleNonPdts}{\PfCCompteurO} + \ignoreemptyitems + \readlist*\PfCListeNonProduits{\faa} + \ifboolKV[TabMul]{Enonce}{% + \begin{enumerate} + \xintFor* ##1 in {\xintSeq{1}{\PfCCompteurX}}\do{% + \PfCListeDiviseurs{\PfCListeProduits[##1]}% + \ifnum\PfCNbDiviseurs>1\relax + \MelangeListe{\PfCListeDiviseursRetour}{1}% + \else + \xdef\faa{\PfCListeDiviseursRetour} + \fi + \ignoreemptyitems + \readlist*\PfCListeDiviseurChoisi{\faa}% + \item $\PfCListeDiviseurChoisi[1]\times\fpeval{\PfCListeProduits[##1]/\PfCListeDiviseurChoisi[1]}=$ + } + \end{enumerate} + }{} + \ifboolKV[TabMul]{SchemaEnonce}{% + \tokstabmulpdts{} + \tokstabmulnonpdts{} + \xdef\PfCFoo{\PfCListeProduits[1]} + \xintFor* ##3 in {\xintSeq{2}{\PfCCompteurX}}\do{% + \xdef\PfCFoo{\PfCFoo,\PfCListeProduits[##3]}% + }% + \MelangeListe{\PfCFoo}{\PfCCompteurX}% + \ignoreemptyitems + \readlist*\PfCListeProduits{\faa}% + \foreachitem\compteur\in\PfCListeProduits{\expandafter\UpdatetoksTabMulPdts\compteur\nil}% + \foreachitem\compteur\in\PfCListeNonProduits{\expandafter\UpdatetoksTabMulNonPdts\compteur\nil}% + \BuildTabMulEnonce{\the\tokstabmul}{\the\tokstabmulpdts}{\the\tokstabmulnonpdts} + }{}%% + }{% + \BuildTabMul{\the\tokstabmul}% + } + } + \restorecomparemode% + \reademptyitems% +}% + +\NewDocumentCommand\PfCListeDiviseurs{m}{% + \ifnum#1<10\relax + \xdef\PfCLimiteDiv{#1} + \else + \xdef\PfCLimiteDiv{10} + \fi + \xdef\PfCListeDiviseursRetour{} + \xdef\PfCNbDiviseurs{} + \xintFor* ##2 in {\xintSeq{2}{\PfCLimiteDiv}}\do{% + \modulo{#1}{##2}\relax + \ifnum\remainder=0\relax + \xdef\PfCListeDiviseursRetour{\PfCListeDiviseursRetour ##2,}% + \xdef\PfCNbDiviseurs{\fpeval{\PfCNbDiviseurs+1}}% + \fi + }% +}% + +\def\TabMulCibleCode{% + NbCasesLarg=\TailleTabMul; + Largeur=\useKV[TabMul]{Largeur}; + color CoulFond; + boolean Colore,Stop,Graines; + Colore=\useKV[TabMul]{Couleurs}; + if Colore: + CoulFond=\useKV[TabMul]{Couleur}; + fi; + Graines=\useKV[TabMul]{Graines}; + if Graines: + randomseed:=\useKV[TabMul]{Graine}; + fi; + vardef NombresCibles(text t)= + nbc=0; + for p_=t: + nbc:=nbc+1; + Cible[nbc]=p_; + endfor; + enddef; + % + vardef LectureDesProduits(text t)= + string Sproduits[]; + nbp=0; + for p_=t: + nbp:=nbp+1; + Sproduits[nbp]=p_; + endfor; + enddef; + % + vardef Remplissage(text t)= + pair M[][]; + n=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(TEX(Sproduits[ceiling(uniformdeviate(nbp))]),M[l][h] shifted (Largeur*(0.5,0.5))); + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + Stop:=false; + forever: + basea:=ceiling(1+uniformdeviate(9)); + baseb:=ceiling(1+uniformdeviate(9)); + basec:=0; + for r=1 upto nbc: + if (basea*baseb)<>Cible[r]: + basec:=basec+1; + fi; + endfor; + if basec=nbc: + Stop:=true; + fi; + exitif Stop; + endfor; + label(TEX("$\num{"&decimal(basea)&"}\times\num{"&decimal(baseb)&"}$"),M[l][h] shifted (Largeur*(0.5,0.5))); + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; + % + vardef RemplissagePDF(text t)= + pair M[][]; + n=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(LATEX(Sproduits[ceiling(uniformdeviate(nbp))]),M[l][h] shifted (Largeur*(0.5,0.5))); + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + Stop:=false; + forever: + basea:=ceiling(1+uniformdeviate(9)); + baseb:=ceiling(1+uniformdeviate(9)); + basec:=0; + for r=1 upto nbc: + if (basea*baseb)<>Cible[r]: + basec:=basec+1; + fi; + endfor; + if basec=nbc: + Stop:=true; + fi; + exitif Stop; + endfor; + label(LATEX("$\num{"&decimal(basea)&"}\times\num{"&decimal(baseb)&"}$"),M[l][h] shifted (Largeur*(0.5,0.5))); + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; +}% + +\NewDocumentCommand\BuildTabMulCible{mmm}{% + \ifluatex + \mplibforcehmode + \mplibnumbersystem{double} + \begin{mplibcode} + \TabMulCibleCode + NombresCibles(#3); + LectureDesProduits(#2); + Remplissage(#1); + \end{mplibcode} + \mplibnumbersystem{scaled} + \else + \begin{mpost}[mpsettings={\TabMulCibleCode}] + NombresCibles(#3); + LectureDesProduits(#2); + RemplissagePDF(#1); + \end{mpost} + \fi +} + +\def\TabMulCode{% + NbCasesLarg=\TailleTabMul; + Multiple=\useKV[TabMul]{Multiple}; + Largeur=\useKV[TabMul]{Largeur}; + color CoulFond; + boolean Colore,Stop,Graines; + Colore=\useKV[TabMul]{Couleurs}; + if Colore: + CoulFond=\useKV[TabMul]{Couleur}; + fi; + Graines=\useKV[TabMul]{Graines}; + if Graines: + randomseed:=\useKV[TabMul]{Graine}; + fi; + vardef Remplissage(text t)= + pair M[][]; + n=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(TEX(decimal(Multiple*ceiling(uniformdeviate(9)+1))),M[l][h] shifted (Largeur*(0.5,0.5))); + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + Stop:=false; + forever: + base:=ceiling((1+uniformdeviate(9))*(1+uniformdeviate(9))); + if (base mod Multiple)>0: + Stop:=true; + fi; + exitif Stop; + endfor; + label(TEX(decimal(base)),M[l][h] shifted (Largeur*(0.5,0.5))); + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; + % + vardef RemplissagePDF(text t)= + pair M[][]; + n=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(LATEX(decimal(Multiple*ceiling(uniformdeviate(9)+1))),M[l][h] shifted (Largeur*(0.5,0.5))); + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + Stop:=false; + forever: + base:=ceiling((1+uniformdeviate(9))*(1+uniformdeviate(9))); + if (base mod Multiple)>0: + Stop:=true; + fi; + exitif Stop; + endfor; + label(LATEX(decimal(base)),M[l][h] shifted (Largeur*(0.5,0.5))); + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; + } + +\NewDocumentCommand\BuildTabMul{m}{% + \ifluatex + \mplibforcehmode + \mplibnumbersystem{double} + \begin{mplibcode} + \TabMulCode + Remplissage(#1); + \end{mplibcode} + \mplibnumbersystem{scaled} + \else + \begin{mpost}[mpsettings={\TabMulCode}] + Remplissage(#1); + \end{mpost} + \fi +} + +\def\TabMulEnonceCode{ + NbCasesLarg=\TailleTabMul; + Multiple=\useKV[TabMul]{Multiple}; + Largeur=\useKV[TabMul]{Largeur}; + color CoulFond; + boolean Colore,Stop;%,Graines; + Colore=\useKV[TabMul]{Couleurs}; + if Colore: + CoulFond=\useKV[TabMul]{Couleur}; + fi; + vardef Remplissage(text t)(text listepdt)(text listenonpdt)= + string pdt[],nonpdt[]; + n:=0; + for p_=listepdt: + pdt[n]=p_; + n:=n+1; + endfor; + n:=0; + for p_=listenonpdt: + nonpdt[n]=p_; + n:=n+1; + endfor; + pair M[][]; + n:=0; + nx=0; + no=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(TEX(pdt[nx]),M[l][h] shifted (Largeur*(0.5,0.5))); + nx:=nx+1; + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + label(TEX(nonpdt[no]),M[l][h] shifted (Largeur*(0.5,0.5))); + no:=no+1; + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; + vardef RemplissagePDF(text t)(text listepdt)(text listenonpdt)= + string pdt[],nonpdt[]; + n:=0; + for p_=listepdt: + pdt[n]=p_; + n:=n+1; + endfor; + n:=0; + for p_=listenonpdt: + nonpdt[n]=p_; + n:=n+1; + endfor; + pair M[][]; + n:=0; + nx=0; + no=0; + for p_=t: + for k=0 upto NbCasesLarg-1: + l:=n mod NbCasesLarg; + h:=n div NbCasesLarg; + M[l][h]=Largeur*(l,-h); + if (substring(k,k+1) of p_)="x": + if Colore: + fill ((unitsquare scaled Largeur) shifted M[l][h]) withcolor CoulFond; + fi; + label(TEX(pdt[nx]),M[l][h] shifted (Largeur*(0.5,0.5))); + nx:=nx+1; + elseif (substring(k,k+1) of p_)="X": + fill ((unitsquare scaled Largeur) shifted M[l][h]); + else: + label(TEX(nonpdt[no]),M[l][h] shifted (Largeur*(0.5,0.5))); + no:=no+1; + fi; + trace (unitsquare scaled Largeur) shifted M[l][h]; + n:=n+1; + endfor; + endfor; + enddef; + } + +\NewDocumentCommand\BuildTabMulEnonce{mmm}{% + \ifluatex + \mplibforcehmode + \mplibnumbersystem{double} + \begin{mplibcode} + \TabMulEnonceCode + Remplissage(#1)(#2)(#3); + \end{mplibcode} + \mplibnumbersystem{scaled} + \else + \begin{mpost}[mpsettings={\TabMulEnonceCode}] + RemplissagePDF(#1)(#2)(#3); + \end{mpost} + \fi +}
\ No newline at end of file |