diff options
author | Karl Berry <karl@freefriends.org> | 2023-03-24 21:18:33 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-03-24 21:18:33 +0000 |
commit | cc6f4e3f29e77b52f354827f50369a9f11560faf (patch) | |
tree | 9453f9e8438b70697a6ee2a8cc4dcd17b55ac98e /Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex | |
parent | b9bf16212b67e0a70b842bcbcda686e0d05cb447 (diff) |
profcollege (24mar23)
git-svn-id: svn://tug.org/texlive/trunk@66660 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex b/Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex new file mode 100644 index 00000000000..6ec347c5dc7 --- /dev/null +++ b/Master/texmf-dist/tex/latex/profcollege/PfCPyramideCalculs.tex @@ -0,0 +1,281 @@ + + +%%% +% Pyramide de calculs +%%% +\newcommand\DessinePyramideNombreMul[1]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A[],B[],O; + cote:=\useKV[ClesPyramide]{Cote}; + boolean Aide,Produit,Solution,Vide; + Aide:=\useKV[ClesPyramide]{Aide}; + Vide:=\useKV[ClesPyramide]{Vide}; + Produit:=\useKV[ClesPyramide]{Produit}; + Solution:=\useKV[ClesPyramide]{Solution}; + A1=u*(1,1); + A2-A1=cote*(1,0); + A3=rotation(A2,A1,60); + A4=A1; + B1=iso(A1,A2); + B2=iso(A2,A3); + B3=iso(A3,A1); + O=iso(A1,A2,A3); + path BoiteRec; + BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u; + % On trace et on affiche...éventuellement :) + trace polygone(A1,A2,A3); + for k=1 upto 3: + trace segment(O,B[k]) dashed withdots scaled 0.25; + draw BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + endfor; + if Vide: + else: + % On récupère les valeurs pour déterminer les produits + k=0; + for p_=#1: + k:=k+1; + Facteur[k]=p_; + endfor; + Produit[1]=Facteur[1] * Facteur[2]; + Produit[2]=Facteur[2] * Facteur[3]; + Produit[3]=Facteur[3] * Facteur[1]; + for k=1 upto 3: + if Produit or Solution: + label(TEX("\num{"&decimal(Produit[k])&"}"),(1.75[O,B[k]]-center BoiteRec)); + fi; + if Produit: + else: + label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); + fi; + endfor; + fi; + if Aide: + for k=1 upto 3: + drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={cote:=\useKV[ClesPyramide]{Cote}; + boolean Aide,Produit,Solution,Vide; + Aide:=\useKV[ClesPyramide]{Aide}; + Vide:=\useKV[ClesPyramide]{Vide}; + Produit:=\useKV[ClesPyramide]{Produit}; + Solution:=\useKV[ClesPyramide]{Solution};}] + pair A[],B[],O; + A1=u*(1,1); + A2-A1=cote*(1,0); + A3=rotation(A2,A1,60); + A4=A1; + B1=iso(A1,A2); + B2=iso(A2,A3); + B3=iso(A3,A1); + O=iso(A1,A2,A3); + path BoiteRec; + BoiteRec=((-0.4,-0.5)--(0.4,-0.5){dir0}..{dir90}(0.5,-0.4)--(0.5,0.4){dir90}..{dir180}(0.4,0.5)--(-0.4,0.5){dir180}..{dir-90}(-0.5,0.4)--(-0.5,-0.4){dir-90}..cycle) scaled 1u; + % On trace et on affiche...éventuellement :) + trace polygone(A1,A2,A3); + for k=1 upto 3: + trace segment(O,B[k]) dashed withdots scaled 0.25; + draw BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + endfor; + if Vide: + else: + % On récupère les valeurs pour déterminer les produits + k=0; + for p_=#1: + k:=k+1; + Facteur[k]=p_; + endfor; + Produit[1]=Facteur[1] * Facteur[2]; + Produit[2]=Facteur[2] * Facteur[3]; + Produit[3]=Facteur[3] * Facteur[1]; + for k=1 upto 3: + if Produit or Solution: + label(TEX("\num{"&decimal(Produit[k])&"}"),(1.75[O,B[k]]-center BoiteRec)); + fi; + if Produit: + else: + label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); + fi; + endfor; + fi; + if Aide: + for k=1 upto 3: + drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + drawarrow (0.5[O,A[k+1]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (1.75[O,B[k]]-center BoiteRec) dashed evenly scaled 0.5; + endfor; + fi; + \end{mpost} + \fi +} + +\newcommand\DessinePyramideNombre[1]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A[][],B[]; + path Case[]; + color CaseCouleur; + nbetages:=\useKV[ClesPyramide]{Etages}; + largeur:=\useKV[ClesPyramide]{Largeur}; + hauteur:=\useKV[ClesPyramide]{Hauteur}; + CaseCouleur:=\useKV[ClesPyramide]{Couleur}; + boolean Double; + Double=\useKV[ClesPyramide]{Double}; + Nbeb:=0;%Pour associer les textes avec les points. Plus facile :) + if Double: + for k=nbetages downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,(nbetages-k)*hauteur); + B[Nbeb]=A[k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + for k=nbetages-1 downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[-k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,-(nbetages-k)*hauteur); + B[Nbeb]=A[-k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[-k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + else: + if \useKV[ClesPyramide]{Inverse}: + change:=-1; + else: + change=1; + fi; + for k=nbetages downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,change*(nbetages-k)*hauteur); + B[Nbeb]=A[k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + fi; + if \useKV[ClesPyramide]{Vide}: + else: + Nbeb:=0; + for p_=#1: + Nbeb:=Nbeb+1; + if (substring(0,1) of p_)="*": + fill Case[Nbeb] withcolor CaseCouleur; + trace Case[Nbeb]; + label(TEX(substring(1,length p_) of p_),B[Nbeb]); + elseif (substring(0,1) of p_)="!": + drawoptions(withcolor \useKV[ClesPyramide]{CouleurNombre}); + label(TEX(substring(1,length p_) of p_),B[Nbeb]); + drawoptions(); + else: + label(TEX(p_),B[Nbeb]); + fi; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={nbetages:=\useKV[ClesPyramide]{Etages};largeur:=\useKV[ClesPyramide]{Largeur};hauteur:=\useKV[ClesPyramide]{Hauteur};boolean Vide;Vide=\useKV[ClesPyramide]{Vide};boolean Inverse;Inverse=\useKV[ClesPyramide]{Inverse};color CaseCouleur; CaseCouleur:=\useKV[ClesPyramide]{Couleur};boolean Double;Double=\useKV[ClesPyramide]{Double}; color CouleurNombre;CouleurNombre=\useKV[ClesPyramide]{CouleurNombre};}] + pair A[][],B[]; + path Case[]; + Nbeb:=0; + if Double: + for k=nbetages downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,(nbetages-k)*hauteur); + B[Nbeb]=A[k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + for k=nbetages-1 downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[-k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,-(nbetages-k)*hauteur); + B[Nbeb]=A[-k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[-k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + else: + if \useKV[ClesPyramide]{Inverse}: + change:=-1; + else: + change=1; + fi; + for k=nbetages downto 1: + for l=0 upto (k-1): + Nbeb:=Nbeb+1; + A[k][l]=(0,0)+(nbetages-k)*(largeur/2,0)+(l*largeur,change*(nbetages-k)*hauteur); + B[Nbeb]=A[k][l]; + Case[Nbeb]=((unitsquare xscaled largeur) yscaled hauteur) shifted (A[k][l]-0.5*(largeur,hauteur)); + trace Case[Nbeb]; + endfor; + endfor; + fi; + if \useKV[ClesPyramide]{Vide}: + else: + Nbeb:=0; + for p_=#1: + Nbeb:=Nbeb+1; + if (substring(0,1) of p_)="*": + fill Case[Nbeb] withcolor CaseCouleur; + trace Case[Nbeb]; + label(LATEX(substring(1,length p_) of p_),B[Nbeb]); + elseif (substring(0,1) of p_)="!": + drawoptions(withcolor CouleurNombre); + label(LATEX(substring(1,length p_) of p_),B[Nbeb]); + drawoptions(); + else: + label(LATEX(p_),B[Nbeb]); + fi; + endfor; + \end{mpost} + \fi +}% + +\setKVdefault[ClesPyramide]{Etages=5,Largeur=2cm,Hauteur=1cm,Vide=false,Inverse=false,Double=false,Couleur=Crimson,Multiplication=false,CouleurNombre=blue,Produit=false,Solution=false,Aide=false,Cote=4cm}% + +\newtoks\toklistecaseP% +\def\UpdatetoksPyramide#1\nil{\addtotok\toklistecaseP{"#1",}}% +\def\UpdatetoksPyramideMul#1\nil{\addtotok\toklistecaseP{#1,}}% + +\NewDocumentCommand\PyramideNombre{o m}{% + \useKVdefault[ClesPyramide]% + \setKV[ClesPyramide]{#1}% + \ifboolKV[ClesPyramide]{Multiplication}{% + \ifx\bla#2\bla% + \setKV[ClesPyramide]{Vide=true}% + \DessinePyramideNombreMul{\the\toklistecaseP}% + \else + \setsepchar{,}% + \readlist*\ListePyramide{#2}% + \DessinePyramideNombreMul{\ListePyramide[1],\ListePyramide[2],\ListePyramide[3]}% + \fi + }{% + \ifx\bla#2\bla% + \setKV[ClesPyramide]{Vide=true}% + \DessinePyramideNombre{\the\toklistecaseP}% + \else% + \setsepchar{,}% + \readlist*\ListePyramide{#2}% + \ifboolKV[ClesPyramide]{Double}{% + \def\CalculNombreComposants{\fpeval{\useKV[ClesPyramide]{Etages}*\useKV[ClesPyramide]{Etages}}}% + }{% + \def\CalculNombreComposants{\fpeval{\useKV[ClesPyramide]{Etages}*(\useKV[ClesPyramide]{Etages}+1)/2}}% + }% + \xintifboolexpr{\ListePyramidelen==\CalculNombreComposants}{% + \toklistecaseP{}% + \foreachitem\compteur\in\ListePyramide{\expandafter\UpdatetoksPyramide\compteur\nil}% + \DessinePyramideNombre{\the\toklistecaseP}% + }{Le nombre d'éléments dans la liste des propositions n'est pas compatible avec le nombre d'étages choisi.}% + \fi% + }% +}%
\ No newline at end of file |