diff options
Diffstat (limited to 'macros/latex/contrib')
101 files changed, 29849 insertions, 29586 deletions
diff --git a/macros/latex/contrib/eso-pic/eso-ex2.tex b/macros/latex/contrib/eso-pic/eso-ex2.tex index affe690bd7..b76aeb820d 100644 --- a/macros/latex/contrib/eso-pic/eso-ex2.tex +++ b/macros/latex/contrib/eso-pic/eso-ex2.tex @@ -20,7 +20,7 @@ } % The picture is centered on the page background -\AddToShipoutPicture{\BackgroundPicture} +\AddToShipoutPictureBG{\BackgroundPicture} \begin{document} diff --git a/macros/latex/contrib/eso-pic/eso-ex5.tex b/macros/latex/contrib/eso-pic/eso-ex5.tex index 78d0ee5ef7..27003f2f6e 100644 --- a/macros/latex/contrib/eso-pic/eso-ex5.tex +++ b/macros/latex/contrib/eso-pic/eso-ex5.tex @@ -17,7 +17,7 @@ \newcommand*\cmd[1]{\texttt{\symbol{`\\}#1}} -\AddToShipoutPicture{% +\AddToShipoutPictureBG{% \thicklines\normalfont\ttfamily\Large% \color{blue}\setlength\unitlength{1mm}% \AtTextCenter{\circle*{6}% diff --git a/macros/latex/contrib/eso-pic/eso-pic.dtx b/macros/latex/contrib/eso-pic/eso-pic.dtx index 5cdf9141cd..3ffa221f47 100644 --- a/macros/latex/contrib/eso-pic/eso-pic.dtx +++ b/macros/latex/contrib/eso-pic/eso-pic.dtx @@ -4,14 +4,12 @@ % ------------------------------------------------------------------- % % This file may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.2 +% conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % -% and version 1.2 or later is part of all distributions of LaTeX -% version 1999/12/01 or later. % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % @@ -23,9 +21,9 @@ % \fi % % \iffalse -%<package>\NeedsTeXFormat{LaTeX2e}[2020-10-01] +%<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01] %<package>\ProvidesPackage{eso-pic} -%<package> [2020/10/14 v3.0a eso-pic (RN)] +%<package> [2023/03/23 v3.0b eso-pic (RN)] % %<*driver> \documentclass[a4paper]{ltxdoc} @@ -37,7 +35,7 @@ %</driver> % \fi % -% \CheckSum{750} +% \CheckSum{753} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -55,25 +53,6 @@ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % -% \iffalse meta-comment -% =================================================================== -% @LaTeX-package-file{ -% author = {Rolf Niepraschk}, -% version = "v2.0i", -% date = "12 Apr 2018", -% filename = "eso-pic.sty", -% address = "", -% telephone = "", -% email = "Rolf.Niepraschk@gmx.de", -% codetable = "ISO/ASCII", -% keywords = "LaTeX2e, \shipout, picture", -% dependences = "atbegshi", -% supported = "yes", -% docstring = "LaTeX package which makes it easy to add some -% picture commands to every page." -% } -% =================================================================== -% \fi % % \providecommand\env[1]{\textsf{#1}} % \providecommand\clsname[1]{\textsf{#1}} @@ -123,7 +102,7 @@ % internal macro \cs{ESO@HookIBG}. This macro is part of a % zero-length \texttt{picture} environment with basepoint at the lower left % corner of the page (default) or at the upper left corner -% (package option "texcoord"). The \texttt{picture} environment will be +% (package option ``texcoord''). The \texttt{picture} environment will be % shipped out at every new page. % % \DescribeMacro{\AddToShipoutPictureBG*} \cs{AddToShipoutPictureBG*} works like @@ -138,7 +117,7 @@ % \DescribeMacro{\AddToShipoutPictureFG} % \DescribeMacro{\AddToShipoutPictureFG*} Works like % \cs{AddToShipoutPictureBG} but the picture commands are on the top -% oft the normal document content. +% of the normal document content. % % \DescribeMacro{\ClearShipoutPictureBG} A call of % \cs{ClearShipoutPictureBG} @@ -573,6 +552,7 @@ % `pdfTeX'. Now using with Xe\LaTeX\ should be possible.} % \changes{v2.0a}{2009/10/07}{Better test of color/xcolor} % \changes{v2.0d}{2013/10/06}{Improved color commands} +% \changes{v3.0b}{2023/03/23}{More code inside \cmd{\AtBeginDocument}} % \begin{macrocode} \@ifundefined{colorbox}{% \IfFileExists{xcolor.sty}{\RequirePackage{xcolor}}% @@ -616,14 +596,15 @@ \renewcommand*\ESO@gridlines{\thicklines} \fi \fi +% \changes{v3.0b}{2023/03/23}{More code inside \cmd{\AtBeginDocument}} + \ifESO@texcoord + \def\ESO@yoffsetI{\z@}\def\ESO@yoffsetII{-\paperheight} + \edef\ESO@griddeltaY{-\ESO@griddelta}\edef\ESO@gridDeltaY{-\ESO@gridDelta} + \else + \def\ESO@yoffsetI{-\paperheight}\def\ESO@yoffsetII{\z@} + \edef\ESO@griddeltaY{\ESO@griddelta}\edef\ESO@gridDeltaY{\ESO@gridDelta} + \fi } -\ifESO@texcoord - \def\ESO@yoffsetI{\z@}\def\ESO@yoffsetII{-\paperheight} - \edef\ESO@griddeltaY{-\ESO@griddelta}\edef\ESO@gridDeltaY{-\ESO@gridDelta} -\else - \def\ESO@yoffsetI{-\paperheight}\def\ESO@yoffsetII{\z@} - \edef\ESO@griddeltaY{\ESO@griddelta}\edef\ESO@gridDeltaY{\ESO@gridDelta} -\fi % \end{macrocode} % \begin{macro}{\ESO@gridpicture} % \begin{macrocode} diff --git a/macros/latex/contrib/eso-pic/eso-pic.pdf b/macros/latex/contrib/eso-pic/eso-pic.pdf Binary files differindex 961f29e150..5b570eff40 100644 --- a/macros/latex/contrib/eso-pic/eso-pic.pdf +++ b/macros/latex/contrib/eso-pic/eso-pic.pdf diff --git a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf Binary files differindex 562263c921..bdf8e69752 100644 --- a/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf +++ b/macros/latex/contrib/profcollege/doc/ProfCollege-doc.pdf diff --git a/macros/latex/contrib/profcollege/latex/PfCAutonomie.tex b/macros/latex/contrib/profcollege/latex/PfCAutonomie.tex new file mode 100644 index 0000000000..85f4d39112 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCAutonomie.tex @@ -0,0 +1,234 @@ +%%% Autonomie %%% +\setKVdefault[Autonomie]{AfficheMarge=false,TitreEnigme=Enigme,TitreAtoi=\`A toi,Enigme=false,TexteCorrection=\bfseries Correction,ARemplir=false,Deux=false,Landscape=false}% + +\newcommand\Autonomie[3][]{% + \useKVdefault[Autonomie]% + \setKV[Autonomie]{#1}% + \setsepchar[*]{§*/}% + \readlist*\ListeAutoQ{#2}% + % \setsepchar{§} + % \readlist*\ListeAutoR{#3}% + \setsepchar[*]{§*/}% + \readlist*\ListeAutoEn{#3}% + \clearpage + \begin{tikzpicture}[remember picture,overlay]% + \ifboolKV[Autonomie]{AfficheMarge}{% + \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};% + \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};% + \draw[blue,dashed] (PfCA) rectangle (PfCB);% + }{}% + \foreach \i in {1,...,3}{% + \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);% + \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);% + }% + \foreach \i in{1,...,4}{% + \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);% + \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);% + \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);% + \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);% + }% + \ifboolKV[Autonomie]{Deux}{% + \draw (C2) to (D2);% + \draw (E2) to (F2);% + }{% + \foreach\i in{1,...,4}{% + \draw (C\i) to (D\i);% + \draw (E\i) to (F\i);% + }% + }% + \coordinate (O1) at ($(D1)!0.5!(D2)$); + \coordinate (O2) at ($(D3)!0.5!(D4)$); + \coordinate (O3) at ($(E1)!0.5!(E2)$); + \coordinate (O4) at ($(E3)!0.5!(E4)$); + \coordinate (Q1) at ($(F1)!0.5!(A3)$);% + \coordinate (Q2) at ($(F2)!0.5!(E1)$);% + \coordinate (Q3) at ($(F3)!0.5!(E2)$);% + \coordinate (Q4) at ($(F4)!0.5!(E3)$);% + \coordinate (Q5) at ($(C1)!0.5!(A1)$);% + \coordinate (Q6) at ($(C2)!0.5!(D1)$);% + \coordinate (Q7) at ($(C3)!0.5!(D2)$);% + \coordinate (Q8) at ($(C4)!0.5!(D3)$);% + \ifboolKV[Autonomie]{Landscape}{% + \draw[dashed] (C1) to (F1); + \draw[dashed] (C3) to (F3); + \draw (A2) to (B2);% + }{% + \ifboolKV[Autonomie]{Deux}{% + \draw (C2) to (D2); + \draw (E2) to (F2); + }{% + \foreach\i in{1,...,4}{% + \draw (C\i) to (D\i); + \draw (E\i) to (F\i); + }% + }% + \draw[dashed] (A1) to (B1);% + \draw[dashed] (A3) to (B3);% + }% + %\draw[dashed] (A1) to (B1);% + %\draw[dashed] (A3) to (B3);% + \ifboolKV[Autonomie]{ARemplir}{% + \ifboolKV[Autonomie]{Landscape}{% + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O1) {\ListeAutoQ[1,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O2) {\ListeAutoQ[2,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O3) {\ListeAutoQ[3,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O4) {\ListeAutoQ[4,1]}; + }{% + \ifboolKV[Autonomie]{Deux}{% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test1) at ($(Q1)!0.5!(Q2)$) {\ListeAutoQ[1,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test2) at ($(Q3)!0.5!(Q4)$) {\ListeAutoQ[2,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test3) at ($(Q5)!0.5!(Q6)$) {\ListeAutoQ[3,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test4) at ($(Q7)!0.5!(Q8)$) {\ListeAutoQ[4,1]};% + }{% + \foreach \i in {1,...,4}{% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};% + }% + \foreach \i in {5,...,8}{% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};% + }% + }% + }% + }{% + \foreach \i in {1,...,4}{% + \node[xshift=-5mm,align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};% + }% + \foreach \i in {5,...,8}{% + \node[align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};% + }% + }% + \end{tikzpicture}% + \clearpage% + \begin{tikzpicture}[remember picture,overlay]% + \ifboolKV[Autonomie]{AfficheMarge}{% + \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};% + \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};% + \draw[blue,dashed] (PfCA) rectangle (PfCB);% + }{}% + \foreach \i in {1,...,3}{% + \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);% + \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);% + }% + \foreach \i in{1,...,4}{% + \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);% + \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);% + \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);% + \coordinate[yshift=-\i*0.25*\paperheight] (G\i) at (A2);% + \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);% + }% + \ifboolKV[Autonomie]{Deux}{% + \draw (C2) to (F2);% + }{% + \foreach \i in{1,...,4}{% + \draw (C\i) to (F\i);% + }% + }% + \coordinate (T1) at ($(current page.north west)!0.5!(A1)$);% + \coordinate (T2) at ($(C1)!0.5!(D1)$);% + \coordinate (T3) at ($(C2)!0.5!(D2)$);% + \coordinate (T4) at ($(C3)!0.5!(D3)$);% + \coordinate (T5) at ($(current page.north east)!0.5!(A3)$);% + \coordinate (T6) at ($(E1)!0.5!(F1)$);% + \coordinate (T7) at ($(E2)!0.5!(F2)$);% + \coordinate (T8) at ($(E3)!0.5!(F3)$);% + \coordinate (U1) at ($(C1)!0.5!(D1)$);% + \coordinate (U2) at ($(C2)!0.5!(D2)$);% + \coordinate (U3) at ($(C3)!0.5!(D3)$);% + \coordinate (U4) at ($(current page.south west)!0.5!(B1)$);% + \coordinate (U5) at ($(E1)!0.5!(F1)$);% + \coordinate (U6) at ($(E2)!0.5!(F2)$);% + \coordinate (U7) at ($(E3)!0.5!(F3)$);% + \coordinate (U8) at ($(B3)!0.5!(current page.south east)$);% + \coordinate (R1) at ($(D1)!0.5!(A2)$);% + \coordinate (R2) at ($(D2)!0.5!(G1)$);% + \coordinate (R3) at ($(D3)!0.5!(G2)$);% + \coordinate (R4) at ($(D4)!0.5!(G3)$);% + \coordinate (R5) at ($(E1)!0.5!(A2)$);% + \coordinate (R6) at ($(E2)!0.5!(G1)$);% + \coordinate (R7) at ($(E3)!0.5!(G2)$);% + \coordinate (R8) at ($(E4)!0.5!(G3)$);% + \coordinate (S1) at ($(A1)!0.5!(D1)$);% + \coordinate (S2) at ($(D1)!0.5!(D2)$);% + \coordinate (S3) at ($(D2)!0.5!(D3)$);% + \coordinate (S4) at ($(D3)!0.5!(B1)$);% + \coordinate (S5) at ($(R1)!0.5!(R5)$);% + \coordinate (S6) at ($(R2)!0.5!(R6)$);% + \coordinate (S7) at ($(R3)!0.5!(R7)$);% + \coordinate (S8) at ($(R4)!0.5!(R8)$);% + \coordinate (V1) at ($(T1)!0.5!(U1)$);% + \coordinate (V2) at ($(T2)!0.5!(U2)$);% + \coordinate (V3) at ($(T3)!0.5!(U3)$);% + \coordinate (V4) at ($(T4)!0.5!(U4)$);% + \coordinate (V5) at ($(T5)!0.5!(U5)$);% + \coordinate (V6) at ($(T6)!0.5!(U6)$);% + \coordinate (V7) at ($(T7)!0.5!(U7)$);% + \coordinate (V8) at ($(T8)!0.5!(U8)$);% + \coordinate (W1) at ($(A3)!0.5!(E1)$); + \coordinate (W2) at ($(E1)!0.5!(E2)$); + \coordinate (W3) at ($(E2)!0.5!(E3)$); + \coordinate (W4) at ($(E3)!0.5!(E4)$); + \coordinate (W5) at ($(A1)!0.5!(D1)$); + \coordinate (W6) at ($(D1)!0.5!(D2)$); + \coordinate (W7) at ($(D2)!0.5!(D3)$); + \coordinate (W8) at ($(D3)!0.5!(D4)$); + \ifboolKV[Autonomie]{Landscape}{% + \draw[dashed] (C1) to (F1);% + \draw[dashed] (C3) to (F3); + \draw (A2) to (B2);% + }{% + \draw[dashed] (A1) to (B1);% + \draw[dashed] (A2) to (B2); + \draw[dashed] (A3) to (B3);% + }% + %\draw[dashed] (A1) to (B1);% + %\draw[dashed] (A2) to (B2);% + %\draw[dashed] (A3) to (B3);% + \ifboolKV[Autonomie]{ARemplir}{% + \ifboolKV[Autonomie]{Landscape}{% + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W2) {\ListeAutoEn[4,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W4) {\ListeAutoEn[3,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W6) {\ListeAutoEn[2,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W8) {\ListeAutoEn[1,1]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W1) {\ListeAutoQ[4,2]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W3) {\ListeAutoQ[3,2]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W5) {\ListeAutoQ[2,2]}; + \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W7) {\ListeAutoQ[1,2]}; + }{% + \ifboolKV[Autonomie]{Deux}{% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V1)!0.5!(V2)$) {\ListeAutoEn[1,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V3)!0.5!(V4)$) {\ListeAutoEn[2,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V5)!0.5!(V6)$) {\ListeAutoEn[3,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V7)!0.5!(V8)$) {\ListeAutoEn[4,1]};% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R1)!0.5!(R2)$) {\ListeAutoQ[1,2]};%% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R3)!0.5!(R4)$) {\ListeAutoQ[2,2]};%% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R5)!0.5!(R6)$) {\ListeAutoQ[3,2]};%% + \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R7)!0.5!(R8)$) {\ListeAutoQ[4,2]};%% + }{% + \foreach \i in {1,...,8}{% + \node[text width=0.9*0.25\paperwidth] at (V\i) {\ListeAutoQ[\i,2]};% + \node[text width=0.9*0.25\paperwidth] at (R\i) {\ListeAutoEn[\i,1]};% + }% + }% + }% + }{% + \foreach \i in {1,...,8}{% + \node[rotate=90,anchor=north] (Cor\i) at (S\i) {\useKV[Autonomie]{TexteCorrection}};% + \node[anchor=west,xshift=2em,text width=0.8*0.25\paperwidth] (Test\i) + at (S\i) {\ListeAutoQ[\i,2]};% + \node[anchor=north,yshift=-1em,text width=0.85*0.25\paperwidth] (TestEn\i) + at (T\i) {\textbf{\useKV[Autonomie]{TitreAtoi}} \ListeAutoEn[\i,1]};% + \ifboolKV[Autonomie]{Enigme}{% + \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i) + at (U\i) {% + \ListeAutoEn[\i,2] : \pointilles\\% + Lettre \ding{\fpeval{171+\i}} : \pointilles% + };% + }{% + \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i) + at (U\i) {% + \ListeAutoEn[\i,2]% + };% + }% + }% + }% + \end{tikzpicture}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCBarreNiveaux.tex b/macros/latex/contrib/profcollege/latex/PfCBarreNiveaux.tex new file mode 100644 index 0000000000..8ee730bbfb --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCBarreNiveaux.tex @@ -0,0 +1,62 @@ +%%% +% Barres de niveaux +%%% +\setKVdefault[ClesBarre]{Niveau=false,LimiteI=25,LimiteF=50,LimiteS=75,TexteOrigine=0,TexteReference=100,CouleurGraduation=white,CouleurFond=gray!50,CouleurBarre=black,Graduation=false,Nom=D\'efaut,Pas=10,CouleurI=red,CouleurF=orange,CouleurS=yellow,CouleurM=green} + +\newlength{\barrewidth} + +\newcommand\Jauge[2][]{% + \setlength{\barrewidth}{\linewidth-2\fboxsep}% + \useKVdefault[ClesBarre]% + \setKV[ClesBarre]{#1}% + \xdef\NomComp{\useKV[ClesBarre]{Nom}}% + \def\TexteOrigine{\useKV[ClesBarre]{TexteOrigine}}% + \def\TexteReference{\useKV[ClesBarre]{TexteReference}}% + \xdef\CouleurFond{\useKV[ClesBarre]{CouleurFond}}% + \xdef\CouleurGrad{\useKV[ClesBarre]{CouleurGraduation}}% + \xdef\CouleurBarre{\useKV[ClesBarre]{CouleurBarre}}% + \xdef\CouleurI{\useKV[ClesBarre]{CouleurI}}% + \xdef\CouleurF{\useKV[ClesBarre]{CouleurF}}% + \xdef\CouleurS{\useKV[ClesBarre]{CouleurS}}% + \xdef\CouleurM{\useKV[ClesBarre]{CouleurM}}% + \ifboolKV[ClesBarre]{Niveau}{% + \begin{tikzpicture}[rounded corners=2pt,very thin] + \fill [gray!50] (0,0) rectangle (\barrewidth, 0.15); + \xintifboolexpr{#2<\useKV[ClesBarre]{LimiteI}}{% + \fill [\CouleurI] (0,0) rectangle (#2/100*\barrewidth, 0.15); + }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteF}}{% + \fill [\CouleurF] (0,0) rectangle (#2/100*\barrewidth, 0.15); + }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteS}}{% + \fill [\CouleurS] (0,0) rectangle (#2/100*\barrewidth, 0.15); + }{\fill [\CouleurM] (0,0) rectangle (#2/100*\barrewidth, 0.15);} + }% + }% + \node[anchor=south west] at (0,0.5em) {\NomComp};% + \node[anchor=north] at (0,-0.25em) {\TexteOrigine}; + \node[anchor=north] at (\barrewidth,-0.25em) {\TexteReference}; + \ifboolKV[ClesBarre]{Graduation}{% + \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}% + { + \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15); + } + }{} + \foreach \s in {\useKV[ClesBarre]{LimiteI},\useKV[ClesBarre]{LimiteF},\useKV[ClesBarre]{LimiteS}}% + { + \draw[black] (\s/100*\barrewidth,-0.1)--(\s/100*\barrewidth,0.2);% + } + \end{tikzpicture}% + }{% + \begin{tikzpicture}[rounded corners=2pt,very thin] + \fill [\CouleurFond] (0,0) rectangle (\barrewidth, 0.15);% + \fill [\CouleurBarre] (0,0) rectangle (#2/100*\barrewidth, 0.15);% + \node[anchor=south west] at (0,0.5em) {\NomComp};% + \node[anchor=north] at (0,-0.25em) {\useKV[ClesBarre]{TexteOrigine}};% + \node[anchor=north] at (\barrewidth,-0.25em) {\useKV[ClesBarre]{TexteReference}};% + \ifboolKV[ClesBarre]{Graduation}{% + \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}% + {% + \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15); + }}{}% + \end{tikzpicture}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCBarresCalculs.tex b/macros/latex/contrib/profcollege/latex/PfCBarresCalculs.tex new file mode 100644 index 0000000000..12b5077025 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCBarresCalculs.tex @@ -0,0 +1,80 @@ +%%% +% Barres de calculs +%%% +\setKVdefault[SuiteBarre]{Litteral=false,Perso=false,Decimaux=false} + +\NewDocumentCommand\BarresCalculs{o m m}{% + \useKVdefault[SuiteBarre]% + \setKV[SuiteBarre]{#1}% + \xdef\PfCListeCalculsBarre{}% + \xdef\PfCListeResultatsBarre{}% + \ignoreemptyitems% + \ifboolKV[SuiteBarre]{Perso}{% + \setsepchar[*]{,*§}% + \readlist*\PfCListeBarresCalculs{#2}% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% + }% + \setsepchar{,}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\ifboolKV[SuiteBarre]{Decimaux}{% + \num{\fpeval{\PfCListeBarresCalculs[\fpeval{##1-1},1]}}% + }{% + \begin{CAS} + c = \PfCListeBarresCalculs[\fpeval{##1-1},1] + \end{CAS}$\print{c:autosimplify()}$}% + }}&\Block{2-1}{\PfCListeResultats[##1]}&\Block{2-1}{$\PfCListeBarresCalculs[##1,2]$}\\ + &&\\ + }% + \end{NiceTabular} + }{% + \setsepchar{,}%\ignoreemptyitems% + \readlist*\PfCListeBarresCalculs{#2}% + \ifboolKV[SuiteBarre]{Litteral}{% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% + }% + \setsepchar[*]{,*/}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \setsepchar{,}% + \readlist*\PfCListeCalculs{#2}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{$\print{c:expand():topolynomial()}$}}&\Block{2-1}{\PfCListeResultats[##1,1]}&\Block{2-1}{\begin{CAS} + vars('x') + c = \PfCListeCalculs[##1] + \end{CAS}$\print{c}$}\\ + &&\\ + }% + \end{NiceTabular} + }{% + \foreachitem\compteur\in\PfCListeBarresCalculs{% + \StrChar{#3}{\compteurcnt}[\PfCLettreB]% + \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% + \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \num{\fpeval{\compteur}}/\PfCLettreC,}% + \StrSubstitute[0]{\compteur}{*}{\times}[\PfCListeResultatEtapeA]% + \StrSubstitute[0]{\PfCListeResultatEtapeA}{/}{\div}[\PfCListeResultatEtapeB]% + \StrSubstitute[0]{\PfCListeResultatEtapeB}{(}{\left(}[\PfCListeResultatEtapeC]% + \StrSubstitute[0]{\PfCListeResultatEtapeC}{)}{\right)}[\PfCListeResultatEtapeD]% + \xdef\PfCListeCalculsBarre{\PfCListeCalculsBarre $\PfCListeResultatEtapeD$,}% + }% + \setsepchar[*]{,*/}% + \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% + \setsepchar{,}% + \readlist*\PfCListeCalculs{\PfCListeCalculsBarre}% + \begin{NiceTabular}{ccc}[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% + \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\PfCListeResultats[\fpeval{##1-1},1]}}&\Block{2-1}{\PfCListeResultats[##1,2]}&\Block{2-1}{\PfCListeCalculs[##1]}\\ + &&\\ + }% + \end{NiceTabular} + }% + }% + \reademptyitems% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCBillard.tex b/macros/latex/contrib/profcollege/latex/PfCBillard.tex new file mode 100644 index 0000000000..1dcde0e4c4 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCBillard.tex @@ -0,0 +1,259 @@ +%%% +% Billard +%%% +\setKVdefault[ClesBillard]{Longueur=8cm,Largeur=5cm,Solution=false,Angle=70,Depart=0.5,Vrai=false} + +\NewDocumentCommand\Billard{o m}{% + \useKVdefault[ClesBillard]% + \setKV[ClesBillard]{#1}% + \ifboolKV[ClesBillard]{Solution}{% + \MPBillardSolution{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}% + }{% + \MPBillard{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}% + }% +}% + +\def\MPBillard#1#2#3{% + \mplibcodeinherit{disable}% + \begin{Geometrie}[CoinHD={(\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm)}] + boolean Vrai; + Vrai:=\useKV[ClesBillard]{Vrai}; + % On définit la liste des 25 lettres alphabétiques dans laquelle on choisit autant de lettres que la longueur du mot + % On a retiré la lettre Q pour des questions d'alignements esthétiques. + vardef ChoixLettre= + save Lettre,choixalea; + string Lettre; + choixalea=floor(uniformdeviate(26)+1); + if choixalea=1: + Lettre="A"; + elseif choixalea=2: + Lettre="B"; + elseif choixalea=3: + Lettre="C"; + elseif choixalea=4: + Lettre="D"; + elseif choixalea=5: + Lettre="E"; + elseif choixalea=6: + Lettre="F"; + elseif choixalea=7: + Lettre="G"; + elseif choixalea=8: + Lettre="H"; + elseif choixalea=9: + Lettre="I"; + elseif choixalea=10: + Lettre="J"; + elseif choixalea=11: + Lettre="K"; + elseif choixalea=12: + Lettre="L"; + elseif choixalea=13: + Lettre="M"; + elseif choixalea=14: + Lettre="N"; + elseif choixalea=15: + Lettre="O"; + elseif choixalea=16: + Lettre="P"; + elseif choixalea=17: + Lettre="O"; + elseif choixalea=18: + Lettre="R"; + elseif choixalea=19: + Lettre="S"; + elseif choixalea=20: + Lettre="T"; + elseif choixalea=21: + Lettre="U"; + elseif choixalea=22: + Lettre="V"; + elseif choixalea=23: + Lettre="W"; + elseif choixalea=24: + Lettre="X"; + elseif choixalea=25: + Lettre="Y"; + elseif choixalea=26: + Lettre="Z"; + fi; + Lettre + enddef; + % On crée un Quick Sort + def QS(expr ndeb,nfin)= + begingroup + save v,m,x; + if ndeb<nfin: + v:=l[cpt[ndeb]]; + m:=ndeb; + for i=(ndeb+1) upto nfin: + if l[cpt[i]]<v: + m:=m+1; + x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x; + fi + endfor; + x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x; + QS(ndeb,m-1); + QS(m+1,nfin); + fi + endgroup + enddef; + % On définit le rectangle + pair M[],Co,Intermed; + M1=u*(1,2); + M2-M1=(\useKV[ClesBillard]{Longueur},0); + M3-M2=(0,\useKV[ClesBillard]{Largeur}); + M4-M3=M1-M2; + Co=iso(M1,M3); + path rec,cote[]; + rec=polygone(M1,M2,M3,M4); + cote1=segment(M1,M2); + cote2=segment(M2,M3); + cote3=segment(M3,M4); + cote4=segment(M4,M1); + trace rec; + pair Pt[],FauxPt[]; + nbfaux=0; + l1=#2; + Pt[1]=point(l1) of rec; + angleref=#3; + if l1>3: + angledepart=90+angleref; + Pt[2]=demidroite(Pt[1],rotation(M1,Pt1,angledepart)) intersectionpoint (subpath(0,3) of rec); + dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]); + elseif l1>2: + angledepart=180+angleref; + Pt[2]=demidroite(Pt[1],rotation(M4,Pt1,angledepart)) intersectionpoint ((subpath(3,4) of rec)--(subpath(0,2) of rec)); + dotlabel.top(TEX(substring(0,1) of #1),Pt[1]); + elseif l1>1: + angledepart=angleref-90; + Pt[2]=demidroite(Pt[1],rotation(M3,Pt1,angledepart)) intersectionpoint ((subpath(2,4) of rec)--(subpath(0,1) of rec)); + dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]); + else: + angledepart=angleref; + Pt[2]=demidroite(Pt[1],rotation(M2,Pt1,angledepart)) intersectionpoint (subpath(1,4) of rec); + dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]); + fi; + tourne=90; + numeric Blong; + BLong:=length #1; + % Détermination des points. + if Vrai: + for k=3 upto BLong: + Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M2-M3); + if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1): + Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; + else: + Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M1-M2); + Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; + fi; + endfor; + else: + for k=3 upto BLong: + Intermed:=rotation(Pt[k-2],Pt[k-1],tourne); + if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1): + Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; + else: + Intermed:=rotation(Pt[k-2],Pt[k-1],-tourne); + Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; + fi; + endfor; + fi; + % Ajout des faux points + path SPath[]; + cpt[1]:=1; + cpt[BLong+1]:=BLong+1; + l[BLong+1]:=4; + for k=2 upto BLong: + SPath[k]=rec cutafter demidroite(Co,Pt[k]); + l[k]=arclength SPath[k]; + l[k]:=arctime l[k] of rec; + cpt[k]:=k; + endfor; + QS(1,BLong+1); + for k=2 upto BLong+1: + if l[cpt[k]]-l[cpt[k-1]]>0.3: + nbfaux:=nbfaux+1; + FauxPt[nbfaux]=point(l[cpt[k-1]]+0.1) of rec; + nbfaux:=nbfaux+1; + FauxPt[nbfaux]=point(l[cpt[k]]-0.1) of rec; + fi; + endfor; + drawoptions(); + % Tracés + drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25; + % Labelisation + for k=2 upto BLong: + if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1): + dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1): + dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1): + dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1): + dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]); + fi; + endfor; + for k=1 upto nbfaux: + if (demidroite(Co,FauxPt[k]) intersectiontimes cote[1])<>(-1,-1): + dotlabel.bot(TEX(ChoixLettre),FauxPt[k]); + elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[2])<>(-1,-1): + dotlabel.rt(TEX(ChoixLettre),FauxPt[k]); + elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[3])<>(-1,-1): + dotlabel.top(TEX(ChoixLettre),FauxPt[k]); + elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[4])<>(-1,-1): + dotlabel.lft(TEX(ChoixLettre),FauxPt[k]); + fi; + endfor; + picture Reponse; + Reponse=image( + trace segment((0,0),(7*BLong*mm-2mm,0)) dashed dashpattern(on5mm off2mm); + ); + trace Reponse shifted((xpart(Co),5mm)-center Reponse); + \end{Geometrie}% +}% + +\def\MPBillardSolution#1#2#3{% + \mplibcodeinherit{enable}% + \begin{mplibcode}% + Figure(0,0,\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm); + trace rec; + % Tracés + drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25; + for k=1 upto BLong-1: + trace segment(Pt[k],Pt[k+1]); + endfor; + if Vrai=false: + for k=2 upto BLong-1: + trace codeperp(Pt[k-1],Pt[k],Pt[k+1],5); + endfor; + fi; + % Labelisation + if l1>3: + dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]); + elseif l1>2: + dotlabel.top(TEX(substring(0,1) of #1),Pt[1]); + elseif l1>1: + dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]); + else: + dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]); + fi; + for k=2 upto BLong: + if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1): + dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1): + dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1): + dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]); + elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1): + dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]); + fi; + endfor; + trace Reponse shifted((xpart(Co),5mm)-center Reponse); + % On affiche les lettres de la réponse. + for k=1 upto BLong: + label.top(TEX(substring(k-1,k) of #1),((xpart(Co),5mm)-center Reponse)+(k-1)*(7mm,0)+(2.5mm,0)); + endfor; + \end{mplibcode}% + \mplibcodeinherit{disable}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCBonSortie.tex b/macros/latex/contrib/profcollege/latex/PfCBonSortie.tex new file mode 100644 index 0000000000..25408ad5fe --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCBonSortie.tex @@ -0,0 +1,95 @@ +%%% +% Bon de sortie +%%% +\newcommand\BonSortieBandeau{% + Nom : \hfill Date : \hspace*{3cm} +} + +\newtcolorbox{Sortie}{% + %Titre + colbacktitle=white, + fonttitle=\color{black}\Large\bfseries, + toptitle=2mm, + bottomtitle=2mm, + title={\BonSortieBandeau}, + %%Cadre principal + enhanced, + nobeforeafter, + width=13.15cm, + height=8.8cm, + colback=white, + valign=top, + %Cadre bas + sidebyside, + righthand width=0.05\linewidth, +} + +\setKVdefault[ClesSortie]{MemeEnonce=false}% + +\newcommand\BonSortieSmiley{% + \Huge + \begin{center} + \RKangry + + \vspace{1em} + + \RKsad + + \vspace{1em} + + \RKsmallsmile + + \vspace{1em} + + \RKbigsmile + \end{center} +} + +\NewDocumentCommand\BonSortie{o m m m m}{% + \clearpage% + \useKVdefault[ClesSortie]% + \setKV[ClesSortie]{#1}% + \begin{tikzpicture}[remember picture, overlay] + \draw[dashed] (current page.north) to (current page.south); + \draw[dashed] (current page.west) to (current page.east); + \coordinate[xshift=7.425cm,yshift=-5.25cm] (A) at (current page.north west); + \coordinate[xshift=-7.425cm,yshift=-5.25cm] (B) at (current page.north east); + \coordinate[xshift=7.425cm,yshift=5.25cm] (C) at (current page.south west); + \coordinate[xshift=-7.425cm,yshift=5.25cm] (D) at (current page.south east); + \ifboolKV[ClesSortie]{MemeEnonce}{% + \foreach\i\in in {A,B,C,D}{% + \node (\i1) at (\i) {\begin{Sortie} + #2 + \tcblower + \BonSortieSmiley + \end{Sortie} + }; + } + }{% + \node (A1) at (A) {\begin{Sortie} + #2 + \tcblower + \BonSortieSmiley + \end{Sortie} + }; + \node (B1) at (B) {\begin{Sortie} + #3 + \tcblower + \BonSortieSmiley + \end{Sortie} + }; + \node (C1) at (C) {\begin{Sortie} + #4 + \tcblower + \BonSortieSmiley + \end{Sortie} + }; + \node (D1) at (D) {\begin{Sortie} + #5 + \tcblower + \BonSortieSmiley + \end{Sortie} + }; + } + \end{tikzpicture} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCAN.tex b/macros/latex/contrib/profcollege/latex/PfCCAN.tex new file mode 100644 index 0000000000..ca1ed485c3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCAN.tex @@ -0,0 +1,347 @@ +% Gestion de l'aléatoire (pour la CAN) +\newcommand\ChoixAlea[4][]{% + \ifx\bla#1\bla% + \xdef#4{\fpeval{randint(#2,#3)}}% + \else% + \xdef#4{\fpeval{round(randint(#2,#3)+rand(),#1)}}% + \fi% +}% + +\def\VariableAlea#1#2{% + \xdef#1{\fpeval{#2}}% +}% + +% On bloque la graine de fabrication des nombres aléatoires. +\ExplSyntaxOn +\cs_new_eq:NN \PfCGraineAlea \sys_gset_rand_seed:n +\ExplSyntaxOff + +%%% +% Course aux nombres +%%% + +% https://tex.stackexchange.com/questions/642775/when-displaying-a-datatool-database-with-dtldisplaylongdb-how-to-obtain-a-hor +% Patch éventuel à ajouter +%\makeatletter +%\expandafter\patchcmd\expandafter{\csname\string\DTLdisplaylongdb\endcsname}% +% {\@dtl@resetdoamp\dtldisplaystarttab}% +% {\dtldisplaystarttab\@dtl@resetdoamp}% +% {\message{Patching succeeded.}}% +% {\message{Patching failed.}}% +%\makeatother + +\setKVdefault[ClesMathAlea]{NbQ=5,ChoixTables=2-9,ValeurMax=20,Classique,Trou=false,Melange=false,Multiple=2,Theme=false}% +\defKV[ClesMathAlea]{Trous=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Trou}}% +\defKV[ClesMathAlea]{Melanges=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Melange}}% + +\newcommand\MathAlea[2][]{% + \useKVdefault[ClesMathAlea]% + \setKV[ClesMathAlea]{#1}% + \input{#2}% +}% + +\newcommand\CourseNombreTotalQuestions[1]{% + \setKV[ClesCN]{TotalQ=#1}% + \xdef\CNfoo{}% + \xintFor* ##1 in{\xintSeq{1}{#1}}\do{% + \xdef\CNfoo{\CNfoo ##1,}% + }% +}% + +\setKVdefault[ClesCN]{% + Stretch=2.5,%Elasticité du tableau + NbQ=5,%Nb de questions à poser + RAZ=false,%Pour remettre à zéro le compteur des questions + Ordre=false,%Pour mettre toutes les questions dans l'ordre des numéros + Exercice=false,%Pour utiliser l'aléatoire des questions mais sans habillage particulier, autre que des \item + Perso=false,%Pour utiliser un choix personnel des questions + Lecture=false,%Pour différencier avec une lecture automatisée sur les numéros de fichiers + Maitre=false,%Pour indiquer qu'on prend en compte ou pas les sous-dossiers + Nom=false,%Pour afficher le nom des fichiers utilisés. + Theme=false,%Pour afficher le theme travaillé dans les fichiers utilisés (à retravailler). + AMC=false,% + Multi=false,% + CAN=false,%Pour compléter la case réponse. + CoefQ=0.4,%Coefficient multiplication de \linewidth pour la colonne question + CoefR=0.35,%Coefficient multiplication de \linewidth pour la colonne réponse + CoefJ=0.15,%Coefficient multiplication de \linewidth pour la colonne jury +}% +\defKV[ClesCN]{Liste=\setKV[ClesCN]{Perso=true}\setKV[ClesCN]{Lecture}}% +\defKV[ClesCN]{Dossier=\setKV[ClesCN]{Lecture}}% +\defKV[ClesCN]{Debut=\setKV[ClesCN]{RAZ}}% +\setsepchar[*]{,*/}% +\readlist*\ListeMotsCAN{La moitié de /2,Le double de /1,Le triple de /1, Le tiers de /3,Le nombre dix fois plus grand que /1,Le nombre cent fois plus grand que /1,Le nombre mille fois plus grand que /1,Le nombre dix fois plus petit que /10,Le nombre cent fois plus petit que /100,Le nombre mille fois plus petit que /1000}% +\readlist*\ListeMulAstucieuxCAN{50/2,25/4,20/5}% +\readlist*\ListeLieuxObjetsCAN{boulangerie/pains au chocolat/un pain au chocolat,boulangerie/cookies/un cookie,boulangerie/brioches/une brioche,piscine/entrées/une entrée,boucherie/saucisses/une saucisse,boucherie/cuisses de poulet/une cuisse de poulet}% +\readlist*\ListeNomsCAN{Aude/Elle/d'Aude,Bernard/Il/de Bernard,Céline/Elle/de Céline,Daniel/Il/de Daniel,\'Elise/Elle/d'\'Elise,Fabien/Il/de Fabien,Gérard/Il/de Gérard,Hélène/Elle/d'Hélène,Ilies/Il/d'Ilies,Jasmine/Elle/de Jasmine,Kylian/Il/de Kylian,Laurent/Il/de Laurent,Mathilde/Elle/de Mathilde,Nina/Elle/de Nina,Octave/Il/d'Octave,Philippe/Il/de Philippe,Joachim/Il/de Joachim,Thérèse/Elle/de Thérèse,Nawel/Elle/de Nawel,Alexandre/Il/d'Alexandre,Maxence/Il/de Maxence,Sophie/Elle/de Sophie,Christophe/Il/de Christophe,Myriam/Elle/de Myriam,Nathalie/Elle/de Nathalie}% +\readlist*\ListeComposantStatCAN{voitures/un garage/Cross-over/Utilitaires/Berlines,fruits/une corbeille/Pommes/Oranges/Bananes,vêtements/une armoire/Pulls/T-shirts/Chemises,couverts/un tiroir/Fourchettes/Couteaux/Cuillères}% +\readlist*\ListeObjetsSymbolesCAN{fleurs/96,ciseaux/36,crayons/47,enveloppes/41}%uniquement avec pifont +\setsepchar{,}% +\readlist*\ListeObjetsCAN{bonbons,billes,jouets,fruits,biscuits,gâteaux,pommes,poires,pains au chocolat,cookies,croissants,muffins,brioches,saucisses,cuisses de poulet}% +\readlist*\ListePetitsObjetsCAN{bonbons,billes,biscuits,gommes,clous,vis} +\readlist*\ListeFruitsCAN{pommes,poires,abricots,cerises,fraises,framboises,noix,pêches,nectarines,myrtilles} +\readlist*\ListeSommetsCAN{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z} + +\newcommand\ExtraitPetitsObjets[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListePetitsObjetsCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListePetitsObjetsCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \readlist*\PetitsObjetsMelanges{\faa}% +}% + +\newcommand\ExtraitObjets[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeObjetsCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeObjetsCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \readlist*\ObjetsMelanges{\faa}% +}% + +\newcommand\ExtraitSymboles[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeObjetsSymbolesCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeObjetsSymbolesCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \setsepchar[*]{,*/}% + \readlist*\SymbolesMelanges{\faa}% + \setsepchar{,}% +}% + +\newcommand\ExtraitSommet[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeSommetsCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeSommetsCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \readlist*\SommetsMelanges{\faa}% + \readlist*\PtAlea{\faa}% +}% + +\newcommand\ExtraitFruit[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeFruitsCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeFruitsCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \readlist*\FruitsMelanges{\faa}% +}% + +\newcommand\ExtraitNom[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeNomsCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeNomsCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \setsepchar[*]{,*/}% + \readlist*\NomsMelanges{\faa}% + \setsepchar{,}% +}% + +\newcommand\ExtraitElements[1]{% + \xdef\CANSGFoo{}% + \foreachitem\compteur\in\ListeComposantStatCAN{% + \xdef\CANSGFoo{\CANSGFoo \ListeComposantStatCAN[\compteurcnt],}% + }% + \MelangeListe{\CANSGFoo}{#1}% + \setsepchar[*]{,*/}% + \readlist*\ElementsMelanges{\faa}% + \setsepchar{,}% +}% + +\newcounter{CNNumQ}% +\setcounter{CNNumQ}{1}% + +\newcommand\CANNew{% + \textcolor{Crimson}{\faCopy}% +}% + +\newread\RecupNbFichiers +\newread\RecupSSDossiers +\newread\zzz +\def\zzpar{\par}% + +\makeatletter +\def\app@exe{\write18} +% Recuperer les sous-dossiers +\def\RecupererSousDossiers#1{%#1 est le dossier contenant les fichiers can classés en sous-dossier + \app@exe{rm -f RecapSSDossier.tmp ; ls -1 -I "*.tex" #1 > RecapSSDossier.tmp}% + \immediate\openin\zzz=RecapSSDossier.tmp + \loop% + \read\zzz to \tmp% + \ifx\tmp\zzpar\else% + \xdef\CNFOOSSDossiers{\CNFOOSSDossiers \expandafter\detokenize\expandafter{\tmp},}% + \fi% + \ifeof\zzz\else% + \repeat% + \setsepchar{,}\ignoreemptyitems + \readlist*\ListeSSDossiers{\CNFOOSSDossiers} +} + +\def\RecupererFichierTeXSSDossier#1#2{% + \openin\zzz="|ls #1/#2/*.tex"% + \loop% + \read\zzz to \tmp% + \ifx\tmp\zzpar\else% + \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% + \fi% + \ifeof\zzz\else% + \repeat% +} + +\def\RecupererFichierTeXDossier#1{% + \xdef\CNFOO{}% + \openin\zzz="|ls #1/*.tex" + \loop% + \read\zzz to \tmp% + \ifx\tmp\zzpar\else% + \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% + \fi% + \ifeof\zzz\else% + \repeat% +} + +\def\DefinirListeFichiers{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeFichiers{\CNFOO}% +} + +\def\RecupererFichierTeXAllSSDossier#1{% + \RecupererSousDossiers{#1}% + \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}% + \DefinirListeFichiers% +} + +\def\RecupererFichierTeXAllDossier#1{% + \RecupererFichierTeXDossier{#1}% + \DefinirListeFichiers% +} + +\def\RecupererFichierTeXComplet#1{% + \RecupererFichierTeXDossier{#1}% + \RecupererSousDossiers{#1}% + \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}% + \DefinirListeFichiers% +} + +\def\RecupererFichierTeXSSDossierPerso#1{% + \openin\zzz="|ls #1/*.tex" + \loop% + \read\zzz to \tmp% + \ifx\tmp\zzpar\else% + \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% + \fi% + \ifeof\zzz\else% + \repeat% +} + +\makeatother + +\newcommand\CNTheme[1]{}% +\newcommand\CNReponse{}% + +\newlength{\PfCLargeurQuestion}% +\newlength{\PfCLargeurReponse}% +\newlength{\PfCLargeurJury}% + +\NewDocumentCommand\CourseNombre{o m}{% + \useKVdefault[ClesCN]% + \setKV[ClesCN]{#1}% + \ifboolKV[ClesCN]{Theme}{\renewcommand\CNTheme[1]{{\ttfamily Thème : ##1}\par}}{}% + \ifboolKV[ClesCN]{RAZ}{% + \setcounter{CNNumQ}{\useKV[ClesCN]{Debut}}% + }{}% + \setKV[ClesMathAlea]{NbQ=1}% + \xdef\CNFOOSSDossiers{}% + \xdef\CNFOO{}% + \ifboolKV[ClesCN]{Lecture}{% + \ifboolKV[ClesCN]{Perso}{% + % % Ici \useKV[ClesCN]{Liste} + \xdef\CNFOOListePerso{\useKV[ClesCN]{Liste}}% + % % OK -> Là, normalement, c'est la liste des dossiers choisis par l'utilisateur : \CNFOOListePerso + \setsepchar{,}% + \readlist*\ListeDesSSDossiersPerso{\CNFOOListePerso}% + % % \par OK -> Là, normalement, c'est la liste des dossiers perso sous forme de liste : \showitems\ListeDesSSDossiersPerso[]% + \foreachitem\compteur\in\ListeDesSSDossiersPerso{\RecupererFichierTeXSSDossierPerso{\ListeDesSSDossiersPerso[\compteurcnt]}}% + \DefinirListeFichiers% + % % \par OK -> Là, enfin, normalement, c'est la liste des fichiers contenus dans les dossiers perso : + % % \showitems\ListeFichiers[] + }{% + \ifboolKV[ClesCN]{Maitre}{% + % % On récupère tous les fichiers can dans les sous-dossiers + % % et on construit une liste \ListeFichiers contenant les chemins des fichiers considérés. + \RecupererFichierTeXComplet{\useKV[ClesCN]{Dossier}}% + }{% + % % Là + % % On récupère seulement les fichiers can de ce dossier + % % et on consruit une liste \ListeFichiers contenant les chemins des fichiers considérés. + \RecupererFichierTeXAllDossier{\useKV[ClesCN]{Dossier}}% + }% + }% + % % On crée la liste du nombre total de questions + \xdef\CNfooListe{}% + \xintFor* ##1 in{\xintSeq{1}{\ListeFichierslen}}\do{% + \xdef\CNfooListe{\CNfooListe ##1,}% + }% + % % \par OK -> normalement, on a la liste du nombre de questions : \CNfooListe + % On règle maintenant les dimensions nécessaires. + % \ifboolKV[ClesCN]{CAN}{ + \setlength{\PfCLargeurQuestion}{\useKV[ClesCN]{CoefQ}\linewidth}\setlength{\PfCLargeurReponse}{\useKV[ClesCN]{CoefR}\linewidth}\setlength{\PfCLargeurJury}{\useKV[ClesCN]{CoefJ}\linewidth}% + % % On affiche les questions : + \ifboolKV[ClesCN]{Ordre}{% + % % soit dans un exercice + \ifboolKV[ClesCN]{Exercice}{% + % % Attention le style de l'environnement est à choisir par l'utilisateur + \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{% + \item\input{\ListeFichiers[##1]}% + }% + }{% Soit toutes les questions au format course + \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}% + \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}% + \hhline{~---}% + \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\% + \hline% + \endhead% + \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{% + \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\input{\ListeFichiers[##1]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&\ifboolKV[ClesCN]{CAN}{\ifboolKV[ClesCN]{Nom}{\multirow{2}{*}{\CNReponse}}{\multirow{1}{*}{\CNReponse}}}{}&\\% + \hline% + }% + \end{longtable}% + \renewcommand{\arraystretch}{1}% + }% + }{% + % On prévient l'utilisateur si le nb de questions est inférieur à NbQ + \xintifboolexpr{\ListeFichierslen<\useKV[ClesCN]{NbQ}}{% + \faExclamationCircle~Le nombre maximal de questions disponibles est inférieur au nombre de questions à afficher. Modifier la clé {\ttfamily NbQ} ou ajouter des questions dans le(s) répertoire(s).% + }{%%On choisit NbQ questions parmi la liste de fichiers + \MelangeListe{\CNfooListe}{\useKV[ClesCN]{NbQ}}% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeCNQuestions{\faa} + \ifboolKV[ClesCN]{Exercice}{% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{% + \item\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}% + }% + }{% On les affiche + \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}% + \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}% + \hhline{~---}% + \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\% + \hline% + \endhead% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{% + \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[\Numerodelaquestionaposer]}{}&\ifboolKV[ClesCN]{CAN}{\CNReponse}{}&\\ + \hline + }% + \end{longtable}% + \renewcommand{\arraystretch}{1}% + }% + }% + }% + }{% + \input{#2} + }% +}% +% fin course aux nombres
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCalculatrice.tex b/macros/latex/contrib/profcollege/latex/PfCCalculatrice.tex new file mode 100644 index 0000000000..b6d70fe28e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCalculatrice.tex @@ -0,0 +1,143 @@ +%%% +% Calculatrice +%%% +%https://tex.stackexchange.com/questions/290321/mimicking-a-calculator-inputs-and-screen +\definecolor{lightorange}{rgb}{0.9,0.4,0}% +\definecolor{lightestorange}{rgb}{1,0.8,0.5}% +\definecolor{darkorange}{rgb}{0.2,0.1,0}% + +\colorlet{blackened}{black!90!white}% +\colorlet{blackish}{black!70!white}% +\colorlet{greyish}{black!60!white}% +\colorlet{whiteish}{white}% +\colorlet{orangeish}{yellow!90!red}% +\colorlet{greenish}{green!16!gray}% +\colorlet{redish}{red!80!black}% + +\tcbset{calbackground/.style={ + enhanced, + leftright skip=0.25cm,beforeafter skip=0pt, + toptitle=0mm,bottomtitle=0mm, + right=2mm,left=2mm, + top=1pt, + bottom=0.25cm, + boxsep=0pt, + boxrule=0mm, + sharp corners, + sidebyside, + sidebyside gap=2mm, + lefthand ratio=0.6, + bicolor, + colback=black!10!white, + colbacklower=greenish, + colframe=white, + autoparskip, + }}% + +\newtcbox{\KY}[1][]{ + enhanced, + on line, + arc=2pt,outer arc=2pt, + boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, + boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, + interior style={top color=blackish,bottom color=blackened}, + colframe=greyish, + width=2.5em, + tcbox width=forced center, + equal height group=K, + valign=center, + fontupper=\footnotesize\sffamily, + coltext=orangeish, + before upper=\vrule width 0pt height 2ex depth 1ex\relax, +}% + +\newtcbox{\KYm}[1][]{ + enhanced, + on line, + arc=2pt,outer arc=2pt, + boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, + boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, + interior style={top color=blackish,bottom color=blackened}, + colframe=greyish, + width=2.5em, + tcbox width=forced center, + equal height group=K, + valign=center, + fontupper=\footnotesize\sffamily, + coltext=orangeish, + before upper=\vrule width 0pt height 2ex depth 1ex\relax$, + after upper=$, +}% + +\newtcbox{\KN}{ + enhanced, + on line, + arc=2pt,outer arc=2pt, + boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, + boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, + interior style={top color=blackish,bottom color=blackened}, + colframe=greyish, + width=1.5em, + tcbox width=forced center, + equal height group=K, + valign=center, + fontupper=\footnotesize\sffamily, + coltext=whiteish, + before upper=\vrule width 0pt height 2ex depth 1ex\relax, +}% + +\newtcolorbox{calc}[1][]{% + enhanced,bicolor, + boxsep=0pt, + boxrule=0pt, + top=6pt,bottom=0pt,left=6pt,right=0pt, + sharp corners, + frame empty, + colback=black!10, + colbacklower=greenish, + sidebyside, + sidebyside align=top seam, + sidebyside gap=0pt, + righthand width=50.7mm, + before lower=\begin{tabular}{@{}l@{}}, + after lower=\end{tabular}, + overlay={\node[inner sep=0pt, outer sep=0pt, text height=5pt, text + depth=1pt, text width=50.7mm, fill=greenish, anchor=north + east, font=\sffamily\tiny\bfseries, align=flush right] + at (frame.north east) {#1};} +} + +\def\MPCalculatrice#1#2#3{ + % #1 Calcul %2 r\'eponse + \ifluatex + \mplibforcehmode% + \begin{mplibcode}% + input PfCCalculatrice; + LargeurEcran:=\useKV[ClesCalculatrice]{Largeur}; + LCD(#1)(#2)(#3); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCCalculatrice;LargeurEcran:=\useKV[ClesCalculatrice]{Largeur};}] + LCD(#1)(#2)(#3); + \end{mpost} + \fi +} + +\setKVdefault[ClesCalculatrice]{Ecran=false,NbLignes=0,BL=0.775,Largeur=120} + +\newcommand\Calculatrice[2][]{% + \setstackgap{L}{\useKV[ClesCalculatrice]{BL}\baselineskip}% + \useKVdefault[ClesCalculatrice]% + \setKV[ClesCalculatrice]{#1}% + \ifboolKV[ClesCalculatrice]{Ecran}{% + \setsepchar[*]{,*/}% + \readlist\ListeCalc{#2}% + \MPCalculatrice{\ListeCalc[1,1]}{\ListeCalc[1,2]}{\useKV[ClesCalculatrice]{NbLignes}}% + }{% + \setsepchar[*]{,*/}% + \readlist\ListeCalc{#2}% + \foreachitem\compteur\in\ListeCalc{\xintifboolexpr{\listlen\ListeCalc[\compteurcnt]==2}{\Longstack{{\tiny\ListeCalc[\compteurcnt,1]} \KN{\ListeCalc[\compteurcnt,2]}}}{\Longstack{{\tiny\ListeCalc[\compteurcnt,2]} \KY{\ListeCalc[\compteurcnt,3]}}}% + }% + }% + \setstackgap{L}{\baselineskip}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCalculsCroises.tex b/macros/latex/contrib/profcollege/latex/PfCCalculsCroises.tex new file mode 100644 index 0000000000..da114a33f2 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCalculsCroises.tex @@ -0,0 +1,186 @@ +%%% +% Calculs Croises +%%% +\setKVdefault[CalculsCroises]{Largeur=20pt,Solution=false,Inverse=false,Creation=false,Graines=false,Vide=false,Couleur=LightGray,Negatifs=false,Aide=false} +\defKV[CalculsCroises]{Graine=\setKV[CalculsCroises]{Graines}}% +\defKV[CalculsCroises]{ListeNombres=\setKV[CalculsCroises]{Aide}}% + +\newlength\PfCCalculsCroises% +\NewDocumentCommand\CalculsCroises{o m}{% + \useKVdefault[CalculsCroises]% + \savecomparemode% + \comparestrict% + \setKV[CalculsCroises]{#1}% + \colorlet{PfCCouleurCC}{\useKV[CalculsCroises]{Couleur}}% + \setlength{\PfCCalculsCroises}{\useKV[CalculsCroises]{Largeur}+\tabcolsep}% + \ifboolKV[CalculsCroises]{Inverse}{\setKV[CalculsCroises]{Solution}}{}% + \ifboolKV[CalculsCroises]{Creation}{% + \ifboolKV[CalculsCroises]{Graines}{\PfCGraineAlea{\useKV[CalculsCroises]{Graine}}}{}% + \ifboolKV[CalculsCroises]{Negatifs}{% + \xdef\PfCCCFoo{-1,-2,-3,-4,-5,-6,-7,-8,-9}% + }{% + \xdef\PfCCCFoo{1,2,3,4,5,6,7,8,9}% + }% + \MelangeListe{\PfCCCFoo}{9}% + \setsepchar{,}% + \readlist*\PfCListeCCNb{\faa}% + \readlist*\PfCListeCCOp{#2}% + \xdef\PfCCCfoo{\useKV[CalculsCroises]{ListeNombres}}% + \readlist*\PfCListeCCAide{\PfCCCfoo}% + \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[1]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[1]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[1]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[1]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[1]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[2]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[2]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[2]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[2]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[2]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[3]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[3]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[3]}}{}% + }% + }{}% + }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[1]\PfCListeCCOp[1]\PfCListeCCNb[2]\PfCListeCCOp[2]\PfCListeCCNb[3]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[3]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[3]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[4]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[4]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[5]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[5]$}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[4]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[4]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[4]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[6]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[6]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[5]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[5]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[5]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[7]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[7]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[6]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[6]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[6]}}{}% + }% + }{}% + }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[4]\PfCListeCCOp[6]\PfCListeCCNb[5]\PfCListeCCOp[7]\PfCListeCCNb[6]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[8]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[8]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[9]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[9]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[10]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[10]$}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[7]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[7]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[7]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[11]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[11]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[8]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[8]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[8]}}{}% + }% + }{}% + }}&\StrCompare{\PfCListeCCOp[12]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[12]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[9]}}{% + \ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCNb[9]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[9]}}{}% + }% + }{}% + }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[7]\PfCListeCCOp[11]\PfCListeCCNb[8]\PfCListeCCOp[12]\PfCListeCCNb[9]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[1]\PfCListeCCOp[3]\PfCListeCCNb[4]\PfCListeCCOp[8]\PfCListeCCNb[7]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[2]\PfCListeCCOp[4]\PfCListeCCNb[5]\PfCListeCCOp[9]\PfCListeCCNb[8]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[3]\PfCListeCCOp[5]\PfCListeCCNb[6]\PfCListeCCOp[10]\PfCListeCCNb[9]}}}}\\ + \CodeAfter + \tikz\draw (1-|1) rectangle (6-|6); + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (1-|##1) -- (6-|##1); + }% + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (##1-|1) -- (##1-|6); + }% + \end{NiceTabular} + }{% + \ifboolKV[CalculsCroises]{Vide}{% + \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} + \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block[fill=black]{}{}&\Block{}{}&\Block[fill=black]{}{}&\Block{}{}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block[fill=black]{}{}&\Block{}{}&\Block[fill=black]{}{}&\Block{}{}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ + \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}\\ + \CodeAfter + \tikz\draw (1-|1) rectangle (6-|6); + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (1-|##1) -- (6-|##1); + }% + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (##1-|1) -- (##1-|6); + }% + \end{NiceTabular} + }{% + \readlist*\PfCListeCCOp{#2}% + \xdef\PfCCCfoo{\useKV[CalculsCroises]{ListeNombres}}% + \readlist*\PfCListeCCAide{\PfCCCfoo}% + \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[1]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[1]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[1]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[2]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[2]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[3]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[3]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[3]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[4]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[4]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[5]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[5]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[5]}}{}% + }% + }{}% +}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[1]\PfCListeCCOp[2]\PfCListeCCOp[3]\PfCListeCCOp[4]\PfCListeCCOp[5]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[6]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[6]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[7]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[7]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[8]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[8]$}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[9]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[9]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[9]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[10]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[10]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[11]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[11]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[11]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[12]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[12]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[13]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[13]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[13]}}{}% + }% + }{}% +}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[9]\PfCListeCCOp[10]\PfCListeCCOp[11]\PfCListeCCOp[12]\PfCListeCCOp[13]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[14]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[14]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[15]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[15]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[16]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[16]$}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[17]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[17]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[17]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[18]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[18]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[19]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[19]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[19]}}{}% + }% + }{}% +}}&\StrCompare{\PfCListeCCOp[20]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[20]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[21]}}{\ifboolKV[CalculsCroises]{Aide}{% + \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% + \xintifboolexpr{\PfCListeCCOp[21]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[21]}}{}% + }% + }{}% +}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[17]\PfCListeCCOp[18]\PfCListeCCOp[19]\PfCListeCCOp[20]\PfCListeCCOp[21]}}}}\\ + \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[1]\PfCListeCCOp[6]\PfCListeCCOp[9]\PfCListeCCOp[14]\PfCListeCCOp[17]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[3]\PfCListeCCOp[7]\PfCListeCCOp[11]\PfCListeCCOp[15]\PfCListeCCOp[19]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[5]\PfCListeCCOp[8]\PfCListeCCOp[13]\PfCListeCCOp[16]\PfCListeCCOp[21]}}}}\\ + \CodeAfter + \tikz\draw (1-|1) rectangle (6-|6); + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (1-|##1) -- (6-|##1); + }% + \xintFor* ##1 in{\xintSeq{2}{5}}\do{% + \tikz\draw (##1-|1) -- (##1-|6); + }% + \end{NiceTabular} + }% + }% + \restorecomparemode% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCalisson.tex b/macros/latex/contrib/profcollege/latex/PfCCalisson.tex new file mode 100644 index 0000000000..08834c7311 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCalisson.tex @@ -0,0 +1,361 @@ +%%% +% Calisson +%%% +\setKVdefault[Calisson]{Taille=3,Solution=false,Rayon=5cm,Couleur=red}% + +\def\UpdatetoksCalissong#1\nil{\addtotok\tokcalissonlistetracesg{,"#1"}}% +\def\UpdatetoksCalissongDepart#1\nil{\addtotok\tokcalissonlistetracesg{"#1"}}% +\def\UpdatetoksCalissond#1\nil{\addtotok\tokcalissonlistetracesd{,"#1"}}% +\def\UpdatetoksCalissondDepart#1\nil{\addtotok\tokcalissonlistetracesd{"#1"}}% + +\newtoks\tokcalissonlistetracesg +\newtoks\tokcalissonlistetracesd + +\NewDocumentCommand\Calisson{o m}{% + \useKVdefault[Calisson]% + \setKV[Calisson]{#1}% + % Essai de cassage du code + \tokcalissonlistetracesg{}% + \tokcalissonlistetracesd{}% + %Partie Gauche -> ok + \StrLeft{0#2}{2}[\Depart]% + \StrGobbleLeft{0#2}{2}[\Reste]% + \expandafter\UpdatetoksCalissongDepart\Depart0\nil% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + \expandafter\UpdatetoksCalissong\Depart\nil% + % fin premiere ligne + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{2}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart0\nil% + \StrGobbleLeft{\Reste}{2}[\Reste]% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + }% + % fin des lignes intermédiaires + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% + \StrLeft{\Reste}{2}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart0\nil% + \StrGobbleLeft{\Reste}{2}[\Reste] + \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% + \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissong\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + }% + }% + %Liste gauche : \the\tokcalissonlistetracesg% + % Partie droite + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissondDepart\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-2}}}\do{% + \StrLeft{0\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{0\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + \expandafter\UpdatetoksCalissond\Depart\nil% +% fin premiere ligne + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{1}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart00\nil% + \StrGobbleLeft{\Reste}{1}[\Reste]% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + \StrLeft{00\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{00\Reste}{3}[\Reste]% + }% + %% fin des lignes intermédiaires + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% + \StrLeft{\Reste}{1}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart00\nil% + \StrGobbleLeft{\Reste}{1}[\Reste]% + \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% + \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% + \StrLeft{\Reste}{3}[\Depart]% + \expandafter\UpdatetoksCalissond\Depart\nil% + \StrGobbleLeft{\Reste}{3}[\Reste]% + }% + }% + }% +% \par Liste droite :\the\tokcalissonlistetracesd + \BuildCalisson{\the\tokcalissonlistetracesg}{\the\tokcalissonlistetracesd}% +}% + +\NewDocumentCommand\BuildCalisson{m m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Solution; + Solution:=\useKV[Calisson]{Solution}; + + color CouleurSolution; + CouleurSolution:=\useKV[Calisson]{Couleur}; + + Rayon=\useKV[Calisson]{Rayon}; + Taille=\useKV[Calisson]{Taille}; + + pair A,B,C,D,E,F,O; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + D=pointarc(cc,30); + E=pointarc(cc,90); + F=pointarc(cc,150); + A=pointarc(cc,210); + B=pointarc(cc,270); + C=pointarc(cc,330); + trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; + path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; + Gauche=F--A--B; + Droit=E--D--C; + Haut=F--E--D; + Bas=A--B--C; + TopGauche=E--F--A; + BasDroit=D--C--B; + for k=1 upto 2*Taille-1: + trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; + trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; + trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; + endfor; + + pair Hor,Ver,Horn; + Hor=(1/Taille)[E,F]; + Ver=rotation(Hor,E,60); + Horn=rotation(Hor,E,120); + + % On positionne les points + pair M[]; + n=0; + %Partie Gauche -> ok + for k=0 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % Partie Droite -> ok + for k=1 upto Taille: + n:=n+1; + M[n]=E+k*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + for k=1 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % + + string Retiens; + Retiens=""; + + pair Depla; + Depla:=Hor; + + vardef LesTracesg(text t)= + n:=0; + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Hor + elseif d=2:Depla:=Ver + else : Depla:=Horn + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + vardef LesTracesd(text t)= + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Horn + elseif d=2:Depla:=Ver + else : Depla:=Hor + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + LesTracesg(#1); + LesTracesd(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean Solution; Solution:=\useKV[Calisson]{Solution}; Rayon=\useKV[Calisson]{Rayon};Taille=\useKV[Calisson]{Taille};color CouleurSolution; CouleurSolution:=\useKV[Calisson]{Couleur};}] + pair A,B,C,D,E,F,O; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + D=pointarc(cc,30); + E=pointarc(cc,90); + F=pointarc(cc,150); + A=pointarc(cc,210); + B=pointarc(cc,270); + C=pointarc(cc,330); + trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; + path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; + Gauche=F--A--B; + Droit=E--D--C; + Haut=F--E--D; + Bas=A--B--C; + TopGauche=E--F--A; + BasDroit=D--C--B; + for k=1 upto 2*Taille-1: + trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; + trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; + trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; + endfor; + + pair Hor,Ver,Horn; + Hor=(1/Taille)[E,F]; + Ver=rotation(Hor,E,60); + Horn=rotation(Hor,E,120); + + % On positionne les points + pair M[]; + n=0; + %Partie Gauche -> ok + for k=0 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Hor-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % Partie Droite -> ok + for k=1 upto Taille: + n:=n+1; + M[n]=E+k*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + for k=1 upto Taille-1: + for l=0 upto Taille: + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + for k=Taille upto 2*Taille-1: + for l=0 upto (2*Taille-1-k): + n:=n+1; + M[n]=E+k*(Ver-E)+l*(Horn-E); + %dotlabel.top(decimal(n),M[n]); + endfor; + endfor; + % + + string Retiens; + Retiens=""; + + pair Depla; + Depla:=Hor; + + vardef LesTracesg(text t)= + n:=0; + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Hor + elseif d=2:Depla:=Ver + else : Depla:=Horn + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + vardef LesTracesd(text t)= + for p_=t: + n:=n+1; + for d=1 upto 3: + Retiens:=substring(d-1,d) of p_; + if d=1:Depla:=Horn + elseif d=2:Depla:=Ver + else : Depla:=Hor + fi; + if (Retiens="0") or (Retiens="f"): + elseif Retiens="t": + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; + elseif Retiens="s": + if Solution: + trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; + fi; + fi; + endfor; + endfor; + enddef; + + LesTracesg(#1); + LesTracesd(#2); + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex b/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex new file mode 100644 index 0000000000..7edbe8ab13 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCartesJeux.tex @@ -0,0 +1,555 @@ +%%% +% Cards +%%% +\newtcolorbox{Mybox}[3]{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + overlay unbroken and first={% + \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west);% + \coordinate[yshift=-0.5\hauteurtitre] (B1) at (frame.north east);% + \coordinate[yshift=-\hauteurtitre] (A) at (frame.north west);% + \coordinate[yshift=-\hauteurtitre] (B) at (frame.north east);% + \coordinate[xshift=1.5pt,yshift=8mm] (S1) at (frame.south west);% + \coordinate[xshift=-1.5pt,yshift=8mm] (S2) at (frame.south east);% + \coordinate[xshift=3mm+(\largeurtitre/2)] (A2) at (A1);% + \coordinate[xshift=-3mm-(\largeurtitre/2)] (B2) at (B1);% + \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T1) at (A2){};% + \node[TexteCouleur] (T1a) at (T1){\Large #1};% + \node[yshift=-0.65cm] (T1b) at (T1){\tiny r\'eponse pr\'ec\'edente};% + \node[inner sep=0pt,rounded corners, rectangle, draw=black,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T2) at (B2){};% + \node[inner sep=0pt,TexteCouleur] (T2a) at (T2){% + \begin{minipage}{\largeurtitre}% + \begin{center}% + #2% + \end{center}% + \end{minipage}% + };% + \node[yshift=-0.65cm] (T2b) at (T2){};% + \ifboolKV[Cards]{Titre}{\node[] at (T2b) {\tiny\useKV[Cards]{NomTitre}};}{}% + \node[rectangle,xshift=5pt,yshift=4.25mm,minimum width=2em,rounded corners,fill=TrameCouleur,draw=black,anchor=west] (R) at (frame.south west) {\color{black}\Large\bfseries #3};% + \draw[dashed] (S1) -- (S2);% + },% + colback=white,% + colbacktitle=TrameCouleur,% +}% + +\makeatletter +\newtcolorbox{MyboxJQ}[2]{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + underlay={% + \ifboolKV[Cards]{BackgroundAv}{% + \begin{tcbclipinterior} + \node[anchor=center,opacity=1] + at (interior.center) {% + \includegraphics[% + height=\tcb@height, + width=\tcb@width, + ]{\useKV[Cards]{ImageAv}}};% + \end{tcbclipinterior}% + }{}% + },% + overlay unbroken and first={% + \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west); + \coordinate[yshift=0\hauteurtitre] (S3) at (frame.center); + \coordinate[yshift=3mm] (C3) at (frame.south); + \coordinate[xshift=\largeurcarte/2] (A3) at (A1); + \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A3){}; + \node[TexteCouleur] (T1a) at (T1){\Large J'ai}; + \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T2) at (S3){}; + \node[TexteCouleur] (T2a) at (T2){\Large Qui a ?}; + \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte1) at ($(A3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}% + \begin{center}% + #1% + \end{center}% + \end{minipage}}; + \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte2) at ($(C3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}% + \begin{center}% + #2% + \end{center}% + \end{minipage}}; + }, + colback=white +}% +% +\newtcolorbox{MyboxJQAr}{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + underlay={% + \ifboolKV[Cards]{BackgroundAv}{% + \begin{tcbclipinterior} + \node[anchor=center,opacity=1] + at (interior.center) {% + \includegraphics[% + height=\tcb@height, + width=\tcb@width, + ]{\useKV[Cards]{ImageAr}}};% + \end{tcbclipinterior}% + }{}% + },% + colback=white +}% +\makeatother + +\makeatletter +%https://tex.stackexchange.com/questions/347434/clip-background-image-inside-tcolorbox +\newtcolorbox{MyboxSimpleAv}[1]{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + colback=white,% + underlay={% + \ifboolKV[Cards]{BackgroundAv}{% + \begin{tcbclipinterior} + \node[anchor=center,opacity=1] + at (interior.center) {% + \includegraphics[% + height=\tcb@height, + width=\tcb@width, + ]{\useKV[Cards]{ImageAv}}};% + \end{tcbclipinterior}% + }{}% + },% + overlay unbroken and first={% + \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);% + \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}% + \begin{center}% + #1% + \end{center}% + \end{minipage}};% + \node[yshift=-0.5em-0.5\hauteurtitre] (B) at (A){};% + \ifboolKV[Cards]{Titre}{\node[fill=white] at (B) {\useKV[Cards]{NomTitre}};}{}% + }% +}% + +\newtcolorbox{MyboxSimpleAr}[1]{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + colback=white,% + underlay={% + \ifboolKV[Cards]{BackgroundAr}{% + \begin{tcbclipinterior} + \node[anchor=center,opacity=1] + at (interior.center) {% + \includegraphics[% + height=\tcb@height, + width=\tcb@width, + ]{\useKV[Cards]{ImageAr}}}; + \end{tcbclipinterior}%,% + }{}% + },% + overlay unbroken and first={% + \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);% + \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}% + \begin{center}% + #1% + \end{center}% + \end{minipage}};% + }% +}% +\makeatother + +\newtcolorbox{MyboxTrivial}[1][]{% + enhanced,% + nobeforeafter,% + left=0pt,right=0pt,top=0pt,bottom=0pt,% + text fill,% + width=\largeurcarte,% + height=\hauteurcarte,% + arc=5pt,% + colback=white,% + #1 +}% + +\newlength{\largeurcards}% +\newlength{\hauteurcards}% +\newlength{\largeurcarte}% +\newlength{\hauteurcarte}% +\newlength{\hauteurtitre}% +\newlength{\largeurtitre}% + +\newlength{\margeh}% +\newlength{\margev}% + +\newlength{\PfCCardsH}%pour retenir en cas de décalage sur une page paire +\newlength{\PfCCardsEcartH}%Pour décaler sur une page paire +\newlength{\PfCCardsV}%pour retenir en cas de décalage sur une page paire +\newlength{\PfCCardsEcartV}%Pour décaler sur une page paire +\setlength{\PfCCardsEcartH}{0pt} +\setlength{\PfCCardsEcartV}{0pt} + +\NewDocumentEnvironment{Trame}{+b}{% + \ifodd\thepage% + \setlength{\PfCCardsH}{\largeurcards}% + \setlength{\PfCCardsV}{\hauteurcards}% + \else% + \setlength{\PfCCardsH}{\largeurcards+\PfCCardsEcartH}% + \setlength{\PfCCardsV}{\hauteurcards+\PfCCardsEcartV}% + \fi% + \begin{tikzpicture}[remember picture,overlay] + % quadrillages horizontal et vertical + \coordinate[yshift=-\margev] (A) at (current page.north west);% + \coordinate[yshift=-\margev] (B) at (current page.north east);% + \coordinate[yshift=-\hauteurcards] (A1) at (A);% + \coordinate[yshift=-\hauteurcards] (B1) at (B);% + \coordinate[yshift=-\hauteurcards] (A2) at (A1);% + \coordinate[yshift=-\hauteurcards] (B2) at (B1);% + \coordinate[yshift=-\hauteurcards] (A3) at (A2);% + \coordinate[yshift=-\hauteurcards] (B3) at (B2);% + \coordinate[yshift=-\hauteurcards] (A4) at (A3);% + \coordinate[yshift=-\hauteurcards] (B4) at (B3);% + \coordinate[xshift=\margeh] (C) at (current page.north west);% + \coordinate[xshift=\margeh] (D) at (current page.south west);% + \coordinate[xshift=\largeurcards] (C1) at (C);% + \coordinate[xshift=\largeurcards] (D1) at (D);% + \coordinate[xshift=\largeurcards] (C2) at (C1);% + \coordinate[xshift=\largeurcards] (D2) at (D1);% + \coordinate[xshift=\largeurcards] (C3) at (C2);% + \coordinate[xshift=\largeurcards] (D3) at (D2);% + \draw (A)--(B);% + \draw (A1)--(B1);% + \draw (A2)--(B2);% + \draw (A3)--(B3);% + \draw (A4)--(B4);% + \draw (C)--(D);% + \draw (C1)--(D1);% + \draw (C2)--(D2);% + \draw (C3)--(D3);% + % point pour placer les cartes + \coordinate[xshift=\margeh+0.5\PfCCardsH,yshift=-0.5\PfCCardsV] (Carte1) at (A);% + \coordinate[xshift=\largeurcards,yshift=0mm] (Carte2) at (Carte1);% + \coordinate[xshift=2\largeurcards,yshift=0mm] (Carte3) at (Carte1);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte4) at (Carte1);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte5) at (Carte2);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte6) at (Carte3);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte7) at (Carte4);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte8) at (Carte5);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte9) at (Carte6);% + #1% + \end{tikzpicture}% +}{}% + +\NewDocumentEnvironment{Trameold}{+b}{% + \begin{tikzpicture}[remember picture,overlay] + % quadrillages horizontal et vertical + \coordinate[yshift=-\margev] (A) at (current page.north west);% + \coordinate[yshift=-\margev] (B) at (current page.north east);% + \coordinate[yshift=-\hauteurcards] (A1) at (A);% + \coordinate[yshift=-\hauteurcards] (B1) at (B);% + \coordinate[yshift=-\hauteurcards] (A2) at (A1);% + \coordinate[yshift=-\hauteurcards] (B2) at (B1);% + \coordinate[yshift=-\hauteurcards] (A3) at (A2);% + \coordinate[yshift=-\hauteurcards] (B3) at (B2);% + \coordinate[yshift=-\hauteurcards] (A4) at (A3);% + \coordinate[yshift=-\hauteurcards] (B4) at (B3);% + \coordinate[xshift=\margeh] (C) at (current page.north west);% + \coordinate[xshift=\margeh] (D) at (current page.south west);% + \coordinate[xshift=\largeurcards] (C1) at (C);% + \coordinate[xshift=\largeurcards] (D1) at (D);% + \coordinate[xshift=\largeurcards] (C2) at (C1);% + \coordinate[xshift=\largeurcards] (D2) at (D1);% + \coordinate[xshift=\largeurcards] (C3) at (C2);% + \coordinate[xshift=\largeurcards] (D3) at (D2);% + \draw (A)--(B);% + \draw (A1)--(B1);% + \draw (A2)--(B2);% + \draw (A3)--(B3);% + \draw (A4)--(B4);% + \draw (C)--(D);% + \draw (C1)--(D1);% + \draw (C2)--(D2);% + \draw (C3)--(D3);% + % point pour placer les cartes + \coordinate[xshift=\margeh+0.5\largeurcards,yshift=-0.5\hauteurcards] (Carte1) at (A);% + \coordinate[xshift=\largeurcards,yshift=0mm] (Carte2) at (Carte1);% + \coordinate[xshift=2\largeurcards,yshift=0mm] (Carte3) at (Carte1);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte4) at (Carte1);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte5) at (Carte2);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte6) at (Carte3);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte7) at (Carte4);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte8) at (Carte5);% + \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte9) at (Carte6);% + #1% + \end{tikzpicture}% +}{}% + +\setKVdefault[Cards]{Largeur=59,Hauteur=89,HauteurTheme=15,Marge=4,Landscape=false,Couleur=Cornsilk,Theme=Th\'eor\`eme\\de + Pythagore,ThemeSol=Solution,Trame=false,Titre=false,NomTitre=Jeu 1,Loop,JaiQuia=false,BackgroundAv=false,BackgroundAr=false,ImageAv=4813762.jpg,ImageAr=4813762.jpg,AffichageSolution=true,SolutionSeule=false,% + % Pour le trivial + Trivial=false,Symboles={\faInfinity,\faSignal,\faProjectDiagram,\faHiking,\faRuler,\faLockOpen} +}% + +\NewDocumentCommand\Cartes{o +m}{%[2][]{% + \useKVdefault[Cards]% + \setKV[Cards]{#1}% + \setsepchar[*]{§*/}% + \readlist*\ListeCards{#2}% + \setsepchar{,}% + \ifboolKV[Cards]{Landscape}{% + \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}% + \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}% + \setlength{\largeurcards}{95mm}% + \setlength{\hauteurcards}{65mm}% + \setlength{\margeh}{(297mm-3\largeurcards)/2}% + \setlength{\margev}{(210mm-3\hauteurcards)/2}% + }{% + \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}% + \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}% + \setlength{\largeurcards}{65mm}% + \setlength{\hauteurcards}{95mm}% + \setlength{\margeh}{(210mm-3\largeurcards)/2}% + \setlength{\margev}{(297mm-3\hauteurcards)/2}% + }% + \setlength{\hauteurtitre}{\fpeval{\useKV[Cards]{HauteurTheme}}mm}% + \setlength{\largeurtitre}{\fpeval{(\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}-9)/2}mm}% + \colorlet{TexteCouleur}{black}% + \colorlet{TrameCouleur}{\useKV[Cards]{Couleur}}% + \ifboolKV[Cards]{Trivial}{% + \xdef\PfCListeSymbolTrivial{\useKV[Cards]{Symboles}}% + \setsepchar{,}\readlist*\ListeSymbolesTrivial{\PfCListeSymbolTrivial}% + \setlength{\tabcolsep}{0.25\tabcolsep} + \ifboolKV[Cards]{Trame}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame}% + \multido{\i=1+1}{9}{% + \node[] at (Carte\i) {% + \begin{MyboxTrivial}% + \begin{center} + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[9,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\i,\fpeval{1+2*(##1-1)}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + };% + }% + \end{Trame}% + \ifboolKV[Cards]{AffichageSolution}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame}% + \multido{\i=1+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxTrivial}% + \begin{center}% + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{4-\i},\fpeval{2*##1}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + };% + }% + \multido{\i=4+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxTrivial}% + \begin{center}% + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{10-\i},\fpeval{2*##1}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + };% + }% + \multido{\i=7+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxTrivial}% + \begin{center}% + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{16-\i},\fpeval{2*##1}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + };% + }% + \end{Trame}% + \clearpage% + }{}% + }{% + \begin{MyboxTrivial}% + \begin{center}% + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{1+2*(##1-1)}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + \ifboolKV[Cards]{AffichageSolution}{% + \begin{MyboxTrivial}% + \begin{center}% + \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% + \xintFor* ##1 in{\xintSeq{1}{6}}\do{% + \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{2*##1}]\\ + }% + \end{NiceTabular}% + \end{center}% + \end{MyboxTrivial}% + }{}% + }% + \setlength{\tabcolsep}{4\tabcolsep}% + }{% + \ifboolKV[Cards]{JaiQuia}{% + \ifboolKV[Cards]{Trame}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame}% + \multido{\i=1+1}{9}{% + \node at (Carte\i) {% + \begin{MyboxJQ}{\ListeCards[\i,1]}{\ListeCards[\i,2]}% + %% + \end{MyboxJQ}% + };% + }% + \end{Trame}% + \clearpage% + \ifboolKV[Cards]{AffichageSolution}{% + \thispagestyle{empty}% + \begin{Trame} + \multido{\i=1+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxJQAr}% + \end{MyboxJQAr}% + };% + }% + \multido{\i=4+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxJQAr}% + \end{MyboxJQAr}% + };% + }% + \multido{\i=7+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxJQAr}% + \end{MyboxJQAr}% + };% + }% + \end{Trame}% + \clearpage% + }{}% + }{% + \begin{MyboxJQ}{\ListeCards[1,1]}{\ListeCards[1,2]}% + %% + \end{MyboxJQ}% + \ifboolKV[Cards]{AffichageSolution}{% + \begin{MyboxJQAr}% + %% + \end{MyboxJQAr}% + }{}% + }% + }{% + \ifboolKV[Cards]{Loop}{% + \ifboolKV[Cards]{Trame}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame} + \multido{\i=1+1}{9}{% + \node at (Carte\i) {% + \begin{Mybox}{\ListeCards[\i,1]}{\useKV[Cards]{Theme}}{\ListeCards[\i,2]}% + \ListeCards[\i,3]% + \end{Mybox}% + };% + }% + \end{Trame}% + \clearpage% + }{% + \begin{Mybox}{\ListeCards[1,1]}{\useKV[Cards]{Theme}}{\ListeCards[1,2]}% + \ListeCards[1,3]% + \end{Mybox}% + }% + }{% + \ifboolKV[Cards]{Trame}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame} + \multido{\i=1+1}{9}{% + \node[] at (Carte\i) {% + \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}% + \ListeCards[\i,1]% + \end{MyboxSimpleAv}% + };% + }% + \end{Trame}% + \ifboolKV[Cards]{AffichageSolution}{% + \clearpage% + \thispagestyle{empty}% + \begin{Trame} + \multido{\i=1+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% + \ListeCards[\fpeval{4-\i},2]% + \end{MyboxSimpleAr}% + };% + }% + \multido{\i=4+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% + \ListeCards[\fpeval{10-\i},2]% + \end{MyboxSimpleAr}% + };% + }% + \multido{\i=7+1}{3}{% + \node at (Carte\i) {% + \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% + \ListeCards[\fpeval{16-\i},2]% + \end{MyboxSimpleAr}% + };% + }% + \end{Trame}% + \clearpage% + }{}% + }{% + \ifboolKV[Cards]{SolutionSeule}{}{% + \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}% + \ListeCards[1,1]% + \end{MyboxSimpleAv}% + }% + \ifboolKV[Cards]{AffichageSolution}{% + \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% + \ListeCards[1,2]% + \end{MyboxSimpleAr}% + }{}% + }% + }% + }% + }% +}% + +\newcommand\SolutionCarte[2]{% + \begin{center} + \bfseries#1 + \end{center} + + #2 +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCartesMentales.tex b/macros/latex/contrib/profcollege/latex/PfCCartesMentales.tex new file mode 100644 index 0000000000..eb7b7b0285 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCartesMentales.tex @@ -0,0 +1,25 @@ +%%% +% Cartes Mentales +%%% +\setKVdefault[ClesMentales]{Nom={Bulle}, Largeur=5cm, Ancre={0,0},Pointilles=false,CTrace=black,CFond=white,Epaisseur=1pt,Rayon=1}% +\newenvironment{Mind}{\begin{tikzpicture}}{\end{tikzpicture}}% + +\newlength{\RoundedBoxWidth}% + +\NewEnviron{Bulle}[1][]{% + \setKV[ClesMentales]{#1}% + \setlength{\RoundedBoxWidth}{\useKV[ClesMentales]{Largeur}}% + \xdef\Pointilles{\ifboolKV[ClesMentales]{Pointilles}{dashed}{}}% + \xdef\CouleurTrace{\useKV[ClesMentales]{CTrace}}% + \xdef\CouleurFond{\useKV[ClesMentales]{CFond}}% + \xdef\EpaisseurLigne{\useKV[ClesMentales]{Epaisseur}}% + \xdef\RayonCoin{\useKV[ClesMentales]{Rayon}}% + \node(\useKV[ClesMentales]{Nom}) [align=justify,draw=\CouleurTrace,line width=\EpaisseurLigne,\Pointilles,fill=\CouleurFond,rounded corners=\RayonCoin,text width=\RoundedBoxWidth] at (\useKV[ClesMentales]{Ancre}) {\begin{minipage}{\RoundedBoxWidth}\BODY\end{minipage}};% + \multido{\i=1+1}{9}{% + \xdef\x{\fpeval{\i/10}} + \coordinate (\useKV[ClesMentales]{Nom}-H-\i) at ($(\useKV[ClesMentales]{Nom}.north west)!\x!(\useKV[ClesMentales]{Nom}.north east)$); + \coordinate (\useKV[ClesMentales]{Nom}-D-\i) at ($(\useKV[ClesMentales]{Nom}.north east)!\x!(\useKV[ClesMentales]{Nom}.south east)$); + \coordinate (\useKV[ClesMentales]{Nom}-B-\i) at ($(\useKV[ClesMentales]{Nom}.south east)!\x!(\useKV[ClesMentales]{Nom}.south west)$); + \coordinate (\useKV[ClesMentales]{Nom}-G-\i) at ($(\useKV[ClesMentales]{Nom}.south west)!\x!(\useKV[ClesMentales]{Nom}.north west)$); + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCartographie.tex b/macros/latex/contrib/profcollege/latex/PfCCartographie.tex new file mode 100644 index 0000000000..9156779cd7 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCartographie.tex @@ -0,0 +1,211 @@ +%%% +% Cartographie +%%% +\setKVdefault[Cartographie]{Echelle=1,Carte=false,All=false,Europe=false,Asie=false,Amsud=false,Amnord=false,Amcentre=false,Caraibes=false,Afrique=false,AfficheEchelle=false,PaysSeul=false,VillesSup=false,Capitales=false,Impression=false,Fleuves=false,CouleurFond=ciel,Largeur=12,Hauteur=12,Arborescence="/usr/local/texlive/2022/texmf-dist/metapost/profcollege/datastest/",Projection=false,TypeProjection="mercator",CouleurPays=Cornsilk,Pasl=2,PasL=2} +\defKV[Cartographie]{EchelleCarte=\setKV[Cartographie]{Carte}} +\defKV[Cartographie]{Pays=\setKV[Cartographie]{PaysSeul}} +\defKV[Cartographie]{Villes=\setKV[Cartographie]{VillesSup}} + +\newcommand\Cartographie[3][]{% + \ifluatex + \useKVdefault[Cartographie] + \setKV[Cartographie]{#1} + \ifboolKV[Cartographie]{Projection}{% + \mplibforcehmode + \begin{mplibcode} + input PfCMonde; + string arborescence; + arborescence:=\useKV[Cartographie]{Arborescence}; + boolean Impression,VillesSup; + VillesSup=\useKV[Cartographie]{VillesSup}; + Impression=\useKV[Cartographie]{Impression}; + + maillage:=true; + fleuves:=false; + lacs:=false; + capitales:=false; + + if Impression: + noncolore:=true; + payscolor:=white; + else: + noncolore:=true; + payscolor:=\useKV[Cartographie]{CouleurPays}; + fi; + + projection:=\useKV[Cartographie]{TypeProjection}; + feuillet:=u*(-20,-20)--u*(20,-20)--u*(20,20)--u*(-20,20)--cycle; + drawoptions(withpen pencircle scaled 0.5 withcolor 0.5white); + Projection(3,48,\useKV[Cartographie]{Echelle}); + drawoptions(); + + if projection="mercator": + clip currentpicture to (mercatorc(-85,-180)--mercatorc(-85,180)--mercatorc(85,180)--mercatorc(85,-180)--cycle); + draw mercatorc(0,-180)--mercatorc(0,180); + draw mercatorc(-85,0)--mercatorc(85,0); + label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),mercatorc(0,0)); + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(-k*10,0)); + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(k*10,0)); + endfor; + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,-k*10)); + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,k*10)); + endfor; + elseif projection="cylindrique": + clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle); + draw cylindriquec(0,-180)--cylindriquec(0,180); + draw cylindriquec(-85,0)--cylindriquec(85,0); + label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0)); + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0)); + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0)); + endfor; + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10)); + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10)); + endfor; + elseif projection="winkel": + clip currentpicture to (winkelc(-85,-180)--winkelc(-85,180) for k=-80 step 5 until 85:--winkelc(k,180) endfor --winkelc(85,-180) for k=80 step -5 until -85:--winkelc(k,-180) endfor --cycle); + draw winkelc(0,-180)--winkelc(0,180); + draw winkelc(-85,0)--winkelc(85,0); + label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),winkelc(0,0)); + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(-k*10,0)); + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(k*10,0)); + endfor; + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,-k*10)); + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,k*10)); + endfor; + elseif projection="cylindrique": + clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle); + draw cylindriquec(0,-180)--cylindriquec(0,180); + draw cylindriquec(-85,0)--cylindriquec(85,0); + label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0)); + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0)); + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0)); + endfor; + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10)); + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10)); + endfor; + elseif projection="simple": + clip currentpicture to (simplec(-85,-180)--simplec(-85,180)--simplec(85,180)--simplec(85,-180)--cycle); + draw simplec(0,-180)--simplec(0,180); + draw simplec(-85,0)--simplec(85,0); + label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),simplec(0,0)); + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(-k*10,0)); + label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(k*10,0)); + endfor; + for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,-k*10)); + label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,k*10)); + endfor; + fi; + if VillesSup: + nomfichiermul:=\useKV[Cartographie]{Villes}; + nblec:=scantokens readfrom nomfichiermul; + drawoptions(withcolor (0.15,0.15,0.15)); + for p=1 upto nblec: + pair Coord[],latlon;string p_; + latlon=scantokens readfrom nomfichiermul; + p_=scantokens readfrom nomfichiermul; + if projection="mercator": + Coord[p]=mercatorc(ypart(latlon),xpart(latlon)); + elseif projection="winkel": + Coord[p]=winkelc(ypart(latlon),xpart(latlon)); + elseif projection="cylindrique": + Coord[p]=cylindriquec(ypart(latlon),xpart(latlon)); + elseif projection="simple": + Coord[p]=simplec(ypart(latlon),xpart(latlon)); + fi; + marque_p:="croix"; + pointe(Coord[p]); + label.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]); + endfor; + drawoptions(); + closefrom nomfichiermul; + fi; + \end{mplibcode} + }{% + \mplibforcehmode + \begin{mplibcode} + input PfCMonde; + string arborescence; + arborescence:=\useKV[Cartographie]{Arborescence}; + LargeurCadre=\useKV[Cartographie]{Largeur}; + HauteurCadre=\useKV[Cartographie]{Hauteur}; + distanceecran=100*\useKV[Cartographie]{Echelle}; + fleuves:=\useKV[Cartographie]{Fleuves}; + boolean Carte,Impression,VillesSup; + Carte=\useKV[Cartographie]{Carte}; + Impression=\useKV[Cartographie]{Impression}; + VillesSup=\useKV[Cartographie]{VillesSup}; + couleurfond:=\useKV[Cartographie]{CouleurFond}; + if Impression: + noncolore:=true; + payscolor:=0.85white; + couleurfond:=white; + couleurfleuve:=couleurfond; + fi; + capitales:=\useKV[Cartographie]{Capitales}; + All:=\useKV[Cartographie]{All}; + Europe:=\useKV[Cartographie]{Europe}; + Asie:=\useKV[Cartographie]{Asie}; + Amsud:=\useKV[Cartographie]{Amsud}; + Amnord:=\useKV[Cartographie]{Amnord}; + Amcentrale:=\useKV[Cartographie]{Amcentre}; + Caraibes:=\useKV[Cartographie]{Caraibes}; + Afrique:=\useKV[Cartographie]{Afrique}; + if Carte: + Echelle:=\useKV[Cartographie]{AfficheEchelle}; + figure(-0.5u*LargeurCadre,-0.5u*HauteurCadre,0.5u*LargeurCadre,0.5u*HauteurCadre); + if \useKV[Cartographie]{PaysSeul}: + projection:="bonne"; + theta:=#2; + phi:=#3; + zoom(echelle(#2,#3,\useKV[Cartographie]{EchelleCarte})); + fill (bonnec(-90,-180) for k=-85 step 5 until 90:..bonnec(k,-180) endfor)..reverse(bonnec(-90,180) for k=-85 step 5 until 90:..bonnec(k,180) endfor)..cycle withcolor couleurfond; + lecturep(arborescence&\useKV[Cartographie]{Pays}&".dat",couleurfond);% + trace feuillet withpen pencircle scaled 2; + if Echelle=true: + draw ((Xa,Ya)+u*(1,1))--((Xa,Ya)+u*(2,1)); + labeloffset:=labeloffset*1.5; + label.top(btex 0 etex,(Xa,Ya)+u*(1,1)); + label.top(TEX(""&decimal(Long)&"~km"),(Xa,Ya)+u*(2,1)); + labeloffset:=labeloffset/1.5; + draw ((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9)); + draw (((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9))) shifted(u*(1,0)); + fi; + else: + projection:="bonne"; + Projection(#2,#3,echelle(#2,#3,\useKV[Cartographie]{EchelleCarte})); + trace feuillet withpen pencircle scaled 2; + fi; + if VillesSup: + nomfichiermul:=\useKV[Cartographie]{Villes}; + nblec:=scantokens readfrom nomfichiermul; + drawoptions(withcolor (0.15,0.15,0.15)); + projection:="bonne"; + for p=1 upto nblec: + pair Coord[],latlon;string p_; + latlon=scantokens readfrom nomfichiermul; + p_=scantokens readfrom nomfichiermul; + Coord[p]=bonnec(ypart(latlon),xpart(latlon)); + dotlabel.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]); + endfor; + drawoptions(); + closefrom nomfichiermul; + fi; + else: + mappemonde(#2,#3); + fi; + \end{mplibcode} + } + \else + \PackageWarning{ProfCollege}{"La commande Cartographie n'est compatible qu'avec LuaLaTeX."} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCColorilude.tex b/macros/latex/contrib/profcollege/latex/PfCColorilude.tex new file mode 100644 index 0000000000..33a1ef2446 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCColorilude.tex @@ -0,0 +1,210 @@ +%%% Colorilude %%% +\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false,CartonReponse=false,Resultats=false} + +\newcommand\dispogpfc[3][]{% + \setbox1=\hbox{#2}% + \setbox2=\hbox{#3}% + \begin{minipage}{\wd2}% + #3% + \end{minipage}% + \quad% + \begin{minipage}{\wd1}% + #2% + \end{minipage}% +}% + +\newcommand\TraceEchiquierColorilude{% + \ifluatex + \begin{mplibcode} + pair A,B,C,D;%pour la grille + A=(0,0); + B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0); + C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes}); + D-C=A-B; + nblargeur=\useKV[Colorilude]{Largeur}; + nblignes=\useKV[Colorilude]{Lignes}; + for k=1 upto nblargeur-1: + draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; + endfor; + for k=1 upto nblignes-1: + draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; + endfor; + draw polygone(A,B,C,D) withpen pensquare scaled 1.5; + if \useKV[Colorilude]{Legende}: + label.lrt(btex \tiny d'après APMEP etex rotated 90,B); + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean Legende; + Legende=\useKV[Colorilude]{Legende}; + nblargeur:=\useKV[Colorilude]{Largeur}; + nblignes:=\useKV[Colorilude]{Lignes}; + coef:=\useKV[Colorilude]{Coef};}] + pair A,B,C,D;%pour la grille + A=(0,0); + B-A=u*coef*(nblargeur,0); + C-B=u*coef*(0,-nblignes); + D-C=A-B; + for k=1 upto nblargeur-1: + draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; + endfor; + for k=1 upto nblignes-1: + draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; + endfor; + draw polygone(A,B,C,D) withpen pensquare scaled 1.5; + if Legende: + label.lrt(\btex \tiny d'après APMEP etex rotated 90,B); + fi; + \end{mpost} + \fi +}% + +\newcommand\TraceEchiquierColoreColorilude{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + pair A,B,C,D;%pour la grille + A=(0,0); + B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0); + C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes}); + D-C=A-B; + numeric nblargeur,nblignes; + nblargeur:=\useKV[Colorilude]{Largeur}; + nblignes:=\useKV[Colorilude]{Lignes}; + % on récupère les données de coloriage + numeric n; + n:=0; + numeric nbCases[]; + color ColorSucc[]; + for p_=\the\toklisteremplissage: + n:=n+1; + if (n mod 2)=0: + nbCases[n div 2]:=p_; + else: + ColorSucc[n div 2]:=p_; + fi; + endfor; + % on colorie :) + numeric NBCASES; + NBCASES:=0; + for l=1 upto (n div 2): + fill ((unitsquare xscaled (\useKV[Colorilude]{Coef}*u*nbCases[l]) yscaled (\useKV[Colorilude]{Coef}*u)) shifted(\useKV[Colorilude]{Coef}*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1]; + NBCASES:=NBCASES+nbCases[l]; + endfor; + % on trace le quadrillage + for k=1 upto nblargeur-1: + draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; + endfor; + for k=1 upto nblignes-1: + draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; + endfor; + draw polygone(A,B,C,D) withpen pensquare scaled 1.5; + if \useKV[Colorilude]{Legende}: + label.lrt(btex \tiny d'après APMEP etex rotated 90,B); + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean Legende; + Legende=\useKV[Colorilude]{Legende}; + nblargeur:=\useKV[Colorilude]{Largeur}; + nblignes:=\useKV[Colorilude]{Lignes}; + coef:=\useKV[Colorilude]{Coef}; + numeric n; + n:=0; + numeric nbCases[]; + color ColorSucc[]; + for p_=\the\toklisteremplissage: + n:=n+1; + if (n mod 2)=0: + nbCases[n div 2]:=p_; + else: + ColorSucc[n div 2]:=p_; + fi; + endfor; + }] + pair A,B,C,D;%pour la grille + A=(0,0); + B-A=u*coef*(nblargeur,0); + C-B=u*coef*(0,-nblignes); + D-C=A-B; + % on colorie :) + numeric NBCASES; + NBCASES:=0; + for l=1 upto (n div 2): + fill ((unitsquare xscaled (coef*u*nbCases[l]) yscaled (coef*u)) shifted(coef*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1]; + NBCASES:=NBCASES+nbCases[l]; + endfor; + % on trace le quadrillage + for k=1 upto nblargeur-1: + draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; + endfor; + for k=1 upto nblignes-1: + draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; + endfor; + draw polygone(A,B,C,D) withpen pensquare scaled 1.5; + if Legende: + label.lrt(\btex \tiny d'après APMEP etex rotated 90,B); + fi; + \end{mpost} + \fi +}% + +\newtoks\toklisteremplissage% +\toklisteremplissage{}% +\def\UpdateRemplissage#1\nil{\addtotok\toklisteremplissage{#1,}}% + +\newcommand\ColoriludeEnonce{% +Pour chaque ligne de la grille, colorie de gauche à droite, de la +couleur indiquée, le nombre de cases donné par le résultat du calcul. +}% + +\newcommand\ColoriludeListeCouleur[1]{% + \setsepchar{ }% + \readlist\ListeColoriludeCouleurs{#1}% + \foreachitem\compteur\in\ListeColoriludeCouleurs{% + \ifodd\compteurcnt\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\compteur}\end{minipage}}~\else\compteur\quad\fi% + }% +}% + +\newcommand\Colorilude[2][]{% + \useKVdefault[Colorilude]% + \setKV[Colorilude]{#1}% + \setsepchar{\\/ }% + \readlist\ListeColorilude{#2}% + \ifboolKV[Colorilude]{Solution}{% + \toklisteremplissage{}% + \foreachitem\compteur\in\ListeColorilude{% + \foreachitem\couleur\in\ListeColorilude[\compteurcnt]{% + \expandafter\UpdateRemplissage\couleur\nil}% + }% + \TraceEchiquierColoreColorilude% + }{% + \dispogpfc{% + \TraceEchiquierColorilude% + }{% + % On cherche le nombre max de colonnes + \xdef\ListeColoriludeMax{0}% + \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{% + \xintifboolexpr{\listlen\ListeColorilude[##1]>\ListeColoriludeMax}{% + \xdef\ListeColoriludeMax{\listlen\ListeColorilude[##1]}% + }{}% + }% + \setlength{\tabcolsep}{0.2\tabcolsep}% + \begin{NiceTabular}{*{\fpeval{\ListeColoriludeMax/2}}{rl}}% + \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{% + \xintifboolexpr{\listlen\ListeColorilude[##1]==\ListeColoriludeMax}{% + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% + \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% + }% + }{% + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% + \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% + }% + &\hbox to5pt{}&\Cdots% + }% + \\[0.5em]% + }% + \end{NiceTabular}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCCompteBon.tex b/macros/latex/contrib/profcollege/latex/PfCCompteBon.tex new file mode 100644 index 0000000000..1610cc9378 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCompteBon.tex @@ -0,0 +1,238 @@ +%%% +% Le compte est bon +%%% +\setKVdefault[CompteBon]{NombreCalculs=5,NombrePlaques=4,Solution=false,Relatifs=false,Original=false,Graines=false,Plaques=6} +\defKV[CompteBon]{Graine=\setKV[CompteBon]{Graines}}% + +\makeatletter + +\newcommand\PfC@CreerListeCalculs[4]{% + \xdef\PfC@ListeCalculs{% + #1+#2+#3+#4,% + #1+#2+#3*#4/#1+#3*#4+#2/#3*#4+#1+#2,% + #1+#3+#2*#4/#1+#2*#4+#3/#2*#4+#1+#3,% + #1+#4+#2*#3/#1+#2*#3+#4/#2*#3+#1+#4,% + #2+#3+#1*#4/#2+#1*#4+#3/#1*#4+#2+#3,% + #2+#4+#1*#3/#2+#1*#3+#4/#2+#4+#1*#3,% + #3+#4+#1*#2/#3+#1*#2+#4/#3+#4+#1*#2,% + #1*#2+#3*#4/#3*#4+#1*#2,% + #1*#3+#2*#4/#2*#4+#1*#3,% + #1*#4+#2*#3/#2*#3+#1*#4,% + #1*#2*#3+#4/#4+#1*#2*#3, + #1*#2*#4+#3/#3+#1*#2*#4,% + #1*#3*#4+#2/#2+#1*#3*#4,% + #2*#3*#4+#1/#1+#2*#3*#4,% + #1*#2*#3*#4,% + #1+(#2+#3)*#4/(#2+#3)*#4+#1/#1+#4*(#2+#3)/#4*(#2+#3)+#1,% + #1+(#2+#4)*#3/(#2+#4)*#3+#1/#1+#3*(#2+#4)/#3*(#2+#4)+#1,% + #1+(#3+#4)*#2/(#3+#4)*#2+#1/#1+#2*(#3+#4)/#2*(#3+#4)+#1,% + #2+(#1+#3)*#4,% + #2+(#1+#4)*#3,% + #2+(#3+#4)*#1,% + #3+(#1+#2)*#4,% + #3+(#1+#4)*#2,% + #3+(#2+#4)*#1,% + #4+(#1+#2)*#3,% + #4+(#1+#3)*#2,% + #4+(#2+#3)*#1,% + (#1+#2+#3)*#4,% + (#1+#2+#4)*#3,% + (#1+#3+#4)*#2,% + (#2+#3+#4)*#1,% + (#1+#2)*(#3+#4),% + (#1+#3)*(#2+#4),% + (#1+#4)*(#2+#3)% + }% + \ifboolKV[CompteBon]{Relatifs}{% + \xdef\PfC@ListeCalculs{% + \PfC@ListeCalculs,% + #1-#2-#3-#4,% + #1-#2-#3*#4/#1-#3*#4-#2/#3*#4-#1-#2,% + #1-#3-#2*#4/#1-#2*#4-#3/#2*#4-#1-#3,% + #1-#4-#2*#3/#1-#2*#3-#4/#2*#3-#1-#4,% + #2-#3-#1*#4/#2-#1*#4-#3/#1*#4-#2-#3,% + #2-#4-#1*#3/#2-#1*#3-#4/#2-#4-#1*#3,% + #3-#4-#1*#2/#3-#1*#2-#4/#3-#4-#1*#2,% + #1*#2-#3*#4/#3*#4-#1*#2,% + #1*#3-#2*#4/#2*#4-#1*#3,% + #1*#4-#2*#3/#2*#3-#1*#4,% + #1*#2*#3-#4/#4-#1*#2*#3, + #1*#2*#4-#3/#3-#1*#2*#4,% + #1*#3*#4-#2/#2-#1*#3*#4,% + #2*#3*#4-#1/#1-#2*#3*#4,% + #1*#2*#3*#4,% + #1-(#2-#3)*#4/(#2-#3)*#4-#1/#1-#4*(#2-#3)/#4*(#2-#3)-#1,% + #1-(#2-#4)*#3/(#2-#4)*#3-#1/#1-#3*(#2-#4)/#3*(#2-#4)-#1,% + #1-(#3-#4)*#2/(#3-#4)*#2-#1/#1-#2*(#3-#4)/#2*(#3-#4)-#1,% + #2-(#1-#3)*#4,% + #2-(#1-#4)*#3,% + #2-(#3-#4)*#1,% + #3-(#1-#2)*#4,% + #3-(#1-#4)*#2,% + #3-(#2-#4)*#1,% + #4-(#1-#2)*#3,% + #4-(#1-#3)*#2,% + #4-(#2-#3)*#1,% + (#1-#2-#3)*#4,% + (#1-#2-#4)*#3,% + (#1-#3-#4)*#2,% + (#2-#3-#4)*#1,% + (#1-#2)*(#3-#4),% + (#1-#3)*(#2-#4),% + (#1-#4)*(#2-#3)% + }% + }{}% +}% + +\newtoks\tokPfCCBRappels +\def\UpdatetoksCB#1\nil{\addtotok\tokPfCCBRappels{#1,}}% + +\NewDocumentCommand\PfCCompteBonOriginal{o}{% + \useKVdefault[CompteBon] + \setKV[CompteBon]{#1}% + %On définit la liste des cartes + \xdef\PfCCBListeCartes{1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,25,50,75,100}% + \MelangeListe{\PfCCBListeCartes}{\useKV[CompteBon]{Plaques}} + \readlist*\PfCCBListeTirage{\faa} + \MelangeListe{\faa}{\useKV[CompteBon]{Plaques}} + \readlist*\PfCCBListeTirageAffiche{\faa} + %%Tirage ok + \xdef\PfCCBResultatFinal{1001}% + \whiledo{\PfCCBResultatFinal>1000}{% + \xdef\PfCListeATrier{\PfCCBListeTirage[1]}% + \xintFor* ##1 in{\xintSeq{2}{\useKV[CompteBon]{Plaques}}}\do{% + \xdef\PfCListeATrier{\PfCListeATrier,\PfCCBListeTirage[##1]}% + }% + % + \tokPfCCBRappels{}% + \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[CompteBon]{Plaques}-1}}}\do{% + \MelangeListe{\PfCListeATrier}{2} + \readlist*\PfCCBListeTirageIntermediaire{\faa} + \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==1 || \PfCCBListeTirageIntermediaire[2]==1}{% + % On ne fait pas de multiplication par 1 + \xdef\PfCCBAlea{\fpeval{randint(1,2)}}% + \xintifboolexpr{\PfCCBAlea==1}{% + \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} + \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% + }{% + \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==\PfCCBListeTirageIntermediaire[2]}{% + \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} + }{% + \xdef\PfCCBTest{\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}-\fpeval{min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}=\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])-min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}} + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{abs(\PfCCBListeTirageIntermediaire[1]-\PfCCBListeTirageIntermediaire[2])}} + }% + \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% + }% + \xdef\PfCListeATrier{\fii,\PfCCBResultat}% + }{% + \xdef\PfCCBAlea{\fpeval{randint(1,3)}}% + \xintifboolexpr{\PfCCBAlea==1}{% + \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} + \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% + }{% + \xintifboolexpr{\PfCCBAlea==2}{% + \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==\PfCCBListeTirageIntermediaire[2]}{% + \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} + }{% + \xdef\PfCCBTest{\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}-\fpeval{min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}=\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])-min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}} + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{abs(\PfCCBListeTirageIntermediaire[1]-\PfCCBListeTirageIntermediaire[2])}} + }% + \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% + }{% + \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]}} + \expandafter\UpdatetoksCB\PfCCBTest\nil% + \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]}} + \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% + } + }% + \xdef\PfCListeATrier{\fii,\PfCCBResultat}% + }% + }% + \xintifboolexpr{\useKV[CompteBon]{Plaques}>5}{\xintifboolexpr{\PfCCBResultat<100}{\xdef\PfCCBResultat{1001}}{}}{}% + \xdef\PfCCBResultatFinal{\PfCCBResultat}% + }% + \begin{center} + \textbf{\PfCCBResultatFinal} + + \fbox{\PfCCBListeTirage[1]} \xintFor* ##1 in{\xintSeq{2}{\useKV[CompteBon]{Plaques}}}\do{\qquad \fbox{\PfCCBListeTirage[##1]}}% + \end{center} + \xdef\PfCCBListeRappels{\the\tokPfCCBRappels} + \setsepchar[*]{,*=}\ignoreemptyitems + \readlist*\PfCCBDecompositionEtapes{\PfCCBListeRappels} + \reademptyitems + \ifboolKV[CompteBon]{Solution}{% + \begin{align*} + \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[CompteBon]{Plaques}-1}}}\do{ + \StrSubstitute{\PfCCBDecompositionEtapes[##1,1]}{*}{\times}[\PfCCBAffiche]\PfCCBAffiche&=\PfCCBDecompositionEtapes[##1,2]\xintifForLast{\\}{} + } + \end{align*} + }{}% +}% + +\NewDocumentCommand\CompteBon{o}{% + \useKVdefault[CompteBon]% + \setKV[CompteBon]{#1}% + \ifboolKV[CompteBon]{Graines}{\PfCGraineAlea{\useKV[CompteBon]{Graine}}}{}% + \ifboolKV[CompteBon]{Original}{% + \PfCCompteBonOriginal[#1]% + }{% + % on choisit NombrePlaques parmi la liste des nombres 1 à 9, 10/25/50/75/100, La moitié +1 devant appartenir à 1..9 + \xdef\PfCCBListeEntiers{2,3,4,5,6,7,8,9}% + \xdef\PfCCBListeMultiples{10,25,50,75,100}% + \xdef\PfCCBNbPlaqueEntiers{\fpeval{floor(\useKV[CompteBon]{NombrePlaques}/2)+1}}% + \xdef\PfCCBNbPlaqueMultiples{\useKV[CompteBon]{NombrePlaques}-\PfCCBNbPlaqueEntiers}% + \MelangeListe{\PfCCBListeEntiers}{\PfCCBNbPlaqueEntiers}% + \setsepchar{,}% + \ignoreemptyitems% + \readlist*\PfCCBListeEntiersChoisis{\faa}% + \MelangeListe{\PfCCBListeMultiples}{\PfCCBNbPlaqueMultiples}% + \ignoreemptyitems% + \readlist*\PfCCBListeMultiplesChoisis{\faa}% + \reademptyitems% + \xdef\PfCCBListeToutesCartes{}% + \foreachitem\compteur\in\PfCCBListeEntiersChoisis{% + \xdef\PfCCBListeToutesCartes{\PfCCBListeToutesCartes{},\PfCCBListeEntiersChoisis[\compteurcnt]}% + }% + \foreachitem\compteur\in\PfCCBListeMultiplesChoisis{% + \xdef\PfCCBListeToutesCartes{\PfCCBListeToutesCartes{},\PfCCBListeMultiplesChoisis[\compteurcnt]}% + }% + \MelangeListe{\PfCCBListeToutesCartes}{4}% + \readlist*\PfCCBListeFinaleCartes{\faa}% + % Choix des calculs + \xdef\PfC@CalculUn{\PfCCBListeFinaleCartes[1]}% + \xdef\PfC@CalculDeux{\PfCCBListeFinaleCartes[2]}% + \xdef\PfC@CalculTrois{\PfCCBListeFinaleCartes[3]}% + \xdef\PfC@CalculQuatre{\PfCCBListeFinaleCartes[4]}% + \PfC@CreerListeCalculs{\PfC@CalculUn}{\PfC@CalculDeux}{\PfC@CalculTrois}{\PfC@CalculQuatre} + \MelangeListe{\PfC@ListeCalculs}{\useKV[CompteBon]{NombreCalculs}}% + \setsepchar[*]{,*/}% + \readlist*\PfC@ListeCalculsChoisis{\faa}% + \begin{center} + \setlength{\tabcolsep}{0.5\tabcolsep} + % Le tableau des nombres + \begin{NiceTabular}{m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}} + \Block[draw]{}{\PfCCBListeFinaleCartes[1]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[2]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[3]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[4]} + \end{NiceTabular} + + \bigskip + + % Le tableau des calculs% + \begin{NiceTabular}{m{30pt}cccm{20pt}m{10pt}m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}} + \xintFor* ##1 in{\xintSeq{1}{\useKV[CompteBon]{NombreCalculs}}}\do{% + \Block[draw]{}{\num{\fpeval{\PfC@ListeCalculsChoisis[##1,1]}}}&&$=$&&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}\\ + \ifboolKV[CompteBon]{Solution}{\Block{1-11}{\footnotesize Une solution : \StrSubstitute[0]{\PfC@ListeCalculsChoisis[##1,1]}{*}{\times}[\PfCEcritureCalcul]$\PfCEcritureCalcul$}}{}\\ + }% + \end{NiceTabular} + \end{center} + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDecDeci.tex b/macros/latex/contrib/profcollege/latex/PfCDecDeci.tex new file mode 100644 index 0000000000..3e9cc7d1c8 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDecDeci.tex @@ -0,0 +1,177 @@ +%%% +% Décomposition décimale +%% +\setKVdefault[DecompDeci]{Parentheses,Colore=false,CouleurU=Blue,CouleurD=Red,CouleurC=Green,Fleches=false,Details=false} + +\newcounter{PfCNbDecDeci} +\setcounter{PfCNbDecDeci}{0} + +\NewDocumentCommand\DecompositionDecimale{o m}{% + \stepcounter{PfCNbDecDeci}% + \useKVdefault[DecompDeci]% + \setKV[DecompDeci]{#1}% + % On cherche si le nombre est décimal ou entier + \StrCount{#2}{.}[\PfCNombrePoint]% + \xintifboolexpr{\PfCNombrePoint==0}{% + % on compte la longueur. + \StrLen{#2}[\PfCNombrePuisMax]% + \xdef\PfCRetiensPuis{0}% + % On cherche le nombre de 0 terminaux. + \xintFor* ##1 in{\xintSeq{1}{\PfCNombrePuisMax}}\do{% + \xintifboolexpr{\fpeval{#2/(10^##1)}==\fpeval{round(#2/(10^##1))}}{% + \xdef\PfCRetiensPuis{\fpeval{\PfCRetiensPuis+1}}% + }{}% + }% + % On cherche un affichage du style \num de \siunitx + \modulo{\fpeval{\PfCNombrePuisMax}}{3}% + \xintifboolexpr{\remainder==0}{% + \xdef\PfCDecDeciEcart{0} + }{\xintifboolexpr{\remainder==1}{\xdef\PfCDecDeciEcart{1}}{\xdef\PfCDecDeciEcart{2}}} + \ifboolKV[DecompDeci]{Fleches}{% + \colorlet{oldcolor}{black}% + % On affiche + \begin{center} + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre]% + \modulo{\fpeval{\PfCNombrePuisMax+\PfCDecDeciEcart--##1}}{3}% + \xintifboolexpr{\remainder==0}{% + \color{\useKV[DecompDeci]{CouleurU}}\tikzmarknode[anchor=south,inner ysep=2pt]{DDA-\thePfCNbDecDeci-##1}{\PfCNombreChiffre}{}\xintifForLast{}{\,\color{oldcolor}}}{% + \xintifboolexpr{\remainder==1}{% + \color{\useKV[DecompDeci]{CouleurC}}\tikzmarknode[anchor=south,inner ysep=2pt]{DDA-\thePfCNbDecDeci-##1}{\PfCNombreChiffre}{}}{% + \color{\useKV[DecompDeci]{CouleurD}}\tikzmarknode[anchor=south,inner ysep=2pt]{DDA-\thePfCNbDecDeci-##1}{\PfCNombreChiffre}{}% + }% + }% + }\color{oldcolor}% + + \vspace*{3em} + + \ifboolKV[DecompDeci]{Details}{% + \ensuremath{% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre] + \modulo{\fpeval{\PfCNombrePuisMax+\PfCDecDeciEcart--##1}}{3}% + \colorlet{oldcolor}{.} + \xintifboolexpr{\remainder==0}{\color{\useKV[DecompDeci]{CouleurU}}}{% + \xintifboolexpr{\remainder==1}{\color{\useKV[DecompDeci]{CouleurC}}}{% + \color{\useKV[DecompDeci]{CouleurD}}% + }% + }% + \xintifboolexpr{\PfCNombreChiffre==0}{}{% + \tikzmarknode[anchor=north,inner ysep=2pt]{DDC-\thePfCNbDecDeci-##1}{\boxed{\num{\fpeval{\PfCNombreChiffre*10^(\PfCNombrePuisMax-##1)}}}}\color{oldcolor}% + \xintifForLast{}{+}% + }% + }% + }% + + \vspace*{3em} + + }{}% + + \ensuremath{% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre] + \xintifboolexpr{\PfCNombreChiffre==0}{}{% + \modulo{\fpeval{\PfCNombrePuisMax+\PfCDecDeciEcart--##1}}{3}% + \colorlet{oldcolor}{.} + \xintifboolexpr{\remainder==0}{\color{\useKV[DecompDeci]{CouleurU}}}{% + \xintifboolexpr{\remainder==1}{\color{\useKV[DecompDeci]{CouleurC}}}{% + \color{\useKV[DecompDeci]{CouleurD}}% + }% + }% + \tikzmarknode[anchor=north,inner ysep=2pt]{DDB-\thePfCNbDecDeci-##1}{\boxed{\PfCNombreChiffre\times\num{\fpeval{10^(\PfCNombrePuisMax-##1)}}}}{}\color{oldcolor}% + \xintifForLast{}{+}% + }% + }% + }% + \end{center} + \begin{tikzpicture}[remember picture,overlay] + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre]% + \modulo{\fpeval{\PfCNombrePuisMax+\PfCDecDeciEcart--##1}}{3}% + \xintifboolexpr{\remainder==0}{% + \colorlet{PfCDecDeciColor}{\useKV[DecompDeci]{CouleurU}}}{% + \xintifboolexpr{\remainder==1}{% + \colorlet{PfCDecDeciColor}{\useKV[DecompDeci]{CouleurC}}}{% + \colorlet{PfCDecDeciColor}{\useKV[DecompDeci]{CouleurD}}% + }% + }% + \ifboolKV[DecompDeci]{Details}{% + \xintifboolexpr{\PfCNombreChiffre>0}{% + \draw[-stealth,PfCDecDeciColor] (pic cs:DDA-\thePfCNbDecDeci-##1) to (pic cs:DDC-\thePfCNbDecDeci-##1); + \node (DDD-\thePfCNbDecDeci-##1) at ($(pic cs:DDC-\thePfCNbDecDeci-##1)!0.35!(pic cs:DDB-\thePfCNbDecDeci-##1)$) {}; + \draw[-stealth,PfCDecDeciColor] (DDD-\thePfCNbDecDeci-##1) to (pic cs:DDB-\thePfCNbDecDeci-##1); + }{}% + }{% + \xintifboolexpr{\PfCNombreChiffre>0}{% + \draw[-stealth,PfCDecDeciColor] (pic cs:DDA-\thePfCNbDecDeci-##1) to (pic cs:DDB-\thePfCNbDecDeci-##1); + }{}% + }% + }% + \end{tikzpicture} + }{% + \ifboolKV[DecompDeci]{Colore}{% + \colorlet{oldcolor}{black}% + \ensuremath{% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre]% + \modulo{\fpeval{\PfCNombrePuisMax+\PfCDecDeciEcart--##1}}{3}% + \xintifboolexpr{\remainder==0}{\color{\useKV[DecompDeci]{CouleurU}}\PfCNombreChiffre\xintifForLast{}{\,\color{oldcolor}}}{% + \xintifboolexpr{\remainder==1}{\color{\useKV[DecompDeci]{CouleurC}}\PfCNombreChiffre}{% + \color{\useKV[DecompDeci]{CouleurD}}\PfCNombreChiffre% + }% + }% + }\color{oldcolor}% + = + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre] + \xintifboolexpr{\PfCNombreChiffre==0}{}{% + \modulo{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis-##1}}{3} + \colorlet{oldcolor}{.} + \xintifboolexpr{\remainder==0}{\color{\useKV[DecompDeci]{CouleurU}}}{% + \xintifboolexpr{\remainder==1}{\color{\useKV[DecompDeci]{CouleurD}}}{% + \color{\useKV[DecompDeci]{CouleurC}}% + }% + }% + \boxed{\PfCNombreChiffre\times\num{\fpeval{10^(\PfCNombrePuisMax-##1)}}}\color{oldcolor}% + \xintifForLast{}{+}% + }% + }% + } + }{% + \ensuremath{% + \num{#2}= + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCNombrePuisMax-\PfCRetiensPuis}}}\do{% + \StrChar{#2}{##1}[\PfCNombreChiffre] + \xintifboolexpr{\PfCNombreChiffre==0}{}{% + \ifboolKV[DecompDeci]{Parentheses}{\left(}{}\PfCNombreChiffre\times\num{\fpeval{10^(\PfCNombrePuisMax-##1)}}\ifboolKV[DecompDeci]{Parentheses}{\right)}{}% + \xintifForLast{}{+}% + }% + }% + }% + }% + }% + }{%partie avec les nombres décimaux + \StrDel{#2}{.}[\PfCRetiensNombreEntier]% + \StrLen{#2}[\PfCNombrePuisMax]% + \xdef\PfCNombrePuisMax{\fpeval{\PfCNombrePuisMax-1}}% + \StrPosition{#2}{.}[\PfCPositionPoint]% + \xdef\PfCPuisDeci{\fpeval{\PfCNombrePuisMax-\PfCPositionPoint}}% + \xdef\PfCRetiensPuis{0}% + % On cherche le nombre de 0 terminaux. + \xintFor* ##1 in{\xintSeq{1}{\PfCNombrePuisMax}}\do{% + \xintifboolexpr{\fpeval{(#2*10^(\PfCPuisDeci+1))/(10^##1)}==\fpeval{round((#2*10^(\PfCPuisDeci+1))/(10^##1))}}{% + \xdef\PfCRetiensPuis{\fpeval{\PfCRetiensPuis+1}}% + }{}% + }% + \ensuremath{% + \num{#2}= + \xintFor* ##1 in {\xintSeq{1}{\PfCNombrePuisMax-\PfCRetiensPuis}}\do{% + \StrChar{\PfCRetiensNombreEntier}{##1}[\PfCNombreChiffre] + \xintifboolexpr{\PfCNombreChiffre==0}{}{% + \ifboolKV[DecompDeci]{Parentheses}{\left(}{}\PfCNombreChiffre\times\num{\fpeval{10^(\PfCNombrePuisMax-##1-\PfCPuisDeci-1)}}\ifboolKV[DecompDeci]{Parentheses}{\right)}{}% + \xintifForLast{}{+}% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDecompFracDeci.tex b/macros/latex/contrib/profcollege/latex/PfCDecompFracDeci.tex new file mode 100644 index 0000000000..b045c64f63 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDecompFracDeci.tex @@ -0,0 +1,59 @@ +%%% +% 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}}% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex b/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex new file mode 100644 index 0000000000..6fab8783f9 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDecomposerNombrePremier.tex @@ -0,0 +1,763 @@ +%%% +% Nombre Premier +%%% +\setKVdefault[ClesNombrePremier]{Tableau=false,TableauVide=false,TableauVertical=false,TableauVerticalVide=false,Exposant=false,Longue=false,All=false,Arbre=false,ArbreVide=false,ArbreComplet=false,ArbreDessine=false,ArbreDessineVide=false,Entoure=false,Entourefin=false,Diviseurs=false,DiviseursT=false,Dot=\dotfill,Impose=false,ImposeAll=false,Potence=false,Decalage=10,Vide=false,CouleurFeuillage=ForestGreen,CouleurTronc=BurlyWood,CouleurFruits=Red,CouleurTexte=white}% +\defKV[ClesNombrePremier]{Nombre=\ifboolKV[ClesNombrePremier]{ArbreDessine}{}{\ifboolKV[ClesNombrePremier]{ArbreDessineVide}{}{\setKV[ClesNombrePremier]{Impose}}}}% +\defKV[ClesNombrePremier]{AllNombre=\setKV[ClesNombrePremier]{ImposeAll}}% +\defKV[ClesNombrePremier]{Impression=\setKV[ClesNombrePremier]{CouleurFeuillage=white,CouleurTronc=white,CouleurFruits=gris,CouleurTexte=black}} + +\newcommand\Decomposition[2][]{% + \useKVdefault[ClesNombrePremier]% + \setKV[ClesNombrePremier]{#1}% + \ifboolKV[ClesNombrePremier]{Impose}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{Nombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{Nombre}}}}{}% + \ifboolKV[ClesNombrePremier]{ImposeAll}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{AllNombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{AllNombre}}}}{}% + \ifboolKV[ClesNombrePremier]{Tableau}{\NombrePremier{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVide}{\NombrePremier{#2}}{}% + \ifboolKV[ClesNombrePremier]{Potence}{\NombrePremierPotence{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVertical}{\NombrePremierVertical{#2}}{}% + \ifboolKV[ClesNombrePremier]{TableauVerticalVide}{\NombrePremierVerticalVide{#2}}{}% + \ifboolKV[ClesNombrePremier]{Exposant}{\PremierExposant{#2}}{}% + \ifboolKV[ClesNombrePremier]{Longue}{\PremierLong{#2}}{}% + \ifboolKV[ClesNombrePremier]{All}{\NombrePremierExposant{#2}}{}% + \ifboolKV[ClesNombrePremier]{Arbre}{\MPArbre{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreComplet}{\MPArbreComplet{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreVide}{\MPArbreVide{#2}}{}% + \ifboolKV[ClesNombrePremier]{ArbreDessine}{\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% + \ifboolKV[ClesNombrePremier]{ArbreDessineVide}{\setKV[ClesNombrePremier]{Vide=true}\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% + \ifboolKV[ClesNombrePremier]{Diviseurs}{\ListeDiviseur{#2}}{}% + \ifboolKV[ClesNombrePremier]{DiviseursT}{\ListeDiviseurT{#2}}{}% +}% + +\def\MPArbre#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + + label(btex \num{#1} etex,(0,0)); + forever: + PremierSimple(racine); + exitif racine=1; + endfor; + + if \useKV[ClesNombrePremier]{Entoure}: + for l=1 upto k: + if Estcepremier(retenirnb[l]): + draw cercles(Ancre[l],0.25*decalage); + fi; + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; boolean Entoure; Entoure=\useKV[ClesNombrePremier]{Entoure};}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + label(LATEX("\num{"&decimal(racine)&"}"),(0,0)); + forever: + PremierSimplePdf(racine); + exitif racine=1; + endfor; + + if \useKV[ClesNombrePremier]{Entoure}: + for l=1 upto k: + if Estcepremier(retenirnb[l]): + draw cercles(Ancre[l],0.25*decalage); + fi; + endfor; + fi; +\end{mpost} +\fi +} + +\def\MPArbreComplet#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + nbe:=NbEtape(#1); + Positions(nbe); + if \useKV[ClesNombrePremier]{Entoure}: + draw polygone(N[nbe-1][0]+(-0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,-0.25*decalage),N[nbe-1][0]+(-0.25*dx,-0.25*decalage)) dashed evenly; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsPdf(NbEtape(#1)); + \end{mpost} + \fi +} + +\def\MPArbreVide#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsVide(NbEtape(#1)); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage; decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] + input PfCArithmetique; + numeric depart; + pair Ancre[]; + + dx:=1cm; + dy:=1cm; + + pair N[][]; + + PositionsVidePdf(NbEtape(#1)); + \end{mpost} + \fi +} + +\def\MPArbreDessine#1#2{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + input PfCArithmetique; + numeric depart; + pair Ancre[]; + numeric decalage; + decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; + rayonfruits:=3mm; + + color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte; + CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc}; + CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage}; + CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; + CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + k:=1; + Ancre1:=(-decalage,-decalage); + draw Branche(Ancre0,Ancre1); + retenirnb[1]:=#2; + racine:=#2; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + k:=k+1; + Ancre[k]:=(decalage,-decalage); + draw Branche(Ancre0,Ancre[k]); + retenirnb[k]:=#1 div #2; + racine:=retenirnb[k]; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + + fill cercles(Ancre[0],rayonfruits) withcolor white; + label(btex \num{#1} etex,(0,0)); + for l=1 upto k: + if \useKV[ClesNombrePremier]{Vide}: + fill cercles(Ancre[l],rayonfruits) withcolor white; + else: + if Estcepremier(retenirnb[l]): + fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; + drawoptions(withcolor CouleurTexte); + label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + drawoptions(); + else: + fill cercles(Ancre[l],rayonfruits) withcolor white; + label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + fi; + fi; + endfor; + for l=0 upto k: + draw cercles(Ancre[l],rayonfruits); + endfor; + picture Bilan; + Bilan=currentpicture; + currentpicture:=nullpicture; + % Habillage + % On récupère le min des ordonnées des Ancre pour le feuillage + minord=1000; + nbancrearetenir=0; + for l=0 upto k: + if ypart(Ancre[l])<minord: + minord:=ypart(Ancre[l]); + nbancrearetenir:=l; + fi; + endfor; + pair D[]; + D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; + dotlabel("",D0); + % Herbe du sol + pair A[]; + A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); + A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); + for l=1 upto 9: + A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); + endfor; + %Pour le tronc + pair B[]; + B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); + B2=symetrie(B1,Ancre0,1/2[A0,A10]);%=(-2mm,0); + B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; + path tronc; + tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% + fill tronc withcolor CouleurTronc; + trace tronc; + % Pour le feuillage + path feuillage; + feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% + pair C[]; + for l=0 upto 7: + C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; + endfor; + feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; + fill feuillage withcolor CouleurFeuillage; + trace feuillage; + draw Bilan; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte;CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc};CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage};CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; boolean Vide; Vide=\useKV[ClesNombrePremier]{Vide};}] + input PfCArithmetiquePDF; + numeric depart; + pair Ancre[]; + rayonfruits:=3mm; + + k:=0; + Ancre0:=(0,0); + racine:=#1; + k:=1; + Ancre1:=(-decalage,-decalage); + draw Branche(Ancre0,Ancre1); + retenirnb[1]:=#2; + racine:=#2; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + k:=k+1; + Ancre[k]:=(decalage,-decalage); + draw Branche(Ancre0,Ancre[k]); + retenirnb[k]:=#1 div #2; + racine:=retenirnb[k]; + forever: + PremierSimpleArbre(racine); + exitif racine=1; + endfor; + + fill cercles(Ancre[0],rayonfruits) withcolor white; + label(btex \num{#1} etex,(0,0)); + for l=1 upto k: + if Vide: + fill cercles(Ancre[l],rayonfruits) withcolor white; + else: + if Estcepremier(retenirnb[l]): + fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; + drawoptions(withcolor CouleurTexte); + label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + drawoptions(); + else: + fill cercles(Ancre[l],rayonfruits) withcolor white; + label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); + fi; + fi; + endfor; + for l=0 upto k: + draw cercles(Ancre[l],rayonfruits); + endfor; + picture Bilan; + Bilan=currentpicture; + currentpicture:=nullpicture; + % Habillage + minord=1000; + nbancrearetenir=0; + for l=0 upto k: + if ypart(Ancre[l])<minord: + minord:=ypart(Ancre[l]); + nbancrearetenir:=l; + fi; + endfor; + pair D[]; + D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; + pair A[]; + A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); + A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); + for l=1 upto 9: + A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); + endfor; + pair B[]; + B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); + B2=symetrie(B1,Ancre0,1/2[A0,A10]);% + B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; + path tronc; + tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% + fill tronc withcolor CouleurTronc; + trace tronc; + path feuillage; + feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% + pair C[]; + for l=0 upto 7: + C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; + endfor; + feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; + fill feuillage withcolor CouleurFeuillage; + trace feuillage; + draw Bilan; + \end{mpost} +\fi +} + +\newcount\premier% + +\newcommand\NombrePremier[1]{%\'ecrire la d\'ecomposition compl\`ete + % #1 le nombre premier \`a tester + \newcount\anp\newcount\bnp\newcount\cnp% + \anp=#1\relax + \bnp=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \begin{align*} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\ifboolKV[ClesNombrePremier]{TableauVide}{\phantom{\PremierEtape{#1}{##1}}}{\PremierEtape{#1}{##1}}\xintifboolexpr{##1<\premier}{\\}{}}% + \end{align*} + \fi +} + +\newcount\premierun +\newcount\premierdeux + +\newcommand\NombrePremierImpose[3]{% + % #1 le nombre premier \`a tester + % #2 est le premier facteur imposé + % #3 est le deuxième facteur imposé + \newcount\anp\newcount\bnp\newcount\cnp% + % Pour d\'eterminer le nombre d'\'etapes pour #1 + \anp=#1\relax + \bnp=2\relax + \premier=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + % Pour d\'eterminer le nombre d'\'etapes pour #2 + \anp=#2\relax + \bnp=2\relax + \premierun=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premierun=\numexpr\premierun+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + % Pour d\'eterminer le nombre d'\'etapes pour #3 + \anp=#3\relax + \bnp=2\relax + \premierdeux=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \global\premierdeux=\numexpr\premierdeux+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + \ifboolKV[ClesNombrePremier]{ImposeAll}{\xdef\PfCRappelImposeAll{1}}{\xdef\PfCRappelImposeAll{0}}% + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \xintifboolexpr{\premierun>\premierdeux}{\premier=\premierun}{\premier=\premierdeux} + \begin{align*} + \num{#1}&=\num{#2}\times\num{#3}%\\ + \xintifboolexpr{\premier>0}{\\% + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\xintifboolexpr{##1<\premierun}{\PremierEtape{#2}{##1}}{\Decomposition[Longue]{#2}}\mathrel{\times}\xintifboolexpr{##1<\premierdeux}{\PremierEtape{#3}{##1}}{\Decomposition[Longue]{#3}}\xintifboolexpr{##1<\premier}{\\}{}}% + }{}% + \xintifboolexpr{\PfCRappelImposeAll==1}{\\\num{#1}&=\PremierExposant{#1}}{}% + \end{align*} + \fi +}% + +\newcommand\NombrePremierVertical[1]{%\'ecrire la d\'ecomposition compl\`ete + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier. + \else + \begin{tabular}{c|c} + \xintFor* ##1 in {\xintSeq {0}{\premier}}\do + {\PremierMultipleVide{#1}{##1}&\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape} + \xintifboolexpr{##1<\premier}{\\}{\\1\\}}% + \end{tabular} + \fi +} + +\newcommand\NombrePremierPotence[1]{% + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0% + Le nombre \num{#1} est un nombre premier.% + \else% + \xdef\PotenceCases{\fpeval{\premier+2}}% + \begin{NiceTabular}{*{\PotenceCases}{c}} + %\Body + \PremierMultipleVide{#1}{0}&\multicolumn{1}{|c}{\PremierDiviseurVide{#1}{1}}\\ + \hhline{~-} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do{% + \xintifboolexpr{##1 == 0}{}{\xintFor* ##2 in {\xintSeq {1}{##1}}\do{% + &}% + }% + \multicolumn{1}{|c}{\PremierMultipleVide{#1}{##1}}&\multicolumn{1}{|c}{\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape}}\\ + \hhline{*{\fpeval{##1+1}}{~}-} + }% + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\PotenceCases-2}}}\do{% + &}&\multicolumn{1}{|c}{1}\\ + \CodeAfter + \tikz \draw [white,fill=white] (1 -|2) circle (0.5mm); + \xintFor* ##1 in {\xintseq{2}{\PotenceCases}}\do{% + \tikz \draw [white,fill=white,transform canvas={xshift=0mm}] (\fpeval{##1-1} -|##1) circle (0.5mm); + }% + \end{NiceTabular}% + \fi% +} + +\newcommand\PremierDiviseurVide[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anpvv\newcount\bnpvv\newcount\cnpvv\newcount\dnpvv% + \ensuremath{% + \anpvv=#1\relax + \bnpvv=2\relax + \dnpvv=0\relax% + \whiledo{\anpvv > 1}{% + \whiledo{\dnpvv < \number#2}{% + \modulo{\the\anpvv}{\the\bnpvv} + \ifnum\remainder=0\relax + \dnpvv=\numexpr\dnpvv+1\relax + \cnpvv=\numexpr\anpvv/\bnpvv\relax + \anpvv=\cnpvv\relax + \else% + \bnpvv=\numexpr\bnpvv+1\relax% + \fi% + } + \num{\the\bnpvv}% + \anpvv=1% + } + } +} + +\newcommand\PremierMultipleVide[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anpmv\newcount\bnpmv\newcount\cnpmv\newcount\dnpmv% + \ensuremath{% + \anpmv=#1\relax + \bnpmv=2\relax + \dnpmv=0\relax% + \whiledo{\anpmv > 1}{% + \whiledo{\dnpmv < \number#2}{% + \modulo{\the\anpmv}{\the\bnpmv} + \ifnum\remainder=0\relax + \dnpmv=\numexpr\dnpmv+1\relax + \cnpmv=\numexpr\anpmv/\bnpmv\relax + \anpmv=\cnpmv\relax + \else% + \bnpmv=\numexpr\bnpmv+1\relax% + \fi% + } + \num{\the\anpmv}% + \anpmv=1% + } + } +} + +\newcommand\NombrePremierVerticalVide[1]{% + % #1 le nombre premier \`a tester + \newcount\anpv\newcount\bnpv\newcount\cnpv% + \anpv=#1\relax + \bnpv=2\relax + \premier=-1\relax + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anpv > 1}{% + \modulo{\the\anpv}{\the\bnpv} + \ifnum\remainder=0\relax + \global\premier=\numexpr\premier+1\relax + \cnpv=\numexpr\anpv/\bnpv\relax + \anpv=\cnpv\relax + \else% + \bnpv=\numexpr\bnpv+1\relax% + \fi% + } + \ifnum\premier=0 + Le nombre \num{#1} est un nombre premier.% + \else + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{c|c} + \PremierMultipleVide{#1}{0}&\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}\\ + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do + {\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}&\hbox + to1cm{\useKV[ClesNombrePremier]{Dot}}\xintifboolexpr{##1<\premier}{\\}{\\\hbox + to1cm{\useKV[ClesNombrePremier]{Dot}}\\}}% + \end{tabular} + \renewcommand{\arraystretch}{1} + \fi +} + +\newcommand\NombrePremierExposant[1]{% + \newcount\anp\newcount\bnp\newcount\cnp% + % #1 le nombre premier \`a tester + \anp=#1\relax% + \bnp=2\relax% + \premier=-1\relax% + % Pour d\'eterminer le nombre d'\'etapes + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax% + \global\premier=\numexpr\premier+1\relax% + \cnp=\numexpr\anp/\bnp\relax% + \anp=\cnp\relax% + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% + \ifnum\premier=0% + Le nombre \num{#1} est un nombre premier.% + \else% + \begin{align*} + \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\PremierEtape{#1}{##1}\\}% + \num{#1}&=\PremierExposant{#1}% + \end{align*}% + \fi% +}% + +\newcommand\PremierEtape[2]{% + %#1 : le nombre entier \`a tester + %#2 : le nombre d'\'etapes \`a effectuer + \newcount\anp\newcount\bnp\newcount\cnp\newcount\dnp% + \ensuremath{% + \anp=#1\relax + \bnp=2\relax + \dnp=0\relax% + \whiledo{\anp > 1}{% + \whiledo{\dnp < \number#2}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \dnp=\numexpr\dnp+1\relax + \cnp=\numexpr\anp/\bnp\relax + \anp=\cnp\relax + \num{\the\bnp}\times% + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + } + \num{\the\anp}% + \anp=1% + } + } +} + +\newcommand\PremierExposant[1]{% + %#1 : le nombre entier \`a tester + \ensuremath{% + \newcount\anp\newcount\bnp\newcount\cnp% + \newcount\pileb\newcount\exposant% + \exposant=0\relax% + \anp=#1\relax% + \bnp=2\relax% + \pileb=2\relax% + \whiledo{\the\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax + \cnp=\numexpr\anp/\bnp\relax + \ifnum\pileb=\bnp + \exposant=\numexpr\exposant+1\relax + \fi + \anp=\cnp\relax + \else% + \ifnum\exposant>0\relax + \num{\the\pileb}\ifnum\exposant>1 ^{\num{\the\exposant}}\fi\times% + \fi + \bnp=\numexpr\bnp+1\relax% + \pileb=\bnp\relax% + \exposant=0\relax% + \fi% + }% + \num{\the\pileb}\ifnum\exposant>1^{\num{\the\exposant}}\fi% + }% +}% + +\newcommand\PremierLong[1]{% + %#1 : le nombre entier \`a tester + \ensuremath{% + \newcount\anpl\newcount\bnpl\newcount\cnpl% + \newcount\pilebl% + \anpl=#1\relax% + \bnpl=2\relax% + \pilebl=2\relax% + \whiledo{\the\anpl > 1}{% + \modulo{\the\anpl}{\the\bnpl} + \ifnum\remainder=0\relax + \cnpl=\numexpr\anpl/\bnpl\relax + \num{\the\bnpl}\ifnum\anpl>\bnpl\times\fi% + \anpl=\cnpl\relax + \else% + \bnpl=\numexpr\bnpl+1\relax% + \pilebl=\bnpl\relax% + \fi% + } + } +} + +\newcommand\ListeDiviseur[1]{%#1 : le nombre entier \`a tester + \newcount\anp\newcount\bnp% + \anp=#1% + \bnp=2\relax% + 1 % + \whiledo{\bnp<\anp}{% + \modulo{\the\anp}{\the\bnp}{}% + \ifnum\remainder=0% + ; $\num{\the\bnp}$ % + \fi% + \bnp=\numexpr\bnp+1% + }% + et \num{\the\anp}% +} + +\newcount\anpT\newcount\bnpT\newcount\cnpT\newcount\dnpT% + +\newcommand\ListeDiviseurT[1]{%#1 : le nombre entier \`a tester + \anpT=#1% + \bnpT=2\relax% + %On compte les diviseurs propres. + \cnpT=0\relax% + \whiledo{\bnpT<\anpT}{% + \modulo{\the\anpT}{\the\bnpT}{}% + \ifnum\remainder=0% + \cnpT=\numexpr\cnpT+1% + \fi% + \bnpT=\numexpr\bnpT+1% + }% + \ifodd\cnpT% + \begin{tabular}{c|c}% + 1&\num{#1}\\ + \xintFor* ##1 in {\xintSeq {1}{\fpeval{(\cnpT+1)/2}}}\do{% + \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\xintifboolexpr{\dnpT=\fpeval{#1/\dnpT}}{}{\num{\fpeval{#1/\dnpT}}}\\ + } + \end{tabular}% + \else% + \begin{tabular}{c|c} + 1&\num{#1}\\ + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\cnpT/2}}}\do{% + \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\num{\fpeval{#1/\dnpT}}\\ + } + \end{tabular}% + \fi% +}% + +\newcommand\DiviseurNumero[2]{% + % #1 nb entier \`a tester + % #2 no du diviseur (\`a part 1 et #1) + \anpT=#1% + \bnpT=2\relax% + %On compte les diviseurs propres. + \cnpT=0\relax% + \whiledo{\bnpT<\anpT}{% + \modulo{\the\anpT}{\the\bnpT}{}% + \ifnum\remainder=0% + \cnpT=\numexpr\cnpT+1% + \ifnum\cnpT=\numexpr#2-1% + \dnpT=\bnpT% + \bnpT=\anpT% + \fi% + \fi% + \bnpT=\numexpr\bnpT+1% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDefiTables.tex b/macros/latex/contrib/profcollege/latex/PfCDefiTables.tex new file mode 100644 index 0000000000..279b7a4ad7 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDefiTables.tex @@ -0,0 +1,211 @@ +%%% +% Defi Table +%%% + +\setKVdefault[DefiTable]{Solution=false,Math=false,LargeurT=5mm,Graines=false,Creation=false} +\defKV[DefiTable]{Graine=\setKV[DefiTable]{Graines}}% + +\newcommand\MelangeListeNew[2]{% + % #1 Liste à mélanger + % #2 Nombre d'éléments à conserver + \setsepchar[*]{/}\ignoreemptyitems% + \readlist*\ListeInter{#1}% + \xdef\faa{}% Liste construite + \xdef\fii{}% Liste détruite + % on crée les #2 premieres solutions. + \xintFor* ##1 in {\xintSeq{1}{#2}}\do{% + \xintifboolexpr{\ListeInterlen>1}{% + \xdef\Alea{\fpeval{randint(\ListeInterlen)}}% + \xdef\faa{\faa \ListeInter[\Alea]/}% + \xdef\fii{}% + \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{% + \xintifboolexpr{##2 == \Alea}{% + }{% + \xdef\fii{\fii \ListeInter[##2]/}% + }% + }% + }{% + \xdef\faa{\faa \ListeInter[1]}% + }% + \readlist*\ListeInter{\fii}% + }% + \reademptyitems% +}% + +\newcommand\DefiTableNombreLettreduCode[1]{% + \xdef\ListeDesCaracteresFoo{a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/à/é/è/ê/ï/î/ô/ö/ù/ç/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/À/É/È/,/$?$/$;$/./$!$/$:$/-} + \savecomparemode% + \comparestrict% + \xdef\PfCFooDepart{} + \StrLen{#1}[\LongueurMot]% + \xintFor* ##1 in{\xintSeq{1}{\LongueurMot}}\do{% + \StrChar{#1}{##1}[\LettreMot] + \xdef\PfCFooDepart{\PfCFooDepart \LettreMot/} + }% + \setsepchar[*]{/}\reademptyitems% + \readlist*\ListeDesLettres{\PfCFooDepart}% + \xdef\PfCFooArrivee{\ListeDesLettres[1]}% + \xintFor* ##1 in{\xintSeq{2}{\LongueurMot}}\do{% + \StrCompare{\ListeDesLettres[##1]}{\\}[\PfCRetiensEtoile] + \StrCompare{\ListeDesLettres[##1]}{ }[\PfCRetiensPara] + \xintifboolexpr{\PfCRetiensEtoile==0 || \PfCRetiensPara==0}{}{% + \xdef\PfCTotal{0}% + \xintFor* ##2 in{\xintSeq{1}{\fpeval{##1-1}}}\do{% + \StrCompare{\ListeDesLettres[##1]}{\ListeDesLettres[##2]}[\PfCRetiens] + \xdef\PfCTotal{\fpeval{\PfCTotal+\PfCRetiens}}% + }% + \xintifboolexpr{\PfCTotal==\fpeval{##1-1}}{\xdef\PfCFooArrivee{\PfCFooArrivee/\ListeDesLettres[##1]}}{}% + }% + }% + %Arrivee = \PfCFooArrivee\par + \setsepchar[*]{/}\ignoreemptyitems% + \readlist*\ListeDesLettresUniques{\PfCFooArrivee}% + %La liste des lettres uniques ainsi créée :\par + %\showitems\ListeDesLettresUniques[]% + % Il faut retirer les lettres uniques de la liste des caracteres + \readlist*\ListeTotaleDesCaracteres{\ListeDesCaracteresFoo}% + %\par + %La liste totale des caractères est :\par + %\showitems\ListeTotaleDesCaracteres[] + %\par + \xdef\ListeCaracteresUniques{}% + \xintFor* ##1 in{\xintSeq{1}{\ListeTotaleDesCaractereslen}}\do{% + %Le caractère testé est \ListeTotaleDesCaracteres[##1]. On le compare à :% + \xdef\PfCTotal{0}% + \xintFor* ##2 in{\xintSeq{1}{\ListeDesLettresUniqueslen}}\do{% + \StrCompare{\ListeTotaleDesCaracteres[##1]}{\ListeDesLettresUniques[##2]}[\PfCRetiens] + \xdef\PfCTotal{\fpeval{\PfCTotal+\PfCRetiens}}% + }% + \xintifboolexpr{\PfCTotal==\ListeDesLettresUniqueslen}{\xdef\ListeCaracteresUniques{\ListeCaracteresUniques\ListeTotaleDesCaracteres[##1]/}}{}% + }% + %La liste des caractères uniques à ajouter + \MelangeListeNew{\ListeCaracteresUniques}{\fpeval{42-\ListeDesLettresUniqueslen}}% + %\par La liste des éléments à mélanger est :\par + \xdef\ListeDesCaracteresAUtiliser{} + \xintFor* ##1 in{\xintSeq{1}{\ListeDesLettresUniqueslen}}\do{% + \xdef\ListeDesCaracteresAUtiliser{\ListeDesCaracteresAUtiliser \ListeDesLettresUniques[##1]/}% + }% + \xdef\ListeDesCaracteresAUtiliser{\ListeDesCaracteresAUtiliser \faa} + \MelangeListeNew{\ListeDesCaracteresAUtiliser}{42} + %Finalement, on utilise ces caractères :\par + \ignoreemptyitems% + \readlist*\ListeFinaleDesCaracteres{\faa} + \xdef\ListeDesProduitsFoo{1/2/3/4/5/6/7/8/9/10/12/14/16/18/20/15/21/24/27/30/28/32/36/40/25/35/45/50/42/48/54/60/49/56/63/70/64/72/80/81/90/100} + \MelangeListeNew{\ListeDesProduitsFoo}{42} + %Les produits mélangés sont :\par + \readlist*\ListeDesProduits{\faa}% + \restorecomparemode + \reademptyitems +} + +\newcommand\DefiTable[2][]{% + % 1 les clés + % 2 la table de décodage + \useKVdefault[DefiTable]% + \setKV[DefiTable]{#1}% + \ifboolKV[DefiTable]{Creation}{ + \ifboolKV[DefiTable]{Graines}{\PfCGraineAlea{\useKV[DefiTable]{Graine}}}{}% + \DefiTableNombreLettreduCode{#2} + \begin{center} + \begin{tabular}{|>{\columncolor{gray!15}}c|*{10}{c|}} + \hline + \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{% + \xintifForFirst{}{&}##1% + }\\\hline% + \xintFor* ##1 in{\xintSeq{1}{10}}\do{% + ##1\xintFor* ##2 in{\xintSeq{1}{10}}\do{% + &\xintFor* ##3 in{\xintSeq{1}{42}}\do{% + \xintifboolexpr{\fpeval{##1*##2}==\ListeDesProduits[##3]}{\ListeFinaleDesCaracteres[##3]}{}% + }% + }\\\hline% + }% + \end{tabular}% + \end{center} + }{% + \setsepchar[*]{§* }% + \readlist*\ListeDefiTableCode{#2}% + \begin{NiceTabular}{>{\columncolor{gray!15}}{c}*{10}{c}}[hvlines] + \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{% + \xintifForFirst{}{&}##1} + \\ + 1\xintFor* ##1 in {\xintSeq {1}{10}}\do{% + &\ListeDefiTableCode[1,##1]% + }\\ + \xintFor* ##1 in {\xintSeq {2}{9}}\do{% + ##1\xintFor* ##2 in {\xintSeq {1}{##1}}\do{% + &\ListeDefiTableCode[##2,\fpeval{##1-##2+1}]% + }\xintFor* ##2 in {\xintSeq {1}{\fpeval{10-##1}}}\do{% + &\ListeDefiTableCode[##1,\fpeval{##2+1}]% + }% + \\ + }% + 10&\ListeDefiTableCode[1,10]&\ListeDefiTableCode[2,9]&\ListeDefiTableCode[3,8]&\ListeDefiTableCode[4,7]&\ListeDefiTableCode[5,6]&\ListeDefiTableCode[6,5]&\ListeDefiTableCode[7,4]&\ListeDefiTableCode[8,3]&\ListeDefiTableCode[9,2]&\ListeDefiTableCode[10,1]\\ + \end{NiceTabular}% + }% +}% + +\newcommand\DefiTableTexte[3][]{% + \useKVdefault[DefiTable]% + \setKV[DefiTable]{#1}% + \ifboolKV[DefiTable]{Creation}{% + \setsepchar[*]{\\* }% + \readlist*\ListeDefiTableTableau{#3}% + \xdef\ListeDefiTableMax{0}% + \xintFor* ##1 in{\xintSeq{1}{\ListeDefiTableTableaulen}}\do{% + \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% + \xintifboolexpr{\ListeDefiTableMax<\PfCDTLongueur}{\xdef\ListeDefiTableMax{\fpeval{\PfCDTLongueur}}}{}%% + }% + %\par Le max est \ListeDefiTableMax + \begin{NiceTabular}{*{\fpeval{\ListeDefiTableMax}}{>{\centering\arraybackslash}m{\useKV[DefiTable]{LargeurT}}}} + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeDefiTableTableaulen}}}\do{% + \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% + \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% + \xintifForFirst{}{&}% + \StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}[\DefiTableMaLettre]% + \IfStrEq{\DefiTableMaLettre}{ }{\Block[]{1-1}{}}{\Block[borders={bottom}]{1-1}{\ifboolKV[DefiTable]{Solution}{\StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}}{}}}% + }\\ + \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% + \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% + \xintifForFirst{}{&}% + \StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}[\DefiTableMaLettre]% + \IfStrEq{\DefiTableMaLettre}{*}{}{% + \xintFor* ##3 in{\xintSeq{1}{42}}\do{% + \IfStrEq{\DefiTableMaLettre}{\ListeFinaleDesCaracteres[##3]}{\Block{}{\footnotesize\ListeDesProduits[##3]}}{}% + }% + }% + }\\ + \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% + \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% + \xintifForFirst{}{&} + }\\ + }% + \end{NiceTabular}% + }{% + \setsepchar[*]{§*/}% + \readlist*\ListeDefiTableTableau{#2}% + \xdef\ListeDefiTableMax{0}% + \setsepchar{§}% + \readlist*\ListeDefiTablePhrase{#3}% + \foreachitem\compteur\in\ListeDefiTableTableau{% + \xintifboolexpr{\ListeDefiTableMax<\listlen\ListeDefiTableTableau[\compteurcnt]}{\xdef\ListeDefiTableMax{\fpeval{\listlen\ListeDefiTableTableau[\compteurcnt]}}}{}% + }% + \begin{NiceTabular}{*{\fpeval{\ListeDefiTableMax}}{>{\centering\arraybackslash}m{\useKV[DefiTable]{LargeurT}}}} + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeDefiTableTableaulen}}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% + \xintifForFirst{}{&}\ifboolKV[DefiTable]{Solution}{% + \StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}[\DefiTableMaLettre]% + \IfStrEq{\DefiTableMaLettre}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{\StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}}}% + }{% + \IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{}}% + }%% + }\\ + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% + \xintifForFirst{}{&} + }\\ + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% + \xintifForFirst{}{&}\IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[DefiTable]{Math}{\ListeDefiTableTableau[##1,##2]}{\num{\ListeDefiTableTableau[##1,##2]}}}% + }\\ + }% + \end{NiceTabular}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex b/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex new file mode 100644 index 0000000000..682572bfc1 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDessinGradue.tex @@ -0,0 +1,316 @@ +%%% +% Dessin Gradue +%%% +\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false,DemiDroites=false,OrigineVariable=false,Code=false} +\defKV[DessinGradue]{Traces=\setKV[DessinGradue]{Code}}% + +\def\TraceDessinGradueComplet#1#2#3{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + % Paramètres + LongueurLigne=\useKV[DessinGradue]{Longueur}; + EcartVertical=\useKV[DessinGradue]{EcartVertical}; + Pas:=\useKV[DessinGradue]{Pas}; + NbLignes=\useKV[DessinGradue]{Lignes}; + Echelle=\useKV[DessinGradue]{Echelle}; + Debut:=\useKV[DessinGradue]{Debut}; + Fin:=\useKV[DessinGradue]{Fin}; + + boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code; + Solution=\useKV[DessinGradue]{Solution}; + LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques}; + OrigineVariable:=\useKV[DessinGradue]{OrigineVariable}; + Droites=\useKV[DessinGradue]{Droites}; + DemiDroites=\useKV[DessinGradue]{DemiDroites}; + Code=\useKV[DessinGradue]{Code}; + + pair La,Lb,Lab[]; + pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; + + La=(0,0); + Lb-La=u*(\useKV[DessinGradue]{Longueur},0); + + % On définit une fonction pour tracer les lignes en fonction du pas "Partage" + vardef TraceLignes(expr Partage)= + save RecupLigne; + picture RecupLigne; + RecupLigne=image( + if \useKV[DessinGradue]{Droites}: + drawarrow 1.05[Lb,La]--1.05[La,Lb]; + elseif \useKV[DessinGradue]{DemiDroites}: + drawarrow La--1.05[La,Lb]; + else: + trace segment(La,Lb); + fi; + for kl=0 upto Partage: + Lab[kl]:=(kl/Partage)[La,Lb]; + trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1)); + endfor; + ); + RecupLigne + enddef; + + % On définit une fonction pour nommer les points nécessaires. + vardef DefinirPoints(text t)= + numeric nblignes,nbpas; + n:=0; + for p_=t: + n:=n+1; + if (n mod 3)=1: + nblignes:=p_; + elseif (n mod 3)=2: + nbpas:=p_; + elseif (n mod 3)=0: + p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical))); + fi; + endfor; + enddef; + + % On détermine le nombre de lignes et les origines particulières + pair OrigA[],OrigB[]; + if LignesIdentiques: + for k=1 upto NbLignes: + TotalPas[k]:=Pas; + OrigA[k]=(Debut,0); + OrigB[k]=(Fin,TotalPas[k]); + endfor; + else: + if OrigineVariable: + n:=0; + for p_=#1: + n:=n+1; + OrigA[n]:=p_; + TotalPas[n]:=Pas; + endfor; + NbLignes:=n/2; + else: + n:=0; + for p_=#1: + n:=n+1; + TotalPas[n]=bluepart(p_); + OrigA[n]=(redpart(p_),0); + OrigB[n]=(greenpart(p_),TotalPas[n]); + endfor; + NbLignes:=n; + fi; + fi; + + picture EnsembleLignes; + + DefinirPoints(#2); + + EnsembleLignes=image( + if Solution: + drawoptions(withcolor 0.5white); + fi; + % On trace les lignes et on labelise le numéro de la ligne. + for k=0 upto NbLignes-1: + trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical)); + if Droites: + label.lft(TEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical))); + else: + label.lft(TEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical))); + fi; + endfor; + % On labelise les origines + labeloffset:=labeloffset*1.5; + for k=0 upto NbLignes-1: + if OrigineVariable: + label.top(TEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); + label.top(TEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); + else: + label.top(TEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical)); + label.top(TEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical)); + fi; + endfor; + drawoptions(); + labeloffset:=labeloffset/1.5; + + % On trace la solution + if Solution: + for p_=#3: + trace p_ withpen pencircle scaled 1.5; + endfor; + fi; + % On ajoute des tracés si nécessaire + if Code: + \useKV[DessinGradue]{Traces}; + fi; + ); + trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + LongueurLigne=\useKV[DessinGradue]{Longueur}; + EcartVertical=\useKV[DessinGradue]{EcartVertical}; + Pas:=\useKV[DessinGradue]{Pas}; + NbLignes=\useKV[DessinGradue]{Lignes}; + Echelle=\useKV[DessinGradue]{Echelle}; + Debut:=\useKV[DessinGradue]{Debut}; + Fin:=\useKV[DessinGradue]{Fin}; + boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code; + Solution=\useKV[DessinGradue]{Solution}; + LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques}; + OrigineVariable:=\useKV[DessinGradue]{OrigineVariable}; + Droites=\useKV[DessinGradue]{Droites}; + DemiDroites=\useKV[DessinGradue]{DemiDroites}; + Code=\useKV[DessinGradue]{Code}; + vardef EffectuerLesTraces= + if Code: + \useKV[DessinGradue]{Traces}; + fi; + enddef; + }] + pair La,Lb,Lab[]; + pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; + + La=(0,0); + Lb-La=u*(\useKV[DessinGradue]{Longueur},0); + + % On définit une fonction pour tracer les lignes en fonction du pas "Partage" + vardef TraceLignes(expr Partage)= + save RecupLigne; + picture RecupLigne; + RecupLigne=image( + if \useKV[DessinGradue]{Droites}: + drawarrow 1.05[Lb,La]--1.05[La,Lb]; + elseif \useKV[DessinGradue]{DemiDroites}: + drawarrow La--1.05[La,Lb]; + else: + trace segment(La,Lb); + fi; + for kl=0 upto Partage: + Lab[kl]:=(kl/Partage)[La,Lb]; + trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1)); + endfor; + ); + RecupLigne + enddef; + + % On définit une fonction pour nommer les points nécessaires. + vardef DefinirPoints(text t)= + numeric nblignes,nbpas; + n:=0; + for p_=t: + n:=n+1; + if (n mod 3)=1: + nblignes:=p_; + elseif (n mod 3)=2: + nbpas:=p_; + elseif (n mod 3)=0: + p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical))); + fi; + endfor; + enddef; + + % On détermine le nombre de lignes et les origines particulières + pair OrigA[],OrigB[]; + if LignesIdentiques: + for k=1 upto NbLignes: + TotalPas[k]:=Pas; + OrigA[k]=(Debut,0); + OrigB[k]=(Fin,TotalPas[k]); + endfor; + else: + if OrigineVariable: + n:=0; + for p_=#1: + n:=n+1; + OrigA[n]:=p_; + TotalPas[n]:=Pas; + endfor; + NbLignes:=n/2; + else: + n:=0; + for p_=#1: + n:=n+1; + TotalPas[n]=bluepart(p_); + OrigA[n]=(redpart(p_),0); + OrigB[n]=(greenpart(p_),TotalPas[n]); + endfor; + NbLignes:=n; + fi; + fi; + + picture EnsembleLignes; + + DefinirPoints(#2); + + EnsembleLignes=image( + if Solution: + drawoptions(withcolor 0.5white); + fi; + % On trace les lignes et on labelise le numéro de la ligne. + for k=0 upto NbLignes-1: + trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical)); + if Droites: + label.lft(LATEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical))); + else: + label.lft(LATEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical))); + fi; + endfor; + % On labelise les origines + labeloffset:=labeloffset*1.5; + for k=0 upto NbLignes-1: + if OrigineVariable: + label.top(LATEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); + label.top(LATEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); + else: + label.top(LATEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical)); + label.top(LATEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical)); + fi; + endfor; + drawoptions(); + labeloffset:=labeloffset/1.5; + + % On trace la solution + if Solution: + for p_=#3: + trace p_ withpen pencircle scaled 1.5; + endfor; + fi; + % On ajoute des tracés si nécessaire + if Code: + EffectuerLesTraces; + fi; + ); + trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; + \end{mpost} + \fi +}% + +\def\UpdateLignes#1/#2/#3\nil{\addtotok\toklisteptsgrad{#1,#3,#2,}}% +\def\UpdateTraces#1\nil{\addtotok\toklistetracesgrad{#1,}}% +\def\UpdateDefLignes#1/#2/#3\nil{\addtotok\toklistedefligne{(#1,#2,#3),}}% + +\newcommand\DessinGradue[4][]{% + \useKVdefault[DessinGradue]% + \setKV[DessinGradue]{#1}% + \newtoks\toklisteptsgrad% + \newtoks\toklistetracesgrad% + % On retiens les données pour la solution + \setsepchar[*]{,*/}% + \readlist\ListePG{#3}% + \setsepchar[*]{§*/}% + \readlist\ListeTraces{#4}% + \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% + \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% + \ifboolKV[DessinGradue]{LignesIdentiques}{% + \TraceDessinGradueComplet{}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% + }{% + \setsepchar[*]{,*/}% + \readlist\ListeDefLigne{#2}% + \xdef\toklistedefligne{}% + \ifboolKV[DessinGradue]{OrigineVariable}{% + \foreachitem\compteur\in\ListeDefLigne{% + \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2]),(\ListeDefLigne[\compteurcnt,3],\ListeDefLigne[\compteurcnt,4]),}% + }% + }{% + \foreachitem\compteur\in\ListeDefLigne{% + \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2],\ListeDefLigne[\compteurcnt,3]),}% + }% + }% + \TraceDessinGradueComplet{\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDessinerRatio.tex b/macros/latex/contrib/profcollege/latex/PfCDessinerRatio.tex new file mode 100644 index 0000000000..29207b0373 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDessinerRatio.tex @@ -0,0 +1,374 @@ +%%% +% Lien : ratio +%%% +\setKVdefault[ClesRatio]{FigureCours=false,Figure=false,Longueur=5cm,TexteTotal=quantit\'e,TextePart=part,Tableau=false,GrandeurA=Grandeur A,GrandeurB=Part(s),Largeur=1cm,Stretch=1,Nom=false,CouleurUn=gris,CouleurDeux=0.5gris+0.5blanc,CouleurTrois=white,CouleurTab=gray!15} + +\newcommand\MPTest[9][]{% + % #2 : Longueur de la barre unit\'e + % #3 : premier nombre + % #4 : deuxi\`eme nombre + % #5 : troisi\`eme nombre + % #6 : ne sert à rien. Laissé en attente. + % #7 \`a #9: Couleurs de remplissage + \ifluatex + \mplibforcehmode + \begin{mplibcode} + vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio + pair A,B,C,D; + A=u*(1,1); + B-A=(long,0); + C-B=u*(0,0.5); + D-C=A-B; + n:=0;%n pour savoir si le ratio est a:b ou a:b:c + numeric N[];%Pour sauvegarder les \'el\'ements du ratio + for p_=t: + n:=n+1; + N[n]=p_; + endfor; + % on fait la somme totale "du ratio" + somme=0; + somme:=somme for k=1 upto n:+N[k] endfor; + %Figure(0,0,long+2u,3u); + remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) + withcolor #7; + remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) + withcolor #8; + if n>2: + remplis + polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) + withcolor #8; + remplis + polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) + withcolor #9; + fi; + drawoptions(withpen pencircle scaled1.5bp); + draw polygone(A,B,C,D); + for k=1 upto somme-1: + draw segment((k/somme)[A,B],(k/somme)[D,C]); + endfor; + drawoptions(); + % accolades + labeloffset:=labeloffset/2; + label.top(TEX("\footnotesize$\overbrace{\hbox + to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C)); + labeloffset:=labeloffset*2; + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + enddef; + RatioTrois(#2)(#3,#4,#5); + %etiquettage + labeloffset:=labeloffset*3; + label.top(btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C)); + if #3>1: + label.bot(btex #3~\useKV[ClesRatio]{TextePart}s + etex,iso(A,(N[1]/somme)[A,B])); + else: + label.bot(btex #3~\useKV[ClesRatio]{TextePart} etex,iso(A,(N[1]/somme)[A,B])); + fi; + if #4>1: + label.bot(btex #4~\useKV[ClesRatio]{TextePart}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + else: + label.bot(btex #4~\useKV[ClesRatio]{TextePart} + etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + fi; + if n>2: + if #5>1: + label.bot(btex #5~\useKV[ClesRatio]{TextePart}s etex,iso(B,((N[1]+N[2])/somme)[A,B])); + else: + label.bot(btex #5~\useKV[ClesRatio]{TextePart} etex,iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + fi; + \end{mplibcode} + \else + \mpxcommands{% + \usepackage{ProfCollege} + \setKVdefault[ClesRatio]{TexteTotal=quantit\'e,TextePart=part} + \setKV[ClesRatio]{#1} + } + \begin{mpost} + vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio + pair A,B,C,D; + A=u*(1,1); + B-A=(long,0); + C-B=u*(0,0.5); + D-C=A-B; + n:=0;%n pour savoir si le ratio est a:b ou a:b:c + numeric N[];%Pour sauvegarder les \'el\'ements du ratio + for p_=t: + n:=n+1; + N[n]=p_; + endfor; + % on fait la somme totale "du ratio" + somme=0; + somme:=somme for k=1 upto n:+N[k] endfor; + Figure(0,0,long+2u,3u); + remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) + withcolor #7; + remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) + withcolor #8; + if n>2: + remplis + polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) + withcolor #8; + remplis + polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) + withcolor #9; + fi; + drawoptions(withpen pencircle scaled1.5bp); + draw polygone(A,B,C,D); + for k=1 upto somme-1: + draw segment((k/somme)[A,B],(k/somme)[D,C]); + endfor; + drawoptions(); + %accolades + label.top(LATEX("\noexpand\footnotesize$\noexpand\overbrace{\noexpand\hbox + to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C)); + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + enddef; + RatioTrois(#2)(#3,#4,#5); + %etiquettage + labeloffset:=labeloffset*3; + label.top(\btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C)); + if #3>1: + label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(A,(N[1]/somme)[A,B])); + else: + label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(A,(N[1]/somme)[A,B])); + fi; + if #4>1: + label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + else: + label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + fi; + if n>2: + if #5>1: + label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(B,((N[1]+N[2])/somme)[A,B])); + else: + label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + fi; + \end{mpost} + \fi +}% + +\newcommand\MPTestCours[9][]{% + % #2 : Longueur de la barre unit\'e + % #3 : premier nombre + % #4 : deuxi\`eme nombre + % #5 : troisi\`eme nombre + % #6 : Valeurs du ratio + % #7 \`a #9: Couleurs de remplissage + \ifluatex + \mplibforcehmode + \begin{mplibcode} + vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio + pair A,B,C,D; + A=u*(1,1); + B-A=(long,0); + C-B=u*(0,0.5); + D-C=A-B; + n:=0;%n pour savoir si le ratio est a:b ou a:b:c + numeric N[];%Pour sauvegarder les \'el\'ements du ratio + for p_=t: + n:=n+1; + N[n]=p_; + endfor; + % on fait la somme totale "du ratio" + somme=0; + somme:=somme for k=1 upto n:+N[k] endfor; + %%Figure(0,0,long+2u,3u); + remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) + withcolor #7; + remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) + withcolor #8; + if n>2: + remplis + polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) + withcolor #8; + remplis + polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) + withcolor #9; + fi; + drawoptions(withpen pencircle scaled1.5bp); + draw polygone(A,B,C,D); + for k=1 upto somme-1: + draw segment((k/somme)[A,B],(k/somme)[D,C]); + endfor; + drawoptions(); + % accolades + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(TEX("\footnotesize$\underbrace{\hbox + to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + enddef; + RatioTrois(#2)(#3,#4,#5); + %etiquettage + labeloffset:=labeloffset*3; + label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B])); + label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + \end{mplibcode} + \else + \begin{mpost} + vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio + pair A,B,C,D; + A=u*(1,1); + B-A=(long,0); + C-B=u*(0,0.5); + D-C=A-B; + n:=0;%n pour savoir si le ratio est a:b ou a:b:c + numeric N[];%Pour sauvegarder les \'el\'ements du ratio + for p_=t: + n:=n+1; + N[n]=p_; + endfor; + % on fait la somme totale "du ratio" + somme=0; + somme:=somme for k=1 upto n:+N[k] endfor; + %Figure(0,0,long+2u,3u); + remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) + withcolor #7; + remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) + withcolor #8; + if n>2: + remplis + polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) + withcolor #8; + remplis + polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) + withcolor #9; + fi; + drawoptions(withpen pencircle scaled1.5bp); + draw polygone(A,B,C,D); + for k=1 upto somme-1: + draw segment((k/somme)[A,B],(k/somme)[D,C]); + endfor; + drawoptions(); + % accolades + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox + to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + enddef; + RatioTrois(#2)(#3,#4,#5); + %etiquettage + labeloffset:=labeloffset*3; + label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B])); + label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); + if n>2: + label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B])); + fi; + \end{mpost} + \fi +} + +\newtoks\toklisteratio +\def\UpdateRatio#1\nil{\addtotok\toklisteratio{#1,}} + +\def\updateratiotoks#1/#2/#3\nil{\addtotok\tabtoksa{&\ifx\bla#2\bla\else\num{#2}\fi}\addtotok\tabtoksb{&\ifx\bla#3\bla\else\num{#3}\fi}\addtotok\tabtoksc{}} + +\def\buildtabratio{% + \tabtoksa{}\tabtoksb{}\tabtoksc{}% + \tabtoksa{\useKV[ClesRatio]{GrandeurA}}\tabtoksb{\useKV[ClesRatio]{GrandeurB}} + \foreachitem\compteur\in\ListeRatio{\expandafter\updateratiotoks\compteur\nil}% + \xdef\LongListe{\ListeRatiolen}% + \renewcommand{\arraystretch}{\useKV[ClesRatio]{Stretch}}% + \begin{tabular}{|>{\columncolor{\useKV[ClesRatio]{CouleurTab}}}c|*{\number\numexpr\ListeRatiolen}{>{\centering\arraybackslash}p{\useKV[ClesRatio]{Largeur}}|}l} + \ifboolKV[ClesRatio]{Nom}{% + \hhline{~*{\number\numexpr\ListeRatiolen}{-}} + \multicolumn{1}{c|}{}\the\tabtoksc\\ + }{} + \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% + \the\tabtoksa&\setcounter{NbPropor}{1}\TikzRH\\% + \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% + \the\tabtoksb&\setcounter{NbPropor}{1}\TikzRB\\% + \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% + \end{tabular}% +}% + +\newcommand\TikzRH{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporH-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}% + \stepcounter{NbPropor}% + }% + + \newcommand\TikzRB{% + \tikz[remember picture, overlay]{% + \coordinate[name=ProporB-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}% + \stepcounter{NbPropor}% + }% + +\newcommand\FlecheRatio[2][\EcartLargeur]{% + \begin{tikzpicture}[remember picture, overlay]% + \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};% + \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};% + \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);% + \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);% + \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);% +\end{tikzpicture}% +}% + +\newcommand\FlecheInvRatio[2][\EcartLargeur]{% + \begin{tikzpicture}[remember picture, overlay]% + \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};% + \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};% + \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);% + \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);% + \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);% +\end{tikzpicture}% +}% + +\newcommand\Ratio[2][]{% + \useKVdefault[ClesRatio]% + \setKV[ClesRatio]{#1}% + \xdef\EcartLargeur{\useKV[ClesRatio]{Largeur}}% + \ifboolKV[ClesRatio]{FigureCours}{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeRatio{#2}% + \toklisteratio{}% + \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}% + \itemtomacro\ListeRatio[1]\NbUn% + \itemtomacro\ListeRatio[2]\NbDeux% + \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}% + \MPTestCours[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}% + }{% + \ifboolKV[ClesRatio]{Figure}{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeRatio{#2}% + \toklisteratio{}% + \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}% + \itemtomacro\ListeRatio[1]\NbUn% + \itemtomacro\ListeRatio[2]\NbDeux% + \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}% + \MPTest[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}% + }{% + \ifboolKV[ClesRatio]{Tableau}{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeRatio{#2}% + \buildtabratio% + }{}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDiagrammeRadar.tex b/macros/latex/contrib/profcollege/latex/PfCDiagrammeRadar.tex new file mode 100644 index 0000000000..cbed30414d --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDiagrammeRadar.tex @@ -0,0 +1,158 @@ +%%% +% Radar +%%% +\setKVdefault[ClesRadar]{Rayon=3cm,Reference=20,MoyenneClasse=false,Disciplines=false,Pas=5} + +\newtoks\toklisteradara%pour la moyenne de l'\'el\`eve +\newtoks\toklisteradarb%pour la discipline +\newtoks\toklisteradarc%pour la moyenne de classe + +\def\UpdateRadara#1/#2/#3\nil{\addtotok\toklisteradara{#1,}} +\def\UpdateRadarb#1/#2/#3\nil{\addtotok\toklisteradarb{"#2",}} +\def\UpdateRadarc#1/#2/#3\nil{\addtotok\toklisteradarc{#3,}} + +\newcommand\MPRadar[6]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair O; + O=(0,0); + path cc; + cc=cercles(O,#1); + %%etiquettage des disciplines + n:=0;%compter le nombre de disciplines + for p_=#2: + n:=n+1; + endfor; + for k=1 upto n: + N[k]=k*(360/n); + trace segment(O,pointarc(cc,N[k]));% dashed evenly; + endfor; + p:=0; + for p_=#2: + p:=p+1; + if (N[p]<90) or (N[p]=90): + label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if ((N[p]>90) and (N[p]<180)) or (N[p]=180): + label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if (N[p]>180) and (N[p]<270): + label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if (N[p]>270) or (N[p]=270): + label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + endfor; + % trac\'e des pas: + pas=#4/#3; + for k=1 upto pas-1: + trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor + --cycle dashed evenly withcolor 0.5white; + endfor; + trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor + --cycle; + % etiquettage des pas + dotlabel.urt(TEX("\tiny"&decimal(#4)),pointarc(cc,0)); + dotlabel.urt(TEX("\tiny"&decimal(#3)),(1/pas)[O,pointarc(cc,0)]); + % trac\'e des r\'esultats \'el\`eves + pair El[]; + el=0; + for p_=#5: + el:=el+1; + El[el]=(p_/#4)[O,pointarc(cc,N[el])]; + endfor; + trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen + pencircle scaled 1.5 withcolor blue; + % trac\'e des r\'esultats classe + pair Cl[]; + cl=0; + for p_=#6: + cl:=cl+1; + Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])]; + endfor; + trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge; + \end{mplibcode} + \else + \begin{mpost} + pair O; + O=(0,0); + path cc; + cc=cercles(O,#1); + %%etiquettage des disciplines + n:=0;%compter le nombre de disciplines + for p_=#2: + n:=n+1; + endfor; + for k=1 upto n: + N[k]=k*(360/n); + trace segment(O,pointarc(cc,N[k]));% dashed evenly; + endfor; + p:=0; + for p_=#2: + p:=p+1; + if (N[p]<90) or (N[p]=90): + label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if ((N[p]>90) and (N[p]<180)) or (N[p]=180): + label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if (N[p]>180) and (N[p]<270): + label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + if (N[p]>270) or (N[p]=270): + label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]); + fi; + endfor; + % trac\'e des pas: + pas=#4/#3; + for k=1 upto pas-1: + trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor + --cycle dashed evenly withcolor 0.5white; + endfor; + trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor + --cycle; + % etiquettage des pas + dotlabel.top(LATEX("\noexpand\tiny"&decimal(#4)&"") rotated -90,pointarc(cc,0)); + dotlabel.urt(LATEX("\noexpand\tiny"&decimal(#3)&""),(1/pas)[O,pointarc(cc,0)]); + % trac\'e des r\'esultats \'el\`eves + pair El[]; + el=0; + for p_=#5: + el:=el+1; + El[el]=(p_/#4)[O,pointarc(cc,N[el])]; + endfor; + trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen + pencircle scaled 1.5 withcolor blue; + % trac\'e des r\'esultats classe + pair Cl[]; + cl=0; + for p_=#6: + cl:=cl+1; + Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])]; + endfor; + trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge; + \end{mpost} + \fi +} + +\newcommand\Radar[2][]{% + % 1 les param\`etres + % 2 la r\'epartition des notes + \useKVdefault[ClesRadar]% + \setKV[ClesRadar]{#1}% + \ignoreemptyitems% + \setsepchar[*]{,}% + \readlist*\ListeRadar{#2}% + \toklisteradara{}% + \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadara\compteur\nil}% + \ifboolKV[ClesRadar]{Disciplines}{}{% + \toklisteradarb{}% + \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarb\compteur\nil}% + }% + \ifboolKV[ClesRadar]{MoyenneClasse}{}{% + \toklisteradarc{}% + \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarc\compteur\nil}% + }% + \MPRadar{\useKV[ClesRadar]{Rayon}}{\the\toklisteradarb}{\useKV[ClesRadar]{Pas}}{\useKV[ClesRadar]{Reference}}{\the\toklisteradara}{\the\toklisteradarc}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDistributivite.tex b/macros/latex/contrib/profcollege/latex/PfCDistributivite.tex new file mode 100644 index 0000000000..a9c103ac85 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDistributivite.tex @@ -0,0 +1,1092 @@ +%%% +% Distributivit\'e +%%% +% https://tex.stackexchange.com/questions/168972/draw-arrows-to-show-multiplication-pattern-distributive-property/169278?noredirect=1 +\newcommand\Tikzmark[1]{% + \tikz[remember picture,baseline,inner sep=0pt]{% + \node[name=Distri-\theNbDistri,anchor=base] {${#1}$};}% + \stepcounter{NbDistri}% +}% + +\newcommand\DrawArrow{% + \begin{tikzpicture}[overlay,remember picture] + \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-2.north); + \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-3.north); + \draw[-stealth,out=-50,in=-140,DCFlechesb,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-2.south); + \draw[-stealth,out=-50,in=-140,DCFlechesb!50,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-3.south); + \end{tikzpicture} +} + +\newcommand\DrawArrowSimple[1]{% + \begin{tikzpicture}[overlay,remember picture] + \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-2.north); + \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-3.north); + \end{tikzpicture} +} + +\newcommand\DrawArrowSimpleRenverse[1]{% + \begin{tikzpicture}[overlay,remember picture] + \draw[-stealth,out=140,in=50,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-0.north); + \draw[-stealth,out=140,in=50,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-1.north); + \end{tikzpicture} +} + +\newcounter{NbDistri}% +\setcounter{NbDistri}{0}% + +\newcounter{NbCalculDistri}%Pour compter combien de distributivit\'e il +% y a dans un "seul calcul". +\setcounter{NbCalculDistri}{0} + +\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Reperes=false,Impression=false,Tableau=false}%,AideAdd=false:inutile ? + +\newcommand\Tuile[4]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Vide,Reperes,Print; + Vide=\useKV[ClesDistributivite]{Vide}; + Reperes=\useKV[ClesDistributivite]{Reperes}; + Print=\useKV[ClesDistributivite]{Impression}; + pair _CoinTuilev; + _CoinTuilev=(0,0); + numeric largeur,longueur,ecart; + largeur=0.75; + longueur=sqrt(3); + ecart=0.6; + pair _CoinTuileh; + _CoinTuileh=u*(largeur+ecart,ecart); + vardef tuilev(expr LL,ll,nb,col)(text t)= + save $; picture $; + save TT; picture TT; + TT=image( + path cc; + cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)); + if Print=false: + fill cc withcolor col; + fi; + trace cc; + label(TEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll))); + ); + $=image( + for k=0 upto nb-1: + trace TT shifted(_CoinTuilev+k*u*(0,-ll)); + endfor; + _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll)); + ); + $ + enddef; + vardef tuileh(expr LL,ll,nb,col)(text t)= + save $; picture $; + picture TT; + TT=image( + path cc; + cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)); + if Print=false: + fill cc withcolor col; + fi; + trace cc; + label(TEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll))); + ); + $=image( + for k=0 upto nb-1: + trace TT shifted(_CoinTuileh+k*u*(LL,0)); + endfor; + _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0)); + ); + $ + enddef; + color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg; + ColorLetter=LightGreen; + ColorLetterPos=ColorLetter; + ColorLetterNeg=Tomato; + ColorNum=Orange; + ColorNumPos=ColorNum; + ColorNumNeg=Tomato; + ColorCarrePos:=LightBlue; + ColorCarreNeg:=Tomato; + if #1<0: + ColorLetter:=Tomato; + trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$"); + else: + ColorLetter:=LightGreen; + trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$"); + fi; + if #2<0: + ColorNum:=Tomato; + trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$"); + else: + ColorNum:=Orange; + trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$"); + fi; + if #3<0: + ColorLetter:=Tomato; + trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$"); + else: + ColorLetter:=LightGreen; + trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$"); + fi; + if #4<0: + ColorNum:=Tomato; + trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$"); + else: + ColorNum:=Orange; + trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$"); + fi; + trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2; + trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2; + drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2; + labeloffset:=labeloffset*2; + label.ulft(TEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart))); + labeloffset:=labeloffset/2; + if Vide: + if Reperes: + %%%% + %% tuile a*c + if #1*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); + trace titi withcolor 0.6white; + endfor; + endfor; + fi; + %tuile a*d + if #1*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); + trace titi withcolor 0.6white; + endfor; + endfor; + fi; + %tuile b*c + if #2*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); + trace titi withcolor 0.6white; + endfor; + endfor; + fi; + %tuile b*d + if #2*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); + trace titi withcolor 0.6white; + endfor; + endfor; + fi; + fi; + %%% + else: + %% tuile a*c + if #1*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); + if Print=false: + fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi; + fi; + trace titi; + if #1*#3>0: + label(TEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); + else: + label(TEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); + fi; + endfor; + endfor; + fi; + %tuile a*d + if #1*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); + if Print=false: + fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi; + fi; + trace titi; + if #1*#4>0: + label(TEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); + else: + label(TEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); + fi; + endfor; + endfor; + fi; + %tuile b*c + if #2*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); + if Print=false: + fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi; + fi; + trace titi; + if #2*#3>0: + label(TEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); + else: + label(TEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); + fi; + endfor; + endfor; + fi; + %tuile b*d + if #2*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); + if Print=false: + fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi; + fi; + trace titi; + if #2*#4>0: + label(TEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); + else: + label(TEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); + fi; + endfor; + endfor; + fi; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean Vide,Print; Vide=\useKV[ClesDistributivite]{Vide}; Print=\useKV[ClesDistributivite]{Impression};}] + pair _CoinTuilev; + _CoinTuilev=(0,0); + numeric largeur,longueur,ecart; + largeur=0.75; + longueur=sqrt(3); + ecart=0.6; + pair _CoinTuileh; + _CoinTuileh=u*(largeur+ecart,ecart); + vardef tuilev(expr LL,ll,nb,col)(text t)= + save $; picture $; + save TT; picture TT; + TT=image( + path cc; + cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)); + if Print=false: + fill cc withcolor col; + fi; + trace cc; + label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll))); + ); + $=image( + for k=0 upto nb-1: + trace TT shifted(_CoinTuilev+k*u*(0,-ll)); + endfor; + _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll)); + ); + $ + enddef; + vardef tuileh(expr LL,ll,nb,col)(text t)= + save $; picture $; + picture TT; + TT=image( + path cc; + cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)); + if Print=false: + fill cc withcolor col; + fi; + trace cc; + label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll))); + ); + $=image( + for k=0 upto nb-1: + trace TT shifted(_CoinTuileh+k*u*(LL,0)); + endfor; + _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0)); + ); + $ + enddef; + color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg; + ColorLetter=LightGreen; + ColorLetterPos=ColorLetter; + ColorLetterNeg=Tomato; + ColorNum=Orange; + ColorNumPos=ColorNum; + ColorNumNeg=Tomato; + ColorCarrePos:=LightBlue; + ColorCarreNeg:=Tomato; + if #1<0: + ColorLetter:=Tomato; + trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$"); + else: + ColorLetter:=LightGreen; + trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$"); + fi; + if #2<0: + ColorNum:=Tomato; + trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$"); + else: + ColorNum:=Orange; + trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$"); + fi; + if #3<0: + ColorLetter:=Tomato; + trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$"); + else: + ColorLetter:=LightGreen; + trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$"); + fi; + if #4<0: + ColorNum:=Tomato; + trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$"); + else: + ColorNum:=Orange; + trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$"); + fi; + trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2; + trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2; + drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2; + labeloffset:=labeloffset*2; + label.ulft(LATEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart))); + labeloffset:=labeloffset/2; + if Vide=false: + %% tuile a*c + if #1*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); + if Print=false: + fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi; + fi; + trace titi; + if #1*#3>0: + label(LATEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); + else: + label(LATEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); + fi; + endfor; + endfor; + fi; + %tuile a*d + if #1*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#1)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); + if Print=false: + fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi; + fi; + trace titi; + if #1*#4>0: + label(LATEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); + else: + label(LATEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); + fi; + endfor; + endfor; + fi; + %tuile b*c + if #2*#3<>0: + for k=0 upto (abs(#3)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); + if Print=false: + fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi; + fi; + trace titi; + if #2*#3>0: + label(LATEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); + else: + label(LATEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); + fi; + endfor; + endfor; + fi; + %tuile b*d + if #2*#4<>0: + for k=0 upto (abs(#4)-1): + for l=0 upto (abs(#2)-1): + path titi; + titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); + if Print=false: + fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi; + fi; + trace titi; + if #2*#4>0: + label(LATEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); + else: + label(LATEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); + fi; + endfor; + endfor; + fi; + fi; + \end{mpost} + \fi +} + +\newcommand\Affichage[4][]{% + \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels + \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}% + \ensuremath{% + % partie du x^2 + \xintifboolexpr{#2==0}{}{\xintifboolexpr{#2==1}{}{\xintifboolexpr{#2==-1}{-}{\num{#2}}}\LETTRE^2}% + % partie du x + \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{% + \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}}% + }\LETTRE}% + % partie du nombre + \xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{}{+}}{+}\num{#4}}{% + \xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{\num{#4}}{-\num{\fpeval{abs(#4)}}}}{-\num{\fpeval{abs(#4)}}}}}% + % + }% +}% + +\xdef\SommeA{0}% +\xdef\SommeB{0}% +\xdef\SommeC{0}% + +\newcommand\Distri[5][]{% + \useKVdefault[ClesDistributivite]%obligatoire car la macro n'est pas dans un groupe. + \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels + \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}% + \setcounter{NbCalculDistri}{0}% + }{}% + \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}% + \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}% + \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}% + \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}% + \ifboolKV[ClesDistributivite]{Cours}{% + \ensuremath{% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{}{(}}\xintifboolexpr{#2==0}{\Tikzmark{}}{\Tikzmark{a}} + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#3==0}{\Tikzmark{}}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{b}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% + % + \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double + \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk + % + \xintifboolexpr{\Multi==0}{\times% + \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% + \Tikzmark{c}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{d}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{\Multi==0}{% + \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% + % + = + % + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}% + } + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}% + }% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}% + }% + % Fleches + \ifboolKV[ClesDistributivite]{Fleches}{% + \xdef\Multi{\fpeval{#2*#3*#4*#5}}% + \xintifboolexpr{\Multi==0}{% + \xdef\Multij{\fpeval{#2*#3}}%\relax + \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1} + }{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% + }{% + \DrawArrow% + }% + }{}\setcounter{NbDistri}{0}% + }% + }{% + \ifboolKV[ClesDistributivite]{Tuile}{% + \Tuile{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesDistributivite]{Tableau}{% + \DistriTableau[#1]{#2}{#3}{#4}{#5}% + }{% + \ensuremath{% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{% + \DistriEchange[#1]{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesDistributivite]{Remarquable}{% + \ifboolKV[ClesDistributivite]{Numerique}{% + \ifx\bla#4\bla% + \xintifboolexpr{#3>0}{% + \num{\fpeval{#2+#3}}^2=(\num{#2}+\num{#3})^2=\num{#2}^2+2\times\num{#2}\times\num{#3}+\num{#3}^2=\num{\fpeval{#2*#2}}+\num{\fpeval{2*#2*#3}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)**2}} + }{% + \num{\fpeval{#2+#3}}^2=(\num{#2}\num{#3})^2=\num{#2}^2-2\times\num{#2}\times\num{\fpeval{-#3}}+\num{\fpeval{-#3}}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{2*#2*abs(#3)}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2-abs(#3))**2}} + } + \else + \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}=(\num{#2}+\num{#3})\times(\num{#4}\num{#5})=\num{#2}^2-\num{#3}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)*(#2-#3)}} + \fi% + }{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% + \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi% + }{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + \stepcounter{NbCalculDistri}% + \ifx\bla#4\bla% + \xdef\Multi{\fpeval{#2*#2}}% + \xdef\Multij{\fpeval{#2*#3}}% + \xdef\Multik{\fpeval{#3*#2}}% + \xdef\Multil{\fpeval{#3*#3}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#3+#3*#2}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \Affichage{\Multi}{\Multim}{\Multil}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}% + \else% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \Affichage{\Multi}{\Multim}{\Multil}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% + \fi% + }{}% + % fin Remarquable + }% + }{% + \ifboolKV[ClesDistributivite]{Numerique}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{% + \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}% + }{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{% + \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}% + }{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}% + }% + }% + }{% + \ifboolKV[ClesDistributivite]{All}{% + \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% + \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% + \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}% + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do + {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}% + \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}% + }{% + % Etape 1 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% + % + \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double + \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk + % + \xintifboolexpr{\Multi==0}{\times% + \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% + \Tikzmark{\Affichage[#1]{0}{#4}{0}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{\Multi==0}{% + \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% + \ifboolKV[ClesDistributivite]{Fleches}{% + \xdef\Multi{\fpeval{#2*#3*#4*#5}}% + \xintifboolexpr{\Multi==0}{% + \xdef\Multij{\fpeval{#2*#3}}%\relax + \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% + }{% + \DrawArrow% + }% + }{}\setcounter{NbDistri}{0}% + }{} + % Etape 2 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% + } + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% + }% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% + }% + }{}% + % Etape 3 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \stepcounter{NbCalculDistri}% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% + \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% + }% + }{% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% + }% + \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% + }{}% + % Etape 4 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + \stepcounter{NbCalculDistri}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% + \xintifboolexpr{\Multim==0}{}{% + \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + }% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% + }{}% + }% + }% + }% + }% + }% + }% + }% + }% +}% + +\newcommand\DistriTableau[5][]{% + \useKVdefault[ClesDistributivite]% + \setKV[ClesDistributivite]{#1}% + \ensuremath{% + \begin{array}{|>{\columncolor{gray!15}}c|c|c|} + \hline + \rowcolor{gray!15}\times&\Affichage[#1]{0}{#4}{0}&\Affichage[#1]{0}{0}{#5}\\ + \hline + \xintifboolexpr{#2==0}{}{\Affichage[#1]{0}{#2}{0}&\Affichage[#1]{\fpeval{#2*#4}}{0}{0}&\xintifboolexpr{\fpeval{#2*#5}>0}{+}{}\Affichage[#1]{0}{\fpeval{#2*#5}}{0}\\ + \hline}% + \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+}{}\Affichage[#1]{0}{0}{#3}&\xintifboolexpr{\fpeval{#3*#4}>0}{+}{}\Affichage[#1]{0}{\fpeval{#3*#4}}{0}&\xintifboolexpr{\fpeval{#3*#5}>0}{+}{}\Affichage[#1]{0}{0}{\fpeval{#3*#5}}\\ + \hline} + \end{array} + }% +}% + +\newcommand\Resultat[1][]{% + \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels + \ensuremath{% + \Affichage{\SommeA}{\SommeB}{\SommeC} + }% +} + +\newcommand\AffichageEchange[4][]{% + \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels + \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}% + \ensuremath{% + % partie du nombre + \xintifboolexpr{#2==0}{}{\num{#2}}% + % partie du x + \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{% + \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}} + }\LETTRE}% + % partie du x^2 + \xintifboolexpr{#4==0}{}{% + \xintifboolexpr{#4>0}{% + \xintifboolexpr{#2==0}{% + \xintifboolexpr{#3==0}{% + }{+}% + }{+}% + \xintifboolexpr{#4==1}{}{\num{#4}% + }% + }{% + \xintifboolexpr{#2==0}{% + \xintifboolexpr{#3==0}{% + \num{#4}% + }{-\num{\fpeval{abs(#4)% + }% + }% + }% + }{% + \xintifboolexpr{#4==-1}{-}{-\num{\fpeval{abs(#4)}}}}}% + \LETTRE^2}% + }% +}% + +\newcommand\DistriEchange[5][]{% + \ensuremath{% + \useKVdefault[ClesDistributivite]% + \setKV[ClesDistributivite]{#1}% + \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}% + \setcounter{NbCalculDistri}{0}% + }{}% + \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}% + \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}% + \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}% + \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}% + \ifboolKV[ClesDistributivite]{Remarquable}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\ifx\bla#4\bla(\AffichageEchange{#2}{#3}{0})^2\else(\AffichageEchange{#2}{#3}{0})(\AffichageEchange{#4}{#5}{0})\fi + }{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% + \ifx\bla#4\bla\xintifboolexpr{#3>0}{% + \num{#2}^2+2\times\num{#2}\times\xintifboolexpr{#3==1}{}{\num{#3}}\useKV[ClesDistributivite]{Lettre}+ + \xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2% + }{% + \num{#2}^2-2\times\num{#2}\times\xintifboolexpr{#3==-1}{}{\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}+ + \xintifboolexpr{#3==-1}{}{(\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==-1}{}{)}^2% + }% + \else\num{#2}^2-\xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2% + \fi% + }{} + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + \stepcounter{NbCalculDistri}% + \ifx\bla#4\bla% + \xdef\Multi{\fpeval{#2*#2}}% + \xdef\Multij{\fpeval{#2*#3}}% + \xdef\Multik{\fpeval{#3*#2}}% + \xdef\Multil{\fpeval{#3*#3}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#3+#3*#2}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \AffichageEchange{\Multi}{\Multim}{\Multil}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#3}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#2*#2}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#3}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#2*#2}}}{}% + \else% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multi{\fpeval{-\Multi}}% + \xdef\Multim{\fpeval{-\Multim}}% + \xdef\Multil{\fpeval{-\Multil}}% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% + \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% + }{% + \AffichageEchange{\Multi}{\Multim}{\Multil}% + } + % \`a faire + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#5}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#2*#4}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#5}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#2*#4}}}{}% + % + \fi% + }{}% + }{% + \ifboolKV[ClesDistributivite]{Numerique}{% + }{% + \ifboolKV[ClesDistributivite]{All}{% + \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% + \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% + \xdef\ValeurEchange{\useKV[ClesDistributivite]{Echange}} + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do + {\NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=##1]{#2}{#3}{#4}{#5}\\}% + \NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=\NomFin]{#2}{#3}{#4}{#5}% + }{% + % Etape 1 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1||\useKV[ClesDistributivite]{Echange}==3}{% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{% + }{(}}\Tikzmark{\Affichage[#1]{0}{0}{#2}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{\fpeval{abs(#3)}}{0}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{% + }{)}}% + }{ + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{% + }{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% + \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{#2==0}{% + }{\xintifboolexpr{#3==0}{% + }{)}}% + }% + % + \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double + \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk + % + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2||\useKV[ClesDistributivite]{Echange}==3}{% + \xintifboolexpr{\Multi==0}{\times% + \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% + \Tikzmark{\AffichageEchange[#1]{#4}{0}{0}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{-}{}}\Tikzmark{\AffichageEchange[#1]{0}{\fpeval{abs(#5)}}{0}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{\Multi==0}{% + \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% + }{% + \xintifboolexpr{\Multi==0}{\times% + \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% + \Tikzmark{\Affichage[#1]{0}{#4}{0}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% + \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% + \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% + \xintifboolexpr{\Multi==0}{% + \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% + }% + \ifboolKV[ClesDistributivite]{Fleches}{% + \xdef\Multi{\fpeval{#2*#3*#4*#5}}% + \xintifboolexpr{\Multi==0}{% + \xdef\Multij{\fpeval{#2*#3}}%\relax + \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}} + }{% + \DrawArrow + }% + }{}\setcounter{NbDistri}{0}% + }{}% + % Etape 2 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% + }% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% + }% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% + }% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% + }% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xintifboolexpr{\Multi==0}{}{% + \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multij{\fpeval{#2*#5}}% + \xintifboolexpr{\Multij==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% + }% + \xdef\Multik{\fpeval{#3*#4}}% + \xintifboolexpr{\Multik==0}{}{% + \xintifboolexpr{\Multi==0}{}{+}% + \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% + }% + \xdef\Multil{\fpeval{#3*#5}}% + \xintifboolexpr{\Multil==0}{}{+% + \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% + }% + }{} + }{} + % Etape 3 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% + \stepcounter{NbCalculDistri}% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{\Multij}{0}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2=0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{0}{\Multik}\xintifboolexpr{\Multik<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}% + \xdef\Multim{\fpeval{#2*#4+#3*#5}}% + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{0}{\Multij}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{\Multik}{0}{0}\xintifboolexpr{\Multik<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}% + \xdef\Multim{\fpeval{#2*#4+#3*#5}}% + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{\Multi}{0}{0})}{\AffichageEchange{\Multi}{0}{0}}}{\AffichageEchange{\Multi}{0}{0}}% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% + \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}% + }{}% + }{}%fin etape3 + % Etape 4 + \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% + \xdef\Multi{\fpeval{#2*#4}}% + \xdef\Multij{\fpeval{#2*#5}}% + \xdef\Multik{\fpeval{#3*#4}}% + \xdef\Multil{\fpeval{#3*#5}}% + %% ils sont red\'efinis pour pouvoir envisager la somme de deux + %% expressions \`a d\'evelopper + % \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% + %\stepcounter{NbCalculDistri}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% + \xdef\Multim{\fpeval{#2*#4+#3*#5}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multiko{\fpeval{-\Multik}}% + \xdef\Multimo{\fpeval{-\Multim}}% + \xdef\Multijo{\fpeval{-\Multij}}% + \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko<0}{(}{}\Affichage{\Multiko}{0}{0}\xintifboolexpr{\Multiko<0}{)}{}}% + \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% + \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo>0}{+}{+(}\Affichage{0}{0}{\Multijo}\xintifboolexpr{\Multijo<0}{)}{}}% + }{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multik<0}{(\Affichage{\Multik}{0}{0})}{\Affichage{\Multik}{0}{0}}}{\Affichage{\Multik}{0}{0}}% + \xintifboolexpr{\Multim==0}{}{% + \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + }% + \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multij<0}{-\Affichage{0}{0}{\fpeval{-\Multij}}}{+\Affichage{0}{0}{\Multij}}}% + }% + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% + \xdef\Multim{\fpeval{#2*#4+#3*#5}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multijo{\fpeval{-\Multij}}% + \xdef\Multimo{\fpeval{-\Multim}}% + \xdef\Multiko{\fpeval{-\Multik}}% + \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo<0}{(}{}\Affichage{\Multijo}{0}{0}\xintifboolexpr{\Multijo<0}{)}{}}% + \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% + \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko>0}{+}{+(}\Affichage{0}{0}{\Multiko}\xintifboolexpr{\Multiko<0}{)}{}}% + }{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multij<0}{%%%%%%%%%%%%%%%%%%%%% + (\Affichage{\Multij}{0}{0})}{\Affichage{\Multij}{0}{0}}}{\Affichage{\Multij}{0}{0}}% + \xintifboolexpr{\Multim==0}{}{% + \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + }% + \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multik<0}{-\Affichage{0}{0}{\fpeval{-\Multik}}}{+\Affichage{0}{0}{\Multik}}}% + }% + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}% + }{}% + \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% + \xdef\Multim{\fpeval{#2*#5+#3*#4}}% + \ifboolKV[ClesDistributivite]{Oppose}{% + \xdef\Multilo{\fpeval{-\Multil}}% + \xdef\Multimo{\fpeval{-\Multim}}% + \xdef\Multio{\fpeval{-\Multi}}% + \xintifboolexpr{\Multilo==0}{}{\xintifboolexpr{\Multilo<0}{(}{}\Affichage{\Multilo}{0}{0}\xintifboolexpr{\Multilo<0}{)}{}}% + \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% + \xintifboolexpr{\Multio==0}{}{\xintifboolexpr{\Multio>0}{+}{+(}\Affichage{0}{0}{\Multio}\xintifboolexpr{\Multio<0}{)}{}}% + }{% + \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multil<0}{(\Affichage{\Multil}{0}{0})}{\Affichage{\Multil}{0}{0}}}{\Affichage{\Multil}{0}{0}}% + \xintifboolexpr{\Multim==0}{}{% + \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% + }% + \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{-\Affichage{0}{0}{\fpeval{-\Multi}}}{+\Affichage{0}{0}{\Multi}}}% + } + \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}% + \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}% + }{}% + }{}% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCDomino.tex b/macros/latex/contrib/profcollege/latex/PfCDomino.tex new file mode 100644 index 0000000000..e0e8fbd417 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCDomino.tex @@ -0,0 +1,127 @@ +%%% +% Domino +%%% +\newtcolorbox{MyDominoMini}[1][]{% + enhanced, + nobeforeafter, + left skip=0pt, + right skip=0pt, + left=0pt,right=0pt,top=0pt,bottom=0pt, + width=\textwidth/\ColonneDomino, + height=\textheight/\LigneDomino, + segmentation style={solid, line width=1.5pt}, + colback=\CouleurDomino, + center upper, + valign upper=center, + center lower, + valign lower=center, + arc=2pt, + #1 +} + +\newtcolorbox{MyDominoLogo}[1][]{% + enhanced, + nobeforeafter, + left skip=0pt, + right skip=0pt, + left=0pt,right=0pt,top=0pt,bottom=0pt, + width=\textwidth/\ColonneDomino, + height=\textheight/\LigneDomino, + valign=center, + halign=center, + arc=2pt, + colback=white, + #1 +} + +\NewEnviron{TrameDomino}{% + \setlength{\margev}{1cm} + \setlength{\margeh}{1cm} + \begin{tikzpicture}[remember picture,overlay] + % quadrillages horizontal et vertical + \coordinate[yshift=-\margev] (A0) at (current page.north west); + \coordinate[yshift=-\margev] (B0) at (current page.north east); + \foreach \i in {1,...,\useKV[Domino]{Lignes}}{% + \coordinate[yshift=-\i*\textheight/\LigneDomino] (A\i) at (A0); + \coordinate[yshift=-\i*\textheight/\LigneDomino] (B\i) at (B0); + } + \coordinate[xshift=\margeh] (C0) at (current page.north west); + \coordinate[xshift=\margeh] (D0) at (current page.south west); + \foreach \i in {1,...,\useKV[Domino]{Colonnes}}{ + \coordinate[xshift=\i*\textwidth/\ColonneDomino] (C\i) at (C0); + \coordinate[xshift=\i*\textwidth/\ColonneDomino] (D\i) at (D0); + } + \foreach \i in {0,...,\LigneDomino}{% + \draw (A\i) -- (B\i); + } + \foreach \i in {0,...,\ColonneDomino}{% + \draw (C\i) -- (D\i); + } + \draw[blue, line width=3pt] (A0)--(B0); + \draw[blue, line width=3pt] (A\LigneDomino)--(B\LigneDomino); + \draw[blue, line width=3pt] (C0)--(D0); + \draw[blue, line width=3pt] (C\ColonneDomino)--(D\ColonneDomino); + % point pour placer les cartes + \foreach \i in {0,...,\fpeval{\ColonneDomino-1}}{% + \foreach \j in {0,...,\fpeval{\LigneDomino-1}}{% + \coordinate[xshift=\margeh+(0.5\textwidth/\ColonneDomino)+\i*\textwidth/\ColonneDomino,yshift=-0.5\textheight/\LigneDomino-\j*\textheight/\LigneDomino] + (Domino\fpeval{\i+\ColonneDomino*\j+1}) at (A0); + } + } + \BODY + \end{tikzpicture} +} + +\setKVdefault[Domino]{Couleur=white,Trame,Ratio=0.5,Lignes=7,Colonnes=5,Superieur=false,Logo=false,Image=tiger.pdf} + +\newcommand\Dominos[2][]{% + \useKVdefault[Domino]% + \setKV[Domino]{#1}% + \setsepchar[*]{§*/}% + \readlist*\ListeDominos{#2}% + \xdef\CouleurDomino{\useKV[Domino]{Couleur}}% + \xdef\ratiodomino{\useKV[Domino]{Ratio}}% + \xdef\LigneDomino{\useKV[Domino]{Lignes}}% + \xdef\ColonneDomino{\useKV[Domino]{Colonnes}}% + \ifboolKV[Domino]{Trame}{% + \clearpage + \begin{TrameDomino} + \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{% + \node[] at (Domino\i){% + \ifboolKV[Domino]{Superieur}{% + \begin{MyDominoMini}[space=\ratiodomino]% + \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]% + \end{MyDominoMini}% + }{% + \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]% + \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]% + \end{MyDominoMini}% + }% + }; + }% + \end{TrameDomino}% + \ifboolKV[Domino]{Logo}{% + \clearpage + \begin{TrameDomino} + \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{% + \node at (Domino\i){% + \begin{MyDominoLogo}% + \includegraphics[height=\tcbtextheight]{\useKV[Domino]{Image}} + \end{MyDominoLogo}% + }; + }% + \end{TrameDomino}% + }{}% + }{% + \ifboolKV[Domino]{Superieur}{% + \begin{MyDominoMini}[space=\ratiodomino]% + \ListeDominos[1,1]\tcblower\ListeDominos[1,2]% + \end{MyDominoMini}% + }{% + \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]% + \ListeDominos[1,1]\tcblower% + \ListeDominos[1,2]% + \end{MyDominoMini}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex b/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex new file mode 100644 index 0000000000..bd0cb57204 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEcrireunQCM.tex @@ -0,0 +1,148 @@ +%%% +% QCM +%%% +\setKVdefault[ClesQCM]{Reponses=3,Solution=false,Stretch=1,Largeur=2cm,Couleur=gray!15,Titre=false,Nom=R\'eponse,NomV=Vrai,NomF=Faux,Alph=false,AlphT=false,VF=false,Depart=1,Alterne=false,Noms={A/B/C},Multiple=false,Parties={Yeux,Nez,Bouche}}% +\newlength{\LargeurQCM}% +\newlength{\PfCLargeurQCM}% +\newcounter{QuestionQCM}% +\newcounter{TitreQCM}% +\ifdef{\QCM}{% + \PackageWarning{ProfCollege}{La commande \noexpand\QCM étant définie par la classe du document, ProfCollege modifie sa commande \noexpand\QCM en \noexpand\QCMPfC.}% + \newcommand\QCMPfC[2][]{% + \useKVdefault[ClesQCM]% + \setKV[ClesQCM]{#1}% + \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}% + \setcounter{TitreQCM}{0} + \setsepchar[*]{§*&}\ignoreemptyitems% + \readlist*\ListeQCM{#2}% + \ifboolKV[ClesQCM]{Multiple}{% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \xdef\ListeNom{\useKV[ClesQCM]{Noms}}% + \setsepchar[*]{/}% + \readlist*\ListeNomsMul{\ListeNom}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \cline{2-\NBcases}% + \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ListeNomsMul[##2]}% + \\ + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}% + }\\ + }% + \hline% + \end{tabular}% + }{% + \ifboolKV[ClesQCM]{VF}{% + \setKV[ClesQCM]{Reponses=2}% + \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% + \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \cline{2-\NBcases}% + \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\ + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}% + }\\ + }% + \hline% + \end{tabular} + }{% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}% + \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}% + \\ + }{} + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]% + }\\ + }% + \hline% + \end{tabular}% + }% + }% + \renewcommand{\arraystretch}{1}% + }% +}{% + \newcommand\QCM[2][]{% + \useKVdefault[ClesQCM]% + \setKV[ClesQCM]{#1}% + \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}% + \setcounter{TitreQCM}{0} + \setsepchar[*]{,*&}\ignoreemptyitems% + \readlist*\ListeQCM{#2}% + \ifboolKV[ClesQCM]{Multiple}{% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \xdef\ListeNom{\useKV[ClesQCM]{Noms}}% + \setsepchar[*]{/}% + \readlist*\ListeNomsMul{\ListeNom}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \cline{2-\NBcases}% + \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ListeNomsMul[##2]}% + \\ + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}% + }\\ + }% + \hline% + \end{tabular}% + \renewcommand{\arraystretch}{1}% + }{% + \ifboolKV[ClesQCM]{VF}{% + \setKV[ClesQCM]{Reponses=2}% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% + \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \cline{2-\NBcases}% + \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\ + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}% + }\\ + }% + \hline% + \end{tabular} + }{% + \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% + \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% + \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% + \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% + \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}% + \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}% + \\ + }{} + \hline% + \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% + \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% + &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]% + }\\ + }% + \hline% + \end{tabular}% + }% + }% + \renewcommand{\arraystretch}{1}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEcritureLettres.tex b/macros/latex/contrib/profcollege/latex/PfCEcritureLettres.tex new file mode 100644 index 0000000000..650847b21c --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEcritureLettres.tex @@ -0,0 +1,57 @@ + + + +%%% +% Ecriture des nombres en lettres +%%% +\setKVdefault[ClesEcriture]{Math=false,Majuscule=false,E=false,Tradition=false,Zero=false} + +\newcommand\EcriturePluriel[1]{% + \xintifboolexpr{#1 > 1}{s}{}% +} + +\newcommand\EcritureDecimale{% + \StrLen{\ListeEcriture[2]}[\LongueurDecimale]% + \xintifboolexpr{\LongueurDecimale == 6}{% + ~millionième\EcriturePluriel{\ListeEcriture[2]}% + }{\xintifboolexpr{\LongueurDecimale == 5}{% + ~cent-millième\EcriturePluriel{\ListeEcriture[2]} + }{\xintifboolexpr{\LongueurDecimale == 4}{% + ~dix-millième\EcriturePluriel{\ListeEcriture[2]} + }{\xintifboolexpr{\LongueurDecimale == 3}{% + ~millième\EcriturePluriel{\ListeEcriture[2]} + }{\xintifboolexpr{\LongueurDecimale == 2}{% + ~centième\EcriturePluriel{\ListeEcriture[2]} + }{\xintifboolexpr{\LongueurDecimale == 1}{% + ~dixième\EcriturePluriel{\ListeEcriture[2]} + }{}% + }% + }% + }% + }% + }% +}% + +\newcommand\Ecriture[2][]{% + \useKVdefault[ClesEcriture]% + \setKV[ClesEcriture]{#1}% + \ifboolKV[ClesEcriture]{Tradition}{% + \fmtcountsetoptions{french={dash or space=traditional}}% + }{% + \fmtcountsetoptions{french={dash or space=always}}% + }% + \setsepchar{.}% + \readlist*\ListeEcriture{#2}% + \xintifboolexpr{\ListeEcriturelen == 2}{% + \ifboolKV[ClesEcriture]{Majuscule}{% + \ifboolKV[ClesEcriture]{Zero}{}{\Numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}% + }{% + \ifboolKV[ClesEcriture]{Zero}{}{\numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}% + }}{% + \ifboolKV[ClesEcriture]{Majuscule}{% + \Numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}% + }{% + \numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEcritureUnites.tex b/macros/latex/contrib/profcollege/latex/PfCEcritureUnites.tex new file mode 100644 index 0000000000..1c8c944c48 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEcritureUnites.tex @@ -0,0 +1,427 @@ +%%% +% Ecritures d'unit\'es +%%% +\setKVdefault[Unites]{m=false,km=false,hm=false,ha=false,dam=false,a=false,dm=false,cm=true,mm=false,um=false,nm=false,g=true,t=false,q=false,kg=false,hg=false,dag=false,dg=false,cg=false,mg=false,ug=false,ng=false,mmin=false,kmh=true,kms=false,ms=false,mh=false,kgm=false,gcm=true,L=true,kL=false,hL=false,daL=false,dL=false,cL=false,mL=false,l=true,kl=false,hl=false,dal=false,dl=false,cl=false,ml=false,Go=true,Mo=false,ko=false,To=false,o=false,kWh=true,C=true,K=false,F=false,Nombre} +\defKV[Unites]{Dots=\setKV[Unites]{Nombre=false}} + +\newlength{\PfCLgUnites} + +%D'apres https://tex.stackexchange.com/questions/38905/time-of-the-day-or-time-period-using-the-package-siunitx +\ExplSyntaxOn +\NewDocumentCommand \Temps {o o > { \SplitArgument { 5 } { ; } } m } +{% + \useKVdefault[Unites]% + \setKV[Unites]{#1} + \group_begin:% + \IfNoValueF{#2} + { \keys_set:nn { siunitx } {#2} } + \siunitx_hms_output:nnn #3 + \group_end: +} +\cs_new_protected:Npn \siunitx_hms_output:nnn #1#2#3#4#5#6 +{% + \IfNoValueF {#1}% + {% + \tl_if_blank:nF {#1}% + {% + \ifboolKV[Unites]{Nombre}{% + \SI{#1}{\annee\xintifboolexpr{#1>1}{s}{}}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\annee(s)}}% + \IfNoValueF {#2}{\,}% + }% + }% + \IfNoValueF {#2}% + {% + \tl_if_blank:nF {#2}% + {% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\mois}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\mois}}% + \IfNoValueF{#3}{\,}% + }% + }% + \IfNoValueF {#3}% + {% + \tl_if_blank:nF {#3}% + {% + \ifboolKV[Unites]{Nombre}{% + \SI{#3}{\jour}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\jour}}% + \IfNoValueF{#4}{\,}% + }% + }% + \IfNoValueF {#4}% + {% + \tl_if_blank:nF {#4}% + {% + \ifboolKV[Unites]{Nombre}{% + \SI{#4}{\hour}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\hour}}% + \IfNoValueF{#5}{\,}% + }% + }% + \IfNoValueF {#5}% + {% + \tl_if_blank:nF {#5}% + {% + \ifboolKV[Unites]{Nombre}{% + \SI[minimum-integer-digits=2]{#5}{\minute}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\minute}}% + \IfNoValueF{#6}{\,}% + }% + }% + \IfNoValueF {#6}% + {% + \tl_if_blank:nF {#6} {% + \ifboolKV[Unites]{Nombre}{% + \SI{#6}{\second}}{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\second}}% + }% + }% +}% +\ExplSyntaxOff + +\NewDocumentCommand\Temp{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{F}{% + \DeclareSIUnit{\Tempo}{\fahrenheit}% + }{% + \ifboolKV[Unites]{K}{% + \DeclareSIUnit{\Tempo}{\kelvin}% + }{% + \DeclareSIUnit{\Tempo}{\celsius}% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\Tempo}% + }% +}% + +\NewDocumentCommand\Conso{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\kWh}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\kWh}% + }% +}% + +%Pour mémoire au cas où... +%\newcommand\Prixo[2][2]{% +% \SI[round-mode=places,round-precision=#1]{#2}{\EuRo}% +%} + +\NewDocumentCommand\Prix{O{} O{2} m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{Nombre}{% + \SI[round-mode=places,round-precision=#2]{#3}{\EuRo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}} + \pointilles[\PfCLgUnites]\,\si{\EuRo}% + }% +}% + +\NewDocumentCommand\Octet{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{o}{% + \DeclareSIUnit{\Tempo}{\octet}% + }{% + \ifboolKV[Unites]{ko}{% + \DeclareSIUnit{\Tempo}{\kilo\octet}% + }{% + \ifboolKV[Unites]{Mo}{% + \DeclareSIUnit{\Tempo}{\mega\octet}% + }{% + \ifboolKV[Unites]{To}{% + \DeclareSIUnit{\Tempo}{\tera\octet}% + }{% + \DeclareSIUnit{\Tempo}{\giga\octet}% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\Tempo}% + }% +}% + +\NewDocumentCommand\Lg{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{nm}{% + \DeclareSIUnit{\Tempo}{\nano\meter}% + }{% + \ifboolKV[Unites]{um}{% + \DeclareSIUnit{\Tempo}{\micro\meter}% + }{% + \ifboolKV[Unites]{km}{% + \DeclareSIUnit{\Tempo}{\kilo\meter}% + }{% + \ifboolKV[Unites]{hm}{% + \DeclareSIUnit{\Tempo}{\hecto\meter}% + }{% + \ifboolKV[Unites]{dam}{% + \DeclareSIUnit{\Tempo}{\deca\meter}% + }{% + \ifboolKV[Unites]{m}{% + \DeclareSIUnit{\Tempo}{\meter}% + }{% + \ifboolKV[Unites]{dm}{% + \DeclareSIUnit{\Tempo}{\deci\meter}% + }{% + \ifboolKV[Unites]{mm}{% + \DeclareSIUnit{\Tempo}{\milli\meter}% + }{% + \DeclareSIUnit{\Tempo}{\centi\meter}% + }% + }% + }% + }% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\Tempo}% + }% +}% + +\NewDocumentCommand\Masse{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{ng}{% + \DeclareSIUnit{\Tempo}{\nano\gram}% + }{\ifboolKV[Unites]{ug}{% + \DeclareSIUnit{\Tempo}{\micro\gram}% + }{\ifboolKV[Unites]{t}{% + \DeclareSIUnit{\Tempo}{\tonne}% + }{\ifboolKV[Unites]{q}{% + \DeclareSIUnit{\Tempo}{\quintal}% + }{% + \ifboolKV[Unites]{kg}{% + \DeclareSIUnit{\Tempo}{\kilo\gram}% + }{\ifboolKV[Unites]{hg}{% + \DeclareSIUnit{\Tempo}{\hecto\gram}% + }{\ifboolKV[Unites]{dag}{% + \DeclareSIUnit{\Tempo}{\deca\gram}% + }{\ifboolKV[Unites]{dg}{% + \DeclareSIUnit{\Tempo}{\deci\gram}% + }{\ifboolKV[Unites]{cg}{% + \DeclareSIUnit{\Tempo}{\centi\gram}% + }{\ifboolKV[Unites]{mg}{% + \DeclareSIUnit{\Tempo}{\milli\gram}% + }{% + \DeclareSIUnit{\Tempo}{\gram}% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\Tempo}% + }% +}% + +\NewDocumentCommand\Capa{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{kL}{% + \DeclareSIUnit{\Tempo}{\kilo\liter}% + }{\ifboolKV[Unites]{hL}{% + \DeclareSIUnit{\Tempo}{\hecto\liter}% + }{\ifboolKV[Unites]{daL}{% + \DeclareSIUnit{\Tempo}{\deca\liter}% + }{\ifboolKV[Unites]{dL}{% + \DeclareSIUnit{\Tempo}{\deci\liter}% + }{\ifboolKV[Unites]{cL}{% + \DeclareSIUnit{\Tempo}{\centi\liter}% + }{\ifboolKV[Unites]{mL}{% + \DeclareSIUnit{\Tempo}{\milli\liter}% + }{% + \DeclareSIUnit{\Tempo}{\liter}% + }% + }% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\Tempo}% + }% +}% + +\NewDocumentCommand\Aire{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{ha}{% + \DeclareSIUnit{\Tempo}{\hectare}% + }{% + \ifboolKV[Unites]{a}{% + \DeclareSIUnit{\Tempo}{\are}% + }{% + \ifboolKV[Unites]{nm}{% + \DeclareSIUnit{\Tempo}{\nano\meter}% + }{% + \ifboolKV[Unites]{um}{% + \DeclareSIUnit{\Tempo}{\micro\meter}% + }{% + \ifboolKV[Unites]{km}{% + \DeclareSIUnit{\Tempo}{\kilo\meter}% + }{% + \ifboolKV[Unites]{hm}{% + \DeclareSIUnit{\Tempo}{\hecto\meter}% + }{% + \ifboolKV[Unites]{dam}{% + \DeclareSIUnit{\Tempo}{\deca\meter}% + }{% + \ifboolKV[Unites]{m}{% + \DeclareSIUnit{\Tempo}{\meter}% + }{% + \ifboolKV[Unites]{dm}{% + \DeclareSIUnit{\Tempo}{\deci\meter}% + }{% + \ifboolKV[Unites]{mm}{% + \DeclareSIUnit{\Tempo}{\milli\meter}% + }{% + \DeclareSIUnit{\Tempo}{\centi\meter}% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\square\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\square\Tempo}% + }% +}% + +\NewDocumentCommand\Vol{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{nm}{% + \DeclareSIUnit{\Tempo}{\nano\meter}% + }{% + \ifboolKV[Unites]{um}{% + \DeclareSIUnit{\Tempo}{\micro\meter}% + }{% + \ifboolKV[Unites]{km}{% + \DeclareSIUnit{\Tempo}{\kilo\meter}% + }{% + \ifboolKV[Unites]{hm}{% + \DeclareSIUnit{\Tempo}{\hecto\meter}% + }{% + \ifboolKV[Unites]{dam}{% + \DeclareSIUnit{\Tempo}{\deca\meter}% + }{% + \ifboolKV[Unites]{m}{% + \DeclareSIUnit{\Tempo}{\meter}% + }{% + \ifboolKV[Unites]{dm}{% + \DeclareSIUnit{\Tempo}{\deci\meter}% + }{% + \ifboolKV[Unites]{mm}{% + \DeclareSIUnit{\Tempo}{\milli\meter}% + }{% + \DeclareSIUnit{\Tempo}{\centi\meter}% + }% + }% + }% + }% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI{#2}{\cubic\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si{\cubic\Tempo}% + }% +}% + +\NewDocumentCommand\Vitesse{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{mmin}{% + \DeclareSIUnit{\Tempo}{\meter\per\minute}% + }{% + \ifboolKV[Unites]{mh}{% + \DeclareSIUnit{\Tempo}{\meter\per\hour}% + }{% + \ifboolKV[Unites]{ms}{% + \DeclareSIUnit{\Tempo}{\meter\per\second}% + }{% + \ifboolKV[Unites]{kms}{% + \DeclareSIUnit{\Tempo}{\kilo\meter\per\second}% + }{% + \DeclareSIUnit{\Tempo}{\kilo\meter\per\hour}% + }% + }% + }% + }% + \ifboolKV[Unites]{Nombre}{% + \SI[per-mode=symbol]{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si[per-mode=symbol]{\Tempo}% + }% +}% + +\NewDocumentCommand\MasseVol{o m}{% + \useKVdefault[Unites]% + \setKV[Unites]{#1}% + \ifboolKV[Unites]{kgm}{% + \DeclareSIUnit{\Tempo}{\kilo\gram\per\cubic\meter}% + }{% + \DeclareSIUnit{\Tempo}{\gram\per\cubic\centi\meter}% + }% + \ifboolKV[Unites]{Nombre}{% + \SI[per-mode=symbol]{#2}{\Tempo}% + }{% + \setlength{\PfCLgUnites}{\useKV[Unites]{Dots}}% + \pointilles[\PfCLgUnites]\,\si[per-mode=symbol]{\Tempo}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEngrenagesBase.tex b/macros/latex/contrib/profcollege/latex/PfCEngrenagesBase.tex new file mode 100644 index 0000000000..17846d9d54 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEngrenagesBase.tex @@ -0,0 +1,135 @@ +%%% +% Engrenages +%%% +\newtoks\tokPfCEngrenages% +\def\UpdatetoksEngrenages#1/#2\nil{\addtotok\tokPfCEngrenages{#1,#2,}}% + +\setKVdefault[Engrenages]{Couleur=LightSteelBlue,Unite=3mm} + +\NewDocumentCommand\Engrenages{o m}{% + \tokPfCEngrenages{} + \useKVdefault[Engrenages]% + \setKV[Engrenages]{#1}% + \setsepchar[*]{,*/}% + \ignoreemptyitems + \readlist*\ListePfCEngrenages{#2}% + \setsepchar{,} + \xdef\PfCFooEngrenages{} + % \foreachitem\compteur\in\ListePfCEngrenages{\expandafter\UpdatetoksEngrenages\compteur\nil}% + \foreachitem\compteur\in\ListePfCEngrenages{% + \xdef\PfCFooEngrenages{\PfCFooEngrenages \ListePfCEngrenages[\compteurcnt,1],\ListePfCEngrenages[\compteurcnt,2],}% + }% + \BuildEngrenages{\PfCFooEngrenages}% +}% + +\NewDocumentCommand\BuildEngrenages{m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCEngrenages; + + u:=\useKV[Engrenages]{Unite}; + CouleurEngrenage=\useKV[Engrenages]{Couleur}; + + vardef LectureDonnees(text t)= + n:=0;k=0;l=0; + for p_=t: + n:=n+1; + if (n mod 2)=0: + l:=l+1; + Zz[l]=p_; + else: + k:=k+1; + Mm[k]=p_; + fi; + endfor; + enddef; + + LectureDonnees(#1); + + pair K; + K=(0,0); + + trace Engrenage(Mm[1],Zz[1],(0,0)); + + Signe=1; + + for w=2 upto (n div 2): + K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0); + AngleRot[w]:=360/(2*Zz[w]); + if w=2: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + if (Zz[w] mod 2)=0: + Signe:=Signe*(-1); + fi; + else: + if (Zz[w] mod 2)=1: + if Signe=-1: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); + else: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + fi; + else: + Signe:=Signe*(-1); + if Signe=1: +trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); + else: +trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + fi; + fi; + fi; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCEngrenages;u:=\useKV[Engrenages]{Unite};CouleurEngrenage=\useKV[Engrenages]{Couleur};}] + vardef LectureDonnees(text t)= + n:=0;k=0;l=0; + for p_=t: + n:=n+1; + if (n mod 2)=0: + l:=l+1; + Zz[l]=p_; + else: + k:=k+1; + Mm[k]=p_; + fi; + endfor; + enddef; + + LectureDonnees(#1); + + pair K; + K=(0,0); + + trace Engrenage(Mm[1],Zz[1],(0,0)); + + Signe=1; + + for w=2 upto (n div 2): + K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0); + AngleRot[w]:=360/(2*Zz[w]); + if w=2: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + if (Zz[w] mod 2)=0: + Signe:=Signe*(-1); + fi; + else: + if (Zz[w] mod 2)=1: + if Signe=-1: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); + else: + trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + fi; + else: + Signe:=Signe*(-1); + if Signe=1: +trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); + else: +trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); + fi; + fi; + fi; + endfor; + \end{mpost} + \fi +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEnigmeAire.tex b/macros/latex/contrib/profcollege/latex/PfCEnigmeAire.tex new file mode 100644 index 0000000000..345f741656 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEnigmeAire.tex @@ -0,0 +1,337 @@ +%%% +% Enigme Aire +%%% +\setKVdefault[EnigmeAire]{Modele=A,Couleur=LightSteelBlue,Echelle=7mm,Etape=1,Solution=false,Graines=false} +\defKV[EnigmeAire]{Graine=\setKV[EnigmeAire]{Graines}} + +\def\MPEnigmeAireA{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + + pair A[],B[]; + numeric la[]; + la1=ceiling(3+uniformdeviate(7)); + la2=ceiling(3+uniformdeviate(7)); + la3=ceiling(3+uniformdeviate(7)); + la4=ceiling(4+uniformdeviate(6)); + A1=u*(1,1); + A2-A1=u*(10,0); + A3-A2=u*(0,5); + A4-A3=A1-A2; + B1=(la1/(la1+la2+la3))[A1,A2]; + B2=((la1+la2)/(la1+la2+la3))[A1,A2]; + B3-B2=A4-A1; + B4-B1=B3-B2; + fill polygone(B1,B2,B3,B4) withcolor \useKV[EnigmeAire]{Couleur}; + trace polygone(B1,B2,B3,B4); + trace polygone(A1,A2,A3,A4); + label(TEX("\Aire[m]{"&decimal(la1*la4)&"}"),iso(A1,B4)); + if Solution: + label(TEX(decimal(la2*la4)&"\,\si{\square\meter}"),iso(B1,B3)); + else: + label(TEX("?\,\si{\square\meter}"),iso(B1,B3)); + fi; + + label(TEX("\Aire[m]{"&decimal(la3*la4)&"}"),iso(B2,A3)); + trace cotation(A4,B3,3mm,3mm,TEX("\Lg[m]{"&decimal(la1+la2)&"}")); + trace cotation(B1,A2,-3mm,-3mm,TEX("\Lg[m]{"&decimal(la3+la2)&"}")); + \end{mplibcode} + \fi +} + +\def\MPEnigmeAireB{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + pair A[],B[]; + numeric La[],la[],Ca[]; + la1=ceiling(3+uniformdeviate(7)); + la2=ceiling(3+uniformdeviate(7)); + La1=ceiling(8+uniformdeviate(7)); + La2=ceiling(uniformdeviate(5)); + Ca1=1+ceiling(uniformdeviate(La1-La2-2)); + Ca2=ceiling(uniformdeviate(la2-2)); + A1=u*(1,1); + A2-A1=u*(10,0); + A3-A2=u*(0,2); + A4-A3=u*(-7,0); + A5-A4=u*(0,4); + A6-A5=(xpart(A1-A4),0); + A7-A6=A4-A5; + B1=(Ca1/(La1-La2))[A4,A3]; + B3=((Ca2+1)/la2)[A4,A5]; + B2-B1=B3-A4; + fill polygone(A4,B1,B2,B3) withcolor \useKV[EnigmeAire]{Couleur}; + trace chemin(B1,B2,B3); + trace polygone(A1,A2,A3,A4,A5,A6); + trace chemin(A7,A4); + label(TEX("\Aire[m]{"&decimal(la1*La1)&"}"),iso(A1,A3)); + if Solution: + label(TEX(decimal(Ca1*Ca2)&"\,\si{\square\meter}"),iso(B1,B3)); + else: + label(TEX("?\,\si{\square\meter}"),iso(B1,B3)); + fi; + + label(TEX("\Aire[m]{"&decimal(la2*La2)&"}"),iso(A7,A5)); + trace appelation(A6,A5,3mm,TEX("\Lg[m]{"&decimal(La2)&"}")); + trace appelation(B1,A3,3mm,TEX("\Lg[m]{"&decimal(La1-La2-Ca1)&"}")); + label.rt(TEX("\Lg[m]{"&decimal(la2-Ca2)&"}"),iso(A5,B3)); + label.rt(TEX("\Lg[m]{"&decimal(la1)&"}"),iso(A2,A3)); + \end{mplibcode} + \fi +} + +\def\MPEnigmeAireC{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + pair A[]; + numeric la[],La[]; + La1=ceiling(3+uniformdeviate(7)); + La2=ceiling(3+uniformdeviate(7)); + La3=ceiling(3+uniformdeviate(7)); + la1=ceiling(3+uniformdeviate(7)); + la2=ceiling(3+uniformdeviate(7)); + la3=ceiling(3+uniformdeviate(7)); + A1=u*(1,1); + A4-A1=if La1+La2+La3>la1+la2+la3: + u*(10,0) + else: + u*(8,0); + fi; + A2=(La1/(La1+La2+La3))[A1,A4]; + A3=((La1+La2)/(La1+La2+La3))[A1,A4]; + A5-A4=if La1+La2+La3>la1+la2+la3: + u*(0,7) + else: + u*(0,10); + fi; + A6-A5=A3-A4; + A7-A3=((la1+la2)/(la1+la2+la3))[A4,A5]-A4; + A8-A7=A2-A3; + A9-A2=(la1/(la1+la2+la3))[A4,A5]-A4; + A10-A9=A1-A2; + trace polygone(A1,A4,A5,A6,A7,A8,A9,A10); + trace segment(A2,A9); + trace segment(A3,A7); + label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A1,A9)); + label(TEX("\Aire[cm]{"&decimal((la1+la2)*La2)&"}"),iso(A2,A7)); + label(TEX("\Aire[cm]{"&decimal((la1+la2+la3)*La3)&"}"),iso(A3,A5)); + trace cotation(A1,A4,-3mm,-3mm,TEX("\Lg[cm]{"&decimal(La1+La2+La3)&"}")); + label.lft(TEX("\Lg{"&decimal(la1)&"}"),iso(A1,A10)); + label.lft(TEX("\Lg{"&decimal(la2)&"}"),iso(A9,A8)); + if Solution: + label.lft(TEX(decimal(la3)&"\,\si{\centi\meter}"),iso(A7,A6)); + else: + label.lft(TEX("?\,\si{\centi\meter}"),iso(A7,A6)); + fi; + \end{mplibcode} + \fi +} + +\def\MPEnigmeAireD{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + Etape:=\useKV[EnigmeAire]{Etape}; + pair A[]; + numeric la[],La[]; + la[1]=ceiling(3+uniformdeviate(7)); + la[2]=ceiling(3+uniformdeviate(7)); + k=1; + La[k]=ceiling(3+uniformdeviate(7)); + A[1]=u*(9,-9); + A[6*(k-1)+2]-A[6*(k-1)+1]=u*(0,3); + A[6*(k-1)+3]-A[6*(k-1)+2]=u*(-6,0); + A[6*(k-1)+4]-A[6*(k-1)+3]=A[6*(k-1)+1]-A[6*(k-1)+2]; + A[6*(k-1)+5]=(la[k]/(la[k]+la[k+1]))[A[6*(k-1)+1],A[6*(k-1)+4]]; + A[6*(k-1)+6]-A[6*(k-1)+5]=A[6*(k-1)+2]-A[6*(k-1)+1]; + trace polygone(A[6*(k-1)+1],A[6*(k-1)+2],A[6*(k-1)+3],A[6*(k-1)+4]); + trace segment(A[6*(k-1)+5],A[6*(k-1)+6]); + if Solution: + trace cotation(A[6*(k-1)+5],A[6*(k-1)+1],-3mm,-3mm,TEX("\Lg{"&decimal(la[k])&"}")); + else: + trace cotation(A[6*(k-1)+5],A[6*(k-1)+1],-3mm,-3mm,TEX("?\,\si{\centi\meter}")); + fi; + label(TEX("\Aire{"&decimal(la[k]*La[k])&"}"),iso(A[6*(k-1)+5],A[6*(k-1)+2])); + label(TEX("\Aire{"&decimal(la[k+1]*La[k])&"}"),iso(A[6*(k-1)+4],A[6*(k-1)+6])); + if Etape<2: + trace cotation(A[6*(k-1)+3],A[6*(k-1)+6],3mm,3mm,TEX("\Lg{"&decimal(la[k+1])&"}")); + fi; + for k=2 upto Etape: + La[k]=ceiling(3+uniformdeviate(7)); + la[k+1]=ceiling(3+uniformdeviate(7)); + A[6*(k-1)+1]=A[6*(k-1)]; + A[6*(k-1)+2]-A[6*(k-1)+1]=u*(0,3); + A[6*(k-1)+3]-A[6*(k-1)+2]=u*(-6,0); + A[6*(k-1)+4]-A[6*(k-1)+3]=A[6*(k-1)+1]-A[6*(k-1)+2]; + A[6*(k-1)+5]=A[6*(k-1)-3];%(la[k]/(la[k]+la[k+1]))[A[6*(k-1)+1],A[6*(k-1)+4]]; + A[6*(k-1)+6]-A[6*(k-1)+5]=A[6*(k-1)+2]-A[6*(k-1)+1]; + trace polygone(A[6*(k-1)+1],A[6*(k-1)+2],A[6*(k-1)+3],A[6*(k-1)+4]); + trace segment(A[6*(k-1)+5],A[6*(k-1)+6]); + if k=Etape: + trace cotation(A[6*(k-1)+3],A[6*(k-1)+6],3mm,3mm,TEX("\Lg{"&decimal(la[k+1])&"}")); + fi; + label(TEX("\Aire[cm]{"&decimal(la[k]*La[k])&"}"),iso(A[6*(k-1)+6],A[6*(k-1)])); + label(TEX("\Aire[cm]{"&decimal(la[k+1]*La[k])&"}"),iso(A[6*(k-1)+4],A[6*(k-1)+6])); + endfor; + \end{mplibcode} + \fi +} + +\def\MPEnigmeAireE{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + pair A[]; + numeric la[],La[]; + La1=ceiling(3+uniformdeviate(7)); + La2=ceiling(3+uniformdeviate(7)); + La3=ceiling(3+uniformdeviate(7)); + la1=ceiling(4+uniformdeviate(5)); + la2=ceiling(4+uniformdeviate(5)); + la3=la1+la2+2; + A1=u*(7,1); + A11-A1=if la3>(La1+La2+La3):u*(0,10) else:u*(0,7) fi; + A2=(La1/(La1+La2+La3))[A1,A11]; + A3=((La1+La2)/(La1+La2+La3))[A1,A11]; + A8-A2=if la3>(La1+La2+La3):u*(-7,0) else:u*(-10,0) fi; + A6-A8=A11-A2; + A7-A8=A3-A2; + A4=(la2/la3)[A7,A3]; + A5-A4=A6-A7; + A9=(la1/la3)[A2,A8]; + A10-A9=A1-A2; + trace polygone(A1,A3,A4,A5,A6,A8,A9,A10); + trace segment(A7,A4); + trace segment(A2,A9); + label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A1,A9)); + label(TEX("\Aire[cm]{"&decimal(la3*La2)&"}"),iso(A2,A7)); + label(TEX("\Aire[cm]{"&decimal(la2*La3)&"}"),iso(A4,A6)); + trace cotationarc(A5,A4,5mm,4,1,TEX("\Lg[cm]{"&decimal(La3)&"}") rotated 90); + trace cotationarc(A9,A8,3mm,4,1,TEX("\Lg[cm]{"&decimal(la3-la1)&"}") rotated 180); + trace cotationarc(A4,A3,3mm,4,1,TEX("\Lg[cm]{"&decimal(la3-la2)&"}")); + if Solution: + trace cotationarc(A3,A1,5mm,3,1,TEX("\Lg{"&decimal(La1+La2)&"}") rotated 90); + else: + trace cotationarc(A3,A1,5mm,3,1,TEX("?") rotated 90); + fi; + \end{mplibcode} + \fi +} + +\def\MPEnigmeAireF{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines:=\useKV[EnigmeAire]{Graines}; + Solution:=\useKV[EnigmeAire]{Solution}; + + if Graines: + randomseed:=\useKV[EnigmeAire]{Graine}; + fi; + + u:=\useKV[EnigmeAire]{Echelle}; + pair A[]; + numeric la[],La[]; + la1=ceiling(2+uniformdeviate(4)); + la2=ceiling(2+uniformdeviate(4)); + la3=ceiling(2+uniformdeviate(4)); + la4=ceiling(2+uniformdeviate(4)); + La1=ceiling(8+uniformdeviate(4)); + La2=ceiling(8+uniformdeviate(4)); + La3=ceiling(8+uniformdeviate(4)); + La4=ceiling(8+uniformdeviate(4)); + A1=(0,0); + A2-A1=u*(0,-3.5); + A3-A2=u*(2.25,0); + A4-A1=A3-A2; + A5-A1=u*(6,0); + A6-A5=u*(0,2.5); + A7-A6=A1-A5; + A8-A7=u*(0,2); + A9-A8=u*(-2,0); + A10-A9=A1-A8; + A11-A1=u*(-4.5,0); + A12-A11=u*(0,-1.5); + A13-A12=A1-A11; + fill polygone(A1,A5,A6,A7) withcolor \useKV[EnigmeAire]{Couleur}; + trace polygone(A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13); + trace segment(A7,A13); + trace segment(A10,A4); + if Solution: + label(TEX("\Aire{"&decimal(la2*La2)&"}"),iso(A1,A6)); + else: + label(TEX("?\,\si{\square\centi\meter}"),iso(A1,A6)); + fi; + label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A2,A4)); + label(TEX("\Aire[cm]{"&decimal(la3*La3)&"}"),iso(A10,A8)); + label(TEX("\Aire[cm]{"&decimal(la4*La4)&"}"),iso(A12,A1)); + trace cotationarc(A12,A11,5mm,4,1,TEX("\Lg[cm]{"&decimal(la4)&"}") rotated -90); + trace cotationarc(A5,A4,5mm,4,1,TEX("\Lg[cm]{"&decimal(La2-la1)&"}") rotated 180); + trace cotationarc(A8,A7,5mm,4,1,TEX("\Lg[cm]{"&decimal(La3-la2)&"}") rotated 90); + trace cotationarc(A11,A10,3mm,4,1,TEX("\Lg[cm]{"&decimal(La4-la3)&"}")); + trace cotationarc(A2,A13,5mm,3,1,TEX("\Lg[cm]{"&decimal(La1-la4)&"}") rotated -90); + \end{mplibcode} + \fi +} + +\NewDocumentCommand\EnigmeAire{o}{% + \useKVdefault[EnigmeAire]% + \setKV[EnigmeAire]{#1}% + \IfStrEqCase{\useKV[EnigmeAire]{Modele}}{% + {A}{\MPEnigmeAireA} + {B}{\MPEnigmeAireB} + {C}{\MPEnigmeAireC} + {D}{\MPEnigmeAireD} + {E}{\MPEnigmeAireE} + {F}{\MPEnigmeAireF} + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCEnquete.tex b/macros/latex/contrib/profcollege/latex/PfCEnquete.tex new file mode 100644 index 0000000000..678b268c57 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCEnquete.tex @@ -0,0 +1,105 @@ +%%% +% Enquête +%%% +\setKVdefault[ClesEnquete]{Perso=Qui ?,Objet=Quoi ?,Lieu=Où ?,Largeur=4.5cm} + +\newcommand\Enquete[1][]{% + \useKVdefault[ClesEnquete]% + \setKV[ClesEnquete]{#1}% +} + +\newcommand\ListePersonnages[1]{% + \setsepchar{§}% + \readlist*\RetiensListePersonnages{#1}% + \setsepchar{,}% +} + +\newcommand\ListeObjets[1]{% + \setsepchar{§}% + \readlist*\RetiensListeObjets{#1}% + \setsepchar{,}% +} + +\newcommand\ListeLieux[1]{% + \setsepchar{§}% + \readlist*\RetiensListeLieux{#1}% + \setsepchar{,}% +} + +\newcommand\ListeQuestions[1]{% + \setsepchar[*]{§*/}% + \readlist*\RetiensListeQuestions{#1} + % On crée la liste des numéros des questions + \xdef\foo{}% + \xintFor* ##1 in {\xintSeq{1}{\RetiensListeQuestionslen}}\do{% + \xdef\foo{\foo ##1,}% + }% + % Mélange des questions + % on crée les 6 premieres solutions. + \MelangeListe{\foo}{\fpeval{\RetiensListePersonnageslen}}% + \readlist*\ListeMelangeePersonnages{\faa}% + \readlist*\ListeRestante{\fii}%\ListeRestante[] + \MelangeListe{\faa}{\fpeval{\RetiensListePersonnageslen-1}}% + \readlist*\ListefuuPerso{\faa}% + % on crée les 6 solutions suivantes. + \xdef\fuuu{}% + \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}% + \MelangeListe{\fuuu}{\fpeval{\RetiensListeObjetslen}}% + \readlist*\ListeMelangeeObjets{\faa}% + \readlist*\ListeRestante{\fii}% + \MelangeListe{\faa}{\fpeval{\RetiensListeObjetslen-1}}% + \readlist*\ListefuuObjets{\faa}% + % on crée les dernieres solutions. + \xdef\fuuu{}% + \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}% + \MelangeListe{\fuuu}{\fpeval{\RetiensListeLieuxlen}} + \readlist*\ListeMelangeeLieux{\faa}% + %% \readlist*\ListeRestante{\fii}% + \MelangeListe{\faa}{\fpeval{\RetiensListeLieuxlen-1}}% + \readlist*\ListefuuLieux{\faa}% + % -------------- + % Liste des questions sauvegardees + \xdef\fuu{}% + \foreachitem\compteur\in\ListefuuPerso{\xdef\fuu{\fuu,\ListefuuPerso[\compteurcnt]}}% + \foreachitem\compteur\in\ListefuuObjets{\xdef\fuu{\fuu,\ListefuuObjets[\compteurcnt]}}% + \foreachitem\compteur\in\ListefuuLieux{\xdef\fuu{\fuu,\ListefuuLieux[\compteurcnt]}}% + \ignoreemptyitems\setsepchar{,}% + \MelangeListe{\fuu}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}% + \readlist*\ListeMelangeeQuestions{\faa}% + \reademptyitems% +}% + +\newcommand\AffichageQuestions{% + \begin{enumerate} + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}}\do{% + \item\xdef\Compteur{\ListeMelangeeQuestions[##1]}\RetiensListeQuestions[\Compteur,1] + } + \end{enumerate} +} + +\newcommand\AffichageTableau{% + \begin{tabular}{|>{\PfCTBstrut$\square$~}m{\useKV[ClesEnquete]{Largeur}}|} + \hline + \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Perso}}\\ + \hline + \xintFor* ##1 in {\xintSeq{1}{\RetiensListePersonnageslen}}\do{% + \RetiensListePersonnages[##1]\xdef\PfCCompteurMelange{\ListeMelangeePersonnages[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\ + } + % + \hline + \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Objet}}\\ + \hline + \xintFor* ##1 in {\xintSeq{1}{\RetiensListeObjetslen}}\do{% + \RetiensListeObjets[##1]\xdef\PfCCompteurMelange{\ListeMelangeeObjets[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\ + } + % + \hline + \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Lieu}}\\ + \hline + \xintFor* ##1 in {\xintSeq{1}{\RetiensListeLieuxlen}}\do{% + \RetiensListeLieux[##1]\xdef\PfCCompteurMelange{\ListeMelangeeLieux[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2] + \\ + } + \hline + \end{tabular} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCFicheMemo.tex b/macros/latex/contrib/profcollege/latex/PfCFicheMemo.tex new file mode 100644 index 0000000000..511e47da2f --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCFicheMemo.tex @@ -0,0 +1,64 @@ +%%% +% Fiche m\'emorisation active +%%% +\setKVdefault[ClesFicheMemo]{TexteReponses=Réponses,TexteQuestions=Questions,Solution=false,Largeur=\linewidth} + +\newcommand\FicheMemo[3][]{% + \xdef\CountcolUn{0}% + \xdef\CountcolDeux{0}% + \useKVdefault[ClesFicheMemo]% + \setKV[ClesFicheMemo]{#1}% + \setsepchar[*]{§*/}\reademptyitems% + \readlist*\ListeQuestionColonneUn{#2}% + \readlist*\ListeQuestionColonneDeux{#3}% + \renewcommand{\arraystretch}{1.35}% + \begin{NiceTabular}[width=\useKV[ClesFicheMemo]{Largeur}]{X[1]X[1]X[1]X[1]}[hvlines] + \CodeBefore% + \rowcolor{gray!15}{1}% + \tikz\draw[dashed,gray!50](2-|1.5) to (last-|1.5);% + \tikz\draw[dashed,gray!50](2-|4.5) to (last-|4.5);% + \Body% + \Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}&&&\Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}\\ + \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{% + \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{% + \uppercase{&}}{% + \Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneUn[##1,3]}{}}% + \uppercase{&}\xdef\CountcolUn{\fpeval{\CountcolUn+1}}\Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ListeQuestionColonneUn[##1,2]}% + }% + &% + \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{% + \uppercase{&}% + }{% + \xdef\CountcolDeux{\fpeval{\CountcolDeux+1}}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ListeQuestionColonneDeux[##1,2]}\uppercase{&}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneDeux[##1,3]}{}}% + }% + \\% + }% + \CodeAfter% + \tikz\node[xshift=0.5em] at (2-|1) {\scriptsize\faCut};% + \xdef\PfCCountCutUn{2}% + \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{% + \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{% + }{% + \xdef\PfCCountCutUn{\fpeval{\PfCCountCutUn+\ListeQuestionColonneUn[##1,1]}}% + \tikz\node[xshift=0.5em] at (\fpeval{\PfCCountCutUn}-|1) {\scriptsize\faCut};% + }% + }% + \tikz\node[xshift=-0.5em] at (2-|last) {\scriptsize\rotatebox{180}{\faCut}};% + \xdef\PfCCountCutDeux{2}% + \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneDeuxlen}}\do{% + \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{% + }{% + \xdef\PfCCountCutDeux{\fpeval{\PfCCountCutDeux+\ListeQuestionColonneDeux[##1,1]}}% + \tikz\node[xshift=-0.5em] at (\fpeval{\PfCCountCutDeux}-|last) {\scriptsize\rotatebox{180}{\faCut}};% + }% + }% + \tikz\node[xshift=0.5em] at (1-|1) {\color{gray}\scriptsize\faCut};% + \tikz\node[xshift=0.5em] at (last-|1) {\color{gray}\scriptsize\faCut};% + \tikz\node[xshift=-0.5em] at (1-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};% + \tikz\node[xshift=-0.5em] at (last-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};% + \tikz\node at (1.5-|2.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} 1 à \num{\CountcolUn}};% + \tikz\node at (1.5-|3.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} \num{\fpeval{\CountcolUn+1}} à \num{\fpeval{\CountcolUn+\CountcolDeux}}};% + \end{NiceTabular}% + \renewcommand{\arraystretch}{1}% + \setsepchar{,}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCFonctionAffine.tex b/macros/latex/contrib/profcollege/latex/PfCFonctionAffine.tex new file mode 100644 index 0000000000..3c29cfcae3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCFonctionAffine.tex @@ -0,0 +1,360 @@ +%%% +% Fonction Affine +%%% +\setKVdefault[ClesAffine]{Nom=f,Variable=x,Ligne=false,Image=false,Antecedent=false,Graphique=false,Retrouve=false,ProgCalcul=false,Unitex=1,Unitey=1,VoirCoef=false,ACoef=0,Redaction=false,Ecriture=false,Definition=false}%ACoefficient=false%: inutile ? + +\newcommand\FonctionAffine[5][]{% + % #1 nombre ou abscisse premier point + % #2 a ou ordonn\'ee premier point + % #3 b ou abscisse deuxi\`eme point + % #4 {} ou ordonn\'ee deuxi\`eme point + \useKVdefault[ClesAffine]%A supprimer car appel r\'ecursif avec Redaction + \setKV[ClesAffine]{#1}% + \ifboolKV[ClesAffine]{Image}{% + \ifboolKV[ClesAffine]{Ligne}{% + \ensuremath{\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}=\num{\fpeval{#2*#3}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\xintifboolexpr{#4==0}{}{=\num{\fpeval{#2*#3+#4}}}}% + }{% + \ifboolKV[ClesAffine]{ProgCalcul}{% + \begin{align*} + \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}}\\ + \useKV[ClesAffine]{Nom}&:\num{#2}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{\fpeval{#3*#2+#4}}} + \end{align*} + }{% + \begin{align*} + \useKV[ClesAffine]{Nom}(\num{#2})&=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\\ + \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}%\\ + \xintifboolexpr{#4==0}{}{\\ + \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2+#4}}%\\ + } + \end{align*} + }% + }% + }{\ifboolKV[ClesAffine]{Antecedent}{% + \ifboolKV[ClesAffine]{ProgCalcul}{% + La fonction affine $\useKV[ClesAffine]{Nom}$ est d\'efinie par : + \begin{align*} + \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}} + \end{align*} + Nous cherchons le nombre $\useKV[ClesAffine]{Variable}$ tel que son image par la fonction $\useKV[ClesAffine]{Nom}$ soit $\num{#2}$. Donc on obtient : + \begin{align*} + \useKV[ClesAffine]{Nom}&:\frac{\num{\fpeval{#2-#4}}}{\num{#3}}\stackrel{\div\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longleftarrow}\num{\fpeval{#2-#4}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{-\num{#4}}{\longleftarrow}}{\stackrel{+\num{\fpeval{0-#4}}}{\longleftarrow}}\num{#2}} + \end{align*} + }{% + On cherche l'ant\'ec\'edent de $\num{#2}$ par la fonction + $\useKV[ClesAffine]{Nom}$, c'est-\`a-dire le nombre + $\useKV[ClesAffine]{Variable}$ tel que + $\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\num{#2}$. Or, + la fonction $\useKV[ClesAffine]{Nom}$ est d\'efinie par : \[% + \useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#3==0}{}{\num{#3}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#3==0}{\num{#4}}{\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}} + \] + Par cons\'equent, on a : + \begin{align*} + \num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}&=\num{#2}\\ + \xintifboolexpr{#4==0}{\useKV[ClesAffine]{Variable}\uppercase{&}=\frac{\num{#2}}{\num{#3}}%\\ + }{\num{#3}\useKV[ClesAffine]{Variable}&=\num{\fpeval{#2-#4}}\\ + \useKV[ClesAffine]{Variable}&=\frac{\num{\fpeval{#2-#4}}}{\num{#3}}%\\ + } + \end{align*} + }% + }{% + \ifboolKV[ClesAffine]{Retrouve}{% + On sait que $\useKV[ClesAffine]{Nom}$ est une fonction affine. Donc elle s'\'ecrit sous la forme : \[\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=a\useKV[ClesAffine]{Variable}+b\] + Or, $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$ et $\useKV[ClesAffine]{Nom}(\num{#4})=\num{#5}$. Par cons\'equent, d'apr\`es la propri\'et\'e des accroissements : + \begin{align*} + a&=\frac{\useKV[ClesAffine]{Nom}(\num{#2})-\useKV[ClesAffine]{Nom}(\num{#4})}{\num{#2}-\xintifboolexpr{#4<0}{(\num{#4})}{\num{#4}}}\\ + a&=\frac{\num{#3}-\xintifboolexpr{#5<0}{(\num{#5})}{\num{#5}}}{\num{\fpeval{#2-#4}}}\\ + a&=\frac{\num{\fpeval{#3-#5}}}{\num{\fpeval{#2-#4}}}%\\ + \SSimpliTest{\fpeval{#3-#5}}{\fpeval{#2-#4}}\ifthenelse{\boolean{Simplification}}{\\a&=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}}{}% + \end{align*} + La fonction $\useKV[ClesAffine]{Nom}$ s'\'ecrit alors sous la forme $\displaystyle\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}+b$. + \\De plus, comme $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$, alors : + \begin{align*} + \SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}+b&=\num{#3}\\ + \SSimplifie{\fpeval{(#3-#5)*#2}}{\fpeval{#2-#4}}+b&=\num{#3}\\ + b&=\num{\fpeval{#3-(#3-#5)*#2/(#2-#4)}} + \end{align*} + \xdef\OrdOrigine{\fpeval{#3-(#3-#5)*#2/(#2-#4)}} + La fonction affine $\useKV[ClesAffine]{Nom}$ cherch\'ee est : + \[\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}\xintifboolexpr{\OrdOrigine==0}{}{\xintifboolexpr{\OrdOrigine>0}{+\num{\OrdOrigine}}{-\num{\fpeval{0-\OrdOrigine}}}}\] + }{% + % + }% + }% + }% + \ifboolKV[ClesAffine]{Graphique}{% + \ifboolKV[ClesAffine]{VoirCoef}{% + \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{\useKV[ClesAffine]{ACoef}}% + }{% + \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{""}}{}% + }{}% + \ifboolKV[ClesAffine]{Redaction}{% + \xintifboolexpr{#2==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$ + est une fonction constante, alors sa repr\'esentation graphique est une droite parall\`ele \`a l'axe des abscisses passant par le point de coordonn\'ees $(0;\num{#3})$.}% + {\xintifboolexpr{#3==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$ est une fonction lin\'eaire, alors sa repr\'esentation graphique est une droite passant par l'origine du rep\`ere.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomFonctionA{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonctionA,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$. + }{% + Comme $\useKV[ClesAffine]{Nom}$ est une fonction affine, alors sa repr\'esentation graphique est une droite.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomVariable{\useKV[ClesAffine]{Variable}}\xdef\NomFonction{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonction,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$.\\Je choisis \setKV[ClesAffine]{Variable=\NomVariable}$\useKV[ClesAffine]{Variable}=\num{#5}$. Son image est \FonctionAffine[Nom=\NomFonction,Image,Ligne]{#5}{#2}{#3}{#4}. On place le point de coordonn\'ees $(\num{#5};\num{\fpeval{#2*#5+#3}})$.% + }% + }% + }% + {}% + \ifboolKV[ClesAffine]{Ecriture}{\ensuremath{\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}% + \ifboolKV[ClesAffine]{Definition}{\ensuremath{\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}% +}% + +\def\MPFonctionAffine#1#2#3#4#5#6#7{% + % #1 Unitex #2 Unitey + % #2 a pour f1 - #4 b pour f1 + % #5 abscisse du premier point + % #6 abscisse du deuxi\`eme point + \ifluatex + \mplibforcehmode + \begin{mplibcode} + XMin=-2; + XMax=2; + if #5<XMin: + XMin:=#5; + fi; + if #6<XMin: + XMin:=#6; + fi; + if #5>XMax: + XMax:=#5; + fi; + if #6>XMax: + XMax:=#6; + fi; + YMax=2; + YMin=-2; + if (#5*#3+(#4))>YMax: + YMax:=(#5*#3+(#4)); + fi; + if (#6*#3+(#4))>YMax: + YMax:=(#6*#3+(#4)); + fi; + if (#5*#3+(#4))<YMin: + YMin:=(#5*#3+(#4)); + fi; + if (#6*#3+(#4))<YMin: + YMin:=(#6*#3+(#4)); + fi; + unitex:=#1*cm; + unitey:=#2*cm; + XMax:=XMax+2; + XMin:=XMin-2; + YMax:=YMax+2; + YMin:=YMin-2; + %On trace la grille + drawoptions(withcolor 0.95white); + for k=0 upto (XMax-XMin): + draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey); + endfor; + for k=0 upto (YMax-YMin): + draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey); + endfor; + drawoptions(); + %On trace les axes + drawarrow (XMin*unitex,0)--(XMax*unitex,0); + drawarrow (0,YMin*unitey)--(0,YMax*unitey); + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,(unitex,0)); + dotlabel.lft(btex 1 etex,(0,unitey)); + % On trace la droite + pair A[]; + A1=(#5*unitex,(#5*#3+(#4))*unitey); + A2=(#6*unitex,(#6*#3+(#4))*unitey); + draw 2[A1,A2]--2[A2,A1]; + clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle); + %On labellise les points + fill (fullcircle scaled 1mm) shifted A1; + fill (fullcircle scaled 1mm) shifted A2; + draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly; + draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly; + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.top(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); + else: + label.bot(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.top(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); + else: + label.bot(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); + fi; + fi; + if #3=0: + label.urt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + if #3>0: + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + else: + label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + fi; + fi; + else: + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + else: + label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + fi; + fi; + fi; + fi; + % On affiche ou pas "la marche" du coef directeur + for p_=#7: + if numeric p_: + draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red; + fi; + endfor; + \end{mplibcode} + \else + \begin{mpost} + % On d\'efinit les constantes + XMin=-2; + XMax=2; + if #5<XMin: + XMin:=#5; + fi; + if #6<XMin: + XMin:=#6; + fi; + if #5>XMax: + XMax:=#5; + fi; + if #6>XMax: + XMax:=#6; + fi; + YMax=2; + YMin=-2; + if (#5*#3+(#4))>YMax: + YMax:=(#5*#3+(#4)); + fi; + if (#6*#3+(#4))>YMax: + YMax:=(#6*#3+(#4)); + fi; + if (#5*#3+(#4))<YMin: + YMin:=(#5*#3+(#4)); + fi; + if (#6*#3+(#4))<YMin: + YMin:=(#6*#3+(#4)); + fi; + unitex:=#1*cm; + unitey:=#2*cm; + XMax:=XMax+2; + XMin:=XMin-2; + YMax:=YMax+2; + YMin:=YMin-2; + %On trace la grille + drawoptions(withcolor 0.95white); + for k=0 upto (XMax-XMin): + draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey); + endfor; + for k=0 upto (YMax-YMin): + draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey); + endfor; + drawoptions(); + %On trace les axes + drawarrow (XMin*unitex,0)--(XMax*unitex,0); + drawarrow (0,YMin*unitey)--(0,YMax*unitey); + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,(unitex,0)); + dotlabel.lft(btex 1 etex,(0,unitey)); + % On trace la droite + pair A[]; + A1=(#5*unitex,(#5*#3+(#4))*unitey); + A2=(#6*unitex,(#6*#3+(#4))*unitey); + draw 2[A1,A2]--2[A2,A1]; + clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle); + %On labellise les points + fill (fullcircle scaled 1mm) shifted A1; + fill (fullcircle scaled 1mm) shifted A2; + draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly; + draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly; + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.top(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); + else: + label.bot(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.top(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); + else: + label.bot(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); + fi; + fi; + if #3=0: + label.urt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + if #3>0: + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + else: + label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + fi; + fi; + else: + if (#5*#3+(#4))=0: + else: + if (#5*#3+(#4))<0: + label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + else: + label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); + fi; + fi; + if (#6*#3+(#4))=0: + else: + if (#6*#3+(#4))<0: + label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + else: + label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); + fi; + fi; + fi; + fi; + % On affiche ou pas "la marche" du coef directeur + for p_=#7: + if numeric p_: + draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red; + fi; + endfor; + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCFrise.tex b/macros/latex/contrib/profcollege/latex/PfCFrise.tex new file mode 100644 index 0000000000..a07d2a931b --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCFrise.tex @@ -0,0 +1,233 @@ +%%% +% Frise temporelle +%%% +\setKVdefault[ClesFrise]{Longueur=8cm,Fleches=false,Ecart=5mm,Sup=false}% + +\newtoks\toklistefrise% +\def\UpdatetoksFrise#1/#2/#3\nil{\addtotok\toklistefrise{"#1","#2","#3",}}% + +\newcommand\Frise[2][]{% + \useKVdefault[ClesFrise]% + \setKV[ClesFrise]{#1}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeTempo{#2}% + \toklistefrise{}% + \foreachitem\compteur\in\ListeTempo{\expandafter\UpdatetoksFrise\compteur\nil} + \MPDessineFrise{\the\toklistefrise}% +} + +\newcommand\MPDessineFrise[1]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + Longueur:=\useKV[ClesFrise]{Longueur}; + Ecart:=\useKV[ClesFrise]{Ecart}; + boolean Fleches; + Fleches=\useKV[ClesFrise]{Fleches}; + boolean Sup; + Sup=\useKV[ClesFrise]{Sup}; + pair A[],B; + A0=(0,0); + B-A0=(Longueur,0); + n=0; + for p_=#1: + n:=n+1; + endfor; + for k=1 upto ((n div 3)-2): + A[k]=(k/((n div 3)-1))[A0,B]; + endfor; + A[(n div 3)-1]=B; + if Sup: + for k=0 upto ((n div 3)-1): + trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; + endfor; + % on définit les points milieu des fleches + path Fleche[]; + pair C[]; + for k=0 upto ((n div 3)-3): + Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); + C[k]=point (0.5*length Fleche[k]) of Fleche[k]; + endfor; + Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart)); + chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart)); + C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2]; + Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); + C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1]; + % + maxx:=n; + trace segment(A0,A[(n div 3)-2]); + trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly; + n:=0; + labeloffset:=labeloffset*2; + for p_=#1: + n:=n+1; + if n<maxx+1: + if (n mod 3)=1: + label.top(TEX(""&p_&""),A[n div 3]); + elseif (n mod 3)=2: + label.top(TEX(""&p_&""),C[n div 3]);% + elseif (n mod 3)=0: + label.bot(TEX(""&p_&""),C[(n div 3)-1]); + fi; + fi; + endfor; + drawoptions(); + labeloffset:=labeloffset/2; + if Fleches: + for k=0 upto ((n div 3)-4): + drawarrow Fleche[k]; + endfor; + drawarrow Fleche[(n div 3)-1]; + drawarrow Fleche[(n div 3)-2]; + drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); + for k=0 upto ((n div 3)-2): + draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; + endfor; + draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; + fi; + %fin Sup + else: + for k=0 upto ((n div 3)-1): + trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; + endfor; + % on définit les points milieu des fleches + path Fleche[]; + pair C[]; + for k=0 upto ((n div 3)-2): + Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); + C[k]=point (0.5*length Fleche[k]) of Fleche[k]; + endfor; + maxx:=n; + trace segment(A0,A[(n div 3)-1]); + n:=0; + labeloffset:=labeloffset*2; + for p_=#1: + n:=n+1; + if n<maxx: + if (n mod 3)=1: + label.top(TEX(""&p_&""),A[n div 3]); + elseif (n mod 3)=2: + if (n div 3)<((maxx div 3)-1):label.top(TEX(""&p_&""),C[n div 3]);fi; + elseif (n mod 3)=0: + label.bot(TEX(""&p_&""),C[(n div 3)-1]); + fi; + fi; + endfor; + labeloffset:=labeloffset/2; + if Fleches: + for k=0 upto ((n div 3)-2): + draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; + drawarrow Fleche[k]; + endfor; + draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; + fi; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + Longueur:=\useKV[ClesFrise]{Longueur}; + Ecart:=\useKV[ClesFrise]{Ecart}; + boolean Fleches; + Fleches=\useKV[ClesFrise]{Fleches}; + boolean Sup; + Sup=\useKV[ClesFrise]{Sup}; + }] + pair A[],B; + A0=(0,0); + B-A0=(Longueur,0); + n=0; + for p_=#1: + n:=n+1; + endfor; + for k=1 upto ((n div 3)-2): + A[k]=(k/((n div 3)-1))[A0,B]; + endfor; + A[(n div 3)-1]=B; + if Sup: + for k=0 upto ((n div 3)-1): + trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; + endfor; + % on définit les points milieu des fleches + path Fleche[]; + pair C[]; + for k=0 upto ((n div 3)-3): + Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); + C[k]=point (0.5*length Fleche[k]) of Fleche[k]; + endfor; + Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart)); + chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart)); + C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2]; + Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); + C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1]; + % + maxx:=n; + trace segment(A0,A[(n div 3)-2]); + trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly; + n:=0; + labeloffset:=labeloffset*2; + for p_=#1: + n:=n+1; + if n<maxx+1: + if (n mod 3)=1: + label.top(LATEX(""&p_&""),A[n div 3]); + elseif (n mod 3)=2: + label.top(LATEX(""&p_&""),C[n div 3]);% + elseif (n mod 3)=0: + label.bot(LATEX(""&p_&""),C[(n div 3)-1]); + fi; + fi; + endfor; + drawoptions(); + labeloffset:=labeloffset/2; + if Fleches: + for k=0 upto ((n div 3)-4): + drawarrow Fleche[k]; + endfor; + drawarrow Fleche[(n div 3)-1]; + drawarrow Fleche[(n div 3)-2]; + drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); + for k=0 upto ((n div 3)-2): + draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; + endfor; + draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; + fi; + %fin Sup + else: + for k=0 upto ((n div 3)-1): + trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; + endfor; + % on définit les points milieu des fleches + path Fleche[]; + pair C[]; + for k=0 upto ((n div 3)-2): + Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); + C[k]=point (0.5*length Fleche[k]) of Fleche[k]; + endfor; + maxx:=n; + trace segment(A0,A[(n div 3)-1]); + n:=0; + labeloffset:=labeloffset*2; + for p_=#1: + n:=n+1; + if n<maxx: + if (n mod 3)=1: + label.top(LATEX(""&p_&""),A[n div 3]); + elseif (n mod 3)=2: + if (n div 3)<((maxx div 3)-1):label.top(LATEX(""&p_&""),C[n div 3]);fi; + elseif (n mod 3)=0: + label.bot(LATEX(""&p_&""),C[(n div 3)-1]); + fi; + fi; + endfor; + labeloffset:=labeloffset/2; + if Fleches: + for k=0 upto ((n div 3)-2): + draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; + drawarrow Fleche[k]; + endfor; + draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; + fi; + fi; + \end{mpost} + \fi +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCFutoshiki.tex b/macros/latex/contrib/profcollege/latex/PfCFutoshiki.tex new file mode 100644 index 0000000000..4603265e0e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCFutoshiki.tex @@ -0,0 +1,87 @@ +%%% +% Futoshiki +%%% +\setKVdefault[Futo]{Largeur=15pt,Solution=false,CouleurSolution=Black,CouleurCase=Cornsilk,StyleTexte={}} + +\newlength\PfCFutoHeight + +\NewDocumentCommand\Futoshiki{o m}{% + \useKVdefault[Futo] + \setKV[Futo]{#1}% + \setlength{\PfCFutoHeight}{\useKV[Futo]{Largeur}+\tabcolsep}% + \setsepchar{\\/,}% + \readlist\ListeFuto{#2}% + \xdef\PfCTailleFuto{\ListeFutolen}% + \def\PfCFutoStyleTexte{\useKV[Futo]{StyleTexte}}% + \colorlet{PfCFutoCase}{\useKV[Futo]{CouleurCase}}% + \begin{NiceTabular}{*{\fpeval{\PfCTailleFuto-1}}{m{\useKV[Futo]{Largeur}}m{5pt}}m{\useKV[Futo]{Largeur}}}%[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\PfCTailleFuto}}\do{% + \xintFor* ##2 in{\xintSeq{1}{\PfCTailleFuto}}\do{% + \rule{0pt}{\PfCFutoHeight}% + \StrChar{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCCaracFuto]% + \IfStrEq{\PfCCaracFuto}{*}{% + \StrGobbleLeft{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCResteFuto]% + \Block[draw]{}{\PfCFutoStyleTexte\PfCResteFuto}% + }{% + \IfStrEq{\PfCCaracFuto}{!}{% + \StrGobbleLeft{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCResteFuto]% + \Block[draw,fill=PfCFutoCase]{}{\PfCFutoStyleTexte\PfCResteFuto}% + }{% + \ifboolKV[Futo]{Solution}{\Block[draw]{}{\PfCFutoStyleTexte\color{\useKV[Futo]{CouleurSolution}}\ListeFuto[##1,\fpeval{2*##2-1}]}}{\Block[draw]{}{}}% + }% + }% + \xintifForLast{}{&&}% + }\\ + \rule{0pt}{\fpeval{5pt+\tabcolsep}pt}\Block[]{}{}\\ + }% + \CodeAfter%Pour écrire les symboles + \xintFor* ##1 in{\xintSeq{1}{\PfCTailleFuto}}\do{% + \xintFor* ##2 in{\xintSeq{1}{\PfCTailleFuto}}\do{% + \IfStrEq{\ListeFuto[##1,2*##2]}{>}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{<}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{v}{% + \tikz{% + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{A}{% + \tikz{% + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{>A}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{>v}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{<A}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); + }% + }{}% + \IfStrEq{\ListeFuto[##1,2*##2]}{<v}{% + \tikz{% + \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); + \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); + }% + }{}% + }% + }% + \end{NiceTabular} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCGaram.tex b/macros/latex/contrib/profcollege/latex/PfCGaram.tex new file mode 100644 index 0000000000..1bcd3ddab3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCGaram.tex @@ -0,0 +1,51 @@ +%%% +% Garam +%%% +\setKVdefault[Garam]{Taille=7,Largeur=15pt,Solution=false,CouleurSolution=Black} +\newlength\PfCGaramHeight + +\NewDocumentCommand\Garam{o m}{% + \useKVdefault[Garam] + \setKV[Garam]{#1}% + \setlength{\PfCGaramHeight}{\useKV[Garam]{Largeur}+\tabcolsep}% + \reademptyitems% + \setsepchar[*]{§*,*/}% + \readlist*\PfCListeGaram{#2}% + \colorlet{PfCGaramCoulSol}{\useKV[Garam]{CouleurSolution}}% + \begin{NiceTabular}{*{\useKV[Garam]{Taille}}{m{\useKV[Garam]{Largeur}}}} + \CodeBefore + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Garam]{Taille}}}}\do{% + \tikz{\draw[dashed,LightGray] (1-|##1)--(last-|##1);}% + }% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\PfCListeGaramlen-1}}}\do{% + \tikz{\draw[dashed,LightGray] (##1-|1)--(##1-|last);}% + }% + \tikz{\draw (1-|1) rectangle (last-|last);}% + \Body + \xintFor* ##1 in{\xintSeq{1}{\PfCListeGaramlen}}\do{% + \rule{0pt}{\PfCGaramHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Garam]{Taille}}}\do{% + \xintifForFirst{}{&}\StrChar{\PfCListeGaram[##1,##2,1]}{1}[\PfCCaracGaram]% + \IfStrEq{\PfCCaracGaram}{*}{\Block[draw,fill=black]{1-1}{}}{% + \IfStrEq{\PfCCaracGaram}{!}{\Block{}{\ifboolKV[Garam]{Solution}{\StrGobbleLeft{\PfCListeGaram[##1,##2,1]}{1}}{}}}{\Block{}{\color{PfCGaramCoulSol}\PfCListeGaram[##1,##2,1]}}% + }% + }\\ + }% + \CodeAfter + % On place les symboles + \xintFor* ##1 in{\xintSeq{1}{\PfCListeGaramlen}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[Garam]{Taille}}}\do{% + \StrChar{\PfCListeGaram[##1,##2,1]}{1}[\PfCCaracGaram]% + \IfStrEq{\PfCCaracGaram}{*}{}{% + \tikz{% + \StrSubstitute{\PfCListeGaram[##1,##2,2]}{x}{\times}[\PfCGaramUn]% + \StrSubstitute{\PfCGaramUn}{:}{\div}[\PfCGaramUn]% + \StrSubstitute{\PfCListeGaram[##1,##2,3]}{x}{\times}[\PfCGaramDeux]% + \StrSubstitute{\PfCGaramDeux}{:}{\div}[\PfCGaramDeux]% + \xintifForLast{}{\node at (\fpeval{##1+0.5}-|\fpeval{##2+1}) {$\PfCGaramUn$};} + \node at (\fpeval{##1+1}-|\fpeval{##2+0.5}) {$\PfCGaramDeux$}; + }% + }% + }% + }% + \end{NiceTabular} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCGeometrie.tex b/macros/latex/contrib/profcollege/latex/PfCGeometrie.tex new file mode 100644 index 0000000000..dc1fd8e993 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCGeometrie.tex @@ -0,0 +1,61 @@ +%%% +% Geometrie +%%% +\setKVdefault[Geometrie]{CoinBG={(0,0)},CoinHD={(10u,10u)},TypeTrace="Instruments"}% + +\ifluatex +\NewDocumentEnvironment{Geometrie}{o +b}{% + \useKVdefault[Geometrie]% + \setKV[Geometrie]{#1}% + \mplibforcehmode + \begin{mplibcode} + % input PfCMPFr; + pair Coinbg,Coinhd; + Coinbg=\useKV[Geometrie]{CoinBG}; + Coinhd=\useKV[Geometrie]{CoinHD}; + if \useKV[Geometrie]{TypeTrace}="Instruments": + typetrace:="normal"; + elseif \useKV[Geometrie]{TypeTrace}="MainLevee": + typetrace:="mainlevee"; + elseif \useKV[Geometrie]{TypeTrace}="Espace": + typetrace:="3D"; + typerepre:="persp"; + fi; + xa=xpart(Coinbg); + xb=xpart(Coinhd); + ya=ypart(Coinbg); + yb=ypart(Coinhd); + feuille(xa,ya,xb,yb); + _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi; + _tfig:=2*_tfig; + #2% + \end{mplibcode} +}{} +\else +\NewDocumentEnvironment{Geometrie}{o +b}{% + \useKVdefault[Geometrie]% + \setKV[Geometrie]{#1}% + \begin{mpost}[mpsettings={ + pair Coinbg,Coinhd; + Coinbg=\useKV[Geometrie]{CoinBG}; + Coinhd=\useKV[Geometrie]{CoinHD}; + if \useKV[Geometrie]{TypeTrace}="Instruments": + typetrace:="normal"; + elseif \useKV[Geometrie]{TypeTrace}="MainLevee": + typetrace:="mainlevee"; + elseif \useKV[Geometrie]{TypeTrace}="Espace": + typetrace:="3D"; + typerepre:="persp"; + fi;} + ]% + xa=xpart(Coinbg); + xb=xpart(Coinhd);; + ya=ypart(Coinbg); + yb=ypart(Coinhd); + feuille(xa,ya,xb,yb); + _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi; + _tfig:=2*_tfig; + #2% + \end{mpost} +}{} +\fi%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCGrades.tex b/macros/latex/contrib/profcollege/latex/PfCGrades.tex new file mode 100644 index 0000000000..6155c43ca1 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCGrades.tex @@ -0,0 +1,104 @@ +%%% +% Grades +%%% +\setKVdefault[Grades]{Solution=false,Longueur=9,Largeur=9,Echelle=8mm,Graines=false} +\defKV[Grades]{Graine=\setKV[Grades]{Graines}} + +\NewDocumentCommand\Grades{o}{% + \useKVdefault[Grades]% + \setKVdefault[Grades]{#1}% + \BuildGrades% +} + +\NewDocumentCommand\BuildGrades{}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution; + Graines=\useKV[Grades]{Graines}; + Solution=\useKV[Grades]{Solution}; + + if Graines: + randomseed:=\useKV[Grades]{Graine}; + fi; + + numeric Longueur,Largeur; + Longueur=\useKV[Grades]{Longueur}; + Largeur=\useKV[Grades]{Largeur}; + + u:=\useKV[Grades]{Echelle}; + + p:=0; + pair A[];%centre des carrés. + boolean Allume[][]; + numeric Nombre[][]; + + for k=-1 upto Largeur+1: + for l=-1 upto Longueur+1: + Allume[k][l]=false; + endfor; + endfor; + + for k=0 upto Longueur-1: + for l=0 upto Largeur-1: + p:=p+1; + A[p]=u*(k,-l); + trace (unitsquare scaled u) shifted A[p]; + endfor; + endfor; + + for k=0 upto Largeur-1: + for l=0 upto Longueur-1: + if Allume[k][l]: + else: + Allume[k][l]:=true; + m:=uniformdeviate(1); + if m<0.5: + % on ne met pas de nombre + else: + % on met un nombre + Nombre[k][l]=floor(1+uniformdeviate(9)); + Allume[k][l+1]:=true; + Allume[k+1][l-1]:=true; + Allume[k+1][l]:=true; + Allume[k+1][l+1]:=true; + if Solution: + label(TEX(decimal(Nombre[k][l])),u*(l+0.5,-k+0.5)); + fi; + fi; + fi; + endfor; + endfor; + + % on compte le nombre de chiffres dans les lignes et on les ajoute + for k=0 upto Largeur-1: + p:=0; + Somme:=0; + for l=0 upto Longueur-1: + if unknown Nombre[k][l]: + else: + p:=p+1; + Somme:=Somme+Nombre[k][l]; + fi; + endfor; + label(TEX(decimal(p)),u*(-0.5,-k+0.5)); + label(TEX(decimal(Somme)),u*(Longueur+0.5,-k+0.5)); + endfor; + + % on compte le nombre de chiffres dans les colonnes et on les ajoute + for k=0 upto Longueur-1: + p:=0; + Somme:=0; + for l=0 upto Largeur-1: + if unknown Nombre[l][k]: + else: + p:=p+1; + Somme:=Somme+Nombre[l][k]; + fi; + endfor; + label(TEX(decimal(p)),u*(k+0.5,1.5)); + label(TEX(decimal(Somme)),u*(k+0.5,-Largeur+0.5)); + endfor; + \end{mplibcode} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCHiddenMessage.tex b/macros/latex/contrib/profcollege/latex/PfCHiddenMessage.tex new file mode 100644 index 0000000000..f472e07844 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCHiddenMessage.tex @@ -0,0 +1,52 @@ +%%% +% Message caché +%%% +\setKVdefault[Hidden]{TLargeur=5,THauteur=3,Solution=false,Hauteur=70pt,Largeur=120pt,Jeu=false,Solution} +\defKV[Hidden]{Plateau=\setKV[Hidden]{Jeu}\setKV[Hidden]{Solution=false}} + +\newlength\PfCHiddenHeight% +\newlength\PfCHiddenWidth% + +\NewDocumentCommand\MessageCache{o m m}{%1 options 2 questions/réponses 3 message + % on récupère les options + \useKVdefault[Hidden]% + \setKV[Hidden]{#1}% + % on définit les dimensions des cases + \setlength{\PfCHiddenHeight}{\useKV[Hidden]{Hauteur}+\tabcolsep}% + \setlength{\PfCHiddenWidth}{\useKV[Hidden]{Largeur}}% + % On récupère les questions + \setsepchar[*]{§*/}% + \readlist*\PfCHiddenQuestions{#2}% + \setsepchar{,} + \ifboolKV[Hidden]{Solution}{% + % On donne les questions et la phrase + \begin{center} + \begin{NiceTabular}{*{\useKV[Hidden]{TLargeur}}{m{\PfCHiddenWidth}}}%[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% + \rule{0pt}{\PfCHiddenHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Hidden]{TLargeur}}}\do{% + \Block[draw]{1-1}{\PfCHiddenQuestions[\fpeval{\useKV[Hidden]{THauteur}*(##1-1)+##2},1]}\xintifForLast{}{&} + }\\ + }% + \CodeAfter% + \StrGobbleLeft{#3}{0}[\PhraseCorrection]% + \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% + \xintFor* ##2 in{\xintSeq{1}{\fpeval{\useKV[Hidden]{TLargeur}-1}}}\do{% + \StrLeft{\PhraseCorrection}{1}[\LettreAAfficher]\StrGobbleLeft{\PhraseCorrection}{1}[\PhraseCorrection]% + \tikz{\node[anchor=south] at (\fpeval{##1+1}-|\fpeval{##2+1}) {\huge\bfseries\LettreAAfficher};}% + }% + }% + \end{NiceTabular} + \end{center} + }{% + % On donne le plateau des solutions + \begin{center} + \begin{NiceTabular}{*{\useKV[Hidden]{TLargeur}}{m{\PfCHiddenWidth}}}%[hvlines] + \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% + \rule{0pt}{\PfCHiddenHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Hidden]{TLargeur}}}\do{% + \Block[draw]{1-1}{\PfCHiddenQuestions[\fpeval{\useKV[Hidden]{THauteur}*(##1-1)+##2},2]}\xintifForLast{}{&} + }\\ + }% + \end{NiceTabular} + \end{center} + } +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCKakurasu.tex b/macros/latex/contrib/profcollege/latex/PfCKakurasu.tex new file mode 100644 index 0000000000..944d295e8f --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCKakurasu.tex @@ -0,0 +1,108 @@ +%%% +% Kakurasu +%%% +\setKVdefault[Kakurasu]{Solution=false,Longueur=6,Largeur=6,Echelle=8mm,Graines=false,Trace=false} +\defKV[Kakurasu]{Graine=\setKV[Kakurasu]{Graines}} +\defKV[Kakurasu]{Traces=\setKV[Kakurasu]{Trace}} + +\NewDocumentCommand\Kakurasu{o}{% + \useKVdefault[Kakurasu]% + \setKVdefault[Kakurasu]{#1}% + \BuildKakurasu% +} + +\NewDocumentCommand\BuildKakurasu{}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Graines,Solution,Trace; + Graines=\useKV[Kakurasu]{Graines}; + Solution=\useKV[Kakurasu]{Solution}; + Trace=\useKV[Kakurasu]{Trace}; + + if Graines: + randomseed:=\useKV[Kakurasu]{Graine}; + fi; + + numeric Longueur,Largeur; + Longueur=\useKV[Kakurasu]{Longueur}; + Largeur=\useKV[Kakurasu]{Largeur}; + + u:=\useKV[Kakurasu]{Echelle}; + + pair A[][];%centre des carrés. + boolean Allume[][]; + numeric NombreLigne[][],NombreColonne[][]; + + for k=-1 upto Largeur+1: + for l=-1 upto Longueur+1: + Allume[k][l]=false; + endfor; + endfor; + + for k=0 upto Largeur-1: + for l=0 upto Longueur-1: + A[k][l]=u*(l,-k); + trace (unitsquare scaled u) shifted A[k][l]; + endfor; + endfor; + + for k=0 upto Largeur-1: + for l=0 upto Longueur-1: + if Allume[k][l]: + else: + Allume[k][l]:=true; + m:=uniformdeviate(1); + if m<0.5: + % on ne met pas de case noire + else: + % on met une case noire + NombreLigne[k][l]=l+1; + NombreColonne[k][l]=k+1; + if Solution: + fill (unitsquare scaled 0.9u) shifted (A[k][l]+0.05*u*(1,1)); + fi; + fi; + fi; + endfor; + endfor; + + % on compte le nombre de chiffres dans les lignes et on les ajoute + for k=0 upto Largeur-1: + Somme:=0; + for l=0 upto Longueur-1: + if unknown NombreLigne[k][l]: + else: + Somme:=Somme+NombreLigne[k][l]; + fi; + endfor; + label(TEX(decimal(Somme)),u*(-0.5,-k+0.5)); + endfor; + + % on compte le nombre de chiffres dans les colonnes et on les ajoute + for k=0 upto Longueur-1: + Somme:=0; + for l=0 upto Largeur-1: + if unknown NombreColonne[l][k]: + else: + Somme:=Somme+NombreColonne[l][k]; + fi; + endfor; + label(TEX(decimal(Somme)),u*(k+0.5,1.5)); + endfor; + + % On affiche les valeurs des cases noires. + drawoptions(withcolor 0.5white); + for k=0 upto Longueur-1: + label(TEX("\footnotesize"&decimal(k+1)),u*(k+0.5,-Largeur+0.5)); + endfor; + for k=0 upto Largeur-1: + label(TEX("\footnotesize"&decimal(k+1)),u*(Longueur+0.5,-k+0.5)); + endfor; + drawoptions(); + if Trace: + \useKV[Kakurasu]{Traces}; + fi; + \end{mplibcode} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCKakuro.tex b/macros/latex/contrib/profcollege/latex/PfCKakuro.tex new file mode 100644 index 0000000000..9f2d7bf47a --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCKakuro.tex @@ -0,0 +1,51 @@ +%%% +% Kakuro +%%% +\setKVdefault[Kakuro]{CouleurCase=LightGray,TLargeur=5,THauteur=5,Solution=false,Largeur=2em,Aide=false,CouleurSolution=Black,Tailles=false}%,Taille=5 +\defKV[Kakuro]{ListeNombres=\setKV[Kakuro]{Aide}}% +\defKV[Kakuro]{Taille=\setKV[Kakuro]{Tailles}}% + +\newlength\PfCKakuro% + +\NewDocumentCommand\Kakuro{o m}{% + \useKVdefault[Kakuro]% + \setKV[Kakuro]{#1}% + \ifboolKV[Kakuro]{Tailles}{% + \setKV[Kakuro]{THauteur=\useKV[Kakuro]{Taille}}% + \setKV[Kakuro]{TLargeur=\useKV[Kakuro]{Taille}}% + }{}% + \setlength{\PfCKakuro}{\useKV[Kakuro]{Largeur}+\tabcolsep}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesKK{#2}% + \setsepchar{,}% + \xdef\ListeAvantNombres{\useKV[Kakuro]{ListeNombres}}% + \readlist*\ListeKakuroNombres{\ListeAvantNombres}% + \savecomparemode% + \comparestrict% + \begin{NiceTabular}{*{\useKV[Kakuro]{TLargeur}}{m{\useKV[Kakuro]{Largeur}}}}[hvlines] + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Kakuro]{THauteur}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[Kakuro]{TLargeur}}}\do{% + \rule{0pt}{\PfCKakuro}% + \StrCompare{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}{*}[\PfCTestBlack] + \xintifboolexpr{\PfCTestBlack==0}{% + \Block[fill=black]{1-1}{}% + }{% + \xintifboolexpr{\listlen\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2}]==2}{ + \Block[fill=\useKV[Kakuro]{CouleurCase}]{1-1}{\diagbox{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},2]}}% + }{% + \Block{1-1}{\ifboolKV[Kakuro]{Solution}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}}{% + \ifboolKV[Kakuro]{Aide}{% + \xintFor* ##3 in{\xintSeq{1}{\ListeKakuroNombreslen}}\do{% + \Block{1-1}{\xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]==\ListeKakuroNombres[##3]}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}}{}}% + }% + }{}% + }% + }% + }% + }% + \xintifForLast{\\}{&}% + }% + }% + \end{NiceTabular} + \restorecomparemode% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCKenKen.tex b/macros/latex/contrib/profcollege/latex/PfCKenKen.tex new file mode 100644 index 0000000000..60f072b208 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCKenKen.tex @@ -0,0 +1,86 @@ +%%% +% KenKen +%%% +\setKVdefault[ClesKK]{Solution=false,Taille=3,Largeur=2em,Aide=false}% +\defKV[ClesKK]{Nombre=\setKV[ClesKK]{Aide}}% + +\newlength\PfCKenKen + +\NewDocumentCommand\KenKen{o m}{% + \useKVdefault[ClesKK]% + \setKV[ClesKK]{#1}% + \setlength{\PfCKenKen}{\useKV[ClesKK]{Largeur}+\tabcolsep}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesKK{#2}% + \savecomparemode% + \comparestrict% + \begin{NiceTabular}{*{\useKV[ClesKK]{Taille}}{m{\useKV[ClesKK]{Largeur}}}}% + \CodeBefore + \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{% + \tikz\draw[gray] (##1-|1) -- (##1-|last);% + \tikz\draw[gray] (1-|##1) -- (last-|##1);% + }% + \Body + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[ClesKK]{Taille}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{% + \rule{0pt}{\PfCKenKen}% + \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{b}[\PfCTestb]%\PfCTestb + \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{l}[\PfCTestl]%\PfCTestr + \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]%\PfCTestbr + \xintifboolexpr{\PfCTestb==0}{% + \Block[borders={bottom},line-width=2pt]{1-1}{% + \ifboolKV[ClesKK]{Solution}{% + \Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% + }{% + \ifboolKV[ClesKK]{Aide}{% + \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \xintifboolexpr{\PfCTestl==0}{% + \Block[borders={left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% + \ifboolKV[ClesKK]{Aide}{% + \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \xintifboolexpr{\PfCTestlb==0}{% + \Block[borders={bottom,left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% + \ifboolKV[ClesKK]{Aide}{% + \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \Block{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% + \ifboolKV[ClesKK]{Aide}{% + \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% + }{}% + }{}% + }% + }% + }% + }% + }% + \xintifForLast{\\}{&}% + }% + }% + \CodeAfter% + \tikz\draw[line width=2pt] (1-|1) rectangle (last-|last);% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{% + \tikz\node[anchor=west,inner sep=0pt,xshift=1mm,yshift=-0.2\PfCKenKen] at (##1 -|##2) {\scriptsize$\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*(##1-1)+##2},2]$};% + }% + }% + \end{NiceTabular} + \restorecomparemode% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCLabyrintheJeu.tex b/macros/latex/contrib/profcollege/latex/PfCLabyrintheJeu.tex new file mode 100644 index 0000000000..da8b011cc6 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCLabyrintheJeu.tex @@ -0,0 +1,143 @@ +%%% +% Labyrinthe +%%% +\setKVdefault[Labyrinthe]{Lignes=6,Colonnes=3,Longueur=4,Hauteur=2,Passages=false,EcartH=1,EcartV=1,CouleurF=gray!50,Texte=\color{black},SensImpose=false,Slop} + +\tikzset{FDirect/.style={-stealth}} +\tikzset{FIndirect/.style={stealth-}} +\tikzset{FBidirect/.style={stealth-stealth}} + +\newlength{\LabyLongCM} + +\newcommand\Labyrinthe[3][]{% + \useKVdefault[Labyrinthe]% + \setKV[Labyrinthe]{#1}% + \setsepchar[*]{,*/}% + \readlist*\ListeLaby{#2}% + \xdef\LabySlop{\ifboolKV[Labyrinthe]{Slop}{sloped}{}}% + \ifboolKV[Labyrinthe]{Passages}{% + \readlist*\ListeLabySol{#3}% + }{}% + \xdef\LabyLong{\useKV[Labyrinthe]{Longueur}}% +% \setlength{\LabyLongCM}{\fpeval{\LabyLong*28.3465}pt}% + \xdef\LabyHaut{\useKV[Labyrinthe]{Hauteur}}% + \ifboolKV[Labyrinthe]{SensImpose}{% + \xdef\TotalLaby{\fpeval{4*(\useKV[Labyrinthe]{Colonnes}-1)+1}}% + }{% + \xdef\TotalLaby{\fpeval{3*\useKV[Labyrinthe]{Colonnes}-2}}% + }% + \xdef\CouleurF{\useKV[Labyrinthe]{CouleurF}}% + \xdef\MotifTexte{\noexpand\useKV[Labyrinthe]{Texte}}% + \xintifboolexpr{\ListeLabylen==\fpeval{\useKV[Labyrinthe]{Lignes}*\useKV[Labyrinthe]{Colonnes}}}{% + \begin{tikzpicture}[remember picture]% +% % on dessine les cadres + \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% + \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% + \xdef\ColorFill{\ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},2]}% + \node[fill=\ColorFill,draw,minimum height=\LabyHaut*1cm,minimum width=\LabyLong*1cm,name=A-\compteurh-\compteurv] at + (\fpeval{\LabyLong+\useKV[Labyrinthe]{EcartH}}*\compteurh,-\fpeval{\LabyHaut+\useKV[Labyrinthe]{EcartV}}*\compteurv) {% +% \begin{minipage}{\LabyLongCM} + \ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},1]% +% \end{minipage} + };% + }% + }% + % fin des cadres + % on dessine les fl\`eches + \ifboolKV[Labyrinthe]{SensImpose}{% + %verticales + \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% + \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},1]}% + \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% + \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,midway,inner sep=2pt]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});}{}% + }{% + \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});% + }% + }% + }% +% % horizontales + \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},1]}% + \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% + \draw[\CouleurF,line width=3pt,\NomStyle](A-\compteurh-\compteurv) -- node[fill=white,midway,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv);}{} + }{% + \draw[\CouleurF,line width=3pt,FBidirect](A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv);% + }% + }% + }% +% % diagonales "inverses" + \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},1]}% + \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% + \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); + }{} + }{% + \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); + }% + }% + }% +%% % diagonales directes + \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},1]}% + \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]>0}{% + \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}} + \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); + }{}% + }{% + \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); + }% + }% + }% + }{% + \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% + \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)}]}% + \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});% + }{% + \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});% + }% + }% + }% + \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\compteurh}]}% + \draw[\CouleurF,line width=3pt,stealth-stealth] + (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv); + }{% + \draw[\CouleurF,line width=3pt,stealth-stealth] + (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv); + }% + } + } + \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); + } + } + \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% + \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% + \ifboolKV[Labyrinthe]{Passages}{% + \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)+1}]}% + \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); + }{% + \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); + }% + }% + }% +% % fin des fl\`eches + } + \end{tikzpicture} + }{ + \textbf{! Le nombre d'informations n'est pas compatible avec les + d\'efinitions de {\ttfamily Colonnes} et {\ttfamily Lignes} !}}% +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex b/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex new file mode 100644 index 0000000000..a7463ec702 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCLabyrintheNombre.tex @@ -0,0 +1,511 @@ +%%% +% Labyrinthe Nombre +%%% +\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true} + +\newcommand\LabyNombre[1][]{% + \useKVdefault[ClesLabyNb]% + \setKV[ClesLabyNb]{#1}% + \ifboolKV[ClesLabyNb]{Solution}{% + \TraceLabyFactoSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% + }{% + \TraceLabyFacto{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% + }% +}% + +\newcommand\TraceLabyFacto[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + input PfCLabyNombre; + + boolean Murs; + Murs=\useKV[ClesLabyNb]{Murs}; + + string Entree,Sortie; + Entree=\useKV[ClesLabyNb]{Entree}; + Sortie=\useKV[ClesLabyNb]{Sortie}; + boolean SortieUnique,EntreeSortie; + SortieUnique:=\useKV[ClesLabyNb]{SortieUnique}; + EntreeSortie:=\useKV[ClesLabyNb]{EntreeSortie}; + picture Square; + Square=image( + path Test; + Test=unitsquare scaled 10mm; + trace subpath(0.85,1.15) of Test; + trace subpath(1.85,2.15) of Test; + trace subpath(2.85,3.15) of Test; + trace subpath(3.85,4.15) of Test; + ); + + vardef RemplissagePremier= + Totalpremier:=if indiceChemin<62:62 else: indiceChemin fi; + + numeric p[]; boolean n_is_prime; p[1]=2; kis:=1; + for nis=3 step 2 until infinity: + n_is_prime := true; + for jis=2 upto kis: + if nis mod p[jis]=0: n_is_prime := false; fi + exitif nis/p[jis] < p[jis]; + endfor + if n_is_prime: p[incr kis] := nis; exitif kis=Totalpremier; fi + endfor fi + + numeric PR[],pretiens[]; + + for ki=1 upto Totalpremier-1: + pretiens[ki]:=p[ki+1]; + endfor; + + Kk:=0; + + for ki=Totalpremier-1 downto 1: + alea:=1+floor(uniformdeviate(ki)); + PR[incr Kk]:=pretiens[alea]; + % message("k="&decimal(k)&" alea="&decimal(alea)&" Kk="&decimal(Kk)&" PR[Kk]="&decimal(PR[Kk])); + Kkl:=0; + for li=1 upto ki: + if li<>alea: + pretiens[incr Kkl]:=pretiens[li]; + % message("Kkl="&decimal(Kkl)); + fi; + endfor; + endfor; + enddef; + + numeric Multiple; + Multiple=#1; + % Initialisation du labyrinthe + InitialisationLabyrinthe(#2,#3); + % On initialise les paramètres du parcours + numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; + choixligneD=xpart(#4); + choixcolonneD=ypart(#4); + choixligneA=xpart(#5); + choixcolonneA=ypart(#5);% + pair Depart; + Depart=N[choixligneD][choixcolonneD]; + pair Arrivee; + Arrivee=N[choixligneA][choixcolonneA]; + pair Mobile; + Mobile=Depart; + % + RAZPileChemin; + + if \useKV[ClesLabyNb]{SortieUnique}: + if (Sortie="Est") or (Sortie="Ouest"): + for k=0 upto LargeurLaby-1: + if k<>choixligneA: + CaseExploree[k][choixcolonneA]:=true; + fi; + endfor; + elseif (Sortie="Nord") or (Sortie="Sud"): + for k=0 upto LongueurLaby-1: + if k<>choixcolonneA: + CaseExploree[choixligneA][k]:=true; + fi; + endfor; + fi; + fi; + % Exploration du labyrinthe + if Entree="Nord": + CaseExploree[choixligneD-1][choixcolonneD]:=true; + elseif Entree="Sud": + CaseExploree[choixligneD+1][choixcolonneD]:=true; + elseif Entree="Est": + CaseExploree[choixligneD][choixcolonneD+1]:=true; + elseif Entree="Ouest": + CaseExploree[choixligneD][choixcolonneD-1]:=true; + fi; + % + PushChemin((choixligneD,choixcolonneD)); + CaseExploree[choixligneD][choixcolonneD]:=true; + VoisinDispo(choixligneD,choixcolonneD); + forever: exitif Mobile=Arrivee;%nb=0; + nb:=ceiling(uniformdeviate(nbvoisin)); + if nb>0: + for k=1 upto nbvoisin: + CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; + endfor; + PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); + Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; + VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); + else: + PopCheminMathAlea; + fi; + endfor; + % Affichagefinal + % on sauvegarde les nombres aléatoires + numeric NbAffiche[]; + numeric NbSol[]; + % on écrit des nombres au hasard, mais sans être multiple du nombre choisi + numeric nbaffiche; + nbaffiche=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + if Multiple=1:%On affichera que des multiples de 2/3/5/9/10 pour afficher un chemin de nombre premiers + mathalea:=uniformdeviate(5); + if mathalea<1: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*2; + elseif mathalea<2: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*3; + elseif mathalea<3: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*5; + elseif mathalea<4: + NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*9; + else: NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*10; + fi; + else: + NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); + fi; + endfor; + endfor; + % On crée des multiples du nombre choisi + RemplissagePremier; + + for k=1 upto indiceChemin: + if Multiple>1: + NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; + else: + NbSol[k]=PR[k]; + fi; + endfor; + % On affiche + picture Corps; + Corps=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + for k=1 upto indiceChemin: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + trace TraceLabyrinthe; + else: + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + trace Square shifted N[k][l]; + endfor; + endfor; + trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; + % On dessine l'entrée. + if Entree="Nord": + N[-1][-1]:=Depart+(0,10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Ouest": + N[-1][-1]:=Depart+(-10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Sud": + N[-1][-1]:=Depart+(0,-10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Est": + N[-1][-1]:=Depart+(10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + fi; + % On dessine les sorties + if Sortie="Nord": + N[-2][-2]=Arrivee+(5mm,20mm); + for k=0 upto LongueurLaby-1: + draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); + endfor; + elseif Sortie="Ouest": + N[-2][-2]=Arrivee+(-10mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); + endfor; + elseif Sortie="Sud": + N[-2][-2]=Arrivee+(5mm,-10mm); + for k=0 upto LongueurLaby-1: + draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); + endfor; + elseif Sortie="Est": + N[-2][-2]=Arrivee+(20mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); + endfor; + fi; + fi; + ); + Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace Corps; + \end{mplibcode} +} + +\newcommand\TraceLabyFactoSolution[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + color CouleurChemin; + CouleurChemin:=\useKV[ClesLabyNb]{CouleurChemin}; + picture CorpsSolution; + CorpsSolution=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + if EntreeSortie=false: + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + else: + for k=1 upto indiceChemin: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + fi; + if EntreeSortie=false: + trace TraceLabyrinthe; + else: + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + trace Square shifted N[k][l]; + endfor; + endfor; + trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; + % On dessine l'entrée. + if Entree="Nord": + N[-1][-1]:=Depart+(0,10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Ouest": + N[-1][-1]:=Depart+(-10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Sud": + N[-1][-1]:=Depart+(0,-10mm); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + elseif Entree="Est": + N[-1][-1]:=Depart+(10mm,0); + fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; + draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; + undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; + label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); + fi; + % On dessine les sorties + if Sortie="Nord": + N[-2][-2]=Arrivee+(5mm,20mm); + for k=0 upto LongueurLaby-1: + draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); + undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); + endfor; + elseif Sortie="Ouest": + N[-2][-2]=Arrivee+(-10mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); + undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); + endfor; + elseif Sortie="Sud": + N[-2][-2]=Arrivee+(5mm,-10mm); + for k=0 upto LongueurLaby-1: + % draw (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withcolor red; + draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); + undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); + endfor; + elseif Sortie="Est": + N[-2][-2]=Arrivee+(20mm,5mm); + for k=0 upto LargeurLaby-1: + draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); + undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; + label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); + endfor; + fi; + path CheminSolution; + CheminSolution=(N[-1][-1] shifted (5mm,5mm))--((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) + for k=2 upto indiceChemin-1: + -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) + endfor + --((center unitsquare scaled 10mm) shifted Arrivee)--N[-2][-2]; + trace CheminSolution dashed evenly withcolor CouleurChemin; + fi; + ); + CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace CorpsSolution; + \end{mplibcode} +} + +\newcommand\TraceLabyNombreDouble[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + input PfCLabyNombre; + + boolean Murs; + Murs=\useKV[ClesLabyNb]{Murs}; + + numeric Multiple; + Multiple=#1; + % Initialisation du labyrinthe + InitialisationLabyrinthe(#2,#3); + % On initialise les paramètres du parcours + numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; + choixligneD=xpart(#4); + choixcolonneD=ypart(#4); + choixligneA=xpart(#5); + choixcolonneA=ypart(#5);% + pair Depart; + Depart=N[choixligneD][choixcolonneD]; + pair Arrivee; + Arrivee=N[choixligneA][choixcolonneA]; + pair Mobile; + Mobile=Depart; + RAZPileChemin; + % Exploration du labyrinthe + PushChemin((choixligneD,choixcolonneD)); + CaseExploree[choixligneD][choixcolonneD]:=true; + VoisinDispo(choixligneD,choixcolonneD); + forever: exitif Mobile=Arrivee;%nb=0; + nb:=ceiling(uniformdeviate(nbvoisin)); + if nb>0: + for k=1 upto nbvoisin: + CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; + endfor; + PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); + Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; + VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); + else: + PopChemin; + fi; + endfor; + % Affichagefinal + % on sauvegarde les nombres aléatoires + numeric NbAffiche[]; + numeric NbSol[]; + % on écrit des nombres au hasard, mais sans être multiple du nombre choisi + numeric nbaffiche; + nbaffiche=0; + NbAffiche[0]=5+ceiling(uniformdeviate(7)); + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + mathalea:=uniformdeviate(1); + if mathalea<0.95: + NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]+Multiple+1; + else: + NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]*(Multiple-1); + fi; + endfor; + endfor; + % On crée des multiples du nombre choisi + NbSol[1]=5+ceiling(uniformdeviate(7)); + for k=2 upto indiceChemin-1: + mathalea:=uniformdeviate(1); + if mathalea<0.9: + NbSol[k]=NbSol[k-1]+Multiple; + else: + NbSol[k]=NbSol[k-1]*Multiple; + fi; + endfor; + % On affiche + picture Corps; + Corps=image( + nbaffiche:=0; + for k=0 upto LargeurLaby-1: + for l=0 upto LongueurLaby-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + trace TraceLabyrinthe; + ); + Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace Corps; + \end{mplibcode} +} + +\newcommand\TraceDoubleSolution[6]{% + \mplibforcehmode% + \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% + \begin{mplibcode}[\PfCNomLabyrinthe] + picture CorpsSolution; + CorpsSolution=image( + nbaffiche:=0; + for k=0 upto #3-1: + for l=0 upto #2-1: + nbaffiche:=nbaffiche+1; + label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); + endfor; + endfor; + remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; + remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; + if \useKV[ClesLabyNb]{Chemin}: + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; + endfor; + trace ((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) + for k=2 upto indiceChemin-1: + -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) + endfor + --((center unitsquare scaled 10mm) shifted Arrivee) dashed evenly withcolor Brown; + for k=2 upto indiceChemin-1: + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + else: + for k=2 upto indiceChemin-1: + remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; + label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); + endfor; + fi; + trace TraceLabyrinthe; + ); + CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; + trace CorpsSolution; + \end{mplibcode} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMentalo.tex b/macros/latex/contrib/profcollege/latex/PfCMentalo.tex new file mode 100644 index 0000000000..48ac74aef3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMentalo.tex @@ -0,0 +1,50 @@ +%%% +% Mentalo +%%% +\NewDocumentCommand\PfCNum{m}{% + \xintifboolexpr{#1<0}{(\num{#1})}{\num{#1}}% +}% + +\setKVdefault[Mentalo]{Questions=10,ValeurMin=1,ValeurMax=15} + +\NewDocumentCommand\Mentalo{o m}{% + \useKVdefault[Mentalo]% + \setKV[Mentalo]{#1}% + \xdef\PfCMentaloEtages{\fpeval{\useKV[Mentalo]{Questions}+1}} + \setsepchar{,}\ignoreemptyitems% + \readlist*\PfCMentaloListeOperations{#2}% + \reademptyitems% + \setlength{\tabcolsep}{0.25\tabcolsep} + \renewcommand{\arraystretch}{1.5} + \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{1}{m{10pt}}} + \Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}% + \Block[draw,fill=gray!15]{1-5}{Arrivée}&&&&&\Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}\\ + \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-1}}}\do{% + \Block{1-\fpeval{\PfCMentaloEtages-##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-##1}}}\do{&}% + \Block[borders={top,left,bottom}]{1-\fpeval{##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{##1}}}\do{&}% + \Block[borders={top,bottom}]{1-1}{% + \xdef\PfCMentaloPremierTerme{\fpeval{randint(\useKV[Mentalo]{ValeurMin},\useKV[Mentalo]{ValeurMax})}}% + \num{\PfCMentaloPremierTerme}}&\Block[borders={top,bottom}]{1-1}{% + \xintifboolexpr{\PfCMentaloListeOperationslen==1}{% + \StrSubstitute{\PfCMentaloListeOperations[1]}{*}{\times}[\PfCCBAffiche]$\PfCCBAffiche$% + }{% + \StrSubstitute{\PfCMentaloListeOperations[##1]}{*}{\times}[\PfCCBAffiche]$\PfCCBAffiche$% + }% + }&% + \Block[borders={top,bottom}]{1-1}{\xdef\PfCMentaloDeuxiemeTerme{\fpeval{randint(\useKV[Mentalo]{ValeurMin},\useKV[Mentalo]{ValeurMax})}}% + \PfCNum{\PfCMentaloDeuxiemeTerme}}&\Block[borders={top,bottom}]{1-1}{$=$}&\Block[borders={top,bottom}]{1-1}{\pointilles[20pt]}&% + \Block[borders={top,right,bottom}]{1-\fpeval{##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{##1}}}\do{&}% + \Block{1-\fpeval{\PfCMentaloEtages-##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-##1}}}\do{&}% + &&&&\Block{1-2}{% + \xintifboolexpr{\PfCMentaloListeOperationslen==1}{% + \num{\fpeval{\PfCMentaloPremierTerme\PfCMentaloListeOperations[1]\PfCMentaloDeuxiemeTerme}} + }{% + \num{\fpeval{\PfCMentaloPremierTerme\PfCMentaloListeOperations[##1]\PfCMentaloDeuxiemeTerme}} + }% + }&\\ + }% + \Block[draw,fill=gray!15]{1-\fpeval{2*\PfCMentaloEtages+5}}{Départ}\xintFor* ##2 in{\xintSeq{1}{\fpeval{2*\PfCMentaloEtages+5}}}\do{&}\\% + \CodeAfter + \tikz\draw[dashed] (1-|\fpeval{5+5+2+2*\PfCMentaloEtages-2})--(last-|\fpeval{5+5+2+2*\PfCMentaloEtages-2}); + \end{NiceTabular} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex b/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex new file mode 100644 index 0000000000..0813f66c44 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMidpoint.tex @@ -0,0 +1,273 @@ +%%% +% Midpoint +%%% +\setKVdefault[MidPoint]{Solution=false,Graines=false,Hard=false} +\defKV[MidPoint]{Graine=\setKV[MidPoint]{Graines}} + +\NewDocumentCommand\MidPoint{o}{% + \useKVdefault[MidPoint]% + \setKV[MidPoint]{#1}% + \BuildMidPoint +} + +\NewDocumentCommand\BuildMidPoint{}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + numeric Longueur,Largeur; + Longueur=8; + Largeur=4; + boolean Horizontal,Vertical,RetiensSens; + Horizontal=false; + Vertical=false; + + boolean Solution,Hard,Graines; + Solution:=\useKV[MidPoint]{Solution}; + Hard:=\useKV[MidPoint]{Hard}; + Graines:=\useKV[MidPoint]{Graines}; + if Graines: + randomseed:=\useKV[MidPoint]{Graine} + fi; + + u:=8mm; + + pair A[][];%centre des carrés. + + vardef CherchePoint(expr basek,basel)= + % Si le déplacement précédent est horizontal, il faut passer en vertical + % Si le déplacement précédent est vertical, il faut passer en horizontal + p:=p+1; + if basel=ColonneArrivee: + RP[p]:=Arrivee; + else: + if Vertical: + %deplacement horizontal + ecart:=ColonneArrivee-basel; + if ecart=1: + Basel:=ColonneArrivee; + RP[p]:=A[basek][ColonneArrivee]; + else: + Basel:=ceiling(basel+uniformdeviate(ecart)); + RP[p]:=A[basek][Basel]; + fi; + Basek:=basek; + Horizontal:=true; + Vertical:=false; + else: + %on vérifie qu'on peut se déplacer dans les deux sens. + % on choisit vertical positif ou vertical négatif + if basek=1: + choix:=0.75; + elseif basek=Largeur: + choix:=0.25; + else: + choix:=uniformdeviate(1); + fi; + if choix<0.5: + ecart:=basek-1; + if ecart=1: + Basek:=1; + RP[p]:=A[1][basel]; + else: + Basek:=ceiling(uniformdeviate(ecart)); + RP[p]:=A[Basek][basel]; + fi; + Basel:=basel; + else: + ecart:=Largeur-basek; + if ecart=1: + Basek:=Largeur; + RP[p]:=A[Largeur][basel]; + else: + Basek:=basek+ceiling(uniformdeviate(ecart)); + RP[p]:=A[Basek][basel]; + fi; + Basel:=basel; + fi; + Horizontal:=false; + Vertical:=true; + fi; + fi; +enddef; + +vardef MidPoint(expr Aa,Bb)= + save $; + picture $; + $=image( + if Solution: + trace Aa--Bb withpen pencircle scaled 1.5; + fi; + if Hard: + NbMid:=NbMid+1; + if NbMid mod 2=0: + remplis cercles(1/2[Aa,Bb],1mm); + fi; + else: + remplis cercles(1/2[Aa,Bb],1mm); + fi; + ); + $ +enddef; + + % tracé de la grille + for k=1 upto 2*Largeur: + for l=-3 upto Largeur+Longueur-4: + trace (unitsquare scaled u) shifted (u*(l,-k)-center (unitsquare scaled u)) withcolor 0.5*white; + endfor; + endfor; + + for k=1 upto Largeur: + for l=1 upto Longueur: + A[k][l]=u*(l,-k); + %trace (unitsquare scaled u) shifted (A[k][l]-center (unitsquare scaled u)) withcolor 0.5*white; + endfor; + endfor; + +%On choisit le premier déplacement + choix:=uniformdeviate(1); + if choix<0.5: + Horizontal:=true; + else: + Vertical:=true; + fi; + + p:=0; + NbMid=ceiling(uniformdeviate(2));%Pour le niveau Hard + + %1er rectangle +LigneDepart:=2;%2; +ColonneDepart:=1; +LigneArrivee:=4;%4; +ColonneArrivee:=8; +pair Depart,Arrivee; +Depart=A[LigneDepart][ColonneDepart]; +Arrivee=A[LigneArrivee][ColonneArrivee]; + +pair RP[];%RetiensPoints +RP[0]=Depart; + +Basek:=LigneDepart; +Basel:=ColonneDepart; +forever: + CherchePoint(Basek,Basel); + exitif RP[p]=Arrivee; +endfor; + +if ypart(RP[p])=ypart(RP[p-1]): + RetiensSens:=true; +else: + RetiensSens:=false; + p:=p-1; +fi; + +%2eme rectangle +for k=1 upto Largeur: + for l=1 upto Longueur: + A[k][l]:=u*(Longueur+l,-k); + endfor; +endfor; + +LigneDepart:=4; +ColonneDepart:=1; +LigneArrivee:=2; +ColonneArrivee:=8; +Depart:=A[LigneDepart][ColonneDepart]; +Arrivee:=A[LigneArrivee][ColonneArrivee]; + +Basek:=LigneDepart; +Basel:=ColonneDepart; +Retiens:=p; +RP[p+1]:=Depart; + +forever: + CherchePoint(Basek,Basel); + exitif RP[p]=Arrivee; +endfor; + +if ypart(RP[p])=ypart(RP[p-1]): + RetiensSens:=true; + p:=p-1; +else: + RetiensSens:=false; +fi; + +for h=(Retiens+1) upto p: + RP[h]:=symetrie(RP[h],u*(Longueur+0.5,-Largeur-0.5)); +endfor; +%3eme Rectangle +for k=1 upto Largeur: + for l=1 upto Longueur: + A[k][l]:=u*(2*Longueur+l,-k); + endfor; +endfor; + +LigneDepart:=4; +ColonneDepart:=2; +LigneArrivee:=1; +ColonneArrivee:=4; +Depart:=A[LigneDepart][ColonneDepart]; +Arrivee:=A[LigneArrivee][ColonneArrivee]; + + +Basek:=LigneDepart; +Basel:=ColonneDepart; +Retiens:=p; +RP[p+1]:=Depart; +forever: + CherchePoint(Basek,Basel); + exitif RP[p]=Arrivee; +endfor; +for h=(Retiens+1) upto p: + RP[h]:=rotation(RP[h],u*(2*Longueur+0.5,-Largeur-0.5),90) shifted(u*(-2*Longueur,-Largeur)); +endfor; +%4eme rectangle. On termine la boucle ? +for k=1 upto Largeur: + for l=1 upto Longueur: + A[k][l]:=u*(3*Longueur+l,-k); + endfor; +endfor; + +LigneDepart:=4; +ColonneDepart:=1; +LigneArrivee:=2; +ColonneArrivee:=4; +Depart:=A[LigneDepart][ColonneDepart]; +Arrivee:=A[LigneArrivee][ColonneArrivee]; + +Basek:=LigneDepart; +Basel:=ColonneDepart; +Retiens:=p; +RP[p+1]:=Depart; +forever: + CherchePoint(Basek,Basel); + exitif RP[p]=Arrivee; +endfor; + +if ypart(RP[p])=ypart(RP[p-1]): + p:=p-1; +fi; + +if ypart(RP[0])=ypart(RP[1]): + RetiensSens:=true; +else: + RetiensSens:=false; +fi; + +for h=(Retiens+1) upto p: + RP[h]:=RP[h] shifted(u*(-3.5*Longueur,0)); +endfor; + +if RetiensSens: + RP[p+1]:=RP[1]; + go:=1; +else: + RP[p+1]:=RP[0]; + go:=0; +fi; + +for h=go upto p: + draw MidPoint(RP[h],RP[h+1]); +endfor; +\end{mplibcode} +\fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex b/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex new file mode 100644 index 0000000000..fea78f1102 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex @@ -0,0 +1,386 @@ +%%% +% Modele en barre +%%% +\setKVdefault[ClesModeleBarre]{Hauteur=0.5cm,Largeur=1cm,Separation=0,Homogene=false}%Separation pour conserver le lien avec les équations. +\defKV[ClesModeleBarre]{Longueur=\setKV[ClesModeleBarre]{Homogene}}% + +\newtoks\toklistemodelbarresup% +\toklistemodelbarresup{}% +\def\UpdateListeModelBarreSup#1\nil{\addtotok\toklistemodelbarresup{#1,}}% +\newtoks\toklistemodelbarreinf% +\toklistemodelbarreinf{}% +\def\UpdateListeModelBarreInf#1\nil{\addtotok\toklistemodelbarreinf{#1,}}% + +\newcommand\ModeleBarre[3][]{% + % #1 options + % #2 éléments de la barre supérieure C1 2 $x$ 1 3/C2 1 1x/ + % #3 éléments de la barre inférieure (même lecture) + \useKVdefault[ClesModeleBarre]% + \setKV[ClesModeleBarre]{#1}% + \setsepchar{\\/ }% + \readlist\ListeModelBarreSup{#2}% + \readlist\ListeModelBarreInf{#3}% + \toklistemodelbarresup{}% + \foreachitem\compteur\in\ListeModelBarreSup{% + \foreachitem\valeur\in\ListeModelBarreSup[\compteurcnt]{% + \expandafter\UpdateListeModelBarreSup\valeur\nil% + }% + }% + \toklistemodelbarreinf{}% + \foreachitem\compteur\in\ListeModelBarreInf{% + \foreachitem\valeur\in\ListeModelBarreInf[\compteurcnt]{% + \expandafter\UpdateListeModelBarreInf\valeur\nil% + }% + }% + \ifboolKV[ClesModeleBarre]{Homogene}{% + \PfCMPDessineModelBarre{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}% + }{% + \PfCMPDessineModelBarreNonHomogene{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}% + }% +}% + +\newcommand\PfCMPDessineModelBarre[2]{% + \begin{mplibcode}% + Longueur:=\useKV[ClesModeleBarre]{Longueur}; + Hauteur:=\useKV[ClesModeleBarre]{Hauteur}; + + vardef Briquesup(expr col)(text t)= + save $; + picture $; + $=image( + u:=Longueur/MBnbcasessuptotal; + remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col; + draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)); + label(TEX(t),iso((0,0),(u,Hauteur))); + u:=1cm; + ); + $ + enddef; + + vardef Briqueinf(expr col)(text t)= + save $; + picture $; + $=image( + u:=Longueur/MBnbcasesinftotal; + remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col; + draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)); + label(TEX(t),iso((0,0),(u,Hauteur))); + u:=1cm; + ); + $ + enddef; + + numeric MBnbcolsup;%compte combien de couleurs + MBnbcolsup=0; + color MBColSup[];%Sauvegarde les couleurs de la barre sup + numeric MBnbinfosup[];%compte combien d'infos par couleurs. + numeric MBnbcasessup[][]; + numeric MBnbcasessuptotal; + MBnbcasessuptotal=0; + string MBTextcasessup[][]; + vardef toto(text t)= + for p_=t: + if color p_: + MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs + MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases + MBnbinfosup[MBnbcolsup]:=0; + else: + if numeric p_: + MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; + MBnbcasessuptotal:=MBnbcasessuptotal+p_; + MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + else: + MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + fi; + fi; + endfor; + enddef; + + toto(#1); + + numeric MBnbcolinf;%compte combien de couleurs + MBnbcolinf=0; + color MBColInf[];%Sauvegarde les couleurs de la barre inf + numeric MBnbinfoinf[];%compte combien d'infos par couleurs. + numeric MBnbcasesinf[][]; + numeric MBnbcasesinftotal; + MBnbcasesinftotal=0; + string MBTextcasesinf[][]; + vardef tata(text t)= + for p_=t: + if color p_: + MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs + MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases + MBnbinfoinf[MBnbcolinf]:=0; + else: + if numeric p_: + MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; + MBnbcasesinftotal:=MBnbcasesinftotal+p_; + MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + else: + MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + fi; + fi; + endfor; + enddef; + + tata(#2); + + pair VecteurDeplasup; + VecteurDeplasup=(Longueur/MBnbcasessuptotal,0); + + numeric MBnbdepla; + MBnbdepla=0; + for k=1 upto MBnbcolsup: + for l=1 upto MBnbinfosup[k]: + for j=1 upto MBnbcasessup[k][l]: + trace Briquesup(MBColSup[k])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDeplasup); + MBnbdepla:=MBnbdepla+1; + endfor; + endfor; + endfor; + + pair VecteurDeplainf; + VecteurDeplainf=(Longueur/MBnbcasesinftotal,0); + + numeric MBnbdepla; + MBnbdepla=0; + for k=1 upto MBnbcolinf: + for l=1 upto MBnbinfoinf[k]: + for j=1 upto MBnbcasesinf[k][l]: + trace Briqueinf(MBColInf[k])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDeplainf+(0,-Hauteur)); + MBnbdepla:=MBnbdepla+1; + endfor; + endfor; + endfor; + \end{mplibcode} +}% + +\newcommand\PfCMPDessineModelBarreNonHomogene[2]{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + Longueur:=\useKV[ClesModeleBarre]{Largeur}; + Hauteur:=\useKV[ClesModeleBarre]{Hauteur}; + Separation:=\useKV[ClesModeleBarre]{Separation}; + + vardef Brique(expr col,nbfois)(text t)= + save $; + picture $; + $=image( + u:=Longueur; + if t="?": + draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly; + else: + remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col; + draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)); + fi; + if nbfois>0: + label(TEX(t),iso((0,0),(u*abs(nbfois),Hauteur))); + else: + label.bot(TEX(t),iso((0,0),(u*abs(nbfois),-Hauteur))); + drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur); + fi; + u:=1cm; + ); + $ + enddef; + + numeric MBnbcolsup;%compte combien de couleurs + MBnbcolsup=0; + color MBColSup[];%Sauvegarde les couleurs de la barre sup + numeric MBnbinfosup[];%compte combien d'infos par couleurs. + numeric MBnbcasessup[][]; + numeric MBnbcasessuptotal; + MBnbcasessuptotal=0; + string MBTextcasessup[][]; + vardef toto(text t)= + for p_=t: + if color p_: + MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs + MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases + MBnbinfosup[MBnbcolsup]:=0; + else: + if numeric p_: + MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; + MBnbcasessuptotal:=MBnbcasessuptotal+p_; + MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + else: + MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + fi; + fi; + endfor; + enddef; + + toto(#1); + + numeric MBnbcolinf;%compte combien de couleurs + MBnbcolinf=0; + color MBColInf[];%Sauvegarde les couleurs de la barre inf + numeric MBnbinfoinf[];%compte combien d'infos par couleurs. + numeric MBnbcasesinf[][]; + numeric MBnbcasesinftotal; + MBnbcasesinftotal=0; + string MBTextcasesinf[][]; + vardef tata(text t)= + for p_=t: + if color p_: + MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs + MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases + MBnbinfoinf[MBnbcolinf]:=0; + else: + if numeric p_: + MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; + MBnbcasesinftotal:=MBnbcasesinftotal+p_; + MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + else: + MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + fi; + fi; + endfor; + enddef; + + tata(#2); + + pair VecteurDepla; + VecteurDepla=(Longueur,0); + + numeric MBnbdepla; + MBnbdepla=0; + for k=1 upto MBnbcolsup: + for l=1 upto MBnbinfosup[k]: + trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla); + MBnbdepla:=MBnbdepla+MBnbcasessup[k][l]; + endfor; + endfor; + + MBnbdepla:=0; + for k=1 upto MBnbcolinf: + for l=1 upto MBnbinfoinf[k]: + trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+(0,-Hauteur)); + if MBnbcasesinf[k][l]<0: + for j=1 upto (abs(MBnbcasesinf[k][l])-1): + trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+(0,-Hauteur)) withcolor black; + endfor; + fi; + MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]); + endfor; + endfor; + + if Separation>0: + draw (u*Separation,-1.5Hauteur)--(u*Separation,1.5Hauteur) withpen pencircle scaled 1.5 dashed evenly withcolor red; + fi; + + \end{mplibcode}% + \else + \begin{mpost}[mpsettings={Longueur:=\useKV[ClesModeleBarre]{Largeur};Hauteur:=\useKV[ClesModeleBarre]{Hauteur};Separation:=\useKV[ClesModeleBarre]{Separation};}] + vardef Brique(expr col,nbfois)(text t)= + save $; + picture $; + $=image( + u:=Longueur; + if t="?": + draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly; + else: + remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col; + draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)); + fi; + if nbfois>0: + label(LATEXProf(t),iso((0,0),(u*abs(nbfois),Hauteur))); + else: + label.bot(LATEXProf(t),iso((0,0),(u*abs(nbfois),-Hauteur))); + drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur); + fi; + u:=1cm; + ); + $ + enddef; + + numeric MBnbcolsup;%compte combien de couleurs + MBnbcolsup=0; + color MBColSup[];%Sauvegarde les couleurs de la barre sup + numeric MBnbinfosup[];%compte combien d'infos par couleurs. + numeric MBnbcasessup[][]; + numeric MBnbcasessuptotal; + MBnbcasessuptotal=0; + string MBTextcasessup[][]; + vardef toto(text t)= + for p_=t: + if color p_: + MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs + MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases + MBnbinfosup[MBnbcolsup]:=0; + else: + if numeric p_: + MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; + MBnbcasessuptotal:=MBnbcasessuptotal+p_; + MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + else: + MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; + fi; + fi; + endfor; + enddef; + + toto(#1); + + numeric MBnbcolinf;%compte combien de couleurs + MBnbcolinf=0; + color MBColInf[];%Sauvegarde les couleurs de la barre inf + numeric MBnbinfoinf[];%compte combien d'infos par couleurs. + numeric MBnbcasesinf[][]; + numeric MBnbcasesinftotal; + MBnbcasesinftotal=0; + string MBTextcasesinf[][]; + vardef tata(text t)= + for p_=t: + if color p_: + MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs + MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases + MBnbinfoinf[MBnbcolinf]:=0; + else: + if numeric p_: + MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; + MBnbcasesinftotal:=MBnbcasesinftotal+p_; + MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + else: + MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; + fi; + fi; + endfor; + enddef; + + tata(#2); + + pair VecteurDepla; + VecteurDepla=(Longueur,0); + + numeric MBnbdepla; + MBnbdepla=0; + for k=1 upto MBnbcolsup: + for l=1 upto MBnbinfosup[k]: + trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla); + MBnbdepla:=MBnbdepla+MBnbcasessup[k][l]; + endfor; + endfor; + + MBnbdepla:=0; + for k=1 upto MBnbcolinf: + for l=1 upto MBnbinfoinf[k]: + trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+u*(0,-0.5)); + if MBnbcasesinf[k][l]<0: + for j=1 upto (abs(MBnbcasesinf[k][l])-1): + trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+u*(0,-0.5)) withcolor black; + endfor; + fi; + MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]); + endfor; + endfor; + + if Separation>0: + draw u*(Separation,-0.75)--u*(Separation,0.75) withpen pencircle scaled 1.5 dashed evenly withcolor red; + fi; + + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMosaique.tex b/macros/latex/contrib/profcollege/latex/PfCMosaique.tex new file mode 100644 index 0000000000..91936d597b --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMosaique.tex @@ -0,0 +1,138 @@ +%%% +% Mosaique +%%% +\setKVdefault[ClesMosaique]{Largeur=2,Hauteur=2,Solution=false,Type=1,Label,Echelle=1cm} + +\newcommand\DessineMosaique[2][]{% + \useKVdefault[ClesMosaique]% + \setKV[ClesMosaique]{#1}% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + u:=\useKV[ClesMosaique]{Echelle}; + Type:=\useKV[ClesMosaique]{Type}; + input PfCMosaique; + trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi; + \end{mplibcode}% + \else% + \begin{mpost}[mpsettings={u:=\useKV[ClesMosaique]{Echelle};Type:=\useKV[ClesMosaique]{Type};}]% + input PfCMosaique; + trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi; + \end{mpost}% + \fi% +}% + +\newcommand\DessineMosaiqueComplet[1]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCMosaique; + Largeur=\useKV[ClesMosaique]{Largeur}; + Hauteur=\useKV[ClesMosaique]{Hauteur}; + Type=\useKV[ClesMosaique]{Type}; + boolean Solution,Label; + Solution=\useKV[ClesMosaique]{Solution}; + Label=\useKV[ClesMosaique]{Label}; + pair A,B,C,D; + A=u*(0,1); + B-A=u*(Largeur,0); + C-B=u*(0,-Hauteur); + D-C=A-B; + picture mosaique; + path case; + case=unitsquare scaled 1cm; + if Type=1: + mosaique=image( + trace case withcolor 0.5white; + trace (point(0) of case)--(point(2) of case) withcolor 0.75white; + trace (point(1) of case)--(point(3) of case) withcolor 0.75white; + trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; + trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; + ); + else: + mosaique=image( + trace case withcolor 0.5white; + trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; + trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; + trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white; + ); + fi; + if Solution: + nbmos:=0; + for p_=#1: + trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); + nbmos:=nbmos+1; + endfor; + else: + nbmos:=0; + for p_=#1: + trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); + if Label: + label(TEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))))); + fi; + nbmos:=nbmos+1; + endfor; + fi; + trace polygone(A,B,C,D); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={Largeur=\useKV[ClesMosaique]{Largeur};Hauteur=\useKV[ClesMosaique]{Hauteur};Type=\useKV[ClesMosaique]{Type};boolean Solution,Label;Solution=\useKV[ClesMosaique]{Solution};}] + Label=\useKV[ClesMosaique]{Label}; + input PfCMosaique; + pair A,B,C,D; + A=u*(0,1); + B-A=u*(Largeur,0); + C-B=u*(0,-Hauteur); + D-C=A-B; + picture mosaique; + path case; + case=unitsquare scaled 1cm; + if Type=1: + mosaique=image( + trace case withcolor 0.5white; + trace (point(0) of case)--(point(2) of case) withcolor 0.75white; + trace (point(1) of case)--(point(3) of case) withcolor 0.75white; + trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; + trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; + ); + else: + mosaique=image( + trace case withcolor 0.5white; + trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; + trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; + trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white; + ); + fi; + if Solution: + nbmos:=0; + for p_=#1: + trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); + nbmos:=nbmos+1; + endfor; + else: + nbmos:=0; + for p_=#1: + trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); + if Label: + label(LATEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))))); + fi; + nbmos:=nbmos+1; + endfor; + fi; + trace polygone(A,B,C,D); + \end{mpost} + \fi +}% + +\newtoks\toklistecaseM% +\def\UpdatetoksMosaique#1/#2\nil{\addtotok\toklistecaseM{(#1,#2),}}% + +\newcommand\Mosaique[2][]{% + \useKVdefault[ClesMosaique]% + \setKV[ClesMosaique]{#1}% + \setsepchar[*]{,*/}% + \readlist*\ListeMosaique{#2}% + \toklistecaseM{}% + \foreachitem\compteur\in\ListeMosaique{\expandafter\UpdatetoksMosaique\compteur\nil}% + \DessineMosaiqueComplet{\the\toklistecaseM}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMotsCodes.tex b/macros/latex/contrib/profcollege/latex/PfCMotsCodes.tex new file mode 100644 index 0000000000..ad49524c71 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMotsCodes.tex @@ -0,0 +1,59 @@ +%%% +% Mots Cod\'es +%%% +\setKVdefault[MotsCodes]{LargeurT=1cm,Colonnes=5,Largeur=3cm,Solution=false,Math=false}% + +\newcommand\MotsCodes[2][]{% + \useKVdefault[MotsCodes]% + \setKV[MotsCodes]{#1}% + \setsepchar[*]{§*/}% + \readlist*\ListeMotsCodes{#2}% + \xdef\ListeMotsCodesPas{\fpeval{\ListeMotsCodeslen/\useKV[MotsCodes]{Colonnes}}}% + \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{Largeur}}}} + \xintFor* ##1 in {\xintSeq {1}{\ListeMotsCodesPas}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% + \xintifForFirst{}{&}\Block[draw=black]{4-1}{}% + }\\ + \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% + \xintifForFirst{}{&}\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},1] + }\\ + \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% + \xintifForFirst{}{&}% + }\\ + \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% + \xintifForFirst{}{&}\textbf{\Large\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},2]} + }\\ + }% + \end{NiceTabular}% +}% + +\newcommand\MotsCodesTableau[3][]{% + \useKVdefault[MotsCodes]% + \setKV[MotsCodes]{#1}% + \setsepchar[*]{,*/}% + \readlist*\ListeMotsCodesTableau{#2}% + \xdef\ListeMotsCodesMax{0}% + \setsepchar{,}% + \readlist*\ListeMotsCodesPhrase{#3}% + \foreachitem\compteur\in\ListeMotsCodesTableau{% + \xintifboolexpr{\ListeMotsCodesMax<\listlen\ListeMotsCodesTableau[\compteurcnt]}{\xdef\ListeMotsCodesMax{\fpeval{\listlen\ListeMotsCodesTableau[\compteurcnt]}}}{}% + }% + \begin{NiceTabular}{*{\fpeval{\ListeMotsCodesMax}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{LargeurT}}}} + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsCodesTableaulen}}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% + \xintifForFirst{}{&}\ifboolKV[MotsCodes]{Solution}{% + \StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}[\MotsCodesMaLettre]% + \IfStrEq{\MotsCodesMaLettre}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{\StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}}}% + }{% + \IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{}}% + }%% + }\\ + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% + \xintifForFirst{}{&} + }\\ + \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% + \xintifForFirst{}{&}\IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[MotsCodes]{Math}{\ListeMotsCodesTableau[##1,##2]}{\num{\ListeMotsCodesTableau[##1,##2]}}}% + }\\ + }% + \end{NiceTabular}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMotsCroises.tex b/macros/latex/contrib/profcollege/latex/PfCMotsCroises.tex new file mode 100644 index 0000000000..4e6734dd7b --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMotsCroises.tex @@ -0,0 +1,56 @@ +%%% +% Mots croisés +%%% +\setKVdefault[ClesCroises]{Lignes=6,Colonnes=8,Solution=false,Croises=false,Couleur=gray,Largeur=1em} + +\newcounter{PfCLettreHorizontal} + +\newcommand\MotsCroises[2][]{% + \useKVdefault[ClesCroises]% + \setKV[ClesCroises]{#1}% + \setcounter{PfCLettreHorizontal}{0}% + \setsepchar[*]{§*,*/}% + \readlist*\ListeCasesCroises{#2}% + \begin{NiceTabular}{*{\fpeval{\useKV[ClesCroises]{Colonnes}}}{p{\useKV[ClesCroises]{Largeur}}}}[first-row,first-col]% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% + &\ifboolKV[ClesCroises]{Croises}{\stepcounter{PfCLettreHorizontal}\footnotesize\Alph{PfCLettreHorizontal}}{} + }\\ + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{% + \ifboolKV[ClesCroises]{Croises}{\footnotesize##1}{}\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% + &\IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{% + }{% + \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{% + \Block[draw,fill=black]{}{\PfCTBstrut}}{% + \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{% + \Block[draw,fill=\useKV[ClesCroises]{Couleur}]{}{% + \PfCTBstrut\ifboolKV[ClesCroises]{Solution}{% + \ListeCasesCroises[##1,##2,2]% + }{}% + } + }{% + \Block[draw]{}{\PfCTBstrut\ifboolKV[ClesCroises]{Solution}{% + \ListeCasesCroises[##1,##2,2]}{}% + }% + }% + }% + }% + }\\ + }% + \CodeAfter + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% + \IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{% + }{% + \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{% + }{% + \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{% + }{% + \xintifboolexpr{\fpeval{\ListeCasesCroises[##1,##2,1]}>0}{\tikz\node[transform canvas={xshift=1mm,yshift=-1mm}] at (\fpeval{##1}-|\fpeval{##2}){\tiny\ListeCasesCroises[##1,##2,1]};}{}% + }% + }% + }% + }% + }% + \end{NiceTabular}% + \setsepchar{,}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCMotsEmpiles.tex b/macros/latex/contrib/profcollege/latex/PfCMotsEmpiles.tex new file mode 100644 index 0000000000..634baa969e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCMotsEmpiles.tex @@ -0,0 +1,34 @@ +%%% +% Mots empilés +%%% +\setKVdefault[ClesMotEmpile]{Colonne=4,Solution=false,Couleur=black} + +\newcounter{CompteurMotEmpile} + +\newcommand\MotsEmpiles[2][]{% + \useKVdefault[ClesMotEmpile]% + \setKV[ClesMotEmpile]{#1}% + \setcounter{CompteurMotEmpile}{0}% + \setsepchar[*]{,*/}% + \readlist*\ListeMotsEmpiles{#2}% + \xdef\ListeMotsEmpilesMax{0}% + \colorlet{MotEmpileCouleur}{\useKV[ClesMotEmpile]{Couleur}}% + \foreachitem\compteur\in\ListeMotsEmpiles{% + \StrLen{\ListeMotsEmpiles[\compteurcnt,2]}[\LongueurMot]% + \xintifboolexpr{\ListeMotsEmpilesMax<\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}{\xdef\ListeMotsEmpilesMax{\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}}{}% + }% + \begin{NiceTabular}{c|*{\fpeval{\ListeMotsEmpilesMax}}{m{10pt}}}% + \Block{1-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}}{}\xintFor* ##1 in {\xintSeq {1}{\fpeval{\useKV[ClesMotEmpile]{Colonne}}}}\do{&}&$\downarrow$\xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpilesMax-\useKV[ClesMotEmpile]{Colonne}-1}}}\do{&}\\ + \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpileslen}}}\do{% + \rule[-1.2ex]{0pt}{3.8ex}\stepcounter{CompteurMotEmpile}\Alph{CompteurMotEmpile}&\Block{1-\fpeval{\ListeMotsEmpiles[##1,1]}}{}\xintFor* ##2 in {\xintSeq {1}{\fpeval{\ListeMotsEmpiles[##1,1]}}}\do{% + & + }% + \StrLen{\ListeMotsEmpiles[##1,2]}[\LongueurMot]% + \xintFor* ##3 in {\xintSeq {1}{\fpeval{\LongueurMot}}}\do{% + \xintifForFirst{}{&}\Block[draw=black]{1-1}{\ifboolKV[ClesMotEmpile]{Solution}{\centering\arraybackslash\StrMid{\ListeMotsEmpiles[##1,2]}{##3}{##3}}{}}%% + }% + \\ + }% + \CodeAfter\tikz\draw[line width=1.5pt,MotEmpileCouleur](row-2-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}) rectangle (row-\fpeval{\ListeMotsEmpileslen+2}-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+3}); + \end{NiceTabular}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCNombreAstral.tex b/macros/latex/contrib/profcollege/latex/PfCNombreAstral.tex new file mode 100644 index 0000000000..ea30623503 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCNombreAstral.tex @@ -0,0 +1,220 @@ +%%% +% Nombre Astral +%%% +\setKVdefault[NombreAstral]{Solution=false,Graines=false,Echelle=1} +\defKV[NombreAstral]{Graine=\setKV[NombreAstral]{Graines}}% + +\newtoks\toklisteNANombres% +\newtoks\toklisteNAMelange% +\def\UpdatetoksNANombres#1\nil{\addtotok\toklisteNANombres{"#1",}}% +\def\UpdatetoksNAMelange#1\nil{\addtotok\toklisteNAMelange{#1,}}% + +\NewDocumentCommand\NombreAstral{o}{% + \toklisteNANombres{}% + \toklisteNAMelange{}% + \useKVdefault[NombreAstral]% + \setKV[NombreAstral]{#1}% + \ifboolKV[NombreAstral]{Graines}{\PfCGraineAlea{\useKV[NombreAstral]{Graine}}}{}% + \xdef\PfCNACible{\fpeval{2*randint(25,45)}}% + \xdef\PfCNAListeNombres{}% + \xintFor* ##1 in{\xintSeq{11}{\fpeval{floor(\PfCNACible/3)}}}\do{% + \xdef\PfCNAListeNombres{\PfCNAListeNombres ##1,}% + }% + \MelangeListe{\PfCNAListeNombres}{5}% + \setsepchar{,}\ignoreemptyitems% + \readlist*\PfCNAListeNombresBase{\faa}% + \reademptyitems + \readlist*\PfCNAListeNombres{% + \PfCNAListeNombresBase[1],% + \PfCNAListeNombresBase[2],% + \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[5]-\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[3]},% + \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[5]},% + \PfCNAListeNombresBase[3],% + \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[3]-\PfCNAListeNombresBase[5]-\PfCNAListeNombresBase[1]},% + \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[1]},% + \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[1]-\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[3]},% + \PfCNAListeNombresBase[4],% + \PfCNAListeNombresBase[5]% + }% + \foreachitem\compteur\in\PfCNAListeNombres{\expandafter\UpdatetoksNANombres\compteur\nil}% + \xdef\PfCNAListeAEffacer{1,2,3,4,5,6,7,8,9,10}% + \MelangeListe{\PfCNAListeAEffacer}{6}% + \ignoreemptyitems% + \readlist*\PfCNAListeMelange{\faa}% + \reademptyitems% + \foreachitem\compteur\in\PfCNAListeMelange{\expandafter\UpdatetoksNAMelange\compteur\nil}% + \BuildNombreAstral{\the\toklisteNANombres}{\the\toklisteNAMelange}% +}% + +\NewDocumentCommand\BuildNombreAstral{m m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + Cible=\PfCNACible; + + boolean Solution; + Solution:=\useKV[NombreAstral]{Solution}; + + Echelle:=\useKV[NombreAstral]{Echelle}; + + string Rappel[]; + Rayon:=4cm; + + path cc,ca[]; + cc=cercles((0,0),Rayon); + + pair A[],C[],D[]; + for k=1 upto 5: + C[k]=pointarc(cc,90+(k-1)*72); + endfor; + + D1=C2+30*unitvector(C2-C4); + D2=C2+30*unitvector(C2-C5); + D3=C3+30*unitvector(C3-C1); + D4=C4+30*unitvector(C4-C1); + D5=C5+30*unitvector(C5-C3); + + drawarrow C2--D1; + drawarrow C2--D2; + drawarrow C3--D3; + drawarrow C4--D4; + drawarrow C5--D5; + + label.ulft(TEX("\bfseries\Large"&decimal(Cible)),D1); + label.lft(TEX("\bfseries\Large"&decimal(Cible)),D2); + label.llft(TEX("\bfseries\Large"&decimal(Cible)),D3); + label.lrt(TEX("\bfseries\Large"&decimal(Cible)),D4); + label.urt(TEX("\bfseries\Large"&decimal(Cible)),D5); + + trace polygone(C1,C3,C5,C2,C4) withpen (pencircle scaled 8); + A1=C1; + A2=C2; + A9=C3; + A10=C4; + A5=C5; + A3=segment(C1,C3) intersectionpoint segment(C2,C5); + A4=segment(C1,C4) intersectionpoint segment(C2,C5); + A6=segment(C1,C3) intersectionpoint segment(C2,C4); + A7=segment(C1,C4) intersectionpoint segment(C3,C5); + A8=segment(C2,C4) intersectionpoint segment(C3,C5); + for k=1 upto 10: + ca[k]=cercles(A[k],0.6u); + fill ca[k] withcolor white; + trace ca[k]; + endfor; + vardef Affichage(text t)= + n:=0; + for p_=t: + n:=n+1; + Rappel[n]=p_; + label(TEX("\Large"&p_),A[n]); + endfor; + enddef; + + vardef Suppression(text t)= + k:=0; + for p_=t: + k:=k+1; + fill ca[p_] withcolor white; + trace ca[p_]; + label(TEX("\Large"&Rappel[p_]),u*(-7,5.6-1.5k)); + trace cercles(u*(-7,5.6-1.5k),0.6u); + endfor; + enddef; + + Affichage(#1); + if Solution=false: + Suppression(#2); + fi; + picture recap;% + recap:=currentpicture scaled Echelle;% + currentpicture:=nullpicture;% + draw recap;% + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + Echelle:=\useKV[NombreAstral]{Echelle}; + Cible=\PfCNACible;boolean Solution;Solution:=\useKV[NombreAstral]{Solution}; + string Rappel[]; + n:=0; + for p_=#1: + n:=n+1; + Rappel[n]=p_; + endfor; + }] + + Rayon:=4cm; + + path cc,ca[]; + cc=cercles((0,0),Rayon); + + pair A[],C[],D[]; + for k=1 upto 5: + C[k]=pointarc(cc,90+(k-1)*72); + endfor; + + D1=C2+30*unitvector(C2-C4); + D2=C2+30*unitvector(C2-C5); + D3=C3+30*unitvector(C3-C1); + D4=C4+30*unitvector(C4-C1); + D5=C5+30*unitvector(C5-C3); + + drawarrow C2--D1; + drawarrow C2--D2; + drawarrow C3--D3; + drawarrow C4--D4; + drawarrow C5--D5; + + label.ulft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)&""),D1); + label.lft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D2); + label.llft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D3); + label.lrt(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D4); + label.urt(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D5); + + trace polygone(C1,C3,C5,C2,C4) withpen (pencircle scaled 8); + A1=C1; + A2=C2; + A9=C3; + A10=C4; + A5=C5; + A3=segment(C1,C3) intersectionpoint segment(C2,C5); + A4=segment(C1,C4) intersectionpoint segment(C2,C5); + A6=segment(C1,C3) intersectionpoint segment(C2,C4); + A7=segment(C1,C4) intersectionpoint segment(C3,C5); + A8=segment(C2,C4) intersectionpoint segment(C3,C5); + for k=1 upto 10: + ca[k]=cercles(A[k],0.6u); + fill ca[k] withcolor white; + trace ca[k]; + endfor; + vardef Affichage(text t)= + n:=0; + for p_=t: + n:=n+1; + label(LATEX("\noexpand\Large"&Rappel[n]),A[n]); + endfor; + enddef; + + vardef Suppression(text t)= + k:=0; + for p_=t: + k:=k+1; + fill ca[p_] withcolor white; + trace ca[p_]; + label(LATEX("\noexpand\Large"&Rappel[p_]),u*(-7,5.6-1.5k)); + trace cercles(u*(-7,5.6-1.5k),0.6u); + endfor; + enddef; + + Affichage(#1); + if Solution=false: + Suppression(#2); + fi; + + picture recap;% + recap:=currentpicture scaled Echelle;% + currentpicture:=nullpicture;% + draw recap;% + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCNotionFonction.tex b/macros/latex/contrib/profcollege/latex/PfCNotionFonction.tex new file mode 100644 index 0000000000..bb3305deb1 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCNotionFonction.tex @@ -0,0 +1,581 @@ + + + + +%%% +% Fonction +%%% +\setKVdefault[ClesFonction]{Nom=f,Variable=x,Calcul=x,Tableau=false,Largeur=5mm,Ecriture=false,Definition=false,Points=false,Tangentes=false,PasX=1,PasY=1,UniteX=1,UniteY=1,Prolonge=false,Trace=false,Catmull=false,Epaisseur=1,Couleur=black,CouleurTrace=black,PointsCourbe=true,Codes=false,Origine={(0,0)},Vide=false} +\defKV[ClesFonction]{Traces=\setKV[ClesFonction]{Codes}}% + +\newtoks\toklistePtsFn%pour la discipline + +\def\UpdatePtsFn#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{#1,(#2,#3),#4,}}% +\def\UpdatePtsFN#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{(#2,#3),}}% + +\NewDocumentCommand\Fonction{o m}{% + \useKVdefault[ClesFonction]% + \setKV[ClesFonction]{#1}% + \ifboolKV[ClesFonction]{Trace}{% + \useKVdefault[TraceG]% + \setKV[TraceG]{#1}% + \MPTraceFonction[#1]{\useKV[ClesFonction]{Calcul}}% + }{% + \ifboolKV[ClesFonction]{Points}{% + \toklistePtsFn{}% + \setsepchar[*]{§*/}%\ignoreemptyitems% + \readlist*\ListePoints{#2}% + \ifboolKV[ClesFonction]{Catmull}{% + \xdef\PfCFooListePoints{(\ListePoints[1,2],\ListePoints[1,3]),}% + \foreachitem\compteur\in\ListePoints{% + \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),}% + }% + \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\ListePointslen,2],\ListePoints[\ListePointslen,3]),}% + \MPCatmull{\PfCFooListePoints}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}% + }{% + \xdef\PfCFooListePoints{} + \ifboolKV[ClesFonction]{Tangentes}{% + \foreachitem\compteur\in\ListePoints{% + % \expandafter\UpdatePtsFn\compteur\nil% + \xdef\PfCFooListePoints{\PfCFooListePoints \ListePoints[\compteurcnt,1],(\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),\ListePoints[\compteurcnt,4],}% + }% + }{% + \foreachitem\compteur\in\ListePoints{% + % \expandafter\UpdatePtsFN\compteur\nil% + \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),}% + }% + }% + \MPCourbeNew{\PfCFooListePoints}%\the\toklistePtsFn}% + }% + }{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeFonction{#2}% + \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{\i}[\temp]% + \StrSubstitute{\useKV[ClesFonction]{Calcul}}{**}{^}[\tempa]% + \StrSubstitute{\tempa}{*}{}[\tempab]% + \ifboolKV[ClesFonction]{Ecriture}{% + \ensuremath{\useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})=\tempab}% + }{}% + \ifboolKV[ClesFonction]{Definition}{% + \ensuremath{\useKV[ClesFonction]{Nom}:\useKV[ClesFonction]{Variable}\mapsto\tempab}% + }{}% + \ifboolKV[ClesFonction]{Tableau}{% + \buildtabfonction% + }{}% + \reademptyitems% + }% + }% +}% + +\def\MPCourbeNew#1{%#2#3#4#5#6{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + x.u:=\useKV[ClesFonction]{PasX}; + y.u:=\useKV[ClesFonction]{PasY}; + X.u:=\useKV[ClesFonction]{UniteX}; + Y.u:=\useKV[ClesFonction]{UniteY}; + Epaisseur:=\useKV[ClesFonction]{Epaisseur}; + + boolean Prolonge,Tangentes,PointsCourbe,Codes; + Prolonge=\useKV[ClesFonction]{Prolonge}; + Tangentes=\useKV[ClesFonction]{Tangentes}; + PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; + Codes=\useKV[ClesFonction]{Codes}; + + color CouleurTrace; + CouleurTrace=\useKV[ClesFonction]{CouleurTrace}; + + def enplace= + xscaled X.u yscaled Y.u + enddef; + + vardef placepoint(expr q,r)= + (q,r)*cm enplace + enddef; + + numeric dirav[],dirap[]; + pair Fn[],Gn[]; + n=0; + if Tangentes: + for p_=#1: + if (n mod 3)=0: + dirav[n div 3]=p_; + fi; + if (n mod 3)=1: + Gn[n div 3]=p_; + Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + fi; + if (n mod 3)=2: + dirap[n div 3]=p_; + fi; + n:=n+1; + endfor; + N:=(n-1) div 3; + else: + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + fi; + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + for k=0 upto N: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + if MinY<0: + if MinY<>ceiling(MinY): + MinY:=ceiling(MinY)-1; + fi; + fi; + if MinX<0: + if MinX<>ceiling(MinX): + MinX:=ceiling(MinX)-1; + fi; + fi; + if MaxY<>ceiling(MaxY): + MaxY:=ceiling(MaxY); + fi; + if MaxX<>ceiling(MaxX): + MaxX:=ceiling(MaxX); + fi; + if MaxX<1: + MaxX:=1; + fi; + if MaxY<1: + MaxY:=1; + fi; + if Prolonge: + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX step x.u until MaxX: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + else: + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + fi; + if Prolonge: + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0); + else: + drawarrow (0,(MinY-1)*Y.u*cm)--(0*cm,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0*cm)--((MaxX+1)*X.u*cm,0*cm); + fi; + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + draw if Tangentes: + Fn[0]{dir dirap[0]} + for k=1 upto (N-1): + ..{dir dirav[k]}Fn[k]{dir dirap[k]} + endfor + ..{dir dirav[N]}Fn[N] + else: + Fn[0] + for k=1 upto N: + ..Fn[k] + endfor fi withpen pencircle scaled Epaisseur withcolor CouleurTrace; + if PointsCourbe: + if Prolonge: + for k=1 upto N-1: + fill cercles(Fn[k],0.5mm); + endfor; + else: + for k=0 upto N: + fill cercles(Fn[k],0.5mm); + endfor; + fi; + fi; + if Codes: + \useKV[ClesFonction]{Traces}; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + x.u:=\useKV[ClesFonction]{PasX};y.u:=\useKV[ClesFonction]{PasY}; + X.u:=\useKV[ClesFonction]{UniteX};Y.u:=\useKV[ClesFonction]{UniteY}; + Epaisseur:=\useKV[ClesFonction]{Epaisseur}; + boolean Prolonge,Tangentes,PointsCourbe,Codes; + Prolonge=\useKV[ClesFonction]{Prolonge}; + Tangentes=\useKV[ClesFonction]{Tangentes}; + PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; + Codes=\useKV[ClesFonction]{Codes}; + color CouleurTrace; + CouleurTrace=\useKV[ClesFonction]{CouleurTrace}; + }] + def enplace= + xscaled X.u yscaled Y.u + enddef; + vardef placepoint(expr q,r)= + (q,r)*cm enplace + enddef; + numeric dirav[],dirap[]; + pair Fn[],Gn[]; + n=0; + if Tangentes: + for p_=#1: + if (n mod 3)=0: + dirav[n div 3]=p_; + fi; + if (n mod 3)=1: + Gn[n div 3]=p_; + Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + fi; + if (n mod 3)=2: + dirap[n div 3]=p_; + fi; + n:=n+1; + endfor; + N:=(n-1) div 3; + else: + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + fi; + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + for k=0 upto N: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + if MinY<0: + if MinY<>ceiling(MinY): + MinY:=ceiling(MinY)-1; + fi; + fi; + if MinX<0: + if MinX<>ceiling(MinX): + MinX:=ceiling(MinX)-1; + fi; + fi; + if MaxY<>ceiling(MaxY): + MaxY:=ceiling(MaxY); + fi; + if MaxX<>ceiling(MaxX): + MaxX:=ceiling(MaxX); + fi; + if MaxX<1: + MaxX:=1; + fi; + if MaxY<1: + MaxY:=1; + fi; + if Prolonge: + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX step x.u until MaxX: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + else: + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + fi; + if Prolonge: + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0); + else: + drawarrow (0,(MinY-1)*Y.u*cm)--(0*cm,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0*cm)--((MaxX+1)*X.u*cm,0*cm); + fi; + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + draw if Tangentes: + Fn[0]{dir dirap[0]} + for k=1 upto (N-1): + ..{dir dirav[k]}Fn[k]{dir dirap[k]} + endfor + ..{dir dirav[N]}Fn[N] + else: + Fn[0] + for k=1 upto N: + ..Fn[k] + endfor fi withpen pencircle scaled Epaisseur withcolor CouleurTrace; + if PointsCourbe: + if Prolonge: + for k=1 upto N-1: + fill cercles(Fn[k],0.5mm); + endfor; + else: + for k=0 upto N: + fill cercles(Fn[k],0.5mm); + endfor; + fi; + fi; + \end{mpost} + \fi +} + +\def\MPCatmull#1#2#3#4#5{% + % #1 la liste des points + % #2: pas en x + % #3: pas en y + % #4: unit\'e en x + % #5: unit\'e en y + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean PointsCourbe; + PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; + + boolean Code; + Code=\useKV[ClesFonction]{Codes}; + + x.u:=#2; + y.u:=#3; + X.u:=#4; + Y.u:=#5; + + def enplace= + xscaled X.u yscaled Y.u + enddef; + + vardef placepoint(expr q,r)= + (q,r)*cm enplace + enddef; + + pair Fn[],Gn[]; + n=0; + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + debutbalai=0; + finbalai=N; + if \useKV[ClesFonction]{Prolonge}: + debutbalai:=2; + finbalai:=N-2; + fi; + for k=debutbalai upto finbalai: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + if MaxY<1: + MaxY:=2; + fi; + if MinY>-1: + MinY:=-2; + fi; + if MinY<0: + if MinY<>ceiling(MinY): + MinY:=ceiling(MinY)-1; + fi; + fi; + if MinX<0: + if MinX<>ceiling(MinX): + MinX:=ceiling(MinX)-1; + fi; + fi; + if MaxY<>ceiling(MaxY): + MaxY:=ceiling(MaxY); + fi; + if MaxX<>ceiling(MaxX): + MaxX:=ceiling(MaxX); + fi; + if MaxX<1: + MaxX:=1; + fi; + if MaxY<1: + MaxY:=1; + fi; + % + path cadreexterieur; + cadreexterieur=(((MinX-1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MaxY+1)*Y.u*cm)--((MinX-1)*X.u*cm,(MaxY+1)*Y.u*cm)--cycle); + draw Fn[1] + for k=2 upto N-1: + ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} + endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur} withcolor \useKV[ClesFonction]{Couleur}; + clip currentpicture to cadreexterieur; + picture RetiensCourbe; + RetiensCourbe=currentpicture; + currentpicture:=nullpicture; + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + if PointsCourbe: + for k=debutbalai upto finbalai: + fill cercles(Fn[k],0.5mm); + endfor; + fi; + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); + % + draw RetiensCourbe; + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + if Code: + \useKV[ClesFonction]{Traces}; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={numeric Epaisseur; Epaisseur=\useKV[ClesFonction]{Epaisseur}; color CouleurCourbe; CouleurCourbe=\useKV[ClesFonction]{Couleur};boolean PointsCourbe;PointsCourbe=\useKV[ClesFonction]{PointsCourbe};}] + x.u:=#2; + y.u:=#3; + X.u:=#4; + Y.u:=#5; + + pair Fn[],Gn[]; + n=0; + for p_=#1: + Gn[n]=p_; + Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); + n:=n+1; + endfor; + N:=(n-1); + MinX=999; + MaxX=-999; + MinY=999; + MaxY=-999; + debutbalai=0; + finbalai=N; + if \useKV[ClesFonction]{Prolonge}: + debutbalai:=2; + finbalai:=N-2; + fi; + for k=debutbalai upto finbalai: + if xpart(Gn[k])<MinX: + MinX:=xpart(Gn[k]); + fi; + if xpart(Gn[k])>MaxX: + MaxX:=xpart(Gn[k]); + fi; + if ypart(Gn[k])<MinY: + MinY:=ypart(Gn[k]); + fi; + if ypart(Gn[k])>MaxY: + MaxY:=ypart(Gn[k]); + fi; + endfor; + if MaxY<1: + MaxY:=2; + fi; + if MinY>-1: + MinY:=-2; + fi; + if MinY<0: + if MinY<>ceiling(MinY): + MinY:=ceiling(MinY)-1; + fi; + fi; + if MinX<0: + if MinX<>ceiling(MinX): + MinX:=ceiling(MinX)-1; + fi; + fi; + if MaxY<>ceiling(MaxY): + MaxY:=ceiling(MaxY); + fi; + if MaxX<>ceiling(MaxX): + MaxX:=ceiling(MaxX); + fi; + if MaxX<1: + MaxX:=1; + fi; + if MaxY<1: + MaxY:=1; + fi; + % + path cadreexterieur; + cadreexterieur=(((MinX-1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MaxY+1)*Y.u*cm)--((MinX-1)*X.u*cm,(MaxY+1)*Y.u*cm)--cycle); + draw Fn[1] + for k=2 upto N-1: + ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} + endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur} withcolor \useKV[ClesFonction]{Couleur}; + clip currentpicture to cadreexterieur; + picture RetiensCourbe; + RetiensCourbe=currentpicture; + currentpicture:=nullpicture; + for k=MinY-1 step y.u until MaxY+1: + draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; + endfor; + for k=MinX-1 step x.u until MaxX+1: + draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; + endfor; + if PointsCourbe: + for k=debutbalai upto finbalai: + fill cercles(Fn[k],0.5mm); + endfor; + fi; + drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); + drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); + % + draw RetiensCourbe; + label.llft(btex O etex,(0,0)); + dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); + dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); + \end{mpost} + \fi +}% + +\def\buildtabfonction{% + \[% + \begin{array}{|>{\columncolor{gray!15}}c|*{\number\numexpr\ListeFonctionlen}{>{\centering\arraybackslash}p{\useKV[ClesFonction]{Largeur}}|}}% + \hline% + \useKV[ClesFonction]{Variable}\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{&\num{\ListeFonction[##1]}}\\ + \hline% + \useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{& \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{(\ListeFonction[##1])}[\tempab]\num{\fpeval{\tempab}}}% + \\\hline + \end{array}% + \]% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCOperationsTrou.tex b/macros/latex/contrib/profcollege/latex/PfCOperationsTrou.tex new file mode 100644 index 0000000000..e5c9c7a568 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCOperationsTrou.tex @@ -0,0 +1,71 @@ +%%% +% Op\'erations pos\'es à trou +%%% +%% D'après https://tex.stackexchange.com/questions/277246/drawing-a-circle-around-the-numbers-in-xlop-package + +\newcommand\PfCchiffre[2]{\tikz[remember picture] \node[inner sep=0pt](#1){#2};} + +\newcommand\PfCentoure[2]{\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)]{} ;} + +\newcounter{divxlop}% +\newcounter{mulxlop}% +\newcounter{addxlop}% +\newcounter{subxlop}% + +\setKVdefault[ClesOperations]{Solution=false,CouleurCadre=LightSteelBlue,CouleurSolution=red,CouleurFond=white,CouleurVirgule=white} + +\newcommand\Division[3][]{% + \useKVdefault[ClesOperations]% + \setKV[ClesOperations]{#1}% + \setcounter{divxlop}{0}% + \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}% + \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}{PfCSolOp}}{\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{mulxlop}{0}% + \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% + \opmul[decimalsepsymbol={,},lineheight=2em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}% + \foreach \i in {1,...,\themulxlop}{% + \PfCentoure{A\i}{A\i}% + }% +}% + +\newcommand\Addition[3][]{% + \useKVdefault[ClesOperations]% + \setKV[ClesOperations]{#1}% + \setcounter{addxlop}{0}% + \ifboolKV[ClesOperations]{Solution}{\opset{carryadd,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carryadd=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% + \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3} + \foreach \i in {1,...,\theaddxlop}{% + \PfCentoure{A\i}{A\i}% + }% +}% + +\newcommand\Soustraction[3][]{% + \useKVdefault[ClesOperations]% + \setKV[ClesOperations]{#1}% + \setcounter{subxlop}{0}% + \ifboolKV[ClesOperations]{Solution}{\opset{carrysub,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carrysub=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% + \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}% + \foreach \i in {1,...,\thesubxlop}{% + \PfCentoure{A\i}{A\i} + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPapiers.tex b/macros/latex/contrib/profcollege/latex/PfCPapiers.tex new file mode 100644 index 0000000000..8196c4d557 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPapiers.tex @@ -0,0 +1,457 @@ +%%% +% Papiers +%%% +\setKVdefault[Papiers]{Cinq=true,Seyes=false,Echelle=8,Isometrique=false,IsometriquePointe=false,Millimetre=false,Triangle=false,Largeur=5,Hauteur=4,Couleur=black,Grille=-1,GrillePointe=-1,PageEntiere=false,ZoneTexte=false,Baseline=false,CodeAfter=false}% +\defKV[Papiers]{Traces=\setKV[Papiers]{CodeAfter}} + +%\def\MPBaseLineSkip#1#2#3{%à retravailler : ne fonctionne pas :( +% % +% \ifluatex +% \mplibforcehmode +% \begin{mplibcode} +% path horizon,verticon; +% horizon=(0,0)--(#1*cm,0); +% %verticon=(0,0)--(0,#2*cm); +% drawoptions(withcolor #3); +% %for k=0 step 0.5 until #1: +% %draw verticon shifted((k*cm,0)); +% %endfor; +% for k=(#2-(\mpdim{1.6ex}/1cm)) step (-\mpdim{\baselineskip}/1cm) until 0: +% draw horizon shifted((0,k*cm)); +% endfor; +% drawoptions(withcolor blue); +% for k=#2 step (-\mpdim{\baselineskip}/1cm) until 0: +% draw horizon shifted((0,k*cm)); +% endfor; +% \end{mplibcode} +% \fi +%} + +\def\MPGrille#1#2#3#4{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step (#4*100) until (#1*100): + draw verticon shifted(((k/100)*cm,0)); + endfor; + for k=0 step (#4*100) until (#2*100): + draw horizon shifted((0,(k/100)*cm)); + endfor; + \end{mplibcode}% + \else% + \begin{mpost}% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step 0.5 until #1: + draw verticon shifted((k*cm,0)); + endfor; + for k=0 step 0.5 until #2: + draw horizon shifted((0,k*cm)); + endfor; + \end{mpost}% + \fi% +}% + +\def\MPGrillePointe#1#2#3#4{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + drawoptions(withcolor #3); + for k=0 step (#4*100) until (#1*100): + for l=0 step (#4*100) until (#2*100): + fill (cercles((0,0),1pt) shifted(((k/100)*cm,(l/100)*cm))); + endfor; + endfor; + \end{mplibcode}% + \else% + \begin{mpost}% + drawoptions(withcolor #3); + for k=0 step (#4*100) until (#1*100): + for l=0 step (#4*100) until (#2*100): + fill (cercles((0,0),0.5pt) shifted(((k/100)*cm,(l/100)*cm))); + endfor; + endfor; + \end{mpost}% + \fi% +}% + +\def\MPCinq#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step 0.5 until #1: + draw verticon shifted((k*cm,0)); + endfor; + for k=0 step 0.5 until #2: + draw horizon shifted((0,k*cm)); + endfor; + if \useKV[Papiers]{CodeAfter}: + \useKV[Papiers]{Traces}; + fi; + \end{mplibcode}% + \else% + \begin{mpost} + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step 0.5 until #1: + draw verticon shifted((k*cm,0)); + endfor; + for k=0 step 0.5 until #2: + draw horizon shifted((0,k*cm)); + endfor; + \end{mpost}% + \fi% +}% + +\def\MPSeyes#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + u:=\useKV[Papiers]{Echelle}; + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step u until (#1*10): + draw verticon shifted(((k/10)*cm,0)); + endfor; + for k=0 step (u/4) until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; + endfor; + for k=0 step u until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25; + endfor; + \end{mplibcode}% + \else% + \begin{mpost}[mpsettings={u:=\useKV[Papiers]{Echelle};}]% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step u until (#1*10): + draw verticon shifted(((k/10)*cm,0)); + endfor; + for k=0 step (u/4) until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; + endfor; + for k=0 step u until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25; + endfor; + \end{mpost} + \fi% +}% + +\def\MPMillimetre#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step 1 until (#1*10): + draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2; + endfor; + for k=0 step 5 until (#1*10): + draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5; + endfor; + for k=0 step 1 until (#1): + draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25; + endfor; + for k=0 step 1 until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2; + endfor; + for k=0 step 5 until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; + endfor; + for k=0 step 1 until (#2): + draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25; + endfor; + \end{mplibcode}% + \else% + \begin{mpost}% + path horizon,verticon; + horizon=(0,0)--(#1*cm,0); + verticon=(0,0)--(0,#2*cm); + drawoptions(withcolor #3); + for k=0 step 1 until (#1*10): + draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2; + endfor; + for k=0 step 5 until (#1*10): + draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5; + endfor; + for k=0 step 1 until (#1): + draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25; + endfor; + for k=0 step 1 until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2; + endfor; + for k=0 step 5 until (#2*10): + draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; + endfor; + for k=0 step 1 until (#2): + draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25; + endfor; + \end{mpost}% + \fi% +}% + +\def\MPIsometrique#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + path diagon,antidiagon; + diagon=(0,0)--#2*(sqrt(3)*cm,1*cm); + antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm); + drawoptions(withcolor #3); + for k=0 step 1 until (#1): + draw diagon shifted((k*cm,0)); + draw antidiagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)/3) until (#2): + draw diagon shifted((0,k*cm)); + draw antidiagon shifted((#1*cm,k*cm)); + endfor; + clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); + \end{mplibcode}% + \else% + \begin{mpost}% + path diagon,antidiagon; + diagon=(0,0)--#2*(sqrt(3)*cm,1*cm); + antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm); + drawoptions(withcolor #3); + for k=0 step 1 until (#1): + draw diagon shifted((k*cm,0)); + draw antidiagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)/3) until (#2): + draw diagon shifted((0,k*cm)); + draw antidiagon shifted((#1*cm,k*cm)); + endfor; + clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); + \end{mpost}% + \fi% +}% + +\def\MPIsometriquePointe#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + pair diagon,antidiagon; + diagon=(1pt,1pt); + antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3)); + drawoptions(withcolor #3); + for k=0 step (sqrt(3)/3) until (#2): + for l=0 step 1 until (#1): + fill (cercles(diagon,1pt) shifted((l*cm,k*cm))); + fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm))); + endfor; + endfor; + clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt)); + \end{mplibcode}% + \else% + \begin{mpost}% + pair diagon,antidiagon; + diagon=(1pt,1pt); + antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3)); + drawoptions(withcolor #3); + for k=0 step (sqrt(3)/3) until (#2): + for l=0 step 1 until (#1): + fill (cercles(diagon,1pt) shifted((l*cm,k*cm))); + fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm))); + endfor; + endfor; + clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt)); + \end{mpost}% + \fi% +}% + +\def\MPTriangulaire#1#2#3{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + path horizon,diagon,antidiagon; + horizon=(0,0)--(#1*cm,0); + diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm); + antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm); + drawoptions(withcolor #3); + for k=0 step 1 until #1: + draw diagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)) until (#2): + draw diagon shifted((0,k*cm)); + endfor; + for k=0 step 1 until (#1): + draw antidiagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)) until (#2): + draw antidiagon shifted((#1*cm,k*cm)); + endfor; + for k=0 step (sqrt(3)/2) until (#2): + draw horizon shifted((0,k*cm)); + endfor; + clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); + \end{mplibcode}% + \else% + \begin{mpost}% + path horizon,diagon,antidiagon; + horizon=(0,0)--(#1*cm,0); + diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm); + antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm); + drawoptions(withcolor #3); + for k=0 step 1 until #1: + draw diagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)) until (#2): + draw diagon shifted((0,k*cm)); + endfor; + for k=0 step 1 until (#1): + draw antidiagon shifted((k*cm,0)); + endfor; + for k=0 step (sqrt(3)) until (#2): + draw antidiagon shifted((#1*cm,k*cm)); + endfor; + for k=0 step (sqrt(3)/2) until (#2): + draw horizon shifted((0,k*cm)); + endfor; + clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); + \end{mpost}% + \fi% +}% + +\RequirePackage{ifoddpage} + +\newlength{\PapierLeftCurrent} + +\newcommand\Papiers[1][]{% + \useKVdefault[Papiers]% + \setKV[Papiers]{#1}% + \xdef\PapierLargeur{\useKV[Papiers]{Largeur}}% + \xdef\PapierHauteur{\useKV[Papiers]{Hauteur}}% + \xdef\PapierCouleur{\useKV[Papiers]{Couleur}}% + \xdef\PapierGrille{\useKV[Papiers]{Grille}}% + \xdef\PapierGrillePointe{\useKV[Papiers]{GrillePointe}}% + \ifboolKV[Papiers]{ZoneTexte}{% + \checkoddpage\ifoddpage% + \setlength{\PapierLeftCurrent}{\oddsidemargin}% + \else% + \setlength{\PapierLeftCurrent}{\evensidemargin}% + \fi% + \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% + \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% + \xdef\PapierHauteur{\fpeval{\textheight/1cm}}% + \xdef\PapierLargeur{\fpeval{\textwidth/1cm}}% + \begin{tikzpicture}[remember picture,overlay]% + \node[anchor=south west,inner sep=0pt,transform canvas={xshift=\PapierLeft,yshift=\PapierBottom}] at (current page.south west) {% + \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% + \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% + }{% + \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% + \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% + }{\ifboolKV[Papiers]{Baseline}{% + \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{% + \ifboolKV[Papiers]{IsometriquePointe}{% + \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{% + \ifboolKV[Papiers]{Triangle}{% + \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Millimetre}{% + \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Isometrique}{% + \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Seyes}{% + \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }% + }% + }% + }% + }% + }% + }% + }% + };% + \end{tikzpicture}% + }{% + \ifboolKV[Papiers]{PageEntiere}{% + \checkoddpage\ifoddpage% + \setlength{\PapierLeftCurrent}{\oddsidemargin}% + \else% + \setlength{\PapierLeftCurrent}{\evensidemargin}% + \fi% + \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% + \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% + \xdef\PapierHauteur{\fpeval{\paperheight/1cm}}% + \xdef\PapierLargeur{\fpeval{\paperwidth/1cm}}% + \begin{tikzpicture}[remember picture,overlay]% + \node[anchor=south west,inner sep=0pt] at (current page.south west) {% + \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% + \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% + }{% + \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% + \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% + }{\ifboolKV[Papiers]{IsometriquePointe}{% + \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Triangle}{% + \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Millimetre}{% + \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Isometrique}{% + \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Seyes}{% + \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }% + }% + }% + }% + }% + }% + }% + };% + \end{tikzpicture}% + }{% + \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% + \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% + }{% + \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% + \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% + }{\ifboolKV[Papiers]{Baseline}{% + \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{% + \ifboolKV[Papiers]{IsometriquePointe}{% + \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{% + \ifboolKV[Papiers]{Triangle}{% + \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Millimetre}{% + \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Isometrique}{% + \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\ifboolKV[Papiers]{Seyes}{% + \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPixelArt.tex b/macros/latex/contrib/profcollege/latex/PfCPixelArt.tex new file mode 100644 index 0000000000..4fa0847d61 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPixelArt.tex @@ -0,0 +1,143 @@ +%%% +% PixelArt +%%% +\newtoks\toklistePANombre% +\def\UpdatetoksPANombre#1\nil{\addtotok\toklistePANombre{"#1",}}% + +\setKVdefault[ClesPixelArt]{Largeur=29,Hauteur=29,Solution=false,Lettres=ABCDEFGHIJK,Nombres=false,ListeCouleurs={Orange,Red,LightGray,Maroon,Purple,black,black,Plum,Orange,White,White},Unite=5mm} +\defKV[ClesPixelArt]{ListeNombres=\setKV[ClesPixelArt]{Nombres}} + +\NewDocumentCommand\PixelArt{o m}{% + \toklistePANombre{}% + \useKVdefault[ClesPixelArt]% + \setKV[ClesPixelArt]{#1}% + \xdef\ListeAvantCouleurs{\useKV[ClesPixelArt]{ListeCouleurs}}% + \xdef\ListeAvantNombres{\useKV[ClesPixelArt]{ListeNombres}}% + \setsepchar{,}% + \readlist*\ListePANombre{\ListeAvantNombres}% + \foreachitem\compteur\in\ListePANombre{\expandafter\UpdatetoksPANombre\compteur\nil}% + \BuildPixelArt{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}% +}% + +\NewDocumentCommand\BuildPixelArt{m m m m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + largeur:=\useKV[ClesPixelArt]{Largeur}; + hauteur:=\useKV[ClesPixelArt]{Hauteur}; + Unite:=\useKV[ClesPixelArt]{Unite}; + boolean Solution,Nombres; + Solution:=\useKV[ClesPixelArt]{Solution}; + Nombres:=\useKV[ClesPixelArt]{Nombres}; + string BaseLettres; + BaseLettres=str #2; + + color ColorEntier[],ColFond; + n:=0; + for p_=#3: + n:=n+1; + ColorEntier[n]:=p_; + endfor; + + string RetiensNombres[]; + if Nombres: + n:=0; + for p_=#4: + n:=n+1; + RetiensNombres[n]=p_; + endfor; + fi; + + vardef Lecturecsv(expr nomfichier)= + for h=hauteur downto 1: + string p_; + p_=readfrom nomfichier; + l:=0; + for p=0 step 2 until 2*largeur-2: + l:=l+1; + if (substring(p,p+1) of p_)="-": + else: + if Nombres: + for m=0 upto (length BaseLettres-1): + if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: + label(TEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite)); + fi; + endfor; + else: + label(TEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite)); + fi; + if Solution: + for m=0 upto (length BaseLettres-1): + if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: + ColFond:=ColorEntier[m+1]; + fi; + endfor; + if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; + fi; + trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); + fi; + endfor; + endfor; + closefrom nomfichier; + enddef; + + Lecturecsv("#1"); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres};}] + string BaseLettres; + BaseLettres=str #2; + + color ColorEntier[],ColFond; + n:=0; + for p_=#3: + n:=n+1; + ColorEntier[n]:=p_; + endfor; + + string RetiensNombres[]; + if Nombres: + n:=0; + for p_=#4: + n:=n+1; + RetiensNombres[n]=p_; + endfor; + fi; + + vardef Lecturecsv(expr nomfichier)= + for h=hauteur downto 1: + string p_; + p_=readfrom nomfichier; + l:=0; + for p=0 step 2 until 2*largeur-2: + l:=l+1; + if (substring(p,p+1) of p_)="-": + else: + if Nombres: + for m=0 upto (length BaseLettres-1): + if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: + label(LATEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite)); + fi; + endfor; + else: + label(LATEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite)); + fi; + if Solution: + for m=0 upto (length BaseLettres-1): + if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: + ColFond:=ColorEntier[m+1]; + fi; + endfor; + if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; + fi; + trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); + fi; + endfor; + endfor; + closefrom nomfichier; + enddef; + + Lecturecsv("#1"); + \end{mpost} + \fi +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPourcentage.tex b/macros/latex/contrib/profcollege/latex/PfCPourcentage.tex new file mode 100644 index 0000000000..ff0bdd753f --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPourcentage.tex @@ -0,0 +1,67 @@ +%%% +% Application : pourcentage +%%% +\setKVdefault[ClesPourcentage]{Appliquer,Calculer=false,Augmenter=false,Reduire=false,Fractionnaire=false,Decimal,Formule=false,Unite=g,Concret=false,GrandeurA=Grandeur A,GrandeurB=Total,Largeur=1cm,MotReduction=diminution,AideTableau=false,ColorFill=white,CouleurTab=gray!15} + +\newcommand\Pourcentage[3][]{% + \useKVdefault[ClesPourcentage]% + \setKV[ClesPourcentage]{#1}% + \ifboolKV[ClesPourcentage]{Reduire}{% + \ifboolKV[ClesPourcentage]{Formule}{% + R\'eduire une quantit\'e de \num{#2}~\%, cela revient \`a multiplier cette quantit\'e par $1-\dfrac{\num{#2}}{100}$. Par cons\'equent, si on r\'eduit \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne : + \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1-\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1-\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1-#2/100)}}=\num{\fpeval{#3*(1-#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\] + }{% + Calculons ce que repr\'esente la \useKV[ClesPourcentage]{MotReduction} de \num{#2}~\%. + \ifboolKV[ClesPourcentage]{AideTableau}{% + \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% + \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% + \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% + \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% + \begin{center} + \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100} + \end{center} + \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}% + On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}. Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.% + }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul : + \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% + On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.} + } + }{% + \ifboolKV[ClesPourcentage]{Augmenter}{% + \ifboolKV[ClesPourcentage]{Formule}{% + Augmenter de \num{#2}~\% une quantit\'e, cela revient \`a multiplier cette quantit\'e par $1+\dfrac{\num{#2}}{100}$. Par cons\'equent, si on augmente \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne : + \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1+\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1+\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1+#2/100)}}=\num{\fpeval{#3*(1+#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\] + }{% + Calculons ce que repr\'esente l'augmentation de \num{#2}~\%. % + \ifboolKV[ClesPourcentage]{AideTableau}{% + \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% + \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% + \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% + \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% + \begin{center}% + \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100}% + \end{center}% + \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}% + On obtient une augmentation de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.% + }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul : + \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% + On obtient une augmentation de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.} + } + }{% + \ifboolKV[ClesPourcentage]{Calculer}{% + \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% + \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% + \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% + \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% + \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{\num{#2}/\num{#3},/100}% + \xdef\colorfill{\useKV[ClesPourcentage]{ColorFill}}% + \FlechesPB{2}{1}{\scriptsize$\times\num{\fpeval{#3/100}}$}% + \FlechesPH{1}{2}{\scriptsize$\div\num{\fpeval{#3/100}}$}% + \xdef\ResultatPourcentage{\fpeval{#2*100/#3}}% + }{% + Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul :% + \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCProbabilites.tex b/macros/latex/contrib/profcollege/latex/PfCProbabilites.tex new file mode 100644 index 0000000000..58de59761c --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCProbabilites.tex @@ -0,0 +1,288 @@ +%%% +% Proba +%%% +\setKVdefault[ClesProba]{Echelle=false,Arbre=false,Branche=2,Angle=60,Rayon=0.25,LongueurEchelle=5,Affichage=0,Grille=1,Incline} + +\def\Updatetoksproba#1/#2\nil{\addtotok\toklistepointproba{"#1","\footnotesize #2",}} +\def\Updatetoksprobapdf#1/#2\nil{\addtotok\toklistepointproba{"#1","\noexpand\footnotesize #2",}} +\def\Updatetoksprobaechelle#1/#2/#3\nil{\addtotok\toklistepointproba{#1,#2,"#3",}} + +\newtoks\toklistepointproba + +% Pour construire l'arbre de probabilit\'e +\def\buildarbreproba{% + \toklistepointproba{}% + \ifluatex + \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksproba\compteur\nil}% + \else + \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobapdf\compteur\nil}% + \fi + \MPArbreProba{\useKV[ClesProba]{Branche}}{\useKV[ClesProba]{Angle}}{\the\toklistepointproba}{\useKV[ClesProba]{Rayon}}% +}% + +% Pour construire l'\'echelle de probabilit\'e +\def\buildechelleproba{% + \toklistepointproba{}% + \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobaechelle\compteur\nil}% + \MPEchelleProbaUn{\useKV[ClesProba]{LongueurEchelle}}{\the\toklistepointproba}{\useKV[ClesProba]{Affichage}}{\useKV[ClesProba]{Grille}}% +} + +\def\MPEchelleProbaUn#1#2#3#4{% + % #1:longueur du segment repr\'esentant l'\'echelle + % #2:Liste des \'ev\`enements/proba + % #3: pour l'affichage des labels (0 : rien, 1: fleches, 2 : fleches+ev\`enements, 3: fleches+proba, 4 : tout) + % #4 : dimension de "la grille" associ\'ee + \ifluatex + \begin{mplibcode} + pair A,B,C[],D[];%les noeuds de l'arbre + %Figure(-10u,-10u,10u,10u); + A=u*(1,1); + B-A=u*(#1,0); + draw segment(A,B); + draw marquesegment(A,B); + marque_s:=marque_s/2; + if #4>1: + for k=0 upto (#4-1): + D[k]=(k/#4)[A,B]; + endfor; + if (#4 mod 2)=0: + for k=0 step 2 until (#4-1): + draw marquesegment(D[k],D[k+1]); + endfor; + else: + for k=1 step 2 until (#4-1): + draw marquesegment(D[k],D[k+1]); + endfor; + fi; + fi; + marque_s:=marque_s*2; + labeloffset:=labeloffset*3; + label.bot(btex 0 etex,A); + label.bot(btex 1 etex,B); + labeloffset:=labeloffset/3; + n:=1;%compter les informations + k:=1;% compter les informations noeud pour les placer + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + num:=p_; + fi; + if (n mod 3)=2: + deno:=p_; + fi; + if (n mod 3=0): + C[k]=(num/deno)[A,B]; + if (#3>0): + drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15)); + fi; + if (#3=2) or (#3=4): + dotlabel.top(TEX(p_),C[k]); + fi; + if (#3=1) or (#3=3): + dotlabel.top("",C[k]); + fi; + if (#3>2): + label.bot(TEX("$\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5)); + fi; + k:=k+1; + fi; + n:=n+1; + endfor; + enddef; + toto(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + pair A,B,C[],D[];%les noeuds de l'arbre + Figure(-10u,-10u,10u,10u); + A=u*(1,1); + B-A=u*(#1,0); + draw segment(A,B); + draw marquesegment(A,B); + marque_s:=marque_s/2; + if #4>1: + for k=0 upto (#4-1): + D[k]=(k/#4)[A,B]; + endfor; + if (#4 mod 2)=0: + for k=0 step 2 until (#4-1): + draw marquesegment(D[k],D[k+1]); + endfor; + else: + for k=1 step 2 until (#4-1): + draw marquesegment(D[k],D[k+1]); + endfor; + fi; + fi; + marque_s:=marque_s*2; + labeloffset:=labeloffset*3; + label.bot(btex 0 etex,A); + label.bot(btex 1 etex,B); + labeloffset:=labeloffset/3; + n:=1;%compter les informations + k:=1;% compter les informations noeud pour les placer + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + num:=p_; + fi; + if (n mod 3)=2: + deno:=p_; + fi; + if (n mod 3=0): + C[k]=(num/deno)[A,B]; + if (#3>0): + drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15)); + fi; + if (#3=2) or (#3=4): + dotlabel.top(LATEX(p_),C[k]); + fi; + if (#3=1) or (#3=3): + dotlabel.top("",C[k]); + fi; + if (#3>2): + label.bot(LATEX("$\noexpand\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5));%Le \noexpand est n\'ecessaire pour \'eviter un probl\`eme \`a la compilation, dû \`a l'expansion du \frac par gmp. + fi; + k:=k+1; + fi; + n:=n+1; + endfor; + enddef; + toto(#2); + \end{mpost} + \fi +} + +\def\MPArbreProba#1#2#3#4{% + % #1:longueur d'une branche + % #2:angle entre deux branches de m\^eme origine + % #3:Liste des \'ev\`enements/proba + \ifluatex + \begin{mplibcode} + boolean Incline; + Incline=\useKV[ClesProba]{Incline}; + pair A[],B[];%les noeuds de l'arbre + A0=u*(1,1); + B0-A0=u*(#1,0); + A1=rotation(B0,A0,#2/2); + A2=rotation(B0,A0,-#2/2); + B1-A1=B0-A0; + A3=rotation(B1,A1,#2/3); + A4=rotation(B1,A1,-#2/3); + B2-A2=B0-A0; + A5=rotation(B2,A2,#2/3); + A6=rotation(B2,A2,-#2/3); + draw segment(A4,A1); + draw segment(A5,A2); + draw chemin(A3,A1,A0,A2,A6); + for k=1 upto 6: + fill cercles(A[k],#4*cm) withcolor white; + endfor; + n:=1;%compter les informations + k:=1;% compter les informations noeud pour les placer + l:=1;% compter les informations "num\'eriques" + vardef toto(text t)= + for p_=t: + if (n mod 2)=1: + if p_<>"": + label(TEX(p_),A[k]); + fi; + k:=k+1; + else: + if (l mod 2)=1: + if p_<>"": + if Incline: + draw appelation(A[(l-1) div 2],A[l],4mm,TEX(p_)); + else: + label.ulft(TEX(p_),iso(A[(l-1) div 2],A[l])); + fi; + fi; + else: + if p_<>"": + if Incline: + draw appelation(A[(l-1) div 2],A[l],-4mm,TEX(p_)); + else: + label.llft(TEX(p_),iso(A[(l-1) div 2],A[l])); + fi; + fi; + fi; + l:=l+1; + fi; + n:=n+1; + endfor; + enddef; + toto(#3); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={%input PfCGeometrie; + boolean Incline; Incline=\useKV[ClesProba]{Incline};}] + pair A[],B[];%les noeuds de l'arbre + %Figure(-10u,-10u,10u,10u); + A0=u*(1,1); + B0-A0=u*(#1,0); + A1=rotation(B0,A0,#2/2); + A2=rotation(B0,A0,-#2/2); + B1-A1=B0-A0; + A3=rotation(B1,A1,#2/3); + A4=rotation(B1,A1,-#2/3); + B2-A2=B0-A0; + A5=rotation(B2,A2,#2/3); + A6=rotation(B2,A2,-#2/3); + draw segment(A4,A1); + draw segment(A5,A2); + draw chemin(A3,A1,A0,A2,A6); + for k=1 upto 6: + fill cercles(A[k],#4*cm) withcolor white; + endfor; + n:=1;%compter les informations + k:=1;% compter les informations noeud pour les placer + l:=1;% compter les informations "num\'eriques" + vardef toto(text t)= + for p_=t: + if (n mod 2)=1: + if p_<>"": + label(LATEX(p_),A[k]); + fi; + k:=k+1; + else: + if (l mod 2)=1: + if p_<>"": + if Incline: + draw appelation(A[(l-1) div 2],A[l],4mm,LATEX(p_)); + else: + label.ulft(LATEX(p_),iso(A[(l-1) div 2],A[l])); + fi; + fi; + else: + if p_<>"": + if Incline: + draw appelation(A[(l-1) div 2],A[l],-4mm,LATEX(p_)); + else: + label.llft(LATEX(p_),iso(A[(l-1) div 2],A[l])); + fi; + fi; + fi; + l:=l+1; + fi; + n:=n+1; + endfor; + enddef; + toto(#3); + \end{mpost} + \fi +} + +\newcommand\Proba[2][]{% + \useKVdefault[ClesProba]% + \setKV[ClesProba]{#1}% + % On liste les diff\'erents \'el\'ements sous la forme Ev\`enement/proba + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeProba{#2}% + \ifboolKV[ClesProba]{Echelle}{% + \buildechelleproba% + }{\ifboolKV[ClesProba]{Arbre}{% + \buildarbreproba% + }{}% + }% + \setsepchar{,}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCProgrammeCalcul.tex b/macros/latex/contrib/profcollege/latex/PfCProgrammeCalcul.tex new file mode 100644 index 0000000000..fd1a46d6e3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCProgrammeCalcul.tex @@ -0,0 +1,170 @@ +%%%% +% Prog de calculs "simples" +%%%% +\setKVdefault[ClesProg]{% + Ecart=2em,% + Direct,% + SansCalcul=false,% + Application=false, + Details=false, + Enonce=false, + Nom={}, + CouleurCadre=black,% + CouleurFond=gray!10,% + Largeur={.95\linewidth},% + Epaisseur=.75pt,% + Pointilles=0, + ThemePerso=false, +} + +\newcounter{NBprog}% +\setcounter{NBprog}{0}% + +\newlength{\PointillesClesProg}% + +\newcommand\ProgCalcul[2][]{% + % #1 : cl\'es + % #2 : \'etapes + \useKVdefault[ClesProg]% + \setKV[ClesProg]{#1}% + \ifboolKV[ClesProg]{ThemePerso}{}{% + \tcbset{ProgCalcul/.style={% + boxsep=1mm, + bottom=.75mm, + middle=2mm, + boxrule={\useKV[ClesProg]{Epaisseur}}, + text width={\useKV[ClesProg]{Largeur}}, + colframe={\useKV[ClesProg]{CouleurCadre}}, + colback={\useKV[ClesProg]{CouleurFond}}, + halign upper=center + }% + }% + }% + \ifboolKV[ClesProg]{Application}{% + % % by Thomas Dehon and cp + \setsepchar[*]{§*,} + % \setsepchar[*]{,* }% + \ignoreemptyitems% + \readlist*\ListeTotale{#2}% + \xdef\PfCPCfoo{\ListeTotale[1]}% + \xdef\PfCPCfaa{\ListeTotale[2]}% + %% + \setsepchar{,}% \ignoreemptyitems% + \readlist*\ListeEtapes{\PfCPCfoo}% + \setsepchar[*]{,* }\ignoreemptyitems% + \readlist*\ListeProg{\PfCPCfaa}% + \begin{tcolorbox}[% + ProgCalcul,% + ] + \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}% + {}% + {% + {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}% + \tcblower + }% + \ifboolKV[ClesProg]{SansCalcul}{% + \begin{enumerate} + \item Choisir un nombre~\pointilles~$\ListeProg[1]$% + \foreachitem\etape\in\ListeEtapes{% + \item \etape~\pointilles~$\ListeProg[3,\etapecnt]$ + }% + \end{enumerate} + }{\begin{enumerate} + \item Choisir un nombre~\pointilles~\xdef\NbDepart{\ListeProg[1]}\num{\NbDepart} + \foreachitem\etape\in\ListeEtapes{% + \item \etape~\pointilles~\edef\Test{\ListeProg[2,\etapecnt]}% + \expandarg% + \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% + \StrSubstitute{\tempa}{**}{^}[\tempab]% + \StrSubstitute{\tempab}{*}{\times}[\tempac]% + \StrSubstitute{\tempac}{/}{\div}[\tempad]% + $\ifboolKV[ClesProg]{Details}{\xintifboolexpr{\NbDepart<0}{(\num{\NbDepart})}{\num{\NbDepart}}\tempad=}{}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\etapecnt]}}\num{\NbDepart}$% + }% + \end{enumerate} + } + \end{tcolorbox} + }{% + \ifboolKV[ClesProg]{Enonce}{% + % by Thomas Dehon + \setsepchar[*]{,* }% + \ignoreemptyitems% + \readlist*\ListeEtapes{#2}% + \begin{tcolorbox}[% + ProgCalcul,% + ] + \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}% + {}% + {% + {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}% + \tcblower + }% + \begin{enumerate} + \foreachitem\etape\in\ListeEtapes{% + \item \etape + \ifthenelse{\equal{\useKV[ClesProg]{Pointilles}}{0}}% + {}% + {% + \setlength{\PointillesClesProg}{\useKV[ClesProg]{Pointilles}} + \hfill \pointilles[\PointillesClesProg]% + }% + } + \end{enumerate} + \end{tcolorbox} + }{% + \setsepchar[*]{,* }\ignoreemptyitems% + \readlist*\ListeProg{#2}% + \stepcounter{NBprog}% + \xdef\NbDepart{\ListeProg[1]}% + \ifboolKV[ClesProg]{SansCalcul}{% + $\NbDepart$\foreachitem\compteur\in\ListeProg[2]{% + \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\hspace{0.2em}$\ListeProg[3,\compteurcnt]$% + }% + \begin{tikzpicture}[remember picture, overlay] + \foreachitem\compteur\in\ListeProg[2]{% + \edef\Test{\ListeProg[2,\compteurcnt]} + \expandarg% + \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% + \StrSubstitute{\tempa}{**}{^}[\tempab]% + \StrSubstitute{\tempab}{*}{\times}[\tempac]% + \StrSubstitute{\tempac}{/}{\div}[\tempad]% + \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) -- + node[above]{\scriptsize$\tempad$}(pic cs:B-\theNBprog-\compteurcnt); + } + \end{tikzpicture} + }{% + \num{\NbDepart}\foreachitem\compteur\in\ListeProg[2]{% + \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\compteurcnt]}}\hspace{0.2em}\num{\NbDepart}% + }% + \ifboolKV[ClesProg]{Direct}{% + \begin{tikzpicture}[remember picture, overlay] + \foreachitem\compteur\in\ListeProg[2]{% + \edef\Test{\ListeProg[2,\compteurcnt]} + \expandarg% + \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% + \StrSubstitute{\tempa}{**}{^}[\tempab]% + \StrSubstitute{\tempab}{*}{\times}[\tempac]% + \StrSubstitute{\tempac}{/}{\div}[\tempad]% + \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) -- + node[above]{\scriptsize$\tempad$}(pic + cs:B-\theNBprog-\compteurcnt); + } + \end{tikzpicture} + }{% + \begin{tikzpicture}[remember picture, overlay] + \foreachitem\compteur\in\ListeProg[2]{% + \edef\Test{\ListeProg[2,\compteurcnt]} + \expandarg% + \StrSubstitute{\Test}{^2}{\empty\sqrt{\dots{}}}[\tempa]% + \StrSubstitute{\tempa}{**}{^}[\tempab]% + \StrSubstitute{\tempab}{*}{\div}[\tempac]% + \StrSubstitute{\tempac}{/}{\times}[\tempad]% + \StrSubstitute{\tempad}{-}{+}[\tempae]% + \StrSubstitute{\tempae}{++}{-}[\tempaf]% + \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:B-\theNBprog-\compteurcnt) -- node[above]{\scriptsize$\tempaf$}(pic cs:A-\theNBprog-\compteurcnt); + } + \end{tikzpicture} + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPropor.tex b/macros/latex/contrib/profcollege/latex/PfCPropor.tex new file mode 100644 index 0000000000..b72e4d5a5d --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPropor.tex @@ -0,0 +1,332 @@ +%%% +% Proportionnalit\'e +%%% +\setKVdefault[ClesPropor]{GrandeurA=Grandeur A,GrandeurB=Grandeur B,Largeur=1cm,Math=false,Stretch=1,ColorFill=white,CouleurTab=gray!15,Vertical=false,Simple=false}% + +\def\Updatetoksmath#1/#2\nil{\addtotok\tabtoksa{}\addtotok\tabtoksb{}}% +\def\updatetokspropor#1/#2\nil{\addtotok\tabtoksa{&\num{#1}}\addtotok\tabtoksb{&\num{#2}}} +\def\Buildtabpropor{% + \setcounter{NbProporG}{0}% + \setcounter{NbProporD}{0}% + \renewcommand{\arraystretch}{\useKV[ClesPropor]{Stretch}}% + \ifboolKV[ClesPropor]{Vertical}{% + \begin{tabular}{c|*{2}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}c}% + \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPH}&\multicolumn{1}{c}{\TikzPH}&\\ + \hhline{~--~}% + &\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}&\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}&\\ + \hhline{~--~}% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeValeurlen}}}\do{% + \stepcounter{NbProporG}\TikzPG&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,1]}{\num{\ListeValeur[##1,1]}}&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,2]}{\num{\ListeValeur[##1,2]}}&\stepcounter{NbProporD}\TikzPD\\ + \hhline{~--~}% + }% + \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPB}&\multicolumn{1}{c}{\TikzPB}&\\ + \end{tabular}% + }{% + \tabtoksa{}\tabtoksb{}% + \ifboolKV[ClesPropor]{Simple}{}{% + \tabtoksa{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}}% + \tabtoksb{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}}% + }% + \ifboolKV[ClesPropor]{Math}{% + \foreachitem\compteur\in\ListeValeur{\expandafter\Updatetoksmath\compteur\nil}% + }{\foreachitem\compteur\in\ListeValeur{\expandafter\updatetokspropor\compteur\nil}% + }% + \xdef\LongListe{\ListeValeurlen}% + \ifboolKV[ClesPropor]{Simple}{% + \begin{tabular}{r|*{\number\numexpr\ListeValeurlen}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}l}% + \multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPH}}&\multicolumn{1}{c}{}\\% + \hhline{~*{\number\numexpr\ListeValeurlen}{-}~}% + \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}\the\tabtoksa&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% + \hhline{~*{\number\numexpr\ListeValeurlen}{-}~}% + \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}\the\tabtoksb&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% + \hhline{~*{\number\numexpr\ListeValeurlen}{-}~}% + \multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPB}}&\multicolumn{1}{c}{}\\% + \end{tabular}% + }{% + \begin{tabular}{rc|*{\number\numexpr\ListeValeurlen}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}l}% + \multicolumn{1}{c}{}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPH}}&\multicolumn{1}{c}{}\\% + \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% + \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksa&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% + \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% + \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksb&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% + \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% + \multicolumn{1}{c}{\stepcounter{NbProporG}\TikzPG}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPB}}&\multicolumn{1}{c}{}\\% + \end{tabular}% + }% + }% + \renewcommand{\arraystretch}{1}% +}% + +\newcounter{NbPropor}% + +\newcommand\TikzPH{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporH-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}% + \stepcounter{NbPropor}% +}% + +\newcommand\TikzPB{% + \tikz[remember picture, overlay]{% + \coordinate[name=ProporB-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}% + \stepcounter{NbPropor}% +}% + +\newcommand\TikzPG{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporG-\theNbProporG,xshift=\tabcolsep+\arrayrulewidth,yshift=\getstrut\dp];}% +}% +\newcommand\TikzPD{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporD-\theNbProporD,xshift=-\tabcolsep-\arrayrulewidth,yshift=\getstrut\dp];}% +}% + +\newcommand\TikzPHD{% + \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}% + \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}% + \xintifboolexpr{\wd1>\wd2}{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporHD,xshift=-0.5\wd1,yshift=-\getstrut\dp*\arraystretch];}% + }{% + \tikz[remember picture,overlay]{% + \coordinate[name=ProporHD,xshift=-0.5\wd2,yshift=-\getstrut\dp*\arraystretch];}% + } +}% + +\newcommand\TikzPBD{% + \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}% + \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}% + \xintifboolexpr{\wd1>\wd2}{% + \tikz[remember picture, overlay]{% + \coordinate[name=ProporBD,xshift=-0.5*\the\wd1,yshift=\getstrut\ht*\arraystretch];}% + }{% + \tikz[remember picture, overlay]{% + \coordinate[name=ProporBD,xshift=-0.5*\the\wd2,yshift=\getstrut\ht*\arraystretch];}% + } + \stepcounter{NbPropor}% +}% +% +\newcommand\FlechesPH[3]{% + \begin{tikzpicture}[remember picture,overlay]% + \ifnum#1<#2\relax% + \draw[-stealth,out=50,in=130] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);% + \else% + \draw[-stealth,out=130,in=50] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);% + \fi% + \end{tikzpicture}% +}% +% +\newcommand\FlechesPB[3]{% + \ifnum\number#1<\number#2\relax% + \begin{tikzpicture}[remember picture,overlay]% + \draw[-stealth,out=-50,in=-130] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);% + \end{tikzpicture}% + \else% + \begin{tikzpicture}[remember picture,overlay]% + \draw[-stealth,out=-130,in=-50] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);% + \end{tikzpicture}% + \fi% +}% +% +\newcommand\FlechesPG[3]{% + \begin{tikzpicture}[remember picture,overlay]% + \ifnum#1<#2\relax% + \draw[-stealth,out=-150,in=150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,left]{#3}(ProporG-#2);% + \else% + \draw[-stealth,out=150,in=-150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, left]{#3}(ProporG-#2);% + \fi% + \end{tikzpicture}% +}% + +\newcommand\FlechesPD[3]{% + \begin{tikzpicture}[remember picture,overlay]% + \ifnum#1<#2\relax% + \draw[-stealth,out=-30,in=30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);% + \else% + \draw[-stealth,out=30,in=-30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);% + \fi% + \end{tikzpicture}% +}% + +\NewDocumentCommand\FlechePCH{mm}{% + \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% + \node[inner sep=0pt] (MilieuH-#1) at ($(ProporH-#1)!0.33!(ProporB-#1)$) {};% + \node[inner sep=0pt] (MilieuH-#2) at ($(ProporH-#2)!0.33!(ProporB-#2)$) {};% + \node[inner sep=0pt] (MilieuB-#1) at ($(ProporH-#1)!0.67!(ProporB-#1)$) {};% + \node[inner sep=0pt] (MilieuB-#2) at ($(ProporH-#2)!0.67!(ProporB-#2)$) {};% + \xintifboolexpr{#1<#2}{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[left of=MilieuH-#2] (aux2);% + \coordinate[right of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=-150,in=-30,gray] (aux3) to (aux4); + }{% + \coordinate[left of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[right of=MilieuB-#2] (aux4);% + \draw[out=-30,in=-150,gray] (aux3) to (aux4); + }% + \draw[gray] (aux2) -- (aux3); + \draw[-stealth,gray] (aux4) -- (aux1); + \end{tikzpicture}% +}% + +\NewDocumentCommand\FlechePCB{mm}{% + \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% + \node[inner sep=0pt] (MilieuH-#1) at ($(ProporH-#1)!0.33!(ProporB-#1)$) {};% + \node[inner sep=0pt] (MilieuH-#2) at ($(ProporH-#2)!0.33!(ProporB-#2)$) {};% + \node[inner sep=0pt] (MilieuB-#1) at ($(ProporH-#1)!0.67!(ProporB-#1)$) {};% + \node[inner sep=0pt] (MilieuB-#2) at ($(ProporH-#2)!0.67!(ProporB-#2)$) {};% + \xintifboolexpr{#1<#2}{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[left of=MilieuH-#2] (aux2);% + \coordinate[right of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=150,in=30,gray] (aux1) to (aux2); + }{% + \coordinate[left of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[right of=MilieuB-#2] (aux4);% + \draw[out=30,in=150,gray] (aux1) to (aux2); + }% + \draw[gray] (aux4) -- (aux1); + \draw[-stealth,gray] (aux2) -- (aux3); + \end{tikzpicture}% +}% + +\NewDocumentCommand\FlechePCG{mm}{% + \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% + \node[inner sep=0pt] (MilieuH-#1) at ($(ProporG-#1)!0.25!(ProporD-#1)$) {};% + \node[inner sep=0pt] (MilieuH-#2) at ($(ProporG-#2)!0.25!(ProporD-#2)$) {};% + \node[inner sep=0pt] (MilieuB-#1) at ($(ProporG-#1)!0.75!(ProporD-#1)$) {};% + \node[inner sep=0pt] (MilieuB-#2) at ($(ProporG-#2)!0.75!(ProporD-#2)$) {};% + \xintifboolexpr{#1<#2}{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=30,in=-30,gray] (aux3) to (aux4); + }{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=-30,in=30,gray] (aux3) to (aux4); + }% + \draw[gray] (aux2) -- (aux3); + \draw[-stealth,gray] (aux4) -- (aux1); + \end{tikzpicture}% +}% + +\NewDocumentCommand\FlechePCD{mm}{% + \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% + \node[inner sep=0pt] (MilieuH-#1) at ($(ProporG-#1)!0.25!(ProporD-#1)$) {};% + \node[inner sep=0pt] (MilieuH-#2) at ($(ProporG-#2)!0.25!(ProporD-#2)$) {};% + \node[inner sep=0pt] (MilieuB-#1) at ($(ProporG-#1)!0.75!(ProporD-#1)$) {};% + \node[inner sep=0pt] (MilieuB-#2) at ($(ProporG-#2)!0.75!(ProporD-#2)$) {};% + \xintifboolexpr{#1<#2}{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=150,in=-150,gray] (aux1) to (aux2); + }{% + \coordinate[right of=MilieuH-#1] (aux1);% + \coordinate[right of=MilieuH-#2] (aux2);% + \coordinate[left of=MilieuB-#1] (aux3);% + \coordinate[left of=MilieuB-#2] (aux4);% + \draw[out=-150,in=150,gray] (aux1) to (aux2); + }% + \draw[gray] (aux4) -- (aux1); + \draw[-stealth,gray] (aux2) -- (aux3); + \end{tikzpicture}% +}% + +\newcommand\FlecheLineaireG[4]{% + \begin{tikzpicture}[remember picture,overlay,node distance=1em]% + \node[inner sep=0pt] (MilieuH) at ($(ProporG-#1)!0.5!(ProporG-#2)$) {};% + \node[circle,draw,inner sep=0pt] [left of=MilieuH] (aux) {#4} ;% + \coordinate[left of=aux] (aux1);% + \draw[-stealth] (ProporG-#1) -| (aux);% + \draw[-stealth] (ProporG-#2) -| (aux);% + \draw[-stealth] (aux) -- (aux1) |- (ProporG-#3);% + \end{tikzpicture}% +}% + +\newcommand\FlecheLineaireD[4]{% + \begin{tikzpicture}[remember picture,overlay,node distance=1em]% + \node[inner sep=0pt] (MilieuH) at ($(ProporD-#1)!0.5!(ProporD-#2)$) {};% + \node[circle,draw,inner sep=0pt] [right of=MilieuH] (aux) {#4} ;% + \coordinate[right of=aux] (aux1);% + \draw[-stealth] (ProporD-#1) -| (aux);% + \draw[-stealth] (ProporD-#2) -| (aux);% + \draw[-stealth] (aux) -- (aux1) |- (ProporD-#3);% + \end{tikzpicture}% +}% + +\newcounter{NbProporG}% +\newcounter{NbProporD}% + +\newcommand\Propor[2][]{% + \useKVdefault[ClesPropor]% + \setKV[ClesPropor]{#1}% + \xdef\colorfill{\useKV[ClesPropor]{ColorFill}}% + \xdef\EcartLargeur{\useKV[ClesPropor]{Largeur}}% + % % on lit la liste \'ecrite sous la forme valeur/effectif + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeValeur{#2}% + \Buildtabpropor% +}% + +\newcommand\FlecheCoef[2][\EcartLargeur]{% + \begin{tikzpicture}[remember picture, overlay]% + \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};% + \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};% + \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);% + \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);% + \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);% + \end{tikzpicture}% +}% + +\newcommand\FlecheCoefDebut[2][\tabcolsep+\arrayrulewidth]{% + \begin{tikzpicture}[remember picture, overlay]% + \node[] (Noeud1) at ($(ProporHD)!0.1!(ProporBD)$) {};% + \node[] (Noeud2) at ($(ProporHD)!0.9!(ProporBD)$) {};% + \coordinate[left of=Noeud1,node distance=#1] (noeud1);% + \coordinate[left of=Noeud2,node distance=#1] (noeud2);% + \draw[-stealth,out=160,in=-160] (noeud2) to node[midway,left,inner sep=1pt]{#2}(noeud1);% + \end{tikzpicture}% +}% + +\newcommand\FlecheCoefInv[2][1cm]{% + \begin{tikzpicture}[remember picture, overlay]% + \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};% + \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};% + \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);% + \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);% + \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);% + \end{tikzpicture}% +}% + +\newcommand\FlecheLineaireH[4]{% + \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% + \node[inner sep=0pt] (MilieuH) at ($(ProporH-#1)!0.5!(ProporH-#2)$) {};% + \node[circle,draw,inner sep=0pt] [above of=MilieuH] (aux) {#4} ;% + \coordinate[above of=aux] (aux1);% + \draw[-stealth] (ProporH-#1) |- (aux);% + \draw[-stealth] (ProporH-#2) |- (aux);% + \draw[-stealth] (aux) -- (aux1) -| (ProporH-#3);% + \end{tikzpicture}% +}% + +\newcommand\FlecheLineaireB[4]{% + \begin{tikzpicture}[remember picture,overlay,node distance=3mm]% + \node[inner sep=0pt] (MilieuB) at ($(ProporB-#1)!0.5!(ProporB-#2)$) {};% + \node[circle,draw,inner sep=0pt] [below of=MilieuB] (aux) {#4};% + \coordinate[below of=aux,node distance=3mm] (aux1);% + \draw[-stealth] (ProporB-#1) |- (aux);% + \draw[-stealth] (ProporB-#2) |- (aux);% + \draw[-stealth] (aux) -- (aux1) -| (ProporB-#3);% + \end{tikzpicture}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCProprietesDroites.tex b/macros/latex/contrib/profcollege/latex/PfCProprietesDroites.tex new file mode 100644 index 0000000000..cbb7775806 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCProprietesDroites.tex @@ -0,0 +1,343 @@ +%%% +% Ppt\'es des droites (6eme) +%%% +\setKVdefault[ClesDroites]{Brouillon=false,CitePropriete=false,Num=1,Figure=false,Remediation=false} + +\newcommand\Redaction[4][]{% + \ifboolKV[ClesDroites]{Remediation}{% + \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% + + Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.% + + Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% + }{% + Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux parall\`eles \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% + } + }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.% + + Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.% + + Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. + }{% + Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. + } + }{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.% + + Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.% + + Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. + }{% + Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles, alors la droite $(\hbox to2em{\dotfill})$ qui est perpendiculaire \`a $(\hbox to2em{\dotfill})$ est \'egalement perpendiculaire \`a la droite $(\hbox to2em{\dotfill})$. + } + } + }% + }{% + \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont parall\`eles.% + + Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.% + + Donc les droites $(#2)$ et $(#3)$ sont parall\`eles. + }{% + Comme les droites $(#2)$ et $(#3)$ sont toutes les deux parall\`eles \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles. + } + }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(#2)$ et $(#4)$ sont perpendiculaires. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.% + + Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.% + + Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires. + }{% + Comme les droites $(#2)$ et $(#3)$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles. + } + }{% + \ifboolKV[ClesDroites]{CitePropriete}{% + Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.% + + Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.% + + Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires. + }{% + Comme les droites $(#2)$ et $(#4)$ sont parall\`eles, alors la droite $(#3)$ qui est perpendiculaire \`a $(#4)$ est \'egalement perpendiculaire \`a la droite $(#2)$. + }% + }% + }% + }% +}% + +\newcommand\Brouillon[4][]{% + \setlength{\abovedisplayskip}{0pt} + \ifboolKV[ClesDroites]{Remediation}{% + \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% + \[\left. + \begin{array}{l} + (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\ + \\ + (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) + \end{array} + \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) + \] + }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% + \[\left. + \begin{array}{l} + (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ + \\ + (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ + \end{array} + \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) + \] + }{% + \[\left. + \begin{array}{l} + (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\ + \\ + (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ + \end{array} + \right\}(\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill}) + \] + } + } + }{ + \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% + \[\left. + \begin{array}{l} + (#2)//(#4)\\ + \\ + (#3)//(#4) + \end{array} + \right\}(#2)//(#3) + \] + }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% + \[\left. + \begin{array}{l} + (#2)\perp(#4)\\ + \\ + (#3)\perp(#4)\\ + \end{array} + \right\}(#2)//(#3) + \] + }{% + \[\left. + \begin{array}{l} + (#2)//(#4)\\ + \\ + (#3)\perp(#4)\\ + \end{array} + \right\}(#2)\perp(#3) + \] + }% + }% + }% +}% + +\def\MPFigureDroite#1#2{% + \ifluatex + %\mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + pair A,B,C,D,E,F,G,H,I,J,K; + u:=7.5mm; + A=u*(1,3); + B-A=u*(3,2); + C-A=u*(2,-1); + E-C=u*(1,-1.5); + G-E=u*(1.5,0); + I-A=whatever*(B-A); + I-G=whatever*((B-A) rotated 90); + D-B=C-A; + F-D=E-C; + H=1.1[G,I]; + J=(C--D) intersectionpoint (G--H); + K=(E--F) intersectionpoint (G--H); + path Codeperp[]; + pair M[]; + M1-I=7*unitvector(B-I); + M3-I=7*unitvector(J-I); + M2-M3=M1-I; + Codeperp1=M1--M2--M3; + Codeperp2=Codeperp1 shifted(J-I); + picture Codepara[]; + pair R,S,T; + path cd; + Codepara1=image( + R=1/3[A,B]; + T=1/3[E,F]; + S=1/3[R,T]; + cd=(fullcircle scaled 6mm) shifted S; + drawoptions(withcolor 0.75*white); + drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); + drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); + draw cd; + label(btex $//$ etex ,S); + drawoptions(); + ); + Codepara2=image( + R:=1/2[C,D]; + T:=1/2[E,F]; + S:=1/2[R,T]; + cd:=(fullcircle scaled 6mm) shifted S; + drawoptions(withcolor 0.75*white); + drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); + drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); + draw cd; + label(btex $//$ etex ,S); + drawoptions(); + ); + path d[]; + d1=A--B; + d2=C--D; + d3=E--F; + d4=G--H; + picture reste; + reste=image( + %trac\'es des droites + draw d1; + if #1=2: + draw d2; + elseif #1=3: + draw d3; + fi; + if #2=3: + draw d3; + elseif #2=4: + draw d4; + fi; + % trac\'es des codes + if (#1=2) and (#2=3): + draw Codepara1; draw Codepara2; + fi; + if (#1=2) and (#2=4): + draw Codeperp1; draw Codeperp2; + fi; + if (#1=3) and (#2=4): + draw Codepara1; draw Codeperp1; + fi; + ); + reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180)); + draw reste; + \end{mplibcode} + %\mplibcodeinherit{disable} + \else + \begin{mpost} + pair A,B,C,D,E,F,G,H,I,J,K; + u:=7.5mm; + A=u*(1,3); + B-A=u*(3,2); + C-A=u*(2,-1); + E-C=u*(1,-1.5); + G-E=u*(1.5,0); + I-A=whatever*(B-A); + I-G=whatever*((B-A) rotated 90); + D-B=C-A; + F-D=E-C; + H=1.1[G,I]; + J=(C--D) intersectionpoint (G--H); + K=(E--F) intersectionpoint (G--H); + path Codeperp[]; + pair M[]; + M1-I=7*unitvector(B-I); + M3-I=7*unitvector(J-I); + M2-M3=M1-I; + Codeperp1=M1--M2--M3; + Codeperp2=Codeperp1 shifted(J-I); + picture Codepara[]; + pair R,S,T; + path cd; + Codepara1=image( + R=1/3[A,B]; + T=1/3[E,F]; + S=1/3[R,T]; + cd=(fullcircle scaled 6mm) shifted S; + drawoptions(withcolor 0.75*white); + drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); + drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); + draw cd; + label(btex $//$ etex ,S); + drawoptions(); + ); + Codepara2=image( + R:=1/2[C,D]; + T:=1/2[E,F]; + S:=1/2[R,T]; + cd:=(fullcircle scaled 6mm) shifted S; + drawoptions(withcolor 0.75*white); + drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); + drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); + draw cd; + label(btex $//$ etex ,S); + drawoptions(); + ); + path d[]; + d1=A--B; + d2=C--D; + d3=E--F; + d4=G--H; + picture reste; + reste=image( + %trac\'es des droites + draw d1; + if #1=2: + draw d2; + elseif #1=3: + draw d3; + fi; + if #2=3: + draw d3; + elseif #2=4: + draw d4; + fi; + % trac\'es des codes + if (#1=2) and (#2=3): + draw Codepara1; draw Codepara2; + fi; + if (#1=2) and (#2=4): + draw Codeperp1; draw Codeperp2; + fi; + if (#1=3) and (#2=4): + draw Codepara1; draw Codeperp1; + fi; + ); + reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180)); + draw reste; + \end{mpost} + \fi +} + +\newcommand\FaireFigure[4][]{% + \setlength{\abovedisplayskip}{0pt} + \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% + \MPFigureDroite{2}{3}% + }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% + \MPFigureDroite{2}{4}% + }{% + \MPFigureDroite{3}{4}% + }% + }% +}% + +\newcommand\ProprieteDroites[4][]{% + \useKVdefault[ClesDroites]% + \setKV[ClesDroites]{#1}% + \ifboolKV[ClesDroites]{Figure}{% + \begin{multicols}{2}% + \begin{center}% + \FaireFigure[#1]{#2}{#3}{#4}% + \end{center}% + \columnbreak + \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}% + \Redaction[#1]{#2}{#3}{#4}% + \par% + \end{multicols} + }{% + \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}% + \Redaction[#1]{#2}{#3}{#4}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPuissanceQuatre.tex b/macros/latex/contrib/profcollege/latex/PfCPuissanceQuatre.tex new file mode 100644 index 0000000000..87f14051ae --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPuissanceQuatre.tex @@ -0,0 +1,203 @@ +%%% +% Puissances 4 +%%% +\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,LargeurUn=2cm,Multiplication,Entier,Nombre,Exposant=false,Libre=false,Texte=false,Echelle=2}% +\defKV[ClesPQuatre]{Addition=\setKV[ClesPQuatre]{Multiplication=false}}% +\defKV[ClesPQuatre]{Relatif=\setKV[ClesPQuatre]{Entier=false}}% +\defKV[ClesPQuatre]{Puissance=\setKV[ClesPQuatre]{Exposant}}% +\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}\setKV[ClesPQuatre]{Libre}}% +\defKV[ClesPQuatre]{Consignes=\setKV[ClesPQuatre]{Texte}}% + +\newtoks\toklistePQuatreh% +\newtoks\toklistePQuatrev% +\def\UpdatetoksPQuatreh#1\nil{\addtotok\toklistePQuatreh{"#1",}}% +\def\UpdatetoksPQuatrev#1\nil{\addtotok\toklistePQuatrev{"#1",}}% + +\NewDocumentCommand\PQuatre{o +m}{% + \useKVdefault[ClesPQuatre]% + \toklistePQuatreh{}% + \toklistePQuatrev{}% + \setKV[ClesPQuatre]{#1}% + \ifboolKV[ClesPQuatre]{Nombre}{% + \ifboolKV[ClesPQuatre]{Exposant}{% + \def\PQuatreListe{$10^{-10}$,$10^{-9}$,$10^{-8}$,$10^{-7}$,$10^{-6}$,$10^{-5}$,$10^{-4}$,$10^{-3}$,$10^{-2}$,$10^{2}$,$10^{3}$,$10^{4}$,$10^{5}$,$10^{6}$,$10^{7}$,$10^{8}$,$10^{9}$,$10^{10}$}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeH{\faa}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeV{\faa}% + \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% + \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% + }{% + \ifboolKV[ClesPQuatre]{Entier}{% + % On choisit aléatoirement les listes de nombres de 2 à 10 en faisant deux listes : horizontale et verticale + \def\PQuatreListe{2,3,4,5,6,7,8,9,10}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeH{\faa}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeV{\faa}% + \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% + \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% + }{% + % On choisit aléatoirement les listes de nombres de -10 à -2 union 2 à 10 en faisant deux listes : horizontale et verticale + \def\PQuatreListe{$-10$,$-9$,$-8$,$-7$,$-6$,$-5$,$-4$,$-3$,$-2$,2,3,4,5,6,7,8,9,10}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeH{\faa}% + \MelangeListe{\PQuatreListe}{7}% + \readlist*\PQuatreListeV{\faa}% + \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% + \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% + }% + }% + }{% + % on lit la liste des données fournies par l'utilisateur + \setsepchar[*]{,*/}% + \readlist\PQuatreListes{#2}% + \setsepchar{,}% + \foreachitem\compteur\in\PQuatreListes[1]{\expandafter\UpdatetoksPQuatrev\compteur\nil}% + \foreachitem\compteur\in\PQuatreListes[2]{\expandafter\UpdatetoksPQuatreh\compteur\nil}% + }% + % Une fois les listes construites, on dessine et on place les listes. + \PQuatreGrille{\the\toklistePQuatrev}{\the\toklistePQuatreh}% +}% + +\NewDocumentCommand\PQuatreGrille{m m}{% + \ifluatex% + \mplibforcehmode% + \begin{mplibcode} + Largeur=\useKV[ClesPQuatre]{Largeur}; + LargeurUn=\useKV[ClesPQuatre]{LargeurUn}; + Echelle=\useKV[ClesPQuatre]{Echelle}; + color fond; + fond=\useKV[ClesPQuatre]{Couleur}; + boolean Libre,Multiplication,Texte; + Libre:=\useKV[ClesPQuatre]{Libre}; + Multiplication=\useKV[ClesPQuatre]{Multiplication}; + Texte:=\useKV[ClesPQuatre]{Texte}; + + if Texte: + string Consignes; + Consignes=\useKV[ClesPQuatre]{Consignes}; + fi; + + % On calcule le nombre de cases + nchauteur:=0; + for p_=#1: + nchauteur:=incr nchauteur; + endfor; + nclargeur:=0; + for p_=#2: + nclargeur:=incr nclargeur; + endfor; + if Libre=false: + nchauteur:=7; + nclargeur:=7; + fi; + %On affiche + pair A,B,C,D,H[],V[],M[][]; + A=(0,0); + B-A=Largeur*(nclargeur,0); + C-B=Largeur*(0,nchauteur); + D-C=A-B; + fill polygone(A,B,C,D) withcolor fond; + trace polygone(A,B,C,D); + for k=0 upto (nclargeur-1): + for l=0 upto (nchauteur-1): + M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); + fill cercles(M[k][l],0.4*Largeur) withcolor blanc; + trace cercles(M[k][l],0.4*Largeur); + endfor; + endfor; + labeloffset:=labeloffset*2; + if Libre: + if Texte: + label.llft(TEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); + fi; + else: + if Multiplication: + label.llft(btex $\times$ etex scaled Echelle,A); + else: + label.llft(btex $+$ etex scaled Echelle,A); + fi; + fi; + labeloffset:=labeloffset/2; + vardef Vertical(text t)= + n:=0; + for p_=t: + label.lft(TEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); + n:=n+1; + endfor; + enddef; + vardef Horizontal(text t)= + n:=0; + for p_=t: + label.bot(TEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); + n:=n+1; + endfor; + enddef; + labeloffset:=labeloffset*4; + Vertical(#1); + Horizontal(#2); + \end{mplibcode} + \else% + \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};Largeur=\useKV[ClesPQuatre]{Largeur};LargeurUn=\useKV[ClesPQuatre]{LargeurUn};Echelle=\useKV[ClesPQuatre]{Echelle};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Libre,Multiplication,Texte;Libre:=\useKV[ClesPQuatre]{Libre};Multiplication=\useKV[ClesPQuatre]{Multiplication};Texte:=\useKV[ClesPQuatre]{Texte};if Texte:string Consignes;Consignes=\useKV[ClesPQuatre]{Consignes};fi;}] + % On calcule le nombre de cases + nchauteur:=0; + for p_=#1: + nchauteur:=incr nchauteur; + endfor; + nclargeur:=0; + for p_=#2: + nclargeur:=incr nclargeur; + endfor; + if Libre=false: + nchauteur:=7; + nclargeur:=7; + fi; + %On affiche + pair A,B,C,D,H[],V[],M[][]; + A=(0,0); + B-A=Largeur*(nclargeur,0); + C-B=Largeur*(0,nchauteur); + D-C=A-B; + fill polygone(A,B,C,D) withcolor fond; + trace polygone(A,B,C,D); + for k=0 upto (nclargeur-1): + for l=0 upto (nchauteur-1): + M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); + fill cercles(M[k][l],0.4*Largeur) withcolor blanc; + trace cercles(M[k][l],0.4*Largeur); + endfor; + endfor; + labeloffset:=labeloffset*2; + if Libre: + if Texte: + label.llft(LATEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); + fi; + else: + if Multiplication: + label.llft(btex $\times$ etex scaled Echelle,A); + else: + label.llft(btex $+$ etex scaled Echelle,A); + fi; + fi; + labeloffset:=labeloffset/2; + vardef Vertical(text t)= + n:=0; + for p_=t: + label.lft(LATEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); + n:=n+1; + endfor; + enddef; + vardef Horizontal(text t)= + n:=0; + for p_=t: + label.bot(LATEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); + n:=n+1; + endfor; + enddef; + labeloffset:=labeloffset*4; + Vertical(#1); + Horizontal(#2); + \end{mpost} + \fi% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPuzzleSommePyramide.tex b/macros/latex/contrib/profcollege/latex/PfCPuzzleSommePyramide.tex new file mode 100644 index 0000000000..7f00ac287e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPuzzleSommePyramide.tex @@ -0,0 +1,134 @@ +%%% +% Puzzle Somme Pyramide +%%% +\setKVdefault[ClesPuzzleP]{Largeur=40pt,Etages=4,Graines=false,Solutions=false,Jeu,EnonceQuestion=false,NbLignes=7} +\defKV[ClesPuzzleP]{Graine=\setKV[ClesPuzzleP]{Graines}}% +\defKV[ClesPuzzleP]{Solution=\setKV[ClesPuzzleP]{Solutions}\setKV[ClesPuzzleP]{Jeu=false}}% +\defKV[ClesPuzzleP]{Questions=\setKV[ClesPuzzleP]{EnonceQuestion}\setKV[ClesPuzzleP]{Jeu=false}}% +\newcounter{PfCPuzzlePcpt} +\newcounter{PfCPuzzlePavcpt} +\newlength{\PfCPuzzleP} + +\NewDocumentCommand\PuzzlePyramideListeLettres{}{% + \setcounter{PfCPuzzlePcpt}{0}% + \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[1]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[2]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[3]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[4]}\Alph{PfCPuzzlePavcpt} et \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[5]}\Alph{PfCPuzzlePavcpt}% +} + +\NewDocumentCommand\PuzzlePyramide{o m}{% + \useKVdefault[ClesPuzzleP]% + \setKV[ClesPuzzleP]{#1}% + \ifboolKV[ClesPuzzleP]{Graines}{\PfCGraineAlea{\useKV[ClesPuzzleP]{Graine}}}{}% + \setsepchar{§} + \readlist*\PfCPuzzlePQuestions{#2}% + \setsepchar{,} + \setlength{\PfCPuzzleP}{\useKV[ClesPuzzleP]{Largeur}}% + \xdef\PfCPuzzlePLettres{1}% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[ClesPuzzleP]{Etages}*(\useKV[ClesPuzzleP]{Etages}+1)/2}}}\do{% + \xdef\PfCPuzzlePLettres{\PfCPuzzlePLettres,##1}% + }% + \MelangeListe{\PfCPuzzlePLettres}{\fpeval{\useKV[ClesPuzzleP]{Etages}*(\useKV[ClesPuzzleP]{Etages}+1)/2}}% + \readlist*{\PfCPuzzlePCptLettre}{\faa}% + \xdef\PuzzlePyramideLettres{\PuzzlePyramideListeLettres}% + \setcounter{PfCPuzzlePcpt}{0}% + \ifboolKV[ClesPuzzleP]{Solutions}{% +% % Plateau de jeu + \begin{center} + \begin{NiceTabular}{*{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}{m{\PfCPuzzleP}}}%[hvlines] + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}}}}\do{% + \xintifForLast{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&}{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&&} + }\\% + \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% + \xintifForLast{\\}{&} + }% + }% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{##1}}\do{% + \xintifForFirst{}{&} + }\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-##1}}}\do{% + &\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}& + }% + \\ + \xintFor* ##3 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% + \xintFor* ##4 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% + \xintifForLast{\\}{&} + }% + }% + }% + \end{NiceTabular} + \end{center} + }{% + \ifboolKV[ClesPuzzleP]{EnonceQuestion}{% + % Plateau des questions + \setcounter{PfCPuzzlePcpt}{0}% + \begin{center} + \begin{NiceTabular}{*{10}{m{\PfCPuzzleP}}}%[hvlines] + \xintFor* ##3 in {\xintSeq{1}{\fpeval{ceil(\PfCPuzzlePQuestionslen/5)}}}\do{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \xintifForLast{% + \Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{% + \stepcounter{PfCPuzzlePcpt}% + \xintifboolexpr{\thePfCPuzzlePcpt>\PfCPuzzlePQuestionslen}{}{% + \xintFor* ##4 in{\xintSeq{1}{\PfCPuzzlePQuestionslen}}\do{% + \xintifboolexpr{\thePfCPuzzlePcpt==\PfCPuzzlePCptLettre[##4]}{\PfCPuzzlePQuestions[##4]}{}% + }% + }% + }&% + }{% + \Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{% + \stepcounter{PfCPuzzlePcpt}% + \xintifboolexpr{\thePfCPuzzlePcpt>\PfCPuzzlePQuestionslen}{}{% + \xintFor* ##4 in{\xintSeq{1}{\PfCPuzzlePQuestionslen}}\do{% + \xintifboolexpr{\thePfCPuzzlePcpt==\PfCPuzzlePCptLettre[##4]}{\PfCPuzzlePQuestions[##4]}{}% + }% + }% + }% + &&% + }% + }\\% + \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{10}}\do{% + \xintifForLast{\\}{&} + }% + }% + }% + \CodeAfter + \setcounter{PfCPuzzlePcpt}{0}% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{ceil(\PfCPuzzlePQuestionslen/5)}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{5}}\do{% + \tikz{\node[anchor={north west},xshift=1mm,yshift=-1mm] at (\fpeval{(##1-1)*\useKV[ClesPuzzleP]{NbLignes}+1}-|\fpeval{2*##2-1}) {\stepcounter{PfCPuzzlePcpt}\Large\bfseries\Alph{PfCPuzzlePcpt}};}% + \tikz{\node[anchor={south east},xshift=-2mm,yshift=-2mm,rectangle,draw] at (\fpeval{##1*\useKV[ClesPuzzleP]{NbLignes}}-|\fpeval{2*##2+1}) {\large\bfseries\hbox to 1.2\PfCPuzzleP{\rule{0pt}{1.8ex}}};}% + }% + }% + \end{NiceTabular} + \end{center}% + }{% + % Plateau de jeu + \begin{center} + \begin{NiceTabular}{*{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}{m{\PfCPuzzleP}}}%[hvlines] + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}}}}\do{% + \xintifForLast{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&}{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&&} + }\\% + \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% + \xintifForLast{\\}{&} + }% + }% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{##1}}\do{% + \xintifForFirst{}{&} + }\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-##1}}}\do{% + &\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{}& + }% + \\ + \xintFor* ##3 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% + \xintFor* ##4 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% + \xintifForLast{\\}{&} + }% + }% + }% + \end{NiceTabular} + \end{center} + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCPyramideCalculs.tex b/macros/latex/contrib/profcollege/latex/PfCPyramideCalculs.tex new file mode 100644 index 0000000000..6ec347c5dc --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/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 diff --git a/macros/latex/contrib/profcollege/latex/PfCPythagore.tex b/macros/latex/contrib/profcollege/latex/PfCPythagore.tex new file mode 100644 index 0000000000..ae8dda031e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCPythagore.tex @@ -0,0 +1,516 @@ +%%% +% Le th\'eor\`eme de Pythagore +%%% +\setKVdefault[ClesPythagore]{Exact=false,AvantRacine=false,Racine=false,Entier=false,Egalite=false,Precision=2,Soustraction=false,Figure=false,FigureSeule=false,Angle=0,Echelle=1cm,Reciproque=false,ReciColonnes=false,Faible=false,Unite=cm,EnchaineA=false,EnchaineB=false,EnchaineC=false,ValeurA=0,ValeurB=0,ValeurC=0,Perso=false,AllPerso=false,SansMots=false} + +% On d\'efinit les figures \`a utiliser +\def\MPFigurePytha#1#2#3#4#5#6{% + % #1 Premier sommet + % #2 Sommet de l'angle droit + % #3 troisi\`eme sommet + % #4 1ere longueur + % #5 2eme longueur + % #6 angle de rotation de la figure + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesPythagore]{Echelle}; + pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit + O=u*(2.5,2.5); + path cc; + cc=(fullcircle scaled 4u) shifted O; + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.9*length cc) of cc; + B=A rotatedabout(O,-120); + C=2[A,O]; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % On d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + draw D--E--F; + numeric decalage; + decalage=3mm; + if (#4<#5) or (#4=#5) : + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi + else: + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) + rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; + label(btex #3 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #1 etex,1.2[O,C]); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}] + pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit + O=u*(2.5,2.5); + path cc; + cc=(fullcircle scaled 4u) shifted O; + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.9*length cc) of cc; + B=A rotatedabout(O,-120); + C=2[A,O]; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % On d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + draw D--E--F; + decalage=3mm; + if (#4<#5) or (#4=#5) : + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi + else: + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) + rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; + label(btex #3 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #1 etex,1.2[O,C]); + \end{mpost} + \fi +} + +\def\MPFigureReciPytha#1#2#3#4#5#6#7{% + % #1 Premier sommet + % #2 Sommet de l'angle droit + % #3 troisi\`eme sommet + % #4 1ere longueur + % #5 2eme longueur + % #6 3eme longueur + % #7 angle de rotation de la figure + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesPythagore]{Echelle}; + pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit + O=u*(2.5,2.5); + path cc; + cc=(fullcircle scaled 4u) shifted O; + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.8*length cc) of cc; + B=A rotatedabout(O,-100); + C=2[A,O]; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#7); + B:=B rotatedabout(O,#7); + C:=C rotatedabout(O,#7); + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + decalage=3mm; + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); + label(btex \num{#5} etex,1/2[C,B]-decalage*(unitvector(C-B))); + label(btex \num{#6} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + label(btex \num{#6} etex,1/2[C,B]-decalage*(unitvector(A-B))); + fi; + label(btex #1 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #3 etex,1.2[O,C]); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}] + pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit + O=u*(2.5,2.5); + path cc; + cc=(fullcircle scaled 4u) shifted O; + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.8*length cc) of cc; + B=A rotatedabout(O,-100); + C=2[A,O]; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#7); + B:=B rotatedabout(O,#7); + C:=C rotatedabout(O,#7); + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + decalage=3mm; + if ypart(B)>ypart(O) : + label(LATEX("\num{"&decimal(#4)&"}") rotated angle(C-A),1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); + label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(C-B)),1/2[C,B]-decalage*(unitvector(C-B))); + label(LATEX("\num{"&decimal(#6)&"}") rotated(angle(B-A)),1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(LATEX("\num{"&decimal(#4)&"}") rotated angle(A-C),1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); + label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(A-B)),1/2[A,B]-decalage*(unitvector(C-B))); + label(LATEX("\num{"&decimal(#6)&"}") rotated angle(C-B),1/2[C,B]-decalage*(unitvector(A-B))); + fi; + label(btex #1 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #3 etex,1.2[O,C]); + \end{mpost} + \fi +} + +\def\MPFigurePythaSansMots#1#2#3#4#5#6{% + % #1 Premier sommet + % #2 Sommet de l'angle droit + % #3 troisi\`eme sommet + % #4 1ere longueur + % #5 2eme longueur + % #6 angle de rotation de la figure + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesPythagore]{Echelle}; + pair A,B,C,O,D,E,F,L[],M[],N[];%B est le sommet de l'angle droit + O=u*(2.5,2.5); + path cc; + cc=(fullcircle scaled 4u) shifted O; + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.9*length cc) of cc; + B=A rotatedabout(O,-120); + C=2[A,O]; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % On d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + trace polygone(A,B,C); + draw D--E--F; + L1=rotation(B,A,90); + L2-L1=B-A; + trace chemin(A,L1,L2,B); + M1=rotation(C,B,90); + M2-M1=C-B; + trace chemin(B,M1,M2,C); + N1=rotation(A,C,90); + N2-N1=A-C; + trace chemin(C,N1,N2,A); + numeric decalage; + decalage=3mm; + if (#4<#5) or (#4=#5) : + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,B]+decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]+decalage*(unitvector(C-B))); + label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(B,M2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}+\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4+#5*#5}}$\\\end{tabular}"),iso(C,N2)); + else: + label(btex \num{#4} etex,1/2[C,B]+decalage*(unitvector(A-B))); + label(btex \num{#5} etex,1/2[A,B]+decalage*(unitvector(C-B))); + label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(B,M2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}+\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4+#5*#5}}$\\\end{tabular}"),iso(C,N2)); + drawarrow 2/10[iso(A,L2),iso(C,N2)]--8/10[iso(A,L2),iso(C,N2)]; + drawarrow 2/10[iso(B,M2),iso(C,N2)]--8/10[iso(B,M2),iso(C,N2)]; + fi + else: + if ypart(B)>ypart(O) : + label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(C,N2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}-\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4-#5*#5}}$\\\end{tabular}"),iso(B,M2)); + drawarrow 2/10[iso(A,L2),iso(B,M2)]--8/10[iso(A,L2),iso(B,M2)]; + drawarrow 2/10[iso(C,N2),iso(B,M2)]--8/10[iso(C,N2),iso(B,M2)]; + else: + label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(C,N2)); + label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}-\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4-#5*#5}}$\\\end{tabular}"),iso(B,M2)); + drawarrow 2/10[iso(A,L2),iso(B,M2)]--8/10[iso(A,L2),iso(B,M2)]; + drawarrow 2/10[iso(C,N2),iso(B,M2)]--8/10[iso(C,N2),iso(B,M2)]; + fi; + fi; + label(btex #3 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #1 etex,1.2[O,C]); + \end{mplibcode} + \fi +} + +\newcommand\RedactionPythagore{}% +\newcommand\RedactionReciPythagore{}% +\newcommand\RedactionCalculsPythagore{}% +\newcommand\RedactionCalculsReciPythagore{}% +\newcommand\RedactionConclusionReciPythagore{}% + +% \newcommand\Pythagore[5][]{% +\NewDocumentCommand\Pythagore{o m m m m}{% + % #1 Param\`etres sous forme de cl\'es + % #2 Nom "complet" du triangle : ABC par exemple + % #3 Premi\`ere longueur + % #4 Deuxi\`eme longueur + % #5 Troisi\`eme longueur (\'eventuellement vide) + \useKVdefault[ClesPythagore]%obligatoire car la macro n'est pas dans un groupe. + \setKV[ClesPythagore]{#1}%On lit les arguments optionnels + \DeclareSIUnit{\PfCPythaUnit}{\useKV[ClesPythagore]{Unite}}% + \ifboolKV[ClesPythagore]{Reciproque}{% + % On retient les noms des sommets + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + \xdef\NomTriangle{\NomA\NomB\NomC}% + % on stocke les valeurs donn\'ees + \opcopy{#3}{A1}% + \opcopy{#4}{A2}% + \opcopy{#5}{A3}% + \xdef\GrandCote{#3}% + \xdef\PetitCote{#4}% + \xdef\MoyenCote{#5}% + % On trace une figure ou pas ? + \ifboolKV[ClesPythagore]{FigureSeule}{% + \MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}% + }{% + \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation + \begin{multicols}{2} + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}\]% + \par\columnbreak\par% + \ifboolKV[ClesPythagore]{AllPerso}{% + \RedactionReciPythagore% + \RedactionCalculsReciPythagore% + \RedactionConclusionReciPythagore% + }{% + % on r\'edige + \ifboolKV[ClesPythagore]{Perso}{% + \RedactionReciPythagore% + }{% + Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.% + } + \ifboolKV[ClesPythagore]{ReciColonnes}{% + \[ + \begin{array}{cccc|cccc} + &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\ + &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\ + &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\ + &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\ + \end{array} + \] + }{% + \[\left. + \begin{array}{l} + \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\ + \\ + \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\ + \end{array} + \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi + \] + } + \ifboolKV[ClesPythagore]{Egalite}{% + \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi% + \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi% + }{% + \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle + en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi% + \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le + triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi% + } + } + \end{multicols} + }{% + \ifboolKV[ClesPythagore]{AllPerso}{% + \RedactionReciPythagore% + \RedactionCalculsReciPythagore% + \RedactionConclusionReciPythagore% + }{% + \ifboolKV[ClesPythagore]{Perso}{\RedactionReciPythagore}{% + Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.% + } + \ifboolKV[ClesPythagore]{ReciColonnes}{% + \[ + \begin{array}{cccc|cccc} + &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\ + &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\ + &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\ + &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\ + \end{array} + \] + }{% + \[\left. + \begin{array}{l} + \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\ + \\ + \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\ + \end{array} + \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi + \] + }% + \ifboolKV[ClesPythagore]{Egalite}{% + \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi% + \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi% + }{% + \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle + en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi% + \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le + triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi% + }% + }% + }% + }% + }{% + % [xlop] param\`etres de calcul + \opcopy{#3}{A1}% + \opcopy{#4}{A2}% + \opcopy{\useKV[ClesPythagore]{Precision}}{pres}% + \xintifboolexpr{#3<#4 || #3==#4}{ + \xdef\PetitCote{#3}% + \xdef\MoyenCote{#4}% + \xdef\GrandCote{}% + }{% + \xdef\GrandCote{#3}% + \xdef\MoyenCote{#4}% + \xdef\PetitCote{}% Pour la personnalisation + } + % On retient les noms des sommets + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + \xdef\NomTriangle{\NomA\NomB\NomC}% + \xdef\NomAngleDroit{\NomB}% + \xdef\NomSommetA{\NomA}% + \xdef\NomSommetC{\NomC}% + % On trace une figure ou pas ? + \ifboolKV[ClesPythagore]{FigureSeule}{% + \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% + }{% + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% + }% + \MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}} + }{% + \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation + \begin{multicols}{2}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}\] + \par\columnbreak\par% + % On d\'emarre la r\'esolution + \ifboolKV[ClesPythagore]{AllPerso}{% + \RedactionPythagore% + \RedactionCalculsPythagore% + }{% + \ifboolKV[ClesPythagore]{Perso}{% + \RedactionCalculsPythagore% + }{% + \ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :% + }% + } + \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% + \begin{align*} + \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ + \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ + \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ + \ifboolKV[ClesPythagore]{AvantRacine}{}{% + \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} + \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ + }% + \end{align*} + }{%\else% + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% + \begin{align*} + \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ + \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ + \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ + \ifboolKV[ClesPythagore]{AvantRacine}{}{% + \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} + \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ + }% + \end{align*} + }%\fi% + } + \end{multicols} + }{% + % On d\'emarre la r\'esolution + \ifboolKV[ClesPythagore]{SansMots}{% + \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}% + }{% + \ifboolKV[ClesPythagore]{AllPerso}{% + \RedactionPythagore% + \RedactionCalculsPythagore% + }{% + \ifboolKV[ClesPythagore]{Perso}{\RedactionPythagore}{\ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :% + }}% + \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% + \begin{align*} + \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ + \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ + \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ + \ifboolKV[ClesPythagore]{AvantRacine}{}{% + \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} + \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ + } + \end{align*} + }{%\else + \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% + \ifboolKV[ClesPythagore]{Soustraction}{% + \begin{align*} + \NomA\NomB^2&=\NomA\NomC^2-\NomB\NomC^2\\ + \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}-\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ + \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ + \ifboolKV[ClesPythagore]{AvantRacine}{}{% + \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} + \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ + } + \end{align*} + }{% + \begin{align*} + \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ + \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ + \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ + \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ + \ifboolKV[ClesPythagore]{AvantRacine}{}{% + \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}% + \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ + } + \end{align*} + }% + }%\fi% + }% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCQuestionsFlash.tex b/macros/latex/contrib/profcollege/latex/PfCQuestionsFlash.tex new file mode 100644 index 0000000000..dd5db3e71b --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCQuestionsFlash.tex @@ -0,0 +1,631 @@ +%%% +% Questions Flash +%%% +\tcbset{Expression/.style={colback=white,valign=center,left=0mm,right=0mm,top=1mm,bottom=1mm,colframe=white}}% +\tcbset{ExpressionSerie1/.style={colback=\useKV[ClesFlash]{Couleur1},left=0mm,right=0mm,top=1mm,bottom=1mm}}% +\tcbset{ExpressionSerie2/.style={colback=\useKV[ClesFlash]{Couleur2},left=0mm,right=0mm,top=1mm,bottom=1mm}}% +\tcbset{ExpressionSerie3/.style={colback=\useKV[ClesFlash]{Couleur3},left=0mm,right=0mm,top=1mm,bottom=1mm}} +\tcbset{ExpressionSerie4/.style={colback=\useKV[ClesFlash]{Couleur4},left=0mm,right=0mm,top=1mm,bottom=1mm}} +\tcbset{BoiteExpression/.style={enhanced,nobeforeafter,tcbox raise base,colback=white,right=3.5mm,left=3.5mm,halign=center,colframe=black}} +\newtcolorbox{CadreNombre}[1][]{% + Expression,#1} + +\newcommand\BoiteFlash[2][40pt]{% + \ifx\bla#2\bla% + \tcbox[BoiteExpression]{\hbox to#1{\phantom{A}}}% + \else + \tcbox[BoiteExpression]{#2}% + \fi +} + +\setKVdefault[ClesFlash]{Hauteur=0.2\textheight,Simple=false,Intrus=false,Kahout=false,Daily=false,Expression=false,Mental=false,Mesure=false,Heure=false,Decimal=false,Operation=Multiplie,Numeration=false,Evaluation=false,Pause=false,Couleur1=blue!10,Couleur2=orange!10,Couleur3=green!10,Couleur4=yellow!10,Numerique=false,Seul=false} + +\newlength{\HauteurFlash} + +\def\MPAfficheur#1#2#3{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=0.5u; + draw Afficheur(#1 div10,0); + draw Afficheur(#1 mod10,0) shifted(u*(1,0)); + draw Afficheur(10,0) shifted(u*(2,0)); + draw Afficheur(#2 div10,0) shifted(u*(3,0)); + draw Afficheur(#2 mod10,0) shifted(u*(4,0)); + draw Afficheur(10,0) shifted(u*(5,0)); + draw Afficheur(#3 div10,0) shifted(u*(6,0)); + draw Afficheur(#3 mod10,0) shifted(u*(7,0)); + \end{mplibcode} + \else + \begin{mpost} + u:=0.5u; + draw Afficheur(#1 div10,0); + draw Afficheur(#1 mod10,0) shifted(u*(1,0)); + draw Afficheur(10,0) shifted(u*(2,0)); + draw Afficheur(#2 div10,0) shifted(u*(3,0)); + draw Afficheur(#2 mod10,0) shifted(u*(4,0)); + draw Afficheur(10,0) shifted(u*(5,0)); + draw Afficheur(#3 div10,0) shifted(u*(6,0)); + draw Afficheur(#3 mod10,0) shifted(u*(7,0)); + \end{mpost} + \fi +} + +\def\MPHorloge#1#2#3{ + \ifluatex + \mplibforcehmode + \begin{mplibcode} + marque_horloge=1; + save Hor; + picture Hor; + path gdeaig,pteaig,trot; + pair centrehorloge; + centrehorloge=(0,0); + path tourhorloge; + tourhorloge=cercles(centrehorloge,marque_horloge*cm); + Hor=image( + %% dessin de l'horloge + draw tourhorloge; + for i=0 upto 59: + if (i mod 5)=0: + if (i mod 15)=0: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp; + else: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp; + fi; + else: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))); + fi; + endfor; + path graduhorloge; + graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0)))); + % + marque_p:="plein"; + pointe(centrehorloge); + marque_p:="rien"; + %% placement des aiguilles + gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4; + draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25; + draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp; + ); + draw Hor; + \end{mplibcode} +\else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + marque_horloge=1; + save Hor; + picture Hor; + path gdeaig,pteaig,trot; + pair centrehorloge; + centrehorloge=(0,0); + path tourhorloge; + tourhorloge=cercles(centrehorloge,marque_horloge*cm); + Hor=image( + %% dessin de l'horloge + draw tourhorloge; + for i=0 upto 59: + if (i mod 5)=0: + if (i mod 15)=0: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp; + else: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp; + fi; + else: + draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))); + fi; + endfor; + path graduhorloge; + graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0)))); + % + marque_p:="plein"; + pointe(centrehorloge); + marque_p:="rien"; + %% placement des aiguilles + gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0)))); + draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4; + draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25; + draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp; + ); + draw Hor; + \end{mpost} + \fi +} + +\newcommand\QFNumeration{% + \begin{CadreNombre} + {\Large LE NOMBRE DU JOUR est : } + \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{Le chiffre des \ListeFlash[1,2] est :} + \tcbox[BoiteExpression]{\phantom{1500000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \textbf{Le chiffre \ListeFlash[1,3] repr\'esente le + chiffre des :} + \tcbox[BoiteExpression]{\phantom{1500000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{Le nombre de \ListeFlash[1,4] est :} + \tcbox[BoiteExpression]{\phantom{1500000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{\ListeFlash[1,5] est le nombre des :} + \tcbox[BoiteExpression]{\phantom{1500000}} + \end{tcolorbox} + \end{CadreNombre} +} + +\newcommand\QFHeure{% + \begin{CadreNombre} + {\Large L'HEURE DU JOUR est : }\ifboolKV[ClesFlash]{Numerique}{\raisebox{-0.3cm}{\MPAfficheur{\NbHeures}{\NbMinutes}{\NbSecondes}}}{\raisebox{-0.9cm}{{\MPHorloge{\NbHeures}{\NbMinutes}{\NbSecondes}}}} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{\ListeFlash[1,2] :} + \tcbox[BoiteExpression]{\phantom{1500000000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \textbf{\ListeFlash[1,3] :} + \tcbox[BoiteExpression]{\phantom{1500000000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{\ListeFlash[1,4] :} + \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{15}}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{\ListeFlash[1,5] :} + \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{1500000}}} + \end{tcolorbox} + \end{CadreNombre} +} + +\newcommand\QFMesure{% + \begin{CadreNombre} + {\Large LA MESURE DU JOUR est : } + \tcbox[BoiteExpression]{\ListeFlash[1,1]} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{Convertis-la en \ListeFlash[1,2] :} + \tcbox[BoiteExpression]{\phantom{1500000000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \textbf{Elle peut aussi s'\'ecrire \ListeFlash[1,3] } + \tcbox[BoiteExpression]{\phantom{1500000000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{Ajoute-lui \ListeFlash[1,4] :} + \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{Enl\`eve-lui \ListeFlash[1,5] :} + \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}} + \end{tcolorbox} + \end{CadreNombre} +} + +\tikzset{ + arrow/.style={ + draw, + minimum height=1.25cm, + inner sep=0.25em, + shape=signal, + signal from=west, + signal to=east, + signal pointer angle=150, + } +} + +\newcommand\QFDaily{% + \begin{tikzpicture}% + \begin{scope}[start chain=transition going right,node distance=-\pgflinewidth]% + \foreach \s in {1,...,\ListeFlashlen}{% + \xintifboolexpr{\s == 1}{% + \node[arrow,on chain] {\Huge\bfseries\ListeFlash[\s]};% + \ifboolKV[ClesFlash]{Pause}{\pause}{}% + }{% + \xintifboolexpr{\s == \ListeFlashlen}{% + \node[arrow,on chain] {\Huge\bfseries?};% + }{% + \node[arrow,on chain] {\ListeFlash[\s]};% + \ifboolKV[ClesFlash]{Pause}{\pause}{}% + }% + }% + }% + \end{scope}% + \end{tikzpicture}% +}% + +\newcommand\QFDecimal{% + \begin{CadreNombre} + {\Large LE NOMBRE DU JOUR est : } + \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{\'Ecris-le en fraction d\'ecimale :} + \tcbox[BoiteExpression]{$\dfrac{\phantom{1000000}}{\phantom{1000000}}$} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \begin{tabular}{c} + \textbf{Partie}\\ + \textbf{enti\`ere} + \end{tabular} \textbf{: } + \tcbox[BoiteExpression]{\phantom{100000}}\hfill% + $\square$ \begin{tabular}{c} + \textbf{Partie}\\ + \textbf{d\'ecimale} + \end{tabular} \textbf{: } + \tcbox[BoiteExpression]{\phantom{100000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{\useKV[ClesFlash]{Operation}-le par + \ListeFlash[1,2] :} \tcbox[BoiteExpression]{\phantom{1000000000}} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{Trouve le nombre entier le plus proche :} \tcbox[BoiteExpression]{\phantom{10000000}} + \end{tcolorbox} + \end{CadreNombre} +} + +\newcommand\QFMental{% + \begin{CadreNombre} + {\Large LE NOMBRE DU JOUR est : } + \tcbox[BoiteExpression]{\ListeFlash[1,1]} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{Ajoute-lui} + \tcbox[BoiteExpression]{\ListeFlash[1,2]}\hfill$\square$ + \textbf{Soustrais-lui} \tcbox[BoiteExpression]{\ListeFlash[1,3]} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \textbf{Multiplie-le par } + \tcbox[BoiteExpression]{\ListeFlash[1,4]}\hfill$\square$ + \textbf{Divise-le par } \tcbox[BoiteExpression]{\ListeFlash[1,5]} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{Trouve} + \tcbox[BoiteExpression]{\ListeFlash[1,6]} + \textbf{\% de ce nombre.} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{Trouve } \tcbox[BoiteExpression]{\ListeFlash[1,7]} + \textbf{de ce nombre.} + \end{tcolorbox} + \end{CadreNombre} +} + +\newcommand\QFExpression{% + \begin{CadreNombre} + {\Large L'EXPRESSION DU JOUR est : } + \tcbox[BoiteExpression]{\ListeFlash[1,1]} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie1] + $\square$ \textbf{Ajoute-lui} + \tcbox[BoiteExpression]{\ListeFlash[1,2]} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie2] + $\square$ \textbf{Soustrais-lui} + \tcbox[BoiteExpression]{\ListeFlash[1,3]} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie3] + $\square$ \textbf{Multiplie-la par} + \tcbox[BoiteExpression]{\ListeFlash[1,4]} + \end{tcolorbox} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie4] + $\square$ \textbf{\'Evalue-la lorsque} \tcbox[BoiteExpression]{\ListeFlash[1,5]} + \end{tcolorbox} + \end{CadreNombre} +} + + + +\newcommand\QFVide{% + \begin{CadreNombre} + {\ListeFlash[1]} + \xintFor* ##1 in {\xintSeq {1}{\ListeFlashlen-1}}\do{% + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{tcolorbox}[ExpressionSerie##1] + \ListeFlash[1+##1] + \end{tcolorbox} + } + \end{CadreNombre} +} + +\newcommand\QFlash[2][]{% + \useKVdefault[ClesFlash]% + \setKV[ClesFlash]{#1}% + \setlength{\HauteurFlash}{\useKV[ClesFlash]{Hauteur}}% + \colorlet{CouleurUn}{\useKV[ClesFlash]{Couleur1}}% + \colorlet{CouleurDeux}{\useKV[ClesFlash]{Couleur2}}% + \colorlet{CouleurTrois}{\useKV[ClesFlash]{Couleur3}}% + \colorlet{CouleurQuatre}{\useKV[ClesFlash]{Couleur4}}% + \ifboolKV[ClesFlash]{Evaluation}{% + \ifboolKV[ClesFlash]{Seul}{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \QFVide% + }{% + \ifboolKV[ClesFlash]{Numeration}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \QFNumeration% + }{% + \ifboolKV[ClesFlash]{Heure}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]% + \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]% + \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]% + \QFHeure% + }{% + \ifboolKV[ClesFlash]{Mesure}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \QFMesure% + }{% + \ifboolKV[ClesFlash]{Daily}{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \QFDaily% + }{% + \ifboolKV[ClesFlash]{Decimal}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \QFDecimal% + }{% + \ifboolKV[ClesFlash]{Mental}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \QFMental% + }{% + \ifboolKV[ClesFlash]{Expression}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \QFExpression% + }{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \ifboolKV[ClesFlash]{Simple}{% + \ListeFlash[1] + \begin{tcolorbox}[valign=center] + \ListeFlash[2] + \end{tcolorbox} + }{% + \setsepchar[*]{*/}% + \readlist*\ListeFlash{#2}% + \ifboolKV[ClesFlash]{Kahout}{% + \setsepchar[*]{*/}% + \readlist*\ListeFlash{#2}% + \begin{tcolorbox}[halign=center,valign=center] + \ListeFlash[1,1] + \end{tcolorbox} + % \par + \begin{multicols}{4} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center] + \ListeFlash[1,2] + \end{tcolorbox} + % \hfill% + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center] + \ListeFlash[1,3] + \end{tcolorbox} + % \hfill% + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center] + \ListeFlash[1,4] + \end{tcolorbox} + % \hfill% + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center] + \ListeFlash[1,5] + \end{tcolorbox} + \end{multicols} + }{% + \setsepchar[*]{*/}% + \readlist*\ListeFlash{#2}% + \begin{tcolorbox}[halign=center,valign=center] + \ListeFlash[1,1] + \end{tcolorbox} + \begin{multicols}{4} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,2] + \end{tcolorbox} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,3] + \end{tcolorbox} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center] + \ListeFlash[1,4] + \end{tcolorbox} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,5] + \end{tcolorbox} + \end{multicols} + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }{% + \ifboolKV[ClesFlash]{Seul}{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFVide% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Numeration}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFNumeration% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Heure}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]% + \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]% + \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]% + \begin{frame} + \QFHeure% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Mesure}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFMesure% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Daily}{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFDaily% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Decimal}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFDecimal% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Mental}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFMental% + \end{frame} + }{% + \ifboolKV[ClesFlash]{Expression}{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \QFExpression% + \end{frame} + }{% + \setsepchar[*]{/}% + \readlist*\ListeFlash{#2}% + \ifboolKV[ClesFlash]{Simple}{% + \begin{frame} + \ListeFlash[1] + \begin{tcolorbox}[valign=center] + \ListeFlash[2] + \end{tcolorbox} + \end{frame} + }{% + \setsepchar[*]{,*/}% + \readlist*\ListeFlash{#2}% + \ifboolKV[ClesFlash]{Kahout}{% + \setsepchar[*]{*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \begin{tcolorbox}[valign=center] + \ListeFlash[1,1] + \end{tcolorbox} + \vfill + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{columns}[T] + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center] + \ListeFlash[1,2] + \end{tcolorbox} + \end{column} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center] + \ListeFlash[1,3] + \end{tcolorbox} + \end{column} + \end{columns} + \bigskip + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{columns}[T] + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center] + \ListeFlash[1,4] + \end{tcolorbox} + \end{column} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center] + \ListeFlash[1,5] + \end{tcolorbox} + \end{column} + \end{columns} + \end{frame} + }{% + \setsepchar[*]{*/}% + \readlist*\ListeFlash{#2}% + \begin{frame} + \begin{tcolorbox}[valign=center] + \ListeFlash[1,1] + \end{tcolorbox} + \vfill + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{columns}[T] + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,2] + \end{tcolorbox} + \end{column} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,3] + \end{tcolorbox} + \end{column} + \end{columns} + \bigskip + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{columns}[T] + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center] + \ListeFlash[1,4] + \end{tcolorbox} + \end{column} + \ifboolKV[ClesFlash]{Pause}{\pause}{} + \begin{column}{0.45\linewidth} + \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center] + \ListeFlash[1,5] + \end{tcolorbox} + \end{column} + \end{columns} + \end{frame} + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCQuestionsRelier.tex b/macros/latex/contrib/profcollege/latex/PfCQuestionsRelier.tex new file mode 100644 index 0000000000..1b425a7701 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCQuestionsRelier.tex @@ -0,0 +1,59 @@ +%%% +% R\'eponses \`a relier +%%% +\setKVdefault[ClesRelie]{Solution=false,LargeurG=5cm,LargeurD=2cm,Stretch=1.5,Ecart=2cm,Couleur=black} + +\newcommand\Relie[2][]{% + \useKVdefault[ClesRelie]% + \setKV[ClesRelie]{#1}% + \setsepchar[*]{,*/}% + \readlist*\ListeRelie{#2}% + \buildtabrelie% + \ifboolKV[ClesRelie]{Solution}{% + \colorlet{PfCRelieCouleurTrace}{\useKV[ClesRelie]{Couleur}}% + \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{% + \itemtomacro\ListeRelie[##1,1]\untest + \ifx\bla\untest\bla% + \else + \tikz[remember picture,overlay]{\draw[PfCRelieCouleurTrace] (RelieG-##1) -- (RelieD-\ListeRelie[##1,3]);}% + \fi + }% + }{% + }% +} + +\newcounter{NbRelie} + +\def\buildtabrelie{% + \setcounter{NbRelie}{0}% + \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}% + \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember + picture]{\node[name=RelieD-\theNbRelie,inner + sep=0pt]{};\fill[] (RelieD-\theNbRelie) circle[radius=1.5pt]}}cp{\useKV[ClesRelie]{LargeurD}}}% + \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest% +\ifx\bla\untest\bla% + \uppercase{&}\stepcounter{NbRelie}% + \else + \uppercase{&}\stepcounter{NbRelie}\tikz[remember + picture,overlay]{\node[name=RelieG-\theNbRelie,inner + sep=0pt]{};\fill[] + (RelieG-\theNbRelie) circle[radius=1.5pt];} +\fi&&&\ListeRelie[##1,2]\\}% + \end{tabular}% + \setcounter{NbRelie}{0}% +}% + +\def\buildtabrelieold{% + \setcounter{NbRelie}{0}% + \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}% + \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember + picture,baseline]{\node[name=RelieD-\theNbRelie]{\Large\textbullet};}}cp{\useKV[ClesRelie]{LargeurD}}}% + \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest% +\ifx\bla\untest\bla% + \uppercase{&}\stepcounter{NbRelie}% + \else + \uppercase{&}\stepcounter{NbRelie}\tikz[remember picture,baseline]{\node[name=RelieG-\theNbRelie]{\Large\textbullet};} +\fi&&&\ListeRelie[##1,2]\\}% + \end{tabular}% + \setcounter{NbRelie}{0}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCQuiSuisJe.tex b/macros/latex/contrib/profcollege/latex/PfCQuiSuisJe.tex new file mode 100644 index 0000000000..aa896d1185 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCQuiSuisJe.tex @@ -0,0 +1,81 @@ +%%% +% Qui suis-je +%%% +\setKVdefault[Quisuisje]{Solution=false,Largeur=5mm,Colonnes=5,CodePerso=false,TexteA=Lettre,TexteB=R\'esultat du calcul}% + +\newcommand\QuisuisjeEnonce{% + Chaque lettre du mot à découvrir porte un numéro qui correspond à un + calcul à effectuer. Pour trouver les lettres de ce mot, tu dois donc + effectuer les calculs proposés. Les résultats que tu auras trouvés + te donneront, à l'aide du tableau de correspondance ci-dessous, les + lettres du mot. +}% + +\newcommand\QuisuisjeTableau[2][]{% + \setKV[Quisuisje]{#1}% + \setsepchar[*]{§*/}\ignoreemptyitems% + \readlist*\ListeQuisuisje{#2}% + \begin{NiceTabular}{|l|*{\ListeQuisuisjelen}{m{\useKV[Quisuisje]{Largeur}}|}}% + \hline + \useKV[Quisuisje]{TexteA}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{% + &\centering\arraybackslash\ListeQuisuisje[##1,1] + }\\ + \hline + \useKV[Quisuisje]{TexteB}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{% + &\centering\arraybackslash\ListeQuisuisje[##1,2] + }\\ + \hline + \end{NiceTabular}% +}% + +\newcommand\QuisuisjeCodePerso[3][]{% + \setKV[Quisuisje]{#1}% + \setsepchar{ }% + \readlist*\ListeQuisuisjeCode{#2}% + \readlist*\ListeQuisuisjeLettres{#3}% + \par\hfill% + \begin{NiceTabular}{|*{\ListeQuisuisjeLettreslen}{m{7mm}|}} + \hline + \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{% + \xintifForFirst{}{&}\ifboolKV[Quisuisje]{Solution}{\hfill\ListeQuisuisjeLettres[##1]}{\phantom{1}} + }\\ + \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{% + \xintifForFirst{}{&}\tiny\ListeQuisuisjeCode[##1]% + }\\ + \hline + \end{NiceTabular}% +}% + +\newcommand\Quisuisje[3][]{% + \useKVdefault[Quisuisje]% + \setKV[Quisuisje]{#1}% + \ifboolKV[Quisuisje]{CodePerso}{}{% + \setsepchar{ }% + \readlist\ListeLettres{#3}% + }% + \setsepchar{§}% + \readlist\ListeCalculs{#2}% + \ifboolKV[Quisuisje]{CodePerso}{}{% + \par\hfill% + \begin{NiceTabular}{|*{\ListeLettreslen}{m{7mm}|}} + \hline + \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{% + \xintifForFirst{}{&} \ifboolKV[Quisuisje]{Solution}{\hfill\ListeLettres[##1]}{\phantom{1}} + }\\ + \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{% + \xintifForFirst{}{&}\tiny\num{##1}% + }\\ + \hline + \end{NiceTabular}% + }% + \par\bigskip\par + \ifboolKV[Quisuisje]{Solution}{}{% + \begin{multicols}{\useKV[Quisuisje]{Colonnes}}% + \begin{enumerate} + \xintFor* ##1 in {\xintSeq {1}{\ListeCalculslen}}\do{% + \item\ListeCalculs[##1] + } + \end{enumerate}% + \end{multicols}% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRLE.tex b/macros/latex/contrib/profcollege/latex/PfCRLE.tex new file mode 100644 index 0000000000..280c5aef85 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRLE.tex @@ -0,0 +1,206 @@ +%%% +% Codage RLE +%%% +\setKVdefault[RLE]{Largeur=10pt,Taille=5,Unite=1cm,Solution=false,Enonce=true} + +\newtoks\toklisterle +\def\UpdatetoksRLE#1\nil{\addtotok\toklisterle{#1,}}% + +%\newlength\PfCRLEHeight% +\NewDocumentCommand\CodageRLE{o m}{% + \useKVdefault[RLE]% + \setKV[RLE]{#1}% + %\setlength{\PfCRLEHeight}{\useKV[RLE]{Largeur}}% + \setsepchar{,}% + \readlist*\PfCListeRLE{#2}% + \toklisterle{}% + \foreachitem\compteur\in\PfCListeRLE{\expandafter\UpdatetoksRLE\compteur\nil}% + \BuildRLE{\the\toklisterle}% +} + +\NewDocumentCommand\BuildRLE{m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + Taille:=\useKV[RLE]{Taille}; + u:=\useKV[RLE]{Unite}; + boolean Solution,Enonce; + Solution:=\useKV[RLE]{Solution}; + Enonce:=\useKV[RLE]{Enonce}; + + color RLEFill; + RLEFill=white; + + numeric nbretenir[][]; + + vardef NombreLigne(text t)= + retiens:=0; + nblignes:=0; + for p_=t: + retiens:=retiens+p_; + if retiens=Taille: + nblignes:=nblignes+1; + retiens:=0; + fi; + endfor; + enddef; + + path Square; + Square=unitsquare scaled u; + + vardef RLE(text t)= + nbcoups:=0; + nbcases:=0; + nbcaseslignes:=0; + cptretiensnb:=0; + cptretiensnblignes:=1; + for p_=t: + if p_=0: + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + RLEFill:=black; + else: + nbcoups:=nbcoups+1; + for l=0 upto p_-1: + if Solution: fill ((Square scaled 0.95) shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille))+u*(0.025,0.025))) withcolor RLEFill; fi; + trace (Square shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille)))); + endfor; + nbcaseslignes:=nbcaseslignes+p_; + nbcases:=nbcases+p_; + if (nbcaseslignes mod Taille)=0: + RLEFill:=white; + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + cptretiensnblignes:=cptretiensnblignes+1; + cptretiensnb:=0; + else: + if RLEFill=white: RLEFill:=black else: RLEFill:=white fi; + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + fi; + fi; + endfor; + enddef; + + string Sequence[]; + + boolean STOP; + STOP:=false; + + vardef Affichage= + for k=1 upto nblignes: + Sequence[k]=decimal(nbretenir[k][1]); + n:=1; + forever: + n:=n+1; + if unknown nbretenir[k][n]: + STOP:=true; + else: + Sequence[k]:=Sequence[k]&","&decimal(nbretenir[k][n]); + fi; + exitif STOP; + endfor; + label.rt(TEX(Sequence[k]),u*(Taille+1,-k+1+0.5)); + STOP:=false; + endfor; + enddef; + + NombreLigne(#1); + RLE(#1); + if Enonce: + Affichage; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + Taille:=\useKV[RLE]{Taille}; + u:=\useKV[RLE]{Unite}; + boolean Solution,Enonce; + Solution:=\useKV[RLE]{Solution}; + Enonce:=\useKV[RLE]{Enonce}; + }] + color RLEFill; + RLEFill=white; + + numeric nbretenir[][]; + + vardef NombreLigne(text t)= + retiens:=0; + nblignes:=0; + for p_=t: + retiens:=retiens+p_; + if retiens=Taille: + nblignes:=nblignes+1; + retiens:=0; + fi; + endfor; + enddef; + + path Square; + Square=unitsquare scaled u; + + vardef RLE(text t)= + nbcoups:=0; + nbcases:=0; + nbcaseslignes:=0; + cptretiensnb:=0; + cptretiensnblignes:=1; + for p_=t: + if p_=0: + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + RLEFill:=black; + else: + nbcoups:=nbcoups+1; + for l=0 upto p_-1: + if Solution: fill ((Square scaled 0.95) shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille))+u*(0.025,0.025))) withcolor RLEFill; fi; + trace (Square shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille)))); + endfor; + nbcaseslignes:=nbcaseslignes+p_; + nbcases:=nbcases+p_; + if (nbcaseslignes mod Taille)=0: + RLEFill:=white; + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + cptretiensnblignes:=cptretiensnblignes+1; + cptretiensnb:=0; + else: + if RLEFill=white: RLEFill:=black else: RLEFill:=white fi; + cptretiensnb:=cptretiensnb+1; + nbretenir[cptretiensnblignes][cptretiensnb]=p_; + fi; + fi; + endfor; + enddef; + + string Sequence[]; + + boolean STOP; + STOP:=false; + + vardef Affichage= + for k=1 upto nblignes: + Sequence[k]=decimal(nbretenir[k][1]); + n:=1; + forever: + n:=n+1; + if unknown nbretenir[k][n]: + STOP:=true; + else: + Sequence[k]:=Sequence[k]&","&decimal(nbretenir[k][n]); + fi; + exitif STOP; + endfor; + label.rt(LATEX(Sequence[k]),u*(Taille+1,-k+1+0.5)); + STOP:=false; + endfor; + enddef; + + NombreLigne(#1); + RLE(#1); + if Enonce: + Affichage; + fi; + \end{mpost} + \fi +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRangementNombres.tex b/macros/latex/contrib/profcollege/latex/PfCRangementNombres.tex new file mode 100644 index 0000000000..f44525f170 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRangementNombres.tex @@ -0,0 +1,67 @@ +%%% +% Rangement des nombres +%%% +\setKVdefault[ClesRgt]{Croissant,Decroissant=false,Strict,Fraction=false,Details=false} + +\dtlexpandnewvalue% +\DTLgnewdb{mtnumedb}% +\DTLgnewdb{mtRGTdb}% Pb de doublon avec mtdb de Mediane + +\newcommand\Rangement[2][]{% + \useKVdefault[ClesRgt]% + \setKV[ClesRgt]{#1}% + \ifboolKV[ClesRgt]{Fraction}{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeRgt{#2}% + % on cherche le d\'enominateur commun + \ppcm=1\relax + \foreachitem\x\in\ListeRgt{% + \PPCM{\fpeval{\ListeRgt[\xcnt,2]}}{\fpeval{\the\ppcm}}% + }% + % On cr\'ee la liste des rangements. + \DTLcleardb{mtnumedb}% +% % on les trie pour les ranger par ordre croissant + \foreachitem\x\in\ListeRgt{% + \DTLnewrow{mtnumedb}% + \xdef\toto{\fpeval{\ListeRgt[\xcnt,1]*\the\ppcm/\ListeRgt[\xcnt,2]}}% + \DTLnewdbentry{mtnumedb}{numeric}{\toto}% + }% +% % On trie + \ifboolKV[ClesRgt]{Decroissant}{% +% % On trie la liste + \dtlsort{numeric=descending}{mtnumedb}{\dtlicompare}% + \ifboolKV[ClesRgt]{Details}{\ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}}{% + \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}% + } + }{% +% % On trie la liste + \dtlsort{numeric}{mtnumedb}{\dtlicompare}% + \ifboolKV[ClesRgt]{Details}{% + \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% + }{% + \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% + }% + }% + }{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\ListeRgt{#2}% + % on cr\'ee la base de donn\'ees des valeurs + \DTLcleardb{mtRGTdb}% +% % on les trie pour les ranger par ordre croissant + \foreachitem\x\in\ListeRgt{% + \DTLnewrow{mtRGTdb}% + \itemtomacro\ListeRgt[\xcnt]\y% + \DTLnewdbentry{mtRGTdb}{numeric}{\y}% + }% +% % + \ifboolKV[ClesRgt]{Decroissant}{% + % On trie la liste + \dtlsort{numeric=descending}{mtRGTdb}{\dtlicompare}% + \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}% + }{% +% % On trie la liste + \dtlsort{numeric}{mtRGTdb}{\dtlicompare}% + \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRapido.tex b/macros/latex/contrib/profcollege/latex/PfCRapido.tex new file mode 100644 index 0000000000..2fcc701b52 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRapido.tex @@ -0,0 +1,67 @@ +%%% +% Rapido +%%% +%% D'après https://www.facebook.com/groups/994675223903586/user/100017057226847 +%% et une programmation de Laurent Lassale-Carrere +\newcounter{PfCnexo} +\newtcolorbox[use counter=PfCnexo,number format=\arabic]{RapidoBox}{% + % Titre + colbacktitle=white, + fonttitle=\color{black}\Large\bfseries, + toptitle=1mm, + bottomtitle=1mm, + bottom=1mm, + title={\useKV[ClesRapido]{Titre}}, + %% Cadre principal + enhanced, + width=\WidthRapido, + colback=white, + valign=top, + drop lifted shadow +} +\newtcolorbox{QuestionBox}{enhanced,nobeforeafter,size=small,sidebyside adapt=left} +\newtcolorbox{QuestionReponse}{enhanced,nobeforeafter,upperbox=invisible,colback=white,width=1.5cm,grow to left by=3mm,grow to right by=3mm,height=10mm} + +\setKVdefault[ClesRapido]{Debut=false,Largeur=0.9\linewidth,Titre={Rapido n°\thetcbcounter\hfill Date :\hspace*{2.5cm}}}% +\defKV[ClesRapido]{Numero=\setKV[ClesRapido]{Debut=true}} + +\newlength{\WidthRapido} + +\newcommand\Rapido[2][]{% numéro +\useKVdefault[ClesRapido]% +\setKV[ClesRapido]{#1}% +% +\ifboolKV[ClesRapido]{Debut}{% + \setcounter{PfCnexo}{\fpeval{\useKV[ClesRapido]{Numero}-1}} +}{}% +\setlength{\WidthRapido}{\useKV[ClesRapido]{Largeur}}% +% +\setsepchar[*]{§*/}% +\readlist*\ListeRapido{#2}% +\begin{RapidoBox} + \xintFor* ##1 in {\xintSeq {1}{\ListeRapidolen}}\do{% + \tcbsidebyside[% + sidebyside adapt=right, + bicolor, + colback=white,colbacklower=yellow!10!white, + nobeforeafter, + top=0mm,left=1mm, + grow to left by=3mm, + grow to right by=3mm, + bottom=0mm + ]{% + \ListeRapido[##1,1] + }{% + \ListeRapido[##1,2] + } + }% +\end{RapidoBox} +}% + +\newcommand\BoiteRapido[1]{% + \ifx\bla#1\bla% + \tcbox[BoiteExpression]{\phantom{100000}}% + \else% + \tcbox[BoiteExpression]{#1}% + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRappelsFormules.tex b/macros/latex/contrib/profcollege/latex/PfCRappelsFormules.tex new file mode 100644 index 0000000000..2c22e2b45a --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRappelsFormules.tex @@ -0,0 +1,1028 @@ +%%% +% Formules +%%% +\setKVdefault[ClesFormule]{Perimetre=false,Aire=false,Volume=false,Surface=carr\'e,Solide=pav\'e,Angle=0,Ancre={(0,0)},Largeur=5cm,Couleur=white,EchelleEspace=70,Echelle=1cm} + +\def\MPFigureCarre{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0); + C=rotation(A,B,-90); + D-C=A-B; + draw polygone(A,B,C,D); + draw codeperp(A,B,C,5); + draw codeperp(B,C,D,5); + draw codeperp(C,D,A,5); + draw codeperp(D,A,B,5); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $c$ etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0); + C=rotation(A,B,-90); + D-C=A-B; + draw polygone(A,B,C,D); + draw codeperp(A,B,C,5); + draw codeperp(B,C,D,5); + draw codeperp(C,D,A,5); + draw codeperp(D,A,B,5); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $c$ etex); + \end{mpost} + \fi +} + +\def\MPFigurePolygone{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + pair A,B,C,D,E,F; + A=u*(1,1); + B-A=u*(2,0); + C=3/5[B,rotation(A,B,-120)]; + D-C=u*(0,1); + E-D=u*(-1.25,-1); + F-E=u*(-1,1); + draw polygone(A,B,C,D,E,F); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + pair A,B,C,D,E,F; + A=u*(1,1); + B-A=u*(2,0); + C=3/5[B,rotation(A,B,-120)]; + D-C=u*(0,1); + E-D=u*(-1.25,-1); + F-E=u*(-1,1); + draw polygone(A,B,C,D,E,F); + \end{mpost} + \fi +} + +\def\MPFigureParallelogramme{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesFormule]{Echelle}; + vardef marque_para(expr dd,ee,pa)= + save im; + picture im; + pair kk,ll,mn,mo; + kk=point(pa*length dd) of dd; + ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee); + mn=iso(kk,ll); + mo=(mn--kk) intersectionpoint cercles(mn,3mm); + im=image( + drawarrow mo--kk; + drawarrow symetrie(mo,mn)--ll; + label(btex $//$ etex,mn); + ); + im + enddef; + + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2.25,0.25); + D=4/5[A,rotation(B,A,40)]; + C-D=B-A; + draw polygone(A,B,C,D); + drawoptions(withcolor gris); + draw marque_para(droite(A,B),droite(C,D),0.455); + draw marque_para(droite(B,C),droite(A,D),0.43); + draw segment(B,2.5[C,B]) dashed evenly; + draw segment(A,1.5[D,A]) dashed evenly; + draw segment(A,1.55[B,A]) dashed evenly; + draw segment(D,2[C,D]) dashed evenly; + drawoptions(); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + vardef marque_para(expr dd,ee,pa)= + save im; + picture im; + pair kk,ll,mn,mo; + kk=point(pa*length dd) of dd; + ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee); + mn=iso(kk,ll); + mo=(mn--kk) intersectionpoint cercles(mn,3mm); + im=image( + drawarrow mo--kk; + drawarrow symetrie(mo,mn)--ll; + label(btex $//$ etex,mn); + ); + im + enddef; + + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2.25,0.25); + D=4/5[A,rotation(B,A,40)]; + C-D=B-A; + draw polygone(A,B,C,D); + drawoptions(withcolor gris); + draw marque_para(droite(A,B),droite(C,D),0.455); + draw marque_para(droite(B,C),droite(A,D),0.43); + draw segment(B,2.5[C,B]) dashed evenly; + draw segment(A,1.5[D,A]) dashed evenly; + draw segment(A,1.55[B,A]) dashed evenly; + draw segment(D,2[C,D]) dashed evenly; + drawoptions(); + \end{mpost} + \fi +} + +\def\MPFigureParallelogrammeAire{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,10u,5u); + pair A,B,C,D,I,J; + A=u*(1,1); + B-A=u*(2,0.5); + D=3/5[A,rotation(B,A,40)]; + C-D=B-A; + I=projection(D,A,B); + draw polygone(A,B,C,D) withcolor gris; + draw segment(A,B); + draw segment(D,I); + draw codeperp(D,I,B,5); + A:=A+3*u*(1,0); + B:=A+u*(2,0.5); + D:=3/5[A,rotation(B,A,40)]; + C:=D+B-A; + J=projection(B,A,D); + draw polygone(A,B,C,D) withcolor gris; + draw segment(D,1.5[A,D]) dashed evenly withcolor gris; + draw segment(A,D); + draw segment(B,J); + draw codeperp(B,J,A,5); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,10u,5u); + pair A,B,C,D,I,J; + A=u*(1,1); + B-A=u*(2,0.5); + D=3/5[A,rotation(B,A,40)]; + C-D=B-A; + I=projection(D,A,B); + draw polygone(A,B,C,D) withcolor gris; + draw segment(A,B); + draw segment(D,I); + draw codeperp(D,I,B,5); + A:=A+3*u*(1,0); + B:=A+u*(2,0.5); + D:=3/5[A,rotation(B,A,40)]; + C:=D+B-A; + J=projection(B,A,D); + draw polygone(A,B,C,D) withcolor gris; + draw segment(D,1.5[A,D]) dashed evenly withcolor gris; + draw segment(A,D); + draw segment(B,J); + draw codeperp(B,J,A,5); + \end{mpost} + \fi +} + +\def\MPFigureSphere{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace}); + color O,A,B,C; + O=(0,0,0); + A-O=(0,1/2,0); + C-O=(-1/2,0,0); + B-O=(0,0,1/2); + path cc,cd; + cc=cercles(O,A,O,A,C); + cd=cercles(O,A,O,A,B); + draw cd; + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw cotationmil(O,A,0,18,btex rayon $r$ etex); + marque_p:="plein"; + pointe(O); + marque_p:="non"; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,0,10,v); + color O,A,B,C; + O=(0,0,0); + A-O=(0,1/2,0); + C-O=(-1/2,0,0); + B-O=(0,0,1/2); + path cc,cd; + cc=cercles(O,A,O,A,C); + cd=cercles(O,A,O,A,B); + draw cd; + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw cotationmil(O,A,0,18,btex rayon $r$ etex); + marque_p:="plein"; + pointe(O); + marque_p:="non"; + \end{mpost} + \fi +} + +\def\MPFigurePave{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,115); + color A,B,C,D,E,F,G,H; + draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris; + draw segment(A,B); + draw segment(E,F); + draw segment(A,F); + draw appelation(A,B,-2mm,btex $\ell$ etex); + draw appelation(F,E,2mm,btex $p$ etex); + draw appelation(A,F,2mm,btex $h$ etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,115); + color A,B,C,D,E,F,G,H; + draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris; + draw segment(A,B); + draw segment(E,F); + draw segment(A,F); + draw appelation(A,B,-2mm,\btex $\ell$ etex); + draw appelation(F,E,2mm,\btex $p$ etex); + draw appelation(A,F,2mm,\btex $h$ etex); + \end{mpost} + \fi +} + +\def\MPFigurePrisme{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,\useKV[ClesFormule]{EchelleEspace}); + color A,B,C,D,E,F,G,H; + D=(0.75,0,0); + G=(0,1,0); + H=(0,0,0); + A-D=(0,0,0.5); + C-D=G-H; + E-H=A-D; + F-E=(0,0.6,0); + B-A=F-E; + NbS:=8; + Sommet1:=A; + Sommet2:=B; + Sommet3:=C; + Sommet4:=D; + Sommet5:=E; + Sommet6:=F; + Sommet7:=G; + Sommet8:=H; + NF:=6; + Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; + Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8; + Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3; + Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7; + Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5; + Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6; + CoulTrace:=gris; + DessineObjet; + drawoptions(withcolor gris); + draw codeperp(B,A,E,5); + draw codeperp(A,B,F,5); + draw codeperp(H,D,C,5); + draw codeperp(D,C,G,5); + drawoptions(); + draw polygone(A,B,C,D); + draw hachurage(polygone(A,B,C,D),60,0.3,0); + draw segment(A,E); + draw appelation(A,E,3mm,btex hauteur etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,115); + color A,B,C,D,E,F,G,H; + D=(0.75,0,0); + G=(0,1,0); + H=(0,0,0); + A-D=(0,0,0.5); + C-D=G-H; + E-H=A-D; + F-E=(0,0.6,0); + B-A=F-E; + NbS:=8; + Sommet1:=A; + Sommet2:=B; + Sommet3:=C; + Sommet4:=D; + Sommet5:=E; + Sommet6:=F; + Sommet7:=G; + Sommet8:=H; + NF:=6; + Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; + Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8; + Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3; + Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7; + Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5; + Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6; + CoulTrace:=gris; + DessineObjet; + drawoptions(withcolor gris); + draw codeperp(B,A,E,5); + draw codeperp(A,B,F,5); + draw codeperp(H,D,C,5); + draw codeperp(D,C,G,5); + drawoptions(); + draw polygone(A,B,C,D); + draw hachurage(polygone(A,B,C,D),60,0.3,0); + draw segment(A,E); + draw appelation(A,E,3mm,btex hauteur etex); + \end{mpost} + \fi +} + +\def\MPFigureCylindre{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,0,20,\useKV[ClesFormule]{EchelleEspace}); + color O,O',A,A',B,B',C,C'; + O=(0,0,0); + O'-O=(0,0,1); + A-O=(0,1,0); + A'-A=O'-O; + C=symetrie(A,O); + C'-C=O'-O; + B-O=(-1/2,0,0); + B'-B=O'-O; + path cc,cd; + cc=cercles(O,A,O,A,B); + cd=cercles(O',A',O',A',B'); + draw cd; + draw segment(C,C'); + draw segment(A,A'); + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw segment(O,A); + draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex); + draw appelation(O,A,2mm,btex rayon $r$ etex); + marque_p:="croix"; + pointe(O); + marque_p:="non"; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,0,20,70); + color O,O',A,A',B,B',C,C'; + O=(0,0,0); + O'-O=(0,0,1); + A-O=(0,1,0); + A'-A=O'-O; + C=symetrie(A,O); + C'-C=O'-O; + B-O=(-1/2,0,0); + B'-B=O'-O; + path cc,cd; + cc=cercles(O,A,O,A,B); + cd=cercles(O',A',O',A',B'); + draw cd; + draw segment(C,C'); + draw segment(A,A'); + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw segment(O,A); + draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex); + draw appelation(O,A,2mm,btex rayon $r$ etex); + marque_p:="croix"; + pointe(O); + marque_p:="non"; + \end{mpost} + \fi +} + +\def\MPFigureCone{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace}); + color O,O',A,B,C; + O=(0,0,0); + O'-O=(0,0,1.5); + A-O=(0,1,0); + C=symetrie(A,O); + B-O=(-1/2,0,0); + path cc; + cc=cercles(O,A,O,A,B); + draw chemin(C,O',A); + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw chemin(O',O,A); + draw appelation(O,O',2mm,btex hauteur etex); + draw appelation(O,A,1mm,btex rayon $r$ etex); + marque_p:="croix"; + pointe(O); + marque_p:="non"; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,0,10,70); + color O,O',A,B,C; + O=(0,0,0); + O'-O=(0,0,1.5); + A-O=(0,1,0); + C=symetrie(A,O); + B-O=(-1/2,0,0); + path cc; + cc=cercles(O,A,O,A,B); + draw chemin(C,O',A); + draw (subpath(0,length cc/2) of cc) dashed evenly; + draw subpath(length cc/2,length cc) of cc; + draw chemin(O',O,A); + draw appelation(O,O',2mm,btex hauteur etex); + draw appelation(O,A,1mm,btex rayon $r$ etex); + marque_p:="croix"; + pointe(O); + marque_p:="non"; + \end{mpost} + \fi +} + +\def\MPFigurePyramide{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + u:=0.5cm; + z0=(-0.5,0)*u; + z1=(2.5,0.5)*u; + z2=(4,2)*u; + z3=(-0.5,2.75)*u; + z4=(-3,1.5)*u; + z5=(0.5,6)*u; + z6=(0.5,1.5)*u; + z7=z6 shifted (5u,0); + draw z5--z0 withcolor gris; + draw z5--z1 withcolor gris; + draw z5--z2 withcolor gris; + draw z5--z4 withcolor gris; + draw z5--z3 dashed evenly withcolor gris; + draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0); + remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white; + draw z4--z0--z1--z2; + draw z2--z3--z4 dashed evenly; + draw z5--z6 dashed evenly; + draw codeperp(z7,z6,z5,8); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + Figure(-10u,-10u,10u,10u); + u:=0.5cm; + z0=(-0.5,0)*u; + z1=(2.5,0.5)*u; + z2=(4,2)*u; + z3=(-0.5,2.75)*u; + z4=(-3,1.5)*u; + z5=(0.5,6)*u; + z6=(0.5,1.5)*u; + z7=z6 shifted (5u,0); + draw z5--z0 withcolor gris; + draw z5--z1 withcolor gris; + draw z5--z2 withcolor gris; + draw z5--z4 withcolor gris; + draw z5--z3 dashed evenly withcolor gris; + draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0); + remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white; + draw z4--z0--z1--z2; + draw z2--z3--z4 dashed evenly; + draw z5--z6 dashed evenly; + draw codeperp(z7,z6,z5,8); + \end{mpost} + \fi +} + +\def\MPFigureCube{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + drawoptions( dashed dashpattern(on1cm)); + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,80); + color A,B,C,D,E,F,G,H; + draw Cube(A,B,C,D,E,F,G,H) withcolor gris; + draw segment(E,H); + draw appelation(E,H,2mm,btex $a$ etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-10u,-10u,10u,10u); + Initialisation(5,30,20,80); + color A,B,C,D,E,F,G,H; + draw Cube(A,B,C,D,E,F,G,H) withcolor gris; + draw segment(E,H); + draw appelation(E,H,2mm,btex $a$ etex); + \end{mpost} + \fi +} + +\def\MPFigureLosange{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0.5); + D=rotation(B,A,40); + C-D=B-A; + draw polygone(A,B,C,D); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $c$ etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0.5); + D=rotation(B,A,40); + C-D=B-A; + draw polygone(A,B,C,D); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $c$ etex); + \end{mpost} + \fi +} + +\def\MPFigureLosangeAire{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0.5); + D=rotation(B,A,40); + C-D=B-A; + draw polygone(A,B,C,D) withcolor gris; + draw segment(A,C); + draw segment(B,D); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(2,0.5); + D=rotation(B,A,40); + C-D=B-A; + draw polygone(A,B,C,D) withcolor gris; + draw segment(A,C); + draw segment(B,D); + marque_s:=marque_s/3; + draw Codelongueur(A,B,B,C,C,D,D,A,2); + marque_s:=marque_s*3; + \end{mpost} + \fi +} + +\def\MPFigureRectangle{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + pair A,B,C,D; + A=u*(1,1); + B-A=u*(3,0); + C=2/3[B,rotation(A,B,-90)]; + D-C=A-B; + draw polygone(A,B,C,D); + draw codeperp(A,B,C,5); + draw codeperp(B,C,D,5); + draw codeperp(C,D,A,5); + draw codeperp(D,A,B,5); + marque_s:=marque_s/3; + draw Codelongueur(A,B,C,D,2); + draw Codelongueur(A,D,C,B,5); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $L$ etex); + label.lft(btex $\ell$ etex,iso(A,D)); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + pair A,B,C,D; + A=u*(1,1); + B-A=u*(3,0); + C=2/3[B,rotation(A,B,-90)]; + D-C=A-B; + draw polygone(A,B,C,D); + draw codeperp(A,B,C,5); + draw codeperp(B,C,D,5); + draw codeperp(C,D,A,5); + draw codeperp(D,A,B,5); + marque_s:=marque_s/3; + draw Codelongueur(A,B,C,D,2); + draw Codelongueur(A,D,C,B,5); + marque_s:=marque_s*3; + draw appelation(A,B,-3mm,btex $L$ etex); + label.lft(btex $\ell$ etex,iso(A,D)); + \end{mpost} + \fi +} + +\def\MPFigureTriangle{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(1,1); + B-A=u*(3,0); + C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + draw polygone(A,B,C); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(1,1); + B-A=u*(3,0); + C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + draw polygone(A,B,C); + \end{mpost} + \fi +} + +\def\MPFigureCercle{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(2.5,2.5); + path cc; + cc=cercles(A,1.25u); + B=pointarc(cc,195); + C=symetrie(B,A); + draw cc withcolor gris; + draw segment(B,C); + marque_p:="croix"; + pointe(A); + draw appelation(B,C,3mm,btex diam\`etre etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(2.5,2.5); + path cc; + cc=cercles(A,1.25u); + B=pointarc(cc,195); + C=symetrie(B,A); + draw cc withcolor gris; + draw segment(B,C); + marque_p:="croix"; + pointe(A); + draw appelation(B,C,3mm,\btex diam\`etre etex); + \end{mpost} + \fi +} + +\def\MPFigureDisque{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(2.5,2.5); + path cc; + cc=cercles(A,1.25u); + B=pointarc(cc,195); + C=symetrie(B,A); + draw cc withcolor gris; + draw segment(A,C); + marque_p:="croix"; + pointe(A); + draw appelation(A,C,3mm,btex rayon $r$ etex); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C; + A=u*(2.5,2.5); + path cc; + cc=cercles(A,1.25u); + B=pointarc(cc,195); + C=symetrie(B,A); + draw cc withcolor gris; + draw segment(A,C); + marque_p:="croix"; + pointe(A); + draw appelation(A,C,3mm,\btex rayon $r$ etex); + \end{mpost} + \fi +} + +\def\MPFigureTriangleAire{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} +u:=\useKV[ClesFormule]{Echelle}; + drawoptions( dashed dashpattern(on1cm)); + pair A,B,C,H,I,J; + A=u*(0.5,1); + B-A=u*(1.4,0); + C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + H=projection(C,A,B); + I=projection(A,B,C); + J=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(C,H); + draw segment(A,B); + draw codeperp(C,H,B,5); + drawoptions(); + A:=A+u*(2.5,0); + B:=A+u*(1.4,0); + C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + I:=projection(A,B,C); + J:=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(A,I); + draw segment(C,B); + draw codeperp(A,I,B,5); + drawoptions(); + A:=A-u*(1.25,1); + B:=A+u*(1.4,0); + C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + J:=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(B,J); + draw segment(C,A); + draw codeperp(B,J,C,5); + drawoptions(); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] + Figure(-5u,-5u,5u,5u); + pair A,B,C,H,I,J; + A=u*(0.5,1); + B-A=u*(1.4,0); + C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + H=projection(C,A,B); + I=projection(A,B,C); + J=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(C,H); + draw segment(A,B); + draw codeperp(C,H,B,5); + drawoptions(); + A:=A+u*(2.5,0); + B:=A+u*(1.4,0); + C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + I:=projection(A,B,C); + J:=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(A,I); + draw segment(C,B); + draw codeperp(A,I,B,5); + drawoptions(); + A:=A-u*(1.25,1); + B:=A+u*(1.4,0); + C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); + J:=projection(B,C,A); + draw polygone(A,B,C) withcolor gris; + drawoptions(); + draw segment(B,J); + draw segment(C,A); + draw codeperp(B,J,C,5); + drawoptions(); + \end{mpost} + \fi +}% + +\newcommand\Formule[1][]{% + \useKVdefault[ClesFormule]% + \setKV[ClesFormule]{#1}% + \setlength{\RoundedBoxWidth}{\useKV[ClesFormule]{Largeur}}% + \xdef\ColorFill{\useKV[ClesFormule]{Couleur}}% + \ifboolKV[ClesFormule]{Perimetre}{% + \begin{tikzpicture}[remember picture, overlay] + \node[draw,fill=\ColorFill,dashed,rounded corners,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% + \IfStrEqCase{\useKV[ClesFormule]{Surface}}{% + {carre}{\begin{center} + \MPFigureCarre\par + P\'erim\`etre d'un carr\'e :\par$4\times c$ + \end{center}}% + {polygone}{% + \begin{center} + \MPFigurePolygone\par + P\'erim\`etre d'un polygone : \par$\text{Somme des c\^ot\'es}$ + \end{center} + }% + {rectangle}{% + \begin{center} + \MPFigureRectangle\par + P\'erim\`etre d'un rectangle : \par$2\times(L+\ell)$ + \end{center} + }% + {losange}{% + \begin{center} + \MPFigureLosange\par + P\'erim\`etre d'un losange : \par$4\times c$ + \end{center} + }% + {triangle}{% + \begin{center} + \MPFigureTriangle\par + P\'erim\`etre d'un triangle : \par Somme des c\^ot\'es + \end{center} + }% + {cercle}{% + \begin{center} + \MPFigureCercle\par + P\'erim\`etre d'un cercle : \par$\pi\times\text{diam\`etre}$ + \end{center} + }% + {parallelogramme}{% + \begin{center} + \MPFigureParallelogramme\par + P\'erim\`etre d'un parall\'elogramme : \par Somme des c\^ot\'es + \end{center} + }} + \end{minipage}}; + \end{tikzpicture} + }{\ifboolKV[ClesFormule]{Aire}{% + \begin{tikzpicture}[remember picture, overlay] + \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% + \IfStrEqCase{\useKV[ClesFormule]{Surface}}{% + {carre}{\begin{center} + \MPFigureCarre\par + Aire d'un carr\'e :\par$c\times c$ + \end{center}}% + {rectangle}{% + \begin{center} + \MPFigureRectangle\par + Aire d'un rectangle :\par$L\times\ell$ + \end{center} + }% + {losange}{% + \begin{center} + \MPFigureLosangeAire\par + Aire d'un losange :\par$\dfrac{\text{grande diagonale}\times\text{petite diagonale}}{2}$ + \end{center} + }% + {triangle}{% + \begin{center} + \MPFigureTriangleAire\par\vspace{1em}\par + Aire d'un triangle : $\displaystyle\frac{\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}}{2}$ + \end{center} + }% + {disque}{% + \begin{center} + \MPFigureDisque\par + Aire d'un disque :\par$\pi\times r\times r$ + \end{center} + }% + {parallelogramme}{% + \begin{center} + \MPFigureParallelogrammeAire\par + Aire d'un parall\'elogramme : $\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}$ + \end{center} + } + {sphere}{% + \begin{center} + \MPFigureSphere\par + Aire d'une sph\`ere : $4\times\pi\times r^2$ + \end{center} + }} + \end{minipage}}; + \end{tikzpicture} + }{%Volume + \begin{tikzpicture}[remember picture, overlay] + \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% + \IfStrEqCase{\useKV[ClesFormule]{Solide}}{% + {boule}{\begin{center} + \MPFigureSphere\par + Volume d'une boule : $\dfrac{4\times\pi\times r^3}{3}$ + \end{center}}% + {cube}{% + \begin{center} + \MPFigureCube\par + Volume d'un cube : $a^3\quad(a\times a\times a)$ + \end{center} + }% + {pave}{% + \begin{center} + \MPFigurePave\par + Volume d'un pav\'e droit : $\ell\times h\times p$ + \end{center} + } + {prisme}{% + \begin{center} + \MPFigurePrisme\par + Volume d'un prisme droit : $\text{Aire de la base}\times\mbox{hauteur}$ + \end{center} + } + {cylindre}{% + \begin{center} + \MPFigureCylindre\par + Volume d'un cylindre de r\'evolution : $\pi\times r^2\times h$ + \end{center} + } + {pyramide}{% + \begin{center} + \MPFigurePyramide\par + Volume d'une pyramide : $\dfrac{\text{Aire de la base}\times\text{hauteur}}{3}$ + \end{center} + } + {cone}{% + \begin{center} + \MPFigureCone\par + Volume d'un c\^one de r\'evolution : $\displaystyle\dfrac{\pi\times r^2\times h}{3}$ + \end{center} + } + } + \end{minipage}}; + \end{tikzpicture} + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCReperage.tex b/macros/latex/contrib/profcollege/latex/PfCReperage.tex new file mode 100644 index 0000000000..347ed19498 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCReperage.tex @@ -0,0 +1,2095 @@ +%%% +% Reperage +%%% +\setKVdefault[ClesReperage]{Unitex=1,Pasx=1,Unitey=1,Pasy=1,Unitez=1,Pasz=1,DemiDroite=false,Droite=false,Plan=false,Trace=false,ListeSegment={},Espace=false,Sphere=false,AnglePhi=30,CouleurLa=white,CouleurLon=Tomato,AffichageNom=false,AffichageGrad=false,AffichageAbs=0,AffichageCoord=false,LectureCoord=false,ValeurUnitex=1,ValeurUnitey=1,ValeurOrigine=0,NomOrigine=O,EchelleEspace=50,CouleurCoord=black,Thermometre=false,Mercure=false,CouleurMercure=black,Celsius,Kelvin=false,Farenheit=false,ValeurMin=-4000,ValeurMax=4000,Etages=4,Code=false} +\defKV[ClesReperage]{Traces=\setKV[ClesReperage]{Code}} +% ValeurOrigine permet de faire des morceaux de demi-droite gradu\'ee en passant par droite :) + +\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} +\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} +\def\Updatetoksdemidroite#1/#2\nil{\addtotok\toklistenompointdemidroite{"#2",}} +\def\Updatetoksrepere#1/#2/#3\nil{\addtotok\toklistepointrepere{#1,#2,"#3",}} +\def\Updatetoksespace#1/#2/#3/#4\nil{\addtotok\toklistepointespace{#1,#2,#3,"#4",}} + +\newtoks\toklistepointrepere% +\newtoks\toklistepointdroite% +\newtoks\toklistepointdemidroite% +\newtoks\toklistenompointdemidroite% +\newtoks\toklistepointespace% + +% Pour construire le rep\`ere de l'espace +\def\buildespace{% + \toklistepointespace{}% + \ifboolKV[ClesReperage]{Sphere}{% + \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksrepere\compteur\nil}% + \[\MPEspaceSphere{\the\toklistepointrepere}{\useKV[ClesReperage]{EchelleEspace}}\] + }{% + \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksespace\compteur\nil}% + \ifboolKV[ClesReperage]{AffichageNom}{% + \ifboolKV[ClesReperage]{AffichageCoord}{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{3}{\useKV[ClesReperage]{EchelleEspace}}\]% + }{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{2}{\useKV[ClesReperage]{EchelleEspace}}\]% + }% + }{% + \ifboolKV[ClesReperage]{AffichageCoord}{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{1}{\useKV[ClesReperage]{EchelleEspace}}\]% + }{% + \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{0}{\useKV[ClesReperage]{EchelleEspace}}\]% + }% + }% + }% +}% + +\def\MPEspaceSphere#1#2{% + \ifluatex + \begin{mplibcode} + typetrace:="3D"; + typerepre:="persp"; + anglephi:=\useKV[ClesReperage]{AnglePhi}; + Initialisation(1500,anglephi,10,#2); + color O,A,B,C,D,Z,M[]; + O=(0,0,0); + A=(cosd(anglephi+90),sind(anglephi+90),0); + B=(cosd(anglephi+180),sind(anglephi+180),0); + C=(1,0,0); + D=(0,1,0); + Z=(0,0,1); + trace cercles(O,A,O,A,Z) withcolor 0.7white; + path Equateur; + Equateur=cercles(O,C,O,C,D); + trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; + trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; + path greenwich; + greenwich=cercles(O,C,O,C,Z); + trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; + clip currentpicture to cercles(O,A,O,A,Z); + trace chemin(C,O,Z) dashed evenly withcolor 0.85white; + trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; + + vardef toto(text t)= + n:=1; + for p_=t: + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); + path Codageun,Codagedeux; + if k>0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); + elseif k<0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); + fi; + if l>0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); + elseif l<0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); + fi; + %%%% if l>0: + %%%fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %%%fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %%%else: + %%%fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %%%fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %%%fi; + if unknown Codageun: else: trace Codageun; fi; + if unknown Codagedeux: else: trace Codagedeux; fi; + if \useKV[ClesReperage]{AffichageCoord}: + picture CodageUn,CodageDeux; + CodageUn=image( + if k>0: + label.bot(TEX("\scriptsize\ang{"&decimal(k)&"} E"),(0,0)); + else: + label.bot(TEX("\scriptsize\ang{"&decimal(abs(k))&"} O"),(0,0)); + fi; + ); + CodageDeux=image( + if k>0: + label.rt(TEX("\scriptsize\ang{"&decimal(l)&"} N"),(0,0)); + else: + label.lft(TEX("\scriptsize\ang{"&decimal(abs(l))&"} S"),(0,0)); + fi; + ); + fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; + trace CodageUn shifted (point(0.5*length Codageun) of Codageun); + fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; + trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); + fi; + trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; + trace chemin(O,M[n]) dashed withdots scaled 0.5; + trace chemin(O,C) dashed withdots scaled 0.5; + if \useKV[ClesReperage]{AffichageNom}: + if l>0:dotlabel.top(p_,Projette(M[n])); + else: + dotlabel.bot(p_,Projette(M[n])); + fi; + fi; + fi; + n:=n+1; + endfor; + enddef; + toto(#1); + label.llft(btex \tiny \ang{0} etex,Projette(C)); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={boolean AffichageCoord; AffichageCoord=\useKV[ClesReperage]{AffichageCoord}; boolean AffichageNom; AffichageNom=\useKV[ClesReperage]{AffichageNom};anglephi:=\useKV[ClesReperage]{AnglePhi};}] + typetrace:="3D"; + typerepre:="persp"; + Initialisation(1500,anglephi,10,#2); + color O,A,B,C,D,Z,M[]; + O=(0,0,0); + A=(cosd(anglephi+90),sind(anglephi+90),0); + B=(cosd(anglephi+180),sind(anglephi+180),0); + C=(1,0,0); + D=(0,1,0); + Z=(0,0,1); + trace cercles(O,A,O,A,Z) withcolor 0.7white; + path Equateur; + Equateur=cercles(O,C,O,C,D); + trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; + trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; + path greenwich; + greenwich=cercles(O,C,O,C,Z); + trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; + clip currentpicture to cercles(O,A,O,A,Z); + trace chemin(C,O,Z) dashed evenly withcolor 0.85white; + trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; + + vardef toto(text t)= + n:=1; + for p_=t: + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); + path Codageun,Codagedeux; + if k>0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); + elseif k<0: + Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); + fi; + if l>0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); + elseif k<0: + Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); + fi; + %if l>0: + %fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %else: + %fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; + %fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; + %fi; + if unknown Codageun: else: trace Codageun; fi; + if unknown Codagedeux: else: trace Codagedeux; fi; + if AffichageCoord: + picture CodageUn,CodageDeux; + CodageUn=image( + if k>0: + label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(k)&"} E"),(0,0)); + else: + label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(k))&"} O"),(0,0)); + fi; + ); + CodageDeux=image( + if k>0: + label.rt(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(l)&"} N"),(0,0)); + else: + label.lft(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(l))&"} S"),(0,0)); + fi; + ); + fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; + trace CodageUn shifted (point(0.5*length Codageun) of Codageun); + fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; + trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); + fi; + trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; + trace chemin(O,M[n]) dashed withdots scaled 0.5; + trace chemin(O,C) dashed withdots scaled 0.5; + if AffichageNom: + if l>0:dotlabel.top(p_,Projette(M[n])); + else: + dotlabel.bot(p_,Projette(M[n])); + fi; + fi; + fi; + n:=n+1; + endfor; + enddef; + toto(#1); + label.llft(LATEX("\noexpand\tiny\noexpand\ang{0}"),Projette(C)); + \end{mpost} + \fi +} + +\def\MPEspacePave#1#2#3#4#5#6#7#8#9{% + \ifluatex + \begin{mplibcode} + typetrace:="3D"; + typerepre:="persp"; + Figure(-20u,-20u,20u,20u); + Initialisation(1500,30,20,abs(#9)); + %marque_r:=marque_r/2; + marque_p:="plein"; + color A,B,C,D,E,F,G,H,M[],N[]; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if #9>0: + drawarrow Projette(A)--Projette(1.5[D,A]); + drawarrow Projette(C)--Projette(1.5[D,C]); + drawarrow Projette(E)--Projette(1.5[D,E]); + label.top(btex $x$ etex,Projette(1.5[D,A])); + label.top(btex $y$ etex,Projette(1.5[D,C])); + label.top(btex $z$ etex,Projette(1.5[D,E])); + label.ulft(btex 1 etex,Projette((1/#2)[D,A])); + label.bot(btex 1 etex,Projette((1/#4)[D,C])); + label.lft(btex 1 etex,Projette((1/#6)[D,E])); + for k=1 upto (#2): + pointe((k/#2)[D,A]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[D,C]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[D,E]); + endfor; + else: + drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; + drawarrow Projette(B)--Projette(1.5[A,B]); + drawarrow Projette(F)--Projette(1.5[A,F]); + label.lrt(btex $x$ etex,Projette(1.5[A,D])); + label.top(btex $y$ etex,Projette(1.5[A,B])); + label.top(btex $z$ etex,Projette(1.5[A,F])); + label.ulft(btex 1 etex,Projette((1/#2)[A,D])); + label.bot(btex 1 etex,Projette((1/#4)[A,B])); + label.lft(btex 1 etex,Projette((1/#6)[A,F])); + for k=1 upto (#2): + pointe((k/#2)[A,D]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[A,B]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[A,F]); + endfor; + fi; + vardef tata(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); + N[n]=(k/#2)[D,A]+(l/#4)*(C-D); + if (#8>1): + label.top(TEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],(redpart(M[n]),0,0)); + draw segment(N[n],(0,greenpart(M[n]),0)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef toto(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + % message("je suis ici : "&p_); + M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); + N[n]=(k/#2)[A,D]+(l/#4)*(B-A); + if (#8>1): + label.top(TEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],A+(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],A+(l/#4)*(B-A)); + draw segment(N[n],A+(k/#2)*(D-A)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + if #9>0: + tata(#7); + else: + toto(#7); + fi; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if \useKV[ClesReperage]{Code}: + \useKV[ClesReperage]{Traces} + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + typetrace:="3D"; + typerepre:="persp"; + Figure(-20u,-20u,20u,20u); + Initialisation(1500,30,20,abs(#9)); + %marque_r:=marque_r/2; + marque_p:="plein"; + color A,B,C,D,E,F,G,H,M[],N[]; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + if #9>0: + drawarrow Projette(A)--Projette(1.5[D,A]); + drawarrow Projette(C)--Projette(1.5[D,C]); + drawarrow Projette(E)--Projette(1.5[D,E]); + label.ulft(btex 1 etex,Projette((1/#2)[D,A])); + label.bot(btex 1 etex,Projette((1/#4)[D,C])); + label.lft(btex 1 etex,Projette((1/#6)[D,E])); + for k=1 upto (#2): + pointe((k/#2)[D,A]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[D,C]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[D,E]); + endfor; + else: + drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; + drawarrow Projette(B)--Projette(1.5[A,B]); + drawarrow Projette(F)--Projette(1.5[A,F]); + label.ulft(btex 1 etex,Projette((1/#2)[A,D])); + label.bot(btex 1 etex,Projette((1/#4)[A,B])); + label.lft(btex 1 etex,Projette((1/#6)[A,F])); + for k=1 upto (#2): + pointe((k/#2)[A,D]); + endfor; + for k=1 upto (#4): + pointe((k/#4)[A,B]); + endfor; + for k=1 upto (#6): + pointe((k/#6)[A,F]); + endfor; + fi; + vardef tata(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); + N[n]=(k/#2)[D,A]+(l/#4)*(C-D); + if (#8>1): + label.top(LATEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],(redpart(M[n]),0,0)); + draw segment(N[n],(0,greenpart(M[n]),0)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef toto(text t)= + n:=1;%pour compter combien de points + k:=0;%pour garder l'abscisse + l:=0;%pour garder l'ordonn\'ee + m:=0;%pour garder l'altitude + if #8>0: + for p_=t: + if (n mod 4)=1: + k:=p_; + fi; + if (n mod 4)=2: + l:=p_; + fi; + if (n mod 4)=3: + m:=p_; + fi; + if (n mod 4)=0: + % message("je suis ici : "&p_); + M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); + N[n]=(k/#2)[A,D]+(l/#4)*(B-A); + if (#8>1): + label.top(LATEX(p_),Projette(M[n])); + pointe(M[n]); + fi; + if (#8=1) or (#8=3) : + drawoptions(dashed evenly withcolor gris); + draw segment(M[n],A+(0,0,bluepart(M[n]))); + draw segment(M[n],N[n]); + draw segment(N[n],A+(l/#4)*(B-A)); + draw segment(N[n],A+(k/#2)*(D-A)); + drawoptions(); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + if #9>0: + tata(#7); + else: + toto(#7); + fi; + draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); + \end{mpost} + \fi +}% + +% Pour construire le rep\`ere du plan +\def\buildreperenew{% + \toklistepointrepere{}% + \foreachitem\compteur\in\ListePointRepere{\expandafter\Updatetoksrepere\compteur\nil}% + \ifboolKV[ClesReperage]{Trace}{% + \[\MPPlanTrace{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\the\toklistepointrepere}{2}{\useKV[ClesReperage]{ValeurUnitex}}{\useKV[ClesReperage]{ValeurUnitey}}{\useKV[ClesReperage]{ListeSegment}}\]% + }{% + \xdef\AfficheNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{3}}{\xdef\AfficheNom{2}}}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{1}}{}}% + \xdef\AfficheGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AfficheGrad{1}}{}% + \xdef\AfficheCoord{\useKV[ClesReperage]{AffichageAbs}}% + \MPPlannew{(\useKV[ClesReperage]{Unitex},\useKV[ClesReperage]{Pasx})}{(\useKV[ClesReperage]{Unitey},\useKV[ClesReperage]{Pasy})}{\the\toklistepointrepere}{\AfficheNom}{\AfficheCoord}{\AfficheGrad}{(\useKV[ClesReperage]{ValeurUnitex},\useKV[ClesReperage]{ValeurUnitey})}% + }% +} + +\def\MPPlannew#1#2#3#4#5#6#7{% + %#1 : Unitex, pasx + %#2 : unitey, pasy + %#3 : liste de points + %#4 : Affichage nom + lecture graphique + %#5 : Affichage des (abscisses/ordonn\'ees) + %#6 : Graduation compl\`ete ? + %#7 : (unitex,unitey) + \ifluatex + \begin{mplibcode} + maxx:=-4000; + minx=4000; + unitex:=(xpart(#1))*cm; + pasx=ypart(#1); + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=(xpart(#2))*cm; + pasy:=ypart(#2); + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(ypart(#1)+1): + maxx:=ypart(#1)+1; + fi; + if minx>(-ypart(#1)-1): + minx:=-ypart(#1)-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(ypart(#2)+1): + maxy:=ypart(#2)+1; + fi; + if miny>(-ypart(#2)-1): + miny:=-ypart(#2)-1; + fi; + enddef; + toto(#3); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + % graduation compl\`ete ou pas ? + label.llft(btex \footnotesize 0 etex,A); + if #6>0: + for k=minx upto maxx: + if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): + if k<>0: + dotlabel.lrt(TEX("\footnotesize\num{"&decimal(k)&"}"),(k*unitex,0)); + fi; + fi; + endfor; + for k=miny upto maxy: + if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): + if k<>0: + dotlabel.ulft(TEX("\footnotesize\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + fi; + endfor; + else: + dotlabel.lrt(TEX("\footnotesize\num{"&decimal(xpart(#7))&"}"),(unitex,0)); + dotlabel.ulft(TEX("\footnotesize\num{"&decimal(ypart(#7))&"}"),(0,unitey)); + fi; + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #4>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #4>1: + if p_<>"": + if (k>0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + fi; + if (#4=1) or (#4=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + if #5=2: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + if (k mod pasx)<>0: + label.lrt(TEX("\footnotesize$\frac{\num{"&decimal(k)&"}}{\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); + else: + label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + fi; + if (l mod pasy)<>0: + label.ulft(TEX("\footnotesize$\frac{\num{"&decimal(l)&"}}{\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); + else: + label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + fi; + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + elseif #5=1: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + tata(#3); + \end{mplibcode} + \else + \begin{mpost} + maxx:=-4000; + minx=4000; + unitex:=(xpart(#1))*cm; + pasx=ypart(#1); + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=(xpart(#2))*cm; + pasy:=ypart(#2); + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(ypart(#1)+1): + maxx:=ypart(#1)+1; + fi; + if minx>(-ypart(#1)-1): + minx:=-ypart(#1)-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(ypart(#2)+1): + maxy:=ypart(#2)+1; + fi; + if miny>(-ypart(#2)-1): + miny:=-ypart(#2)-1; + fi; + enddef; + toto(#3); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + % graduation compl\`ete ou pas ? + label.llft(btex \noexpand\footnotesize 0 etex,A); + if #6>0: + for k=minx upto maxx: + if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): + if k<>0: + dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(k*unitex,0)); + fi; + fi; + endfor; + for k=miny upto maxy: + if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): + if k<>0: + dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + fi; + endfor; + else: + dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(xpart(#7))&"}"),(unitex,0)); + dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ypart(#7))&"}"),(0,unitey)); + fi; + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #4>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #4>1: + if p_<>"": + if (k>0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + fi; + if (#4=1) or (#4=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + if #5=2: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + if (k mod pasx)<>0: + label.lrt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(k)&"}}{\noexpand\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); + else: + label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + fi; + if (l mod pasy)<>0: + label.ulft(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(l)&"}}{\noexpand\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); + else: + label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + fi; + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + elseif #5=1: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if p_<>"": + label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); + label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); + pointe((k*unitpx,0),(0,l*unitpy)); + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + tata(#3); + \end{mpost} + \fi +} + +\def\MPPlanTrace#1#2#3#4#5#6#7#8#9{% + \ifluatex + \begin{mplibcode} + maxx:=-4000; + minx=4000; + unitex:=#1*cm; + pasx=#2; + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=#3*cm; + pasy:=#4; + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(#2+1): + maxx:=#2+1; + fi; + if minx>(-#2-1): + minx:=-#2-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(#4+1): + maxy:=#2+1; + fi; + if miny>(-#4-1): + miny:=-#4-1; + fi; + enddef; + toto(#5); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + dotlabel.bot(TEX("\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); + dotlabel.lft(TEX("\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); + label.llft(btex 0 etex,A); + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #6>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #6>1: + if (k>0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(TEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(TEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + if (#6=1) or (#6=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef Tracage(text t)(text ls)=%on trace les segments + pair A[]; + n:=0;%pour parcourir la liste + m:=0;%pour lister les points par leur nombre + for p_=t: + n:=n+1; + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + m:=m+1; + A[m]=(k*unitpx,l*unitpy); + fi; + endfor; + for p_=ls: + draw segment(A[p_ div 10],A[p_ mod 10]); + endfor; + enddef; + tata(#5); + Tracage(#5)(#9); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={input PfCGeometrie;}] + maxx:=-4000; + minx=4000; + unitex:=#1*cm; + pasx=#2; + unitpx:=unitex/pasx; + maxy:=-4000; + miny:=4000; + unitey:=#3*cm; + pasy:=#4; + unitpy:=unitey/pasy; + n:=1; + vardef toto(text t)= + for p_=t: + if (n mod 3)=1: + if p_>maxx: + maxx:=p_; + fi; + if p_<minx: + minx:=p_; + fi; + fi; + if (n mod 3)=2: + if p_>maxy: + maxy:=p_; + fi; + if p_<miny: + miny:=p_; + fi; + fi; + n:=n+1; + endfor; + maxx:=maxx+1; + minx:=minx-1; + if maxx<(#2+1): + maxx:=#2+1; + fi; + if minx>(-#2-1): + minx:=-#2-1; + fi; + maxy:=maxy+1; + miny:=miny-1; + if maxy<(#4+1): + maxy:=#2+1; + fi; + if miny>(-#4-1): + miny:=-#4-1; + fi; + enddef; + toto(#5); + Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); + pair A,B,C,D,E; + A=(0,0); + B=(minx*unitpx,0); + C=(maxx*unitpx,0); + D=(0,miny*unitpy); + E=(0,maxy*unitpy); + for k=0 upto (maxx-minx): + draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; + endfor; + for k=0 upto (maxy-miny): + draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; + endfor; + drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); + drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); + dotlabel.bot(LATEX("\noexpand\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); + dotlabel.lft(LATEX("\noexpand\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); + label.llft(btex 0 etex,A); + % apparition du nom des points ou pas + m_c:=m_c*3; + marque_p:="croix"; + vardef tata(text t)=%on place les points + if #6>0: + n:=1; + k:=0;%pour retenir la coordonn\'ee en x + l:=0;%pour retenir la coordonn\'ee en y + for p_=t: + if (n mod 3)=1: + if numeric p_: + k:=p_; + fi; + fi; + if (n mod 3)=2: + if numeric p_: + l:=p_; + fi; + fi; + if (n mod 3)=0: + if #6>1: + if (k>0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l>0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l=0): + label.urt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l>0): + label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k=0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l<0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k<0) and (l=0): + label.llft(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + if (k>0) and (l<0): + label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); + fi; + pointe((k*unitpx,l*unitpy)); + fi; + if (#6=1) or (#6=3): + draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; + fi; + fi; + n:=n+1; + endfor; + fi; + enddef; + vardef Tracage(text t)(text ls)=%on trace les segments + pair A[]; + n:=0;%pour parcourir la liste + m:=0;%pour lister les points par leur nombre + for p_=t: + n:=n+1; + if (n mod 3)=1: + k:=p_; + fi; + if (n mod 3)=2: + l:=p_; + fi; + if (n mod 3)=0: + m:=m+1; + A[m]=(k*unitpx,l*unitpy); + fi; + endfor; + for p_=ls: + draw segment(A[p_ div 10],A[p_ mod 10]); + endfor; + enddef; + tata(#5); + Tracage(#5)(#9); + \end{mpost} + \fi +} + +\def\MPTouteDROITEGraduee#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean DemiDroite; + DemiDroite=\useKV[ClesReperage]{DemiDroite}; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<\useKV[ClesReperage]{ValeurMin}: + minx:=\useKV[ClesReperage]{ValeurMin}; + fi; + if maxx>\useKV[ClesReperage]{ValeurMax}: + maxx:=\useKV[ClesReperage]{ValeurMax}; + fi; + if DemiDroite: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(maxx,0); + C=unitp*(minx,0); + % On trace la droite + if DemiDroite: + drawarrow C--(B+unitp*(0.75,0)); + else: + drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); + fi; + % marquage secondaire + marque_s:=marque_s/3; +% labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*3; + label.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + label.top(TEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); + else: + label.top(TEX(p_),unitp*(valeur[n],0)); + fi; + if p_<>"": + pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + % On ajoute une paramétrisation possible à chaque point. + if AffichageCoord>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + ACoord:=scantokens(substring(0,1) of p_); + if ACoord=3: + drawarrow ((unitp*valeur[n],-7mm))--((unitp*valeur[n],-3mm)); + label.bot(btex \hbox to2em{\dotfill} etex,((unitp*valeur[n],-8mm))); + pointe(unitp*(valeur[n]-ValeurOrigine,0)); + elseif ACoord=2: + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + elseif ACoord=1: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + else: + if AffichageCoord=3: + if p_<>"": + drawarrow ((unitp*valeur[n],-7mm))--((unitp*valeur[n],-3mm)); + label.bot(btex \hbox to2em{\dotfill} etex,((unitp*valeur[n],-8mm))); + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=2: + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=1: + if p_<>"": + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + fi; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom; ValeurMin=\useKV[ClesReperage]{ValeurMin}; ValeurMax=\useKV[ClesReperage]{ValeurMax};boolean DemiDroite;DemiDroite=\useKV[ClesReperage]{DemiDroite}}] + maxx:=0; + minx:=4000; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<ValeurMin: + minx:=ValeurMin; + fi; + if maxx>ValeurMax: + maxx:=ValeurMax; + fi; + if DemiDroite: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(maxx,0); + C=unitp*(minx,0); + % On trace la demi-droite + if DemiDroite: + drawarrow C--(B+unitp*(0.75,0)); + else: + drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); + fi; + % marquage secondaire + marque_s:=marque_s/3; + %labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*3; + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + label.top(LATEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); + else: + label.top(LATEX(p_),unitp*(valeur[n],0)); + fi; + if p_<>"": + pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + if AffichageCoord>0: + n:=0; + for p_=t: + n:=n+1; + if substring(1,2) of p_="*": + ACoord:=scantokens(substring(0,1) of p_); + if ACoord=3: + drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); + label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); + pointe(unitp*(valeur[n]-ValeurOrigine,0)); + elseif ACoord=2: + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + elseif ACoord=1: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + else: + if AffichageCoord=3: + if p_<>"": + drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); + label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=2: + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); + else: + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + fi; + pointe(unitp*(valeur[n],0)); + fi; + elseif AffichageCoord=1: + if p_<>"": + label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); + pointe(unitp*(valeur[n],0)); + fi; + fi; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mpost} + \fi +}% + +\def\MPThermo#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean Kelvin,Farenheit; + Kelvin=\useKV[ClesReperage]{Kelvin}; + Farenheit=\useKV[ClesReperage]{Farenheit}; + color ColMercure; + ColMercure:=\useKV[ClesReperage]{CouleurMercure}; + boolean Mercure; + Mercure=\useKV[ClesReperage]{Mercure}; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if Kelvin: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(0,maxx); + C=unitp*(0,minx); + % On trace la demi-droite + draw ((C+unitp*(0,-0.75))--(B+unitp*(0,0.75))); + % marquage secondaire + marque_s:=marque_s/3; + if pasx<11: + labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + if Kelvin: + label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurOrigine)&"}"),A); + elseif Farenheit: + label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurOrigine)&"}"),A); + else: + label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); + label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurOrigine)&"}"),A); + fi; + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + if Kelvin: + label.lft(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + elseif Farenheit: + label.lft(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + else: + label.lft(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% + fi; + fi; + endfor; + fi; + + vardef Thermo(expr nbt)= + pair Tc[]; + Tc[0]=(5mm,unitp*(minx-1)); + path cc[]; + cc1=cercles(Tc[0],2.5mm); + Tc1=pointarc(cc1,75); + Tc4=pointarc(cc1,105); + Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); + Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); + Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); + Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); + path temp; + temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; + if nbt>0: + fill temp withcolor ColMercure; + trace Tc5--Tc6; + fi; + trace arccercle(Tc4,Tc1,Tc0); + trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; + enddef; + + if Mercure:Thermo(1) else : Thermo(0) fi; + + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.rt(TEX(p_),unitp*(0,valeur[n])); + if p_<>"": + pointe(unitp*(0,valeur[n])); + fi; + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); + label.rt(btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=2: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.rt(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); + else: + label.rt(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); + fi; + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=1: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if Kelvin: + label.rt(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + elseif Farenheit: + label.rt(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + else: + label.rt(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); + fi; + pointe(unitp*(0,valeur[n])); + draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + boolean Kelvin,Farenheit; + Kelvin=\useKV[ClesReperage]{Kelvin}; + Farenheit=\useKV[ClesReperage]{Farenheit}; + color ColMercure; + ColMercure:=\useKV[ClesReperage]{CouleurMercure}; + boolean Mercure; + Mercure=\useKV[ClesReperage]{Mercure};}] + maxx:=0; + minx:=4000; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if Kelvin: + minx:=0; + fi; + % ----- + pair A,B,C; + A=(0,0); + B=unitp*(0,maxx); + C=unitp*(0,minx); + % On trace la demi-droite + draw (C+unitp*(0,-0.75))--(B+unitp*(0,0.75)); + % marquage secondaire + marque_s:=marque_s/3; + if pasx<11: + labeloffset:=labeloffset*2; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C,B); + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); + endfor; + fi; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); + endfor; + % marquage des points + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + if Kelvin: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\kelvin}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\kelvin}"),A); + elseif Farenheit: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\farenheit}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\farenheit}"),A); + else: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\celsius}"),unitex*(0,1)); + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\celsius}"),A); + fi; + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + if Kelvin: + label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\kelvin}"),unitex*(0,k));%%% + elseif Farenheit: +label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\farenheit}"),unitex*(0,k));%%% + else: +label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\celsius}"),unitex*(0,k));%%% + fi; + fi; + endfor; + fi; + + vardef Thermo(expr nbt)= + pair Tc[]; + Tc[0]=(5mm,unitp*(minx-1)); + path cc[]; + cc1=cercles(Tc[0],2.5mm); + Tc1=pointarc(cc1,75); + Tc4=pointarc(cc1,105); + Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); + Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); + Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); + Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); + path temp; + temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; + if nbt>0: + fill temp withcolor ColMercure; + trace Tc5--Tc6; + fi; + trace arccercle(Tc4,Tc1,Tc0); + trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; + enddef; + + if Mercure:Thermo(1) else : Thermo(0) fi; + + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.rt(LATEX(p_),unitp*(0,valeur[n])); + if p_<>"": + pointe(unitp*(0,valeur[n])); + fi; + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); + label.rt(\btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=2: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if ((ValeurUnitex*valeur[n]) mod pasx)<>0: + label.rt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); + else: + label.rt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); + fi; + pointe(unitp*(0,valeur[n]-ValeurOrigine)); + fi; + endfor; + elseif AffichageCoord=1: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + if Kelvin: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\kelvin}"),(5mm,unitp*valeur[n])); + elseif Farenheit: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\farenheit}"),(5mm,unitp*valeur[n])); + else: + label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\celsius}"),(5mm,unitp*valeur[n])); + fi; + pointe(unitp*(0,valeur[n])); + draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mpost} + \fi +} + +\def\MPNewDROITEGradueeMulti#1#2{% + % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires + % #2 : liste des noms des points + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + minx:=4000; + unitex:=\useKV[ClesReperage]{Unitex}*cm; + pasx:=\useKV[ClesReperage]{Pasx}; + unitp:=unitex/pasx;%unit\'e de d\'eplacement + ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; + ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; + AffichageGrad:=\AffichageGrad; + AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; + AffichageNom:=\AffichageNom; + numeric valeur[]; + vardef titi(text t)= + n:=0; + for p_=t: + n:=n+1; + valeur[n]=p_; + endfor; + enddef; + titi(#1); + % Détermination des abscisses maximale et minimale + for k=1 upto n: + if valeur[k]>maxx: + maxx:=valeur[k]; + fi; + if valeur[k]<minx: + minx:=valeur[k]; + fi; + endfor; + maxx:=maxx+(pasx div 2); + minx:=minx-(pasx div 2); + if maxx<(pasx+1): + maxx:=2*pasx-1; + fi; + if minx>(-pasx-1): + minx:=-2*pasx-1; + fi; + if minx<\useKV[ClesReperage]{ValeurMin}: + minx:=\useKV[ClesReperage]{ValeurMin}; + fi; + if maxx>\useKV[ClesReperage]{ValeurMax}: + maxx:=\useKV[ClesReperage]{ValeurMax}; + fi; +% % ----- + pair A[],B[],C[]; + for l=0 upto (\useKV[ClesReperage]{Etages}-1): + A[l]=(0,-l*cm); + B[l]=unitp*(maxx,0)+(0,-l*cm); + C[l]=unitp*(minx,0)+(0,-l*cm); + % On trace la demi-droite + drawarrow (C[l]+unitp*(-0.75,0))--(B[l]+unitp*(0.75,0)); + % marquage secondaire + marque_s:=marque_s/3; + if ((maxx-minx) mod 2)=0: + for k=(minx+1) step 2 until (maxx-1): + draw marquedemidroite(C[l],B[l]); + draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); + endfor; + else: + for k=(minx) step 2 until (maxx-1): + draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); + endfor; + fi; + % marquage primaire + marque_s:=marque_s*3; + for k=0 step pasx until (maxx-pasx): + draw marquesegment((k/maxx)[A[l],B[l]],((k+pasx)/maxx)[A[l],B[l]]); + endfor; + for k=0 step -pasx until (minx+pasx): + draw marquesegment((k/maxx)[A[l],B[l]],((k-pasx)/maxx)[A[l],B[l]]); + endfor; + endfor; + % On trace les zoom + for k=0 upto (\useKV[ClesReperage]{Etages}-2): + lp:=floor(1+uniformdeviate(8)); + draw (lp/10)[A[k],B[k]]--A[k+1] dashed evenly scaled 0.5 withcolor 0.5white; + draw ((lp+1)/10)[A[k],B[k]]--B[k+1] dashed evenly scaled 0.5 withcolor 0.5white; + endfor; + % Labelisation + m_c:=m_c*3; + marque_p:="croix"; + labeloffset:=labeloffset*2; + label.top(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); + label.top(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A[0]); + if AffichageGrad>0: + for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): + if (k<0) or (k>1): + label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% + fi; + endfor; + fi; + labeloffset:=labeloffset/2; + vardef tata(text t)=%on place les points + if AffichageNom>0: + n:=0; + for p_=t: + n:=n+1; + label.top(TEX(p_),unitp*(valeur[n],0)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); + pointe(unitp*(valeur[n],0)); + endfor; + fi; + if AffichageCoord=3: + n:=0; + for p_=t: + n:=n+1; + if p_<>"": + drawarrow (unitp*(valeur[n],-1)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm))--(unitp*(valeur[n],-0.3)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); + label.bot(btex \hbox to4em{\dotfill} etex,(unitp*(valeur[n],-1))+(0,(-\useKV[ClesReperage]{Etages}+0.5)*cm)); + %pointe(unitp*(valeur[n],0)); + fi; + endfor; + fi; + enddef; + %%% + tata(#2); + \end{mplibcode} + \fi +} + +% Pour construire les droite/demi-droite gradu\'ee +\def\builddemidroitenew{% + \toklistepointdroite{}% + \toklistenompointdemidroite{}% + \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} + \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} + \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} + \ifboolKV[ClesReperage]{Thermometre}{% + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + % \Listedesvaleursaplacersurlademidroite% + \MPThermo{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + }{% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + \MPTouteDROITEGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + }% +}% + +\NewDocumentCommand\Reperage{o m}{% + \useKVdefault[ClesReperage]% + \setKV[ClesReperage]{#1}% + \ifboolKV[ClesReperage]{Espace}{% + \setKV[ClesReperage]{Unitex=2,Unitey=2.5,Unitez=1.5}% + \ifboolKV[ClesReperage]{Sphere}{\setKV[ClesReperage]{EchelleEspace=75}}{}% + \setKV[ClesReperage]{#1}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointEspace{#2}% + \buildespace% + }{\ifboolKV[ClesReperage]{Plan}{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointRepere{#2}% + \buildreperenew% + }{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointDroite{#2}% + \builddemidroitenew% + }% + }% +}% + +\NewDocumentCommand\ReperageMulti{o m}{% + \useKVdefault[ClesReperage]% + \setKV[ClesReperage]{#1}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListePointDroite{#2}% + \toklistepointdroite{}% + \toklistenompointdemidroite{}% + \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} + \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} + \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} + \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% + \xdef\Listedesvaleursaplacersurlademidroite{}% + \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% + \MPNewDROITEGradueeMulti{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% + \setsepchar{,}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRepresentationGraphique.tex b/macros/latex/contrib/profcollege/latex/PfCRepresentationGraphique.tex new file mode 100644 index 0000000000..2eeb1209c5 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRepresentationGraphique.tex @@ -0,0 +1,442 @@ +%%% +% Diff\'erentes représentations graphiques +%%% +\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGradX=1,PasGradY=1,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Epaisseur=1,Relie=false,RelieSegment=false,Marque=dot,Code=false,Vide=false,NbPointsCourbe=100}% +\defKV[TraceG]{Traces=\setKV[TraceG]{Code}}% + +\newcommand\TraceGraphique[2][]{% + \useKVdefault[TraceG]% + \setKV[TraceG]{#1}% + \ifboolKV[TraceG]{Fonction}{% + \MPTraceFonction[#1]{#2}% + }{% + \setKV[TraceG]{Xmin=0,Ymin=0} + \setKV[TraceG]{#1}% + \readlist*\ListePointsPlaces{#2}% + \newtoks\toklistepoint% + \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}% + \MPPlacePoint[#1]{\the\toklistepoint} + }% +}% + +\newcommand\MPPlacePoint[2][]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + xmin=\useKV[TraceG]{Xmin}; + xmax=\useKV[TraceG]{Xmax}; + ymin=\useKV[TraceG]{Ymin}; + ymax=\useKV[TraceG]{Ymax}; + pasx=\useKV[TraceG]{Xstep}; + pasy=\useKV[TraceG]{Ystep}; + x.u=1cm/\useKV[TraceG]{Xstep}; + y.u=1cm/\useKV[TraceG]{Ystep}; + grillex=\useKV[TraceG]{PasGrilleX}; + grilley=\useKV[TraceG]{PasGrilleY}; + pos=\useKV[TraceG]{LabelC}; + + marque_p:=str \useKV[TraceG]{Marque}; + m_c:=m_c*2; + + color colorpoint,colortrace; + colorpoint=\useKV[TraceG]{CouleurPoint}; + colortrace=\useKV[TraceG]{CouleurTrace}; + boolean Grille; + Grille=\useKV[TraceG]{Grille}; + + boolean Graduations; + Graduations=\useKV[TraceG]{Graduations}; + + boolean Relie; + Relie=\useKV[TraceG]{Relie}; + + boolean RelieSegment; + RelieSegment=\useKV[TraceG]{RelieSegment}; + + boolean Invisible; + Invisible=\useKV[TraceG]{Invisible}; + + pair Origine; + Origine=(0,0); + + if Grille: + drawoptions(withcolor 0.75white); + for k=0 step grillex until (xmax-xmin): + trace (k*x.u,ypart(Origine))--(x.u*k,y.u*(ymax-ymin)); + endfor; + for k=0 step grilley until (ymax-ymin): + trace (xpart(Origine),k*y.u)--(x.u*(xmax-xmin),y.u*k); + endfor; + drawoptions(); + fi; + + if Graduations: + for k=0 step grillex until (xmax-xmin): + trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*x.u,0) shifted Origine) withpen pencircle scaled1.25; + label.bot(TEX("\num{"&decimal(xmin+k)&"}"),(k*x.u,0) shifted Origine); + endfor; + label.ulft(TEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine); + for k=grilley step grilley until (ymax-ymin): + trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*y.u) shifted Origine) withpen pencircle scaled1.25; + label.lft(TEX("\num{"&decimal(ymin+k)&"}"),(0,k*y.u) shifted Origine); + endfor; + fi; + drawoptions(withpen pencircle scaled1.5); + drawarrow Origine--(xpart(Origine),y.u*(ymax-ymin)); + drawarrow Origine--((xmax-xmin)*x.u,ypart(Origine)); + drawoptions(); + + % On relie éventuellement les points + if Relie: + pair N[]; + nbpoint=0; + for p_=#2: + nbpoint:=nbpoint+1; + N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)); + endfor; + draw N[1] for k=2 upto nbpoint: + ..N[k] + endfor withcolor colortrace; + fi; + if RelieSegment: + pair N[]; + nbpoint=0; + for p_=#2: + nbpoint:=nbpoint+1; + N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)); + endfor; + draw N[1] for k=2 upto nbpoint: + --N[k] + endfor withcolor colortrace; + fi; + + % On place les points + if Invisible=false: + drawoptions(withcolor colorpoint); + for p_=#2: + if marque_p="dot": + dotlabel("",(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin))); + elseif marque_p="croix": + pointe((x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin))); + fi; + endfor; + drawoptions(); + fi; + %on labelise les axes + label.urt(btex \useKV[TraceG]{LabelX} etex,(x.u*(xmax-xmin),ypart(Origine))); + label.urt(btex \useKV[TraceG]{LabelY} etex,(xpart(Origine),y.u*(ymax-ymin))); + \end{mplibcode} + \else + \mpxcommands{% + \usepackage{ProfCollege} + \setKV[TraceG]{#1} + } + \begin{mpost}[mpsettings={xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colorpoint,colortrace;colorpoint=\useKV[TraceG]{CouleurPoint};colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};boolean Relie;Relie=\useKV[TraceG]{Relie};boolean RelieSegment;RelieSegment=\useKV[TraceG]{RelieSegment};boolean Invisible;Invisible=\useKV[TraceG]{Invisible};}] + pair Origine; + Origine=(0,0); + + if Grille: + drawoptions(withcolor 0.75white); + for k=0 step grillex until (xmax-xmin): + trace (k*xu,ypart(Origine))--(xu*k,yu*(ymax-ymin)); + endfor; + for k=0 step grilley until (ymax-ymin): + trace (xpart(Origine),k*yu)--(xu*(xmax-xmin),yu*k); + endfor; + drawoptions(); + fi; + + if Graduations: + for k=0 step grillex until (xmax-xmin): + trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*xu,0) shifted Origine) withpen pencircle scaled1.25; + label.bot(LATEX("\num{"&decimal(xmin+k)&"}"),(k*xu,0) shifted Origine); + endfor; + label.ulft(LATEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine); + for k=grilley step grilley until (ymax-ymin): + trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*yu) shifted Origine) withpen pencircle scaled1.25; + label.lft(LATEX("\num{"&decimal(ymin+k)&"}"),(0,k*yu) shifted Origine); + endfor; + fi; + drawoptions(withpen pencircle scaled1.5); + drawarrow Origine--(xpart(Origine),yu*(ymax-ymin)); + drawarrow Origine--((xmax-xmin)*xu,ypart(Origine)); + drawoptions(); + + % On relie éventuellement les points + if Relie: + pair N[]; + nbpoint=0; + for p_=#2: + nbpoint:=nbpoint+1; + N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin)); + endfor; + draw N[1] for k=2 upto nbpoint: + ..N[k] + endfor withcolor colortrace; + fi; + if RelieSegment: + pair N[]; + nbpoint=0; + for p_=#2: + nbpoint:=nbpoint+1; + N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin)); + endfor; + draw N[1] for k=2 upto nbpoint: + --N[k] + endfor withcolor colortrace; + fi; + + % On place les points + if Invisible=false: + drawoptions(withcolor colorpoint); + for p_=#2: + dotlabel("",(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin))); + endfor; + drawoptions(); + fi; + %on labelise les axes + label.urt(btex \unexpanded{\useKV[TraceG]{LabelX}} etex,(xu*(xmax-xmin),ypart(Origine))); + label.urt(btex \unexpanded{\useKV[TraceG]{LabelY}} etex,(xpart(Origine),yu*(ymax-ymin))); + \end{mpost} + \fi +} + +\newcommand\MPTraceFonction[2][]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + borneinf=\useKV[TraceG]{Bornea}; + bornesup=\useKV[TraceG]{Borneb}; + nbpointsCourbe:=\useKV[TraceG]{NbPointsCourbe}; + xmin=\useKV[TraceG]{Xmin}; + xmax=\useKV[TraceG]{Xmax}; + ymin=\useKV[TraceG]{Ymin}; + ymax=\useKV[TraceG]{Ymax}; + pasx=\useKV[TraceG]{Xstep}; + pasy=\useKV[TraceG]{Ystep}; + x.u=1cm/\useKV[TraceG]{Xstep}; + y.u=1cm/\useKV[TraceG]{Ystep}; + grillex=\useKV[TraceG]{PasGrilleX}; + grilley=\useKV[TraceG]{PasGrilleY}; + gradx=\useKV[TraceG]{PasGradX}; + grady=\useKV[TraceG]{PasGradY}; + pos=\useKV[TraceG]{LabelC}; + Epaisseur:=\useKV[TraceG]{Epaisseur}; + + color colortrace; + colortrace=\useKV[TraceG]{CouleurTrace}; + + pair Origine; + Origine=(xmin,ymin)+\useKV[TraceG]{Origine}; + + boolean Grille,Vide; + Grille=\useKV[TraceG]{Grille}; + Vide=\useKV[TraceG]{Vide}; + + boolean Graduations; + Graduations=\useKV[TraceG]{Graduations}; + + vardef sin(expr t) = sind(c*t) enddef; + + vardef cos(expr t) = cosd(c*t) enddef; + + vardef tan(expr t) = sin(t)/cos(t) enddef; + + vardef exp(expr t) = e**t enddef; + + vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; + + vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; + + vardef ln(expr t) = mlog(t)/256 enddef; + + vardef arcsin(expr x)=%Définition mathématique en radian + pi*angle((sqrt(1-x**2),x))/180 + enddef; + + vardef arccos(expr x)=%Définition mathématique en radian + pi*angle((x,sqrt(1-x**2)))/180 + enddef; + + def enplace= + xscaled x.u yscaled y.u shifted (Origine*cm) + enddef; + + vardef placepoint(expr q,r)= + (q,r) enplace + enddef; + + path Cb[]; + + vardef courbe[](expr a,b,nb)(text texte)= + path Courbe; + for i:=0 upto nb : + x@[i]:=(a+i*(b-a)/nb); + x:=x@[i]; + y@[i]:=texte; + endfor ; + Cb@:=(x@.0*x.u,y@.0*y.u) + for i:=1 upto nb : + ..(x@[i]*x.u,y@[i]*y.u) + endfor; + Cb@:=Cb@ shifted (Origine*cm); + Courbe=Cb@; + Courbe + enddef; + + if Grille: + drawoptions(withcolor 0.75white); + for k=xpart(Origine) step grillex until xmax: + trace u*(k,ymin)--u*(k,ymax); + endfor; + for k=xpart(Origine) step -grillex until xmin: + trace u*(k,ymin)--u*(k,ymax); + endfor; + for k=ypart(Origine) step grilley until ymax: + trace u*(xmin,k)--u*(xmax,k); + endfor; + for k=ypart(Origine) step -grilley until ymin: + trace u*(xmin,k)--u*(xmax,k); + endfor; + drawoptions(); + fi; + if Graduations: + for k=gradx step gradx until bornesup:%xmax*gradx/grillex: + dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); + endfor; + for k=-gradx step -gradx until borneinf:%xmin*gradx/grillex: + dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); + endfor; + for k=grady step grady until ymax*grady/grilley: + dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); + endfor; + for k=-grady step -grady until ymin*grady/grilley: + dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); + endfor; + fi; + + drawoptions(withpen pencircle scaled(1)); + drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); + drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); + label.llft(btex 0 etex,u*Origine); + drawoptions(); + if Vide: + else: + draw courbe1(borneinf,bornesup,nbpointsCourbe)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; + % labelisation + numeric t; + t=pos*length Cb1; + pair PT,Tangente; + PT:=point (pos*length Cb1) of Cb1; + Tangente:=unitvector(direction t of Cb1); + label(TEX("\useKV[TraceG]{NomCourbe}") rotated angle(Tangente),PT+2mm*(Tangente rotated 90)); + % fin labelisation + clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax)); + label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine))); + label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax)); + if \useKV[TraceG]{Code}: + \useKV[TraceG]{Traces} + fi; + fi; + \end{mplibcode} + \else + \mpxcommands{% + \usepackage{ProfCollege} + \setKV[TraceG]{#1} + } + \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};nbpointsCourbe:=\useKV[TraceG]{NbPointsCourbe};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};Epaisseur=\useKV[TraceG]{Epaisseur}; color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille,Vide;Grille=\useKV[TraceG]{Grille};Vide=\useKV[TraceG]{Vide};boolean Graduations;Graduations=\useKV[TraceG]{Graduations}; + pair Origine; + Origine=(xmin,ymin)+\useKV[TraceG]{Origine};}] + + vardef sin(expr t) = sind(c*t) enddef; + + vardef cos(expr t) = cosd(c*t) enddef; + + vardef tan(expr t) = sin(t)/cos(t) enddef; + + vardef exp(expr t) = e**t enddef; + + vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; + + vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; + + vardef ln(expr t) = mlog(t)/256 enddef; + + vardef arcsin(expr x)=%Définition mathématique en radian + pi*angle((sqrt(1-x**2),x))/180 + enddef; + + vardef arccos(expr x)=%Définition mathématique en radian + pi*angle((x,sqrt(1-x**2)))/180 + enddef; + + path Cb[]; + + vardef courbe[](expr a,b,nb)(text texte)= + path Courbe; + for i:=0 upto nb : + x@[i]:=(a+i*(b-a)/nb); + x:=x@[i]; + y@[i]:=texte; + endfor ; + Cb@:=(x@.0*xu,y@.0*yu) + for i:=1 upto nb : + ..(x@[i]*xu,y@[i]*yu) + endfor; + Cb@:=Cb@ shifted (Origine*cm); + Courbe=Cb@; + Courbe + enddef; + + if Grille: + drawoptions(withcolor 0.75white); + for k=xpart(Origine) step grillex until xmax: + trace u*(k,ymin)--u*(k,ymax); + endfor; + for k=xpart(Origine) step -grillex until xmin: + trace u*(k,ymin)--u*(k,ymax); + endfor; + for k=ypart(Origine) step grilley until ymax: + trace u*(xmin,k)--u*(xmax,k); + endfor; + for k=ypart(Origine) step -grilley until ymin: + trace u*(xmin,k)--u*(xmax,k); + endfor; + drawoptions(); + fi; + if Graduations: + for k=1 upto xmax/grillex: + dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm))); + endfor; + for k=-1 downto xmin/grillex: + dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm))); + endfor; + for k=1 upto ymax/grilley: + dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm))); + endfor; + for k=-1 downto ymin/grilley: + dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm))); + endfor; + fi; + drawoptions(withpen pencircle scaled1.5); + drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); + drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); + drawoptions(); + if Vide: + else: + draw courbe1(borneinf,bornesup,nbpointsCourbe)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; +% % labelisation + numeric t; + t=pos*length Cb1; + pair PT,Tangente; + PT:=point (pos*length Cb1) of Cb1; + Tangente:=unitvector(direction t of Cb1); + label(btex \noexpand\useKV[TraceG]{NomCourbe} etex rotated angle(Tangente),PT+2mm*(Tangente rotated 90)); +% % fin labelisation + clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax)); + label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine))); + label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax)); + fi; + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRepresenterEntier.tex b/macros/latex/contrib/profcollege/latex/PfCRepresenterEntier.tex new file mode 100644 index 0000000000..714405a534 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRepresenterEntier.tex @@ -0,0 +1,150 @@ +%%% +% Représenter un entier +%%% +\setKVdefault[ClesREntier]{Echelle=1,Unite=false,Compact=false,Impression=false,ListeCouleurs={Tomato,LightSteelBlue,LightGreen,Cornsilk}}% + +\newcommand\RepresenterEntier[2][]{% + \useKVdefault[ClesREntier]% + \setKV[ClesREntier]{#1}% + \ifboolKV[ClesREntier]{Unite}{% + \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)}] + Echelle=\useKV[ClesREntier]{Echelle}; + Initialisation(5,30,15,50*Echelle); + color A,B,C,D,E,F,G,H; + pointilles:="non"; + trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1); + \end{Geometrie} + }{% + % On décompose le nombre + \StrLen{#2}[\LongueurNombreEntier]% + \xdef\FooListeEntier{} + \xintFor* ##1 in{\xintSeq{1}{\LongueurNombreEntier}}\do{% + \StrChar{#2}{##1}[\ChiffreAAjouter] + \xdef\FooListeEntier{\FooListeEntier \ChiffreAAjouter,} + } + \setsepchar{,}\ignoreemptyitems + \readlist*\ListeDesChiffres{\FooListeEntier}% + \xdef\ListeAvantCouleurs{\useKV[ClesREntier]{ListeCouleurs}}% + \readlist*\ListeCouleurEntier{\ListeAvantCouleurs}% + \xintifboolexpr{\LongueurNombreEntier==4}{% + \xdef\NombreMilliers{\ListeDesChiffres[1]}% + \xdef\NombreCentaines{\ListeDesChiffres[2]}% + \xdef\NombreDizaines{\ListeDesChiffres[3]}% + \xdef\NombreUnites{\ListeDesChiffres[4]}% + }{% + \xintifboolexpr{\LongueurNombreEntier==3}{% + \xdef\NombreMilliers{0}% + \xdef\NombreCentaines{\ListeDesChiffres[1]}% + \xdef\NombreDizaines{\ListeDesChiffres[2]}% + \xdef\NombreUnites{\ListeDesChiffres[3]}% + }{% + \xintifboolexpr{\LongueurNombreEntier==2}{% + \xdef\NombreMilliers{0}% + \xdef\NombreCentaines{0}% + \xdef\NombreDizaines{\ListeDesChiffres[1]}% + \xdef\NombreUnites{\ListeDesChiffres[2]}% + }{% + \xdef\NombreMilliers{0}% + \xdef\NombreCentaines{0}% + \xdef\NombreDizaines{0}% + \xdef\NombreUnites{\ListeDesChiffres[1]}% + }% + }% + }% + \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)},CoinHD={u*(20,20)}] + Echelle=\useKV[ClesREntier]{Echelle}; + NM=\NombreMilliers; + NC=\NombreCentaines; + ND=\NombreDizaines; + NU=\NombreUnites; + color ColorEntier[]; + ColorEntier1=\ListeCouleurEntier[1]; + ColorEntier2=\ListeCouleurEntier[2]; + ColorEntier3=\ListeCouleurEntier[3]; + ColorEntier4=\ListeCouleurEntier[4]; + boolean Compact,Print; + Compact=\useKV[ClesREntier]{Compact}; + Print=\useKV[ClesREntier]{Impression}; + Initialisation(5,30,15,50*Echelle); + color A,B,C,D,E,F,G,H; + picture TypePave[]; + TypePave0=image( + trace Pave(A,B,C,D,E,F,G,H)(1,1,1); + currentpicture:=nullpicture; + remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier1 fi; + for k=0 upto 10: + trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]); + endfor; + for k=0 upto 10: + trace chemin((k/10)[B,C],(k/10)[G,H],(k/10)[F,E]); + endfor; + for k=0 upto 10: + trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); + endfor; + ); + color A,B,C,D,E,F,G,H; + TypePave1=image( + trace Pave(A,B,C,D,E,F,G,H)(0.1,1,1); + currentpicture:=nullpicture; + remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier2 fi; + trace chemin(C,H,E); + for k=0 upto 10: + trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]); + endfor; + for k=0 upto 10: + trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); + endfor; + ); + color A,B,C,D,E,F,G,H; + TypePave2=image( + trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,1); + currentpicture:=nullpicture; + remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier3 fi; + trace chemin(C,H,E); + trace chemin(A,F,E); + trace chemin(B,G,F); + for k=0 upto 10: + trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); + endfor; + ); + color A,B,C,D,E,F,G,H; + TypePave3=image( + trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1); + currentpicture:=nullpicture; + remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier4 fi; + trace chemin(C,H,E); + trace chemin(A,F,E); + trace chemin(A,B,C); + trace chemin(F,G,H); + trace chemin(B,G); + ); + if Compact: + for k=0 upto (\NombreMilliers-1): + trace TypePave0 shifted ((Projette((k,0,0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreCentaines-1): + trace TypePave1 shifted ((Projette((0.1*k,1.5,0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreDizaines-1): + trace TypePave2 shifted ((Projette((0.1*k,3,0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreUnites-1): + trace TypePave3 shifted ((Projette((0,3.6,0.1*k))-Projette((0,0,0)))); + endfor; + else: + for k=0 upto (\NombreMilliers-1): + trace TypePave0 shifted ((Projette((0,1.1*(k-1),0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreCentaines-1): + trace TypePave1 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(k-1),0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreDizaines-1): + trace TypePave2 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(k-1),0))-Projette((0,0,0)))); + endfor; + for k=0 upto (\NombreUnites-1): + trace TypePave3 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(\NombreDizaines-1),0.2*(k)))-Projette((0,0,0)))); + endfor; + fi; + \end{Geometrie} + } +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRepresenterFraction.tex b/macros/latex/contrib/profcollege/latex/PfCRepresenterFraction.tex new file mode 100644 index 0000000000..d7878556d8 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRepresenterFraction.tex @@ -0,0 +1,971 @@ +%%% +% Fractions +%%% +\setKVdefault[ClesFraction]{Rayon=2cm,Disque,Regulier=false,Segment=false,Rectangle=false,Longueur=5cm,Largeur=2cm,Cotes=5,Triangle=false,Parts=3,Couleur=green,Reponse=false,Multiple=1,Hachures=false,Epaisseur=1} + +\def\MPFractionTriangle#1#2#3#4#5{% + % #1 longueur du c\^ot\'e + % #2 partage sur le c\^ot\'e + % #3 num + % #4 d\'eno (attention : = #2^2) + % #5 couleur + \ifluatex + \mplibforcehmode + \begin{mplibcode} + nbtriangle=0; + + vardef Ligne(expr longueur)= + for k=0 upto 2*(longueur-1): + nbtriangle:=nbtriangle+1; + if (k mod 2)=0: + M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + else: + M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + fi; + endfor; + enddef; + + pair A,B,C; + A=u*(0.5,0.5); + B-A=(#1,0); + C=rotation(B,A,60); + + nbparts:=#2; + + path M[]; + + path Tria,Trir; + Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); + Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); + + for k=nbparts downto 1: + Ligne(k); + endfor; + + m:=#3 div #4; + + drawoptions(shifted(m*(#1+1cm,0))); + for l=1 upto (#3 mod #4): + fill M[l] withcolor #5; + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + endfor; + + for l=0 upto (m-1): + drawoptions(shifted(l*(#1+1cm,0))); + remplis polygone(A,B,C) withcolor #5; + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + endfor; + \end{mplibcode} + \else + \begin{mpost} + nbtriangle=0; + + vardef Ligne(expr longueur)= + for k=0 upto 2*(longueur-1): + nbtriangle:=nbtriangle+1; + if (k mod 2)=0: + M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + else: + M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + fi; + endfor; + enddef; + + pair A,B,C; + A=u*(0.5,0.5); + B-A=(#1,0); + C=rotation(B,A,60); + + nbparts:=#2; + + path M[]; + + path Tria,Trir; + Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); + Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); + + for k=nbparts downto 1: + Ligne(k); + endfor; + + m:=#3 div #4; + + drawoptions(shifted(m*(#1+1cm,0))); + for l=1 upto (#3 mod #4): + fill M[l] withcolor #5; + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + endfor; + + for l=0 upto (m-1): + drawoptions(shifted(l*(#1+1cm,0))); + remplis polygone(A,B,C) withcolor #5; + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + endfor; + \end{mpost} + \fi + } + + \def\MPFractionTriangleH#1#2#3#4#5#6{ + % #1 longueur du c\^ot\'e + % #2 partage sur le c\^ot\'e + % #3 num + % #4 d\'eno (attention : = #2^2) + % #5 couleur + % #6 \'epaisseur + \ifluatex + \mplibforcehmode + \begin{mplibcode} + nbtriangle=0; + + vardef Ligne(expr longueur)= + for k=0 upto 2*(longueur-1): + nbtriangle:=nbtriangle+1; + if (k mod 2)=0: + M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + else: + M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + fi; + endfor; + enddef; + + pair A,B,C; + A=u*(0.5,0.5); + B-A=(#1,0); + C=rotation(B,A,60); + + nbparts:=#2; + + path M[]; + + path Tria,Trir; + Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); + Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); + + for k=nbparts downto 1: + Ligne(k); + endfor; + + m:=#3 div #4; + + for l=1 upto (#3 mod #4): + drawoptions(withpen pencircle scaled #6); + trace hachurage(M[l] shifted(m*(#1+1cm,0)),90,0.2,0) withcolor #5;%M[l] withcolor #5; + for k=1 upto nbparts: + drawoptions(withpen pencircle scaled #6); + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(#1+1cm,0)); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(#1+1cm,0)); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(#1+1cm,0)); + endfor; + endfor; + + for l=0 upto (m-1): + drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6); + trace hachurage(polygone(A,B,C),90,0.2,0) withcolor #5;%polygone(A,B,C) withcolor #5; + drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6); + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + endfor; + \end{mplibcode} + \else + \begin{mpost} + nbtriangle=0; + + vardef Ligne(expr longueur)= + for k=0 upto 2*(longueur-1): + nbtriangle:=nbtriangle+1; + if (k mod 2)=0: + M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + else: + M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); + fi; + endfor; + enddef; + + pair A,B,C; + A=u*(0.5,0.5); + B-A=(#1,0); + C=rotation(B,A,60); + + nbparts:=#2; + + path M[]; + + path Tria,Trir; + Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); + Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); + + for k=nbparts downto 1: + Ligne(k); + endfor; + + diversite=floor(uniformdeviate(#2**2-#3-1)); + + for k=(1+diversite) upto (#3+diversite): + drawoptions(withpen pencircle scaled #6); + trace hachurage(M[k],90,0.2,0) withcolor #5; + endfor; + drawoptions(withpen pencircle scaled #6); + + for k=1 upto nbparts: + trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); + trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); + trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); + endfor; + \end{mpost} + \fi + } + +\def\MPFractionRegulier#1#2#3#4#5{% + % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair O,A[],B[]; + O=u*(0,0); + path cc,cd; + cc=cercles(O,#1); + for k=0 upto #2: + A[k]=pointarc(cc,k*(360/#2)); + endfor; + cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); + for k=0 upto #4-1: + B[k]=point(k*(#2/#4)) of cd; + endfor; + picture fondcolore; + fondcolore=image( + remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5; + clip currentpicture to cd; + for k=0 upto #4-1: + draw segment(O,B[k]) cutafter cd; + endfor; + trace cd; + ); + currentpicture:=nullpicture; + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5; + trace cd shifted(l*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); + endfor; + fi; + endfor; + fi; + draw fondcolore shifted(m*(#1*2+0.5cm,0)); + draw cd shifted(m*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost} + pair O,A[],B[]; + O=u*(0,0); + path cc,cd; + cc=cercles(O,#1); + for k=0 upto #2: + A[k]=pointarc(cc,k*(360/#2)); + endfor; + cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); + for k=0 upto #4-1: + B[k]=point(k*(#2/#4)) of cd; + endfor; + picture fondcolore; + fondcolore=image( + remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5; + clip currentpicture to cd; + for k=0 upto #4-1: + draw segment(O,B[k]) cutafter cd; + endfor; + trace cd; + ); + currentpicture:=nullpicture; + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5; + trace cd shifted(l*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); + endfor; + fi; + endfor; + fi; + draw fondcolore shifted(m*(#1*2+0.5cm,0)); + draw cd shifted(m*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); + endfor; + fi; + \end{mpost} + \fi +} + +\def\MPFractionRegulierH#1#2#3#4#5#6{% + % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur, #6 épaisseur + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair O,A[],B[]; + O=u*(0,0); + path cc,cd; + cc=cercles(O,#1); + for k=0 upto #2: + A[k]=pointarc(cc,k*(360/#2)); + endfor; + cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); + for k=0 upto #4-1: + B[k]=point(k*(#2/#4)) of cd; + endfor; + picture fondcolore; + fondcolore=image(% + drawoptions(withpen pencircle scaled #6); + trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5; + clip currentpicture to cd; + drawoptions(withpen pencircle scaled #6); + for k=0 upto #4-1: + draw segment(O,B[k]) cutafter cd; + endfor; + trace cd; + ); + currentpicture:=nullpicture; + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled #6); + trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5; + drawoptions(withpen pencircle scaled #6); + trace cd shifted(l*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + drawoptions(withpen pencircle scaled #6); + draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); + endfor; + fi; + endfor; + fi; + draw fondcolore shifted(m*(#1*2+0.5cm,0)); + drawoptions(withpen pencircle scaled #6); + draw cd shifted(m*(#1*2+0.5cm,0)); + if #4>1: + drawoptions(withpen pencircle scaled #6); + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); + endfor; + fi; + \end{mplibcode} + \else +\begin{mpost} + pair O,A[],B[]; + O=u*(0,0); + path cc,cd; + cc=cercles(O,#1); + for k=0 upto #2: + A[k]=pointarc(cc,k*(360/#2)); + endfor; + cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); + for k=0 upto #4-1: + B[k]=point(k*(#2/#4)) of cd; + endfor; + picture fondcolore; + fondcolore=image(% + drawoptions(withpen pencircle scaled #6); + trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5; + clip currentpicture to cd; + drawoptions(withpen pencircle scaled #6); + for k=0 upto #4-1: + draw segment(O,B[k]) cutafter cd; + endfor; + trace cd; + ); + currentpicture:=nullpicture; + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled #6); + trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5; + drawoptions(withpen pencircle scaled #6); + trace cd shifted(l*(#1*2+0.5cm,0)); + if #4>1: + for k=0 upto #4-1: + drawoptions(withpen pencircle scaled #6); + draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); + endfor; + fi; + endfor; + fi; + draw fondcolore shifted(m*(#1*2+0.5cm,0)); + drawoptions(withpen pencircle scaled #6); + draw cd shifted(m*(#1*2+0.5cm,0)); + if #4>1: + drawoptions(withpen pencircle scaled #6); + for k=0 upto #4-1: + draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); + endfor; + fi; + \end{mpost} + \fi +} + +\def\MPFractionRectangle#1#2#3#4#5#6{% + % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,B,C,D,M[],N[],R[],S[]; + A=(1,1); + B-A=(#1,0); + C-B=(0,#2); + D-C=A-B; + numeric parts; + parts=(#4 div #6); + for k=0 upto parts: + M[k]=(k/parts)[A,B]; + N[k]=(k/parts)[D,C]; + endfor; + if #6>1: + for k=0 upto #6: + R[k]=(k/#6)[A,D]; + S[k]=(k/#6)[B,C]; + endfor; + fi; + picture FondRectangle; + FondRectangle=image(% + draw polygone(A,B,C,D); + for k=1 upto (parts-1): + draw segment(M[k],N[k]); + endfor; + if #6>1: + for k=1 upto (#6-1): + draw segment(R[k],S[k]); + endfor; + fi; + ); + picture FondRectangleColorie; + FondRectangleColorie=image(% + if #6=1: + remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5; + else: + DDiv=(#3 mod #4) div parts; + MMod=(#3 mod #4) mod parts; + remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5; + remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5; + fi; + ); + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto m-1: + remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5; + trace FondRectangle shifted(l*(#1+1cm,0)); + endfor; + fi; + if (#3 mod #4)<>0: + trace FondRectangleColorie shifted(m*(#1+1cm,0)); + else: + remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5; + fi; + trace FondRectangle shifted(m*(#1+1cm,0)); + \end{mplibcode} + \else +\begin{mpost} + pair A,B,C,D,M[],N[],R[],S[]; + A=(1,1); + B-A=(#1,0); + C-B=(0,#2); + D-C=A-B; + numeric parts; + parts=(#4 div #6); + for k=0 upto parts: + M[k]=(k/parts)[A,B]; + N[k]=(k/parts)[D,C]; + endfor; + if #6>1: + for k=0 upto #6: + R[k]=(k/#6)[A,D]; + S[k]=(k/#6)[B,C]; + endfor; + fi; + picture FondRectangle; + FondRectangle=image(% + draw polygone(A,B,C,D); + for k=1 upto (parts-1): + draw segment(M[k],N[k]); + endfor; + if #6>1: + for k=1 upto (#6-1): + draw segment(R[k],S[k]); + endfor; + fi; + ); + picture FondRectangleColorie; + FondRectangleColorie=image(% + if #6=1: + remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5; + else: + DDiv=(#3 mod #4) div parts; + MMod=(#3 mod #4) mod parts; + remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5; + remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5; + fi; + ); + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto m-1: + remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5; + trace FondRectangle shifted(l*(#1+1cm,0)); + endfor; + fi; + if (#3 mod #4)<>0: + trace FondRectangleColorie shifted(m*(#1+1cm,0)); + else: + remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5; + fi; + trace FondRectangle shifted(m*(#1+1cm,0)); + \end{mpost} + \fi +} + +\def\MPFractionRectangleH#1#2#3#4#5#6#7{% + % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,B,C,D,M[],N[],R[],S[]; + A=(1,1); + B-A=(#1,0); + C-B=(0,#2); + D-C=A-B; + numeric parts; + parts=(#4 div #6); + for k=0 upto parts: + M[k]=(k/parts)[A,B]; + N[k]=(k/parts)[D,C]; + endfor; + if #6>1: + for k=0 upto #6: + R[k]=(k/#6)[A,D]; + S[k]=(k/#6)[B,C]; + endfor; + fi; + picture FondRectangle; + FondRectangle=image(% + draw polygone(A,B,C,D); + for k=1 upto (parts-1): + draw segment(M[k],N[k]); + endfor; + if #6>1: + for k=1 upto (#6-1): + draw segment(R[k],S[k]); + endfor; + fi; + ); + picture FondRectangleColorie; + FondRectangleColorie=image(% + if #6=1: + drawoptions(withpen pencircle scaled#7); + trace hachurage(polygone(A,M[#3 mod #4],N[#3 mod #4],D),45,0.25,0) withcolor #5; + else: + DDiv=(#3 mod #4) div parts; + MMod=(#3 mod #4) mod parts; + drawoptions(withpen pencircle scaled#7); + trace hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5; + drawoptions(withpen pencircle scaled#7); + trace hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5; + fi; + ); + m=#3 div #4; + if (#3 mod #4)=0:m:=m-1; fi; + if m>0: + for l=0 upto m-1: + drawoptions(withpen pencircle scaled#7); + trace hachurage(polygone(A,B,C,D) shifted(l*(#1+1cm,0)),45,0.25,0) withcolor #5; + drawoptions(withpen pencircle scaled#7); + trace FondRectangle shifted(l*(#1+1cm,0)); + endfor; + fi; + if (#3 mod #4)<>0: + drawoptions(withpen pencircle scaled#7); + trace FondRectangleColorie shifted(m*(#1+1cm,0)); + else: + drawoptions(withpen pencircle scaled#7); + trace hachurage(polygone(A,B,C,D) shifted(m*(#1+1cm,0)),45,0.25,0) withcolor #5; + fi; + drawoptions(withpen pencircle scaled#7); + trace FondRectangle shifted(m*(#1+1cm,0)); + \end{mplibcode} + \else +\begin{mpost} + pair A,B,C,D,M[],N[],R[],S[]; + A=(1,1); + B-A=(#1,0); + C-B=(0,#2); + D-C=A-B; + numeric parts; + parts=(#4 div #6); + for k=0 upto parts: + M[k]=(k/parts)[A,B]; + N[k]=(k/parts)[D,C]; + endfor; + if #6>1: + for k=0 upto #6: + R[k]=(k/#6)[A,D]; + S[k]=(k/#6)[B,C]; + endfor; + fi; + if #6=1: + drawoptions(withpen pencircle scaled#7); + draw hachurage(polygone(A,M[#3],N[#3],D),45,0.25,0) withcolor #5; + else: + DDiv=#3 div parts; + MMod=#3 mod parts; + drawoptions(withpen pencircle scaled#7); + draw hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5; + drawoptions(withpen pencircle scaled#7); + draw hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5; + fi; + drawoptions(withpen pencircle scaled#7); + draw polygone(A,B,C,D); + for k=1 upto (parts-1): + draw segment(M[k],N[k]); + endfor; + if #6>1: + for k=1 upto (#6-1): + draw segment(R[k],S[k]); + endfor; + drawoptions(); + fi; + \end{mpost} + \fi +} + +\def\MPFractionDisque#1#2#3#4{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,B[]; + A=(0,0); + path cc; + cc=cercles(A,#1); + for k=0 upto #3: + B[k]=pointarc(cc,(360/#3)*k); + endfor; + m=(#2 div #3); + if (#2 mod #3)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + fill cc shifted(l*(2*#1+1cm,0)) withcolor #4; + endfor; + fi; + fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4; + for l=0 upto m: + draw cc shifted(l*(2*#1+1cm,0)); + for k=0 upto (#3-1): + draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); + endfor; + endfor; + \end{mplibcode} + \else + \begin{mpost} + pair A,B[]; + A=(0,0); + path cc; + cc=cercles(A,#1); + for k=0 upto #3: + B[k]=pointarc(cc,(360/#3)*k); + endfor; + m=#2 div #3; + if (#2 mod #3)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + fill cc shifted(l*(2*#1+1cm,0)) withcolor #4; + endfor; + fi; + fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4; + for l=0 upto m: + draw cc shifted(l*(2*#1+1cm,0)); + for k=0 upto (#3-1): + draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); + endfor; + endfor; + \end{mpost} + \fi +} + +\def\MPFractionDisqueH#1#2#3#4#5{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,B[]; + A=(0,0); + path cc; + cc=cercles(A,#1); + for k=0 upto #3: + B[k]=pointarc(cc,(360/#3)*k); + endfor; + m=#2 div #3; + if (#2 mod #3)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled#5); + draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; + endfor; + fi; + drawoptions(withpen pencircle scaled#5); + draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + for l=0 upto m: + draw cc shifted(l*(2*#1+1cm,0)); + for k=0 upto (#3-1): + draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); + endfor; + endfor; + \end{mplibcode} + \else + \begin{mpost} + pair A,B[]; + A=(0,0); + path cc; + cc=cercles(A,#1); + for k=0 upto #3: + B[k]=pointarc(cc,(360/#3)*k); + endfor; + m=#2 div #3; + if (#2 mod #3)=0:m:=m-1; fi; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled#5); + draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; + endfor; + fi; + drawoptions(withpen pencircle scaled#5); + draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + for l=0 upto m: + draw cc shifted(l*(2*#1+1cm,0)); + for k=0 upto (#3-1): + draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); + endfor; + endfor; + \end{mpost} + \fi +} + +\def\MPFractionSegment#1#2#3#4{ + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,C,B[]; + A=(0,0); + C-A=(#1,0); + for k=0 upto #3: + B[k]=(k/#3)[A,C]; + endfor; + m=#2 div #3; + if m>0: + for l=0 upto (m-1): + draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; + endfor; + fi; + if (#2 mod #3)<>0: + draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; + draw segment(A,C) shifted(m*(#1+1cm,0)); + fi; + marque_p:="tiretv"; + for l=0 upto m-1: + for k=0 upto #3: + pointe(B[k] shifted(l*(#1+1cm,0))); + endfor; + endfor; + if (#2 mod #3)<>0: + for k=0 upto #3: + pointe(B[k] shifted(m*(#1+1cm,0))); + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost} + pair A,C,B[]; + A=(0,0); + C-A=(#1,0); + for k=0 upto #3: + B[k]=(k/#3)[A,C]; + endfor; + m=#2 div #3; + if m>0: + for l=0 upto (m-1): + draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; + endfor; + fi; + if (#2 mod #3)<>0: + draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; + draw segment(A,C) shifted(m*(#1+1cm,0)); + fi; + marque_p:="tiretv"; + for l=0 upto m-1: + for k=0 upto #3: + pointe(B[k] shifted(l*(#1+1cm,0))); + endfor; + endfor; + if (#2 mod #3)<>0: + for k=0 upto #3: + pointe(B[k] shifted(m*(#1+1cm,0))); + endfor; + fi; + \end{mpost} + \fi +} + +\def\MPFractionSegmentH#1#2#3#4#5{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + pair A,C,B[]; + A=(0,0); + C-A=(#1,0); + for k=0 upto #3: + B[k]=(k/#3)[A,C]; + endfor; + m=#2 div #3; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled#5); + draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + draw segment(A,C) shifted(l*(#1+1cm,0)); + endfor; + fi; + if (#2 mod #3)<>0: + drawoptions(withpen pencircle scaled#5); + draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + draw segment(A,C) shifted(m*(#1+1cm,0)); + fi; + marque_p:="tiretv"; + for l=0 upto m-1: + for k=0 upto #3: + pointe(B[k] shifted(l*(#1+1cm,0))); + endfor; + endfor; + if (#2 mod #3)<>0: + for k=0 upto #3: + pointe(B[k] shifted(m*(#1+1cm,0))); + endfor; + fi; + \end{mplibcode} + \else + \begin{mpost} + pair A,C,B[]; + A=(0,0); + C-A=(#1,0); + for k=0 upto #3: + B[k]=(k/#3)[A,C]; + endfor; + m=#2 div #3; + if m>0: + for l=0 upto (m-1): + drawoptions(withpen pencircle scaled#5); + draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + draw segment(A,C) shifted(l*(#1+1cm,0)); + endfor; + fi; + if (#2 mod #3)<>0: + drawoptions(withpen pencircle scaled#5); + draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4; + drawoptions(withpen pencircle scaled#5); + draw segment(A,C) shifted(m*(#1+1cm,0)); + fi; + marque_p:="tiretv"; + for l=0 upto m-1: + for k=0 upto #3: + pointe(B[k] shifted(l*(#1+1cm,0))); + endfor; + endfor; + if (#2 mod #3)<>0: + for k=0 upto #3: + pointe(B[k] shifted(m*(#1+1cm,0))); + endfor; + fi; + \end{mpost} + \fi +} + +\newcommand\Fraction[2][]{% + \useKVdefault[ClesFraction]% + \setKV[ClesFraction]{#1}% + \setsepchar[*]{/}% + \readlist*\ListeFraction{#2}% + \ifboolKV[ClesFraction]{Triangle}{% + \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% + \ifboolKV[ClesFraction]{Hachures}{% + \MPFractionTriangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% + }{% + \MPFractionTriangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% + }% + }{% + \ifboolKV[ClesFraction]{Regulier}{% + \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% + \ifboolKV[ClesFraction]{Hachures}{% + \MPFractionRegulierH{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% + }{% + \MPFractionRegulier{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% + }% + }{% + \ifboolKV[ClesFraction]{Segment}{% + \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% + \ifboolKV[ClesFraction]{Hachures}{% + \MPFractionSegmentH{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% + }{% + \MPFractionSegment{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% + }% + }{% + \ifboolKV[ClesFraction]{Rectangle}{%rectangle + \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% + \ifboolKV[ClesFraction]{Hachures}{% + \MPFractionRectangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}{\useKV[ClesFraction]{Epaisseur}}% + }{% + \MPFractionRectangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}% + }% + }{%disque + \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% + \ifboolKV[ClesFraction]{Hachures}{% + \MPFractionDisqueH{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% + }{% + \MPFractionDisque{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% + }% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRepresenterTableur.tex b/macros/latex/contrib/profcollege/latex/PfCRepresenterTableur.tex new file mode 100644 index 0000000000..8f15672708 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRepresenterTableur.tex @@ -0,0 +1,104 @@ +%%% +% Tableur +%%% +\setKVdefault[Tableur]{Colonnes=4,Largeur=30pt,LargeurUn=30pt,Bandeau=true,Formule={},Cellule=A1,Ligne=0,Colonne=0,PasL=1,PasC=1,Selection=false}% +%Idee de P. Nuns +\defKV[Tableur]{Couleur=\setKV[Tableur]{Selection}}% +% + +%Bas\'e sur un code de Christian T\'ell\'ech\'ea. +\newcount\cntlin% +\newcount\cntcol% + +\makeatletter% +\newtoks\t@b% +\long\def\ifremain@lines#1\\#2\@nil{% + \csname @\ifx\@empty#2\@empty second\else first\fi oftwo\endcsname}% +\long\def\subst@eol#1\\#2\@nil{\addtot@b{#1\\}% + \ifremain@lines#2\\\@nil{\addtot@b&\subst@eol#2\@nil}{\addtot@b{#2\CodeAfter\xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{% + \tikz\node at (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}}) {\tiny$\blacksquare$};% + }% + \end{NiceTabular}}}}% +\long\def\collectcp@body#1\end{\subst@eol#1\@nil\end}% + +\newcommand\addtot@b[1]{\t@b\expandafter{\the\t@b#1}}% +\newcommand\edftot@b[1]{\edef\temp@{#1}\expandafter\addtot@b\expandafter{\temp@}}% + +\newlength\PfCLongInter% +\newlength\PfCTableurLargeurUn% +\newlength\PfCTableurLargeur% + +\RequirePackage{printlen} + +\newenvironment{Tableur}[1][]{% + \useKVdefault[Tableur]% + \setKV[Tableur]{#1}% + \setlength{\PfCTableurLargeurUn}{\fpeval{\useKV[Tableur]{LargeurUn}}pt}% + \setlength{\PfCTableurLargeur}{\fpeval{\useKV[Tableur]{Largeur}}pt}% + \ttfamily% + \newcolumntype{Y}{>{\centering\arraybackslash}m{\PfCTableurLargeurUn}}% + \newcolumntype{X}{>{\centering\arraybackslash}m{\PfCTableurLargeur}}% + \setlength{\PfCLongInter}{-40pt+\fpeval{\useKV[Tableur]{LargeurUn}}pt+\fpeval{(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}}pt+\fpeval{2*\useKV[Tableur]{Colonnes}-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+2}\arrayrulewidth}% + \ifboolKV[Tableur]{Bandeau}{% + \begin{NiceTabular}{p{\PfCTableurLargeur}p{10pt}p{50pt}p{\PfCLongInter}} + \Block[draw,l]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\ + \end{NiceTabular}% + \nopagebreak% + \\% + }{}% + \cntlin\z@% + \t@b{% + \begin{NiceTabular}{% + >{% + \global\cntcol\z@\global\advance\cntlin\@ne% + \centering\arraybackslash% + \ifnum\cntlin>\@ne% + \ifboolKV[Tableur]{Selection}{% + \xintifboolexpr{\cntlin>\useKV[Tableur]{Ligne} && \cntlin<\fpeval{\useKV[Tableur]{Ligne}+\useKV[Tableur]{PasL}+1}}{\textcolor{white}{\number\numexpr\cntlin-1\relax}}{\number\numexpr\cntlin-1\relax}% + }{\number\numexpr\cntlin-1\relax}\fi}% + wc{20pt}Y*{\fpeval{\useKV[Tableur]{Colonnes}-1}}{X}}[hvlines]% + \CodeBefore + % on colorie en gris toute la première ligne + \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (row-2-|last);% + % on colorie en gris toute la première colonne + \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (last-|col-2);% + % + \xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{% + \ifboolKV[Tableur]{Selection}{% + \xdef\PfCTabCouleur{\useKV[Tableur]{Couleur}}% + % on colorie les cellules sans les tracer + \tikz\draw[fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% + % on trace la première cellule qui a servi à sélectionner + \tikz\draw[line width=1.25pt,fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+1});% + % on colorie la zone nécessaire sur la première ligne + \tikz\draw[fill=\PfCTabCouleur](row-1-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-2-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% + % on colorie la zone nécessaire sur la première colonne + \tikz\draw[fill=\PfCTabCouleur](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-1) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-2);% + }{% + \tikz\draw[line width=1.25pt](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% + }% + }% + \Body + % + }% + \loop% + \ifnum\cntcol<\useKV[Tableur]{Colonnes}% + \advance\cntcol\@ne% + \addtot@b{&}% + % modif by Pascal Nuns + \ifboolKV[Tableur]{Selection}{% + \ifnum\cntcol>\fpeval{\useKV[Tableur]{Colonne}-1}% + \ifnum\cntcol<\fpeval{\useKV[Tableur]{Colonne}+\useKV[Tableur]{PasC}}% + \edftot@b{{\noexpand\textcolor{white}{\noexpand\bfseries\@Alph{\the\cntcol}}}}% + \else% + \edftot@b{\@Alph{\the\cntcol}}% + \fi% + \else% + \edftot@b{\@Alph{\the\cntcol}}% + \fi% + }{\edftot@b{\@Alph{\the\cntcol}}}% + % fin de modif + \repeat% + \addtot@b{\\&}% + \collectcp@body}{\the\t@b}% +\makeatother
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCReseauxSociaux.tex b/macros/latex/contrib/profcollege/latex/PfCReseauxSociaux.tex new file mode 100644 index 0000000000..175cb26f7a --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCReseauxSociaux.tex @@ -0,0 +1,159 @@ +%%% +% Twitter +%%% +\setKVdefault[Twitter]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Url=ViveLaTeX,EchelleLogo=0.035,Logo=DrStrange,Publie=false} + +\NewEnviron{Twitter}[1][]{% + \useKVdefault[Twitter]% + \setKV[Twitter]{#1}% + \xdef\EchelleLogo{\useKV[Twitter]{EchelleLogo}}% + \begin{tcolorbox}[% + enhanced,% + overlay unbroken and first={% + \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\textbf{\useKV[Twitter]{Auteur}}~{\color{gray}@\ttfamily \useKV[Twitter]{Url} - \useKV[Twitter]{Date}}}; + \node[anchor=center,xshift=1em+2mm,yshift=-2em] at (frame.north west) {\LogoTW{\useKV[Twitter]{Logo}}{\EchelleLogo}}; + \node[xshift=-1em,yshift=-2em] at (frame.north east) {\color{gray}...}; + \coordinate[yshift=1em] (A) at (frame.south west); + \coordinate[yshift=1em] (B) at (frame.south east); + \node[] (C1) at ($(A)!0.1!(B)$) {\faComment[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; + \node[] (C2) at ($(A)!0.325!(B)$) {\faRetweet\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; + \node[] (C3) at ($(A)!0.55!(B)$) {\faHeart[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; + \node[] (C4) at ($(A)!0.775!(B)$) {\faShareSquare}; + }, + colback=white, + colframe=gray!15, + top=2em, + left=3em, + bottom=2em] + \vspace*{0.5em}\par + \BODY% + \end{tcolorbox} +} + +%%% +% Facebook +%%% +\setKVdefault[Facebook]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Heure=3:14,EchelleLogo=0.035,Logo=DrStrange,Publie=false} + +\NewEnviron{Facebook}[1][]{% + \useKVdefault[Facebook]% + \setKV[Facebook]{#1}% + \xdef\EchelleLogo{\useKV[Facebook]{EchelleLogo}}% + \begin{tcolorbox}[% + enhanced,% + overlay unbroken and first={% + \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Facebook]{Auteur}}}; + \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray}\useKV[Facebook]{Date}, \useKV[Facebook]{Heure}}; + \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Facebook]{Logo}}{\EchelleLogo}}; + \node[xshift=-1em,yshift=-1.5em] at (frame.north east) {\bfseries\color{gray}...}; + \coordinate[yshift=1.15em] (A) at (frame.south west); + \coordinate[yshift=1.15em] (B) at (frame.south east); + \coordinate[xshift=0.5em,yshift=1.8em] (A1) at (frame.south west); + \coordinate[xshift=-0.5em,yshift=1.8em] (B1) at (frame.south east); + \coordinate[xshift=0.5em,yshift=0.5em] (A2) at (frame.south west); + \coordinate[xshift=-0.5em,yshift=0.5em] (B2) at (frame.south east); + \ifboolKV[Facebook]{Publie}{% + \coordinate[xshift=1em,yshift=1em] (A3) at (A1); + \draw[blue,fill=blue] (A3) circle (1.5mm); + \node[] at (A3) {\tiny\color{white}\faThumbsUp}; + \node[anchor=west] at (A3) {~\scriptsize\fpeval{randint(1,150)}}; + \node[anchor=east,xshift=-1em,yshift=1em] at (B1) {\scriptsize\fpeval{randint(2,20)} commentaires~\fpeval{randint(2,10)} partages}; + }{} + \draw[gray] (A1)--(B1); + \draw[gray] (A2)--(B2); + \node[] (C1) at ($(A)!0.15!(B)$) {\footnotesize\faThumbsUp{}~\bfseries J'aime}; + \node[] (C2) at ($(A)!0.5!(B)$) {\footnotesize\faComment*[regular]~\bfseries Commenter}; \node[] (C3) at ($(A)!0.85!(B)$) {\footnotesize\faShareSquare~\bfseries Partager}; + }, + colback=white, + colframe=gray!15, + top=2em, + left=3em, + bottom=4em] + %\vspace*{0.5em}\par + \BODY% + \end{tcolorbox} +} + +%%% +% Instagram +%%% +\setKVdefault[Instagram]{Largeur=0.95\linewidth,Auteur=Christophe,Expediteur=Pierre,Date=\today,Temps=34,Publie=false,Logo=DrStrange,LogoEx=tiger,EchelleLogo=0.035,Texte={}} + +\NewEnviron{Instagram}[1][]{% + \useKVdefault[Instagram]% + \setKV[Instagram]{#1}% + \xdef\EchelleLogo{\useKV[Instagram]{EchelleLogo}}% + \begin{tcolorbox}[% + enhanced,% + underlay unbroken and first={% + \node[anchor=west,xshift=3em,yshift=-1.5em] at (frame.north west) {\textbf{\useKV[Instagram]{Expediteur}}}; + \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Instagram]{LogoEx}}{\EchelleLogo}}; + \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries\color{gray}...}; + \coordinate[yshift=-3em] (HA) at (frame.north west); + \coordinate[yshift=-3em] (HB) at (frame.north east); + \draw[gray!15] (HA)--(HB); + \coordinate[yshift=7em] (BA) at (frame.south west); + \coordinate[yshift=7em] (BB) at (frame.south east); + \draw[gray!15] (BA)--(BB); + \coordinate[xshift=1em,yshift=6em] (A) at (frame.south west); + \node[anchor=west] at (A) {\bfseries\faHeart[regular]\quad\faComment[regular]\quad\faPaperPlane}; + \coordinate[xshift=-1em,yshift=6em] (A1) at (frame.south east); + \node[anchor=east] at (A1) {\bfseries\faBookmark[regular]}; + \coordinate[xshift=1em,yshift=5em] (B) at (frame.south west); + \node[anchor=west] at (B) {\footnotesize\bfseries\fpeval{randint(10,30)} J'aime}; + \coordinate[xshift=1em,yshift=4em] (C) at (frame.south west); + \node[anchor=west] at (C) {\textbf{\useKV[Instagram]{Expediteur}}~\useKV[Instagram]{Texte}}; + \node[anchor=center,xshift=2em,yshift=2.25em] at (frame.south west) {\LogoTW{\useKV[Instagram]{Logo}}{\EchelleLogo}}; + \node[anchor=west,xshift=4em,yshift=2.25em] at (frame.south west) {\textcolor{gray!50}{Ajouter un commentaire\dots}}; + \node[anchor=east,xshift=-1em,yshift=2.25em] at (frame.south east) {\textcolor{red}{\faHeart}\quad\textcolor{Gold}{\faHandSpock}\quad\textcolor{gray!50}{\faPlusCircle}}; + \node[anchor=west,xshift=1em,yshift=0.5em] at (frame.south west) {\scriptsize\color{gray} Il y a \useKV[Instagram]{Temps} secondes}; + }, + colback=white, + colframe=gray!15, + top=3em, + left=3em, + bottom=7em] + \BODY% + \end{tcolorbox} +} + +%%% +% Snapchat +%%% +\setKVdefault[Snapchat]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Temps=34,Logo=DrStrange,EchelleLogo=0.035,Texte=Envoyer un Chat} + +\NewEnviron{Snapchat}[1][]{% + \useKVdefault[Snapchat]% + \setKV[Snapchat]{#1}% + \xdef\EchelleLogo{\useKV[Snapchat]{EchelleLogo}}% + \begin{tcolorbox}[% + enhanced,% + underlay unbroken and first={% + \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Snapchat]{Auteur}}}; + \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray} il y a \useKV[Snapchat]{Temps}~min}; + \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Snapchat]{Logo}}{\EchelleLogo}}; + \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries...}; + \node[xshift=-3em,yshift=-1.5em] at (frame.north east) {\faBell[regular]}; + \coordinate[xshift=2em,yshift=2em] (P1) at (frame.south west); + \coordinate[xshift=4.5em,yshift=2em] (P2) at (frame.south west); + \coordinate[xshift=-3em,yshift=2em] (P4) at (frame.south west); + \coordinate[xshift=-2em,yshift=2em] (P3) at (frame.south east); + \coordinate[xshift=4.5em,yshift=1em] (P5) at (frame.south west); + \coordinate[xshift=4.5em,yshift=3em] (P8) at (frame.south west); + \coordinate[xshift=-4.5em,yshift=1em] (P6) at (frame.south east); + \coordinate[xshift=-4.5em,yshift=3em] (P7) at (frame.south east); + \draw (P1) circle (1em); + \node at (P1) {\faCamera}; + \draw (P3) circle (1em); + \node[xshift=-0.125em,rotate=-45] at (P3) {\faLocationArrow}; + \node[anchor=west,inner sep=0pt] at (P2) {\useKV[Snapchat]{Texte}}; + \draw (P5) -- (P6) arc(270:450:1em) -- (P7) -- (P8) arc(90:270:1em) -- cycle; + }, + colback=white, + colframe=gray!15, + top=3em, + left=3em, + bottom=3em] + \BODY% + \end{tcolorbox} +}
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCResoudreEquation.tex b/macros/latex/contrib/profcollege/latex/PfCResoudreEquation.tex new file mode 100644 index 0000000000..ae3896a98e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCResoudreEquation.tex @@ -0,0 +1,286 @@ +%%% +% Equations +%%% +\setKVdefault[ClesEquation]{Ecart=0.5,Fleches=false,FlecheDiv=false,Laurent=false,Decomposition=false,Terme=false,Composition=false,Symbole=false,Decimal=false,Entier=false,Lettre=x,Solution=false,LettreSol=true,Bloc=false,Simplification=false,CouleurTerme=black,CouleurCompo=black,CouleurSous=red,CouleurSymbole=orange,Verification=false,Nombre=0,Egalite=false,Produit=false,Facteurs=false,Carre=false,Exact=false,Pose=false,Equivalence=false} + +\newcommand\rightcomment[4]{% + \begin{tikzpicture}[remember picture,overlay] + \draw[Cfleches,-stealth] + ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$) + .. controls +(0.2,-0.05) and +(0.2,0.1) .. + node[right,align=left]{#4} + ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$); + \end{tikzpicture}% +}% + +\newcommand\leftcomment[4]{% + \begin{tikzpicture}[remember picture,overlay] + \draw[Cfleches,-stealth] + ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$) + .. controls +(-0.2,-0.05) and +(-0.2,0.1) .. + node[left,align=right]{#4} + ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$); + \end{tikzpicture}% +}% + +\newcommand\Rightcomment[4]{% + \begin{tikzpicture}[remember picture,overlay] + \draw[Cfleches,-stealth] + ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$) + .. controls +(0.2,-0.05) and +(0.2,0.1) .. + node[right,align=left]{#4} + ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$); + \end{tikzpicture}% +}% +\newcommand\Leftcomment[4]{% + \begin{tikzpicture}[remember picture,overlay] + \draw[Cfleches,-stealth] + ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$) + .. controls +(-0.2,-0.05) and +(-0.2,0.1) .. + node[left,align=right]{#4} + ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$); + \end{tikzpicture}% +}% + +% Pour "oublier" les tikzmarks. En cas de plusieurs utilisations de la macro \ResolEquation +\newcounter{Nbequa} +\setcounter{Nbequa}{0} + +%CT +\newdimen\fdashwidth \fdashwidth = 0.8pt % \'epaisseur traits +\newdimen\fdashlength \fdashlength = 0.5mm % longueur des pointill\'es et s\'eparation entre pointill\'es +\newdimen\fdashsep \fdashsep = 3pt % s\'eparateur entre contenu et traits + +\def\fdash#1{% + \leavevmode\begingroup% + \setbox0\hbox{#1}% + \def\hdash{\vrule height\fdashwidth width\fdashlength\relax}% + \def\vdash{\hrule height\fdashlength width\fdashwidth\relax}% + \def\dashblank{\kern\fdashlength}% + \ifdim\fdashsep>0pt + \setbox0\hbox{\vrule width0pt height\dimexpr\ht0+\fdashsep depth\dimexpr\dp0+\fdashsep\kern\fdashsep\unhbox0 \kern\fdashsep}% + \fi + \edef\hdash{\hbox to\the\wd0{\noexpand\color{Csymbole}\hdash\kern.5\fdashlength\xleaders\hbox{\hdash\dashblank}\hfil\hdash}}% + \edef\vdash{\vbox to\the\dimexpr\ht0+\dp0+2\fdashwidth{\noexpand\color{Csymbole}\vdash\kern.5\fdashlength\xleaders\vbox{\vdash\dashblank}\vfil\vdash}}% + \hbox{% + \vdash + \vtop{\vbox{\offinterlineskip\hdash\hbox{\unhbox0 }\hdash}}% + \vdash}% + \endgroup +} +% fin CT +\def\Fdash#1{\raisebox{-2\fdashsep+\fdashwidth}{\fdash{#1}}} + +%Une simplification de a/b est possible ou non ? +\newboolean{Simplification} + +\newcommand\SSimpliTest[2]{% + % Test d'une simplification possible ou pas de #1/#2 + \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno% + \numerateur=\number#1 + \denominateur=\number#2 + \ifnum\number#1<0 + \valabsnum=\numexpr0-\number#1 + \else + \valabsnum=\number#1 + \fi + \ifnum\number#2<0 + \valabsdeno=\numexpr0-\number#2 + \else + \valabsdeno=\number#2 + \fi + \ifnum\the\valabsnum=0 + \setboolean{Simplification}{true} + \else + \PGCD{\the\valabsnum}{\the\valabsdeno} + \ifnum\pgcd>1 + \setboolean{Simplification}{true} + \else + \ifnum\the\numerateur<0 + \ifnum\the\denominateur<0 + \setboolean{Simplification}{true} + \else + \ifnum\valabsdeno=1\relax + \setboolean{Simplification}{true} + \else + \setboolean{Simplification}{false} + \fi + \fi + \else + \ifnum\valabsdeno=1\relax + \setboolean{Simplification}{true} + \else + \setboolean{Simplification}{false} + \fi + \fi + \fi + \fi +} + +\definecolor{Cfleches}{RGB}{100,100,100}% + +\newcommand\AffichageEqua[4]{% + \def\LETTRE{\useKV[ClesEquation]{Lettre}}% + \ensuremath{% + % partie du x + \xintifboolexpr{#1==0}{}{\xintifboolexpr{#1==1}{}{\xintifboolexpr{#1==-1}{-}{\num{#1}}}\LETTRE}% + % partie du nombre + \xintifboolexpr{#2==0}{\xintifboolexpr{#1==0}{0}{}}{\xintifboolexpr{#2>0}{\xintifboolexpr{#1==0}{}{+}\num{#2}}{\num{#2}}}% + % egal + = + % partie du x + \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3==1}{}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}\LETTRE}% + % partie du nombre + \xintifboolexpr{#4==0}{% + \xintifboolexpr{#3==0}{0}{} + }{% + \xintifboolexpr{#4>0}{\xintifboolexpr{#3==0}{}{+}\num{#4}}{\num{#4}}% + } + }% +}% + +\newcommand\EcrireSolutionEquation[4]{% + L'équation \AffichageEqua{#1}{#2}{#3}{#4} a une unique solution : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$. +}% + +\input{PfCEquationSoustraction2}% +\input{PfCEquationTerme1}% +\input{PfCEquationComposition2}% +\input{PfCEquationPose1}% +\input{PfCEquationSymbole1}% +\input{PfCEquationLaurent1} + +\newcommand\ResolEquation[5][]{% + \useKVdefault[ClesEquation]% + \setKV[ClesEquation]{#1}% + \colorlet{Cterme}{\useKV[ClesEquation]{CouleurTerme}}% + \colorlet{Ccompo}{\useKV[ClesEquation]{CouleurCompo}}% + \colorlet{Csymbole}{\useKV[ClesEquation]{CouleurSymbole}}% + \colorlet{Cdecomp}{\useKV[ClesEquation]{CouleurSous}}% + \ifboolKV[ClesEquation]{Carre}{% + \ResolEquationCarre[#1]{#2}% + }{% + \ifboolKV[ClesEquation]{Produit}{% + \ResolEquationProduit[#1]{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesEquation]{Verification}{% + \Verification[#1]{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesEquation]{Symbole}{% + \ResolEquationSymbole[#1]{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesEquation]{Laurent}{% + \ResolEquationLaurent[#1]{#2}{#3}{#4}{#5}% + }{% + \ifboolKV[ClesEquation]{Terme}{% + \ResolEquationTerme[#1]{#2}{#3}{#4}{#5}% + }{\ifboolKV[ClesEquation]{Composition}{% + \ResolEquationComposition[#1]{#2}{#3}{#4}{#5}% + }{\ifboolKV[ClesEquation]{Pose}{% + \ResolEquationL[#1]{#2}{#3}{#4}{#5}% + }{% + \ResolEquationSoustraction[#1]{#2}{#3}{#4}{#5}% + }% + }% + }% + }% + }% + }% + }% + }% +}% + +\newcommand\ResolEquationCarre[2][]{% + \setKV[ClesEquation]{#1}% + \xintifboolexpr{#2<0}{% + Comme $\num{#2}$ est n\'egatif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ n'a aucune solution.% + }{\xintifboolexpr{#2==0}{% + L'\'equation $\useKV[ClesEquation]{Lettre}^2=0$ a une unique solution : $\useKV[ClesEquation]{Lettre}=0$.% + }{% + Comme \num{#2} est positif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ a deux solutions :% + \begin{align*} + \useKV[ClesEquation]{Lettre}&=\sqrt{\num{#2}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\sqrt{\num{#2}}%\\ + \ifboolKV[ClesEquation]{Exact}{\\% + \useKV[ClesEquation]{Lettre}&=\num{\fpeval{sqrt(#2)}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\num{\fpeval{sqrt(#2)}}}{}% + \end{align*} + }% + }% +}% + +\newcommand\ResolEquationProduit[5][]{% + \setKV[ClesEquation]{#1}% + \ifboolKV[ClesEquation]{Equivalence}{}{C'est un produit nul donc \ifboolKV[ClesEquation]{Facteurs}{l'un au + moins des facteurs est nul}{} :}% + \ifboolKV[ClesEquation]{Equivalence}{% + \[\Distri{#2}{#3}{#4}{#5}=0\] + \begin{align*}% + &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&\quad&\makebox[0pt]{ou}\quad&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\ + &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\ + \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1 + &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}} + % accolade%\\ + %%%% + \ifboolKV[ClesEquation]{Entier}{% + \xdef\TSimp{}% + \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}} + \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{} + \xintifboolexpr{\TSimp==0}{}{\\ + \ifboolKV[ClesEquation]{Simplification}{% + &\makebox[0pt]{$\Longleftrightarrow$}&\SSimpliTest{\Coeffb}{\Coeffa}\xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\ + } + }{} + &&&\ifboolKV[ClesEquation]{Simplification}{% + \SSimpliTest{\Coeffd}{\Coeffc}% + \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\ + } + }{} + } + }{} + } + \end{align*} + }{% + \begin{align*} + \xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&&\text{ou}&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\ + \xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\ + \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1 + \xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}} + %accolade%\\ + %%%% + \ifboolKV[ClesEquation]{Entier}{% + \xdef\TSimp{} + \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}} + \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{} + \xintifboolexpr{\TSimp==0}{}{\\ + \ifboolKV[ClesEquation]{Simplification}{% + \SSimpliTest{\Coeffb}{\Coeffa} + \xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\ + } + }{} + &&&\ifboolKV[ClesEquation]{Simplification}{% + \SSimpliTest{\Coeffd}{\Coeffc}% + \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\ + } + }{} + } + }{} + } + \end{align*} + }% + \ifboolKV[ClesEquation]{Solution}{L'\'equation $\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}})}\xintifboolexpr{#5==0}{\times\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}})}=0$ a deux solutions : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$ et \opdiv*{\Coeffd}{\Coeffc}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffd}{\Coeffc}}{\frac{\num{\Coeffd}}{\num{\Coeffc}}}\fi$. + }{}% +} + +\newcommand\Verification[5][]{% + \setKV[ClesEquation]{#1}% + \xdef\ValeurTest{\useKV[ClesEquation]{Nombre}}% + Testons la valeur $\useKV[ClesEquation]{Lettre}=\num{\ValeurTest}$ :% + \begin{align*} + \xintifboolexpr{#2==0}{\num{#3}}{\num{#2}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{\num{#5}}{\num{#4}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\ + \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\ + \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}} + \end{align*} + \xdef\Testa{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}\xdef\Testb{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}% + \ifboolKV[ClesEquation]{Egalite}{% + Comme \xintifboolexpr{\Testa==\Testb}{$\num{\Testa}=\num{\Testb}$}{$\num{\Testa}\not=\num{\Testb}$}, alors l'\'egalit\'e $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$ \xintifboolexpr{\Testa==\Testb}{ est v\'erifi\'ee }{ n'est pas v\'erifi\'ee } pour $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$.% + }{\xintifboolexpr{\Testa==\Testb}{Comme $\num{\Testa}=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ est bien }{Comme $\num{\Testa}\not=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ n'est pas }une solution de l'\'equation $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$.}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRondeInfernale.tex b/macros/latex/contrib/profcollege/latex/PfCRondeInfernale.tex new file mode 100644 index 0000000000..8426646d55 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRondeInfernale.tex @@ -0,0 +1,466 @@ +%%% +% Ronde infernale +%%% +\newcommand\TestNombrePremier[1]{% + % #1 le nombre \`a tester + \newcount\anp\newcount\bnp\newcount\cnp% + \anp=#1\relax + \bnp=2\relax + \premier=-1\relax + \whiledo{\anp > 1}{% + \modulo{\the\anp}{\the\bnp} + \ifnum\remainder=0\relax% + \global\premier=\numexpr\premier+1\relax% + \cnp=\numexpr\anp/\bnp\relax% + \anp=\cnp\relax% + \else% + \bnp=\numexpr\bnp+1\relax% + \fi% + }% +}% + +\newcommand\PfCRIListeDiviseur[1]{%#1 : nombre entier + \newcount\anp\newcount\bnp% + \anp=\fpeval{abs(#1)}% + \bnp=2\relax% + \xdef\PfCRIRetiensListeDiviseurs{}% + \ifnum#1=0% + \xdef\PfCRIRetiensListeDiviseurs{\fpeval{randint(2,5)},\fpeval{randint(6,9)}}% + \else + \whiledo{\bnp<\anp}{% + \modulo{\the\anp}{\the\bnp}{}% + \ifnum\remainder=0% + \ifnum#1>0 + \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\bnp,}% + \else + \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\bnp,-\the\bnp,}% + \fi + \fi% + \bnp=\numexpr\bnp+1% + }% + \ifnum#1>0 + \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\anp,1} + \else + \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\anp,-\the\anp} + \fi + \fi +} + +\setKVdefault[RondeInfernale]{Solution=false,Relatifs=false,Etapes=4,Perso=false,Cles=false,Vide,Rayon=2.5cm,Graines=false,Rectangle=false}% +\defKV[RondeInfernale]{Graine=\setKV[RondeInfernale]{Graines}}% +\defKV[RondeInfernale]{Cle=\setKV[RondeInfernale]{Cles}\setKV[RondeInfernale]{Vide=false}}% +\defKV[RondeInfernale]{ListeOperations=\setKV[RondeInfernale]{Perso}}% +\defKV[RondeInfernale]{ListeNombres=\setKV[RondeInfernale]{Perso}}% +% +\NewDocumentCommand\RondeInfernale{o}{% + \useKVdefault[RondeInfernale]% + \setKV[RondeInfernale]{#1}% + % Graine + \ifboolKV[RondeInfernale]{Graines}{\PfCGraineAlea{\useKV[RondeInfernale]{Graine}}}{}% + % Nombre clé + \ifboolKV[RondeInfernale]{Cles}{% + \xdef\PfCRINombreCle{\useKV[RondeInfernale]{Cle}}% + }{% + \ifboolKV[RondeInfernale]{Relatifs}{% + \xdef\PfCRIListeNegatifs{-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10} + \MelangeListe{\PfCRIListeNegatifs}{1} + \readlist*\PfCRIListeCle{\faa} + \xdef\PfCRINombreCle{\PfCRIListeCle[1]}% + }{% + \xdef\PfCRINombreCle{\fpeval{randint(2,9)}}% + }% + }% + \ifboolKV[RondeInfernale]{Perso}{% + \xdef\PfCRIRecupOperations{\useKV[RondeInfernale]{ListeOperations}}% + \xdef\PfCRIRecupNombres{\useKV[RondeInfernale]{ListeNombres}}% + }{% + % On définit les éléments nécessaires + \xdef\PfCRIListeToutesOperations{+,-,*,/}% + \xdef\PfCRIListeOperationsSansDiv{+,-,*}% + \xdef\PfCRIListeOperationsSansMul{+,-,/}% + \xdef\PfCRIListeOperationsSimple{+,-}% + \xdef\PfCRIRecupOperations{}% + \xdef\PfCRIRecupNombres{}% + \xdef\PfCRIRecupResultats{}% + \xdef\PfCRINombreATester{\PfCRINombreCle}% + \xdef\PfCRIRetiensNbEtapes{\useKV[RondeInfernale]{Etapes}}% + \setsepchar{,}\ignoreemptyitems% + % Liste des opérations jusqu'à l'étape n-1 + \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[RondeInfernale]{Etapes}-1}}}\do{% + \TestNombrePremier{\PfCRINombreATester}\relax% + \xintifboolexpr{\premier==0}{% + % Définition des opérations + \MelangeListe{\PfCRIListeOperationsSansDiv}{1}% + \readlist*\PfCRIRetiensLoperation{\faa}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \xdef\PfCRIOperateur{\fpeval{randint(2,9)}}% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRIOperateur,}% + \xdef\PfCRIResultat{\fpeval{\PfCRINombreATester\PfCRIRetiensLoperation[1]\PfCRIOperateur}}% + \xdef\PfCRIRecupResultats{\PfCRIRecupResultats \PfCRIResultat,}% + \xdef\PfCRINombreATester{\PfCRIResultat}% + }{% + \MelangeListe{\PfCRIListeToutesOperations}{1}% + \readlist*\PfCRIRetiensLoperation{\faa}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \IfStrEq{\PfCRIRetiensLoperation[1]}{/}{% + \PfCRIListeDiviseur{\PfCRINombreATester}% + \MelangeListe{\PfCRIRetiensListeDiviseurs}{1}% + \readlist*\PfCRIRetiensLeDiviseur{\faa}% + \xdef\PfCRIOperateur{\PfCRIRetiensLeDiviseur[1]}% + }{% + \xdef\PfCRIOperateur{\fpeval{randint(2,9)}}% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRIOperateur,}% + \xdef\PfCRIResultat{\fpeval{\PfCRINombreATester\PfCRIRetiensLoperation[1]\PfCRIOperateur}}% + \xdef\PfCRIRecupResultats{\PfCRIRecupResultats \PfCRIResultat,}% + \xdef\PfCRINombreATester{\PfCRIResultat}% + }% + }% + % Dernière opération + \xintifboolexpr{\fpeval{abs(\PfCRINombreATester)-abs(\PfCRINombreCle)}>0}{% + \modulo{\PfCRINombreATester}{\PfCRINombreCle}{}% + \xintifboolexpr{\remainder==0}{% + \MelangeListe{\PfCRIListeOperationsSansMul}{1}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \ignoreemptyitems% + \readlist*\PfCRIRetiensLoperation{\faa}% + \IfStrEq{\PfCRIRetiensLoperation[1]}{/}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester/\PfCRINombreCle}}% + }{% + \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% + }{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% + }% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }{% + \MelangeListe{\PfCRIListeOperationsSimple}{1}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \ignoreemptyitems% + \readlist*\PfCRIRetiensLoperation{\faa}% + \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% + }{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }% + }{% + \xintifboolexpr{\fpeval{abs(\PfCRINombreATester)-abs(\PfCRINombreCle)}==0}{% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations *}% + \ignoreemptyitems% + \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres 1}% + }{% + \xintifboolexpr{\PfCRINombreATester==0}{% + \MelangeListe{\PfCRIListeOperationsSimple}{1}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \ignoreemptyitems% + \readlist*\PfCRIRetiensLoperation{\faa}% + \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% + }{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }{% + \modulo{\PfCRINombreCle}{\PfCRINombreATester}{}% + \xintifboolexpr{\remainder==0}{%-1 + \MelangeListe{\PfCRIListeToutesOperations}{1}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \readlist*\PfCRIRetiensLoperation{\faa}% + \ignoreemptyitems% + \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% + \IfStrEq{\PfCRIRetiensLoperation[1]}{*}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle/\PfCRINombreATester}}% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }{ + \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% + }{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }% + }{% + \MelangeListe{\PfCRIListeOperationsSimple}{1}% + \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% + \ignoreemptyitems% + \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% + \IfStrEq{\PfCRIRIListeOperations[\PfCRIRetiensNbEtapes]}{-}{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% + }{% + \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% + }% + \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% + }% + }% + }% + }% + }% + \ignoreemptyitems% + \readlist*\PfCRIRIOperations{\PfCRIRecupOperations}% + \readlist*\PfCRIRINombres{\PfCRIRecupNombres}% + \reademptyitems% + % On prépare le dessin + \xdef\PfCRINombresDessin{}% + \xdef\PfCRIOperationsDessin{}% + \foreachitem\compteur\in\PfCRIRINombres{% + \xintifboolexpr{\PfCRIRINombres[\compteurcnt]<0}{% + \xdef\PfCRINombresDessin{\PfCRINombresDessin "(\num{\PfCRIRINombres[\compteurcnt]})",}% + }{% + \xdef\PfCRINombresDessin{\PfCRINombresDessin "\num{\PfCRIRINombres[\compteurcnt]}",}% + }% + }% + \foreachitem\compteur\in\PfCRIRIOperations{% + \xdef\PfCRIOperationsDessin{\PfCRIOperationsDessin "\PfCRIRIOperations[\compteurcnt]",}% + }% + % On dessine + \BuildRondeInfernale{\PfCRINombresDessin}{\PfCRIOperationsDessin}% +}% + +\NewDocumentCommand\BuildRondeInfernale{m m}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean Vide,Rectangle,Perso; + Vide=\useKV[RondeInfernale]{Vide}; + Rectangle=\useKV[RondeInfernale]{Rectangle}; + Perso=\useKV[RondeInfernale]{Perso}; + if Perso: + string Depart; + Depart=\useKV[RondeInfernale]{Cle}; + else: + numeric Depart; + Depart=\PfCRINombreCle; + fi; + + numeric Rayon; + Rayon=\useKV[RondeInfernale]{Rayon}; + + string Nombre[]; + + vardef Compte(text t)=%On compte le nb d'étapes et on retient les nombres + nbcase:=0; + for p_=t: + nbcase:=nbcase+1; + Nombre[nbcase]=p_; + endfor; + enddef; + + vardef AfficheRonde(text t)=%On fait l'affichage des opérations + n:=0; + for k=1 upto nbcase: + fill cercles(rotation(A[k],O,0.5*(360/nbcase)),5mm) withcolor white; + endfor; + for p_=t: + n:=n+1; + if p_="*": + label(TEX("$\times"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + elseif p_="/": + label(TEX("$\div"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + else: + label(TEX("$"&p_&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + fi; + endfor; + enddef; + + vardef AfficheRectangle(text t)=%On fait l'affichage des opérations + n:=0; + for p_=t: + n:=n+1; + if n=nbcase: + if p_="*": + label.bot(TEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + elseif p_="/": + label.bot(TEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + else: + label.bot(TEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + fi; + else: + if p_="*": + label.top(TEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + elseif p_="/": + label.top(TEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + else: + label.top(TEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + fi; + fi; + endfor; + enddef; + + vardef BaseRonde= + pair O,A[]; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + A[0]=pointarc(cc,0); + A[nbcase+1]=A[0]; + for k=1 upto nbcase: + A[k]=rotation(A[0],O,k*(360/nbcase)); + endfor; + for k=0 upto nbcase: + drawarrow reverse(arccercle(A[k],A[k+1],O) cutbefore cercles(A[k],5mm) cutafter cercles(A[k+1],5mm)) withpen pencircle scaled 1.5; + endfor; + for k=0 upto nbcase: + fill cercles(A[k],5mm) withcolor white; + trace cercles(A[k],5mm) withpen pencircle scaled 1.5; + endfor; + enddef; + + vardef BoiteRectangle= + save $; + path $; + $=u*(0.9,-0.5){dir 0}..{dir 90}(u*(1,-0.4))--(u*(1,0.4)){dir 90}..{dir180}(u*(0.9,0.5))--u*(-0.9,0.5){dir 180}..{dir-90}(u*(-1,0.4))--(u*(-1,-0.4)){dir-90}..{dir0}(u*(-0.9,-0.5))--cycle; + $ + enddef; + + vardef BaseRectangle= + pair O,A[]; + O=(0,0); + A[0]=O; + for k=1 upto nbcase: + A[k]-A[k-1]=(Rayon+2cm,0); + endfor; + for k=0 upto nbcase-2: + drawarrow (A[k]--A[k+1]) cutbefore (BoiteRectangle shifted A[k]) cutafter (BoiteRectangle shifted A[k+1]) withpen pencircle scaled 1.5; + endfor; + drawarrow (A[nbcase-1]--(A[nbcase-1]+u*(0,-1))--(A[0]+u*(0,-1))--A[0]) cutbefore (BoiteRectangle shifted A[nbcase-1]) cutafter (BoiteRectangle shifted A[0]) withpen pencircle scaled 1.5; + for k=0 upto nbcase-1: + trace (BoiteRectangle shifted A[k]) withpen pencircle scaled 1.5; + endfor; + enddef; + + Compte(#1); + + if Rectangle: + BaseRectangle; + AfficheRectangle(#2); + else: + BaseRonde; + AfficheRonde(#2); + fi; + if Vide=false: + if Perso: + label(TEX("$"&Depart&"$"),A[0]); + else: + label(TEX("$"&decimal(Depart)&"$"),A[0]); + fi; + fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + boolean Vide,Rectangle,Perso;Vide=\useKV[RondeInfernale]{Vide};Rectangle=\useKV[RondeInfernale]{Rectangle};Perso=\useKV[RondeInfernale]{Perso};if Perso:string Depart;Depart=\useKV[RondeInfernale]{Cle};else:numeric Depart;Depart=\PfCRINombreCle;fi;numeric Rayon;Rayon=\useKV[RondeInfernale]{Rayon};}] + string Nombre[]; + + vardef Compte(text t)=%On compte le nb d'étapes et on retient les nombres + nbcase:=0; + for p_=t: + nbcase:=nbcase+1; + Nombre[nbcase]=p_; + endfor; + enddef; + + vardef AfficheRonde(text t)=%On fait l'affichage des opérations + n:=0; + for k=1 upto nbcase: + fill cercles(rotation(A[k],O,0.5*(360/nbcase)),5mm) withcolor white; + endfor; + for p_=t: + n:=n+1; + if p_="*": + label(LATEX("$\times"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + elseif p_="/": + label(LATEX("$\div"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + else: + label(LATEX("$"&p_&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); + fi; + endfor; + enddef; + + vardef AfficheRectangle(text t)=%On fait l'affichage des opérations + n:=0; + for p_=t: + n:=n+1; + if n=nbcase: + if p_="*": + label.bot(LATEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + elseif p_="/": + label.bot(LATEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + else: + label.bot(LATEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); + fi; + else: + if p_="*": + label.top(LATEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + elseif p_="/": + label.top(LATEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + else: + label.top(LATEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[n]]); + fi; + fi; + endfor; + enddef; + + vardef BaseRonde= + pair O,A[]; + O=(0,0); + path cc; + cc=cercles(O,Rayon); + A[0]=pointarc(cc,0); + A[nbcase+1]=A[0]; + for k=1 upto nbcase: + A[k]=rotation(A[0],O,k*(360/nbcase)); + endfor; + for k=0 upto nbcase: + drawarrow reverse(arccercle(A[k],A[k+1],O) cutbefore cercles(A[k],5mm) cutafter cercles(A[k+1],5mm)) withpen pencircle scaled 1.5; + endfor; + for k=0 upto nbcase: + fill cercles(A[k],5mm) withcolor white; + trace cercles(A[k],5mm) withpen pencircle scaled 1.5; + endfor; + enddef; + + vardef BoiteRectangle= + save $; + path $; + $=u*(0.9,-0.5){dir 0}..{dir 90}(u*(1,-0.4))--(u*(1,0.4)){dir 90}..{dir180}(u*(0.9,0.5))--u*(-0.9,0.5){dir 180}..{dir-90}(u*(-1,0.4))--(u*(-1,-0.4)){dir-90}..{dir0}(u*(-0.9,-0.5))--cycle; + $ + enddef; + + vardef BaseRectangle= + pair O,A[]; + O=(0,0); + A[0]=O; + for k=1 upto nbcase: + A[k]-A[k-1]=(Rayon+2cm,0); + endfor; + for k=0 upto nbcase-2: + drawarrow (A[k]--A[k+1]) cutbefore (BoiteRectangle shifted A[k]) cutafter (BoiteRectangle shifted A[k+1]) withpen pencircle scaled 1.5; + endfor; + drawarrow (A[nbcase-1]--(A[nbcase-1]+u*(0,-1))--(A[0]+u*(0,-1))--A[0]) cutbefore (BoiteRectangle shifted A[nbcase-1]) cutafter (BoiteRectangle shifted A[0]) withpen pencircle scaled 1.5; + for k=0 upto nbcase-1: + trace (BoiteRectangle shifted A[k]) withpen pencircle scaled 1.5; + endfor; + enddef; + + Compte(#1); + + if Rectangle: + BaseRectangle; + AfficheRectangle(#2); + else: + BaseRonde; + AfficheRonde(#2); + fi; + if Vide=false: + if Perso: + label(LATEX("$"&Depart&"$"),A[0]); + else: + label(LATEX("$"&decimal(Depart)&"$"),A[0]); + fi; + fi; + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCRose.tex b/macros/latex/contrib/profcollege/latex/PfCRose.tex new file mode 100644 index 0000000000..2c8ff3fd06 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCRose.tex @@ -0,0 +1,302 @@ +%%% +% Rose +%%% +\setKVdefault[ClesRose]{Vide=false,Couleur=white,Produits=false,Solution=false,Rayon=2cm,Petales=7,Aide=false,FacteurMin=2,FacteurMax=10,ProduitVide=false,CaseVide=false,Polygone=false,Nom=Rose1}% + +\NewDocumentCommand\RoseMul{o}{% + \useKVdefault[ClesRose]% + \setKV[ClesRose]{#1}% + \ifluatex% + \ifboolKV[ClesRose]{Solution}{% + \DessineRoseMulSol% + }{% + \DessineRoseMul% + }% + \else% + \DessineRoseMul% + \fi% +}% + +\newcommand\DessineRoseMulSol{% + \ifluatex% + \mplibforcehmode% + \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}% + \begin{mplibcode}[\PfCNomRose] + boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; + Aide:=\useKV[ClesRose]{Aide}; + Vide:=\useKV[ClesRose]{Vide}; + Solution:=\useKV[ClesRose]{Solution}; + Produits:=\useKV[ClesRose]{Produits}; + ProduitVide:=\useKV[ClesRose]{ProduitVide}; + CaseVide:=\useKV[ClesRose]{CaseVide}; + if ProduitVide:Solution:=true fi; + if CaseVide:Solution:=true fi; + % on labelise + if Vide=false: + if Produits: + else: + for k=0 upto Petales-1: + label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); + endfor; + fi; + if Produits or Solution: + for k=0 upto Petales-1: + label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); + endfor; + fi; + fi; + % On trace et on affiche...éventuellement :) + if Aide: + for k=0 upto Petales-1: + drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + fi; + if ProduitVide: + %choix=floor(uniformdeviate(Petales-1)); + fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; + fi; + if CaseVide: + %choix:=floor(uniformdeviate(Petales-1)); + for k=0 upto Petales-1: + if k<>choix: + fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; + fi; + endfor; + fi; + trace A0 for k=1 upto Petales:--A[k] endfor --cycle; + for k=0 upto Petales-1: + trace segment(O,B[k]) dashed withdots scaled 0.25; + draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + \end{mplibcode} + \fi +} +\newcommand\DessineRoseMul{% + \ifluatex% + \mplibforcehmode% + \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}% + \begin{mplibcode}[\PfCNomRose] + vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)= + numeric ElementE[],ElementS[]; + %% éléments d'entrée + nbe:=1; + for k=nbmin upto nbmax: + ElementE[nbe]=k; + nbe:=nbe+1; + endfor; + totalE:=(nbmax-nbmin)+1; + numeric rec; + for k=1 upto nbfacteurs: + rec:=ceiling(uniformdeviate(totalE+1-k)); + ElementS[k]=ElementE[rec]; + numeric ElementI[]; + p:=0; + for l=1 upto totalE+1-k: + if l<>rec: + p:=p+1; + ElementI[p]=ElementE[l]; + fi; + endfor; + numeric ElementE[]; + for l=1 upto p: + ElementE[l]=ElementI[l]; + endfor; + endfor; + enddef; + pair A[],B[],O; + Rayon:=\useKV[ClesRose]{Rayon}; + boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; + Aide:=\useKV[ClesRose]{Aide}; + Vide:=\useKV[ClesRose]{Vide}; + Solution:=\useKV[ClesRose]{Solution}; + Produits:=\useKV[ClesRose]{Produits}; + ProduitVide:=\useKV[ClesRose]{ProduitVide}; + CaseVide:=\useKV[ClesRose]{CaseVide}; + if ProduitVide:Solution:=true fi; + if CaseVide:Solution:=true fi; + Polygone:=\useKV[ClesRose]{Polygone}; + Petales:=\useKV[ClesRose]{Petales}; + FacteurMin:=\useKV[ClesRose]{FacteurMin}; + FacteurMax:=\useKV[ClesRose]{FacteurMax}; + color Fond; + Fond:=\useKV[ClesRose]{Couleur}; + O=(0,0); + ExtraireListe(FacteurMin,FacteurMax,Petales); + path cc; + cc=cercles(O,Rayon); + for k=0 upto Petales: + A[k]=pointarc(cc,(360/Petales)*k); + endfor; + for k=0 upto Petales-1: + B[k]=iso(A[k],A[k+1]); + endfor; + path BoiteRec; + if Polygone: + BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u; + else: + 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; + fi; + %On détermine les facteurs et produits + for k=0 upto Petales-1: + Facteur[k]:=ElementS[k+1]; + endfor; + Facteur[Petales]:=Facteur[0]; + for k=0 upto Petales-1: + Produit[k]:=Facteur[k]*Facteur[k+1]; + endfor; + %on labelise + if Vide=false: + if Produits: + else: + for k=0 upto Petales-1: + label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); + endfor; + fi; + if Produits or Solution: + for k=0 upto Petales-1: + label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); + endfor; + fi; + fi; + % On trace et on affiche...éventuellement :) + if Aide: + for k=0 upto Petales-1: + drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + fi; + if ProduitVide: + choix:=floor(uniformdeviate(Petales-1)); + fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; + fi; + if CaseVide: + choix:=floor(uniformdeviate(Petales-1)); + for k=0 upto Petales-1: + if k<>choix: + fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; + fi; + endfor; + fi; + trace A0 for k=1 upto Petales:--A[k] endfor --cycle; + for k=0 upto Petales-1: + trace segment(O,B[k]) dashed withdots scaled 0.25; + draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={Rayon:=\useKV[ClesRose]{Rayon}; + boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; + Aide:=\useKV[ClesRose]{Aide}; + Vide:=\useKV[ClesRose]{Vide}; + Solution:=\useKV[ClesRose]{Solution}; + Produits:=\useKV[ClesRose]{Produits}; + ProduitVide:=\useKV[ClesRose]{ProduitVide}; + CaseVide:=\useKV[ClesRose]{CaseVide}; + if ProduitVide:Solution:=true fi; + if CaseVide:Solution:=true fi; + Polygone:=\useKV[ClesRose]{Polygone}; + Petales:=\useKV[ClesRose]{Petales}; + FacteurMin:=\useKV[ClesRose]{FacteurMin}; + FacteurMax:=\useKV[ClesRose]{FacteurMax}; + color Fond; + Fond:=\useKV[ClesRose]{Couleur};}] + vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)= + numeric ElementE[],ElementS[]; + %% éléments d'entrée + nbe=1; + for k=nbmin upto nbmax: + ElementE[nbe]=k; + nbe:=nbe+1; + endfor; + totalE=(nbmax-nbmin)+1; + numeric rec; + for k=1 upto nbfacteurs: + rec:=ceiling(uniformdeviate(totalE+1-k)); + ElementS[k]=ElementE[rec]; + numeric ElementI[]; + p:=0; + for l=1 upto totalE+1-k: + if l<>rec: + p:=p+1; + ElementI[p]=ElementE[l]; + fi; + endfor; + numeric ElementE[]; + for l=1 upto p: + ElementE[l]=ElementI[l]; + endfor; + endfor; + enddef; + pair A[],B[],O; + O=(0,0); + ExtraireListe(FacteurMin,FacteurMax,Petales); + path cc; + cc=cercles(O,Rayon); + for k=0 upto Petales: + A[k]=pointarc(cc,(360/Petales)*k); + endfor; + for k=0 upto Petales-1: + B[k]=iso(A[k],A[k+1]); + endfor; + path BoiteRec; + if Polygone: + BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u; + else: + 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; + fi; + %On détermine les facteurs et produits + for k=0 upto Petales-1: + Facteur[k]=ElementS[k+1]; + endfor; + Facteur[Petales]=Facteur[0]; + for k=0 upto Petales-1: + Produit[k]=Facteur[k]*Facteur[k+1]; + endfor; + %on labelise + if Vide=false: + if Produits: + else: + for k=0 upto Petales-1: + label(LATEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); + endfor; + fi; + if Produits or Solution: + for k=0 upto Petales-1: + label(LATEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); + endfor; + fi; + fi; + % On trace et on affiche...éventuellement :) + if Aide: + for k=0 upto Petales-1: + drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + fi; + if ProduitVide: + choix=floor(uniformdeviate(Petales-1)); + fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; + fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; + fi; + if CaseVide: + choix:=floor(uniformdeviate(Petales-1)); + for k=0 upto Petales-1: + if k<>choix: + fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; + fi; + endfor; + fi; + trace A0 for k=1 upto Petales:--A[k] endfor --cycle; + for k=0 upto Petales-1: + trace segment(O,B[k]) dashed withdots scaled 0.25; + draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; + endfor; + \end{mpost} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCScratch.tex b/macros/latex/contrib/profcollege/latex/PfCScratch.tex new file mode 100644 index 0000000000..3f1e8679d2 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCScratch.tex @@ -0,0 +1,45 @@ +%%%% +% Scratch +%%%% +\newlength{\longbarreheight} +\setlength{\longbarreheight}{2.1ex+3pt} + +\newlength{\longbarredepth} +\setlength{\longbarredepth}{0.9ex+3pt} +\def\longbarre{\vrule height\longbarreheight depth\longbarredepth width0pt}% + +\def\barre{\vrule height2.1ex depth.9ex width0pt}% +\def\demibarre{\vrule height1.4ex depth.6ex width0pt}% + +\setKVdefault[Scratch]{Impression=false,Numerotation=false,Echelle=1,Naturel=false}% + +\ifluatex +\NewDocumentEnvironment{Scratch}{o +b}{% + \useKVdefault[Scratch]% + \setKV[Scratch]{#1}% + \mplibforcehmode% + \ifboolKV[Scratch]{Naturel}{}{\myfontScratch}% + \begin{mplibcode}% + boolean Naturel; + Naturel=\useKV[Scratch]{Naturel}; + if Naturel: input PfCPseudo; print:=true; else: input PfCScratch; print:=\useKV[Scratch]{Impression}; fi; + NumeroteLignes:=\useKV[Scratch]{Numerotation};% + #2% + picture recap;% + recap:=currentpicture scaled \useKV[Scratch]{Echelle};% + currentpicture:=nullpicture;% + draw recap;% + \end{mplibcode}% + }{} +\else% +\NewDocumentEnvironment{Scratch}{o +b}{% + \setKV[Scratch]{#1}% + \begin{mpost}[mpsettings={boolean Naturel;Naturel=\useKV[Scratch]{Naturel};if Naturel: input PfCPseudo; print:=true; else: input PfCScratchpdf; print:=\useKV[Scratch]{Impression}; fi;NumeroteLignes:=\useKV[Scratch]{Numerotation};Echelle:=\useKV[Scratch]{Echelle};}]% + #2% + picture recap;% + recap:=currentpicture scaled Echelle;% + currentpicture:=nullpicture;% + draw recap;% + \end{mpost} +}{}% +\fi%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCShikaku.tex b/macros/latex/contrib/profcollege/latex/PfCShikaku.tex new file mode 100644 index 0000000000..04084cadca --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCShikaku.tex @@ -0,0 +1,299 @@ +%%% +% Shikaku +%%% +\newcounter{PfCShikakuNom} +\setcounter{PfCShikakuNom}{0} + +\setKVdefault[Shikaku]{Couleur=Purple,Taille=4,Largeur=2em,Solution=false,CodeAfter={},Creation=false,TailleHor=10,TailleVer=10,TailleHorMax=5,TailleVerMax=5,Nom=Shikaku\PfCShikakuNom} + +\newlength\PfCShikakuh +\newlength\PfCShikakuv + +\NewDocumentCommand\Shikaku{o m}{% + \stepcounter{PfCShikakuNom}% + \useKVdefault[Shikaku]% + \setKV[Shikaku]{#1}% + \ifboolKV[Shikaku]{Creation}{% + \ifluatex\else\PackageWarning{ProfCollege}{La création automatique de Shikaku n'est disponible qu'avec LuaLaTeX.}\fi% + \ifboolKV[Shikaku]{Solution}{% + \ShikakuCreationSolution% + }{% + \ShikakuCreation% + }% + }{% + \setlength{\PfCShikakuv}{\useKV[Shikaku]{Largeur}+\tabcolsep}% + \setlength{\PfCShikakuh}{\useKV[Shikaku]{Largeur}}% + \colorlet{PfCCouleurShikaku}{\useKV[Shikaku]{Couleur}}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesSKK{#2}% + \savecomparemode% + \comparestrict% + \begin{NiceTabular}{*{\useKV[Shikaku]{Taille}}{m{\PfCShikakuh}}}[hvlines] + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Shikaku]{Taille}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[Shikaku]{Taille}}}\do{% + \rule{0pt}{\PfCShikakuv}% + \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{b}[\PfCTestb]% + \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{l}[\PfCTestl]% + \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]% + \xintifboolexpr{\PfCTestb==0}{% + \ifboolKV[Shikaku]{Solution}{% + \Block[borders={bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }{% + \Block[]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }% + }{% Testl + \xintifboolexpr{\PfCTestl==0}{% + \ifboolKV[Shikaku]{Solution}{% + \Block[borders={left,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }{% + \Block[]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }% + }{% Testlb + \xintifboolexpr{\PfCTestlb==0}{% + \ifboolKV[Shikaku]{Solution}{% + \Block[borders={left,bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }{% + \Block[]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }% + }{% + \Block[]{1-1}{% + \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% + }% + }% + }% + }% + \xintifForLast{\\}{&}% + }% + }% + \CodeAfter% + \useKV[Shikaku]{CodeAfter}% + \ifboolKV[Shikaku]{Solution}{% + \tikz\draw[line width=2pt,PfCCouleurShikaku] (1-|1) rectangle (last-|last);% + }{}% + \end{NiceTabular}% + \restorecomparemode% + }% +}% + +\NewDocumentCommand\ShikakuCreation{}{% + \ifluatex% + \mplibforcehmode + \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}% + \begin{mplibcode}[\PfCNomShikaku]% + Taillehor=\useKV[Shikaku]{TailleHor}; + Taillever=\useKV[Shikaku]{TailleVer}; + + TailleMaxh=\useKV[Shikaku]{TailleHorMax}; + TailleMaxv=\useKV[Shikaku]{TailleVerMax}; + + u:=5mm; + + path R[],S[],RIso[],SIso[]; + numeric RAire[],SAire[]; + numeric RHor[],RVer[],SHor[],SVer[],RAngle[],SAngle[]; + + vardef RetiensLesInfosGenerales(expr depart,Lhor,Lver)= + R[k]:=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); + RIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); + RHor[k]=Lhor; + RVer[k]=Lver; + RAire[k]=Lhor*Lver; + RAngle[k]=ANGLE; + enddef; + + vardef RetiensLesInfosPourLaSuite(expr depart,Lhor,Lver)= + if Lver>0: + S[k]=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); + SIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); + SHor[k]=Lhor; + SVer[k]=Lver; + SAire[k]=Lhor*Lver; + SAngle[k]=ANGLE; + fi; + enddef; + + vardef RectangleAuto(expr aa,bb)= + save $; + path $; + $=polygone(aa,aa+(xpart(bb-aa),0),bb,bb-(xpart(bb-aa),0)); + $ + enddef; + + pair T[]; + + pair A[],B[]; + + A1=u*(0,Taillever); + A2-A1=u*(Taillehor,0); + A4=(0,0); + A3-A4=A2-A1; + + nbh=Taillehor div TailleMaxh; + nbv=Taillever div TailleMaxv; + + p:=0; + for l=0 upto nbv: + for k=0 upto nbh: + p:=p+1; + T[p]=A1+u*(k*TailleMaxh,-l*TailleMaxv); + if k<nbh: + Hor[p]=TailleMaxh; + else: + Hor[p]=Taillehor mod TailleMaxh; + fi; + if l<nbv: + Ver[p]=TailleMaxv; + else: + Ver[p]=Taillever mod TailleMaxv; + fi; + endfor; + endfor; + + Total:=p; + + vardef DecomposeUnRectangle(expr BASEA,THOR,TVER)= + TMAXV:=TVER; + pair BBASEA; + BTHOR:=THOR; + BTVER:=TVER; + BBASEA:=BASEA; + forever: + k:=k+1; + hor:=floor(1+uniformdeviate(BTHOR)); + ver:=floor(1+uniformdeviate(BTVER)); + RetiensLesInfosGenerales(BBASEA,hor,ver); + RetiensLesInfosPourLaSuite(BBASEA+u*(0,-ver),hor,TMAXV-ver); + BTHOR:=BTHOR-hor; + BTVER:=ver; + BBASEA:=BBASEA+u*(hor,0); + exitif BTHOR<1; + endfor; + enddef; + + k=0; + for l=1 upto Total: + if uniformdeviate(1)>0.5: + Angle[l]=180; + ANGLE:=Angle[l]; + else: + Angle[l]=0; + ANGLE:=Angle[l]; + fi; + DecomposeUnRectangle(T[l],Hor[l],Ver[l]); + endfor; + Totalk=k; + + picture RTEXT[],STEXT[]; + + drawoptions(withpen pencircle scaled 2); + for n=1 upto Totalk: + trace R[n] withcolor white; + RTEXT[n]=image( + label(decimal(RAire[n]),(0,0)); + ); + RTEXT[n]:=image( + trace rotation(RTEXT[n],center RTEXT[n],RAngle[n]) shifted ((point(0) of R[n]) shifted(u*(0.5+floor(uniformdeviate(RHor[n])),-0.5-floor(uniformdeviate(RVer[n]))))); + ); + trace RTEXT[n]; + endfor; + for n=1 upto Totalk: + if unknown S[n]: + else: + trace S[n] withcolor white; + STEXT[n]=image( + label(decimal(SAire[n]),(0,0)); + ); + STEXT[n]:=image( + trace rotation(STEXT[n],center STEXT[n],SAngle[n]) shifted ((point(0) of S[n]) shifted(u*(0.5+floor(uniformdeviate(SHor[n])),-0.5-floor(uniformdeviate(SVer[n]))))); + ); + trace STEXT[n]; + fi; + endfor; + clip currentpicture to polygone(A1,A2,A3,A4); + + picture CasesAvant[],CasesApres[]; + CasesAvant[0]=currentpicture; + + currentpicture:=nullpicture; + + drawoptions(withpen pencircle scaled 2); + for n=1 upto Totalk: + trace R[n]; + trace RTEXT[n]; + endfor; + for n=1 upto Totalk: + if unknown S[n]: + else: + trace S[n]; + trace STEXT[n]; + fi; + endfor; + clip currentpicture to polygone(A1,A2,A3,A4); + CasesApres[0]:=currentpicture; + + currentpicture:=nullpicture; + + for l=1 upto Total: + CasesAvant[l]=image(% + trace CasesAvant[0]; + clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l])); + ); + currentpicture:=nullpicture; + CasesApres[l]=image( + trace CasesApres[0]; + clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l])); + ); + currentpicture:=nullpicture; + endfor; + + for l=1 upto Total: + trace rotation(CasesAvant[l],center CasesAvant[l],Angle[l]); + endfor; + + drawoptions(withpen pencircle scaled 2); + trace RectangleAuto(A1,A3); + drawoptions(); + for k=1 upto Taillehor-1: + trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2]; + endfor; + + for k=1 upto Taillever-1: + trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2]; + endfor; + \end{mplibcode} + \fi% +}% + +\NewDocumentCommand\ShikakuCreationSolution{}{% + \ifluatex% + \mplibforcehmode + \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}% + \begin{mplibcode}[\PfCNomShikaku]% + for l=1 upto Total: + trace rotation(CasesApres[l],center CasesApres[l],Angle[l]); + endfor; + drawoptions(withpen pencircle scaled 2); + trace RectangleAuto(A1,A3); + drawoptions(); + for k=1 upto Taillehor-1: + trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2]; + endfor; + + for k=1 upto Taillever-1: + trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2]; + endfor; + \end{mplibcode} + \fi% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCSimplifierFraction.tex b/macros/latex/contrib/profcollege/latex/PfCSimplifierFraction.tex new file mode 100644 index 0000000000..db49992c46 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCSimplifierFraction.tex @@ -0,0 +1,209 @@ +%%% +% Simplification +%%% +\makeatletter%by christian Tellechea +% Calcul du PGCD de #1 et #2 +\newcount\cnt@a\newcount\cnt@b\newcount\pgcd +\def\PGCD#1#2{% + \ifnum#1>#2\cnt@a#1\cnt@b#2\else\cnt@a#2\cnt@b#1\relax\fi + \PGCD@i +} +\def\PGCD@i{\edef\PGCD@ii##1{##1{\number\cnt@a}{\number\cnt@b}}\PGCD@ii\PGCD@iii} +\def\PGCD@iii#1#2{% + \cnt@b#1\relax\global\divide\cnt@b#2% + \global\cnt@b\numexpr#1-#2*\cnt@b% + \global\cnt@a#2\global\pgcd\cnt@a% + \ifnum\cnt@b>\z@\expandafter\PGCD@i% + \fi}% +\makeatother + +\def\SSimplifie#1#2{% + % Simplification d'une \'ecriture #1/#2 + \ensuremath{ + \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno + \numerateur=\number#1 + \denominateur=\number#2 + \ifnum\number#1<0\relax + \valabsnum=\numexpr0-\number#1 + \else + \valabsnum=\number#1 + \fi + \ifnum\number#2<0\relax + \valabsdeno=\numexpr0-\number#2 + \else + \valabsdeno=\number#2 + \fi + \ifnum\the\numerateur<0\relax + \ifnum\the\denominateur<0\relax + \numerateur=\valabsnum + \denominateur=\valabsdeno + \fi + \else + \ifnum\the\denominateur<0\relax + \numerateur=-\valabsnum + \denominateur=\valabsdeno + \fi + \fi + \ifnum\number#2=0\relax + \text{\bfseries(???)} + \else + \ifnum\number#1=0\relax + 0 + \else + \PGCD{\the\valabsnum}{\the\valabsdeno}% + \ifnum\pgcd>1\relax + \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{% + \divide\numerateur by \denominateur\num{\the\numerateur} + }{\divide\numerateur by\pgcd% + \divide\denominateur by\pgcd% + \frac{\num{\the\numerateur}}{\num{\the\denominateur}} + } + \else%%%comme on est avec les n\'egatifs, on doit regarder si la valeur absolue est \'egale \`a 1 + \ifnum\valabsdeno=1\relax + \divide\numerateur by \denominateur\num{\the\numerateur} + \else + \frac{\num{\the\numerateur}}{\num{\the\denominateur}} + \fi + \fi% + \fi% + \fi% + }% +} + + +\newcommand\SSimpli[2]{% + % D\'ecomposition d'une simplification de #1/#2 + \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno% + \numerateur=\number#1 + \denominateur=\number#2 + \ifnum\number#1<0 + \valabsnum=\numexpr0-\number#1 + \else + \valabsnum=\number#1 + \fi + \ifnum\number#2<0 + \valabsdeno=\numexpr0-\number#2 + \else + \valabsdeno=\number#2 + \fi + \ifnum\the\numerateur<0\relax + \ifnum\the\denominateur<0\relax + \numerateur=\valabsnum + \denominateur=\valabsdeno + \fi + \else + \ifnum\the\denominateur<0\relax + \numerateur=-\valabsnum + \denominateur=\valabsdeno + \fi + \fi + \ifnum\number#2=0\relax + \ensuremath{\text{\bfseries(???)}} + \else + \ifnum\number#1=0\relax + 0 + \else + \PGCD{\the\valabsnum}{\the\valabsdeno}% + \ifnum\pgcd>1\relax + \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{% + \divide\numerateur by \denominateur\num{\the\numerateur} + }{%\divide\numerateur by\pgcd% + % \divide\denominateur by\pgcd% + \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}% + } + \else + \ifnum\denominateur=1\relax + \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}} + \else + \ensuremath{\frac{\num{\the\numerateur}}{\num{\the\denominateur}}} + \fi + \fi + \fi + \fi +} + +\newcount\anpdc\newcount\bnpdc\newcount\cnpdc\newcount\dnpdc% +\newcount\DivCom +\newcommand\DiviseurCommun[2]{% + % #1 : le premier nombre entier + % #2 : le deuxi\`eme nombre entier + % nombre 1 vaut #1 - Nombre 2 vaut #2 + \anpdc=#1% + \cnpdc=#2% + \bnpdc=2\relax% + \dnpdc=\numexpr#1+1\relax% + \DivCom=1\relax% + \whiledo{\bnpdc<\dnpdc}{% + \modulo{\the\anpdc}{\the\bnpdc}\relax + \ifnum\remainder=0% + \modulo{\the\cnpdc}{\the\bnpdc} + \ifnum\remainder=0% + \DivCom=\bnpdc% + \bnpdc=\anpdc% + \else% + \DivCom=1% + \fi + \else% + \DivCom=1% + \fi + \bnpdc=\numexpr\bnpdc+1\relax% + }% +} + +\newcommand\LongueSimplification[2]{% + \xdef\NumerateurDiv{#1}% + \xdef\DenominateurDiv{#2}% + \DiviseurCommun{#1}{#2}% + \ensuremath{% + \whiledo{\DivCom>1}{% + \frac{\num{\fpeval{\NumerateurDiv/\the\DivCom}}\times\num{\the\DivCom}}{\num{\fpeval{\DenominateurDiv/\the\DivCom}}\times\num{\the\DivCom}}=\frac{\num{\fpeval{\NumerateurDiv/\DivCom}}}{\num{\fpeval{\DenominateurDiv/\DivCom}}}% + \xdef\NumerateurDiv{\fpeval{\NumerateurDiv/\DivCom}}% + \xdef\DenominateurDiv{\fpeval{\DenominateurDiv/\DivCom}}% + \DiviseurCommun{\NumerateurDiv}{\DenominateurDiv}% + \xintifboolexpr{\DivCom>1}{=}{}% + }% + }% +}% + +\setKVdefault[ClesSimplification]{Details=false,All=false,Longue=false,Fleches=false,Contraire=0} + +\newcounter{NbFrac}% +\setcounter{NbFrac}{0}% + +\newcommand\Simplification[3][]{% + \stepcounter{NbFrac}% + \useKVdefault[ClesSimplification]% + \setKV[ClesSimplification]{#1}% + \ifboolKV[ClesSimplification]{Fleches}{% + \setsepchar[*]{,*/}%\ignoreemptyitems + \readlist*\Listea{#2}% + \readlist*\Listeb{#3}% + \setbox1=\hbox{\Listea[1,1]{}}% + \setbox2=\hbox{\Listeb[1,1]}% + \setbox3=\hbox{\Listea[1,3]}% + \setbox4=\hbox{\Listeb[1,3]}% + \ensuremath{% + \frac{\tikzmarknode[anchor=north]{A-\theNbFrac}{\Listea[1,1]}{}}{\tikzmarknode[anchor=south]{B-\theNbFrac}{\Listeb[1,1]}{}}=\frac{\tikzmarknode[anchor=north]{C-\theNbFrac}{\Listea[1,3]}{}}{\tikzmarknode[anchor=south]{D-\theNbFrac}{\Listeb[1,3]}{}}% + }% + \begin{tikzpicture}[remember picture,overlay]% + \draw[out=45,in=135,-stealth,transform canvas={yshift=0.25em}] + let + \p1=(pic cs:A-\theNbFrac), + \p2=(pic cs:C-\theNbFrac) + in (pic cs:A-\theNbFrac) to node[midway,above]{\Listea[1,2]}(\x2,\y1); + \draw[out=-45,in=-135,-stealth,transform canvas={yshift=-0.25em}] (pic cs:B-\theNbFrac) to node[midway,below]{\Listeb[1,2]}(pic cs:D-\theNbFrac);% + \end{tikzpicture}% + }{% + \xintifboolexpr{\useKV[ClesSimplification]{Contraire}>1}{% + \ensuremath{% + \frac{\num{#2}}{\num{#3}}=\frac{\num{#2}\times\num{\useKV[ClesSimplification]{Contraire}}}{\num{#3}\times\num{\useKV[ClesSimplification]{Contraire}}}=\frac{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#2}}}{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#3}}}% + }% + }{% + \ifboolKV[ClesSimplification]{Longue}{% + \LongueSimplification{#2}{#3}% + }{% + \ifboolKV[ClesSimplification]{Details}{\SSimpli{#2}{#3}}{\ifboolKV[ClesSimplification]{All}{\ensuremath{\SSimpli{#2}{#3}=\SSimplifie{#2}{#3}}}{\SSimplifie{#2}{#3}}}% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCSolides.tex b/macros/latex/contrib/profcollege/latex/PfCSolides.tex new file mode 100644 index 0000000000..35bbeb74f5 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCSolides.tex @@ -0,0 +1,866 @@ +%%% +% Solide et sections +%%% +\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,RayonCone=1,HauteurCone=2,HauteurPyramide=2,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B}}% +\defKV[ClesSolides]{Traces=\setKV[ClesSolides]{Code}}% +\defKV[ClesSolides]{Section=\setKV[ClesSolides]{Sections}}% +\defKV[ClesSolides]{CouleurSection=\setKV[ClesSolides]{RemplisSection}}% + +\newcommand\MPSolideCylindre[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCSolid; + + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Sections:=\useKV[ClesSolides]{Sections}; + Axes:=\useKV[ClesSolides]{Axes}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayoncylindre=\useKV[ClesSolides]{RayonCylindre}; + hauteurcylindre=\useKV[ClesSolides]{HauteurCylindre}; + + string Section; + if Sections:Section=\useKV[ClesSolides]{Section};fi; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + + vardef BaseCylindre(text t)= + save Cer; + picture Cer; + save n; + n:=0; + for p_=t: + if color p_: + n:=n+1; + _T[n]:=p_; + fi; + endfor; + pascercle:=5; + color ptcer[]; + for k=0 step pascercle until (360+pascercle) : + ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); + endfor; + % + color ddcer,cccer; + nbpointilles:=0; + nbtraces:=0; + path PathSection[]; + nbpathsection:=0; + Cer=image(% + for k=0 step pascercle until 360: + ddcer:=Oeil-ptcer[k div pascercle]; + cccer:=-Normal(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + if (ProduitScalaire(ddcer,cccer)>=0): + nbtraces:=nbtraces+1; + if (nbtraces=1) and (nbpointilles>0): + draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + fi; + nbpathsection:=nbpathsection+1; + PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); + else: + nbpointilles:=nbpointilles+1; + nbtraces:=0; + if (nbpointilles=1): + draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); + fi; + if k mod (2*pascercle)=0: + nbpathsection:=nbpathsection+1; + PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); + fi; + fi; + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); +% Initialisation(1500,30,20,50); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=36;%36 + subh:=1;% + incolor:=white; + outcolor:=PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetcylindre1("r="&decimal(rayoncylindre),"h="&decimal(hauteurcylindre)); + eclairage:=false; +% traits:=false; +% AffichageObjet1; + + color O,S,A,M,B,C,D,Sommet[]; + Sommet2=(0,0,0); + Sommet1-Sommet2=(0,0,hauteurcylindre); + Sommet3-Sommet2=rayoncylindre*(cosd(0),-sind(0),0); + Sommet4-Sommet2=rayoncylindre*(cosd(90),-sind(90),0); + color MSection[]; + MSection[1]-Sommet2=rayoncylindre*(CoefSection,sin(arccos(CoefSection)),0); + MSection[7]-Sommet2=rayoncylindre*(CoefSection+0.01,sin(arccos(CoefSection+0.01)),0); + MSection[2]-Sommet2=rayoncylindre*(CoefSection,-sin(arccos(CoefSection)),0); + MSection[3]-MSection[2]=Sommet1-Sommet2; + MSection[4]-MSection[1]=Sommet1-Sommet2; + MSection[5]-Sommet2=CoefSection[Sommet1,Sommet2]; + MSection[6]-MSection[5]=MSection[2]-MSection[1]; + Sommet1:=RotXYZ(Sommet1); + Sommet2:=RotXYZ(Sommet2); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + MSection[1]:=RotXYZ(MSection[1]); + MSection[2]:=RotXYZ(MSection[2]); + MSection[3]:=RotXYZ(MSection[3]); + MSection[4]:=RotXYZ(MSection[4]); + MSection[5]:=RotXYZ(MSection[5]); + MSection[6]:=RotXYZ(MSection[6]); + MSection[7]:=RotXYZ(MSection[7]); + + trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + currentpicture:=nullpicture; + + if Sections: + if Section="parallele": + if RemplisSection: + fill polygone(MSection[1],MSection[2],MSection[3],MSection[4]) withcolor CouleurSection; + fi; + color dcer,ccer; + invnormale:=if CoefSection<=0:-1 else:1 fi; + %1er côté et 3eme côté : face "basse" et face "haute" + dcer:=Oeil-Sommet3; + ccer:=-Normal(Sommet3,MSection1,MSection2); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; + % 2eme côté et 4eme coté + dcer:=Oeil-MSection7; + ccer:=-Normal(MSection7,MSection4,MSection1); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; + else: + if RemplisSection: + fill (PathSection[1] for p_=2 upto nbpathsection:--PathSection[p_] endfor--cycle) shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2)) withcolor CouleurSection; + fi; + for p_=1 upto nbpathsection: + draw (PathSection[p_] shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2))); + endfor; + fi; + fi; + + trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + + color dcer,ccer; + dcer:=Oeil-Sommet2; + ccer:=Normal(Sommet2,Sommet3,Sommet4); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + fi; + dcer:=Oeil-Sommet1; + ccer:=Normal(Sommet1,Sommet4+Sommet1-Sommet2,Sommet3+Sommet1-Sommet2); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet1,Sommet3+Sommet1-Sommet2,Sommet1,Sommet3+Sommet1-Sommet2,Sommet4+Sommet1-Sommet2); + fi; + + vardef EcrireSommets(text t)= + nb:=0; + for p_=t: + nb:=nb+1; + if bluepart(Sommet1)>bluepart(Sommet2): + if nb=1: + label.ulft(TEX(p_),Projette(Sommet1));%p_ + elseif nb=2: + dotlabel.rt(TEX(p_),Projette(Sommet2));%p_ + fi; + else: + if nb=1: + label.bot(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.ulft(TEX(p_),Projette(Sommet2)); + fi; + fi; + endfor; + enddef; + + DefinirSommets(#1); + DefinirSommetsSection(#3); + + if Axes: + draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolidePyramide[4]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + + input PfCSolid; + + boolean Pointilles,TraceArete,NommeSommets,Code,Reguliere,AutoLabel,Sections,RemplisSection; + Sections:=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + AutoLabel:=\useKV[ClesSolides]{AutoLabel}; + Pointilles=\useKV[ClesSolides]{Pointilles}; + TraceArete=\useKV[ClesSolides]{Aretes}; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Reguliere:=\useKV[ClesSolides]{Reguliere}; + % Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + hauteurpyramide=\useKV[ClesSolides]{HauteurPyramide}; + nombresommets=\useKV[ClesSolides]{SommetsPyramide}; + color PfCOutColor,DecalageSommet; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + DecalageSommet=if Reguliere:(0,0,0) else: #3 fi; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + if Pointilles=false: + pointilles:="non"; + fi; + + Ferme1:=true; + + color O,A[],S; + O=(0,0,0); + S-O=(0,0,hauteurpyramide)+DecalageSommet; + + NbS:=nombresommets; + Sommet1:=S; + ecartangle=360/(NbS-1); + for k=2 upto NbS: + if Reguliere: + repereangle:=(k-2)*ecartangle; + else: + repereangle:=(k-2)*ecartangle+(ecartangle*0.25+uniformdeviate(floor(ecartangle/2))); + fi; + Sommet[k]:=(cosd(repereangle),-sind(repereangle),0); + endfor; + Sommet[NbS+1]:=Sommet[2]; + + color TS[]; + for k=1 upto (NbS+1): + TS[k]=Sommet[k]; + endfor; + color PiedHauteur; + PiedHauteur=ProjectionsurPlan(Sommet1,Sommet2,Sommet3,Sommet4); + eclairage:=false; + traits:=false; + outcolor:=PfCOutColor; + angx:=anglerotationx; + for k=1 upto (NbS+1): + TS[k]:=RotXYZ(TS[k]); + endfor; + angx:=0; + + color MSection[]; + for p_=2 upto NbS: + MSection[p_-1]=CoefSection[Sommet[1],Sommet[p_]]; + endfor; + + DefinirSommetsSection(#4); + + vardef SectionPyramide(expr fracsection)= + save Section; + picture Section; + Section=image(% + if RemplisSection: + remplis polygone(fracsection[Sommet1,Sommet2],for p_=3 upto NbS-1:fracsection[Sommet1,Sommet[p_]],endfor fracsection[Sommet1,Sommet[NbS]]) withcolor CouleurSection; + fi; + color dcer,ccer; + for p_=2 upto NbS: + dcer:=Oeil-Sommet[p_]; + ccer:=-Normal(Sommet1,Sommet[p_],Sommet[p_+1]); + if (ProduitScalaire(dcer,ccer)>=0): + draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]); + else: + draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]) dashed evenly; + fi; + endfor; + ); + Section + enddef; + + ObjetNew1(% + TS1, for k=2 upto NbS:TS[k], endfor TS[NbS+1] + )(% + NbS-1, for p_=2 upto NbS:p_, endfor + for p=2 upto NbS: + 3,1,p+1,p,% + endfor); + AffichageObjet1; + + Sommet[NbS+1]:=Sommet[2]; + + if Sections: + draw SectionPyramide(CoefSection); + fi; + + NF:=NbS;%nombresommets; + % Fc[100] est la base + Fc[100]:=NbS-1; + for k=2 upto NbS: + Fc[100+k-1]:=k; + endfor; + for k=2 upto NF: + Fc[k*100]:=3; + Fc[k*100+1]:=1; + Fc[k*100+2]:=k+1; + Fc[k*100+3]:=k; + endfor; + DessineObjet; + + vardef EcrireSommets(text t)= + if AutoLabel: + nb:=0; + for p_=t: + nb:=nb+1; + if nb<NbS+1: + if nb>1: + label(TEX(""&p_&""),1.1[Projette(Sommet1),Projette(Sommet[nb])]); + else: + label(TEX(p_),1.1[Projette(Sommet[2]),Projette(Sommet[1])]); + fi; + fi; + endfor; + fi; + enddef; + + DefinirSommets(#1); + + if TraceArete=false: + currentpicture:=nullpicture; + fi; + if NommeSommets: + EcrireSommets(#2); + fi; + u:=0.25u; + marque_p:="croix"; + nbcroix=0; + for p_=#1: + nbcroix:=nbcroix+1; + if nbcroix<NbS+1: + pointe(p_); + fi; + endfor; + u:=1cm; + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolideCone[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Axes:=\useKV[ClesSolides]{Axes}; + Sections=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayoncone=\useKV[ClesSolides]{RayonCone}; + hauteurcone=\useKV[ClesSolides]{HauteurCone}; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + input PfCSolid; + + vardef BaseCone(text t)= + save Cer; + picture Cer; + save n; + n:=0; + for p_=t: + if color p_: + n:=n+1; + _T[n]:=p_; + fi; + endfor; + pascercle:=5; + color ptcer[]; + for k=0 step pascercle until (360+pascercle) : + ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); + endfor; + % + color ddcer,cccer; + nbpointilles:=0; + nbtraces:=0; + Cer=image(% + for k=0 step pascercle until 360: + ddcer:=Oeil-ptcer[k div pascercle]; + cccer:=-Normal(Sommet1,ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + if (ProduitScalaire(ddcer,cccer)>=0): + nbtraces:=nbtraces+1; + if (nbtraces=1) and (nbpointilles>0): + draw chemin(ptcer[k div pascercle],Sommet1); + fi; + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + else: + nbpointilles:=nbpointilles+1; + nbtraces:=0; + if (nbpointilles=1): + draw chemin(ptcer[k div pascercle],Sommet1); + fi; + if k mod (2*pascercle)=0: + draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); + fi; + fi; + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=36;%36 + subh:=1;% + incolor:=white; + outcolor:=PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetcone1("r="&decimal(rayoncone),"h="&decimal(hauteurcone)); + traits:=false; + AffichageObjet1; + + color Sommet[];%O,S,A,M,B,C,D, + Sommet2=(0,0,0); + Sommet1-Sommet2=(0,0,hauteurcone); + Sommet3-Sommet2=rayoncone*(cosd(0),-sind(0),0); + Sommet4-Sommet2=rayoncone*(cosd(90),-sind(90),0); + Sommet1:=RotXYZ(Sommet1); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + + color MSection[]; + MSection[1]=CoefSection[Sommet1,Sommet2]; + + DefinirSommetsSection(#3); + + if Sections: + if RemplisSection: + remplis Cercles(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]) withcolor CouleurSection; + fi; + trace BaseCone(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]); + fi; + + trace BaseCone(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + color dcer,ccer; + dcer:=Oeil-Sommet2; + ccer:=Normal(Sommet2,Sommet3,Sommet4); + if (ProduitScalaire(dcer,ccer)>=0): + draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); + fi; + + vardef EcrireSommets(text t)= + nb:=0; + for p_=t: + nb:=nb+1; + if bluepart(Sommet1)>bluepart(Sommet2): + if nb=1: + label.ulft(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.rt(TEX(p_),Projette(Sommet2)); + fi; + else: + if nb=1: + label.bot(TEX(p_),Projette(Sommet1)); + elseif nb=2: + dotlabel.ulft(TEX(p_),Projette(Sommet2)); + fi; + fi; + endfor; + enddef; + + DefinirSommets(#1); + + if Axes: + draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); + remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\newcommand\MPSolidePave[5]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCSolid; + + boolean Pointilles,TraceArete,NommeSommets,Code,AutoLabel,Sections,RemplisSection; + AutoLabel:=\useKV[ClesSolides]{AutoLabel}; + Pointilles=\useKV[ClesSolides]{Pointilles}; + TraceArete=\useKV[ClesSolides]{Aretes}; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Sections:=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + + string Section; + if Sections:Section=\useKV[ClesSolides]{Section};fi; + + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=\useKV[ClesSolides]{Phi}; + PfCTheta=\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + if Pointilles=false: + pointilles:="non"; + fi; + color A,B,C,D,E,F,G,H; + color Sommet[]; + trace Pave(A,B,C,D,E,F,G,H)(#3); + currentpicture:=nullpicture; + Sommet1=A; + Sommet2=B; + Sommet3=C; + Sommet4=D; + Sommet5=E; + Sommet6=F; + Sommet7=G; + Sommet8=H; + + DefinirSommets(#1); + + color MSection[]; + numeric RetiensSection[]; + numretienssection:=0; + color RetiensDefSection[]; + numretiensdefsection:=0; + if Sections: + if Section="arete": + for p_=#5: + if numeric p_: + numretienssection:=numretienssection+1; + RetiensSection[numretienssection]=p_; + elseif color p_: + numretiensdefsection:=numretiensdefsection+1; + RetiensDefSection[numretiensdefsection]=p_; + fi; + endfor; + % On dessine la section + MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; + MSection[2]=(RetiensSection[2])[RetiensDefSection[3],RetiensDefSection[4]]; + MSection[3]-MSection[2]=RetiensDefSection[6]-RetiensDefSection[5]; + MSection[4]-MSection[1]=RetiensDefSection[6]-RetiensDefSection[5]; + if RemplisSection: + fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; + fi; +% DotLabel.top(TEX("M1"),MSection[1]); +% DotLabel.top(TEX("M2"),MSection[2]); +% DotLabel.top(TEX("M3"),MSection[3]); +% DotLabel.top(TEX("M4"),MSection[4]); +% if RemplisSection: +% fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; +% fi; +% trace polygone(MSection1,MSection2,MSection3,MSection4); + color dcer,ccer; + % 1er cote -> ok + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 2eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 3eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + % 4eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + else: + %face + for p_=#5: + if numeric p_: + numretienssection:=numretienssection+1; + RetiensSection[numretienssection]=p_; + elseif color p_: + numretiensdefsection:=numretiensdefsection+1; + RetiensDefSection[numretiensdefsection]=p_; + fi; + endfor; + % On dessine la section + MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; + MSection[2]-MSection[1]=RetiensDefSection[4]-RetiensDefSection[3]; + MSection[3]-MSection[2]=RetiensDefSection[5]-RetiensDefSection[4]; + MSection[4]-MSection[1]=MSection[3]-MSection[2]; +% DotLabel.top(TEX("M1"),MSection[1]); +% DotLabel.top(TEX("M2"),MSection[2]); +% DotLabel.top(TEX("M3"),MSection[3]); +% DotLabel.top(TEX("M4"),MSection[4]); + if RemplisSection: + fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; + fi; + color dcer,ccer; + % 1er cote -> ok + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 2eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); + draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; + % 3eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); + draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + % 4eme cote + dcer:=Oeil-RetiensDefSection[4]; + ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); + draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; + fi; + %On trace la section considérée + %trace polygone(MSection1,MSection2,MSection3,MSection4); + fi; + + trace Pave(A,B,C,D,E,F,G,H)(#3); + + DefinirSommetsSection(#4); + + if TraceArete=false: + currentpicture:=nullpicture; + fi; + if NommeSommets: + EcrireSommetsPave(#2); + fi; + u:=0.25u; + marque_p:="croix"; + nbcroix=0; + for p_=#1: + nbcroix:=nbcroix+1; + if nbcroix=4: + if Pointilles: + pointe(p_); + fi; + else: + pointe(p_); + fi; + endfor; + u:=1cm; + if Code: + \useKV[ClesSolides]{Traces}; + fi; + \end{mplibcode} + \fi +} + +\newcommand\MPSolideSphere[3]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + boolean NommeSommets,Code,Sections,Axes,RemplisSection; + NommeSommets=\useKV[ClesSolides]{Sommets}; + Code=\useKV[ClesSolides]{Code}; + Axes:=\useKV[ClesSolides]{Axes}; + Sections=\useKV[ClesSolides]{Sections}; + RemplisSection=\useKV[ClesSolides]{RemplisSection}; + if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; + %Initialisation + PfCRho=\useKV[ClesSolides]{Rho}; + PfCPhi=0;%\useKV[ClesSolides]{Phi}; + PfCTheta=10;%\useKV[ClesSolides]{Theta}; + PfCDistance=\useKV[ClesSolides]{Distance}; + CoefSection=\useKV[ClesSolides]{CoefSection}; + anglerotationx=\useKV[ClesSolides]{Anglex}; + rayonsphere=\useKV[ClesSolides]{RayonSphere}; + + color PfCOutColor; + PfCOutColor=\useKV[ClesSolides]{Couleur}; + input PfCSolid; + + vardef BaseSphere= + save Cer; + picture Cer; + color PtInter.iso,PtInter[]; + vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef; + subh:=72; + Cer=image(% + if Sections: + if RemplisSection:fill (Cercles(Image((0,0,0)),Image((0,1,0)),Image((0,0,0)),Image((0,1,0)),Image((-1,0,0))) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)) withcolor CouleurSection; fi; + fi; + %Equateur + umin:=0; umax:=pi/nb; upas:=pi/nb; + vmin:=0; vpas:=2*pi/subh; vmax:=2*pi; + for l=0 upto subh-1: + PtInter[1]:=Image(Famille(umin+(0+1)*upas,vmin+l*vpas)); + PtInter[2]:=Image(Famille(umin+0*upas,vmin+l*vpas)); + PtInter[3]:=Image(Famille(umin+0*upas,vmin+(l+1)*vpas)); + PtInter[4]:=Image(Famille(umin+(0+1)*upas,vmin+(l+1)*vpas)); + PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; + if ProduitScalaire(Oeil-PtInter.iso,Normal(PtInter.iso,PtInter[4],PtInter[1]))>=0: + if Sections: + draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); + fi; + draw segment(PtInter[3],PtInter[2]); + else: + if l mod 2=0: + if Sections: + draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); + fi; + draw segment(PtInter[3],PtInter[2]); + fi; + fi; + endfor; + + % "Exterieur" + nb:=72; + subh:=18; + umin:=-pi; umax:=pi; upas:=2*pi/nb; + vpas:=2*pi/subh; vmin:=pi/2; vmax:=2*pi; + for k=0 upto nb-1: + PtInter[1]:=Image(Famille(umin+(k+1)*upas,vmin+0*vpas)); + PtInter[2]:=Image(Famille(umin+k*upas,vmin+0*vpas)); + PtInter[3]:=Image(Famille(umin+k*upas,vmin+(0+1)*vpas)); + PtInter[4]:=Image(Famille(umin+(k+1)*upas,vmin+(0+1)*vpas)); + PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; + draw segment(PtInter[2],PtInter[1]); + endfor; + ); + Cer + enddef; + + Figure(-10u,-10u,10u,10u); + Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); + typetrace:="3D"; + typerepre:="persp"; + eclairage:=false; + nb:=24;%36 + subh:=36;% + incolor:=blue; + outcolor:=white;%PfCOutColor; + Ferme1:=true; + angx:=anglerotationx; + Objetsphere1("R="&decimal(rayonsphere)); + % traits:=false; + % AffichageObjet1; + color Sommet[],SommetN,SommetS,SommetB; + Sommet1=(0,0,0); + Sommet2=(0,rayonsphere,0); + Sommet3=(-rayonsphere,0,0); + Sommet4=(0,0,rayonsphere); + SommetN=Sommet4; + SommetS=(0,0,-rayonsphere); + SommetB=(rayonsphere,0,0); + Sommet2:=RotXYZ(Sommet2); + Sommet3:=RotXYZ(Sommet3); + Sommet4:=RotXYZ(Sommet4); + SommetN:=RotXYZ(SommetN); + SommetS:=RotXYZ(SommetS); + SommetB:=RotXYZ(SommetB); + color MSection[]; + MSection[1]=CoefSection[Sommet1,SommetN]; + MSection[2]=Image((0,sqrt(1-CoefSection**2),CoefSection)); + + trace BaseSphere; + + DefinirSommets(#1); + DefinirSommetsSection(#3); + + if Axes: + draw segment(1.25[SommetN,SommetS],1.25[SommetS,SommetN]) dashed dashpattern(on6 off3 on3 off3); + remplis (fullcircle scaled 1mm) shifted(Projette(SommetN)); + remplis (fullcircle scaled 1mm) shifted(Projette(SommetS)); + fi; + + if Code: + \useKV[ClesSolides]{Traces}; + fi; + + \end{mplibcode} + \fi +} + +\def\UpdatetoksSolide#1\nil{\addtotok\toksolidelistesommets{"#1",}} +\newtoks\toksolidelistesommets% +\newtoks\toksolidelistepointssections% + +\newcommand\Solide[1][]{% + \useKVdefault[ClesSolides]% + \setKV[ClesSolides]{#1}% + \setsepchar{,}\ignoreemptyitems% + \xdef\foo{\useKV[ClesSolides]{ListeSommets}}% + \readlist*\ListeNomSommet{\foo}%\showitems\ListeNomSommet + \reademptyitems% + \toksolidelistesommets{} + \foreachitem\compteur\in\ListeNomSommet{\expandafter\UpdatetoksSolide\compteur\nil}%\the\toksolidelistesommets% + \IfStrEqCase{\useKV[ClesSolides]{Nom}}{% + {cube}{% + \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{1,1,1}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% + }% + {pave}{% + \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{Profondeur},\useKV[ClesSolides]{Largeur},\useKV[ClesSolides]{Hauteur}}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% + }% + {cone}{% + \MPSolideCone{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + {pyramide}{% + \MPSolidePyramide{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{DecalageSommet}}{\useKV[ClesSolides]{PointsSection}}% + }% + {cylindre}{% + \MPSolideCylindre{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + {sphere}{% + \MPSolideSphere{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCSommeAngles.tex b/macros/latex/contrib/profcollege/latex/PfCSommeAngles.tex new file mode 100644 index 0000000000..ec142b6a3f --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCSommeAngles.tex @@ -0,0 +1,335 @@ +%%% +% Somme des angles +%%% +\setKVdefault[ClesSommeAngle]{Detail=true,Isocele=false,Rectangle=false,Figure=false,FigureSeule=false,Angle=0,Perso=false,Echelle=1cm}% + +\def\MPFigureSommeAngle#1#2#3#4#5{% + % #1 Premier sommet + % #2 Deuxi\`eme sommet + % #3 Troisi\`eme sommet + % #4 1er angle + % #5 2eme angle + \ifluatex + %\mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + pair A,B,C,O,I;% + u:=\useKV[ClesSommeAngle]{Echelle}; + Angle:=\useKV[ClesSommeAngle]{Angle}; + boolean Rectangle,Isocele; + Rectangle=\useKV[ClesSommeAngle]{Rectangle};% + Isocele=\useKV[ClesSommeAngle]{Isocele}; + A=u*(1,1); + B-A=u*(4,0); + if Rectangle: + C=3/5[B,rotation(A,B,-90)]; + else: + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + fi; + O=CentreCercleC(A,B,C); + % On tourne pour \'eventuellement moins de lassitude :) + A:=rotation(A,O,Angle); + B:=rotation(B,O,Angle); + C:=rotation(C,O,Angle); + % On d\'efinit le centre du cercle inscrit + I=CentreCercleI(A,B,C); + % on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + % pour marquer les angles + path cc; + cc=fullcircle scaled 1u; + picture MAngle; + path cd; pair M[]; + MAngle=image(% + if Isocele:% + if Rectangle: + trace codeperp(A,B,C,5); + cd=A--(A+B+C)/3; + M1=cd intersectionpoint (cc shifted A); + trace 9/10[A,M1]--11/10[A,M1]; + cd:=C--(A+B+C)/3; + M1:=cd intersectionpoint (cc shifted C); + trace 9/10[C,M1]--11/10[C,M1]; + else: + cd=B--(A+B+C)/3; + M1=cd intersectionpoint (cc shifted B); + trace 9/10[B,M1]--11/10[B,M1]; + cd:=C--(A+B+C)/3; + M1:=cd intersectionpoint (cc shifted C); + trace 9/10[C,M1]--11/10[C,M1]; + fi; + fi; + if Rectangle: + trace codeperp(A,B,C,5); + else: + draw (cc shifted B); + fi; + draw (cc shifted A); + draw (cc shifted C); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + % on labelise + label(btex #1 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #3 etex,1.2[O,C]); + % Codage + if Isocele: + marque_s:=marque_s/2; + if Rectangle: + draw Codelongueur(A,B,B,C,2); + else: + draw Codelongueur(A,B,A,C,2); + fi; + marque_s:=marque_s*2; + fi; + % Affichage des angles: + if Isocele: + if Rectangle: + label(btex ? etex,A+0.95u*unitvector(I-A)); + else: + if #4>#5:%Cas où b est vide donc on affiche la mesure commune + label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A)); + label(btex ? etex,B+0.95u*unitvector(I-B)); + else: + label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B)); + label(btex ? etex,A+0.95u*unitvector(I-A)); + fi; + fi; + else: + if Rectangle: + if #4>#5: + label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C)); + else: + label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); + fi; + else: + label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B)); + label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); + fi; + label(btex ? etex,A+0.95u*unitvector(I-A)); + fi; + \end{mplibcode} + %\mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesSommeAngle]{Echelle};boolean Rectangle,Isocele; + Rectangle=\useKV[ClesSommeAngle]{Rectangle};Isocele=\useKV[ClesSommeAngle]{Isocele};Angle:=\useKV[ClesSommeAngle]{Angle};}] + pair A,B,C,O,I;% + A=u*(1,1); + B-A=u*(4,0); + if Rectangle: + C=3/5[B,rotation(A,B,-90)]; + else: + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + fi; + O=CentreCercleC(A,B,C); + % On tourne pour \'eventuellement moins de lassitude :) + A:=rotation(A,O,Angle); + B:=rotation(B,O,Angle); + C:=rotation(C,O,Angle); + % On d\'efinit le centre du cercle inscrit + I=CentreCercleI(A,B,C); + % on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + % pour marquer les angles + path cc; + cc=fullcircle scaled 1u; + picture MAngle; + path cd; pair M[]; + MAngle=image(% + if Isocele:% + if Rectangle: + trace codeperp(A,B,C,5); + cd=A--(A+B+C)/3; + M1=cd intersectionpoint (cc shifted A); + trace 9/10[A,M1]--11/10[A,M1]; + cd:=C--(A+B+C)/3; + M1:=cd intersectionpoint (cc shifted C); + trace 9/10[C,M1]--11/10[C,M1]; + else: + cd=B--(A+B+C)/3; + M1=cd intersectionpoint (cc shifted B); + trace 9/10[B,M1]--11/10[B,M1]; + cd:=C--(A+B+C)/3; + M1:=cd intersectionpoint (cc shifted C); + trace 9/10[C,M1]--11/10[C,M1]; + fi; + fi; + if Rectangle: + trace codeperp(A,B,C,5); + else: + draw (cc shifted B); + fi; + draw (cc shifted A); + draw (cc shifted C); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + % on labelise + label(btex #1 etex,1.2[O,A]); + label(btex #2 etex,1.2[O,B]); + label(btex #3 etex,1.2[O,C]); + % Codage + if Isocele: + marque_s:=marque_s/2; + if Rectangle: + draw Codelongueur(A,B,B,C,2); + else: + draw Codelongueur(A,B,A,C,2); + fi; + marque_s:=marque_s*2; + fi; + % Affichage des angles: + if Isocele: + if Rectangle: + label(btex ? etex,A+0.95u*unitvector(I-A)); + else: + if #4>#5:%Cas où b est vide donc on affiche la mesure commune + label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A)); + label(btex ? etex,B+0.95u*unitvector(I-B)); + else: + label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B)); + label(btex ? etex,A+0.95u*unitvector(I-A)); + fi; + fi; + else: + if Rectangle: + if #4>#5: + label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C)); + else: + label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); + fi; + else: + label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B)); + label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); + fi; + label(btex ? etex,A+0.95u*unitvector(I-A)); + fi; + \end{mpost} + \fi +} + +\xdef\RedactionSomme{} + +\newcommand\RedactionSom[4][]{% + % #1 : nom du triangle pA pB pC + % #2 : mesure de l'angle pApBpC + % #3 : mesure de l'angle pBpCpA + \useKVdefault[ClesSommeAngle]% + \setKV[ClesSommeAngle]{#1}% + % On r\'ecup\`ere les noms des sommets. + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + \xdef\NomTriangle{\NomA\NomB\NomC}% + \xdef\NomSommetB{\NomB}% + \xdef\NomSommetA{\NomA}% + \xdef\NomSommetC{\NomC}% + % On r\'edige + \ifboolKV[ClesSommeAngle]{Perso}{\RedactionSomme}{Dans le triangle $\NomA\NomB\NomC$, \ifboolKV[ClesSommeAngle]{Rectangle}{ rectangle \ifboolKV[ClesSommeAngle]{Isocele}{isocèle }{}en $\NomB$, }{\ifboolKV[ClesSommeAngle]{Isocele}{ isoc\`ele en $\NomA$, }}% + on a :}% + \ifboolKV[ClesSommeAngle]{Rectangle}{% + \ifboolKV[ClesSommeAngle]{Isocele}{% + \ifx\bla#3\bla% + \begin{align*} + 2\times\widehat{\NomB\NomA\NomC}&=\ang{90}\\% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\frac{\ang{90}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{45}}% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{45}}{}% + \end{align*} + \fi + }{% + \ifx\bla#3\bla% + \begin{align*} + \widehat{\NomB\NomA\NomC}+\widehat{\NomB\NomC\NomA}&=\ang{90}\\% + \widehat{\NomB\NomA\NomC}+\ang{#4}&=\ang{90}\\% + \xdef\totalangle{\fpeval{90-#4}}\ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{90}-\ang{#4}\\}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}{}% + \end{align*} + \fi + }% + }{% + \ifboolKV[ClesSommeAngle]{Isocele}{% + \ifx\bla#4\bla% + \begin{align*}% + \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + 2\times\ang{#3}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + \xdef\sommeangle{\fpeval{2*#3}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}% + \end{align*}% + \xdef\ResultatAngle{\totalangle}% + \else% + \begin{align*}% + \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + 2\times\widehat{\NomA\NomB\NomC}+\ang{#4}&=\ang{180}\\% + \xdef\totalangle{\fpeval{180-#4}}% + \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{180}-\ang{#4}\\}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}% + \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}}%\\ + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}\\}{}% + \end{align*}% + \xdef\ResultatAngle{\fpeval{0.5*(180-#4)}}% + \fi% + }{% + \begin{align*}% + \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + \ang{#3}+\ang{#4}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + \xdef\sommeangle{\fpeval{#3+#4}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}%\\ + \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}% + \end{align*}% + \xdef\ResultatAngle{\totalangle}% + }% + }% +}% + +\newcommand\SommeAngles[4][]{% Macro calculant la mesure de l'angle pCpApB + % #1 : nom du triangle pA pB pC + % #2 : mesure de l'angle pApBpC + % #3 : mesure de l'angle pBpCpA + \useKVdefault[ClesSommeAngle]%obligatoire car la macro n'est pas dans un groupe. + \setKV[ClesSommeAngle]{#1}%lit les arguments optionnels + % On r\'ecup\`ere les noms des sommets. + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + % Figure ou pas ? + \ifboolKV[ClesSommeAngle]{FigureSeule}{% + \ifx\bla#3\bla% + \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}% + \else% + \ifx\bla#4\bla% + \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}% + \else% + \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}% + \fi% + \fi% + }{% + \ifboolKV[ClesSommeAngle]{Figure}{% + \begin{multicols}{2}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \ifx\bla#3\bla% + \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}\]% + \else% + \ifx\bla#4\bla% + \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}\]% + \else% + \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}\]% + \fi% + \fi% + \par\columnbreak\par% + \RedactionSom[#1]{#2}{#3}{#4}% + \end{multicols}% + }{% on r\'edige + \RedactionSom[#1]{#2}{#3}{#4}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCSquaro.tex b/macros/latex/contrib/profcollege/latex/PfCSquaro.tex new file mode 100644 index 0000000000..f6b67bdb52 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCSquaro.tex @@ -0,0 +1,107 @@ +%%% +% Squaro +%%% +\setKVdefault[Squaro]{Solution=false,Longueur=8,Largeur=8,Echelle=8mm,Nom=Jeu1,Graines=false} +\defKV[Squaro]{Graine=\setKV[Squaro]{Graines}}% + +\NewDocumentCommand\SquarO{o}{% + \useKVdefault[Squaro]% + \setKVdefault[Squaro]{#1}% + \ifboolKV[Squaro]{Solution}{\BuildSquaroSolution}{\BuildSquaro}% +} + +\NewDocumentCommand\BuildSquaro{}{% + \ifluatex + \mplibforcehmode + \xdef\PfCSquaroNom{\useKV[Squaro]{Nom}}% + \begin{mplibcode}[\PfCSquaroNom] + numeric Longueur,Largeur; + Longueur=\useKV[Squaro]{Longueur}; + Largeur=\useKV[Squaro]{Largeur}; + boolean Solution,Graines; + Solution=\useKV[Squaro]{Solution}; + Graines:=\useKV[Squaro]{Graines}; + if Graines: + randomseed:=\useKV[Squaro]{Graine}; + fi; + + u:=\useKV[Squaro]{Echelle}; + + p:=0; + pair A[];%centre des carrés. + boolean Allume[][]; + + for k=0 upto Longueur-1: + for l=0 upto Largeur-1: + p:=p+1; + A[p]=u*(k,-l); + trace (unitsquare scaled u) shifted A[p]; + endfor; + endfor; + + for k=0 upto Largeur: + for l=0 upto Longueur: + m:=uniformdeviate(1); + if m<0.5: + Allume[k][l]=true; + fill cercles(u*(l,-k+1),1mm) if Solution=false:withcolor white fi; + else: + Allume[k][l]=false; + fill cercles(u*(l,-k+1),1mm) withcolor white; + fi; + trace cercles(u*(l,-k+1),1mm); + endfor; + endfor; + + for k=0 upto Largeur-1: + for l=0 upto Longueur-1: + Retiens:=0; + if Allume[k][l]:Retiens:=Retiens+1 fi; + if Allume[k][l+1]:Retiens:=Retiens+1 fi; + if Allume[k+1][l]:Retiens:=Retiens+1 fi; + if Allume[k+1][l+1]:Retiens:=Retiens+1 fi; + label(TEX(decimal(Retiens)),u*(l+0.5,-k+0.5)); + endfor; + endfor; + \end{mplibcode} + \fi +} + +\NewDocumentCommand\BuildSquaroSolution{}{% + \ifluatex + \mplibforcehmode + \xdef\PfCSquaroNom{\useKV[Squaro]{Nom}}% + \begin{mplibcode}[\PfCSquaroNom] + u:=\useKV[Squaro]{Echelle}; + p:=0; + for k=0 upto Longueur-1: + for l=0 upto Largeur-1: + p:=p+1; + trace (unitsquare scaled u) shifted A[p]; + endfor; + endfor; + + for k=0 upto Largeur: + for l=0 upto Longueur: + if Allume[k][l]=true: + fill cercles(u*(l,-k+1),1mm); + else: + fill cercles(u*(l,-k+1),1mm) withcolor white; + fi; + trace cercles(u*(l,-k+1),1mm); + endfor; + endfor; + + for k=0 upto Largeur-1: + for l=0 upto Longueur-1: + Retiens:=0; + if Allume[k][l]:Retiens:=Retiens+1 fi; + if Allume[k][l+1]:Retiens:=Retiens+1 fi; + if Allume[k+1][l]:Retiens:=Retiens+1 fi; + if Allume[k+1][l+1]:Retiens:=Retiens+1 fi; + label(TEX(decimal(Retiens)),u*(l+0.5,-k+0.5)); + endfor; + endfor; + \end{mplibcode} + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCStatistiques.tex b/macros/latex/contrib/profcollege/latex/PfCStatistiques.tex new file mode 100644 index 0000000000..3b86cd3892 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCStatistiques.tex @@ -0,0 +1,1719 @@ +%%% +% Statistiques +%%% +\newcommand\NbDonnees{}% +\newcommand\SommeDonnees{}% +\newcommand\EffectifTotal{}% +\newcommand\Moyenne{}% +\newcommand\Etendue{}% +\newcommand\Mediane{}% +\newcommand\DonneeMax{}% +\newcommand\DonneeMin{}% +\newcommand\EffectifMax{}% + +\setKVdefault[ClesStat]{ColVide=0,CaseVide=false,EffVide=false,% +FreqVide=false,AngVide=false,ECCVide=false,TotalVide=false,Sondage=false,Liste=false,% +Tableau=false,Stretch=1,Frequence=false,EffectifTotal=false,% +Etendue=false,Moyenne=false,SET=false,ValeurExacte=false,Mediane=false,QuartileUn=false,QuartileTrois=false,Total=false,Concret=false,% +Unite={},Largeur=1cm,Precision=2,PrecisionF=0,Donnee=Valeurs,Effectif=Effectif,Grille=false,Origine=0,Angle=false,SemiAngle=false,Qualitatif=false,TableauVide=false,ECC=false,Coupure=10,CouleurTab=gray!15,Graphique=false,Batons=true,% +% Pour les diags batons +EpaisseurBatons=1,ListeCouleursB={a},Lecture=false,LectureFine=false,AideLecture=false,Reponses=false,DonneesSup=false,AbscisseRotation=false,Tiret=false,AngleRotationAbscisse=0,Pasx=1,Pasy=1,Unitex=0.5,Unitey=0.5,Depart=0,CouleurDefaut=black,% +% Pour les diags circulaires +Rayon=3cm,AffichageAngle=false,AffichageDonnee=false,ListeCouleurs={white},Hachures=false,LectureInverse=false,EcartHachures=0.25,EpaisseurHachures=1,Legende,LegendeVide=false,ACompleter=false,% +%Pour les représentations +Representation=false,% +%Pour les barres horizontales +Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dispo +}% +%compl\'ements +\defKV[ClesStat]{AngleRotationAbscisse=\setKV[ClesStat]{AbscisseRotation}}% +\defKV[ClesStat]{AffichageDonnees=\setKV[ClesStat]{AffichageAngle=false}\setKV[ClesStat]{AffichageDonnee}}% +\defKV[ClesStat]{CasesVides=\setKV[ClesStat]{CaseVide}}% +\defKV[ClesStat]{LegendesVides=\setKV[ClesStat]{LegendeVide}}% +% La construction du tableau +\def\addtotok#1#2{#1\expandafter{\the#1#2}}% +\newtoks\tabtoksa\newtoks\tabtoksb\newtoks\tabtoksc% +\def\updatetoks#1/#2\nil{\addtotok\tabtoksa{\ifboolKV[ClesStat]{Qualitatif}{}{&\num{#1}}}\addtotok\tabtoksb{&\num{#2}}}% +% +\newcounter{PfCCompteLignes}% +% +\def\BuildtabStat{% %%Tableau sans total + \setcounter{PfCCompteLignes}{0}% + \tabtoksa{\useKV[ClesStat]{Donnee}}\tabtoksb{\useKV[ClesStat]{Effectif}}% + \foreachitem\compteur\in\ListeComplete{\expandafter\updatetoks\compteur\nil}% + \ifboolKV[ClesStat]{Total}{% + \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}% + \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen+1}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}% + \CodeBefore% + \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}% + \columncolor{\useKV[ClesStat]{CouleurTab}}{1}% + \Body% + \the\tabtoksa&Total\\% + \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb&\num{\EffectifTotal}}\\% + \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{100}}\\}{}% + \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{360}}\\}{}% + \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{180}}\\}{}% + \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\num{\EffectifTotal}}}\\}{}% + \CodeAfter% + % On crée la liste des colonnes à vider + \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{% + \xdef\FooStat{\useKV[ClesStat]{ColVide}}% + \setsepchar{,}% + \readlist*\ListeColonnesAVider{\FooStat}% + \foreachitem\compteur\in\ListeColonnesAVider{% + \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});% + }% + }{}% + % On crée la liste des cases à vider + \ifboolKV[ClesStat]{CaseVide}{% + \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesAVider{\FooStatCases}% + \foreachitem\compteur\in\ListeCasesAVider{% + \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});% + }% + }{}% + % On retrace le tableau + %Les colonnes + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+3}}}\do{% + \tikz\draw (row-1-|col-##1) -- (last-|col-##1);% + }% + % Les lignes + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{% + \tikz\draw (row-##1-|col-1) -- (row-##1-|last);% + }% + \end{NiceTabular}% + }{% + \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}% + \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}% + \CodeBefore% + \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}% + \columncolor{\useKV[ClesStat]{CouleurTab}}{1}% + \Body% + \the\tabtoksa\\% + \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb}\\% + \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}\\}{}% + \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}\\}{}% + \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}\\}{}% + \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}\\}{}% + \CodeAfter% + % On crée la liste des colonnes à vider + \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{% + \xdef\FooStat{\useKV[ClesStat]{ColVide}}% + \setsepchar{,}% + \readlist*\ListeColonnesAVider{\FooStat}% + \foreachitem\compteur\in\ListeColonnesAVider{% + \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});% + }% + }{}% + % On crée la liste des cases à vider + \ifboolKV[ClesStat]{CaseVide}{% + \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesAVider{\FooStatCases}% + \foreachitem\compteur\in\ListeCasesAVider{% + \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});% + }% + }{}% + % On retrace le tableau + %Les colonnes + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+2}}}\do{% + \tikz\draw (row-1-|col-##1) -- (last-|col-##1);% + }% + % Les lignes + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{% + \tikz\draw (row-##1-|col-1) -- (row-##1-|last);% + }% + \end{NiceTabular}% + }% +}% + +% Pour construire le diagramme en barres horizontales +\def\UpdatetoksHor#1/#2/#3\nil{\addtotok\toklistenomhor{"#1",}\addtotok\toklistedonhor{#3,}\addtotok\toklisteaffhor{"#2",}}% + +\newcommand\buildgraphbarhor{% + \newtoks\toklistenomhor% + \newtoks\toklistedonhor% + \newtoks\toklisteaffhor% + \newtoks\toklistecouleur% + \xdef\PfCfooStat{}% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,2],}% + }% + \xdef\DivMax{\fpeval{max(\PfCfooStat)}}% + \xdef\ExposantDivMax{\fpeval{round(ln(\DivMax)/ln(10))}}% + \xdef\DivMax{\fpeval{10**\ExposantDivMax}}% + \xdef\PfCfooStat{}% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,1]/\ListeComplete[##1,2]/\fpeval{\ListeComplete[##1,2]/\DivMax},}% + }% + \readlist*\ListeCompleteDiagHor{\PfCfooStat}% + \foreachitem\compteur\in\ListeCompleteDiagHor{\expandafter\UpdatetoksHor\compteur\nil}% + \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}% + \readlist*\ListeCouleur{\ListeAvantCouleurs}% + \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% + \NewMPDiagBarreHor{\the\toklistenomhor}{\the\toklistedonhor}{\the\toklisteaffhor}{\the\toklistecouleur}% +}% + +% Pour construire le diagramme en bâtons +\def\Updatetoks#1/#2\nil{\addtotok\toklistepoint{(#1,#2),}}% +\newcommand\buildgraph[1][]{% + \newtoks\toklistepoint% + \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoks\compteur\nil}% + \newtoks\toklistecouleur% + \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}% + \readlist*\ListeCouleur{\ListeAvantCouleurs}% + \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% + \MPStatNew{\the\toklistepoint}{\the\toklistecouleur}% +}% + +% Pour construire le diagramme en bâtons qualitatif +\def\Updatetoksq#1/#2\nil{\addtotok\toklistepointq{"#1",#2,}}% +\newcommand\buildgraphq[1][]{% + \newtoks\toklistepointq% + \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}% + \newtoks\toklistecouleur% + \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}% + \readlist*\ListeCouleur{\ListeAvantCouleurs}% + \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% + \MPStatNew{\the\toklistepointq}{\the\toklistecouleur}% +}% + +\def\UpdateCoul#1\nil{\addtotok\toklistecouleur{#1,}}% +\def\UpdateLegende#1\nil{\addtotok\toklistelegende{#1,}}% + +% Pour construire le diagramme circulaire qualitatif +\def\buildgraphcq#1{% + \newtoks\toklistepointq\toklistepointq{}% + \newtoks\toklistecouleur\toklistecouleur{}% + \newtoks\toklistelegende\toklistelegende{}% + \ifboolKV[ClesStat]{LegendeVide}{% + \xdef\foo{\useKV[ClesStat]{LegendesVides}}% + \readlist*\ListeLegendesAEffacer{\foo}% + }{\xdef\foo{0}\readlist*\ListeLegendesAEffacer{\foo}% + }% + \foreachitem\compteur\in\ListeLegendesAEffacer{\expandafter\UpdateLegende\compteur\nil}% + % + \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}% + \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}% + \readlist*\ListeCouleur{\ListeAvantCouleurs}% + \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% + \NewMPStatCirculaireQ{\the\toklistepointq}{#1}{\the\toklistecouleur}{\the\toklistelegende}% +}% + +%% calcul des fr\'equences +\newcommand\CalculFrequence[1]{% + \fpeval{round(\ListeComplete[#1,2]*100/\EffectifTotal,\useKV[ClesStat]{PrecisionF})} +} + +%% calcul des angles +\newcommand\CalculAngle[1]{% + \fpeval{round(\ListeComplete[#1,2]*360/\EffectifTotal,0)} +} +\newcommand\CalculSemiAngle[1]{% + \fpeval{round(\ListeComplete[#1,2]*180/\EffectifTotal,0)} +} + +%% calcul des ECC +\newcount\CompteurECC% +\newcount\CompteurECCTotal% + +\newcommand\CalculECC[1]{% + \xdef\TotalECC{0}% + \CompteurECC=1% + \CompteurECCTotal=\numexpr#1+1% + \whiledo{\CompteurECC < \CompteurECCTotal}{% + \xdef\TotalECC{\fpeval{\TotalECC+\ListeComplete[\the\CompteurECC,2]}}% + \CompteurECC=\numexpr\CompteurECC+1% + }% + \num{\TotalECC}% +} + +% Construction d'un diagramme en barres horizontal +\newcommand\NewMPDiagBarreHor[4]{% + % #1 Liste des noms + % #2 Liste des valeurs associées + % #3 Liste des valeurs à afficher (si pb calcul MP) + % #4 Liste des couleurs + \ifluatex% + \mplibforcehmode% + \begin{mplibcode}% + Longueur:=\useKV[ClesStat]{Longueur}; + Hauteur:=\useKV[ClesStat]{Hauteur}; + Ecart:=\useKV[ClesStat]{EcartBarre}; + ExposantDivMax:=\ExposantDivMax; + ecarthachures=\useKV[ClesStat]{EcartHachures}; + epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; + boolean Hachures; + Hachures=\useKV[ClesStat]{Hachures}; + boolean Bicolore; + Bicolore=\useKV[ClesStat]{Bicolore}; + boolean Grille; + Grille=\useKV[ClesStat]{Grille}; + boolean AffichageDonnee; + AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; + boolean LegendeVide; + LegendeVide=\useKV[ClesStat]{LegendeVide}; + vardef CalculNombreDonneesEtDonneeMax(text t)= + nbdon:=0;%nombre de données + DonneeMax:=0;%donnée DonneeMaximale + for p_=t: + nbdon:=nbdon+1; + if p_>DonneeMax: + DonneeMax:=p_; + fi; + endfor; + enddef; + vardef ListeDonnees(text t)= + n:=0; + for p_=t: + n:=n+1; + Donnees[n]:=p_; + endfor; + enddef; + vardef RecuperationCouleurs(text t)= + color Col[]; + n:=0; + for p_=t: + n:=n+1; + Col[n]=p_; + endfor; + enddef; + vardef TraceDiag= + if Grille: + pair Zz[];%Pour déterminer "le dernier point" + Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart); + Zz2=(0,(Hauteur+Ecart)); + Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart); + Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi; + if ExposantDivMax=0: + for k=1 upto DonneeMax+1: + trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white; + endfor; + else: + for k=1 upto (floor(DonneeMax*10+2)): + trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white; + endfor; + fi; + if ExposantDivMax=0: + for k=1 upto (DonneeMax+1): + label.bot(TEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0)); + endfor; + else: + if ExposantDivMax<5: + for k=1 upto (floor(DonneeMax*10+2)): + label.bot(TEX("\num{\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0)); + endfor; + else: + dotlabel.bot(TEX("\num{\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1); + fi; + fi; + fi; + for k=0 upto nbdon-1: + path RectangleDonnee; + RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart)); + if Hachures: + fill RectangleDonnee withcolor white; + trace Hachurage(RectangleDonnee,60 if + (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi) + withpen pencircle scaled epaisseurhachures; + else: + remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi; + fi; + trace RectangleDonnee; + endfor; + if Grille: + drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5; + drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5; + fi; + enddef; + vardef AffichageNom(text t)= + k:=0; + for p_=t: + label.lft(TEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart))); + k:=k+1; + endfor; + enddef; + vardef AffichageDonnees(text t)= + k:=0; + for p_=t: + label.rt(TEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart))); + k:=k+1; + endfor; + enddef; + CalculNombreDonneesEtDonneeMax(#2); + ListeDonnees(#2); + RecuperationCouleurs(#4); + TraceDiag; + if LegendeVide=false: + AffichageNom(#1); + fi; + if AffichageDonnee: + AffichageDonnees(#3); + fi; + \end{mplibcode} + \else% + \begin{mpost}[mpsettings={% + Longueur:=\useKV[ClesStat]{Longueur}; + Hauteur:=\useKV[ClesStat]{Hauteur}; + Ecart:=\useKV[ClesStat]{EcartBarre}; + ExposantDivMax:=\ExposantDivMax; + ecarthachures=\useKV[ClesStat]{EcartHachures}; + epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; + boolean Hachures; + Hachures=\useKV[ClesStat]{Hachures}; + boolean Bicolore; + Bicolore=\useKV[ClesStat]{Bicolore}; + boolean Grille; + Grille=\useKV[ClesStat]{Grille}; + boolean AffichageDonnee; + AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; + boolean LegendeVide; + LegendeVide=\useKV[ClesStat]{LegendeVide}; + }] + vardef CalculNombreDonneesEtDonneeMax(text t)= + nbdon:=0;%nombre de données + DonneeMax:=0;%donnée DonneeMaximale + for p_=t: + nbdon:=nbdon+1; + if p_>DonneeMax: + DonneeMax:=p_; + fi; + endfor; + enddef; + vardef ListeDonnees(text t)= + n:=0; + for p_=t: + n:=n+1; + Donnees[n]:=p_; + endfor; + enddef; + vardef RecuperationCouleurs(text t)= + color Col[]; + n:=0; + for p_=t: + n:=n+1; + Col[n]=p_; + endfor; + enddef; + vardef TraceDiag= + if Grille: + pair Zz[];%Pour déterminer "le dernier point" + Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart); + Zz2=(0,(Hauteur+Ecart)); + Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart); + Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi; + if ExposantDivMax=0: + for k=1 upto DonneeMax+1: + trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white; + endfor; + else: + for k=1 upto (floor(DonneeMax*10+2)): + trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white; + endfor; + fi; + if ExposantDivMax=0: + for k=1 upto (DonneeMax+1): + label.bot(LATEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0)); + endfor; + else: + if ExposantDivMax<5: + for k=1 upto (floor(DonneeMax*10+2)): + label.bot(LATEX("\num{\noexpand\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0)); + endfor; + else: + dotlabel.bot(LATEX("\num{\noexpand\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1); + fi; + fi; + fi; + for k=0 upto nbdon-1: + path RectangleDonnee; + RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart)); + if Hachures: + fill RectangleDonnee withcolor white; + trace Hachurage(RectangleDonnee,60 if + (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi) + withpen pencircle scaled epaisseurhachures; + else: + remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi; + fi; + trace RectangleDonnee; + endfor; + if Grille: + drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5; + drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5; + fi; + enddef; + vardef AffichageNom(text t)= + k:=0; + for p_=t: + label.lft(LATEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart))); + k:=k+1; + endfor; + enddef; + vardef AffichageDonnees(text t)= + k:=0; + for p_=t: + label.rt(LATEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart))); + k:=k+1; + endfor; + enddef; + CalculNombreDonneesEtDonneeMax(#2); + ListeDonnees(#2); + RecuperationCouleurs(#4); + TraceDiag; + if LegendeVide=false: + AffichageNom(#1); + fi; + if AffichageDonnee: + AffichageDonnees(#3); + fi; + \end{mpost} + \fi% +}% + +% Construction du graphique en bâtons +\newcommand\MPStatNew[2]{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + maxx:=0; + maxy:=0; + unitex:=\useKV[ClesStat]{Unitex}*cm; + unitey:=\useKV[ClesStat]{Unitey}*cm; + xpartorigine:=\useKV[ClesStat]{Origine}; + AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse}; + boolean Rotation; + Rotation=\useKV[ClesStat]{AbscisseRotation}; + boolean Lecture; + Lecture:=\useKV[ClesStat]{Lecture}; + boolean LectureFine; + LectureFine:=\useKV[ClesStat]{LectureFine}; + boolean AideLecture; + AideLecture:=\useKV[ClesStat]{AideLecture}; + boolean DonneesSup; + DonneesSup:=\useKV[ClesStat]{DonneesSup}; + boolean Reponses; + Reponses:=\useKV[ClesStat]{Reponses}; + epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons}; + boolean Qualitatif; + Qualitatif=\useKV[ClesStat]{Qualitatif}; + boolean Tiret; + Tiret=\useKV[ClesStat]{Tiret}; + color CoulDefaut; + CoulDefaut=\useKV[ClesStat]{CouleurDefaut}; + Depart=\useKV[ClesStat]{Depart}; + % on r\'ecup\`ere les couleurs + color Col[]; + n:=0; + for p_=#2: + n:=n+1; + if color p_: + Col[n]=p_; + else: + Col[n]=CoulDefaut; + fi; + endfor; + % + pair A[],B[],P[]; + vardef toto(text t)=%points quantitatif + n:=0; + for p_=t: + if pair p_: + n:=n+1; + P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey); + if xpart(p_)>maxx: + maxx:=xpart(p_)-(xpartorigine); + fi; + if ypart(p_)>maxy: + maxy:=ypart(p_); + fi; + A[n]=unitex*(xpart(p_)-(xpartorigine),0); + B[n]=unitey*(0,ypart(p_)); + fi; + endfor; + enddef; + vardef tutu(text t)=%points qualitatif + n:=0; + for p_=t: + if numeric p_: + P[n]=((n)*unitex,unitey*(p_-Depart)); + B[n]=(0,unitey*(p_-Depart)); + if p_>maxy: + maxy:=p_; + fi; + else: + n:=n+1; + A[n]=unitex*(n,0); + fi; + endfor; + maxy:=maxy-Depart; + maxx:=n; + enddef; + vardef tata(text t)=%affichage quantitatif + l=0; + for p_=t: + if pair p_: + l:=l+1; + if Rotation: + label.bot(TEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]); + else : + label.bot(TEX("\num{"&decimal(xpart(p_))&"}"),A[l]); + fi; + if Reponses: + if DonneesSup: + label.top(TEX("\num{"&decimal(ypart(p_))&"}"),P[l]); + else: + if Tiret: + trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); + label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); + else: + dotlabel.lft(TEX("\num{"&decimal(ypart(p_))&"}"),B[l]); + fi; + fi; + fi; + fi; + endfor; + enddef; + vardef titi(text t)=%affichage qualitatif + l:=0; + for p_=t: + if numeric p_: + if Reponses: + if DonneesSup: + label.top(TEX("\num{"&decimal(p_)&"}"),P[l]); + else: + if Tiret: + trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); + label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); + else: + dotlabel.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); + fi; + fi; + fi; + else: + l:=l+1; + if Rotation: + if AngleRotation<>0: + picture TEXTELABEL; + TEXTELABEL=image( + labeloffset:=labeloffset*2; + label.lft(TEX(p_),A[l]); + labeloffset:=labeloffset/2; + ); + trace rotation(TEXTELABEL,A[l],AngleRotation); + else : + label.bot(TEX(p_),A[l]); + fi; + fi; + fi; + endfor; + enddef; + if Qualitatif: tutu(#1); else: toto(#1); fi; + boolean Grille; + Grille:=\useKV[ClesStat]{Grille}; + Pasx:=\useKV[ClesStat]{Pasx}; + Pasy:=\useKV[ClesStat]{Pasy}; + if Grille: + drawoptions(withcolor 0.75white); + for k=0 step Pasx until ((maxx+1)): + trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy)); + endfor; + for k=0 step Pasy until ((maxy+2*Pasy)): + trace (0,k*unitey)--(unitex*(maxx+1),k*unitey); + endfor; + drawoptions(); + fi; + if epaisseurbatons<>0: + for k=1 upto n: + fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi; + if AideLecture: + draw B[k]--P[k] dashed evenly; + fi; + endfor; + fi; + if LectureFine: + for k=0 step Pasy until ((maxy+1*Pasy)): + if Tiret: + trace (1pt,k*unitey)--(-1pt,k*unitey); + label.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey)); + else: + dotlabel.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey)); + fi; + endfor; + fi; + if Lecture: + for k=0 step Pasy until Pasy: + if Tiret: + trace (1pt,k*unitey)--(-1pt,k*unitey); + label.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + else: + dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + endfor; + fi; + drawarrow (0,0)--unitex*(maxx+1,0); + drawarrow (0,0)--unitey*(0,maxy+2*Pasy); + label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0)); + label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy)); + if Qualitatif: titi(#1); else:tata(#1); fi; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + unitex:=\useKV[ClesStat]{Unitex}*cm; + unitey:=\useKV[ClesStat]{Unitey}*cm; + xpartorigine:=\useKV[ClesStat]{Origine}; + AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse}; + boolean Rotation; + Rotation=\useKV[ClesStat]{AbscisseRotation}; + boolean Lecture; + Lecture:=\useKV[ClesStat]{Lecture}; + boolean LectureFine; + LectureFine:=\useKV[ClesStat]{LectureFine}; + boolean AideLecture; + AideLecture:=\useKV[ClesStat]{AideLecture}; + boolean DonneesSup; + DonneesSup:=\useKV[ClesStat]{DonneesSup}; + boolean Reponses; + Reponses:=\useKV[ClesStat]{Reponses}; + epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons}; + boolean Qualitatif; + Qualitatif=\useKV[ClesStat]{Qualitatif}; + boolean Tiret; + Tiret=\useKV[ClesStat]{Tiret}; + color CoulDefaut; + CoulDefaut=\useKV[ClesStat]{CouleurDefaut};} + Depart=\useKV[ClesStat]{Depart}; + ] + maxx:=0; + maxy:=0; + % on r\'ecup\`ere les couleurs + color Col[]; + n:=0; + for p_=#2: + n:=n+1; + if color p_: + Col[n]=p_; + else: + Col[n]=CoulDefaut; + fi; + endfor; + % + pair A[],B[],P[]; + vardef toto(text t)=%points quantitatif + n:=0; + for p_=t: + if pair p_: + n:=n+1; + P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey); + if xpart(p_)>maxx: + maxx:=xpart(p_)-(xpartorigine); + fi; + if ypart(p_)>maxy: + maxy:=ypart(p_); + fi; + A[n]=unitex*(xpart(p_)-(xpartorigine),0); + B[n]=unitey*(0,ypart(p_)); + fi; + endfor; + enddef; + vardef tata(text t)=%affichage quantitatif + l=0; + for p_=t: + if pair p_: + l:=l+1; + if Rotation: + label.bot(LATEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]); + else : + label.bot(LATEX("\num{"&decimal(xpart(p_))&"}"),A[l]); + fi; + if Reponses: + if DonneesSup: + label.top(LATEX("\num{"&decimal(ypart(p_))&"}"),P[l]); + else: + if Tiret: + trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); + label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); + else: + dotlabel.lft(LATEX("\num{"&decimal(ypart(p_))&"}"),B[l]); + fi; + fi; + fi; + fi; + endfor; + enddef; + vardef tutu(text t)=%points qualitatif + n:=0; + for p_=t: + if numeric p_: + P[n]=((n)*unitex,unitey*p_); + B[n]=(0,unitey*p_); + if p_>maxy: + maxy:=p_; + fi; + else: + n:=n+1; + A[n]=unitex*(n,0); + fi; + endfor; + maxx:=n; + enddef; + vardef titi(text t)=%affichage qualitatif + l:=0; + for p_=t: + if numeric p_: + if Reponses: + if DonneesSup: + label.top(LATEX("\num{"&decimal(p_)&"}"),P[l]); + else: + if Tiret: + trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); + label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); + else: + dotlabel.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); + fi; + fi; + fi; + else: + l:=l+1; + if Rotation: + if AngleRotation<>0: + picture TEXTELABEL; + TEXTELABEL=image( + labeloffset:=labeloffset*2; + label.lft(LATEX(p_),A[l]); + labeloffset:=labeloffset/2; + ); + trace rotation(TEXTELABEL,A[l],AngleRotation); + else : + label.bot(LATEX(p_),A[l]); + fi; + fi; + fi; + endfor; + enddef; + if Qualitatif: tutu(#1); else: toto(#1); fi; + boolean Grille; + Grille:=\useKV[ClesStat]{Grille}; + Pasx:=\useKV[ClesStat]{Pasx}; + Pasy:=\useKV[ClesStat]{Pasy}; + if Grille: + drawoptions(withcolor 0.75white); + for k=0 step Pasx until ((maxx+1)): + trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy)); + endfor; + for k=0 step Pasy until ((maxy+2*Pasy)): + trace (0,k*unitey)--(unitex*(maxx+1),k*unitey); + endfor; + drawoptions(); + fi; + if epaisseurbatons<>0: + for k=1 upto n: + fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi; + if AideLecture: + draw B[k]--P[k] dashed evenly; + fi; + endfor; + fi; + if LectureFine: + for k=0 step Pasy until ((maxy+1*Pasy)): + if Tiret: + trace (1pt,k*unitey)--(-1pt,k*unitey); + label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + else: + dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + endfor; + fi; + if Lecture: + for k=0 step Pasy until Pasy: + if Tiret: + trace (1pt,k*unitey)--(-1pt,k*unitey); + label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + else: + dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); + fi; + endfor; + fi; + drawarrow (0,0)--unitex*(maxx+1,0); + drawarrow (0,0)--unitey*(0,maxy+2*Pasy); + label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0)); + label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy)); + if Qualitatif: titi(#1); else:tata(#1); fi; + \end{mpost} + \fi +} + +% la construction du graphique qualitatif +\def\NewMPStatCirculaireQ#1#2#3#4{% + %#1 : la liste des données + %#2 : 360 ou 180 + %#3 : liste des couleurs + %#4 : liste des légendes à effacer. + \ifluatex + \mplibforcehmode + \begin{mplibcode} + Rayon:=\useKV[ClesStat]{Rayon}; + ecarthachures=\useKV[ClesStat]{EcartHachures}; + epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; + boolean AffichageAngle; + AffichageAngle=\useKV[ClesStat]{AffichageAngle}; + boolean AffichageDonnee; + AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; + boolean Hachures; + Hachures=\useKV[ClesStat]{Hachures}; + boolean Inverse; + Inverse=\useKV[ClesStat]{LectureInverse}; + boolean Legende; + Legende=\useKV[ClesStat]{Legende}; + boolean LegendeVide; + LegendeVide=\useKV[ClesStat]{LegendeVide}; + boolean Retour; + Retour=false; + boolean ACompleter; + ACompleter=\useKV[ClesStat]{ACompleter}; + pair A[],O,B[],C[],D[]; + O=(0,0); + n:=0; + numeric total[],ang[]; + total[0]=0; + ang[0]:=0; + path cc; + cc=(fullcircle scaled (2*Rayon)); + % on r\'ecup\`ere les couleurs + color Col[]; + n:=0; + for p_=#3: + n:=n+1; + Col[n]=p_; + endfor; + if Inverse=false: + A[0]=point(0) of cc; + else: + A[0]=point(180) of cc; + fi; + vardef toto(text t)= + n:=0; + for p_=t: + if numeric p_: + n:=n+1; + total[n]:=total[n-1]+p_; + fi; + endfor; + N=n; + for k=1 upto N: + ang[k]=(#2/total[N])*total[k]; + endfor; + n:=0; + for p_=t: + if numeric p_: + n:=n+1; + if Inverse=false: + A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N])); + else: + A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N])); + fi; + %hachure ou pas ? + if Hachures=false: + fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else: + arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi; + else: + draw + Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O) + else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if + (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi) + withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi; + fi; + if ACompleter=false: + draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi; + fi; + % Affichage des angles associ\'es + if AffichageAngle: + if round(p_*(#2/total[N]))>15: + if (n mod 2)=0: + marque_a:=20*0.75*Rayon/cm; + else: + marque_a:=20*0.5*Rayon/cm; + fi; + if Hachures: + if Inverse=false: + undraw + Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + else: + undraw + Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + fi; + fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor + blanc; + fi; + if Inverse=false: + draw + Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + else: + draw + Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + fi; + fi; + elseif AffichageDonnee: + if round(p_*(#2/total[N]))>15: + if (n mod 2)=0: + marque_a:=20*0.75*Rayon/cm; + else: + marque_a:=20*0.5*Rayon/cm; + fi; + if Hachures: + if Inverse=false: + undraw + Codeangle(A[n-1],O,A[n],0,TEX(""&decimal(p_)&"")); + else: + undraw + Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&""))))); + fi; + fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor + blanc; + fi; + if Inverse=false: + draw + Codeangle(A[n-1],O,A[n],0,(((TEX(""&decimal(p_)&""))))); + else: + draw + Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&""))))); + fi; + fi; + fi; + % + fi; + endfor; + if #2=360: + draw cc if Hachures: withpen pencircle scaled2 fi; + else: + draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;; + fi; + n:=0; + if Legende: + for p_=t: + if string p_: + n:=n+1; + C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2); + draw 0.95[O,C[n]]--1.05[O,C[n]]; + C[n]:=1.05[O,C[n]]; + Test(n); + if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)): + D[n]=C[n]+(0.5cm,0); + draw C[n]--D[n]; + if Retour=false:label.urt(TEX(p_),D[n]);fi; + fi; + if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)): + D[n]=C[n]-(0.5cm,0); + draw C[n]--D[n]; + if Retour=false:label.ulft(TEX(p_),D[n]);fi; + fi; + if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)): + D[n]=C[n]-(0.5cm,0); + draw C[n]--D[n]; + if Retour=false:label.llft(TEX(p_),D[n]);fi; + fi; + if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)): + D[n]=C[n]+(0.5cm,0); + draw C[n]--D[n]; + if Retour=false:label.lrt(TEX(p_),D[n]);fi; + fi; + fi; + endfor; + fi; + enddef; + vardef Test(expr nb)= + Retour:=false; + op:=0; + for l_=#4: + if l_=nb: + op:=op+1; + fi; + endfor; + if op>0: + Retour:=true; + fi; + enddef; + Figure(-10u,-10u,10u,10u); + toto(#1); + \end{mplibcode} + \else + \begin{mpost}[mpsettings={% + Rayon:=\useKV[ClesStat]{Rayon}; + ecarthachures=\useKV[ClesStat]{EcartHachures}; + epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; + boolean AffichageAngle; + AffichageAngle=\useKV[ClesStat]{AffichageAngle}; + boolean AffichageDonnee; + AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; + boolean Hachures; + Hachures=\useKV[ClesStat]{Hachures}; + boolean Inverse; + Inverse=\useKV[ClesStat]{LectureInverse}; + boolean Legende; + Legende=\useKV[ClesStat]{Legende}; + boolean LegendeVide; + LegendeVide=\useKV[ClesStat]{LegendeVide}; + boolean ACompleter; + ACompleter=\useKV[ClesStat]{ACompleter}; + }] + boolean Retour; + Retour=false; + pair A[],O,B[],C[],D[]; + O=(0,0); + n:=0; + numeric total[],ang[]; + total[0]=0; + ang[0]:=0; + path cc; + cc=(fullcircle scaled (2*Rayon)); + % on r\'ecup\`ere les couleurs + color Col[]; + n:=0; + for p_=#3: + n:=n+1; + Col[n]=p_; + endfor; + if Inverse=false: + A[0]=point(0) of cc; + else: + A[0]=point(180) of cc; + fi; + vardef toto(text t)= + n:=0; + for p_=t: + if numeric p_: + n:=n+1; + total[n]:=total[n-1]+p_; + fi; + endfor; + N=n; + for k=1 upto N: + ang[k]=(#2/total[N])*total[k]; + endfor; + n:=0; + for p_=t: + if numeric p_: + n:=n+1; + if Inverse=false: + A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N])); + else: + A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N])); + fi; + %hachure ou pas ? + if Hachures=false: + fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else: + arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi; + else: + draw + Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O) + else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if + (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi) + withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi; + fi; + if ACompleter=false: + draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi; + fi; + % Affichage des angles associ\'es + if AffichageAngle: + if round(p_*(#2/total[N]))>15: + if (n mod 2)=0: + marque_a:=20*0.75*Rayon/cm; + else: + marque_a:=20*0.5*Rayon/cm; + fi; + if Hachures: + if Inverse=false: + undraw + Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + else: + undraw + Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + fi; + fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor + blanc; + fi; + if Inverse=false: + draw + Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + else: + draw + Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); + fi; + fi; + elseif AffichageDonnee: + if round(p_*(#2/total[N]))>15: + if (n mod 2)=0: + marque_a:=20*0.75*Rayon/cm; + else: + marque_a:=20*0.5*Rayon/cm; + fi; + if Hachures: + if Inverse=false: + undraw + Codeangle(A[n-1],O,A[n],0,LATEX(""&decimal(p_)&"")); + else: + undraw + Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&""))))); + fi; + fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor + blanc; + fi; + if Inverse=false: + draw + Codeangle(A[n-1],O,A[n],0,(((LATEX(""&decimal(p_)&""))))); + else: + draw + Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&""))))); + fi; + fi; + fi; + % + fi; + endfor; + if #2=360: + draw cc if Hachures: withpen pencircle scaled2 fi; + else: + draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;; + fi; + n:=0; + if Legende: + for p_=t: + if string p_: + n:=n+1; + C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2); + draw 0.95[O,C[n]]--1.05[O,C[n]]; + C[n]:=1.05[O,C[n]]; + Test(n); + if Retour=false: + if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)): + D[n]=C[n]+(0.5cm,0); + draw C[n]--D[n]; + label.urt(LATEX(p_),D[n]); + fi; + if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)): + D[n]=C[n]-(0.5cm,0); + draw C[n]--D[n]; + label.ulft(LATEX(p_),D[n]); + fi; + if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)): + D[n]=C[n]-(0.5cm,0); + draw C[n]--D[n]; + label.llft(LATEX(p_),D[n]); + fi; + if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)): + D[n]=C[n]+(0.5cm,0); + draw C[n]--D[n]; + label.lrt(LATEX(p_),D[n]); + fi; + fi; + fi; + endfor; + fi; + enddef; + vardef Test(expr nb)= + Retour:=false; + op:=0; + for l_=#4: + if l_=nb: + op:=op+1; + fi; + endfor; + if op>0: + Retour:=true; + fi; + enddef; + Figure(-10u,-10u,10u,10u); + toto(#1); + \end{mpost} + \fi +}% + +%Pour la m\'ediane. +\DTLgnewdb{mtdb}% +\dtlexpandnewvalue% +\newcount\nbdonnees% +% +\def\AjoutListEEaa#1\nil{\addtotok\tabtoksEEa{#1,}}% +\def\AjoutListEEab#1\nil{\addtotok\tabtoksEEa{#1/}}% +\def\AjoutListEEb#1\nil{\addtotok\tabtoksEEb{#1,}}% +\def\AjoutListEEx#1\nil{\addtotok\tabtoksEE{#1,}}% +\def\AjoutListEEy#1\nil{\addtotok\tabtoksEE{#1/}}% + +\DTLgnewdb{mtdbEE}% +\DTLgnewdb{mtdbEEqual}% +% +\newcommand\Stat[2][]{% + \useKVdefault[ClesStat]% + \setKV[ClesStat]{#1}% + \ifboolKV[ClesStat]{Representation}{% + \setKV[TraceG]{Xmin=0,Ymin=0}% + \setKV[TraceG]{#1}% + \readlist*\ListePointsPlaces{#2}% + \newtoks\toklistepoint% + \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}% + \MPPlacePoint[#1]{\the\toklistepoint}% + }{% + \ifboolKV[ClesStat]{Liste}{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\Liste{#2}% + \xdef\foo{}% + \setsepchar[*]{,*/}\ignoreemptyitems% + \xintFor* ##1 in {\xintSeq {1}{\Listelen}}\do{% + \xdef\foo{\foo 1/\Liste[##1],}% + }% + \readlist*\ListeComplete{\foo}% + \setKV[ClesStat]{Qualitatif}% + }{% + \ifboolKV[ClesStat]{Sondage}{% + \setsepchar{,}\ignoreemptyitems% + \readlist*\Liste{#2}% + % "liste vide" + \newtoks\tabtoksEEa% + \tabtoksEEa{}% + % + % "liste vide" + \newtoks\tabtoksEEb% + \tabtoksEEb{}% + % + \readlist*\ListeSansDoublonsEE{999}% %% Pour ne pas avoir une liste vide + % + \newcount\cmptEE% + \newcount\PasNumEE% %% Permettra de savoir si ce sondage est qualitatif ou quantitatif + \PasNumEE=0\relax% + \DTLcleardb{mtdbEE}% + % on range les resultats du sondage par ordre croissant. + \foreachitem\x\in\Liste{% + \DTLnewrow{mtdbEE}% + \DTLnewdbentry{mtdbEE}{Numeric}{\x}% + }% + \dtlsort{Numeric}{mtdbEE}{\dtlicompare}% + \DTLforeach{mtdbEE}{\nba=Numeric}{% + \IfDecimal{\nba}{}{\PasNumEE=\numexpr\PasNumEE+1\relax}% + \cmptEE=0\relax% + \foreachitem\nbb\in\ListeSansDoublonsEE{% + \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}% + }% + \ifthenelse{\equal{\the\cmptEE}{0}}{% + \expandafter\AjoutListEEb\nba\nil% + \xdef\listEEa{\the\tabtoksEEb}% + \ignoreemptyitems% + \setsepchar{,}% + \readlist*\ListeSansDoublonsEE\listEEa% %%% Enl\`eve tous les \'elements + %%% identiques de Liste + }{}% + }% + \foreachitem\nba\in\ListeSansDoublonsEE{% + \cmptEE=0\relax% + \DTLforeach{mtdbEE}{\nbb=Numeric}{% + \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}% + }% + \expandafter\AjoutListEEab\nba\nil% + \expandafter\AjoutListEEaa\the\cmptEE\nil% %%% Compte tous les \'elements + %%% identiques de Liste + }% + \xdef\listEEb{\the\tabtoksEEa} + \ignoreemptyitems% + \setsepchar[*]{,*/}% + \readlist*\ListeComplete\listEEb% + % + \ifthenelse{\equal{\the\PasNumEE}{0}}{\setKV[ClesStat]{Quantitatif}}{\setKV[ClesStat]{Qualitatif}}% + }{% + \ifboolKV[ClesStat]{Qualitatif}{% + % % on lit la liste \'ecrite sous la forme valeur/effectif + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeInitiale{#2}% + % "liste vide" + \newtoks\tabtoksEE% + \tabtoksEE{}% + \DTLcleardb{mtdbEEqual}% + \foreachitem\x\in\ListeInitiale{% + \DTLnewrow{mtdbEEqual}% + \itemtomacro\ListeInitiale[\xcnt,1]\x% + \DTLnewdbentry{mtdbEEqual}{Val}{\x}% + \itemtomacro\ListeInitiale[\xcnt,2]\y% + \DTLnewdbentry{mtdbEEqual}{Eff}{\y}% + }% + \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{% + \expandafter\AjoutListEEy\Val\nil% + \expandafter\AjoutListEEx\Eff\nil% + }% + \xdef\listEE{\the\tabtoksEE} + \ignoreemptyitems% + \setsepchar[*]{,*/}% + \readlist*\ListeComplete\listEE% + }{% Dans le qualitatif, on trie d'abord les valeurs. + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\ListeInitiale{#2}% + % "liste vide" + \newtoks\tabtoksEE% + \tabtoksEE{}% + \DTLcleardb{mtdbEEqual}% + \foreachitem\x\in\ListeInitiale{% + \DTLnewrow{mtdbEEqual}% + \itemtomacro\ListeInitiale[\xcnt,1]\x% + \DTLnewdbentry{mtdbEEqual}{Val}{\x}% + \itemtomacro\ListeInitiale[\xcnt,2]\y% + \DTLnewdbentry{mtdbEEqual}{Eff}{\y}% + }% + \dtlsort{Val}{mtdbEEqual}{\dtlicompare}% + \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{% + \expandafter\AjoutListEEy\Val\nil% + \expandafter\AjoutListEEx\Eff\nil% + }% + \xdef\listEE{\the\tabtoksEE} + \ignoreemptyitems% + \setsepchar[*]{,*/}% + \readlist*\ListeComplete\listEE% + }}}% + % on cr\'ee la base de donn\'ees des valeurs dans le cas qualitatif + \DTLcleardb{mtdb}% + % on les trie pour la m\'ediane dans le cas qualitatif % Touhami / Texnique.fr + \foreachitem\x\in\ListeComplete{% + \DTLnewrow{mtdb}% + \itemtomacro\ListeComplete[\xcnt,2]\y% + \DTLnewdbentry{mtdb}{Numeric}{\y}% + }% + \dtlsort{Numeric}{mtdb}{\dtlicompare}% + % % on r\'einitialise les valeurs des crit\`eres de position et de + % dispersion + \renewcommand\NbDonnees{}% + \renewcommand\SommeDonnees{}% + \renewcommand\EffectifTotal{}% + \renewcommand\Moyenne{}% + \renewcommand\Etendue{}% + \renewcommand\Mediane{}% + \renewcommand\DonneeMax{0}% + \renewcommand\EffectifMax{0}% + \renewcommand\DonneeMin{999999999}% + \ifboolKV[ClesStat]{Qualitatif}{%D\'ebut qualitatif + % Calculs + % %% celui de la somme des donn\'ees + \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,2]}}}% + % %% celui de l'effectif total + \ifboolKV[ClesStat]{EffectifTotal}{% + \ifboolKV[ClesStat]{Liste}{L'effectif total de la s\'erie est + \num{\ListeCompletelen}.\par}{% + \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}% + L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in + {\xintSeq {2}{\ListeCompletelen}}\do{% + +\ListeComplete[##1,2]}=\num{\EffectifTotal}\]} + }{}% + \ifboolKV[ClesStat]{Liste}{\xdef\EffectifTotal{\ListeCompletelen}}{\xdef\EffectifTotal{\SommeDonnees}}% + % %% celui de la moyenne + \xdef\Moyenne{\fpeval{\SommeDonnees/\ListeCompletelen}}% + \ifboolKV[ClesStat]{Moyenne}{% + \ifboolKV[ClesStat]{Liste}{% + La somme des donn\'ees de la s\'erie est :% + \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% + \[ + \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% + +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% + \]}{% + \[ + \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{3}}\do{% + +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{% + +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% + \]% + }% + \ifboolKV[ClesStat]{SET}{}{Le nombre de donn\'ees de la s\'erie est \num{\ListeCompletelen}.\\}% + Donc la moyenne de la s\'erie est \'egale \`a :% + \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\ListeCompletelen}}%\IfInteger{\fpeval{round(\fpeval{\SommeDonnees/\ListeCompletelen},\useKV[ClesStat]{Precision})}}{=}{\approx} + \ifboolKV[ClesStat]{ValeurExacte}{}{% + \opdiv*{\SommeDonnees}{\ListeCompletelen}{resultatmoy}{restemoy}% + \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}% + \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi% + \num{\fpeval{round(\SommeDonnees/\ListeCompletelen,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% + }% + \]% + }{Pas de moyenne possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}% + % % %% celui de l'\'etendue + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintifboolexpr{\ListeComplete[##1,2]>\DonneeMax}{% + \xdef\DonneeMax{\ListeComplete[##1,2]}% + }{}% + \xintifboolexpr{\ListeComplete[##1,2]<\DonneeMin}{% + \xdef\DonneeMin{\ListeComplete[##1,2]}% + }{}% + }% + \xdef\EffectifMax{\DonneeMax}% + \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}% + \ifboolKV[ClesStat]{Etendue}{% + \ifboolKV[ClesStat]{Liste}{% + L'\'etendue de la s\'erie est \'egale \`a $\num{\DonneeMax}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\DonneeMin}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% + }{Pas d'\'etendue possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}% + % celui de la mediane + %%% Recuperation de la mediane %%%%%%%%%%%%%%%%%%%%% + \newcount\Recapmed% + \newcount\Recapmeda% + \ifodd\number\ListeCompletelen%odd impair + \Recapmed=\fpeval{(\ListeCompletelen+1)/2}\relax% + \else% + \Recapmed=\fpeval{\ListeCompletelen/2}\relax% + \Recapmeda=\numexpr\Recapmed+1\relax% + \fi% + \newcount\Recapk% + \Recapk=0% + \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\Recapk=\numexpr\Recapk+1\relax% + \ifnum\Recapk=\Recapmed% + \ifodd\number\ListeCompletelen% + \xdef\Mediane{\numeroDonnee}% + \else% + \xdef\Mediane{\numeroDonnee}% + \fi% + \fi% + \ifnum\Recapk=\Recapmeda% + \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}% + \fi% + }% + %%% + \ifboolKV[ClesStat]{Mediane}{% + \ifboolKV[ClesStat]{Liste}{% + On range les donn\'ees par ordre croissant :% + \nbdonnees=0% + \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% + \[\DTLforeach{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{;}}\]% + }{% + \medskip% + \begin{center} + \begin{minipage}{0.9\linewidth} + \DTLforeach*{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{; + }\nbdonnees=\fpeval{\nbdonnees+1}\modulo{\nbdonnees}{\useKV[ClesStat]{Coupure}}\xintifboolexpr{\remainder==0}{\\}{}} + \end{minipage} + \end{center}% + \medskip% + }% + \newcount\med% + \newcount\meda% + \ifodd\number\ListeCompletelen%odd impair + \med=\fpeval{(\ListeCompletelen+1)/2}\relax% + L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$.\\ + \else% pair + \med=\fpeval{\ListeCompletelen/2}\relax% + \meda=\numexpr\med+1\relax% + L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\the\med}+\num{\the\med}$.\\ + \fi% + \newcount\k% + \k=0% + \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\k=\numexpr\k+1\relax% + \ifnum\k=\med %La m\'ediane vaut \numeroDonnee\fi + \ifodd\number\ListeCompletelen% + La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee.\\Donc la m\'ediane de la s\'erie est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% + \xdef\Mediane{\numeroDonnee}% + \else% + La \the\med\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\numeroDonnee}% + \fi% + \fi% + \ifnum\k=\meda + La \the\meda\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.} Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% + \fi% + }% + %%%%%%% + }{Pas de m\'ediane possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{} + %%% Quartile un + \newcount\PfCQuartileUn% + \modulo{\ListeCompletelen}{4}\relax% + \ifnum\remainder=0% + \PfCQuartileUn=\fpeval{\ListeCompletelen/4}% + \else% + \PfCQuartileUn=\fpeval{ceil(\ListeCompletelen/4)}% + \fi% + \newcount\PfCQunk% + \PfCQunk=0% + \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQunk=\numexpr\PfCQunk+1\relax% + \ifnum\PfCQunk=\PfCQuartileUn% + \xdef\QuartileUn{\numeroDonnee}% + \fi% + }% + %%% Quartile trois + \newcount\PfCQuartileTrois% + \modulo{\ListeCompletelen}{4}\relax% + \ifnum\remainder=0% + \PfCQuartileTrois=\fpeval{3*\ListeCompletelen/4}% + \else% + \PfCQuartileTrois=\fpeval{ceil(3*\ListeCompletelen/4)}% + \fi% + \newcount\PfCQtroisk% + \PfCQtroisk=0% + \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQtroisk=\numexpr\PfCQtroisk+1\relax% + \ifnum\PfCQtroisk=\PfCQuartileTrois%La m\'ediane vaut \numeroDonnee\fi + \xdef\QuartileTrois{\numeroDonnee}% + \fi% + }% + % Construction du tableau + \ifboolKV[ClesStat]{Tableau}{% + \ifboolKV[ClesStat]{Liste}{Pas de tableau possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un tableau avec cette liste.}{\BuildtabStat}}{}% + % Construction du graphique + \ifboolKV[ClesStat]{Graphique}{% + \ifboolKV[ClesStat]{Liste}{Pas de graphique possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un graphique avec cette liste.}{% + \ifboolKV[ClesStat]{Barre}{% + \buildgraphbarhor% + }{\ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraphq[#1]}}}% + }}{}% + }{%%%%%%%%%%%%%%%%%%%%%D\'ebut quantitatif + % % on effectue les calculs + % %% celui de la somme des donn\'ees + \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,1]*\ListeComplete[\doncnt,2]}}}% + % %% celui de l'effectif total + \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}% + % %% celui de l'\'etendue + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintifboolexpr{\ListeComplete[##1,1]>\DonneeMax}{% + \xdef\DonneeMax{\ListeComplete[##1,1]}% + }{}% + \xintifboolexpr{\ListeComplete[##1,1]<\DonneeMin}{% + \xdef\DonneeMin{\ListeComplete[##1,1]}% + }{}% + }% + % \xdef\EffectifMax{\DonneeMax}% + \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}%% + % %% celui de la moyenne + \xdef\Moyenne{\fpeval{\SommeDonnees/\EffectifTotal}}% + \ifboolKV[ClesStat]{EffectifTotal}{% + L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in + {\xintSeq {2}{\ListeCompletelen}}\do{% + +\ListeComplete[##1,2]}=\num{\EffectifTotal}\] + }{}% + \ifboolKV[ClesStat]{Moyenne}{% + La somme des donn\'ees de la s\'erie est :% + \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% + \[ + \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% + +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + \] + }{% + \[ + \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{2}}\do{% + +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + }+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{% + +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} + \] + }% + \ifboolKV[ClesStat]{SET}{}{L'effectif total de la s\'erie est :% + \ifboolKV[ClesStat]{Liste}{ \num{\EffectifTotal}\\}{% + \[\num{\ListeComplete[1,2]}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% + +\num{\ListeComplete[##1,2]} + }=\num{\EffectifTotal} + \]% + }% + }% + Donc la moyenne de la s\'erie est \'egale \`a :% + \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\EffectifTotal}}% + \ifboolKV[ClesStat]{ValeurExacte}{}{% + \opdiv*{\SommeDonnees}{\EffectifTotal}{resultatmoy}{restemoy}% + \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}% + \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi% + \num{\fpeval{round(\SommeDonnees/\EffectifTotal,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% + }% + \]% + }{}% + % % Affichage des r\'eponses. + % %% pour l'\'etendue + \ifboolKV[ClesStat]{Etendue}{L'\'etendue de la s\'erie est \'egale \`a $\num{\ListeComplete[\ListeCompletelen,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}}{}% + % pour la m\'ediane + %%% Recuperation Mediane + \newcount\Recupmed% + \newcount\Recupmeda% + \ifodd\number\EffectifTotal%odd impair + \Recupmed=\fpeval{(\EffectifTotal+1)/2}\relax% + \else% pair + \Recupmed=\fpeval{\EffectifTotal/2}\relax% + \Recupmeda=\numexpr\Recupmed+1\relax% + \fi% + \newcount\Recupk% + \Recupk=0% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% + \Recupk=\numexpr\Recupk+1\relax% + \ifnum\Recupk=\Recupmed% + \ifodd\number\EffectifTotal% + \xdef\Mediane{\ListeComplete[##1,1]}% + \else% + \xdef\Mediane{\ListeComplete[##1,1]}% + \fi% + \fi% + \ifnum\Recupk=\Recupmeda% + \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}% + \fi% + }% + }% + %%% + \ifboolKV[ClesStat]{Mediane}{% + + \newcount\med% + \newcount\meda% + \ifodd\number\EffectifTotal%odd impair + \med=\fpeval{(\EffectifTotal+1)/2}\relax% + L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$. % + \else% pair + \med=\fpeval{\EffectifTotal/2}\relax% + \meda=\numexpr\med+1\relax% + L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med}}+\num{\fpeval{\med}}$. % + \fi% + \newcount\k% + \k=0% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% + \k=\numexpr\k+1\relax% + \ifnum\k=\med% + \ifodd\number\EffectifTotal% + La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee. Donc la m\'ediane de la s\'erie est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% + \else% + La \the\med\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\ListeComplete[##1,1]}% + \fi% + \fi% + \ifnum\k=\meda% + La \the\meda\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}\\Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% + \fi% + }% + }% + }{}% + %%% Quartile un + \newcount\PfCQuartileUn% + \modulo{\EffectifTotal}{4}\relax% + \ifnum\remainder=0% + \PfCQuartileUn=\fpeval{\EffectifTotal/4}% + \else% + \PfCQuartileUn=\fpeval{ceil(\EffectifTotal/4)}% + \fi% + \newcount\PfCQunk% + \PfCQunk=0% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% + \PfCQunk=\numexpr\PfCQunk+1\relax% + \ifnum\PfCQunk=\PfCQuartileUn% + \xdef\QuartileUn{\ListeComplete[##1,1]}% + \fi% + }% + }% + %%% Quartile trois + \newcount\PfCQuartileTrois% + \modulo{\EffectifTotal}{4}\relax% + \ifnum\remainder=0% + \PfCQuartileTrois=\fpeval{3*\EffectifTotal/4}% + \else% + \PfCQuartileTrois=\fpeval{ceil(3*\EffectifTotal/4)}% + \fi% + \newcount\PfCQtroisk% + \PfCQtroisk=0% + \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% + \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% + \PfCQtroisk=\numexpr\PfCQtroisk+1\relax% + \ifnum\PfCQtroisk=\PfCQuartileTrois% + \xdef\QuartileTrois{\ListeComplete[##1,1]}% + \fi% + }% + }% + % Construction de tableau + \ifboolKV[ClesStat]{Tableau}{\BuildtabStat}{}% + % Construction du graphique ?? + \ifboolKV[ClesStat]{Graphique}{% + \ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraph[#1]}} + }{}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTableauxUnites.tex b/macros/latex/contrib/profcollege/latex/PfCTableauxUnites.tex new file mode 100644 index 0000000000..4eaee98489 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTableauxUnites.tex @@ -0,0 +1,1389 @@ +%%% +% Tableaux d'unit\'es +%%% +\setKVdefault[ClesTableaux]{Virgule=true,Incline=false,Entiers=false,Decimaux=false,Milliards=false,Millions=false,Micro=false,Nano=false,Partie=false,CouleurG=gray!15,CouleurM=gray!15,Couleurm=gray!15,Couleuru=gray!15,Couleurd=gray!15,Classes=false,Nombres=false,Puissances=false,NbLignes=2,Metre=false,Are=false,Capacite=false,Carre=false,Cube=false,Litre=false,Gramme=false,Fleches=false,FlechesB=false,FlechesH=false,Colonnes=false,Prefixes=false,Escalier=false,Taille=5,Largeur=4.75em,Nom=PfCTableau,CodeAfter={},PuissancesSeules=false,Colonne=-1,Octet=false} + +\newcommand\PfCTBstrut{\rule[-1.2ex]{0pt}{3.8ex}}% Top and Bottom strut +\newcommand\PfCTstrut{\rule{0pt}{3.8ex}}% Top strut +\newcommand\PfCBstrut{\rule[-1.2ex]{0pt}{0ex}}% Bottom strut + +\newlength\PfCTableauPuissances% + +\newcommand\Tableau[2][]{% + \useKVdefault[ClesTableaux]% + \setKV[ClesTableaux]{#1}% + \ifboolKV[ClesTableaux]{Escalier}{% + \ifboolKV[ClesTableaux]{Metre}{% + \xdef\PfCTableauUnite{\meter}% + \xdef\PfCCoefConversion{10}% + }{}% + \ifboolKV[ClesTableaux]{Carre}{% + \xdef\PfCTableauUnite{\square\meter}% + \xdef\PfCCoefConversion{100}% + }{}% + \ifboolKV[ClesTableaux]{Cube}{% + \xdef\PfCTableauUnite{\cubic\meter}% + \xdef\PfCCoefConversion{1000}% + }{}% + \ifboolKV[ClesTableaux]{Gramme}{% + \xdef\PfCTableauUnite{\gram}% + \xdef\PfCCoefConversion{10}% + }{}% + \PfCTableauIncline% + }{% + % + %%% Clé Octet + % + \ifboolKV[ClesTableaux]{Octet}{% + \[\renewcommand{\arraystretch}{1.15}% + \setlength{\tabcolsep}{0.275\tabcolsep}% + \xdef\DecalageLigne{0} + \begin{NiceTabular}{*{5}{wc{15pt}wc{15pt}wc{15pt}}} + \Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}\\ + \hline + \ifboolKV[ClesTableaux]{Classes}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\Block[borders={left,top,right}]{1-3}{téraoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{gigaoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mégaoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{kilooctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{octet\PfCTBstrut}&&\\ + \hline + }{}% + \Block[borders={left,top,right}]{1-3}{To\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{Go\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{Mo\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{ko\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{o\PfCTBstrut}&&\\ + \hline + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&&&&&&&&&&\\ + }% + \Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw (3-|\fpeval{3*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); + }% + \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \tikz\draw[gray!50] (3-|\fpeval{3*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); + \tikz\draw[gray!50] (3-|\fpeval{3*##1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); + }% + }{}% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% + }% + }% + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{4}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2.5+3*(##1-1)}) to node[above, midway]{\small$\times\num{1000}$}(1.5-|\fpeval{2.5+3*##1});% + }% + }{}% + \ifboolKV[ClesTableaux]{Classes}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{4}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*##1}) to node[below,midway]{\small$\div\num{1000}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*(##1-1)});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular} + \]% + }{}% + % + %%% Cl\'e Prefixes + % + \ifboolKV[ClesTableaux]{Prefixes}{% + \xdef\DecalageLigne{0}% + \setlength{\tabcolsep}{0.01\tabcolsep}% + \begin{center}% + % + %%% Definition du tableau + % + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% + \ifboolKV[ClesTableaux]{Nano}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+6}}}{\ifboolKV[ClesTableaux]{Micro}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+3}}}{}} + \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{m{3.25em}}>{\columncolor{gray!15}}{c}*{% + \ifboolKV[ClesTableaux]{Micro}{6}{% + \ifboolKV[ClesTableaux]{Nano}{9}{3}% + }}% + {m{3.25em}}}% + % + %%% Prise en compte de la cl\'e Partie + % + \ifboolKV[ClesTableaux]{Partie}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \Block[]{1-% + \ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + &&&% + }{% + }}% + &&&&& + &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[]{1-% + \ifboolKV[ClesTableaux]{Micro}{6}{% + \ifboolKV[ClesTableaux]{Nano}{9}{3}% + }}{\bfseries Partie d\'ecimale} + &&% + \ifboolKV[ClesTableaux]{Micro}{&&&}{% + \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% + }% + \\ + }{}% + % + %%% Prise en compte de la cl\'e Classes + % + \ifboolKV[ClesTableaux]{Classes}{% + %\hline + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} + \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} + \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% + &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& + &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[draw]{1-% + \ifboolKV[ClesTableaux]{Micro}{6}{% + \ifboolKV[ClesTableaux]{Nano}{9}{3}% + }}{} + &&% + \ifboolKV[ClesTableaux]{Micro}{&&&}{% + \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% + }% + \\ + }{}% + % + %%% Valeurs par d\'efaut + % + \hline% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont giga}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont m\'ega}% + &\Block[borders={right}]{}{}% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% + &\Block[]{}{\fontsize{8}{8}\selectfont m\'ega}% + &% + }{% + }}% + \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont kilo}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont hecto}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont d\'eca}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont unit\'es}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont deci}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont centi}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont milli}% + \ifboolKV[ClesTableaux]{Micro}{&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}\\}{% + \ifboolKV[ClesTableaux]{Nano}{&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont nano}\\}{\\}% + }% + % + %%% Prise en compte de la cl\'e Nombres + % + \ifboolKV[ClesTableaux]{Nombres}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{} + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{} + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% + \ifboolKV[ClesTableaux]{Micro}{% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}% + }{% + \ifboolKV[ClesTableaux]{Nano}{% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0000001} ou $\dfrac{\strut1}{\strut\num{10000000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00000001} ou $\dfrac{\strut1}{\strut\num{100000000}}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000000001} ou $\dfrac{\strut1}{\strut\num{1000000000}}$}% + }{}% + }{}\\% + }{}% + %%% Prise en compte de la cl\'e Puissances + \ifboolKV[ClesTableaux]{Puissances}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{}&% + \Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &\Block[borders={right}]{}{}% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{}&% + \Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &% + }{% + }}% + \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}% + \ifboolKV[ClesTableaux]{Micro}{&% + \Block[borders={right}]{}{}&% + \Block[borders={right}]{}{}& + \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}}{% + \ifboolKV[ClesTableaux]{Nano}{&% + \Block[borders={right}]{}{}&% + \Block[borders={right}]{}{}&% + \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-9}$}}{}% + }% + \\% + }{}% + % + %%% Lignes vierges + % + \hline% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + &&&% + }{% + }}% + &&&&&&,&&&% + \ifboolKV[ClesTableaux]{Micro}{&&&}{% + \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% + }% + \\}% + \CodeAfter% + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% + \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% + }% + %% On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% + \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}% + \setsepchar[*]{,*.}% + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% + }% + \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% + }% + }% + \fi% + \end{NiceTabular}% + \end{center}% + \setlength{\tabcolsep}{100\tabcolsep}% + }{}% + % + %%% Puissances seules + % + \ifboolKV[ClesTableaux]{PuissancesSeules}{% + \setlength{\PfCTableauPuissances}{3em}% + \xdef\DecalageLigne{0}% + \setlength{\tabcolsep}{0.01\tabcolsep}% + \begin{center}% + % + %%% Definition du tableau + % + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% + \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{m{\PfCTableauPuissances}}>{\columncolor{gray!15}}{c}*{3}{m{\PfCTableauPuissances}}}% + \CodeBefore + \xintifboolexpr{\useKV[ClesTableaux]{Colonne}>0}{% + \tikz\fill[gray!15] (1-|\fpeval{\useKV[ClesTableaux]{Colonne}}) rectangle (last-|\fpeval{\useKV[ClesTableaux]{Colonne}+1}); + }{} + \Body + \hline + % + %%% Prise en compte de la cl\'e Partie +% % +% \ifboolKV[ClesTableaux]{Partie}{% +% \Block[]{1-% +% \ifboolKV[ClesTableaux]{Milliards}{12}{% +% \ifboolKV[ClesTableaux]{Millions}{9}{6}% +% }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% +% &&&&&&% +% }{% +% \ifboolKV[ClesTableaux]{Millions}{% +% &&&% +% }{% +% }}% +% &&&&&% +% &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%% +% &\Block[]{1-3}{\bfseries Partie d\'ecimale}% +% &&\\ +% }{}% +% % +% %%% Prise en compte de la cl\'e Classes +% % +% \ifboolKV[ClesTableaux]{Classes}{% +% \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% +% \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% +% \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% +% &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& +% &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% +% &\Block[draw]{1-3}{}&&% +% \\ +% }{}% + % + %%% Valeurs ci-dessous par d\'efaut + % + %Affichage ou pas des noms ? +% \hline +% \ifboolKV[ClesTableaux]{Milliards}{% +% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% +% &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% +% & +% }{}% +% \ifboolKV[ClesTableaux]{Millions}{% +% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% +% &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% +% & +% }{}% +% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}% +% &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}% +% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\ +% % + %%% Prise en compte de la cl\'e Nombres + % + \ifboolKV[ClesTableaux]{Nombres}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{}% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% + \\ + }{}% + %%% Prise en compte de la cl\'e Puissances + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{11}$}&% + \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{10}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{9}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}% + &% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}&% + \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}% + &% + }{% + }}% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{5}$} + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{4}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^3$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d2}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d1}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^0$}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-1}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-2}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-3}$}% + \\% + %%% Lignes vierges + \hline% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + &&&}{}% + &&&&&&\ifboolKV[ClesTableaux]{Virgule}{,}{\phantom{,}}&&&\\}% + \CodeAfter% + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% + \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/}% + \readlist*\ListeNombreAPlacer{#2}% + \setsepchar{,}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+1.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + } + \fi% + \end{NiceTabular}% + \end{center}% + \setlength{\tabcolsep}{100\tabcolsep}% + }{}% + % + %%% Cl\'e Entiers + % + \ifboolKV[ClesTableaux]{Entiers}{% + \xdef\DecalageLigne{0}% + \xdef\TailleFonte{\useKV[ClesTableaux]{Taille}}% + \setlength{\tabcolsep}{0.01\tabcolsep}% + \begin{center}% + % + %%% Definition du tableau + % + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{10}}{\xdef\PfCDerniereColonne{7}}}% + \begin{NiceTabular}{*{% + \ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }% + }{m{\useKV[ClesTableaux]{Largeur}}}}% + \ifboolKV[ClesTableaux]{Classes}{% + \hline + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&% + }{} + \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} + \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% + &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&\\}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}% + \Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{}\\ + }%ok + \hline + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[draw]{}{\fontsize{\TailleFonte}{\TailleFonte}\selectfont centaines de milliards}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% + & + }{} + \ifboolKV[ClesTableaux]{Millions}{% + \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% + & + }{} + \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de milliers}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es}\\% + \ifboolKV[ClesTableaux]{Nombres}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}% + &% + }{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}% + &% + }{}% + \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10}}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1}}% + \\ + }{}% + % + %%% Prise en compte de la cl\'e Puissances + % + \ifboolKV[ClesTableaux]{Puissances}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + &% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% + &% + &% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + &% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &% + }{% + }}% + &% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^3$}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% + &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% + \\% + }{}% + % + %%% Lignes vierges + % + \hline% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + &&&}{}% + &&&&&\\}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[]{}{\tikz[remember picture,overlay]{\coordinate (L1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (K1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (J1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}% + \Block[]{}{\tikz[remember picture,overlay]{\coordinate (F1);}} + &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (E1);}} + &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (D1);}} + &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (C1);}} + &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (B1);}} + &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (A1);}}\\ + \CodeAfter% + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{\PfCDerniereColonne}}\do{% + \tikz\draw (\fpeval{\DecalageLigne+1}-|##1)--(\fpeval{\DecalageLigne+1+\useKV[ClesTableaux]{NbLignes}+1}-|##1);% + }% + %% On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar{,}% + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% + \StrLen{\ListeNombreAPlacer[##2]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonne-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2]}{##1}{##1}};% + }% + }% + \fi% + % On trace les éventuelles fleches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%% + \ifboolKV[ClesTableaux]{Classes}{}{% + \ifboolKV[ClesTableaux]{FlechesB}{% + \ifboolKV[ClesTableaux]{Milliards}{% + \xintFor* ##1 in {\xintSeq{1}{11}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% + }% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% + }% + }{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% + }% + }% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \ifboolKV[ClesTableaux]{Milliards}{% + \xintFor* ##1 in {\xintSeq{1}{11}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }% + }% + }{}% + }% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular}% + \end{center}% + \setlength{\tabcolsep}{100\tabcolsep}% + }{}% + % + %%% Cl\'e Decimaux + % + \ifboolKV[ClesTableaux]{Decimaux}{% + \xdef\DecalageLigne{0}% + \setlength{\tabcolsep}{0.01\tabcolsep}% + \begin{center}% + % + %%% Definition du tableau + % + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% + \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{m{4.75em}}>{\columncolor{gray!15}}{c}*{3}{m{4.75em}}}% + % + %%% Prise en compte de la cl\'e Partie + % + \ifboolKV[ClesTableaux]{Partie}{% + \Block[]{1-% + \ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + &&&% + }{% + }}% + &&&&&% + &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%% + &\Block[]{1-3}{\bfseries Partie d\'ecimale}% + &&\\ + }{}% + % + %%% Prise en compte de la cl\'e Classes + % + \ifboolKV[ClesTableaux]{Classes}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% + \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% + &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& + &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[draw]{1-3}{}&&% + \\ + }{}% + % + %%% Valeurs ci-dessous par d\'efaut + % + \hline + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% + &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% + & + }{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% + &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% + & + }{}% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\ + % + %%% Prise en compte de la cl\'e Nombres + % + \ifboolKV[ClesTableaux]{Nombres}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{}% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% + &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% + &% + }{}% + \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% + \\ + }{}% + % + %%% Prise en compte de la cl\'e Puissances + % + \ifboolKV[ClesTableaux]{Puissances}{% + \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% + \ifboolKV[ClesTableaux]{Milliards}{% + \Block[borders={left,right}]{}{}&% + \Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &\Block[borders={right}]{}{}% + }{% + \ifboolKV[ClesTableaux]{Millions}{% + \Block[borders={left,right}]{}{}&% + \Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% + &% + }{% + }}% + \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% + &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}% + &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}% + \\% + }{}% + % + %%% Lignes vierges + % + \hline% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + &&&}{}% + &&&&&&,&&&\\}% + \CodeAfter% + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% + \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% + \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}% + \setsepchar[*]{,*.}% + \ignoreemptyitems% + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% + }% + \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% + \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% + }% + }% + }% + \fi% + \end{NiceTabular}% + \end{center}% + \setlength{\tabcolsep}{100\tabcolsep}% + }{}% + % Décimal version inclinée + \ifboolKV[ClesTableaux]{Incline}{% + \colorlet{PfCCouleurd}{\useKV[ClesTableaux]{Couleurd}}% + \xdef\DecalageLigne{0}% + \setlength{\tabcolsep}{0.01\tabcolsep}% + \begin{center}% + % + %%% Definition du tableau + % + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{17}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{14}}{\xdef\PfCDerniereColonne{11}}}% + \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% + \ifboolKV[ClesTableaux]{Millions}{9}{6}% + }}{wc{1cm}}*{5}{wc{1cm}}}% + % + \CodeBefore% + \ifboolKV[ClesTableaux]{Milliards}{% + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!50] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!40] (14|-5)--(15|-1)--(16|-1)--(15|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!30] (15|-5)--(16|-1)--(17|-1)--(16|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!20] (16|-5)--(17|-1)--(18|-1)--(17|-5)--cycle; + }{\ifboolKV[ClesTableaux]{Millions}{% + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!50] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!40] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!30] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!20] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle; + }{% + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; + \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!50] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!40] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!30] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; + \tikz\draw[draw=black,fill=PfCCouleurd!20] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; + }% + }% + \Body + %% Pour décaler et laisser la place nécessaire + \xintFor* ##1 in {\xintSeq{1}{4}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + &&&}{}% + &&&&&&&&&&\\}% + %%% Lignes vierges + % + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + \ifboolKV[ClesTableaux]{Milliards}{% + &&&&&&}{}% + \ifboolKV[ClesTableaux]{Millions}{% + &&&}{}% + &&&&&&&&&&\\}% + \CodeAfter%% + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{2}{\fpeval{\PfCDerniereColonne-1}}}\do{% + \tikz\draw[dashed] (\fpeval{\DecalageLigne+5}-|##1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|##1);% + }% + \tikz\draw (\fpeval{\DecalageLigne+5}-|1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|1);% + \tikz\draw (\fpeval{\DecalageLigne+5}-|\fpeval{\PfCDerniereColonne})--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{\PfCDerniereColonne});% + %% On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% + \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+1}}% + \setsepchar[*]{,*.}% + \ignoreemptyitems% + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% + }% + \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% + \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{% + %On place la virgule + \tikz\node[xshift=1em] at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+1}) {\PfCTBstrut,};% + %on écrit la partie décimale + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% + }% + }% + }% + \fi% + \ifboolKV[ClesTableaux]{Milliards}{% + \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliards\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliards\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliards\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (15|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (16|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (17|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; + }{\ifboolKV[ClesTableaux]{Millions}{% + \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; + }{% + \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; + \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; + }% + }% + \end{NiceTabular}% + \end{center}% + \setlength{\tabcolsep}{100\tabcolsep}% + }{}% + % + %%% Prise en compte de la cl\'e Metre + % + \ifboolKV[ClesTableaux]{Metre}{% + \[\renewcommand{\arraystretch}{1.15}% + \begin{NiceTabular}{*{7}{wc{7.5mm}}}% + \Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{}\\ + \Block[draw]{}{km\PfCTBstrut}&\Block[draw]{1-1}{hm\PfCTBstrut}&\Block[draw]{1-1}{dam\PfCTBstrut}&\Block[draw]{1-1}{m\PfCTBstrut}&\Block[draw]{1-1}{dm\PfCTBstrut}&\Block[draw]{1-1}{cm\PfCTBstrut}&\Block[draw]{1-1}{mm\PfCTBstrut}\\ + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&&\\ + }% + \Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + } + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular}% + \]% + }% + {}% + % + %%% Prise en compte de la cl\'e Carre + % + \ifboolKV[ClesTableaux]{Carre}{% + \[\renewcommand{\arraystretch}{1.15}% + \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}}}% + \Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}\\ + \Block[borders={left,top,right}]{1-2}{km$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{hm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{dam$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{m$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{dm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{cm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{mm$^2$\PfCTBstrut}&\\ + \ifboolKV[ClesTableaux]{Are}{% + \Block[borders={left,right,bottom}]{1-2}{}&&\Block[draw=gray!50,borders={left,top,bottom}]{}{~}&\Block[borders={top,right,bottom}]{}{\scriptsize ha}&\Block[draw=gray!50,borders={left,top,bottom}]{}{~}&\Block[borders={top,right,bottom}]{}{\scriptsize a}&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&\\ + }{\hline}% + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&&&&&&&&&\\ + }% + \Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}% + &&\Block[]{1-2}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintifboolexpr{\useKV[ClesTableaux]{Are}}{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (4-|\fpeval{2*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1}); + }% + \xintFor* ##1 in {\xintSeq{1}{7}}\do{% + \tikz\draw[gray!50] (4-|\fpeval{2*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2}); + }% + }{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (3-|\fpeval{2*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1}); + }% + \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% + \xintFor* ##1 in {\xintSeq{1}{7}}\do{% + \tikz\draw[gray!50] (3-|\fpeval{2*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2}); + }% + }{}% + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Are}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + } + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{Are}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2*##1}) to node[above, midway]{\small$\times\num{100}$}(1.5-|\fpeval{2*(##1+1)});% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*(##1+1)}) to node[below,midway]{\small$\div\num{100}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*##1});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular} + \]% + }{}% + % + %%% Prise en compte de la cl\'e Cube + % + \ifboolKV[ClesTableaux]{Cube}{% + \[\renewcommand{\arraystretch}{1.15}% +% \setlength{\tabcolsep}{0.625\tabcolsep}% +% \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}} + \setlength{\tabcolsep}{0.275\tabcolsep}% + \begin{NiceTabular}{*{7}{wc{15pt}wc{15pt}wc{15pt}}} + \Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}\\ + \Block[borders={left,top,right}]{1-3}{km$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{hm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dam$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{m$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{cm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mm$^3$\PfCTBstrut}&&\\ + \ifboolKV[ClesTableaux]{Capacite}{% + \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\ + }{\hline}% + \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&&&&&&&&&&&&&&&&\\ + }% + \Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}% + &&&\Block[]{1-3}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintifboolexpr{\useKV[ClesTableaux]{Capacite}}{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (4-|\fpeval{3*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); + }% + \xintFor* ##1 in {\xintSeq{1}{7}}\do{% + \tikz\draw[gray!50] (4-|\fpeval{3*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); + \tikz\draw[gray!50] (4-|\fpeval{3*##1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); + }% + }{% + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (3-|\fpeval{3*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); + }% + \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% + \xintFor* ##1 in {\xintSeq{1}{7}}\do{% + \tikz\draw[gray!50] (3-|\fpeval{3*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); + \tikz\draw[gray!50] (3-|\fpeval{3*##1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); + }% + }{}% + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Capacite}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + }% + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{Capacite}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2.5+3*(##1-1)}) to node[above, midway]{\small$\times\num{1000}$}(1.5-|\fpeval{2.5+3*##1});% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*##1}) to node[below,midway]{\small$\div\num{1000}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*(##1-1)});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular} + \]% + }{}% + % + %%% Prise en compte de la cl\'e Litre + % + \ifboolKV[ClesTableaux]{Litre}{% + \[\renewcommand{\arraystretch}{1.15}% + \begin{NiceTabular}{*{6}{wc{7.5mm}}}% + \Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{}\\ + \Block[draw]{}{hL\PfCTBstrut}&\Block[draw]{}{daL\PfCTBstrut}&\Block[draw]{}{L\PfCTBstrut}&\Block[draw]{}{dL\PfCTBstrut}&\Block[draw]{}{cL\PfCTBstrut}&\Block[draw]{}{mL\PfCTBstrut}\\ + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&\\ + } + \Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{} + &\Block[]{1-1}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{7}}\do{% + \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + }% + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{5}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular}% + \]% + }{}% + % + %%% Prise en compte de la cl\'e Gramme + % + \ifboolKV[ClesTableaux]{Gramme}{% + \[\renewcommand{\arraystretch}{1.15}% + \begin{NiceTabular}{*{7}{wc{7.5mm}}}% + \Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{}\\ + \Block[draw]{}{kg\PfCTBstrut}&\Block[draw]{1-1}{hg\PfCTBstrut}&\Block[draw]{1-1}{dag\PfCTBstrut}&\Block[draw]{1-1}{g\PfCTBstrut}&\Block[draw]{1-1}{dg\PfCTBstrut}&\Block[draw]{1-1}{cg\PfCTBstrut}&\Block[draw]{1-1}{mg\PfCTBstrut}\\ + \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% + &&&&&&\\ + }% + \Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{} + &\Block[]{}{}\\ + \CodeAfter + % on trace les lignes verticales + \xintFor* ##1 in {\xintSeq{1}{8}}\do{% + \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); + }% + % On place le nombre éventuel + \ifx\bla#2\bla% + \else% + \setsepchar[*]{,*/} + \readlist*\ListeNombreAPlacer{#2}% + \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ + \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% + \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% + \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; + }% + } + \fi% + % on trace les flèches + \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% + \ifboolKV[ClesTableaux]{FlechesH}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% + }% + }{}% + \ifboolKV[ClesTableaux]{FlechesB}{% + \xintFor* ##1 in {\xintSeq{1}{6}}\do{% + \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% + }% + }{}% + \useKV[ClesTableaux]{CodeAfter}% + \end{NiceTabular}% + \]% + }{}% +}% +}% + +\newcommand\PfCTableauIncline{% +\begin{NiceTabular}{wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}} + &&&&&&\\ + \Block[borders={bottom}]{}{\si{\kilo\PfCTableauUnite}}&\\ + &\Block[borders={left}]{}{}&\\ + &\Block[borders={left,bottom}]{}{\si{\hecto\PfCTableauUnite}}&\\ + &&\Block[borders={left}]{}{}&\\ + &&\Block[borders={left,bottom}]{}{\si{\deca\PfCTableauUnite}}&\\ + &&&\Block[borders={left}]{}{}&\\ + &&&\Block[borders={left,bottom}]{}{\si{\PfCTableauUnite}}&\\ + &&&&\Block[borders={left}]{}{}&\\ + &&&&\Block[borders={left,bottom}]{}{\si{\deci\PfCTableauUnite}}&\\ + &&&&&\Block[borders={left}]{}{}&\\ + &&&&&\Block[borders={left,bottom}]{}{\si{\centi\PfCTableauUnite}}&\\ + &&&&&&\Block[borders={left}]{}{}\\ + &&&&&&\Block[borders={left,bottom}]{}{\si{\milli\PfCTableauUnite}}\\ + &&&&&& + \CodeAfter + \tikz\draw[out=35,in=90,-stealth,gray] (2-|1.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(4-|2.5); + \tikz\draw[out=35,in=90,-stealth,gray] (4-|2.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(6-|3.5); + \tikz\draw[out=35,in=90,-stealth,gray] (6-|3.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(8-|4.5); + \tikz\draw[out=35,in=90,-stealth,gray] (8-|4.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(10-|5.5); + \tikz\draw[out=35,in=90,-stealth,gray] (10-|5.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(12-|6.5); + \tikz\draw[out=35,in=90,-stealth,gray] (12-|6.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(14-|7.5); + % bas + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (15-|7.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(13-|6.5); + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (13-|6.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(11-|5.5); + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (11-|5.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(9-|4.5); + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (9-|4.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(7-|3.5); + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (7-|3.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(5-|2.5); + \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (5-|2.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(3-|1.5); +\end{NiceTabular}% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTablesOperations.tex b/macros/latex/contrib/profcollege/latex/PfCTablesOperations.tex new file mode 100644 index 0000000000..40015eaeec --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTablesOperations.tex @@ -0,0 +1,103 @@ +%%% +% Tables Addition-Multiplication +%%% +\setKVdefault[Tables]{Addition=false,Multiplication=true,Seul=false,Debut=0,Fin=10,Couleur=white} + +% pour m\'emoire +\newcommand\TableMultiplicationComplete{% + \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% + \begin{tabular}{|>{\columncolor{gray!15}\centering\arraybackslash}p{1.5em}|*{\NbColTabMul}{>{\centering\arraybackslash}p{1.5em}|}}% + \hline + $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\cellcolor{gray!15}\fpeval{##1} + } + \\ + \hline + \xintFor* ##1 in {\xintSeq {0}{10}}\do{% + ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\fpeval{##2*##1} + } + \\ + \hline + } + \end{tabular}% +} +%%%% + +\newcommand\TableMultiplicationCompleteColore{% + \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% + \begin{tabular}{|>{\columncolor{gray!15}\centering}p{15pt}|*{\NbColTabMul}{>{\centering\arraybackslash}p{15pt}|}}% + \hline + $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\cellcolor{gray!15}\fpeval{##1}% + } + \\ + \hline + \xintFor* ##1 in {\xintSeq {0}{10}}\do{% + ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\xintifboolexpr{##2<##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##1*10}}}{\xintifboolexpr{##2>##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##2*10}}}{}}\fpeval{##2*##1}% + }% + \\ + \hline + }% + \end{tabular}% +}% + +\newcommand\TableAdditionComplete{% + \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% + \begin{tabular}{|>{\columncolor{gray!15}\centering}p{15pt}|*{\NbColTabMul}{>{\centering\arraybackslash}p{15pt}|}}% + \hline + $+$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\cellcolor{gray!15}\fpeval{##1} + } + \\ + \hline + \xintFor* ##1 in {\xintSeq {0}{10}}\do{% + ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% + &\fpeval{##2+##1} + } + \\ + \hline + } + \end{tabular}% +} + +\newcommand\TableMultiplicationSeule[1]{% + \ensuremath{% + \begin{array}{ccccc}% + \xintFor* ##1 in {\xintSeq + {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{ + ##1&\times&=&\fpeval{##1*#1}\\ + } + \end{array} + }% +}% + +\newcommand\TableAdditionSeule[1]{% + \ensuremath{% + \begin{array}{ccccc} + \xintFor* ##1 in {\xintSeq + {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{ + ##1&+&=&\fpeval{##1+#1}\\ + } + \end{array} + }% +}% + +\newcommand\Tables[2][]{% + \useKVdefault[Tables]% + \setKV[Tables]{#1}% + \ifboolKV[Tables]{Seul}{% + \ifboolKV[Tables]{Addition}{% + \TableAdditionSeule{#2}% + }{% + \TableMultiplicationSeule{#2}% + }% + }{% + \ifboolKV[Tables]{Addition}{% + \TableAdditionComplete% + }{% + \TableMultiplicationCompleteColore% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTectonic.tex b/macros/latex/contrib/profcollege/latex/PfCTectonic.tex new file mode 100644 index 0000000000..df859b0453 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTectonic.tex @@ -0,0 +1,108 @@ +%%% +% Tectonic +%%% +\setKVdefault[ClesTectonic]{CouleurCase=LightGray,TLargeur=5,THauteur=5,Solution=false,Largeur=25pt,CouleurSolution=black,Tailles=false,Aide=false}% +\defKV[ClesTectonic]{Taille=\setKV[ClesTectonic]{Tailles}}% +\defKV[ClesTectonic]{ListeNombres=\setKV[ClesTectonic]{Aide}}% + +\newlength\PfCTectonic + +\NewDocumentCommand\Tectonic{o m}{% + \useKVdefault[ClesTectonic]% + \setKV[ClesTectonic]{#1}% + \ifboolKV[ClesTectonic]{Tailles}{% + \setKV[ClesTectonic]{THauteur=\useKV[ClesTectonic]{Taille}}% + \setKV[ClesTectonic]{TLargeur=\useKV[ClesTectonic]{Taille}}% + }{}% + \setlength{\PfCTectonic}{\useKV[ClesTectonic]{Largeur}+\tabcolsep}% + \setsepchar[*]{,*/}% + \readlist*\ListeCasesTectonic{#2}% + \savecomparemode% + \comparestrict% + \begin{NiceTabular}{*{\useKV[ClesTectonic]{TLargeur}}{m{\useKV[ClesTectonic]{Largeur}}}}% + \CodeBefore% + \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesTectonic]{THauteur}}}}\do{% + \tikz\draw[gray] (##1-|1) -- (##1-|last);% + }% + \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesTectonic]{TLargeur}}}}\do{% + \tikz\draw[gray] (1-|##1) -- (last-|##1);% + }% + \Body% + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[ClesTectonic]{THauteur}-1}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesTectonic]{TLargeur}}}\do{% + \rule{0pt}{\PfCTectonic}% + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{b}[\PfCTestb]%\PfCTestb + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{l}[\PfCTestl]%\PfCTestr + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{lb}[\PfCTestlb]%\PfCTestbr + \xintifboolexpr{\PfCTestb==0}{% + \Block[borders={bottom},line-width=2pt]{1-1}{% + \ifboolKV[ClesTectonic]{Solution}{% + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] + \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{}% + \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% + }{% + \ifboolKV[ClesTectonic]{Aide}{% + \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \xintifboolexpr{\PfCTestl==0}{% + \Block[borders={left},line-width=2pt]{1-1}{\ifboolKV[ClesTectonic]{Solution}{% + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] + \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{}% + \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% + \ifboolKV[ClesTectonic]{Aide}{% + \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \xintifboolexpr{\PfCTestlb==0}{% + \Block[borders={bottom,left},line-width=2pt]{1-1}{\ifboolKV[ClesTectonic]{Solution}{% + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] + \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{} + \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% + \ifboolKV[ClesTectonic]{Aide}{% + \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% + }{}% + }{}% + }% + }% + }{% + \Block{1-1}{\ifboolKV[ClesTectonic]{Solution}{% + \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] + \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{} + \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% + \ifboolKV[ClesTectonic]{Aide}{% + \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% + \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% + }{}% + }{}% + }% + }% + }% + }% + }% + \xintifForLast{\\}{&}% + }% + }% + \CodeAfter% + \tikz\draw[line width=2pt] (1-|1) rectangle (last-|last);% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesTectonic]{THauteur}}}}\do{% + \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesTectonic]{TLargeur}}}\do{% + \ifboolKV[ClesTectonic]{Solution}{% + %\tikz\node[fill=white] at (\fpeval{##1+0.5} -|\fpeval{##2+0.5}) {\Large$\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*(##1-1)+##2},2]$};% + }{% + \tikz\node at (\fpeval{##1+0.5} -|\fpeval{##2+0.5}) {\Large$\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*(##1-1)+##2},2]$};% + }% + }% + }% + \end{NiceTabular}% + \restorecomparemode% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCThales.tex b/macros/latex/contrib/profcollege/latex/PfCThales.tex new file mode 100644 index 0000000000..7e1583c23e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCThales.tex @@ -0,0 +1,1331 @@ +%%% +% Thales +%%% +\newcount\ppcm% + +\newcommand\PPCM[2]{% + \PGCD{#1}{#2}% + \ppcm=\numexpr#1*#2/\pgcd\relax% +}% + +\setKVdefault[ClesThales]{Calcul=true,Droites=false,Propor=false,Segment=false,Figure=false,FigureSeule=false,Figurecroisee=false,FigurecroiseeSeule=false,Angle=0,Precision=2,Entier=false,Unite=cm,Reciproque=false,Produit=false,ChoixCalcul=0,Simplification,Redaction=false,Remediation=false,Echelle=1cm,Perso=false,CalculsPerso=false,IntroCalculs,CouleursNum=false,CouleursDen=false} +\defKV[ClesThales]{CouleurNum=\setKV[ClesThales]{CouleursNum}} +\defKV[ClesThales]{CouleurDen=\setKV[ClesThales]{CouleursDen}} + +\DeclareSIUnit{\PfCThalesUnit}{\useKV[ClesThales]{Unite}}% + +%On d\'efinit la figure \`a utiliser +\def\MPFigThales#1#2#3#4#5#6{ + % #1 Premier sommet + % #2 Deuxi\`eme sommet + % #3 Troisi\`eme sommet + % #4 point sur le segment #1#2 + % #5 point sur le segment #1#3 + % #6 angle de rotation + \ifluatex +% \mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesThales]{Echelle}; + boolean CouleursNum,CouleursDen; + CouleursNum=\useKV[ClesThales]{CouleursNum}; + CouleursDen=\useKV[ClesThales]{CouleursDen}; + color CouleurNum,CouleurDen; + if CouleursNum: + CouleurNum=\useKV[ClesThales]{CouleurNum} + else: + CouleurNum=black + fi; + if CouleursDen: + CouleurDen=\useKV[ClesThales]{CouleurDen} + else: + CouleurDen=black + fi; + pair A,B,C,M,N,O;% + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(4,0); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + M=point(0.4*length cotes1) of cotes1; + N=point(0.6*length cotes3) of cotes3; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + path triangle; + triangle=cotes1--cotes2--cotes3--cycle; + draw triangle; + draw cotes4; + if CouleursDen: + draw triangle dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen; + fi; + if CouleursNum: + draw (cotes1 cutafter cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + draw (cotes4 cutbefore cotes1 cutafter cotes3) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + draw (cotes3 cutbefore cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + fi; + %on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex #4 etex,1.1[C,M]); + label(btex #5 etex,1.1[B,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); + pair I,J,K; + I=1/2[M,N]; + J=1/2[B,C]; + K=1/2[I,J]; + path cd; + cd=(fullcircle scaled 6mm) shifted K; + drawoptions(withcolor 0.75*white); + drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); + drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); + draw cd; + label(btex $//$ etex ,K); + drawoptions(); + \end{mplibcode} +% \mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};boolean CouleursNum,CouleursDen; + CouleursNum=\useKV[ClesThales]{CouleursNum}; + CouleursDen=\useKV[ClesThales]{CouleursDen}; + color CouleurNum,CouleurDen; + if CouleursNum: + CouleurNum=\useKV[ClesThales]{CouleurNum} + else: + CouleurNum=black + fi; + if CouleursDen: + CouleurDen=\useKV[ClesThales]{CouleurDen} + else: + CouleurDen=black + fi;}] + pair A,B,C,M,N,O;% + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(4,0); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + M=point(0.4*length cotes1) of cotes1; + N=point(0.6*length cotes3) of cotes3; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + path triangle; + triangle=cotes1--cotes2--cotes3--cycle; + draw triangle; + draw cotes4; + if CouleursDen: + draw triangle dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen; + fi; + if CouleursNum: + draw (cotes1 cutafter cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + draw (cotes4 cutbefore cotes1 cutafter cotes3) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + draw (cotes3 cutbefore cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; + fi; + %on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex #4 etex,1.1[C,M]); + label(btex #5 etex,1.1[B,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); + pair I,J,K; + I=1/2[M,N]; + J=1/2[B,C]; + K=1/2[I,J]; + path cd; + cd=(fullcircle scaled 6mm) shifted K; + drawoptions(withcolor 0.75*white); + drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); + drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); + draw cd; + label(btex $//$ etex ,K); + drawoptions(); + \end{mpost} + \fi +} + +%On d\'efinit la figure \`a utiliser +\def\MPFigReciThales#1#2#3#4#5#6{ + % #1 Premier sommet + % #2 Deuxi\`eme sommet + % #3 Troisi\`eme sommet + % #4 point sur le segment #1#2 + % #5 point sur le segment #1#3 + \ifluatex + \mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesThales]{Echelle}; + pair A,B,C,M,N,O;% + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(4,0); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + M=point(0.4*length cotes1) of cotes1; + N=point(0.6*length cotes3) of cotes3; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + path triangle; + triangle=cotes1--cotes2--cotes3--cycle; + draw triangle; + draw cotes4; + %on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex #4 etex,1.1[C,M]); + label(btex #5 etex,1.1[B,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); + \end{mplibcode} + \mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}] + pair A,B,C,M,N,O;% + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(4,0); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + M=point(0.4*length cotes1) of cotes1; + N=point(0.6*length cotes3) of cotes3; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + path triangle; + triangle=cotes1--cotes2--cotes3--cycle; + draw triangle; + draw cotes4; + %on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex #4 etex,1.1[C,M]); + label(btex #5 etex,1.1[B,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); + \end{mpost} + \fi +} + +%On d\'efinit la deuxi\`eme figure \`a utiliser +\def\MPFigThalesCroisee#1#2#3#4#5#6{% + % #1 Premier sommet + % #2 Deuxi\`eme sommet + % #3 Troisi\`eme sommet + % #4 point sur la droite #1#2 + % #5 point sur la droite #1#3 + \ifluatex + \mplibforcehmode + \mplibcodeinherit{enable} + \begin{mplibcode} + u:=\useKV[ClesThales]{Echelle}; + boolean CouleursNum,CouleursDen; + CouleursNum=\useKV[ClesThales]{CouleursNum}; + CouleursDen=\useKV[ClesThales]{CouleursDen}; + color CouleurNum,CouleurDen; + if CouleursNum: + CouleurNum=\useKV[ClesThales]{CouleurNum} + else: + CouleurNum=black + fi; + if CouleursDen: + CouleurDen=\useKV[ClesThales]{CouleurDen} + else: + CouleurDen=black + fi; + pair A,B,C,M,N,O;% + O=(2.5u,2.5u); + path cc; + cc=(fullcircle scaled 3u) shifted O; + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.1*length cc) of cc; + B=A rotatedabout(O,130); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + M=1.4[B,A]; + N=1.4[C,A]; + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; + cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; + cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; + cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; + for k=1 upto 6: + draw cotes[k]; + endfor; + if CouleursDen: + drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen); + draw (cotes[1] cutafter cotes[2]); + draw (cotes[2] cutbefore cotes[1] cutafter cotes[3]); + draw (cotes[3] cutbefore cotes[2]); + drawoptions(); + fi; + if CouleursNum: + drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurNum); + draw (cotes[5] cutafter cotes[4]); + draw (cotes[4] cutbefore cotes[5] cutafter cotes[6]); + draw (cotes[6] cutafter cotes[4]); + drawoptions(); + fi; + pair I; + % On d\'efinit le centre du cercle inscrit \`a AMC + (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; + (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; + %on labelise + label(btex #1 etex,I); + label(btex #2 etex,1.2[M,B]); + label(btex #3 etex,1.2[N,C]); + label(btex #4 etex,1.1[B,M]); + label(btex #5 etex,1.1[C,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); + pair I,J,K; + I=1.1[N,M]; + J=1.1[B,C]; + K=1/2[I,J]; + path cd; + cd=(fullcircle scaled 6mm) shifted K; + drawoptions(withcolor 0.75*white); + drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); + drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); + draw cd; + label(btex $//$ etex ,K); + drawoptions(); + \end{mplibcode} + \mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};boolean CouleursNum,CouleursDen; + CouleursNum=\useKV[ClesThales]{CouleursNum}; + CouleursDen=\useKV[ClesThales]{CouleursDen}; + color CouleurNum,CouleurDen; + if CouleursNum: + CouleurNum=\useKV[ClesThales]{CouleurNum} + else: + CouleurNum=black + fi; + if CouleursDen: + CouleurDen=\useKV[ClesThales]{CouleurDen} + else: + CouleurDen=black + fi;}] + pair A,B,C,M,N,O;% + O=(2.5u,2.5u); + path cc; + cc=(fullcircle scaled 3u) shifted O; + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.1*length cc) of cc; + B=A rotatedabout(O,130); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + M=1.4[B,A]; + N=1.4[C,A]; + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; + cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; + cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; + cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; + for k=1 upto 6: + draw cotes[k]; + endfor; + if CouleursDen: + drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen); + draw (cotes[1] cutafter cotes[2]); + draw (cotes[2] cutbefore cotes[1] cutafter cotes[3]); + draw (cotes[3] cutbefore cotes[2]); + drawoptions(); + fi; + if CouleursNum: + drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurNum); + draw (cotes[5] cutafter cotes[4]); + draw (cotes[4] cutbefore cotes[5] cutafter cotes[6]); + draw (cotes[6] cutafter cotes[4]); + drawoptions(); + fi; + pair I; + % On d\'efinit le centre du cercle inscrit \`a AMC + (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; + (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; + %on labelise + label(btex #1 etex,I); + label(btex #2 etex,1.2[M,B]); + label(btex #3 etex,1.2[N,C]); + label(btex #4 etex,1.1[B,M]); + label(btex #5 etex,1.1[C,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); + pair I,J,K; + I=1.1[N,M]; + J=1.1[B,C]; + K=1/2[I,J]; + path cd; + cd=(fullcircle scaled 6mm) shifted K; + drawoptions(withcolor 0.75*white); + drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); + drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); + draw cd; + label(btex $//$ etex ,K); + drawoptions(); + \end{mpost} + \fi +} + +%On d\'efinit la deuxi\`eme figure \`a utiliser +\def\MPFigReciThalesCroisee#1#2#3#4#5#6{% + % #1 Premier sommet + % #2 Deuxi\`eme sommet + % #3 Troisi\`eme sommet + % #4 point sur la droite #1#2 + % #5 point sur la droite #1#3 + \ifluatex + \mplibforcehmode + \mplibcodeinherit{enable} + \begin{mplibcode} + u:=\useKV[ClesThales]{Echelle}; + pair A,B,C,M,N,O;% + O=(2.5u,2.5u); + path cc; + cc=(fullcircle scaled 3u) shifted O; + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.1*length cc) of cc; + B=A rotatedabout(O,130); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + M=1.4[B,A]; + N=1.4[C,A]; + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; + cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; + cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; + cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; + for k=1 upto 6: + draw cotes[k]; + endfor; + pair I; + % On d\'efinit le centre du cercle inscrit \`a AMC + (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; + (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; + %on labelise + label(btex #1 etex,I); + label(btex #2 etex,1.2[M,B]); + label(btex #3 etex,1.2[N,C]); + label(btex #4 etex,1.1[B,M]); + label(btex #5 etex,1.1[C,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2); + \end{mplibcode} + \mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}] + pair A,B,C,M,N,O;% + O=(2.5u,2.5u); + path cc; + cc=(fullcircle scaled 3u) shifted O; + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=point(0.1*length cc) of cc; + B=A rotatedabout(O,130); + C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#6); + B:=B rotatedabout(O,#6); + C:=C rotatedabout(O,#6); + % on dessine \`a main lev\'ee :) + M=1.4[B,A]; + N=1.4[C,A]; + path cotes[]; + cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; + cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; + cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; + cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; + cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; + for k=1 upto 6: + draw cotes[k]; + endfor; + pair I; + % On d\'efinit le centre du cercle inscrit \`a AMC + (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; + (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; + %on labelise + label(btex #1 etex,I); + label(btex #2 etex,1.2[M,B]); + label(btex #3 etex,1.2[N,C]); + label(btex #4 etex,1.1[B,M]); + label(btex #5 etex,1.1[C,N]); + fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); + fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2); + fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2); + \end{mpost} + \fi +} + +\newcommand\RedactionThales{}% +\newcommand\EcritureCalculs{}% +\newcommand\EcritureQuotients{}% + +%%% +\newcommand\TTThales[6][]{% + \useKVdefault[ClesThales]% + \setKV[ClesThales]{#1}% + \ifboolKV[ClesThales]{Perso}{\RedactionThales}{% + \ifboolKV[ClesThales]{Droites}{% + Les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#5)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#4#6)$} sont s\'ecantes en \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2$}.% + }{% + Dans le triangle \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2#3#4$}, \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#5$} est un point \ifboolKV[ClesThales]{Segment}{du segment}{de la + droite} + \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#3]$}{$(#2#3)$}}, + \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#6$} est un + point \ifboolKV[ClesThales]{Segment}{du segment}{de la droite} + \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#4]$}{$(#2#4)$}}.% + } + \\Comme les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#5#6)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#4)$} sont parall\`eles, alors \ifboolKV[ClesThales]{Propor}{le tableau% + \[\begin{array}{c|c|c} + \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#5}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#6}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#5#6}\\ + \hline + \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#3}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#4}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#3#4}\\ + \end{array} + \] + est un tableau de proportionnalit\'e\ifboolKV[ClesThales]{Segment}{.}{ d'apr\`es le th\'eor\`eme de Thal\`es.}% + }{% + \ifboolKV[ClesThales]{Segment}{on a :}{le th\'eor\`eme de Thal\`es permet d'\'ecrire :}% + \[\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#2#5}}{#2#5}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#2#3}}{#2#3}}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#2#6}}{#2#6}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#2#4}}{#2#4}}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#5#6}}{#5#6}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#3#4}}{#3#4}}}\]% + }% + }% +}% + +\newcommand\TThalesCalculsD[8][]{% + \setKV[ClesThales]{#1}% + \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire% + \def\Nomx{}% + \def\Nomy{}% + \def\Nomz{}% + \zzz=0\yyy=0\xxx=0% + \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par +\IfDecimal{#3}{% + \IfDecimal{#6}{}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \xxx=5263%#6&=\frac{#3\times#7}{#4}\\ + \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#7}{Valx}\opcopy{#4}{denox}% + \xdef\ResultatThalesx{\fpeval{round(#3*#7/#4,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] + \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}% + \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] + \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}% + \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + } + }{% + \IfDecimal{#6}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]% + \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#4}{Valx}\opcopy{#7}{denox}% + \xdef\ResultatThalesx{\fpeval{round(#6*#4/#7,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 + \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\] + \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 + \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\] + \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{} + }% + % + \IfDecimal{#4}{% + \IfDecimal{#7}{}{% + \IfDecimal{#5}{% + \IfDecimal{#8}{% + \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]% + \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#8}{Valy}\opcopy{#5}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#4*#8/#5,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] + \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] + \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + } + }{% + \IfDecimal{#7}{% + \IfDecimal{#5}{% + \IfDecimal{#8}{% + \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]% + \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#5}{Valy}\opcopy{#8}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#7*#5/#8,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] + \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] + \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}% + \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}% + }{}}{} + }}{}}% + % + \IfDecimal{#5}{% + \IfDecimal{#8}{}{% + \IfDecimal{#4}{ + \IfDecimal{#7}{ + \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]% + \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#7}{Valz}\opcopy{#4}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#5*#7/#4,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] + \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] + \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + } + }{% + \IfDecimal{#8}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]% + \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#4}{Valz}\opcopy{#7}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#8*#4/#7,\useKV[ClesThales]{Precision})}}% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] + \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] + \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}% + \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}% + }{}}{} + }}{} + }% + %% + \StrMid{\the\zzz}{1}{1}[\cmza]% + \StrMid{\the\yyy}{1}{1}[\cmya]% + \StrMid{\the\xxx}{1}{1}[\cmxa]% + \ifboolKV[ClesThales]{Calcul}{% + %%%%%%%%%%%%%%%%%%%%%%%%%%% + \ifboolKV[ClesThales]{IntroCalculs}{On remplace par les longueurs connues :}{}% + \ifboolKV[ClesThales]{CalculsPerso}{% + \EcritureQuotients% + }{% + \ifboolKV[ClesThales]{Propor}{% + \[\begin{array}{c|c|c} + \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\ + \hline + \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8} + \end{array} + \] + }{% + \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\] + }% + }% + % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs. + \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}% + \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}{}% + %% on fait les calculs + \ifboolKV[ClesThales]{CalculsPerso}{% + \EcritureCalculs% + }{% + \begin{align*} + % Premier compteur \xxx + \ifnum\cmxa>0 + \Nomx\uppercase{&}=\frac{\opexport{valx}{\valx}\num{\valx}\times\opexport{Valx}{\Valx}\num{\Valx}}{\opexport{denox}{\denox}\num{\denox}}\relax%\global\numx=\numexpr\opprint{valx}*\opprint{Valx}\relax + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \ifnum\cmxa=0 + \else + \uppercase{&} + \fi% + \Nomy\uppercase{&}=\frac{\opexport{valy}{\valy}\num{\valy}\times\opexport{Valy}{\Valy}\num{\Valy}}{\opexport{denoy}{\denoy}\num{\denoy}}\relax%\global\numy=\numexpr\opprint{valy}*\opprint{Valy}\relax + \fi + % Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \ifnum\cmxa=0 + \ifnum\cmya=0 + % + \else + \uppercase{&} + \fi + \Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax + \else + \uppercase{&}\Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax + \fi + \fi + \\ +% % 2eme ligne du tableau : calcul des num\'erateurs +% %Premier compteur \xxx + \ifnum\cmxa>0 + \Nomx\uppercase{&}=\frac{\opmul*{valx}{Valx}{numx}\opexport{numx}{\numx}\num{\numx}}{\opexport{denox}{\denox}\num{\denox}} + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \ifnum\cmxa=0 + % + \else + \uppercase{&} + \fi + \Nomy\uppercase{&}=\frac{\opmul*{valy}{Valy}{numy}\opexport{numy}{\numy}\num{\numy}}{\opexport{denoy}{\denoy}\num{\denoy}}% + \fi +% %Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \ifnum\cmxa=0 + \ifnum\cmya=0 + % + \else + \uppercase{&} + \fi + \Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}} + \else + \uppercase{&}\Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}} + \fi + \fi + \\ +% % 3eme ligne : Calculs + \ifnum\cmxa>0 + \Nomx\uppercase{&}\opdiv*{numx}{denox}{resultatx}{restex}\opcmp{restex}{0}\ifopeq=\SI{\ResultatThalesx}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesx,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \ifnum\cmxa=0 + % + \else + \uppercase{&} + \fi + \Nomy\uppercase{&}\opdiv*{numy}{denoy}{resultaty}{restey}\opcmp{restey}{0}\ifopeq=\SI{\ResultatThalesy}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesy,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% + \fi +% %Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \ifnum\cmxa=0 + \ifnum\cmya=0 + % + \else + \uppercase{&} + \fi + \Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% + \else + \uppercase{&}\Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% + \fi + \fi + \end{align*} + } +}{} +} + +\newcommand\TThalesCalculsE[8][]{% + \setKV[ClesThales]{#1}% + \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire% + \newcount\valx\newcount\Valx% + \newcount\valy\newcount\Valy% + \newcount\valz\newcount\Valz% + \newcount\numx\newcount\numy\newcount\numz% + \newcount\denox\newcount\denoy\newcount\denoz% + \def\Nomx{}% + \def\Nomy{}% + \def\Nomz{}% + \zzz=0\yyy=0\xxx=0% + \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par% +\IfDecimal{#3}{% + \IfDecimal{#6}{}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \xxx=5263%#6&=\frac{#3\times#7}{#4}\\ + \edef\Nomx{#6}\valx=#3\Valx=#7\denox=#4% + }{% + \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] + \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5% + }{}}{} + } + }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] + \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5% + }{}}{} + } + } + }{% + \IfDecimal{#6}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]% + \edef\Nomx{#3}\valx=#6\Valx=#4\denox=#7% + }{% + \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 + \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\] + }{}}{} + } + }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 + \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\] + }{}}{} + } + }{} + }% + % + \IfDecimal{#4}{% + \IfDecimal{#7}{}{% + \IfDecimal{#5}{% + \IfDecimal{#8}{% + \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]% + \edef\Nomy{#7}\valy=#4\Valy=#8\denoy=#5% + }{% + \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] + \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3% + }{}}{} + } + }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] + \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3% + }{}}{} + } + } + }{% + \IfDecimal{#7}{% + \IfDecimal{#5}{% + \IfDecimal{#8}{% + \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]% + \edef\Nomy{#4}\valy=#7\Valy=#5\denoy=#8% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] + \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] + \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6% + }{}}{} + }}{}}% + % + \IfDecimal{#5}{% + \IfDecimal{#8}{}{% + \IfDecimal{#4}{ + \IfDecimal{#7}{ + \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]% + \edef\Nomz{#8}\valz=#5\Valz=#7\denoz=#4% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] + \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] + \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3% + }{}}{} + } + } + }{% + \IfDecimal{#8}{% + \IfDecimal{#4}{% + \IfDecimal{#7}{% + \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]% + \edef\Nomz{#5}\valz=#8\Valz=#4\denoz=#7% + }{% + \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] + \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6% + }{}}{} + } + }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] + \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6% + }{}}{} + }}{} + }% + %% +\StrMid{\the\zzz}{1}{1}[\cmza]% +\StrMid{\the\yyy}{1}{1}[\cmya]% +\StrMid{\the\xxx}{1}{1}[\cmxa]% +\ifboolKV[ClesThales]{Calcul}{% + %%%%%%%%%%%%%%%%%%%%%%%%%%% + On remplace par les longueurs connues : + \ifboolKV[ClesThales]{Propor}{% + \[\begin{array}{c|c|c} + \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\ + \hline + \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8}\\ + \end{array} + \] + }{% + \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\] + }% + % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs. + \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}% + \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}% + %%on fait les calculs +\begin{align*} + %Premier compteur \xxx + \ifnum\cmxa>0 + \Nomx\uppercase{&}=\frac{\the\valx\times\the\Valx}{\the\denox}\global\numx=\numexpr\the\valx*\the\Valx\relax + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \ifnum\cmxa=0 + \else + \uppercase{&} + \fi% + \Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax + % \else + % \uppercase{&}\Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax + % \fi + \fi + % Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \ifnum\cmxa=0 + \ifnum\cmya=0 + %\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax + \else + \uppercase{&}%\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax + \fi + \Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax + \else + \uppercase{&}\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax + \fi + \fi + \\ + % 2eme ligne du tableau : calcul des num\'erateurs + %Premier compteur \xxx + \ifnum\cmxa>0 + \Nomx\uppercase{&}=\frac{\num{\the\numx}}{\num{\the\denox}} + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \ifnum\cmxa=0 + %\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}} + \else + \uppercase{&}%\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}} + \fi + \Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}}% + \fi + %Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \ifnum\cmxa=0 + \ifnum\cmya=0 + %\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} + \else + \uppercase{&}%\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} + \fi + \Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} + \else + \uppercase{&}\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} + \fi + \fi + \\ + % 3eme ligne : faire les simplifications ou pas ? + %Premier compteur \xxx + \ifnum\cmxa>0 + \PGCD{\the\numx}{\the\denox} + \ifnum\pgcd>1 + \Nomx\uppercase{&}=\SSimpli{\the\numx}{\the\denox} + \else + \uppercase{&} + \fi + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \PGCD{\the\numy}{\the\denoy} + \ifnum\cmxa=0 + \ifnum\pgcd>1 + \Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy} + \else + \uppercase{&} + \fi + \else + \ifnum\pgcd>1 + \uppercase{&}\Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy} + \else + \uppercase{&&} + \fi + \fi + \fi + %Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \PGCD{\the\numz}{\the\denoz} + \ifnum\cmxa=0 + \ifnum\cmya=0 + \ifnum\pgcd>1 + \Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} + \else + \uppercase{&} + \fi + \else + \ifnum\pgcd>1 + \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} + \else + \uppercase{&&} + \fi + \fi + \else + \ifnum\pgcd>1 + \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} + \else + \uppercase{&&} + \fi + \fi + \fi + \\ + % 4eme ligne : Terminer les simplifications ? + %Premier compteur \xxx + \ifnum\cmxa>0 + \PGCD{\the\numx}{\the\denox} + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denox + \Nomx\uppercase{&}=\SSimplifie{\the\numx}{\the\denox} + \else + \uppercase{&} + \fi + \else + \uppercase{&} + \fi + \fi + % % Deuxi\`eme compteur \yyy + \ifnum\cmya>0 + \PGCD{\the\numy}{\the\denoy} + \ifnum\cmxa=0 + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denoy + \Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy} + \else + \uppercase{&} + \fi + \else + \uppercase{&} + \fi + \else + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denoy + \uppercase{&}\Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy} + \else + \uppercase{&&} + \fi + \else + \uppercase{&&} + \fi + \fi + \fi + %Troisi\`eme compteur \zzz + \ifnum\cmza>0 + \PGCD{\the\numz}{\the\denoz} + \ifnum\cmxa=0 + \ifnum\cmya=0 + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denoz + \Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} + \else + \uppercase{&} + \fi + \else + \uppercase{&} + \fi + \else + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denoz + \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} + \else + \uppercase{&&} + \fi + \else + \uppercase{&&} + \fi + \fi + \else + \ifnum\pgcd>1 + \ifnum\pgcd<\the\denoz + \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} + \else + \uppercase{&&} + \fi + \else + \uppercase{&&} + \fi + \fi + \fi%\\ +\end{align*} +}{}% +} + +\newcommand\TThales[8][]{% + \setKV[ClesThales]{#1}% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \ifboolKV[ClesThales]{FigureSeule}{% + \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{% + \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{% + \ifboolKV[ClesThales]{Figure}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \begin{multicols}{2}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \par\columnbreak\par% + \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% + \end{multicols}% + }{\ifboolKV[ClesThales]{Figurecroisee}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \begin{multicols}{2}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \par\columnbreak\par% + \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% + \end{multicols}% + }{\ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}% + }% + }% + }% +}% +%%%% + +\newcommand\ReciThales[6][]{% + \ifboolKV[ClesThales]{Droites}{% + Les droites $(#3#5)$ et $(#4#6)$ sont s\'ecantes en $#2$. + }{% + Dans le triangle $#2#3#4$, $#5$ est un point + \ifboolKV[ClesThales]{Segment}{du segment $[#2#3]$}{de la + droite $(#2#3)$}, $#6$ est un point + \ifboolKV[ClesThales]{Segment}{du segment $[#2#4]$}{de la droite + $(#2#4)$}. + } % + \ifboolKV[ClesThales]{Propor}{Le tableau $\begin{array}{c|c} + #2#5#6\\ + \hline + #2#3#4\\ + \end{array} + $ est-il un tableau de proportionnalit\'e ? + }{% + } +} + +\newcommand\ReciThalesCalculs[8][]{% + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + \StrMid{#2}{4}{4}[\NomM]% + \StrMid{#2}{5}{5}[\NomN]% + \ifboolKV[ClesThales]{Produit}{% + \begin{align*} + \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}&&\dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}} + \end{align*} + Effectuons les produits en croix :\xdef\NumA{\fpeval{#3*#6}}\xdef\NumB{\fpeval{#4*#5}} + \begin{align*} + \num{#3}\times\num{#6}&=\num{\fpeval{#3*#6}}&&&\num{#4}\times\num{#5}&=\num{\fpeval{#4*#5}} + \end{align*} + \xintifboolexpr{\NumA == \NumB}{Comme les produits en croix sont + \'egaux, alors + $\dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\[0.5em]% + }{% + Comme les produits en croix sont diff\'erents, alors + $\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\% + }% + }{% + \[\left. + \begin{array}{l} + \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}\ifx\bla#7\bla\ifboolKV[ClesThales]{Simplification}{\PGCD{#3}{#4}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM... + \PGCD{#5}{#6}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#6/\pgcd}}\PPCM{#4}{\DenomSimpaa}\xintifboolexpr{\ppcm==#4}{}{=\dfrac{#3\times\num{\fpeval{\ppcm/#4}}}{#4\times\num{\fpeval{\ppcm/#4}}}=\dfrac{\num{\fpeval{#3*\ppcm/#4}}}{\num{\fpeval{\ppcm}}}}}{}% + }{=\displaystyle\Simplification[All]{#3}{#4}\PGCD{#3}{#4}\xdef\NumSimp{\fpeval{#3/\pgcd}}\xdef\DenomSimp{\fpeval{#4/\pgcd}}\PGCD{#5}{#6}\xdef\NumSimpa{\fpeval{#5/\pgcd}}\xdef\DenomSimpa{\fpeval{#6/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#4}==1}{}{=\dfrac{\num{#3}\times\num{\fpeval{\the\ppcm/#4}}}{\num{#4}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#4}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#3*\the\ppcm/#4}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#6}}\else% + \xintifboolexpr{#7==1}{}{=\dfrac{\num{#3}\times\num{#7}}{\num{#4}\times\num{#7}}=\dfrac{\num{\fpeval{#3*#7}}}{\num{\fpeval{#4*#7}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#4*#7}}{}{=\dfrac{\num{\fpeval{#3*#7}}\times\num{\fpeval{\the\ppcm/(#4*#7)}}}{\num{\fpeval{#4*#7}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#4*#7)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#3*\the\ppcm/#4}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#7*#6*#8}} + \fi + \\ + \\ + \dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}}% + \ifx\bla#8\bla% + \ifboolKV[ClesThales]{Simplification}{\PGCD{#5}{#6}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM... + \PGCD{#3}{#4}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#4/\pgcd}}\PPCM{#6}{\DenomSimpaa}\xintifboolexpr{\ppcm==#6}{}{=\dfrac{#5\times\num{\fpeval{\ppcm/#6}}}{#6\times\num{\fpeval{\ppcm/#6}}}=\dfrac{\num{\fpeval{#5*\ppcm/#6}}}{\num{\fpeval{\ppcm}}}}}{}% + }{=\displaystyle\Simplification[All]{#5}{#6}\PGCD{#5}{#6}\xdef\NumSimp{\fpeval{#5/\pgcd}}\xdef\DenomSimp{\fpeval{#6/\pgcd}}\PGCD{#3}{#4}\xdef\NumSimpa{\fpeval{#3/\pgcd}}\xdef\DenomSimpa{\fpeval{#4/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#6}==1}{}{=\dfrac{\num{#5}\times\num{\fpeval{\the\ppcm/#6}}}{\num{#6}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#6}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#5*\the\ppcm/#6}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumB{\fpeval{#5*#4}}% + \else% + \xintifboolexpr{#8==1}{}{=\dfrac{\num{#5}\times\num{#8}}{\num{#6}\times\num{#8}}=\dfrac{\num{\fpeval{#5*#8}}}{\num{\fpeval{#6*#8}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#6*#8}}{}{=\dfrac{\num{\fpeval{#5*#8}}\times\num{\fpeval{\the\ppcm/(#6*#8)}}}{\num{\fpeval{#6*#8}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#6*#8)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#5*\the\ppcm/#6}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}} + }\xdef\NumB{\fpeval{#5*#8*#4*#7}} + \fi\\ + \end{array} + \right\}\ifnum\NumA=\NumB \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}\else\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}\fi + \] + } + \ifboolKV[ClesThales]{Propor}{% + \ifnum\NumA=\NumB Donc le tableau $\begin{array}{c|c} + \NomA\NomM&\NomA\NomN\\ + \hline + \NomA\NomB&\NomA\NomC\\ + \end{array} + $ est bien un tableau de proportionnalit\'e.\\De plus, les points + $\NomA$, $\NomM$, $\NomB$ sont align\'es dans le m\^eme ordre que les + points $\NomA$, $\NomN$, $\NomC$. Donc les droites $(\NomM\NomN)$ + et $(\NomB\NomC)$ sont parall\`eles d'apr\`es la r\'eciproque du + th\'eor\`eme de Thal\`es.\else% + Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas parall\`eles.\fi + }{% + \xintifboolexpr{\NumA==\NumB}{% + De plus, les points $\NomA$, $\NomM$, $\NomB$ sont align\'es dans + le m\^eme ordre que les points $\NomA$, $\NomN$, $\NomC$. Donc les + droites $(\NomM\NomN)$ et $(\NomB\NomC)$ sont parall\`eles d'apr\`es + la r\'eciproque du th\'eor\`eme de Thal\`es.}{% + Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas + parall\`eles.} + } +} + +\newcommand\ReciproqueThales[8][]{% + % #1 Cl\'es + % #2 NomTriangle + Points ABCEF pour droite (BC)//(EF) + % #3 longueur AE + % #4 longueur AB + % #5 longueur AF + % #6 longueur AC + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \ifboolKV[ClesThales]{FigureSeule}{% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{% + \ifboolKV[ClesThales]{Figure}{% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \begin{multicols}{2} + {\em La figure est donn\'ee \`a titre indicatif.} + \[\MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\] + \par\columnbreak\par + \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par + \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8} + \end{multicols} + }{\ifboolKV[ClesThales]{Figurecroisee}{% +% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN] + \begin{minipage}{0.4\linewidth}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \end{minipage} + \hfill + \begin{minipage}{0.55\linewidth}% + \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par + \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + \end{minipage}% + }{\ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par + \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + }% + }% + }% + }% +}% + +\newcommand\Thales[8][]{% + \useKVdefault[ClesThales]% + \setKV[ClesThales]{#1}% + %Définir les points pour une utilisation perso + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \xdef\NomPointA{\NomA}% + \xdef\NomPointB{\NomB}% + \xdef\NomPointC{\NomC}% + \xdef\NomTriangle{\NomA\NomB\NomC}% + \xdef\NomPointM{\NomM}% + \xdef\NomPointN{\NomN}% + % + \ifboolKV[ClesThales]{Reciproque}{% + \ReciproqueThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + }{% + \ifboolKV[ClesThales]{FigureSeule}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{% + \ifboolKV[ClesThales]{FigurecroiseeSeule}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% + }{% + \ifboolKV[ClesThales]{Redaction}{% + \ifboolKV[ClesThales]{Figure}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \begin{multicols}{2} + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \par\columnbreak\par% + \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% + \end{multicols}% + }{% + \ifboolKV[ClesThales]{Figurecroisee}{% + \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% + \begin{multicols}{2} + {\em La figure est donn\'ee \`a titre indicatif.}% + \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% + \par\columnbreak\par% + \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% + \end{multicols} + }{% + \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% + } + } + }{% + \TThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% + }% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTortueBase.tex b/macros/latex/contrib/profcollege/latex/PfCTortueBase.tex new file mode 100644 index 0000000000..e5f99c7f4a --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTortueBase.tex @@ -0,0 +1,214 @@ +%%% +% Tortue +%%% +\setKVdefault[Tortue]{% + Pas=0.2mm,%Déplacement, + Etapes=false,%Pour arrêter la construction à une étape particulière + Nom=\jobname,%Pour la sauvegarde du fichier mp + Grille=false,%Pour faire apparaître une grille + LargeurG=10,%Largeur Grille + HauteurG=10,%Hauteur Grille + TortueD=false,%Affiche la tortue au départ + TortueF=false,%Affiche la tortue à l'arrivée + Epaisseur=1,%Epaisseur du tracé + Angle=0,%Angle de départ de la tortue + Debut=false,%Pour indiquer que rien n'est fait (utile ?) + Depart={(0,0)},%Point de départ de la tortue + Axes=false,%Affichage des axes ou pas + Origine={(0,0)},%Origine des axes + Cases=false,%Se déplace-t-on sur des cases ? +} +\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}%choix de l'étape d'arrêt + +\newcounter{PfCTortue} +\setcounter{PfCTortue}{0} + +\makeatletter +\NewDocumentCommand\TortueCreationFichier{o m}{% + \stepcounter{PfCTortue}% + \useKVdefault[Tortue]% + \setKV[Tortue]{#1}% + \setKV[Tortue]{Nom=\jobname+t\thePfCTortue}% + \setsepchar[*]{,* }% + \readlist*\PfCListeCmdTortue{#2}% + \setsepchar{,}% + \xdef\PfCNbRep{0}% + \savecomparemode% + \newwrite\turtle@out% + \immediate\openout\turtle@out \jobname+t\thePfCTortue.turtle% + \immediate\write\turtle@out{% + numeric ut; + ut=\useKV[Tortue]{Pas}; + pair OrigineAxes;OrigineAxes=\useKV[Tortue]{Origine}; + Etapes=\useKV[Tortue]{Etapes}; + if Etapes:Total=\useKV[Tortue]{Etape};fi; + }% + \ifboolKV[Tortue]{Grille}{% + \immediate\write\turtle@out{% + larg=\useKV[Tortue]{LargeurG}; haut=\useKV[Tortue]{HauteurG}; + for k=-larg upto larg: + draw 3*ut*(10k,-10haut)--3*ut*(10k,10haut) withcolor 0.75white; + endfor; + for k=-haut upto haut: + draw 3*ut*(-10larg,10k)--3*ut*(10larg,10k) withcolor 0.75white; + endfor; + %dotlabel("",ut*OrigineAxes); + if \useKV[Tortue]{Axes}: + drawarrow (3*ut*(-10larg,0)--3*ut*(10larg,0)) shifted(ut*(0,ypart(OrigineAxes-(0,0)))); + drawarrow (3*ut*(0,-10haut)--3*ut*(0,10haut)) shifted(ut*(xpart(OrigineAxes-(0,0)),0)); + %label.llft(btex O etex,(0,0)); + dotlabel.lrt(btex 30 etex,(30*ut,0)+ut*(OrigineAxes-(0,0))); + dotlabel.ulft(btex 30 etex,(0,30*ut)+ut*(OrigineAxes-(0,0))); + fi; + if \useKV[Tortue]{Cases}: + string T[]; + T1="A"; + T2="B"; + T3="C"; + T4="D"; + T5="E"; + T6="F"; + T7="G"; + T8="H"; + T9="I"; + T10="J"; + T11="K"; + T12="L"; + T13="M"; + T14="N"; + T15="O"; + T16="P"; + T17="Q"; + T18="R"; + T19="S"; + T20="T"; + T21="U"; + T22="V"; + T23="W"; + T24="X"; + T25="Y"; + T26="Z"; + for k=-larg upto larg-1: + label(TEX(T[k+larg+1]),3*ut*(10k+5,10haut+5)); + endfor; + for k=haut downto -haut+1: + label(TEX(decimal(haut-k+1)),3*ut*(-10larg-5,10k-5)); + endfor; + fi; + Epaisseur:=1.5; + }% + }{}% + \ifboolKV[Tortue]{Debut}{}{% + \foreachitem\compteur\in\PfCListeCmdTortue{% + \comparestrict% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{MP}[\PfCTestMP]% + \xintifboolexpr{\PfCTestMP==0}{% + \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,2]}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]% + \xintifboolexpr{\PfCTestCrochetO==0}{}{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]% + \xintifboolexpr{\PfCTestCrochetF==0}{% + \immediate\write\turtle@out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]% + \xintifboolexpr{\PfCTestRemplis==0}{% + \immediate\write\turtle@out{tt:=0; + TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]% + \xintifboolexpr{\PfCTestFinPour==0}{% + \immediate\write\turtle@out{enddef;k:=0;}% + \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]% + \xintifboolexpr{\PfCTestPour==0}{% + \immediate\write\turtle@out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]% + \xintifboolexpr{\PfCTestRep==0}{% + \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% + \immediate\write\turtle@out{nb[\PfCNbRep]:=0;}% + \immediate\write\turtle@out{forever:}% + \immediate\write\turtle@out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}% + % \immediate\write\turtle@out{nbcomp:=nbcomp+1;} + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]% + \xintifboolexpr{\PfCTestParaF==0}{% + \immediate\write\turtle@out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}% + \immediate\write\turtle@out{endfor;}% + \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]% + \xintifboolexpr{\PfCTestParaO==0}{% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]% + \xintifboolexpr{\PfCTestBc==0}{% + \immediate\write\turtle@out{Bc;}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]% + \xintifboolexpr{\PfCTestLc==0}{% + \immediate\write\turtle@out{Lc;}% + }{% + \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]% + \xintifboolexpr{\PfCTestTlp==0}{% + \immediate\write\turtle@out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}% + }{% + \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% + % \immediate\write\turtle@out{Tortue:=currentpicture;Tortue enddef;}% + % \immediate\write\turtle@out{draw Dessin;}% + \ifboolKV[Tortue]{TortueD}{% + \immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[0] scaled 1.5,A[0]);}% + }{}% + \ifboolKV[Tortue]{Etapes}{% + \immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[Total] scaled 1.5,A[Total]);}% + }{\ifboolKV[Tortue]{TortueF}{\immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[k] scaled 1.5,A[k]);}}{}}% + \immediate\closeout\turtle@out% + \restorecomparemode% +}% +\makeatother + +\NewDocumentCommand\Tortue{o m}{% + \useKVdefault[Tortue]% + \setKV[Tortue]{#1}% + \TortueCreationFichier[#1]{#2}% + \TortueDessinFinal% +} + +\NewDocumentCommand\TortueDessinFinal{}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + input PfCTurtleTestRemplis.mp; + + pair Depart; + Depart=\useKV[Tortue]{Depart} if \useKV[Tortue]{Cases}:+(15,15)fi; + pair A[],B[]; + A[0]=\useKV[Tortue]{Pas}*(xpart(Depart),ypart(Depart)); + B[0]=A[0]; + Epaisseur:=\useKV[Tortue]{Epaisseur}; + Angle:=0; + numeric RetiensAngle[]; + RetiensAngle[0]=\useKV[Tortue]{Angle}; + + pair VecteurDpt; + VecteurDpt=(1,0) rotated RetiensAngle[0]; + input \useKV[Tortue]{Nom}.turtle; + \end{mplibcode} + \else + \fi +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTrigonometrie.tex b/macros/latex/contrib/profcollege/latex/PfCTrigonometrie.tex new file mode 100644 index 0000000000..701637141e --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTrigonometrie.tex @@ -0,0 +1,663 @@ +%%% +% Trigonom\'etrie +%%% +\def\MPFigTrigo#1#2#3#4#5#6#7#8{% + \ifluatex + \mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesTrigo]{Echelle}; + pair A,B,C,O,I,D,E,F;% + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(3,0); + C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#8); + B:=B rotatedabout(O,#8); + C:=C rotatedabout(O,#8); + % On d\'efinit le centre du cercle inscrit + (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; + (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; + % on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + % on d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; + % L'angle :) + path cc; + cc=fullcircle scaled 1u; + % on marque les angles + picture MAngle; + MAngle=image( + draw (cc shifted A); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + % on labelise + picture z; + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex \ang{#7} etex,A+0.95u*unitvector(I-A)); + decalage:=3mm; + if #6<0: + else: + if angle(1/2[A,C]-B)>0: + if #6=0: + label(btex ? etex,1.1[B,1/2[A,C]]); + else: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + fi; + else: + if #6=0: + label(btex ? etex,1.1[B,1/2[A,C]]); + else: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + fi; + fi; + fi; + if #4<0: + else: + if angle(1/2[B,C]-A)>0: + if #4=0: + label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + fi; + else: + if #4=0: + label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + fi; + fi; + fi; + if #5<0: + else: + if angle(1/2[A,B]-C)>0: + if #5=0: + label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + else: + if #5=0: + label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; + fi; + \end{mplibcode} + \mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}] + pair A,B,C,O,I,D,E,F;% + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(3,0); + C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#8); + B:=B rotatedabout(O,#8); + C:=C rotatedabout(O,#8); + % On d\'efinit le centre du cercle inscrit + (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; + (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; + % on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + % on d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; + % L'angle :) + path cc; + cc=fullcircle scaled 1u; + % on marque les angles + picture MAngle; + MAngle=image( + draw (cc shifted A); + % draw (cc shifted B); + % draw (cc shifted C); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + % on labelise + picture z; + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex \ang{#7} etex,A+0.95u*unitvector(I-A)); + decalage:=3mm; + if #6<0: + else: + if angle(1/2[A,C]-B)>0: + if #6=0: + label(btex ? etex rotated angle(C-A),1.1[B,1/2[A,C]]); + else: + label(btex \num{#6} etex rotated angle(C-A),1.2[B,1/2[A,C]]); + fi; + else: + if #6=0: + label(btex ? etex rotated angle(A-C),1.1[B,1/2[A,C]]); + else: + label(btex \num{#6} etex rotated angle(A-C),1.2[B,1/2[A,C]]); + fi; + fi; + fi; + if #4<0: + else: + if angle(1/2[B,C]-A)>0: + if #4=0: + label(btex ? etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B))); + fi; + else: + if #4=0: + label(btex ? etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B))); + fi; + fi; + fi; + if #5<0: + else: + if angle(1/2[A,B]-C)>0: + if #5=0: + label(btex ? etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B))); + fi; + else: + if #5=0: + label(btex ? etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; + fi; +\end{mpost} +\fi +} + +\def\MPFigTrigoAngle#1#2#3#4#5#6#7{% + % #1 A + % #2 B + % #3 C + % #4 opp + % #5 adj + % #6 hyp + % #7 angle de rotation + \ifluatex + \mplibcodeinherit{enable} + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesTrigo]{Echelle}; + pair A,B,C,O,I,D,E,F;% + % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(3,0); + C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#7); + B:=B rotatedabout(O,#7); + C:=C rotatedabout(O,#7); + % On d\'efinit le centre du cercle inscrit + (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; + (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; + %on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + %on d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; + %L'angle :) + path cc; + cc=fullcircle scaled 1u; + % on marque les angles + picture MAngle; + MAngle=image( + draw (cc shifted A); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + % on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex ? etex,A+0.95u*unitvector(I-A)); + decalage:=3mm; + if #6>0: + if angle(1/2[A,C]-B)>0: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + else: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + fi; + fi; + if #4>0: + if angle(1/2[B,C]-A)>0: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + fi; + fi; + if #5>0: + if angle(1/2[A,B]-C)>0: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; +\end{mplibcode} +\mplibcodeinherit{disable} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}] + u:=1cm; + pair A,B,C,O,I,D,E,F;% + %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure + A=u*(1,1); + B-A=u*(3,0); + C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); + % On d\'efinit le centre du cercle circonscrit + O - .5[A,B] = whatever * (B-A) rotated 90; + O - .5[B,C] = whatever * (C-B) rotated 90; + % On tourne pour \'eventuellement moins de lassitude :) + A:=A rotatedabout(O,#7); + B:=B rotatedabout(O,#7); + C:=C rotatedabout(O,#7); + % On d\'efinit le centre du cercle inscrit + (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; + (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; + %on dessine \`a main lev\'ee :) + path triangle; + triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; + %on d\'efinit l'angle droit + D-B=7*unitvector(C-B); + F-B=7*unitvector(A-B); + E-D=F-B; + draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; + %L'angle :) + path cc; + cc=fullcircle scaled 1u; + % on marque les angles + picture MAngle; + MAngle=image( + draw (cc shifted A); + ); + draw MAngle; + clip currentpicture to triangle; + draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; + draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; + draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; + %on labelise + label(btex #1 etex,1.15[O,A]); + label(btex #2 etex,1.15[O,B]); + label(btex #3 etex,1.15[O,C]); + label(btex ? etex,A+0.95u*unitvector(I-A)); + decalage:=3mm; + if #6>0: + if angle(1/2[A,C]-B)>0: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + else: + label(btex \num{#6} etex,1.2[B,1/2[A,C]]); + fi; + fi; + if #4>0: + if angle(1/2[B,C]-A)>0: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + else: + label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); + fi; + fi; + if #5>0: + if angle(1/2[A,B]-C)>0: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + else: + label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); + fi; + fi; +\end{mpost} +\fi +} + +\setKVdefault[ClesTrigo]{Angle=0,Propor=false,Figure=false,FigureSeule=false,ValeurExacte=false,Precision=2,Unite=cm,Sinus=false,Cosinus=false,Tangente=false,Perso=false,Echelle=1cm}% + +\newcommand\RedactionTrigo{}% + +\newcommand\TrigoCalculs[5][]{% + \setKV[ClesTrigo]{#1}% + % #1 Cl\'es + % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC + % #3 Longueur #4 Longueur #5 angle + % On d\'efinit les points + \DeclareSIUnit{\PfCTrigoUnit}{\useKV[ClesTrigo]{Unite}}% + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + \xdef\NomTriangle{\NomA\NomB\NomC}% + \xdef\NomAngleDroit{\NomB}% + \xdef\NomSommetA{\NomA}% + \xdef\NomSommetB{\NomB}% + \xdef\NomSommetC{\NomC}% + \ifboolKV[ClesTrigo]{Perso}{% + \RedactionTrigo% + }{% + Dans le triangle $\NomA\NomB\NomC$, rectangle en $\NomB$, on a :% + }% + \ifboolKV[ClesTrigo]{Cosinus}{% + \ifx\bla#3\bla%on calcule le c\^ot\'e adjacent + \xdef\ResultatTrigo{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ + \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\ + \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB} + \end{align*}% + }{% + \begin{align*} + \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ + \cos(\ang{#5})&=\frac{\NomA\NomB}{\num{#4}}\\ + \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB}% + \end{align*} + }% + \else% + \ifx\bla#4\bla%on calcule l'hypoth\'enuse + \xdef\ResultatTrigo{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ + \NomA\NomC\times\cos(\ang{#5})&=\num{#3}\\ + \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*} + }{% + \begin{align*} + \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ + \cos(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\ + \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*}% + }% + \else%on calcule l'angle + \xdef\ResultatTrigo{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \setKV[ClesTrigo]{Precision=0}% + \setKV[ClesTrigo]{#1}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ + \num{#4}\times\cos(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ + \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }{% + \begin{align*} + \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ + \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }% + \fi% + \fi% + }{}% + \ifboolKV[ClesTrigo]{Sinus}{% + \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e + \xdef\ResultatTrigo{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ + \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}% + \end{align*}% + }{% + \begin{align*} + \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ + \sin(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\ + \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}% + \end{align*}% + }% + \else + \ifx\bla#4\bla%on calcule l'hypoth\'enuse + \xdef\ResultatTrigo{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ + \NomA\NomC\times\sin(\ang{#5})&=\num{#3}\\ + \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*}% + }{% + \begin{align*} + \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ + \sin(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\ + \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*}% + }% + \else%on calcule l'angle + \xdef\ResultatTrigo{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \setKV[ClesTrigo]{Precision=0}% + \setKV[ClesTrigo]{#1}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ + \num{#4}\times\sin(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ + \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }{% + \begin{align*} + \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ + \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }% + \fi% + \fi% + }{}% + \ifboolKV[ClesTrigo]{Tangente}{% + \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e + \xdef\ResultatTrigo{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\% + \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\% + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}% + \end{align*}% + }{% + \begin{align*} + \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ + \tan(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\ + \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}% + \end{align*}% + }% + \else + \ifx\bla#4\bla%on calcule l'adjacent + \xdef\ResultatTrigo{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ + \NomA\NomB\times\tan(\ang{#5})&=\num{#3}\\ + \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*}% + }{% + \begin{align*} + \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ + \tan(\ang{#5})&=\frac{\num{#3}}{\NomA\NomB}\\ + \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\ + \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% + \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% + \end{align*}% + }% + \else%on calcule l'angle + \setKV[ClesTrigo]{Precision=0}% + \setKV[ClesTrigo]{#1}% + \xdef\ResultatTrigo{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \ifboolKV[ClesTrigo]{Propor}{% + \begin{align*} + \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ + \num{#4}\times\tan(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ + \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }{% + \begin{align*} + \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ + \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ + \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% + \end{align*}% + }% + \fi% + \fi% + }{}% +}% + +\newcommand\Trigo[5][]{% + \useKVdefault[ClesTrigo]% + \setKV[ClesTrigo]{#1}% + % #1 Cl\'es + % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC + % #3 Longueur #4 Longueur #5 angle + % On d\'efinit les points + \StrMid{#2}{1}{1}[\NomA]% + \StrMid{#2}{2}{2}[\NomB]% + \StrMid{#2}{3}{3}[\NomC]% + % On r\'edige + \ifboolKV[ClesTrigo]{FigureSeule}{% + \ifx\bla#5\bla% + \ifboolKV[ClesTrigo]{Cosinus}{% + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}} + }{}% + \ifboolKV[ClesTrigo]{Sinus}{% + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}} + }{}% + \ifboolKV[ClesTrigo]{Tangente}{% + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}} + }{}% + \else%}{%figure pour calculer une longueur + \ifboolKV[ClesTrigo]{Cosinus}{% + \ifx\bla#3\bla%adjacent inconnu + \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}} + \else + \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}} + \fi + }{}% + \ifboolKV[ClesTrigo]{Sinus}{% + \ifx\bla#3\bla%adjacent inconnu + \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}} + \else + \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}} + \fi + }{}% + \ifboolKV[ClesTrigo]{Tangente}{% + \ifx\bla#3\bla%adjacent inconnu + \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}} + \else% + \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}} + \fi% + }{}% + \fi% + }{% + \ifboolKV[ClesTrigo]{Figure}{% + \begin{multicols}{2}% + {\em La figure est donn\'ee \`a titre indicatif.}% + \ifx\bla#5\bla% + \ifboolKV[ClesTrigo]{Cosinus}{% + \begin{center} + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}} + \end{center} + }{}% + \ifboolKV[ClesTrigo]{Sinus}{% + \begin{center} + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}} + \end{center} + }{}% + \ifboolKV[ClesTrigo]{Tangente}{% + \begin{center} + \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}} + \end{center} + }{}% + \else%}{%figure pour calculer une longueur + \ifboolKV[ClesTrigo]{Cosinus}{% + \ifx\bla#3\bla%adjacent inconnu + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \else + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \fi + }{}% + \ifboolKV[ClesTrigo]{Sinus}{% + \ifx\bla#3\bla%adjacent inconnu + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \else + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \fi + }{}% + \ifboolKV[ClesTrigo]{Tangente}{% + \ifx\bla#3\bla%adjacent inconnu + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \else% + \begin{center} + \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}} + \end{center} + \fi% + }{}% + \fi% + \par\columnbreak\par + \TrigoCalculs[#1]{#2}{#3}{#4}{#5}% + \end{multicols} + }{% + \TrigoCalculs[#1]{#2}{#3}{#4}{#5}% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCTriominos.tex b/macros/latex/contrib/profcollege/latex/PfCTriominos.tex new file mode 100644 index 0000000000..efc6cd24b3 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCTriominos.tex @@ -0,0 +1,378 @@ +%%% +% Triominos +%%% +\setKVdefault[ClesTriomino]{Longueur=5cm,Etages=3,Ecart=0.6,AffichagePiece=false,Hexagone=false,Recapitulatif=false,Colonnes=2}% +\defKV[ClesTriomino]{Piece=\setKV[ClesTriomino]{AffichagePiece=true}}% + +\def\TraceTriomino#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesTriomino]{Longueur}; + Rayon:=0.75*u*sqrt(3)/6; + Etages:=\useKV[ClesTriomino]{Etages}; + pair A,B,C,D,E,F; + A=(0,0); + B-A=Etages*u*(1,0); + C=rotation(B,A,60); + D=(1/Etages)[C,A]; + E=(1/Etages)[C,B]; + F=C; + trace polygone(A,B,C); + for k=1 upto Etages-1: + trace (k/Etages)[C,A]--(k/Etages)[C,B]; + trace (k/Etages)[A,C]--(k/Etages)[A,B]; + trace (k/Etages)[B,A]--(k/Etages)[B,C]; + endfor; + pair G[];color H[];%Couleur pour garder l'orientation des textes... + G[1]=iso(D,E,F); + H1=blue; + n=1; + for k=1 upto Etages-1: + for l=0 upto (2*k): + n:=n+1; + if (l mod 2=0): + G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D)); + H[n]=blue; + else: + G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D)); + H[n]=green; + fi; + endfor; + endfor; + % affichage des textes + nba=0; + for p_=#1: + if (nba mod 3)=1: + if H[(nba div 3)+1]=blue: + label(TEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30)); + else: + label(TEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90)); + fi; + elseif (nba mod 3)=2: + if H[(nba div 3)+1]=blue: + label(TEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270)); + else: + label(TEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330)); + fi; + else: + if H[(nba div 3)+1]=blue: + label(TEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150)); + else: + label(TEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210)); + fi; + fi; + nba:=nba+1; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur}; Etages:=\useKV[ClesTriomino]{Etages};}] + Rayon:=0.75*u*sqrt(3)/6; + pair A,B,C,D,E,F; + A=(0,0); + B-A=Etages*u*(1,0); + C=rotation(B,A,60); + D=(1/Etages)[C,A]; + E=(1/Etages)[C,B]; + F=C; + trace polygone(A,B,C); + for k=1 upto Etages-1: + trace (k/Etages)[C,A]--(k/Etages)[C,B]; + trace (k/Etages)[A,C]--(k/Etages)[A,B]; + trace (k/Etages)[B,A]--(k/Etages)[B,C]; + endfor; + pair G[];color H[];%Couleur pour garder l'orientation des textes... + G[1]=iso(D,E,F); + H1=blue; + n=1; + for k=1 upto Etages-1: + for l=0 upto (2*k): + n:=n+1; + if (l mod 2=0): + G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D)); + H[n]=blue; + else: + G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D)); + H[n]=green; + fi; + endfor; + endfor; + % affichage des textes + nba=0; + for p_=#1: + if (nba mod 3)=1: + if H[(nba div 3)+1]=blue: + label(LATEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30)); + else: + label(LATEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90)); + fi; + elseif (nba mod 3)=2: + if H[(nba div 3)+1]=blue: + label(LATEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270)); + else: + label(LATEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330)); + fi; + else: + if H[(nba div 3)+1]=blue: + label(LATEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150)); + else: + label(LATEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210)); + fi; + fi; + nba:=nba+1; + endfor; + \end{mpost} + \fi +} + +\def\TraceTriominoHexa#1{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + u:=\useKV[ClesTriomino]{Longueur}; + RayonCercle:=u; + Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6; + pair O,A,B,C,D,E,F,G,H[],I[]; + O=(0,0); + path cc; + cc=cercles(O,RayonCercle); + A=pointarc(cc,0); + B=rotation(A,O,60); + C=rotation(B,O,60); + D=rotation(C,O,60); + E=rotation(D,O,60); + F=rotation(E,O,60); + G=rotation(F,O,60); + H1=iso(A,B); + H2=iso(B,C); + H3=iso(C,D); + H4=iso(D,E); + H5=iso(E,F); + H6=iso(F,A); + I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60)); + I2=symetrie(I1,C,F); + I3=symetrie(I2,1/2[B,C],1/2[D,E]); + I4=symetrie(I3,1/2[B,C],1/2[F,A]); + I5=symetrie(I4,B,E); + I6-I1=0.5*(D-C); + I7-I2=0.5*(D-C); + I8-I3=0.5*(D-C); + I9-I4=0.5*(D-C); + I10-I5=0.5*(D-C); + I11=symetrie(I10,1/2[C,B],1/2[F,A]); + I12=symetrie(I11,1/2[A,B],1/2[E,F]); + I13=symetrie(I6,A,D); + I14=symetrie(I7,A,D); + I15=symetrie(I8,A,D); + I16=symetrie(I9,A,D); + I17=symetrie(I10,A,D); + I18=symetrie(I11,A,D); + I19=symetrie(I12,A,D); + I20=symetrie(I1,A,D); + I21=symetrie(I2,A,D); + I22=symetrie(I3,A,D); + I23=symetrie(I4,A,D); + I24=symetrie(I5,A,D); + trace polygone(A,B,C,D,E,F); + trace polygone(H1,H3,H5); + trace polygone(H2,H4,H6); + trace segment(A,D); + trace segment(B,E); + trace segment(C,F); + color N[];%Couleur pour garder l'orientation des textes... + N1=blue; + for l=2 upto 5: + if (l mod 2=0): + N[l]=green; + else: + N[l]=blue; + fi; + endfor; + for l=6 upto 12: + if (l mod 2=0): + N[l]=blue; + else: + N[l]=green; + fi; + endfor; + for l=13 upto 19: + if (l mod 2=0): + N[l]=blue; + else: + N[l]=green; + fi; + endfor; + for l=20 upto 24: + if (l mod 2=0): + N[l]=green; + else: + N[l]=blue; + fi; + endfor; + % affichage des textes + nba=0; + for p_=#1: + if (nba mod 3)=1: + if N[(nba div 3)+1]=blue: + label(TEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30)); + else: + label(TEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90)); + fi; + elseif (nba mod 3)=2: + if N[(nba div 3)+1]=blue: + label(TEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270)); + else: + label(TEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330)); + fi; + else: + if N[(nba div 3)+1]=blue: + label(TEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150)); + else: + label(TEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210)); + fi; + fi; + nba:=nba+1; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur};RayonCercle:=u; Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6;}] + pair O,A,B,C,D,E,F,G,H[],I[]; + O=(0,0); + path cc; + cc=cercles(O,RayonCercle); + A=pointarc(cc,0); + B=rotation(A,O,60); + C=rotation(B,O,60); + D=rotation(C,O,60); + E=rotation(D,O,60); + F=rotation(E,O,60); + G=rotation(F,O,60); + H1=iso(A,B); + H2=iso(B,C); + H3=iso(C,D); + H4=iso(D,E); + H5=iso(E,F); + H6=iso(F,A); + I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60)); + I2=symetrie(I1,C,F); + I3=symetrie(I2,1/2[B,C],1/2[D,E]); + I4=symetrie(I3,1/2[B,C],1/2[F,A]); + I5=symetrie(I4,B,E); + I6-I1=0.5*(D-C); + I7-I2=0.5*(D-C); + I8-I3=0.5*(D-C); + I9-I4=0.5*(D-C); + I10-I5=0.5*(D-C); + I11=symetrie(I10,1/2[C,B],1/2[F,A]); + I12=symetrie(I11,1/2[A,B],1/2[E,F]); + I13=symetrie(I6,A,D); + I14=symetrie(I7,A,D); + I15=symetrie(I8,A,D); + I16=symetrie(I9,A,D); + I17=symetrie(I10,A,D); + I18=symetrie(I11,A,D); + I19=symetrie(I12,A,D); + I20=symetrie(I1,A,D); + I21=symetrie(I2,A,D); + I22=symetrie(I3,A,D); + I23=symetrie(I4,A,D); + I24=symetrie(I5,A,D); + trace polygone(A,B,C,D,E,F); + trace polygone(H1,H3,H5); + trace polygone(H2,H4,H6); + trace segment(A,D); + trace segment(B,E); + trace segment(C,F); + color N[];%Couleur pour garder l'orientation des textes... + N1=blue; + for l=2 upto 5: + if (l mod 2=0): + N[l]=green; + else: + N[l]=blue; + fi; + endfor; + for l=6 upto 12: + if (l mod 2=0): + N[l]=blue; + else: + N[l]=green; + fi; + endfor; + for l=13 upto 19: + if (l mod 2=0): + N[l]=blue; + else: + N[l]=green; + fi; + endfor; + for l=20 upto 24: + if (l mod 2=0): + N[l]=green; + else: + N[l]=blue; + fi; + endfor; + % affichage des textes + nba=0; + for p_=#1: + if (nba mod 3)=1: + if N[(nba div 3)+1]=blue: + label(LATEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30)); + else: + label(LATEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90)); + fi; + elseif (nba mod 3)=2: + if N[(nba div 3)+1]=blue: + label(LATEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270)); + else: + label(LATEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330)); + fi; + else: + if N[(nba div 3)+1]=blue: + label(LATEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150)); + else: + label(LATEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210)); + fi; + fi; + nba:=nba+1; + endfor; + \end{mpost} + \fi +} + +\newtoks\toklisteTriomino% +\def\UpdatetoksTriomino#1\nil{\addtotok\toklisteTriomino{"#1",}}% + +\newcommand\Triomino[2][]{% + \useKVdefault[ClesTriomino]% + \setKV[ClesTriomino]{#1}% + \setsepchar{§}%\ignoreemptyitems% + \readlist*\ListeTriominos{#2}% + \toklisteTriomino{}% + \ifboolKV[ClesTriomino]{Recapitulatif}{% + %\begin{longtable}{|>{\centering}p{0.45\linewidth}|p{0.45\linewidth}|} + % \hline + % \xintFor* ##1 in {\xintSeq{1}{\ListeTriominoslen}}\do{ + % &\\ + % &\\ + % \ListeTriominos[##1]&\\ + % &\\ + % &\\ + % \hline + % }% + %\end{longtable} + }{% + \ifboolKV[ClesTriomino]{AffichagePiece}{% + \setKV[ClesTriomino]{Etages=1}% + \TraceTriomino{"\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-2}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-1}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}}]"}% + }{% + \foreachitem\compteur\in\ListeTriominos{\expandafter\UpdatetoksTriomino\compteur\nil}% + \ifboolKV[ClesTriomino]{Hexagone}{% + \TraceTriominoHexa{\the\toklisteTriomino}% + }{% + \TraceTriomino{\the\toklisteTriomino}% + }% + }% + }% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex b/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex new file mode 100644 index 0000000000..5afdcfecaa --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCVueCubes.tex @@ -0,0 +1,344 @@ +%%% +% Vue Cubes +%%% +\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false} + +\newtoks\toklisteVueCube% +\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% + +\NewDocumentCommand\VueCubes{o m}{% + \useKVdefault[VueCubes]% + \setKV[VueCubes]{#1} + \ifboolKV[VueCubes]{Solution}{% + \BuildVueCubesSolution% + }{% + \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit" + \ignoreemptyitems% + \readlist*\PfCListeHauteursCubes{#2}% + \reademptyitems% + \toklisteVueCube{}% + \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}% + \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}% + }{% + \BuildVueCubes{\useKV[VueCubes]{Angle}}{}% + }% + }% +}% + +\NewDocumentCommand\BuildVueCubes{m m}{% + \ifluatex + \mplibforcehmode + \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% + \begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=#1; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + boolean Trou,FaceVue,Creation,Grille; + Trou:=\useKV[VueCubes]{Trou}; + FaceVue:=\useKV[VueCubes]{Face}; + Creation:=\useKV[VueCubes]{Creation}; + Grille:=\useKV[VueCubes]{Grilles}; + + TotalObj:=0; + + vardef CreationSolide(text t)= + PfCnbcubes:=0; + for p_=t: + m:=(PfCnbcubes div Profondeur); + k:=(PfCnbcubes mod Profondeur); + hauteurtour[m+1][k+1]:=p_; + for l=1 upto hauteurtour[m+1][k+1]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2); + ObjetDeplacement[TotalObj](0); + endfor; + PfCnbcubes:=incr PfCnbcubes; + endfor; + enddef; + + Initialisation(2500,Phi,20,50); + Objetcube0("a="&decimal(Echelle)); + + if Creation: + CreationSolide(#2); + else: + for k=1 upto Profondeur:%4 profondeur + hauteurtour[0][k]:=Hauteur;%5 hauteur totale + endfor; + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + if Trou: + if m>1: + hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale + else: + hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale + fi; + else: + hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale + fi; + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + fi; + + % Pour la fleche + path Fleche; + color A[]; + if FaceVue: + A0=Echelle*(1,Largeur/2,0); + A1-A0=0.25*(2,2,0); + A2-A1=0.25*(0,-1,0); + A3-A2=0.25*(2,0,0); + A4-A3=0.25*(0,-2,0); + A5-A4=A2-A3; + A6-A5=A2-A1; + Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; + fill Fleche withcolor CouleurFleche; + draw Fleche; + fi; + + nbobj:=TotalObj; + DessineFusion; + + if Grille: + % dessus + color Ad[]; + Ad0=(0.5Echelle,0.5*Echelle,-0.5); + Ad1-Ad0=(0,Largeur*Echelle,0); + Ad2-Ad1=(-Profondeur*Echelle,0,0); + Ad3-Ad2=Ad0-Ad1; + draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; + for k=1 upto Largeur-1: + draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]); + endfor; + for k=1 upto Profondeur-1: + draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]); + endfor; + % face + color Af[]; + Af0=(-1-Profondeur*Echelle,0.5*Echelle,0); + Af1-Af0=(0,Largeur*Echelle,0); + Af2-Af1=(0,0,Hauteur*Echelle); + Af3-Af2=Af0-Af1; + draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; + for k=1 upto Largeur-1: + draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]); + endfor; + for k=1 upto Hauteur-1: + draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]); + endfor; + % droite + color Adg[]; + Adg0=(0.5Echelle,-Largeur*Echelle-1,0); + Adg1-Adg0=(-Profondeur*Echelle,0,0); + Adg2-Adg1=(0,0,Hauteur*Echelle); + Adg3-Adg2=Adg0-Adg1; + draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; + for k=1 upto Profondeur-1: + draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]); + endfor; + for k=1 upto Hauteur-1: + draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]); + endfor; + fi; + + %draw (llcorner currentpicture)--(lrcorner currentpicture)--(urcorner currentpicture)--(ulcorner currentpicture)--cycle; + \end{mplibcode} + \ifboolKV[VueCubes]{Grilles}{}{% + \hspace*{1.5cm} + \begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=#1; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi+90,30,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + if Grille: + undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; + undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; + undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; + fi; + + path Fleche; + if FaceVue: + Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; + fill Fleche withcolor CouleurFleche; + draw Fleche; + fi; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode} + }% + \fi +}% + +\NewDocumentCommand\BuildVueCubesSolution{}{% + \ifluatex% + \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% + \begin{NiceTabular}{ccc}% + Vue de face&Vue de dessus&Vue de gauche\\ + {\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=0; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,0,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}& + {\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=0; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,90,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom] + input PfCSolid; + + intensite:=1.5; + + Ferme[0]:=false; + outcolor:=\useKV[VueCubes]{CouleurCube}; + incolor:=white; + nb:=1;subh:=1; + creux:=true; + + Profondeur:=\useKV[VueCubes]{Profondeur}; + Largeur:=\useKV[VueCubes]{Largeur}; + Hauteur:=\useKV[VueCubes]{Hauteur}; + Phi:=-90; + Echelle:=\useKV[VueCubes]{Echelle}; + + color CouleurFleche; + CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; + + TotalObj:=0; + + Initialisation(2500,Phi,0,50); + Objetcube0("a="&decimal(Echelle)); + + for m=1 upto Largeur:%3 largeur + for k=1 upto Profondeur:%4 profondeur + for l=1 upto hauteurtour[m][k]: + TotalObj:=incr TotalObj; + TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); + ObjetDeplacement[TotalObj](0); + endfor; + endfor; + endfor; + + nbobj:=TotalObj; + DessineFusion; + \end{mplibcode}}\\ + \end{NiceTabular}% + \fi% +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/PfCYohaku.tex b/macros/latex/contrib/profcollege/latex/PfCYohaku.tex new file mode 100644 index 0000000000..c710834b93 --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCYohaku.tex @@ -0,0 +1,187 @@ +%%% +% Yohaku +%%% +\setKVdefault[Yohaku]{Taille=2,Largeur=1cm,Hauteur=1cm,Addition,Multiplication=false,Perso=false,Limite=50,Relatif=false,Negatif=false,Pair=false,Impair=false,Premier=false,Solution=false,Visible=false,Bordure=false,CouleurResultat=gray!15,Ligne=0,Colonne=0,PasL=0,PasC=0,CouleurZone=gray!25}% +\defKV[Yohaku]{Case=\setKV[Yohaku]{Visible}}% + +\newlength\PfCYohaku% + +\xdef\PfCYHKpremier{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}% + +\NewDocumentCommand\Yohaku{o m}{% + \useKVdefault[Yohaku]% + \setKV[Yohaku]{#1}% + \xdef\PfCYHKlast{\fpeval{\useKV[Yohaku]{Taille}+1}}% + \xdef\PfCYHKnombre{1}% + \xdef\PfCYHKpair{2}% + \xdef\PfCYHKimpair{1}% + \xdef\PfCYHKnegatif{}% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% + \xdef\PfCYHKnegatif{\PfCYHKnegatif -##1,}% + }% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% + \xdef\PfCYHKnombre{\PfCYHKnombre,##1}% + }% + \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% + \xdef\PfCYHKpair{\PfCYHKpair,\fpeval{##1*2}}% + }% + \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% + \xdef\PfCYHKimpair{\PfCYHKimpair,\fpeval{##1*2+1}}% + }% + % + \ifboolKV[Yohaku]{Perso}{% + \setsepchar[*]{,*/}\ignoreemptyitems% + \readlist*\PfCYHKListe{#2}% + \setsepchar{,}% + \xdef\PfCYHKListeFoo{}% + \foreachitem\compteur\in\PfCYHKListe[1]{% + \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[1,\compteurcnt],}% + }% + \ignoreemptyitems\readlist*\PfCYHKListeNA{\PfCYHKListeFoo}% + \xdef\PfCYHKListeFoo{}% + \foreachitem\compteur\in\PfCYHKListe[2]{% + \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[2,\compteurcnt],}% + }% + \ignoreemptyitems\readlist*\PfCYHKListeP{\PfCYHKListeFoo}% + }{% + \ifboolKV[Yohaku]{Negatif}{% + \xdef\PfCYHKListe{\PfCYHKnegatif}% + }{% + \ifboolKV[Yohaku]{Premier}{% + \xdef\PfCYHKListe{\PfCYHKpremier}% + }{% + \ifboolKV[Yohaku]{Impair}{% + \xdef\PfCYHKListe{\PfCYHKimpair}% + }{% + \ifboolKV[Yohaku]{Pair}{% + \xdef\PfCYHKListe{\PfCYHKpair}% + }{% + \xdef\PfCYHKListe{\PfCYHKnombre}% + }% + }% + }% + }% + \ifboolKV[Yohaku]{Relatif}{% + \xdef\PfCMoitieCase{\fpeval{floor((\useKV[Yohaku]{Taille}**2)/2)}}% + \xdef\PfCAutreMoitieCase{\fpeval{\useKV[Yohaku]{Taille}**2-\PfCMoitieCase}}% + \xdef\PfCFooRelatifYohaku{}% + \xdef\PfCYohakuAlea{\fpeval{randint(1,2)}}% + \xintifboolexpr{\PfCYohakuAlea==1}{% on choisit M1 négatifs, M2 positifs + \MelangeListe{\PfCYHKnegatif}{\PfCMoitieCase}% + \xdef\PfCYohakuInter{\faa}% + \MelangeListe{\PfCYHKnombre}{\PfCAutreMoitieCase}% + \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}% + }{% on choisit M1 positifs, M2 négatifs + \MelangeListe{\PfCYHKnombre}{\PfCMoitieCase}% + \xdef\PfCYohakuInter{\faa}% + \MelangeListe{\PfCYHKnegatif}{\PfCAutreMoitieCase}% + \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}% + }% + \MelangeListe{\PfCYohakuInter}{\fpeval{\useKV[Yohaku]{Taille}**2}}% + }{% + \MelangeListe{\PfCYHKListe}{\fpeval{\useKV[Yohaku]{Taille}**2}}% + }% + \ignoreemptyitems\readlist*\PfCYHKListeNA{\faa}% + %Sommes/Produits + \xdef\PfCYHKListeProduit{}% + %verticaux + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \ifboolKV[Yohaku]{Multiplication}{% + \xdef\PfCYHKTampon{1}% + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{% + \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}% + }% + }{% + \xdef\PfCYHKTampon{0}% + \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{% + \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}% + }% + }% + \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}% + }% + % horizontaux + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \ifboolKV[Yohaku]{Multiplication}{% + \xdef\PfCYHKTampon{1}% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}% + }% + }{% + \xdef\PfCYHKTampon{0}% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}% + }% + }% + \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}% + }% + \readlist*\PfCYHKListeP{\PfCYHKListeProduit}% + }% + \setlength{\PfCYohaku}{\useKV[Yohaku]{Largeur}-\tabcolsep}% + \colorlet{PfCFondYohaku}{\useKV[Yohaku]{CouleurResultat}}% + \colorlet{PfCZoneYohaku}{\useKV[Yohaku]{CouleurZone}}% + \begin{NiceTabular}{*{\fpeval{\useKV[Yohaku]{Taille}+1}}{m{\PfCYohaku}}}[hvlines-except-borders] + \CodeBefore + \xintifboolexpr{\useKV[Yohaku]{Ligne}==0 || \useKV[Yohaku]{Colonne}==0}{}{% + \tikz\draw[fill=PfCZoneYohaku](row-\fpeval{\useKV[Yohaku]{Ligne}}-|col-\fpeval{\useKV[Yohaku]{Colonne}}) rectangle (row-\fpeval{\useKV[Yohaku]{Ligne}+\useKV[Yohaku]{PasL}}-|col-\fpeval{\useKV[Yohaku]{Colonne}+\useKV[Yohaku]{PasC}});% + }% + \ifboolKV[Yohaku]{Bordure}{% + \tikz\fill[PfCFondYohaku] (last-|1)--(last-|last)--(1-|last)--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--cycle; + }{} + \Body + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{% + \xintifForFirst{\rule{0pt}{\useKV[Yohaku]{Hauteur}}}{&} + }\\% + }% + \CodeAfter + \ifboolKV[Yohaku]{Bordure}{% + \tikz\draw (last-|1)--(last-|last)--(1-|last); + }{}% + \tikz\draw (1-|1)--(1-|last); + \tikz\draw (1-|1)--(last-|1); + \tikz\draw[line width=2pt] (1-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--cycle; + \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\Huge\ifboolKV[Yohaku]{Multiplication}{$\times$}{$+$}}; + % Affichage des termes/facteurs + \ifboolKV[Yohaku]{Solution}{% + \ifboolKV[Yohaku]{Perso}{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]}; + }% + }% + }{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{ + \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{ + \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\num{\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]}}; + }% + }% + }% + }{}% + % Affichage d'un terme/facteur + \ifboolKV[Yohaku]{Visible}{% + \xdef\PfCYohakuCaseAFL{\fpeval{floor((\useKV[Yohaku]{Case}-1)/\useKV[Yohaku]{Taille})}}% + \xdef\PfCYohakuCaseAFC{\fpeval{\useKV[Yohaku]{Case}-\useKV[Yohaku]{Taille}*\PfCYohakuCaseAFL}}% + \ifboolKV[Yohaku]{Perso}{% + \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]}; + }{% + \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\num{\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]}}; + }% + }{}% + %% Affichage des sommes/produits horizontalement + \ifboolKV[Yohaku]{Perso}{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\PfCYHKListeP[##2]}; + }% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]}; + }% + }{% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\num{\PfCYHKListeP[##2]}}; + }% + \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% + \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\num{\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]}}; + }% + }% + \end{NiceTabular} +}%
\ No newline at end of file diff --git a/macros/latex/contrib/profcollege/latex/ProfCollege.sty b/macros/latex/contrib/profcollege/latex/ProfCollege.sty index e6f559aa71..04fdb56eeb 100644 --- a/macros/latex/contrib/profcollege/latex/ProfCollege.sty +++ b/macros/latex/contrib/profcollege/latex/ProfCollege.sty @@ -2,30 +2,28 @@ % licence : Released under the LaTeX Project Public License v1.3c % or later, see http://www.latex-project.org/lppl.txtf \NeedsTeXFormat{LaTeX2e}% -\def\filedate{2023/03/06}% +\def\filedate{2023/03/24}% \let\PfCfiledate\filedate% -\def\fileversion{0.99-z-f}% +\def\fileversion{0.99-z-g}% \let\PfCfileversion\fileversion% -\ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college] +\ProvidesPackage{ProfCollege}[\filedate\space v\fileversion\space Aide pour utiliser LaTeX au college]% -\RequirePackage{verbatim} +\RequirePackage{verbatim}% -\RequirePackage{mathtools} +\RequirePackage{mathtools}% -\newif\if@shellescape \@shellescapetrue -\newif\if@amssymb \@amssymbtrue -\DeclareOption{nonshellescape}{\@shellescapefalse} -\DeclareOption{nonamssymb}{\@amssymbfalse} -\ProcessOptions\relax +\newif\if@shellescape \@shellescapetrue% +\newif\if@amssymb \@amssymbtrue% +\DeclareOption{nonshellescape}{\@shellescapefalse}% +\DeclareOption{nonamssymb}{\@amssymbfalse}% +\ProcessOptions\relax% -%\ProcessOptions\relax - -\if@amssymb -\RequirePackage{amssymb} -\fi +\if@amssymb% +\RequirePackage{amssymb}% +\fi% % mathématiques -\RequirePackage{siunitx} +\RequirePackage{siunitx}% \sisetup{% locale=FR,% mode = match, propagate-math-font = true,% @@ -35,97 +33,98 @@ output-decimal-marker={,},% group-minimum-digits=4% }% -\DeclareSIUnit{\kmh}{\km\per\hour} -\newcommand\speed[1]{\SI{#1}{\kmh}} -\newcommand\Speed[1]{\SI[per-mode=symbol]{#1}{\kmh}} +\DeclareSIUnit{\kmh}{\km\per\hour}% +\newcommand\speed[1]{\SI{#1}{\kmh}}% +\newcommand\Speed[1]{\SI[per-mode=symbol]{#1}{\kmh}}% -\DeclareSIUnit{\are}{a} -\DeclareSIUnit{\annee}{an} -\DeclareSIUnit{\mois}{mois} -\DeclareSIUnit{\jour}{j} -\DeclareSIUnit{\quintal}{q} -\DeclareSIUnit{\octet}{o} -\DeclareSIUnit{\fahrenheit}{\text{\textdegree}F} -\DeclareSIUnit{\EuRo}{€} +\DeclareSIUnit{\are}{a}% +\DeclareSIUnit{\annee}{an}% +\DeclareSIUnit{\mois}{mois}% +\DeclareSIUnit{\jour}{j}% +\DeclareSIUnit{\quintal}{q}% +\DeclareSIUnit{\octet}{o}% +\DeclareSIUnit{\fahrenheit}{\text{\textdegree}F}% +\DeclareSIUnit{\EuRo}{€}% \RequirePackage[table,svgnames]{xcolor}%Gestion des couleurs \RequirePackage{xstring}%Gestion de chaines de caractères \RequirePackage{simplekv}%Gestion de paramètres sous forme de clés -\RequirePackage{ifthen} +\RequirePackage{ifthen}% \RequirePackage{modulus}%Pour certains calculs arithmétiques. \RequirePackage{xinttools}%Pour la création dynamique d'un tableau -\RequirePackage{iftex} +\RequirePackage{iftex}% -\ifluatex -\RequirePackage{luacas} -\RequirePackage{luamplib} -\everymplib{input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur; beginfig(1);} -\everyendmplib{endfig;} -\else -\if@shellescape +\ifluatex% +\RequirePackage{luacas}% +\RequirePackage{luamplib}% +\everymplib{input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur; beginfig(1);}% +\everyendmplib{endfig;}% +\else% +\if@shellescape% \RequirePackage[shellescape,latex]{gmp}%inclusion de figures metapost "à la volée"% -\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}} -\usempxclass{article} -\usempxpackage{ProfCollege} -%\usempxpackage[locale=FR,mode = match, propagate-math-font = true,reset-math-version = false, reset-text-family = false,reset-text-series = false, reset-text-shape = false,text-family-to-math = true, text-series-to-math = true, output-decimal-marker={,},group-minimum-digits=4]{siunitx} -\usempxpackage[utf8]{inputenc} -\usempxpackage[T1]{fontenc} -\usempxpackage{fourier} -\usempxpackage[french]{babel} -\usempxpackage{pifont} -\else +\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}}% +\usempxclass{article}% +\usempxpackage{ProfCollege}% +\usempxpackage[utf8]{inputenc}% +\usempxpackage[T1]{fontenc}% +\usempxpackage{fourier}% +\usempxpackage[french]{babel}% +\usempxpackage{pifont}% +\else% \RequirePackage[latex]{gmp}%inclusion de figures metapost "à la volée"% -\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}} -\usempxclass{article} -\usempxpackage{ProfCollege} -%\usempxpackage[locale=FR,mode = match, propagate-math-font = true,reset-math-version = false, reset-text-family = false,reset-text-series = false, reset-text-shape = false,text-family-to-math = true, text-series-to-math = true, output-decimal-marker={,},group-minimum-digits=4]{siunitx} -\usempxpackage[utf8]{inputenc} -\usempxpackage[T1]{fontenc} -\usempxpackage{fourier} -\usempxpackage[french]{babel} -\usempxpackage{pifont} -\fi -\fi +\gmpoptions{everymp={prologues:=3; input PfCLaTeX; input PfCSvgnames; input PfCConstantes; input PfCGeometrie; input PfCAfficheur;}}% +\usempxclass{article}% +\usempxpackage{ProfCollege}% +\usempxpackage[utf8]{inputenc}% +\usempxpackage[T1]{fontenc}% +\usempxpackage{fourier}% +\usempxpackage[french]{babel}% +\usempxpackage{pifont}% +\fi% +\fi% -\RequirePackage{xintexpr} -\RequirePackage{listofitems} -\RequirePackage{datatool} -\RequirePackage{multido} +\RequirePackage{xintexpr}% +\RequirePackage{listofitems}% +\RequirePackage{datatool}% +\RequirePackage{multido}% -\RequirePackage{xlop} -\RequirePackage{xfp} +\RequirePackage{xlop}% +\RequirePackage{xfp}% -\RequirePackage[most]{tcolorbox} +\RequirePackage[most]{tcolorbox}% -\RequirePackage{tikz} +\RequirePackage{tikz}% % https://tex.stackexchange.com/questions/349259/curved-arrow-describing-a-step-in-a-equation-derivation %https://tex.stackexchange.com/questions/58656/best-way-to-draw-a-chevron-diagram-using-tikz -\usetikzlibrary{calc,shapes,arrows,tikzmark,chains,positioning,shapes.symbols,babel,fit} -\usetikzlibrary{backgrounds} +\usetikzlibrary{calc,shapes,arrows,tikzmark,chains,positioning,shapes.symbols,babel,fit}% +\usetikzlibrary{backgrounds}% \RequirePackage{suffix}%pour la commande étoilée -\RequirePackage{multicol} +\RequirePackage{multicol}% -\RequirePackage{hhline} +\RequirePackage{hhline}% -\RequirePackage{stackengine} -\RequirePackage[thicklines]{cancel} +\RequirePackage{stackengine}% +\RequirePackage[thicklines]{cancel}% \RequirePackage{fontawesome5}%Pour l'environnement Twitter \RequirePackage{pifont}%Pour la commande \Autonomie \RequirePackage{nicematrix}% -\NiceMatrixOptions{allow-duplicate-names} +\NiceMatrixOptions{allow-duplicate-names}% + +\let\myoldmulticolumn\multicolumn% +\AtBeginEnvironment{tabular}{\let\multicolumn\myoldmulticolumn}% -\let\myoldmulticolumn\multicolumn -\AtBeginEnvironment{tabular}{\let\multicolumn\myoldmulticolumn} +\RequirePackage{multirow}% +\RequirePackage{longtable} -\RequirePackage{fmtcount} -\FCloadlang{french} +\RequirePackage{fmtcount}% +\FCloadlang{french}% % https://stackoverflow.com/questions/3391103/how-to-make-the-grayed-round-box-using-tiks -\RequirePackage{environ} +\RequirePackage{environ}% %%%%% Quelques besoins particuliers @@ -133,55 +132,55 @@ %% Colorer en mode mathématique. \color ne gère pas les espaces propres au mode mathématique. Donc besoin de changer % https://tex.stackexchange.com/questions/21598/how-to-color-math-symbols -\makeatletter -\def\mathcolor#1#{\@mathcolor{#1}} +\makeatletter% +\def\mathcolor#1#{\@mathcolor{#1}}% \def\@mathcolor#1#2#3{% - \protect\leavevmode - \begingroup + \protect\leavevmode% + \begingroup% \color#1{#2}#3% - \endgroup -} -\makeatother + \endgroup% +}% +\makeatother% % Pb ProfCollege<->Chinois soulev\'e par Denis % Solution by egreg :) \newcommand\getstrut[1]{% \the\expandafter#1\expanded{\strutbox}% -} +}% % Colorer uniquement la barre de soulignement % https://tex.stackexchange.com/questions/9466/color-underline-a-formula/153884 -\def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}} +\def\mathunderline#1#2{\color{#1}\underline{{\color{black}#2}}\color{black}}% % Ecrire des lignes d'équations -\catcode`\@=11 -\def\Eqalign#1{\null\,\vcenter{\openup\jot\m@th\ialign{ - \strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil - &&\quad\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$ - \hfil\crcr #1\crcr}}\,} -\catcode`\@=12 +\catcode`\@=11% +\def\Eqalign#1{\null\,\vcenter{\openup\jot\m@th\ialign{% + \strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil% + &&\quad\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$% + \hfil\crcr #1\crcr}}\,}% +\catcode`\@=12% %%% % Commandes "utiles" %%% %encadrer avec des "sommets arrondis" -\newsavebox{\logobox} +\newsavebox{\logobox}% \newcommand\Logo[2]{% -\setbox1=\hbox{\includegraphics[scale=#2]{#1}} +\setbox1=\hbox{\includegraphics[scale=#2]{#1}}% \begin{tikzpicture}% -\clip[rounded corners=5mm] (0,0) rectangle (\wd1,\ht1); +\clip[rounded corners=5mm] (0,0) rectangle (\wd1,\ht1);% \node[xshift=0.5\wd1, yshift=0.5\ht1, inner xsep=0pt, inner ysep=0pt] (box) {% \includegraphics[scale=#2]{#1}% };% \end{tikzpicture}% -} +}% \newcommand\LogoTW[2]{% \setbox1=\hbox{\includegraphics[scale=#2]{#1}}% \begin{tikzpicture}% - \clip (0,0) circle (4mm); - \draw (0,0) circle (4mm); + \clip (0,0) circle (4mm);% + \draw (0,0) circle (4mm);% \node[xshift=0mm, yshift=0mm, inner xsep=0pt, inner ysep=0pt] (0,0) {% \includegraphics[scale=#2]{#1}% };% @@ -194,7 +193,7 @@ \cleaders\hb@xt@.44em{\hss\xleaders\hrule width0.33em\hss}\hfill% \kern\z@}% -\NewDocumentCommand\PfCdotover{}{\leavevmode\cleaders\hb@xt@ .22em{\hss $\cdot$\hss}\hfill\kern\z@} +\NewDocumentCommand\PfCdotover{}{\leavevmode\cleaders\hb@xt@ .22em{\hss $\cdot$\hss}\hfill\kern\z@}% \makeatother% @@ -212,9 +211,9 @@ %https://tex.stackexchange.com/questions/128991/frac-or-inference-rule-with-dotted-line \newcommand\PfCfrac[2]{% -\ooalign{$\genfrac{}{}{0pt}{0}{#1}{#2}$\cr\PfCdotover\cr} +\ooalign{$\genfrac{}{}{0pt}{0}{#1}{#2}$\cr\PfCdotover\cr}% }% -\makeatother +\makeatother% \newcommand\MultiCol[2]{% \setsepchar[*]{/}% @@ -222,14 +221,14 @@ \setsepchar[*]{§}% \readlist*\ListeContenuCol{#2}% \xintFor* ##1 in {\xintSeq {1}{\ListeNombreCollen}}\do{% - \begin{minipage}{\ListeNombreCol[##1]\linewidth} - \ListeContenuCol[##1] + \begin{minipage}{\ListeNombreCol[##1]\linewidth}% + \ListeContenuCol[##1]% \end{minipage}% \xintifboolexpr{##1<\ListeNombreCollen}{\hfill}{}% }% }% -\newcount\PfCrappeljour +\newcount\PfCrappeljour% \newcommand\Demain{% \PfCrappeljour=\day\relax% @@ -357,7088 +356,32 @@ \day=\the\PfCrappeljour\relax% } -%%% -% Kakurasu -%%% -\setKVdefault[Kakurasu]{Solution=false,Longueur=6,Largeur=6,Echelle=8mm,Graines=false,Trace=false} -\defKV[Kakurasu]{Graine=\setKV[Kakurasu]{Graines}} -\defKV[Kakurasu]{Traces=\setKV[Kakurasu]{Trace}} - -\NewDocumentCommand\Kakurasu{o}{% - \useKVdefault[Kakurasu]% - \setKVdefault[Kakurasu]{#1}% - \BuildKakurasu% -} - -\NewDocumentCommand\BuildKakurasu{}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution,Trace; - Graines=\useKV[Kakurasu]{Graines}; - Solution=\useKV[Kakurasu]{Solution}; - Trace=\useKV[Kakurasu]{Trace}; - - if Graines: - randomseed:=\useKV[Kakurasu]{Graine}; - fi; - - numeric Longueur,Largeur; - Longueur=\useKV[Kakurasu]{Longueur}; - Largeur=\useKV[Kakurasu]{Largeur}; - - u:=\useKV[Kakurasu]{Echelle}; - - pair A[][];%centre des carrés. - boolean Allume[][]; - numeric NombreLigne[][],NombreColonne[][]; - - for k=-1 upto Largeur+1: - for l=-1 upto Longueur+1: - Allume[k][l]=false; - endfor; - endfor; - - for k=0 upto Largeur-1: - for l=0 upto Longueur-1: - A[k][l]=u*(l,-k); - trace (unitsquare scaled u) shifted A[k][l]; - endfor; - endfor; - - for k=0 upto Largeur-1: - for l=0 upto Longueur-1: - if Allume[k][l]: - else: - Allume[k][l]:=true; - m:=uniformdeviate(1); - if m<0.5: - % on ne met pas de case noire - else: - % on met une case noire - NombreLigne[k][l]=l+1; - NombreColonne[k][l]=k+1; - if Solution: - fill (unitsquare scaled 0.9u) shifted (A[k][l]+0.05*u*(1,1)); - fi; - fi; - fi; - endfor; - endfor; - - % on compte le nombre de chiffres dans les lignes et on les ajoute - for k=0 upto Largeur-1: - Somme:=0; - for l=0 upto Longueur-1: - if unknown NombreLigne[k][l]: - else: - Somme:=Somme+NombreLigne[k][l]; - fi; - endfor; - label(TEX(decimal(Somme)),u*(-0.5,-k+0.5)); - endfor; - - % on compte le nombre de chiffres dans les colonnes et on les ajoute - for k=0 upto Longueur-1: - Somme:=0; - for l=0 upto Largeur-1: - if unknown NombreColonne[l][k]: - else: - Somme:=Somme+NombreColonne[l][k]; - fi; - endfor; - label(TEX(decimal(Somme)),u*(k+0.5,1.5)); - endfor; - - % On affiche les valeurs des cases noires. - drawoptions(withcolor 0.5white); - for k=0 upto Longueur-1: - label(TEX("\footnotesize"&decimal(k+1)),u*(k+0.5,-Largeur+0.5)); - endfor; - for k=0 upto Largeur-1: - label(TEX("\footnotesize"&decimal(k+1)),u*(Longueur+0.5,-k+0.5)); - endfor; - drawoptions(); - if Trace: - \useKV[Kakurasu]{Traces}; - fi; - \end{mplibcode} - \fi -}% - -%%% -% Midpoint -%%% -\setKVdefault[MidPoint]{Solution=false,Graines=false,Hard=false} -\defKV[MidPoint]{Graine=\setKV[MidPoint]{Graines}} - -\NewDocumentCommand\MidPoint{o}{% - \useKVdefault[MidPoint]% - \setKV[MidPoint]{#1}% - \BuildMidPoint -} - -\NewDocumentCommand\BuildMidPoint{}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - numeric Longueur,Largeur; - Longueur=8; - Largeur=4; - boolean Horizontal,Vertical,RetiensSens; - Horizontal=false; - Vertical=false; - - boolean Solution,Hard,Graines; - Solution:=\useKV[MidPoint]{Solution}; - Hard:=\useKV[MidPoint]{Hard}; - Graines:=\useKV[MidPoint]{Graines}; - if Graines: - randomseed:=\useKV[MidPoint]{Graine} - fi; - - u:=8mm; - - pair A[][];%centre des carrés. - - vardef CherchePoint(expr basek,basel)= - % Si le déplacement précédent est horizontal, il faut passer en vertical - % Si le déplacement précédent est vertical, il faut passer en horizontal - p:=p+1; - if basel=ColonneArrivee: - RP[p]:=Arrivee; - else: - if Vertical: - %deplacement horizontal - ecart:=ColonneArrivee-basel; - if ecart=1: - Basel:=ColonneArrivee; - RP[p]:=A[basek][ColonneArrivee]; - else: - Basel:=ceiling(basel+uniformdeviate(ecart)); - RP[p]:=A[basek][Basel]; - fi; - Basek:=basek; - Horizontal:=true; - Vertical:=false; - else: - %on vérifie qu'on peut se déplacer dans les deux sens. - % on choisit vertical positif ou vertical négatif - if basek=1: - choix:=0.75; - elseif basek=Largeur: - choix:=0.25; - else: - choix:=uniformdeviate(1); - fi; - if choix<0.5: - ecart:=basek-1; - if ecart=1: - Basek:=1; - RP[p]:=A[1][basel]; - else: - Basek:=ceiling(uniformdeviate(ecart)); - RP[p]:=A[Basek][basel]; - fi; - Basel:=basel; - else: - ecart:=Largeur-basek; - if ecart=1: - Basek:=Largeur; - RP[p]:=A[Largeur][basel]; - else: - Basek:=basek+ceiling(uniformdeviate(ecart)); - RP[p]:=A[Basek][basel]; - fi; - Basel:=basel; - fi; - Horizontal:=false; - Vertical:=true; - fi; - fi; -enddef; - -vardef MidPoint(expr Aa,Bb)= - save $; - picture $; - $=image( - if Solution: - trace Aa--Bb withpen pencircle scaled 1.5; - fi; - if Hard: - NbMid:=NbMid+1; - if NbMid mod 2=0: - remplis cercles(1/2[Aa,Bb],1mm); - fi; - else: - remplis cercles(1/2[Aa,Bb],1mm); - fi; - ); - $ -enddef; - - % tracé de la grille - for k=1 upto 2*Largeur: - for l=-3 upto Largeur+Longueur-4: - trace (unitsquare scaled u) shifted (u*(l,-k)-center (unitsquare scaled u)) withcolor 0.5*white; - endfor; - endfor; - - for k=1 upto Largeur: - for l=1 upto Longueur: - A[k][l]=u*(l,-k); - %trace (unitsquare scaled u) shifted (A[k][l]-center (unitsquare scaled u)) withcolor 0.5*white; - endfor; - endfor; - -%On choisit le premier déplacement - choix:=uniformdeviate(1); - if choix<0.5: - Horizontal:=true; - else: - Vertical:=true; - fi; - - p:=0; - NbMid=ceiling(uniformdeviate(2));%Pour le niveau Hard - - %1er rectangle -LigneDepart:=2;%2; -ColonneDepart:=1; -LigneArrivee:=4;%4; -ColonneArrivee:=8; -pair Depart,Arrivee; -Depart=A[LigneDepart][ColonneDepart]; -Arrivee=A[LigneArrivee][ColonneArrivee]; - -pair RP[];%RetiensPoints -RP[0]=Depart; - -Basek:=LigneDepart; -Basel:=ColonneDepart; -forever: - CherchePoint(Basek,Basel); - exitif RP[p]=Arrivee; -endfor; - -if ypart(RP[p])=ypart(RP[p-1]): - RetiensSens:=true; -else: - RetiensSens:=false; - p:=p-1; -fi; - -%2eme rectangle -for k=1 upto Largeur: - for l=1 upto Longueur: - A[k][l]:=u*(Longueur+l,-k); - endfor; -endfor; - -LigneDepart:=4; -ColonneDepart:=1; -LigneArrivee:=2; -ColonneArrivee:=8; -Depart:=A[LigneDepart][ColonneDepart]; -Arrivee:=A[LigneArrivee][ColonneArrivee]; - -Basek:=LigneDepart; -Basel:=ColonneDepart; -Retiens:=p; -RP[p+1]:=Depart; - -forever: - CherchePoint(Basek,Basel); - exitif RP[p]=Arrivee; -endfor; - -if ypart(RP[p])=ypart(RP[p-1]): - RetiensSens:=true; - p:=p-1; -else: - RetiensSens:=false; -fi; - -for h=(Retiens+1) upto p: - RP[h]:=symetrie(RP[h],u*(Longueur+0.5,-Largeur-0.5)); -endfor; -%3eme Rectangle -for k=1 upto Largeur: - for l=1 upto Longueur: - A[k][l]:=u*(2*Longueur+l,-k); - endfor; -endfor; - -LigneDepart:=4; -ColonneDepart:=2; -LigneArrivee:=1; -ColonneArrivee:=4; -Depart:=A[LigneDepart][ColonneDepart]; -Arrivee:=A[LigneArrivee][ColonneArrivee]; - - -Basek:=LigneDepart; -Basel:=ColonneDepart; -Retiens:=p; -RP[p+1]:=Depart; -forever: - CherchePoint(Basek,Basel); - exitif RP[p]=Arrivee; -endfor; -for h=(Retiens+1) upto p: - RP[h]:=rotation(RP[h],u*(2*Longueur+0.5,-Largeur-0.5),90) shifted(u*(-2*Longueur,-Largeur)); -endfor; -%4eme rectangle. On termine la boucle ? -for k=1 upto Largeur: - for l=1 upto Longueur: - A[k][l]:=u*(3*Longueur+l,-k); - endfor; -endfor; - -LigneDepart:=4; -ColonneDepart:=1; -LigneArrivee:=2; -ColonneArrivee:=4; -Depart:=A[LigneDepart][ColonneDepart]; -Arrivee:=A[LigneArrivee][ColonneArrivee]; - -Basek:=LigneDepart; -Basel:=ColonneDepart; -Retiens:=p; -RP[p+1]:=Depart; -forever: - CherchePoint(Basek,Basel); - exitif RP[p]=Arrivee; -endfor; - -if ypart(RP[p])=ypart(RP[p-1]): - p:=p-1; -fi; - -if ypart(RP[0])=ypart(RP[1]): - RetiensSens:=true; -else: - RetiensSens:=false; -fi; - -for h=(Retiens+1) upto p: - RP[h]:=RP[h] shifted(u*(-3.5*Longueur,0)); -endfor; - -if RetiensSens: - RP[p+1]:=RP[1]; - go:=1; -else: - RP[p+1]:=RP[0]; - go:=0; -fi; - -for h=go upto p: - draw MidPoint(RP[h],RP[h+1]); -endfor; -\end{mplibcode} -\fi -} - -%%% -% Grades -%%% -\setKVdefault[Grades]{Solution=false,Longueur=9,Largeur=9,Echelle=8mm,Graines=false} -\defKV[Grades]{Graine=\setKV[Grades]{Graines}} - -\NewDocumentCommand\Grades{o}{% - \useKVdefault[Grades]% - \setKVdefault[Grades]{#1}% - \BuildGrades% -} - -\NewDocumentCommand\BuildGrades{}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines=\useKV[Grades]{Graines}; - Solution=\useKV[Grades]{Solution}; - - if Graines: - randomseed:=\useKV[Grades]{Graine}; - fi; - - numeric Longueur,Largeur; - Longueur=\useKV[Grades]{Longueur}; - Largeur=\useKV[Grades]{Largeur}; - - u:=\useKV[Grades]{Echelle}; - - p:=0; - pair A[];%centre des carrés. - boolean Allume[][]; - numeric Nombre[][]; - - for k=-1 upto Largeur+1: - for l=-1 upto Longueur+1: - Allume[k][l]=false; - endfor; - endfor; - - for k=0 upto Longueur-1: - for l=0 upto Largeur-1: - p:=p+1; - A[p]=u*(k,-l); - trace (unitsquare scaled u) shifted A[p]; - endfor; - endfor; - - for k=0 upto Largeur-1: - for l=0 upto Longueur-1: - if Allume[k][l]: - else: - Allume[k][l]:=true; - m:=uniformdeviate(1); - if m<0.5: - % on ne met pas de nombre - else: - % on met un nombre - Nombre[k][l]=floor(1+uniformdeviate(9)); - Allume[k][l+1]:=true; - Allume[k+1][l-1]:=true; - Allume[k+1][l]:=true; - Allume[k+1][l+1]:=true; - if Solution: - label(TEX(decimal(Nombre[k][l])),u*(l+0.5,-k+0.5)); - fi; - fi; - fi; - endfor; - endfor; - - % on compte le nombre de chiffres dans les lignes et on les ajoute - for k=0 upto Largeur-1: - p:=0; - Somme:=0; - for l=0 upto Longueur-1: - if unknown Nombre[k][l]: - else: - p:=p+1; - Somme:=Somme+Nombre[k][l]; - fi; - endfor; - label(TEX(decimal(p)),u*(-0.5,-k+0.5)); - label(TEX(decimal(Somme)),u*(Longueur+0.5,-k+0.5)); - endfor; - - % on compte le nombre de chiffres dans les colonnes et on les ajoute - for k=0 upto Longueur-1: - p:=0; - Somme:=0; - for l=0 upto Largeur-1: - if unknown Nombre[l][k]: - else: - p:=p+1; - Somme:=Somme+Nombre[l][k]; - fi; - endfor; - label(TEX(decimal(p)),u*(k+0.5,1.5)); - label(TEX(decimal(Somme)),u*(k+0.5,-Largeur+0.5)); - endfor; - \end{mplibcode} - \fi -}% - -%%% -% Squaro -%%% -\setKVdefault[Squaro]{Solution=false,Longueur=8,Largeur=8,Echelle=8mm,Nom=Jeu1,Graines=false} -\defKV[Squaro]{Graine=\setKV[Squaro]{Graines}}% - -\NewDocumentCommand\SquarO{o}{% - \useKVdefault[Squaro]% - \setKVdefault[Squaro]{#1}% - \ifboolKV[Squaro]{Solution}{\BuildSquaroSolution}{\BuildSquaro}% -} - -\NewDocumentCommand\BuildSquaro{}{% - \ifluatex - \mplibforcehmode - \xdef\PfCSquaroNom{\useKV[Squaro]{Nom}}% - \begin{mplibcode}[\PfCSquaroNom] - numeric Longueur,Largeur; - Longueur=\useKV[Squaro]{Longueur}; - Largeur=\useKV[Squaro]{Largeur}; - boolean Solution,Graines; - Solution=\useKV[Squaro]{Solution}; - Graines:=\useKV[Squaro]{Graines}; - if Graines: - randomseed:=\useKV[Squaro]{Graine}; - fi; - - u:=\useKV[Squaro]{Echelle}; - - p:=0; - pair A[];%centre des carrés. - boolean Allume[][]; - - for k=0 upto Longueur-1: - for l=0 upto Largeur-1: - p:=p+1; - A[p]=u*(k,-l); - trace (unitsquare scaled u) shifted A[p]; - endfor; - endfor; - - for k=0 upto Largeur: - for l=0 upto Longueur: - m:=uniformdeviate(1); - if m<0.5: - Allume[k][l]=true; - fill cercles(u*(l,-k+1),1mm) if Solution=false:withcolor white fi; - else: - Allume[k][l]=false; - fill cercles(u*(l,-k+1),1mm) withcolor white; - fi; - trace cercles(u*(l,-k+1),1mm); - endfor; - endfor; - - for k=0 upto Largeur-1: - for l=0 upto Longueur-1: - Retiens:=0; - if Allume[k][l]:Retiens:=Retiens+1 fi; - if Allume[k][l+1]:Retiens:=Retiens+1 fi; - if Allume[k+1][l]:Retiens:=Retiens+1 fi; - if Allume[k+1][l+1]:Retiens:=Retiens+1 fi; - label(TEX(decimal(Retiens)),u*(l+0.5,-k+0.5)); - endfor; - endfor; - \end{mplibcode} - \fi -} - -\NewDocumentCommand\BuildSquaroSolution{}{% - \ifluatex - \mplibforcehmode - \xdef\PfCSquaroNom{\useKV[Squaro]{Nom}}% - \begin{mplibcode}[\PfCSquaroNom] - u:=\useKV[Squaro]{Echelle}; - p:=0; - for k=0 upto Longueur-1: - for l=0 upto Largeur-1: - p:=p+1; - trace (unitsquare scaled u) shifted A[p]; - endfor; - endfor; - - for k=0 upto Largeur: - for l=0 upto Longueur: - if Allume[k][l]=true: - fill cercles(u*(l,-k+1),1mm); - else: - fill cercles(u*(l,-k+1),1mm) withcolor white; - fi; - trace cercles(u*(l,-k+1),1mm); - endfor; - endfor; - - for k=0 upto Largeur-1: - for l=0 upto Longueur-1: - Retiens:=0; - if Allume[k][l]:Retiens:=Retiens+1 fi; - if Allume[k][l+1]:Retiens:=Retiens+1 fi; - if Allume[k+1][l]:Retiens:=Retiens+1 fi; - if Allume[k+1][l+1]:Retiens:=Retiens+1 fi; - label(TEX(decimal(Retiens)),u*(l+0.5,-k+0.5)); - endfor; - endfor; - \end{mplibcode} - \fi -} - -%%% -% Garam -%%% -\setKVdefault[Garam]{Taille=7,Largeur=15pt,Solution=false,CouleurSolution=Black} -\newlength\PfCGaramHeight - -\NewDocumentCommand\Garam{o m}{% - \useKVdefault[Garam] - \setKV[Garam]{#1}% - \setlength{\PfCGaramHeight}{\useKV[Garam]{Largeur}+\tabcolsep}% - \reademptyitems% - \setsepchar[*]{§*,*/}% - \readlist*\PfCListeGaram{#2}% - \colorlet{PfCGaramCoulSol}{\useKV[Garam]{CouleurSolution}}% - \begin{NiceTabular}{*{\useKV[Garam]{Taille}}{m{\useKV[Garam]{Largeur}}}} - \CodeBefore - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Garam]{Taille}}}}\do{% - \tikz{\draw[dashed,LightGray] (1-|##1)--(last-|##1);}% - }% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\PfCListeGaramlen-1}}}\do{% - \tikz{\draw[dashed,LightGray] (##1-|1)--(##1-|last);}% - }% - \tikz{\draw (1-|1) rectangle (last-|last);}% - \Body - \xintFor* ##1 in{\xintSeq{1}{\PfCListeGaramlen}}\do{% - \rule{0pt}{\PfCGaramHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Garam]{Taille}}}\do{% - \xintifForFirst{}{&}\StrChar{\PfCListeGaram[##1,##2,1]}{1}[\PfCCaracGaram]% - \IfStrEq{\PfCCaracGaram}{*}{\Block[draw,fill=black]{1-1}{}}{% - \IfStrEq{\PfCCaracGaram}{!}{\Block{}{\ifboolKV[Garam]{Solution}{\StrGobbleLeft{\PfCListeGaram[##1,##2,1]}{1}}{}}}{\Block{}{\color{PfCGaramCoulSol}\PfCListeGaram[##1,##2,1]}}% - }% - }\\ - }% - \CodeAfter - % On place les symboles - \xintFor* ##1 in{\xintSeq{1}{\PfCListeGaramlen}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[Garam]{Taille}}}\do{% - \StrChar{\PfCListeGaram[##1,##2,1]}{1}[\PfCCaracGaram]% - \IfStrEq{\PfCCaracGaram}{*}{}{% - \tikz{% - \StrSubstitute{\PfCListeGaram[##1,##2,2]}{x}{\times}[\PfCGaramUn]% - \StrSubstitute{\PfCGaramUn}{:}{\div}[\PfCGaramUn]% - \StrSubstitute{\PfCListeGaram[##1,##2,3]}{x}{\times}[\PfCGaramDeux]% - \StrSubstitute{\PfCGaramDeux}{:}{\div}[\PfCGaramDeux]% - \xintifForLast{}{\node at (\fpeval{##1+0.5}-|\fpeval{##2+1}) {$\PfCGaramUn$};} - \node at (\fpeval{##1+1}-|\fpeval{##2+0.5}) {$\PfCGaramDeux$}; - }% - }% - }% - }% - \end{NiceTabular} -}% - -%%% -% Futoshiki -%%% -\setKVdefault[Futo]{Largeur=15pt,Solution=false,CouleurSolution=Black,CouleurCase=Cornsilk,StyleTexte={}} - -\newlength\PfCFutoHeight - -\NewDocumentCommand\Futoshiki{o m}{% - \useKVdefault[Futo] - \setKV[Futo]{#1}% - \setlength{\PfCFutoHeight}{\useKV[Futo]{Largeur}+\tabcolsep}% - \setsepchar{\\/,}% - \readlist\ListeFuto{#2}% - \xdef\PfCTailleFuto{\ListeFutolen}% - \def\PfCFutoStyleTexte{\useKV[Futo]{StyleTexte}}% - \colorlet{PfCFutoCase}{\useKV[Futo]{CouleurCase}}% - \begin{NiceTabular}{*{\fpeval{\PfCTailleFuto-1}}{m{\useKV[Futo]{Largeur}}m{5pt}}m{\useKV[Futo]{Largeur}}}%[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\PfCTailleFuto}}\do{% - \xintFor* ##2 in{\xintSeq{1}{\PfCTailleFuto}}\do{% - \rule{0pt}{\PfCFutoHeight}% - \StrChar{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCCaracFuto]% - \IfStrEq{\PfCCaracFuto}{*}{% - \StrGobbleLeft{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCResteFuto]% - \Block[draw]{}{\PfCFutoStyleTexte\PfCResteFuto}% - }{% - \IfStrEq{\PfCCaracFuto}{!}{% - \StrGobbleLeft{\ListeFuto[##1,\fpeval{2*##2-1}]}{1}[\PfCResteFuto]% - \Block[draw,fill=PfCFutoCase]{}{\PfCFutoStyleTexte\PfCResteFuto}% - }{% - \ifboolKV[Futo]{Solution}{\Block[draw]{}{\PfCFutoStyleTexte\color{\useKV[Futo]{CouleurSolution}}\ListeFuto[##1,\fpeval{2*##2-1}]}}{\Block[draw]{}{}}% - }% - }% - \xintifForLast{}{&&}% - }\\ - \rule{0pt}{\fpeval{5pt+\tabcolsep}pt}\Block[]{}{}\\ - }% - \CodeAfter%Pour écrire les symboles - \xintFor* ##1 in{\xintSeq{1}{\PfCTailleFuto}}\do{% - \xintFor* ##2 in{\xintSeq{1}{\PfCTailleFuto}}\do{% - \IfStrEq{\ListeFuto[##1,2*##2]}{>}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{<}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{v}{% - \tikz{% - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{A}{% - \tikz{% - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{>A}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{>v}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1}-|\fpeval{2*##2}); - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{<A}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1}-|\fpeval{2*##2}); - }% - }{}% - \IfStrEq{\ListeFuto[##1,2*##2]}{<v}{% - \tikz{% - \draw[transform canvas={xshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1}-|\fpeval{2*##2+0.5})--(\fpeval{2*##1-0.5}-|\fpeval{2*##2})--(\fpeval{2*##1}-|\fpeval{2*##2+0.5}); - \draw[transform canvas={yshift=\fpeval{2pt+0.5\tabcolsep}pt}] (\fpeval{2*##1-1.5}-|\fpeval{2*##2-1})--(\fpeval{2*##1-1}-|\fpeval{2*##2-0.5})--(\fpeval{2*##1-1.5}-|\fpeval{2*##2}); - }% - }{}% - }% - }% - \end{NiceTabular} -}% - -%%% -% Ronde infernale -%%% -\newcommand\TestNombrePremier[1]{% - % #1 le nombre \`a tester - \newcount\anp\newcount\bnp\newcount\cnp% - \anp=#1\relax - \bnp=2\relax - \premier=-1\relax - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax% - \global\premier=\numexpr\premier+1\relax% - \cnp=\numexpr\anp/\bnp\relax% - \anp=\cnp\relax% - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - }% -}% - -\newcommand\PfCRIListeDiviseur[1]{%#1 : nombre entier - \newcount\anp\newcount\bnp% - \anp=\fpeval{abs(#1)}% - \bnp=2\relax% - \xdef\PfCRIRetiensListeDiviseurs{}% - \ifnum#1=0% - \xdef\PfCRIRetiensListeDiviseurs{\fpeval{randint(2,5)},\fpeval{randint(6,9)}}% - \else - \whiledo{\bnp<\anp}{% - \modulo{\the\anp}{\the\bnp}{}% - \ifnum\remainder=0% - \ifnum#1>0 - \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\bnp,}% - \else - \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\bnp,-\the\bnp,}% - \fi - \fi% - \bnp=\numexpr\bnp+1% - }% - \ifnum#1>0 - \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\anp,1} - \else - \xdef\PfCRIRetiensListeDiviseurs{\PfCRIRetiensListeDiviseurs \the\anp,-\the\anp} - \fi - \fi -} - -\setKVdefault[RondeInfernale]{Solution=false,Relatifs=false,Etapes=4,Perso=false,Cles=false,Vide,Rayon=2.5cm,Graines=false,Rectangle=false}% -\defKV[RondeInfernale]{Graine=\setKV[RondeInfernale]{Graines}}% -\defKV[RondeInfernale]{Cle=\setKV[RondeInfernale]{Cles}\setKV[RondeInfernale]{Vide=false}}% -\defKV[RondeInfernale]{ListeOperations=\setKV[RondeInfernale]{Perso}}% -\defKV[RondeInfernale]{ListeNombres=\setKV[RondeInfernale]{Perso}}% -% -\NewDocumentCommand\RondeInfernale{o}{% - \useKVdefault[RondeInfernale]% - \setKV[RondeInfernale]{#1}% - % Graine - \ifboolKV[RondeInfernale]{Graines}{\PfCGraineAlea{\useKV[RondeInfernale]{Graine}}}{}% - % Nombre clé - \ifboolKV[RondeInfernale]{Cles}{% - \xdef\PfCRINombreCle{\useKV[RondeInfernale]{Cle}}% - }{% - \ifboolKV[RondeInfernale]{Relatifs}{% - \xdef\PfCRIListeNegatifs{-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10} - \MelangeListe{\PfCRIListeNegatifs}{1} - \readlist*\PfCRIListeCle{\faa} - \xdef\PfCRINombreCle{\PfCRIListeCle[1]}% - }{% - \xdef\PfCRINombreCle{\fpeval{randint(2,9)}}% - }% - }% - \ifboolKV[RondeInfernale]{Perso}{% - \xdef\PfCRIRecupOperations{\useKV[RondeInfernale]{ListeOperations}}% - \xdef\PfCRIRecupNombres{\useKV[RondeInfernale]{ListeNombres}}% - }{% - % On définit les éléments nécessaires - \xdef\PfCRIListeToutesOperations{+,-,*,/}% - \xdef\PfCRIListeOperationsSansDiv{+,-,*}% - \xdef\PfCRIListeOperationsSansMul{+,-,/}% - \xdef\PfCRIListeOperationsSimple{+,-}% - \xdef\PfCRIRecupOperations{}% - \xdef\PfCRIRecupNombres{}% - \xdef\PfCRIRecupResultats{}% - \xdef\PfCRINombreATester{\PfCRINombreCle}% - \xdef\PfCRIRetiensNbEtapes{\useKV[RondeInfernale]{Etapes}}% - \setsepchar{,}\ignoreemptyitems% - % Liste des opérations jusqu'à l'étape n-1 - \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[RondeInfernale]{Etapes}-1}}}\do{% - \TestNombrePremier{\PfCRINombreATester}\relax% - \xintifboolexpr{\premier==0}{% - % Définition des opérations - \MelangeListe{\PfCRIListeOperationsSansDiv}{1}% - \readlist*\PfCRIRetiensLoperation{\faa}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \xdef\PfCRIOperateur{\fpeval{randint(2,9)}}% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRIOperateur,}% - \xdef\PfCRIResultat{\fpeval{\PfCRINombreATester\PfCRIRetiensLoperation[1]\PfCRIOperateur}}% - \xdef\PfCRIRecupResultats{\PfCRIRecupResultats \PfCRIResultat,}% - \xdef\PfCRINombreATester{\PfCRIResultat}% - }{% - \MelangeListe{\PfCRIListeToutesOperations}{1}% - \readlist*\PfCRIRetiensLoperation{\faa}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \IfStrEq{\PfCRIRetiensLoperation[1]}{/}{% - \PfCRIListeDiviseur{\PfCRINombreATester}% - \MelangeListe{\PfCRIRetiensListeDiviseurs}{1}% - \readlist*\PfCRIRetiensLeDiviseur{\faa}% - \xdef\PfCRIOperateur{\PfCRIRetiensLeDiviseur[1]}% - }{% - \xdef\PfCRIOperateur{\fpeval{randint(2,9)}}% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRIOperateur,}% - \xdef\PfCRIResultat{\fpeval{\PfCRINombreATester\PfCRIRetiensLoperation[1]\PfCRIOperateur}}% - \xdef\PfCRIRecupResultats{\PfCRIRecupResultats \PfCRIResultat,}% - \xdef\PfCRINombreATester{\PfCRIResultat}% - }% - }% - % Dernière opération - \xintifboolexpr{\fpeval{abs(\PfCRINombreATester)-abs(\PfCRINombreCle)}>0}{% - \modulo{\PfCRINombreATester}{\PfCRINombreCle}{}% - \xintifboolexpr{\remainder==0}{% - \MelangeListe{\PfCRIListeOperationsSansMul}{1}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \ignoreemptyitems% - \readlist*\PfCRIRetiensLoperation{\faa}% - \IfStrEq{\PfCRIRetiensLoperation[1]}{/}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester/\PfCRINombreCle}}% - }{% - \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% - }{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% - }% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }{% - \MelangeListe{\PfCRIListeOperationsSimple}{1}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \ignoreemptyitems% - \readlist*\PfCRIRetiensLoperation{\faa}% - \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% - }{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }% - }{% - \xintifboolexpr{\fpeval{abs(\PfCRINombreATester)-abs(\PfCRINombreCle)}==0}{% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations *}% - \ignoreemptyitems% - \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres 1}% - }{% - \xintifboolexpr{\PfCRINombreATester==0}{% - \MelangeListe{\PfCRIListeOperationsSimple}{1}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \ignoreemptyitems% - \readlist*\PfCRIRetiensLoperation{\faa}% - \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% - }{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }{% - \modulo{\PfCRINombreCle}{\PfCRINombreATester}{}% - \xintifboolexpr{\remainder==0}{%-1 - \MelangeListe{\PfCRIListeToutesOperations}{1}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \readlist*\PfCRIRetiensLoperation{\faa}% - \ignoreemptyitems% - \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% - \IfStrEq{\PfCRIRetiensLoperation[1]}{*}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle/\PfCRINombreATester}}% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }{ - \IfStrEq{\PfCRIRetiensLoperation[1]}{-}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% - }{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }% - }{% - \MelangeListe{\PfCRIListeOperationsSimple}{1}% - \xdef\PfCRIRecupOperations{\PfCRIRecupOperations \faa}% - \ignoreemptyitems% - \readlist*\PfCRIRIListeOperations{\PfCRIRecupOperations}% - \IfStrEq{\PfCRIRIListeOperations[\PfCRIRetiensNbEtapes]}{-}{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreATester-\PfCRINombreCle}}% - }{% - \xdef\PfCRINombreATester{\fpeval{\PfCRINombreCle-\PfCRINombreATester}}% - }% - \xdef\PfCRIRecupNombres{\PfCRIRecupNombres \PfCRINombreATester}% - }% - }% - }% - }% - }% - \ignoreemptyitems% - \readlist*\PfCRIRIOperations{\PfCRIRecupOperations}% - \readlist*\PfCRIRINombres{\PfCRIRecupNombres}% - \reademptyitems% - % On prépare le dessin - \xdef\PfCRINombresDessin{}% - \xdef\PfCRIOperationsDessin{}% - \foreachitem\compteur\in\PfCRIRINombres{% - \xintifboolexpr{\PfCRIRINombres[\compteurcnt]<0}{% - \xdef\PfCRINombresDessin{\PfCRINombresDessin "(\num{\PfCRIRINombres[\compteurcnt]})",}% - }{% - \xdef\PfCRINombresDessin{\PfCRINombresDessin "\num{\PfCRIRINombres[\compteurcnt]}",}% - }% - }% - \foreachitem\compteur\in\PfCRIRIOperations{% - \xdef\PfCRIOperationsDessin{\PfCRIOperationsDessin "\PfCRIRIOperations[\compteurcnt]",}% - }% - % On dessine - \BuildRondeInfernale{\PfCRINombresDessin}{\PfCRIOperationsDessin}% -}% - -\NewDocumentCommand\BuildRondeInfernale{m m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Vide,Rectangle,Perso; - Vide=\useKV[RondeInfernale]{Vide}; - Rectangle=\useKV[RondeInfernale]{Rectangle}; - Perso=\useKV[RondeInfernale]{Perso}; - if Perso: - string Depart; - Depart=\useKV[RondeInfernale]{Cle}; - else: - numeric Depart; - Depart=\PfCRINombreCle; - fi; - - numeric Rayon; - Rayon=\useKV[RondeInfernale]{Rayon}; - - string Nombre[]; - - vardef Compte(text t)=%On compte le nb d'étapes et on retient les nombres - nbcase:=0; - for p_=t: - nbcase:=nbcase+1; - Nombre[nbcase]=p_; - endfor; - enddef; - - vardef AfficheRonde(text t)=%On fait l'affichage des opérations - n:=0; - for k=1 upto nbcase: - fill cercles(rotation(A[k],O,0.5*(360/nbcase)),5mm) withcolor white; - endfor; - for p_=t: - n:=n+1; - if p_="*": - label(TEX("$\times"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - elseif p_="/": - label(TEX("$\div"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - else: - label(TEX("$"&p_&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - fi; - endfor; - enddef; - - vardef AfficheRectangle(text t)=%On fait l'affichage des opérations - n:=0; - for p_=t: - n:=n+1; - if n=nbcase: - if p_="*": - label.bot(TEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - elseif p_="/": - label.bot(TEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - else: - label.bot(TEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - fi; - else: - if p_="*": - label.top(TEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - elseif p_="/": - label.top(TEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - else: - label.top(TEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - fi; - fi; - endfor; - enddef; - - vardef BaseRonde= - pair O,A[]; - O=(0,0); - path cc; - cc=cercles(O,Rayon); - A[0]=pointarc(cc,0); - A[nbcase+1]=A[0]; - for k=1 upto nbcase: - A[k]=rotation(A[0],O,k*(360/nbcase)); - endfor; - for k=0 upto nbcase: - drawarrow reverse(arccercle(A[k],A[k+1],O) cutbefore cercles(A[k],5mm) cutafter cercles(A[k+1],5mm)) withpen pencircle scaled 1.5; - endfor; - for k=0 upto nbcase: - fill cercles(A[k],5mm) withcolor white; - trace cercles(A[k],5mm) withpen pencircle scaled 1.5; - endfor; - enddef; - - vardef BoiteRectangle= - save $; - path $; - $=u*(0.9,-0.5){dir 0}..{dir 90}(u*(1,-0.4))--(u*(1,0.4)){dir 90}..{dir180}(u*(0.9,0.5))--u*(-0.9,0.5){dir 180}..{dir-90}(u*(-1,0.4))--(u*(-1,-0.4)){dir-90}..{dir0}(u*(-0.9,-0.5))--cycle; - $ - enddef; - - vardef BaseRectangle= - pair O,A[]; - O=(0,0); - A[0]=O; - for k=1 upto nbcase: - A[k]-A[k-1]=(Rayon+2cm,0); - endfor; - for k=0 upto nbcase-2: - drawarrow (A[k]--A[k+1]) cutbefore (BoiteRectangle shifted A[k]) cutafter (BoiteRectangle shifted A[k+1]) withpen pencircle scaled 1.5; - endfor; - drawarrow (A[nbcase-1]--(A[nbcase-1]+u*(0,-1))--(A[0]+u*(0,-1))--A[0]) cutbefore (BoiteRectangle shifted A[nbcase-1]) cutafter (BoiteRectangle shifted A[0]) withpen pencircle scaled 1.5; - for k=0 upto nbcase-1: - trace (BoiteRectangle shifted A[k]) withpen pencircle scaled 1.5; - endfor; - enddef; - - Compte(#1); - - if Rectangle: - BaseRectangle; - AfficheRectangle(#2); - else: - BaseRonde; - AfficheRonde(#2); - fi; - if Vide=false: - if Perso: - label(TEX("$"&Depart&"$"),A[0]); - else: - label(TEX("$"&decimal(Depart)&"$"),A[0]); - fi; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - boolean Vide,Rectangle,Perso;Vide=\useKV[RondeInfernale]{Vide};Rectangle=\useKV[RondeInfernale]{Rectangle};Perso=\useKV[RondeInfernale]{Perso};if Perso:string Depart;Depart=\useKV[RondeInfernale]{Cle};else:numeric Depart;Depart=\PfCRINombreCle;fi;numeric Rayon;Rayon=\useKV[RondeInfernale]{Rayon};}] - string Nombre[]; - - vardef Compte(text t)=%On compte le nb d'étapes et on retient les nombres - nbcase:=0; - for p_=t: - nbcase:=nbcase+1; - Nombre[nbcase]=p_; - endfor; - enddef; - - vardef AfficheRonde(text t)=%On fait l'affichage des opérations - n:=0; - for k=1 upto nbcase: - fill cercles(rotation(A[k],O,0.5*(360/nbcase)),5mm) withcolor white; - endfor; - for p_=t: - n:=n+1; - if p_="*": - label(LATEX("$\times"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - elseif p_="/": - label(LATEX("$\div"&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - else: - label(LATEX("$"&p_&Nombre[n]&"$"),rotation(A[nbcase-n],O,0.5*(360/nbcase))); - fi; - endfor; - enddef; - - vardef AfficheRectangle(text t)=%On fait l'affichage des opérations - n:=0; - for p_=t: - n:=n+1; - if n=nbcase: - if p_="*": - label.bot(LATEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - elseif p_="/": - label.bot(LATEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - else: - label.bot(LATEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[0]]+u*(0,-1)); - fi; - else: - if p_="*": - label.top(LATEX("$\times"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - elseif p_="/": - label.top(LATEX("$\div"&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - else: - label.top(LATEX("$"&p_&Nombre[n]&"$"),1/2[A[n-1],A[n]]); - fi; - fi; - endfor; - enddef; - - vardef BaseRonde= - pair O,A[]; - O=(0,0); - path cc; - cc=cercles(O,Rayon); - A[0]=pointarc(cc,0); - A[nbcase+1]=A[0]; - for k=1 upto nbcase: - A[k]=rotation(A[0],O,k*(360/nbcase)); - endfor; - for k=0 upto nbcase: - drawarrow reverse(arccercle(A[k],A[k+1],O) cutbefore cercles(A[k],5mm) cutafter cercles(A[k+1],5mm)) withpen pencircle scaled 1.5; - endfor; - for k=0 upto nbcase: - fill cercles(A[k],5mm) withcolor white; - trace cercles(A[k],5mm) withpen pencircle scaled 1.5; - endfor; - enddef; - - vardef BoiteRectangle= - save $; - path $; - $=u*(0.9,-0.5){dir 0}..{dir 90}(u*(1,-0.4))--(u*(1,0.4)){dir 90}..{dir180}(u*(0.9,0.5))--u*(-0.9,0.5){dir 180}..{dir-90}(u*(-1,0.4))--(u*(-1,-0.4)){dir-90}..{dir0}(u*(-0.9,-0.5))--cycle; - $ - enddef; - - vardef BaseRectangle= - pair O,A[]; - O=(0,0); - A[0]=O; - for k=1 upto nbcase: - A[k]-A[k-1]=(Rayon+2cm,0); - endfor; - for k=0 upto nbcase-2: - drawarrow (A[k]--A[k+1]) cutbefore (BoiteRectangle shifted A[k]) cutafter (BoiteRectangle shifted A[k+1]) withpen pencircle scaled 1.5; - endfor; - drawarrow (A[nbcase-1]--(A[nbcase-1]+u*(0,-1))--(A[0]+u*(0,-1))--A[0]) cutbefore (BoiteRectangle shifted A[nbcase-1]) cutafter (BoiteRectangle shifted A[0]) withpen pencircle scaled 1.5; - for k=0 upto nbcase-1: - trace (BoiteRectangle shifted A[k]) withpen pencircle scaled 1.5; - endfor; - enddef; - - Compte(#1); - - if Rectangle: - BaseRectangle; - AfficheRectangle(#2); - else: - BaseRonde; - AfficheRonde(#2); - fi; - if Vide=false: - if Perso: - label(LATEX("$"&Depart&"$"),A[0]); - else: - label(LATEX("$"&decimal(Depart)&"$"),A[0]); - fi; - fi; - \end{mpost} - \fi -}% - - -%%% -% Message caché -%%% -\setKVdefault[Hidden]{TLargeur=5,THauteur=3,Solution=false,Hauteur=70pt,Largeur=120pt,Jeu=false,Solution} -\defKV[Hidden]{Plateau=\setKV[Hidden]{Jeu}\setKV[Hidden]{Solution=false}} - -\newlength\PfCHiddenHeight% -\newlength\PfCHiddenWidth% - -\NewDocumentCommand\MessageCache{o m m}{%1 options 2 questions/réponses 3 message - % on récupère les options - \useKVdefault[Hidden]% - \setKV[Hidden]{#1}% - % on définit les dimensions des cases - \setlength{\PfCHiddenHeight}{\useKV[Hidden]{Hauteur}+\tabcolsep}% - \setlength{\PfCHiddenWidth}{\useKV[Hidden]{Largeur}}% - % On récupère les questions - \setsepchar[*]{§*/}% - \readlist*\PfCHiddenQuestions{#2}% - \setsepchar{,} - \ifboolKV[Hidden]{Solution}{% - % On donne les questions et la phrase - \begin{center} - \begin{NiceTabular}{*{\useKV[Hidden]{TLargeur}}{m{\PfCHiddenWidth}}}%[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% - \rule{0pt}{\PfCHiddenHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Hidden]{TLargeur}}}\do{% - \Block[draw]{1-1}{\PfCHiddenQuestions[\fpeval{\useKV[Hidden]{THauteur}*(##1-1)+##2},1]}\xintifForLast{}{&} - }\\ - }% - \CodeAfter% - \StrGobbleLeft{#3}{0}[\PhraseCorrection]% - \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% - \xintFor* ##2 in{\xintSeq{1}{\fpeval{\useKV[Hidden]{TLargeur}-1}}}\do{% - \StrLeft{\PhraseCorrection}{1}[\LettreAAfficher]\StrGobbleLeft{\PhraseCorrection}{1}[\PhraseCorrection]% - \tikz{\node[anchor=south] at (\fpeval{##1+1}-|\fpeval{##2+1}) {\huge\bfseries\LettreAAfficher};}% - }% - }% - \end{NiceTabular} - \end{center} - }{% - % On donne le plateau des solutions - \begin{center} - \begin{NiceTabular}{*{\useKV[Hidden]{TLargeur}}{m{\PfCHiddenWidth}}}%[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\useKV[Hidden]{THauteur}}}\do{% - \rule{0pt}{\PfCHiddenHeight}\xintFor* ##2 in {\xintSeq{1}{\useKV[Hidden]{TLargeur}}}\do{% - \Block[draw]{1-1}{\PfCHiddenQuestions[\fpeval{\useKV[Hidden]{THauteur}*(##1-1)+##2},2]}\xintifForLast{}{&} - }\\ - }% - \end{NiceTabular} - \end{center} - } -}% - -%%% -% Puzzle Somme Pyramide -%%% -\setKVdefault[ClesPuzzleP]{Largeur=40pt,Etages=4,Graines=false,Solutions=false,Jeu,EnonceQuestion=false,NbLignes=7} -\defKV[ClesPuzzleP]{Graine=\setKV[ClesPuzzleP]{Graines}}% -\defKV[ClesPuzzleP]{Solution=\setKV[ClesPuzzleP]{Solutions}\setKV[ClesPuzzleP]{Jeu=false}}% -\defKV[ClesPuzzleP]{Questions=\setKV[ClesPuzzleP]{EnonceQuestion}\setKV[ClesPuzzleP]{Jeu=false}}% -\newcounter{PfCPuzzlePcpt} -\newcounter{PfCPuzzlePavcpt} -\newlength{\PfCPuzzleP} - -\NewDocumentCommand\PuzzlePyramideListeLettres{}{% - \setcounter{PfCPuzzlePcpt}{0}% - \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[1]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[2]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[3]}\Alph{PfCPuzzlePavcpt}, \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[4]}\Alph{PfCPuzzlePavcpt} et \setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[5]}\Alph{PfCPuzzlePavcpt}% -} - -\NewDocumentCommand\PuzzlePyramide{o m}{% - \useKVdefault[ClesPuzzleP]% - \setKV[ClesPuzzleP]{#1}% - \ifboolKV[ClesPuzzleP]{Graines}{\PfCGraineAlea{\useKV[ClesPuzzleP]{Graine}}}{}% - \setsepchar{§} - \readlist*\PfCPuzzlePQuestions{#2}% - \setsepchar{,} - \setlength{\PfCPuzzleP}{\useKV[ClesPuzzleP]{Largeur}}% - \xdef\PfCPuzzlePLettres{1}% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[ClesPuzzleP]{Etages}*(\useKV[ClesPuzzleP]{Etages}+1)/2}}}\do{% - \xdef\PfCPuzzlePLettres{\PfCPuzzlePLettres,##1}% - }% - \MelangeListe{\PfCPuzzlePLettres}{\fpeval{\useKV[ClesPuzzleP]{Etages}*(\useKV[ClesPuzzleP]{Etages}+1)/2}}% - \readlist*{\PfCPuzzlePCptLettre}{\faa}% - \xdef\PuzzlePyramideLettres{\PuzzlePyramideListeLettres}% - \setcounter{PfCPuzzlePcpt}{0}% - \ifboolKV[ClesPuzzleP]{Solutions}{% -% % Plateau de jeu - \begin{center} - \begin{NiceTabular}{*{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}{m{\PfCPuzzleP}}}%[hvlines] - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}}}}\do{% - \xintifForLast{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&}{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&&} - }\\% - \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% - \xintifForLast{\\}{&} - }% - }% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{##1}}\do{% - \xintifForFirst{}{&} - }\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-##1}}}\do{% - &\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}& - }% - \\ - \xintFor* ##3 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% - \xintFor* ##4 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% - \xintifForLast{\\}{&} - }% - }% - }% - \end{NiceTabular} - \end{center} - }{% - \ifboolKV[ClesPuzzleP]{EnonceQuestion}{% - % Plateau des questions - \setcounter{PfCPuzzlePcpt}{0}% - \begin{center} - \begin{NiceTabular}{*{10}{m{\PfCPuzzleP}}}%[hvlines] - \xintFor* ##3 in {\xintSeq{1}{\fpeval{ceil(\PfCPuzzlePQuestionslen/5)}}}\do{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \xintifForLast{% - \Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{% - \stepcounter{PfCPuzzlePcpt}% - \xintifboolexpr{\thePfCPuzzlePcpt>\PfCPuzzlePQuestionslen}{}{% - \xintFor* ##4 in{\xintSeq{1}{\PfCPuzzlePQuestionslen}}\do{% - \xintifboolexpr{\thePfCPuzzlePcpt==\PfCPuzzlePCptLettre[##4]}{\PfCPuzzlePQuestions[##4]}{}% - }% - }% - }&% - }{% - \Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{% - \stepcounter{PfCPuzzlePcpt}% - \xintifboolexpr{\thePfCPuzzlePcpt>\PfCPuzzlePQuestionslen}{}{% - \xintFor* ##4 in{\xintSeq{1}{\PfCPuzzlePQuestionslen}}\do{% - \xintifboolexpr{\thePfCPuzzlePcpt==\PfCPuzzlePCptLettre[##4]}{\PfCPuzzlePQuestions[##4]}{}% - }% - }% - }% - &&% - }% - }\\% - \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{10}}\do{% - \xintifForLast{\\}{&} - }% - }% - }% - \CodeAfter - \setcounter{PfCPuzzlePcpt}{0}% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{ceil(\PfCPuzzlePQuestionslen/5)}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{5}}\do{% - \tikz{\node[anchor={north west},xshift=1mm,yshift=-1mm] at (\fpeval{(##1-1)*\useKV[ClesPuzzleP]{NbLignes}+1}-|\fpeval{2*##2-1}) {\stepcounter{PfCPuzzlePcpt}\Large\bfseries\Alph{PfCPuzzlePcpt}};}% - \tikz{\node[anchor={south east},xshift=-2mm,yshift=-2mm,rectangle,draw] at (\fpeval{##1*\useKV[ClesPuzzleP]{NbLignes}}-|\fpeval{2*##2+1}) {\large\bfseries\hbox to 1.2\PfCPuzzleP{\rule{0pt}{1.8ex}}};}% - }% - }% - \end{NiceTabular} - \end{center}% - }{% - % Plateau de jeu - \begin{center} - \begin{NiceTabular}{*{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}{m{\PfCPuzzleP}}}%[hvlines] - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}}}}\do{% - \xintifForLast{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&}{\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{\stepcounter{PfCPuzzlePcpt}\setcounter{PfCPuzzlePavcpt}{\PfCPuzzlePCptLettre[\thePfCPuzzlePcpt]}{\Huge\Alph{PfCPuzzlePavcpt}}}&&} - }\\% - \xintFor* ##1 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% - \xintifForLast{\\}{&} - }% - }% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{##1}}\do{% - \xintifForFirst{}{&} - }\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}-##1}}}\do{% - &\Block[draw]{\useKV[ClesPuzzleP]{NbLignes}-2}{}& - }% - \\ - \xintFor* ##3 in {\xintSeq{2}{\useKV[ClesPuzzleP]{NbLignes}}}\do{% - \xintFor* ##4 in {\xintSeq{1}{\fpeval{\useKV[ClesPuzzleP]{Etages}*2}}}\do{% - \xintifForLast{\\}{&} - }% - }% - }% - \end{NiceTabular} - \end{center} - }% - }% -}% - -%%% -% Calisson -%%% -\setKVdefault[Calisson]{Taille=3,Solution=false,Rayon=5cm,Couleur=red}% - -\def\UpdatetoksCalissong#1\nil{\addtotok\tokcalissonlistetracesg{,"#1"}}% -\def\UpdatetoksCalissongDepart#1\nil{\addtotok\tokcalissonlistetracesg{"#1"}}% -\def\UpdatetoksCalissond#1\nil{\addtotok\tokcalissonlistetracesd{,"#1"}}% -\def\UpdatetoksCalissondDepart#1\nil{\addtotok\tokcalissonlistetracesd{"#1"}}% - -\newtoks\tokcalissonlistetracesg -\newtoks\tokcalissonlistetracesd - -\NewDocumentCommand\Calisson{o m}{% - \useKVdefault[Calisson]% - \setKV[Calisson]{#1}% - % Essai de cassage du code - \tokcalissonlistetracesg{}% - \tokcalissonlistetracesd{}% - %Partie Gauche -> ok - \StrLeft{0#2}{2}[\Depart]% - \StrGobbleLeft{0#2}{2}[\Reste]% - \expandafter\UpdatetoksCalissongDepart\Depart0\nil% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% - \StrLeft{0\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart\nil% - \StrGobbleLeft{0\Reste}{3}[\Reste]% - }% - \StrLeft{00\Reste}{3}[\Depart]% - \StrGobbleLeft{00\Reste}{3}[\Reste]% - \expandafter\UpdatetoksCalissong\Depart\nil% - % fin premiere ligne - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% - \StrLeft{\Reste}{2}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart0\nil% - \StrGobbleLeft{\Reste}{2}[\Reste]% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% - \StrLeft{\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart\nil% - \StrGobbleLeft{\Reste}{3}[\Reste]% - }% - \StrLeft{00\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart\nil% - \StrGobbleLeft{00\Reste}{3}[\Reste]% - }% - % fin des lignes intermédiaires - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% - \StrLeft{\Reste}{2}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart0\nil% - \StrGobbleLeft{\Reste}{2}[\Reste] - \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% - \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% - \StrLeft{\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissong\Depart\nil% - \StrGobbleLeft{\Reste}{3}[\Reste]% - }% - }% - }% - %Liste gauche : \the\tokcalissonlistetracesg% - % Partie droite - \StrLeft{0\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissondDepart\Depart\nil% - \StrGobbleLeft{0\Reste}{3}[\Reste]% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-2}}}\do{% - \StrLeft{0\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart\nil% - \StrGobbleLeft{0\Reste}{3}[\Reste]% - }% - \StrLeft{00\Reste}{3}[\Depart]% - \StrGobbleLeft{00\Reste}{3}[\Reste]% - \expandafter\UpdatetoksCalissond\Depart\nil% -% fin premiere ligne - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% - \StrLeft{\Reste}{1}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart00\nil% - \StrGobbleLeft{\Reste}{1}[\Reste]% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}-1}}}\do{% - \StrLeft{\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart\nil% - \StrGobbleLeft{\Reste}{3}[\Reste]% - }% - \StrLeft{00\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart\nil% - \StrGobbleLeft{00\Reste}{3}[\Reste]% - }% - %% fin des lignes intermédiaires - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Calisson]{Taille}}}}\do{% - \StrLeft{\Reste}{1}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart00\nil% - \StrGobbleLeft{\Reste}{1}[\Reste]% - \xintifboolexpr{##1>\fpeval{\useKV[Calisson]{Taille}-1}}{}{% - \xintFor* ##2 in {\xintSeq{\fpeval{\useKV[Calisson]{Taille}-##1}}{1}}\do{% - \StrLeft{\Reste}{3}[\Depart]% - \expandafter\UpdatetoksCalissond\Depart\nil% - \StrGobbleLeft{\Reste}{3}[\Reste]% - }% - }% - }% -% \par Liste droite :\the\tokcalissonlistetracesd - \BuildCalisson{\the\tokcalissonlistetracesg}{\the\tokcalissonlistetracesd}% -}% - -\NewDocumentCommand\BuildCalisson{m m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Solution; - Solution:=\useKV[Calisson]{Solution}; - - color CouleurSolution; - CouleurSolution:=\useKV[Calisson]{Couleur}; - - Rayon=\useKV[Calisson]{Rayon}; - Taille=\useKV[Calisson]{Taille}; - - pair A,B,C,D,E,F,O; - O=(0,0); - path cc; - cc=cercles(O,Rayon); - D=pointarc(cc,30); - E=pointarc(cc,90); - F=pointarc(cc,150); - A=pointarc(cc,210); - B=pointarc(cc,270); - C=pointarc(cc,330); - trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; - path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; - Gauche=F--A--B; - Droit=E--D--C; - Haut=F--E--D; - Bas=A--B--C; - TopGauche=E--F--A; - BasDroit=D--C--B; - for k=1 upto 2*Taille-1: - trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; - trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; - trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; - endfor; - - pair Hor,Ver,Horn; - Hor=(1/Taille)[E,F]; - Ver=rotation(Hor,E,60); - Horn=rotation(Hor,E,120); - - % On positionne les points - pair M[]; - n=0; - %Partie Gauche -> ok - for k=0 upto Taille-1: - for l=0 upto Taille: - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Hor-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - for k=Taille upto 2*Taille-1: - for l=0 upto (2*Taille-1-k): - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Hor-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - % Partie Droite -> ok - for k=1 upto Taille: - n:=n+1; - M[n]=E+k*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - for k=1 upto Taille-1: - for l=0 upto Taille: - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - for k=Taille upto 2*Taille-1: - for l=0 upto (2*Taille-1-k): - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - % - - string Retiens; - Retiens=""; - - pair Depla; - Depla:=Hor; - - vardef LesTracesg(text t)= - n:=0; - for p_=t: - n:=n+1; - for d=1 upto 3: - Retiens:=substring(d-1,d) of p_; - if d=1:Depla:=Hor - elseif d=2:Depla:=Ver - else : Depla:=Horn - fi; - if (Retiens="0") or (Retiens="f"): - elseif Retiens="t": - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; - elseif Retiens="s": - if Solution: - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; - fi; - fi; - endfor; - endfor; - enddef; - - vardef LesTracesd(text t)= - for p_=t: - n:=n+1; - for d=1 upto 3: - Retiens:=substring(d-1,d) of p_; - if d=1:Depla:=Horn - elseif d=2:Depla:=Ver - else : Depla:=Hor - fi; - if (Retiens="0") or (Retiens="f"): - elseif Retiens="t": - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; - elseif Retiens="s": - if Solution: - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; - fi; - fi; - endfor; - endfor; - enddef; - - LesTracesg(#1); - LesTracesd(#2); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={boolean Solution; Solution:=\useKV[Calisson]{Solution}; Rayon=\useKV[Calisson]{Rayon};Taille=\useKV[Calisson]{Taille};color CouleurSolution; CouleurSolution:=\useKV[Calisson]{Couleur};}] - pair A,B,C,D,E,F,O; - O=(0,0); - path cc; - cc=cercles(O,Rayon); - D=pointarc(cc,30); - E=pointarc(cc,90); - F=pointarc(cc,150); - A=pointarc(cc,210); - B=pointarc(cc,270); - C=pointarc(cc,330); - trace polygone(A,B,C,D,E,F) withpen pencircle scaled 2; - path Gauche,Droit,Haut,Bas,TopGauche,BasDroit; - Gauche=F--A--B; - Droit=E--D--C; - Haut=F--E--D; - Bas=A--B--C; - TopGauche=E--F--A; - BasDroit=D--C--B; - for k=1 upto 2*Taille-1: - trace (point(k*length Gauche/(2*Taille)) of Gauche)--(point(k*length Droit/(2*Taille)) of Droit) dashed evenly; - trace (point(k*length Haut/(2*Taille)) of Haut)--(point(k*length Bas/(2*Taille)) of Bas) dashed evenly; - trace (point(k*length TopGauche/(2*Taille)) of TopGauche)--(point(k*length BasDroit/(2*Taille)) of BasDroit) dashed evenly; - endfor; - - pair Hor,Ver,Horn; - Hor=(1/Taille)[E,F]; - Ver=rotation(Hor,E,60); - Horn=rotation(Hor,E,120); - - % On positionne les points - pair M[]; - n=0; - %Partie Gauche -> ok - for k=0 upto Taille-1: - for l=0 upto Taille: - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Hor-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - for k=Taille upto 2*Taille-1: - for l=0 upto (2*Taille-1-k): - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Hor-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - % Partie Droite -> ok - for k=1 upto Taille: - n:=n+1; - M[n]=E+k*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - for k=1 upto Taille-1: - for l=0 upto Taille: - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - for k=Taille upto 2*Taille-1: - for l=0 upto (2*Taille-1-k): - n:=n+1; - M[n]=E+k*(Ver-E)+l*(Horn-E); - %dotlabel.top(decimal(n),M[n]); - endfor; - endfor; - % - - string Retiens; - Retiens=""; - - pair Depla; - Depla:=Hor; - - vardef LesTracesg(text t)= - n:=0; - for p_=t: - n:=n+1; - for d=1 upto 3: - Retiens:=substring(d-1,d) of p_; - if d=1:Depla:=Hor - elseif d=2:Depla:=Ver - else : Depla:=Horn - fi; - if (Retiens="0") or (Retiens="f"): - elseif Retiens="t": - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; - elseif Retiens="s": - if Solution: - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; - fi; - fi; - endfor; - endfor; - enddef; - - vardef LesTracesd(text t)= - for p_=t: - n:=n+1; - for d=1 upto 3: - Retiens:=substring(d-1,d) of p_; - if d=1:Depla:=Horn - elseif d=2:Depla:=Ver - else : Depla:=Hor - fi; - if (Retiens="0") or (Retiens="f"): - elseif Retiens="t": - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2; - elseif Retiens="s": - if Solution: - trace (chemin(Depla,E) shifted (M[n]-E)) withpen pencircle scaled 2 withcolor CouleurSolution; - fi; - fi; - endfor; - endfor; - enddef; - - LesTracesg(#1); - LesTracesd(#2); - \end{mpost} - \fi -} - -%%% -% Tectonic -%%% -\setKVdefault[ClesTectonic]{CouleurCase=LightGray,TLargeur=5,THauteur=5,Solution=false,Largeur=25pt,CouleurSolution=black,Tailles=false,Aide=false}% -\defKV[ClesTectonic]{Taille=\setKV[ClesTectonic]{Tailles}}% -\defKV[ClesTectonic]{ListeNombres=\setKV[ClesTectonic]{Aide}}% - -\newlength\PfCTectonic - -\NewDocumentCommand\Tectonic{o m}{% - \useKVdefault[ClesTectonic]% - \setKV[ClesTectonic]{#1}% - \ifboolKV[ClesTectonic]{Tailles}{% - \setKV[ClesTectonic]{THauteur=\useKV[ClesTectonic]{Taille}}% - \setKV[ClesTectonic]{TLargeur=\useKV[ClesTectonic]{Taille}}% - }{}% - \setlength{\PfCTectonic}{\useKV[ClesTectonic]{Largeur}+\tabcolsep}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesTectonic{#2}% - \savecomparemode% - \comparestrict% - \begin{NiceTabular}{*{\useKV[ClesTectonic]{TLargeur}}{m{\useKV[ClesTectonic]{Largeur}}}}% - \CodeBefore% - \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesTectonic]{THauteur}}}}\do{% - \tikz\draw[gray] (##1-|1) -- (##1-|last);% - }% - \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesTectonic]{TLargeur}}}}\do{% - \tikz\draw[gray] (1-|##1) -- (last-|##1);% - }% - \Body% - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[ClesTectonic]{THauteur}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesTectonic]{TLargeur}}}\do{% - \rule{0pt}{\PfCTectonic}% - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{b}[\PfCTestb]%\PfCTestb - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{l}[\PfCTestl]%\PfCTestr - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},1]}{lb}[\PfCTestlb]%\PfCTestbr - \xintifboolexpr{\PfCTestb==0}{% - \Block[borders={bottom},line-width=2pt]{1-1}{% - \ifboolKV[ClesTectonic]{Solution}{% - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] - \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{}% - \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% - }{% - \ifboolKV[ClesTectonic]{Aide}{% - \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \xintifboolexpr{\PfCTestl==0}{% - \Block[borders={left},line-width=2pt]{1-1}{\ifboolKV[ClesTectonic]{Solution}{% - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] - \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{}% - \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% - \ifboolKV[ClesTectonic]{Aide}{% - \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \xintifboolexpr{\PfCTestlb==0}{% - \Block[borders={bottom,left},line-width=2pt]{1-1}{\ifboolKV[ClesTectonic]{Solution}{% - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] - \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{} - \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% - \ifboolKV[ClesTectonic]{Aide}{% - \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \Block{1-1}{\ifboolKV[ClesTectonic]{Solution}{% - \StrCompare{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},2]}{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}[\PfCTestMeme] - \xintifboolexpr{\PfCTestMeme>0}{\color{\useKV[ClesTectonic]{CouleurSolution}}}{} - \Large\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]}{% - \ifboolKV[ClesTectonic]{Aide}{% - \xintifboolexpr{\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]==\useKV[ClesTectonic]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*##1+##2},3]% - }{}% - }{}% - }% - }% - }% - }% - }% - \xintifForLast{\\}{&}% - }% - }% - \CodeAfter% - \tikz\draw[line width=2pt] (1-|1) rectangle (last-|last);% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesTectonic]{THauteur}}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesTectonic]{TLargeur}}}\do{% - \ifboolKV[ClesTectonic]{Solution}{% - %\tikz\node[fill=white] at (\fpeval{##1+0.5} -|\fpeval{##2+0.5}) {\Large$\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*(##1-1)+##2},2]$};% - }{% - \tikz\node at (\fpeval{##1+0.5} -|\fpeval{##2+0.5}) {\Large$\ListeCasesTectonic[\fpeval{\useKV[ClesTectonic]{TLargeur}*(##1-1)+##2},2]$};% - }% - }% - }% - \end{NiceTabular}% - \restorecomparemode% -}% - -%%% -% Enigme Aire -%%% -\setKVdefault[EnigmeAire]{Modele=A,Couleur=LightSteelBlue,Echelle=7mm,Etape=1,Solution=false,Graines=false} -\defKV[EnigmeAire]{Graine=\setKV[EnigmeAire]{Graines}} - -\def\MPEnigmeAireA{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - - pair A[],B[]; - numeric la[]; - la1=ceiling(3+uniformdeviate(7)); - la2=ceiling(3+uniformdeviate(7)); - la3=ceiling(3+uniformdeviate(7)); - la4=ceiling(4+uniformdeviate(6)); - A1=u*(1,1); - A2-A1=u*(10,0); - A3-A2=u*(0,5); - A4-A3=A1-A2; - B1=(la1/(la1+la2+la3))[A1,A2]; - B2=((la1+la2)/(la1+la2+la3))[A1,A2]; - B3-B2=A4-A1; - B4-B1=B3-B2; - fill polygone(B1,B2,B3,B4) withcolor \useKV[EnigmeAire]{Couleur}; - trace polygone(B1,B2,B3,B4); - trace polygone(A1,A2,A3,A4); - label(TEX("\Aire[m]{"&decimal(la1*la4)&"}"),iso(A1,B4)); - if Solution: - label(TEX(decimal(la2*la4)&"\,\si{\square\meter}"),iso(B1,B3)); - else: - label(TEX("?\,\si{\square\meter}"),iso(B1,B3)); - fi; - - label(TEX("\Aire[m]{"&decimal(la3*la4)&"}"),iso(B2,A3)); - trace cotation(A4,B3,3mm,3mm,TEX("\Lg[m]{"&decimal(la1+la2)&"}")); - trace cotation(B1,A2,-3mm,-3mm,TEX("\Lg[m]{"&decimal(la3+la2)&"}")); - \end{mplibcode} - \fi -} - -\def\MPEnigmeAireB{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - pair A[],B[]; - numeric La[],la[],Ca[]; - la1=ceiling(3+uniformdeviate(7)); - la2=ceiling(3+uniformdeviate(7)); - La1=ceiling(8+uniformdeviate(7)); - La2=ceiling(uniformdeviate(5)); - Ca1=1+ceiling(uniformdeviate(La1-La2-2)); - Ca2=ceiling(uniformdeviate(la2-2)); - A1=u*(1,1); - A2-A1=u*(10,0); - A3-A2=u*(0,2); - A4-A3=u*(-7,0); - A5-A4=u*(0,4); - A6-A5=(xpart(A1-A4),0); - A7-A6=A4-A5; - B1=(Ca1/(La1-La2))[A4,A3]; - B3=((Ca2+1)/la2)[A4,A5]; - B2-B1=B3-A4; - fill polygone(A4,B1,B2,B3) withcolor \useKV[EnigmeAire]{Couleur}; - trace chemin(B1,B2,B3); - trace polygone(A1,A2,A3,A4,A5,A6); - trace chemin(A7,A4); - label(TEX("\Aire[m]{"&decimal(la1*La1)&"}"),iso(A1,A3)); - if Solution: - label(TEX(decimal(Ca1*Ca2)&"\,\si{\square\meter}"),iso(B1,B3)); - else: - label(TEX("?\,\si{\square\meter}"),iso(B1,B3)); - fi; - - label(TEX("\Aire[m]{"&decimal(la2*La2)&"}"),iso(A7,A5)); - trace appelation(A6,A5,3mm,TEX("\Lg[m]{"&decimal(La2)&"}")); - trace appelation(B1,A3,3mm,TEX("\Lg[m]{"&decimal(La1-La2-Ca1)&"}")); - label.rt(TEX("\Lg[m]{"&decimal(la2-Ca2)&"}"),iso(A5,B3)); - label.rt(TEX("\Lg[m]{"&decimal(la1)&"}"),iso(A2,A3)); - \end{mplibcode} - \fi -} - -\def\MPEnigmeAireC{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - pair A[]; - numeric la[],La[]; - La1=ceiling(3+uniformdeviate(7)); - La2=ceiling(3+uniformdeviate(7)); - La3=ceiling(3+uniformdeviate(7)); - la1=ceiling(3+uniformdeviate(7)); - la2=ceiling(3+uniformdeviate(7)); - la3=ceiling(3+uniformdeviate(7)); - A1=u*(1,1); - A4-A1=if La1+La2+La3>la1+la2+la3: - u*(10,0) - else: - u*(8,0); - fi; - A2=(La1/(La1+La2+La3))[A1,A4]; - A3=((La1+La2)/(La1+La2+La3))[A1,A4]; - A5-A4=if La1+La2+La3>la1+la2+la3: - u*(0,7) - else: - u*(0,10); - fi; - A6-A5=A3-A4; - A7-A3=((la1+la2)/(la1+la2+la3))[A4,A5]-A4; - A8-A7=A2-A3; - A9-A2=(la1/(la1+la2+la3))[A4,A5]-A4; - A10-A9=A1-A2; - trace polygone(A1,A4,A5,A6,A7,A8,A9,A10); - trace segment(A2,A9); - trace segment(A3,A7); - label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A1,A9)); - label(TEX("\Aire[cm]{"&decimal((la1+la2)*La2)&"}"),iso(A2,A7)); - label(TEX("\Aire[cm]{"&decimal((la1+la2+la3)*La3)&"}"),iso(A3,A5)); - trace cotation(A1,A4,-3mm,-3mm,TEX("\Lg[cm]{"&decimal(La1+La2+La3)&"}")); - label.lft(TEX("\Lg{"&decimal(la1)&"}"),iso(A1,A10)); - label.lft(TEX("\Lg{"&decimal(la2)&"}"),iso(A9,A8)); - if Solution: - label.lft(TEX(decimal(la3)&"\,\si{\centi\meter}"),iso(A7,A6)); - else: - label.lft(TEX("?\,\si{\centi\meter}"),iso(A7,A6)); - fi; - \end{mplibcode} - \fi -} - -\def\MPEnigmeAireD{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - Etape:=\useKV[EnigmeAire]{Etape}; - pair A[]; - numeric la[],La[]; - la[1]=ceiling(3+uniformdeviate(7)); - la[2]=ceiling(3+uniformdeviate(7)); - k=1; - La[k]=ceiling(3+uniformdeviate(7)); - A[1]=u*(9,-9); - A[6*(k-1)+2]-A[6*(k-1)+1]=u*(0,3); - A[6*(k-1)+3]-A[6*(k-1)+2]=u*(-6,0); - A[6*(k-1)+4]-A[6*(k-1)+3]=A[6*(k-1)+1]-A[6*(k-1)+2]; - A[6*(k-1)+5]=(la[k]/(la[k]+la[k+1]))[A[6*(k-1)+1],A[6*(k-1)+4]]; - A[6*(k-1)+6]-A[6*(k-1)+5]=A[6*(k-1)+2]-A[6*(k-1)+1]; - trace polygone(A[6*(k-1)+1],A[6*(k-1)+2],A[6*(k-1)+3],A[6*(k-1)+4]); - trace segment(A[6*(k-1)+5],A[6*(k-1)+6]); - if Solution: - trace cotation(A[6*(k-1)+5],A[6*(k-1)+1],-3mm,-3mm,TEX("\Lg{"&decimal(la[k])&"}")); - else: - trace cotation(A[6*(k-1)+5],A[6*(k-1)+1],-3mm,-3mm,TEX("?\,\si{\centi\meter}")); - fi; - label(TEX("\Aire{"&decimal(la[k]*La[k])&"}"),iso(A[6*(k-1)+5],A[6*(k-1)+2])); - label(TEX("\Aire{"&decimal(la[k+1]*La[k])&"}"),iso(A[6*(k-1)+4],A[6*(k-1)+6])); - if Etape<2: - trace cotation(A[6*(k-1)+3],A[6*(k-1)+6],3mm,3mm,TEX("\Lg{"&decimal(la[k+1])&"}")); - fi; - for k=2 upto Etape: - La[k]=ceiling(3+uniformdeviate(7)); - la[k+1]=ceiling(3+uniformdeviate(7)); - A[6*(k-1)+1]=A[6*(k-1)]; - A[6*(k-1)+2]-A[6*(k-1)+1]=u*(0,3); - A[6*(k-1)+3]-A[6*(k-1)+2]=u*(-6,0); - A[6*(k-1)+4]-A[6*(k-1)+3]=A[6*(k-1)+1]-A[6*(k-1)+2]; - A[6*(k-1)+5]=A[6*(k-1)-3];%(la[k]/(la[k]+la[k+1]))[A[6*(k-1)+1],A[6*(k-1)+4]]; - A[6*(k-1)+6]-A[6*(k-1)+5]=A[6*(k-1)+2]-A[6*(k-1)+1]; - trace polygone(A[6*(k-1)+1],A[6*(k-1)+2],A[6*(k-1)+3],A[6*(k-1)+4]); - trace segment(A[6*(k-1)+5],A[6*(k-1)+6]); - if k=Etape: - trace cotation(A[6*(k-1)+3],A[6*(k-1)+6],3mm,3mm,TEX("\Lg{"&decimal(la[k+1])&"}")); - fi; - label(TEX("\Aire[cm]{"&decimal(la[k]*La[k])&"}"),iso(A[6*(k-1)+6],A[6*(k-1)])); - label(TEX("\Aire[cm]{"&decimal(la[k+1]*La[k])&"}"),iso(A[6*(k-1)+4],A[6*(k-1)+6])); - endfor; - \end{mplibcode} - \fi -} - -\def\MPEnigmeAireE{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - pair A[]; - numeric la[],La[]; - La1=ceiling(3+uniformdeviate(7)); - La2=ceiling(3+uniformdeviate(7)); - La3=ceiling(3+uniformdeviate(7)); - la1=ceiling(4+uniformdeviate(5)); - la2=ceiling(4+uniformdeviate(5)); - la3=la1+la2+2; - A1=u*(7,1); - A11-A1=if la3>(La1+La2+La3):u*(0,10) else:u*(0,7) fi; - A2=(La1/(La1+La2+La3))[A1,A11]; - A3=((La1+La2)/(La1+La2+La3))[A1,A11]; - A8-A2=if la3>(La1+La2+La3):u*(-7,0) else:u*(-10,0) fi; - A6-A8=A11-A2; - A7-A8=A3-A2; - A4=(la2/la3)[A7,A3]; - A5-A4=A6-A7; - A9=(la1/la3)[A2,A8]; - A10-A9=A1-A2; - trace polygone(A1,A3,A4,A5,A6,A8,A9,A10); - trace segment(A7,A4); - trace segment(A2,A9); - label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A1,A9)); - label(TEX("\Aire[cm]{"&decimal(la3*La2)&"}"),iso(A2,A7)); - label(TEX("\Aire[cm]{"&decimal(la2*La3)&"}"),iso(A4,A6)); - trace cotationarc(A5,A4,5mm,4,1,TEX("\Lg[cm]{"&decimal(La3)&"}") rotated 90); - trace cotationarc(A9,A8,3mm,4,1,TEX("\Lg[cm]{"&decimal(la3-la1)&"}") rotated 180); - trace cotationarc(A4,A3,3mm,4,1,TEX("\Lg[cm]{"&decimal(la3-la2)&"}")); - if Solution: - trace cotationarc(A3,A1,5mm,3,1,TEX("\Lg{"&decimal(La1+La2)&"}") rotated 90); - else: - trace cotationarc(A3,A1,5mm,3,1,TEX("?") rotated 90); - fi; - \end{mplibcode} - \fi -} - -\def\MPEnigmeAireF{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Graines,Solution; - Graines:=\useKV[EnigmeAire]{Graines}; - Solution:=\useKV[EnigmeAire]{Solution}; - - if Graines: - randomseed:=\useKV[EnigmeAire]{Graine}; - fi; - - u:=\useKV[EnigmeAire]{Echelle}; - pair A[]; - numeric la[],La[]; - la1=ceiling(2+uniformdeviate(4)); - la2=ceiling(2+uniformdeviate(4)); - la3=ceiling(2+uniformdeviate(4)); - la4=ceiling(2+uniformdeviate(4)); - La1=ceiling(8+uniformdeviate(4)); - La2=ceiling(8+uniformdeviate(4)); - La3=ceiling(8+uniformdeviate(4)); - La4=ceiling(8+uniformdeviate(4)); - A1=(0,0); - A2-A1=u*(0,-3.5); - A3-A2=u*(2.25,0); - A4-A1=A3-A2; - A5-A1=u*(6,0); - A6-A5=u*(0,2.5); - A7-A6=A1-A5; - A8-A7=u*(0,2); - A9-A8=u*(-2,0); - A10-A9=A1-A8; - A11-A1=u*(-4.5,0); - A12-A11=u*(0,-1.5); - A13-A12=A1-A11; - fill polygone(A1,A5,A6,A7) withcolor \useKV[EnigmeAire]{Couleur}; - trace polygone(A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13); - trace segment(A7,A13); - trace segment(A10,A4); - if Solution: - label(TEX("\Aire{"&decimal(la2*La2)&"}"),iso(A1,A6)); - else: - label(TEX("?\,\si{\square\centi\meter}"),iso(A1,A6)); - fi; - label(TEX("\Aire[cm]{"&decimal(la1*La1)&"}"),iso(A2,A4)); - label(TEX("\Aire[cm]{"&decimal(la3*La3)&"}"),iso(A10,A8)); - label(TEX("\Aire[cm]{"&decimal(la4*La4)&"}"),iso(A12,A1)); - trace cotationarc(A12,A11,5mm,4,1,TEX("\Lg[cm]{"&decimal(la4)&"}") rotated -90); - trace cotationarc(A5,A4,5mm,4,1,TEX("\Lg[cm]{"&decimal(La2-la1)&"}") rotated 180); - trace cotationarc(A8,A7,5mm,4,1,TEX("\Lg[cm]{"&decimal(La3-la2)&"}") rotated 90); - trace cotationarc(A11,A10,3mm,4,1,TEX("\Lg[cm]{"&decimal(La4-la3)&"}")); - trace cotationarc(A2,A13,5mm,3,1,TEX("\Lg[cm]{"&decimal(La1-la4)&"}") rotated -90); - \end{mplibcode} - \fi -} - -\NewDocumentCommand\EnigmeAire{o}{% - \useKVdefault[EnigmeAire]% - \setKV[EnigmeAire]{#1}% - \IfStrEqCase{\useKV[EnigmeAire]{Modele}}{% - {A}{\MPEnigmeAireA} - {B}{\MPEnigmeAireB} - {C}{\MPEnigmeAireC} - {D}{\MPEnigmeAireD} - {E}{\MPEnigmeAireE} - {F}{\MPEnigmeAireF} - }% -}% - -%%% -% Barres de calculs -%%% -\setKVdefault[SuiteBarre]{Litteral=false,Perso=false,Decimaux=false} - -\NewDocumentCommand\BarresCalculs{o m m}{% - \useKVdefault[SuiteBarre]% - \setKV[SuiteBarre]{#1}% - \xdef\PfCListeCalculsBarre{}% - \xdef\PfCListeResultatsBarre{}% - \ignoreemptyitems% - \ifboolKV[SuiteBarre]{Perso}{% - \setsepchar[*]{,*§}% - \readlist*\PfCListeBarresCalculs{#2}% - \foreachitem\compteur\in\PfCListeBarresCalculs{% - \StrChar{#3}{\compteurcnt}[\PfCLettreB]% - \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% - \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% - }% - \setsepchar{,}% - \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% - \begin{NiceTabular}{ccc}[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% - \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\ifboolKV[SuiteBarre]{Decimaux}{% - \num{\fpeval{\PfCListeBarresCalculs[\fpeval{##1-1},1]}}% - }{% - \begin{CAS} - c = \PfCListeBarresCalculs[\fpeval{##1-1},1] - \end{CAS}$\print{c:autosimplify()}$}% - }}&\Block{2-1}{\PfCListeResultats[##1]}&\Block{2-1}{$\PfCListeBarresCalculs[##1,2]$}\\ - &&\\ - }% - \end{NiceTabular} - }{% - \setsepchar{,}%\ignoreemptyitems% - \readlist*\PfCListeBarresCalculs{#2}% - \ifboolKV[SuiteBarre]{Litteral}{% - \foreachitem\compteur\in\PfCListeBarresCalculs{% - \StrChar{#3}{\compteurcnt}[\PfCLettreB]% - \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% - \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \PfCLettreC,}% - }% - \setsepchar[*]{,*/}% - \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% - \setsepchar{,}% - \readlist*\PfCListeCalculs{#2}% - \begin{NiceTabular}{ccc}[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% - \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{$\print{c:expand():topolynomial()}$}}&\Block{2-1}{\PfCListeResultats[##1,1]}&\Block{2-1}{\begin{CAS} - vars('x') - c = \PfCListeCalculs[##1] - \end{CAS}$\print{c}$}\\ - &&\\ - }% - \end{NiceTabular} - }{% - \foreachitem\compteur\in\PfCListeBarresCalculs{% - \StrChar{#3}{\compteurcnt}[\PfCLettreB]% - \StrSubstitute[0]{\PfCLettreB}{*}{Départ}[\PfCLettreC]% - \xdef\PfCListeResultatsBarre{\PfCListeResultatsBarre \num{\fpeval{\compteur}}/\PfCLettreC,}% - \StrSubstitute[0]{\compteur}{*}{\times}[\PfCListeResultatEtapeA]% - \StrSubstitute[0]{\PfCListeResultatEtapeA}{/}{\div}[\PfCListeResultatEtapeB]% - \StrSubstitute[0]{\PfCListeResultatEtapeB}{(}{\left(}[\PfCListeResultatEtapeC]% - \StrSubstitute[0]{\PfCListeResultatEtapeC}{)}{\right)}[\PfCListeResultatEtapeD]% - \xdef\PfCListeCalculsBarre{\PfCListeCalculsBarre $\PfCListeResultatEtapeD$,}% - }% - \setsepchar[*]{,*/}% - \readlist*\PfCListeResultats{\PfCListeResultatsBarre}% - \setsepchar{,}% - \readlist*\PfCListeCalculs{\PfCListeCalculsBarre}% - \begin{NiceTabular}{ccc}[hvlines] - \xintFor* ##1 in{\xintSeq{1}{\PfCListeResultatslen}}\do{% - \xintifForFirst{\Block{2-1}{}}{\Block{2-1}{\PfCListeResultats[\fpeval{##1-1},1]}}&\Block{2-1}{\PfCListeResultats[##1,2]}&\Block{2-1}{\PfCListeCalculs[##1]}\\ - &&\\ - }% - \end{NiceTabular} - }% - }% - \reademptyitems% -}% - -%%% -% Solide et sections -%%% -\setKVdefault[ClesSolides]{Nom=cube,Aretes,Sommets,Pointilles,Largeur=1.5,Hauteur=1,Profondeur=0.75,ListeSommets={A,B,C,D,E,F,G,H},Rho=1500,Phi=30,Theta=20,Distance=50,Code=false,Couleur=white,Anglex=0,RayonCone=1,HauteurCone=2,HauteurPyramide=2,SommetsPyramide=5,Reguliere=false,DecalageSommet={(0,0,0)},RayonCylindre=1,HauteurCylindre=2,RayonSphere=1,AutoLabel=true,Sections=false,CoefSection=0.3,Axes=false,PointsSection={M,N,O,P},RemplisSection=false,ObjetSection={0.5,E,H,0.25,F,G,G,B}}% -\defKV[ClesSolides]{Traces=\setKV[ClesSolides]{Code}}% -\defKV[ClesSolides]{Section=\setKV[ClesSolides]{Sections}}% -\defKV[ClesSolides]{CouleurSection=\setKV[ClesSolides]{RemplisSection}}% - -\newcommand\MPSolideCylindre[3]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCSolid; - - boolean NommeSommets,Code,Sections,Axes,RemplisSection; - NommeSommets=\useKV[ClesSolides]{Sommets}; - Code=\useKV[ClesSolides]{Code}; - Sections:=\useKV[ClesSolides]{Sections}; - Axes:=\useKV[ClesSolides]{Axes}; - RemplisSection=\useKV[ClesSolides]{RemplisSection}; - if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; - %Initialisation - PfCRho=\useKV[ClesSolides]{Rho}; - PfCPhi=\useKV[ClesSolides]{Phi}; - PfCTheta=\useKV[ClesSolides]{Theta}; - PfCDistance=\useKV[ClesSolides]{Distance}; - CoefSection=\useKV[ClesSolides]{CoefSection}; - anglerotationx=\useKV[ClesSolides]{Anglex}; - rayoncylindre=\useKV[ClesSolides]{RayonCylindre}; - hauteurcylindre=\useKV[ClesSolides]{HauteurCylindre}; - - string Section; - if Sections:Section=\useKV[ClesSolides]{Section};fi; - - color PfCOutColor; - PfCOutColor=\useKV[ClesSolides]{Couleur}; - - vardef BaseCylindre(text t)= - save Cer; - picture Cer; - save n; - n:=0; - for p_=t: - if color p_: - n:=n+1; - _T[n]:=p_; - fi; - endfor; - pascercle:=5; - color ptcer[]; - for k=0 step pascercle until (360+pascercle) : - ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); - endfor; - % - color ddcer,cccer; - nbpointilles:=0; - nbtraces:=0; - path PathSection[]; - nbpathsection:=0; - Cer=image(% - for k=0 step pascercle until 360: - ddcer:=Oeil-ptcer[k div pascercle]; - cccer:=-Normal(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); - if (ProduitScalaire(ddcer,cccer)>=0): - nbtraces:=nbtraces+1; - if (nbtraces=1) and (nbpointilles>0): - draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); - fi; - nbpathsection:=nbpathsection+1; - PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); - else: - nbpointilles:=nbpointilles+1; - nbtraces:=0; - if (nbpointilles=1): - draw chemin(ptcer[k div pascercle],ptcer[k div pascercle]+Sommet1-Sommet2); - fi; - if k mod (2*pascercle)=0: - nbpathsection:=nbpathsection+1; - PathSection[nbpathsection]=chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - draw chemin(ptcer[k div pascercle]+Sommet1-Sommet2,ptcer[(k+pascercle) div pascercle]+Sommet1-Sommet2); - fi; - fi; - endfor; - ); - Cer - enddef; - - Figure(-10u,-10u,10u,10u); - Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); -% Initialisation(1500,30,20,50); - typetrace:="3D"; - typerepre:="persp"; - eclairage:=false; - nb:=36;%36 - subh:=1;% - incolor:=white; - outcolor:=PfCOutColor; - Ferme1:=true; - angx:=anglerotationx; - Objetcylindre1("r="&decimal(rayoncylindre),"h="&decimal(hauteurcylindre)); - eclairage:=false; -% traits:=false; -% AffichageObjet1; - - color O,S,A,M,B,C,D,Sommet[]; - Sommet2=(0,0,0); - Sommet1-Sommet2=(0,0,hauteurcylindre); - Sommet3-Sommet2=rayoncylindre*(cosd(0),-sind(0),0); - Sommet4-Sommet2=rayoncylindre*(cosd(90),-sind(90),0); - color MSection[]; - MSection[1]-Sommet2=rayoncylindre*(CoefSection,sin(arccos(CoefSection)),0); - MSection[7]-Sommet2=rayoncylindre*(CoefSection+0.01,sin(arccos(CoefSection+0.01)),0); - MSection[2]-Sommet2=rayoncylindre*(CoefSection,-sin(arccos(CoefSection)),0); - MSection[3]-MSection[2]=Sommet1-Sommet2; - MSection[4]-MSection[1]=Sommet1-Sommet2; - MSection[5]-Sommet2=CoefSection[Sommet1,Sommet2]; - MSection[6]-MSection[5]=MSection[2]-MSection[1]; - Sommet1:=RotXYZ(Sommet1); - Sommet2:=RotXYZ(Sommet2); - Sommet3:=RotXYZ(Sommet3); - Sommet4:=RotXYZ(Sommet4); - MSection[1]:=RotXYZ(MSection[1]); - MSection[2]:=RotXYZ(MSection[2]); - MSection[3]:=RotXYZ(MSection[3]); - MSection[4]:=RotXYZ(MSection[4]); - MSection[5]:=RotXYZ(MSection[5]); - MSection[6]:=RotXYZ(MSection[6]); - MSection[7]:=RotXYZ(MSection[7]); - - trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); - currentpicture:=nullpicture; - - if Sections: - if Section="parallele": - if RemplisSection: - fill polygone(MSection[1],MSection[2],MSection[3],MSection[4]) withcolor CouleurSection; - fi; - color dcer,ccer; - invnormale:=if CoefSection<=0:-1 else:1 fi; - %1er côté et 3eme côté : face "basse" et face "haute" - dcer:=Oeil-Sommet3; - ccer:=-Normal(Sommet3,MSection1,MSection2); - draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; - % 2eme côté et 4eme coté - dcer:=Oeil-MSection7; - ccer:=-Normal(MSection7,MSection4,MSection1); - draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)>0):dashed evenly fi; - else: - if RemplisSection: - fill (PathSection[1] for p_=2 upto nbpathsection:--PathSection[p_] endfor--cycle) shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2)) withcolor CouleurSection; - fi; - for p_=1 upto nbpathsection: - draw (PathSection[p_] shifted(Projette(CoefSection[Sommet1,Sommet2]-Sommet2))); - endfor; - fi; - fi; - - trace BaseCylindre(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); - - color dcer,ccer; - dcer:=Oeil-Sommet2; - ccer:=Normal(Sommet2,Sommet3,Sommet4); - if (ProduitScalaire(dcer,ccer)>=0): - draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); - fi; - dcer:=Oeil-Sommet1; - ccer:=Normal(Sommet1,Sommet4+Sommet1-Sommet2,Sommet3+Sommet1-Sommet2); - if (ProduitScalaire(dcer,ccer)>=0): - draw Cercles(Sommet1,Sommet3+Sommet1-Sommet2,Sommet1,Sommet3+Sommet1-Sommet2,Sommet4+Sommet1-Sommet2); - fi; - - vardef EcrireSommets(text t)= - nb:=0; - for p_=t: - nb:=nb+1; - if bluepart(Sommet1)>bluepart(Sommet2): - if nb=1: - label.ulft(TEX(p_),Projette(Sommet1));%p_ - elseif nb=2: - dotlabel.rt(TEX(p_),Projette(Sommet2));%p_ - fi; - else: - if nb=1: - label.bot(TEX(p_),Projette(Sommet1)); - elseif nb=2: - dotlabel.ulft(TEX(p_),Projette(Sommet2)); - fi; - fi; - endfor; - enddef; - - DefinirSommets(#1); - DefinirSommetsSection(#3); - - if Axes: - draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); - remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); - remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); - fi; - - if Code: - \useKV[ClesSolides]{Traces}; - fi; - - \end{mplibcode} - \fi -} - -\newcommand\MPSolidePyramide[4]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - - input PfCSolid; - - boolean Pointilles,TraceArete,NommeSommets,Code,Reguliere,AutoLabel,Sections,RemplisSection; - Sections:=\useKV[ClesSolides]{Sections}; - RemplisSection=\useKV[ClesSolides]{RemplisSection}; - if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; - AutoLabel:=\useKV[ClesSolides]{AutoLabel}; - Pointilles=\useKV[ClesSolides]{Pointilles}; - TraceArete=\useKV[ClesSolides]{Aretes}; - NommeSommets=\useKV[ClesSolides]{Sommets}; - Code=\useKV[ClesSolides]{Code}; - Reguliere:=\useKV[ClesSolides]{Reguliere}; - % Initialisation - PfCRho=\useKV[ClesSolides]{Rho}; - PfCPhi=\useKV[ClesSolides]{Phi}; - PfCTheta=\useKV[ClesSolides]{Theta}; - PfCDistance=\useKV[ClesSolides]{Distance}; - CoefSection=\useKV[ClesSolides]{CoefSection}; - anglerotationx=\useKV[ClesSolides]{Anglex}; - hauteurpyramide=\useKV[ClesSolides]{HauteurPyramide}; - nombresommets=\useKV[ClesSolides]{SommetsPyramide}; - color PfCOutColor,DecalageSommet; - PfCOutColor=\useKV[ClesSolides]{Couleur}; - DecalageSommet=if Reguliere:(0,0,0) else: #3 fi; - - Figure(-10u,-10u,10u,10u); - Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); - typetrace:="3D"; - typerepre:="persp"; - if Pointilles=false: - pointilles:="non"; - fi; - - Ferme1:=true; - - color O,A[],S; - O=(0,0,0); - S-O=(0,0,hauteurpyramide)+DecalageSommet; - - NbS:=nombresommets; - Sommet1:=S; - ecartangle=360/(NbS-1); - for k=2 upto NbS: - if Reguliere: - repereangle:=(k-2)*ecartangle; - else: - repereangle:=(k-2)*ecartangle+(ecartangle*0.25+uniformdeviate(floor(ecartangle/2))); - fi; - Sommet[k]:=(cosd(repereangle),-sind(repereangle),0); - endfor; - Sommet[NbS+1]:=Sommet[2]; - - color TS[]; - for k=1 upto (NbS+1): - TS[k]=Sommet[k]; - endfor; - color PiedHauteur; - PiedHauteur=ProjectionsurPlan(Sommet1,Sommet2,Sommet3,Sommet4); - eclairage:=false; - traits:=false; - outcolor:=PfCOutColor; - angx:=anglerotationx; - for k=1 upto (NbS+1): - TS[k]:=RotXYZ(TS[k]); - endfor; - angx:=0; - - color MSection[]; - for p_=2 upto NbS: - MSection[p_-1]=CoefSection[Sommet[1],Sommet[p_]]; - endfor; - - DefinirSommetsSection(#4); - - vardef SectionPyramide(expr fracsection)= - save Section; - picture Section; - Section=image(% - if RemplisSection: - remplis polygone(fracsection[Sommet1,Sommet2],for p_=3 upto NbS-1:fracsection[Sommet1,Sommet[p_]],endfor fracsection[Sommet1,Sommet[NbS]]) withcolor CouleurSection; - fi; - color dcer,ccer; - for p_=2 upto NbS: - dcer:=Oeil-Sommet[p_]; - ccer:=-Normal(Sommet1,Sommet[p_],Sommet[p_+1]); - if (ProduitScalaire(dcer,ccer)>=0): - draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]); - else: - draw chemin(fracsection[Sommet1,Sommet[p_]],fracsection[Sommet1,Sommet[p_+1]]) dashed evenly; - fi; - endfor; - ); - Section - enddef; - - ObjetNew1(% - TS1, for k=2 upto NbS:TS[k], endfor TS[NbS+1] - )(% - NbS-1, for p_=2 upto NbS:p_, endfor - for p=2 upto NbS: - 3,1,p+1,p,% - endfor); - AffichageObjet1; - - Sommet[NbS+1]:=Sommet[2]; - - if Sections: - draw SectionPyramide(CoefSection); - fi; - - NF:=NbS;%nombresommets; - % Fc[100] est la base - Fc[100]:=NbS-1; - for k=2 upto NbS: - Fc[100+k-1]:=k; - endfor; - for k=2 upto NF: - Fc[k*100]:=3; - Fc[k*100+1]:=1; - Fc[k*100+2]:=k+1; - Fc[k*100+3]:=k; - endfor; - DessineObjet; - - vardef EcrireSommets(text t)= - if AutoLabel: - nb:=0; - for p_=t: - nb:=nb+1; - if nb<NbS+1: - if nb>1: - label(TEX(""&p_&""),1.1[Projette(Sommet1),Projette(Sommet[nb])]); - else: - label(TEX(p_),1.1[Projette(Sommet[2]),Projette(Sommet[1])]); - fi; - fi; - endfor; - fi; - enddef; - - DefinirSommets(#1); - - if TraceArete=false: - currentpicture:=nullpicture; - fi; - if NommeSommets: - EcrireSommets(#2); - fi; - u:=0.25u; - marque_p:="croix"; - nbcroix=0; - for p_=#1: - nbcroix:=nbcroix+1; - if nbcroix<NbS+1: - pointe(p_); - fi; - endfor; - u:=1cm; - if Code: - \useKV[ClesSolides]{Traces}; - fi; - - \end{mplibcode} - \fi -} - -\newcommand\MPSolideCone[3]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean NommeSommets,Code,Sections,Axes,RemplisSection; - NommeSommets=\useKV[ClesSolides]{Sommets}; - Code=\useKV[ClesSolides]{Code}; - Axes:=\useKV[ClesSolides]{Axes}; - Sections=\useKV[ClesSolides]{Sections}; - RemplisSection=\useKV[ClesSolides]{RemplisSection}; - if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; - %Initialisation - PfCRho=\useKV[ClesSolides]{Rho}; - PfCPhi=\useKV[ClesSolides]{Phi}; - PfCTheta=\useKV[ClesSolides]{Theta}; - PfCDistance=\useKV[ClesSolides]{Distance}; - CoefSection=\useKV[ClesSolides]{CoefSection}; - anglerotationx=\useKV[ClesSolides]{Anglex}; - rayoncone=\useKV[ClesSolides]{RayonCone}; - hauteurcone=\useKV[ClesSolides]{HauteurCone}; - - color PfCOutColor; - PfCOutColor=\useKV[ClesSolides]{Couleur}; - input PfCSolid; - - vardef BaseCone(text t)= - save Cer; - picture Cer; - save n; - n:=0; - for p_=t: - if color p_: - n:=n+1; - _T[n]:=p_; - fi; - endfor; - pascercle:=5; - color ptcer[]; - for k=0 step pascercle until (360+pascercle) : - ptcer[k div pascercle]-_T[1]=Distance(_T[1],_T[2])*((_T[4]-_T[3])*cosd(k)/Distance(_T[3],_T[4])+(_T[5]-_T[3])*sind(k)/Distance(_T[3],_T[5])); - endfor; - % - color ddcer,cccer; - nbpointilles:=0; - nbtraces:=0; - Cer=image(% - for k=0 step pascercle until 360: - ddcer:=Oeil-ptcer[k div pascercle]; - cccer:=-Normal(Sommet1,ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - if (ProduitScalaire(ddcer,cccer)>=0): - nbtraces:=nbtraces+1; - if (nbtraces=1) and (nbpointilles>0): - draw chemin(ptcer[k div pascercle],Sommet1); - fi; - draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - else: - nbpointilles:=nbpointilles+1; - nbtraces:=0; - if (nbpointilles=1): - draw chemin(ptcer[k div pascercle],Sommet1); - fi; - if k mod (2*pascercle)=0: - draw chemin(ptcer[k div pascercle],ptcer[(k+pascercle) div pascercle]); - fi; - fi; - endfor; - ); - Cer - enddef; - - Figure(-10u,-10u,10u,10u); - Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); - typetrace:="3D"; - typerepre:="persp"; - eclairage:=false; - nb:=36;%36 - subh:=1;% - incolor:=white; - outcolor:=PfCOutColor; - Ferme1:=true; - angx:=anglerotationx; - Objetcone1("r="&decimal(rayoncone),"h="&decimal(hauteurcone)); - traits:=false; - AffichageObjet1; - - color Sommet[];%O,S,A,M,B,C,D, - Sommet2=(0,0,0); - Sommet1-Sommet2=(0,0,hauteurcone); - Sommet3-Sommet2=rayoncone*(cosd(0),-sind(0),0); - Sommet4-Sommet2=rayoncone*(cosd(90),-sind(90),0); - Sommet1:=RotXYZ(Sommet1); - Sommet3:=RotXYZ(Sommet3); - Sommet4:=RotXYZ(Sommet4); - - color MSection[]; - MSection[1]=CoefSection[Sommet1,Sommet2]; - - DefinirSommetsSection(#3); - - if Sections: - if RemplisSection: - remplis Cercles(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]) withcolor CouleurSection; - fi; - trace BaseCone(CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet2],CoefSection[Sommet1,Sommet3],CoefSection[Sommet1,Sommet4]); - fi; - - trace BaseCone(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); - color dcer,ccer; - dcer:=Oeil-Sommet2; - ccer:=Normal(Sommet2,Sommet3,Sommet4); - if (ProduitScalaire(dcer,ccer)>=0): - draw Cercles(Sommet2,Sommet3,Sommet2,Sommet3,Sommet4); - fi; - - vardef EcrireSommets(text t)= - nb:=0; - for p_=t: - nb:=nb+1; - if bluepart(Sommet1)>bluepart(Sommet2): - if nb=1: - label.ulft(TEX(p_),Projette(Sommet1)); - elseif nb=2: - dotlabel.rt(TEX(p_),Projette(Sommet2)); - fi; - else: - if nb=1: - label.bot(TEX(p_),Projette(Sommet1)); - elseif nb=2: - dotlabel.ulft(TEX(p_),Projette(Sommet2)); - fi; - fi; - endfor; - enddef; - - DefinirSommets(#1); - - if Axes: - draw segment(1.5[Sommet1,Sommet2],1.5[Sommet2,Sommet1]) dashed dashpattern(on6 off3 on3 off 3); - remplis (fullcircle scaled 1mm) shifted(Projette(Sommet1)); - remplis (fullcircle scaled 1mm) shifted(Projette(Sommet2)); - fi; - - if Code: - \useKV[ClesSolides]{Traces}; - fi; - - \end{mplibcode} - \fi -} - -\newcommand\MPSolidePave[5]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCSolid; - - boolean Pointilles,TraceArete,NommeSommets,Code,AutoLabel,Sections,RemplisSection; - AutoLabel:=\useKV[ClesSolides]{AutoLabel}; - Pointilles=\useKV[ClesSolides]{Pointilles}; - TraceArete=\useKV[ClesSolides]{Aretes}; - NommeSommets=\useKV[ClesSolides]{Sommets}; - Code=\useKV[ClesSolides]{Code}; - Sections:=\useKV[ClesSolides]{Sections}; - RemplisSection=\useKV[ClesSolides]{RemplisSection}; - if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; - - string Section; - if Sections:Section=\useKV[ClesSolides]{Section};fi; - - %Initialisation - PfCRho=\useKV[ClesSolides]{Rho}; - PfCPhi=\useKV[ClesSolides]{Phi}; - PfCTheta=\useKV[ClesSolides]{Theta}; - PfCDistance=\useKV[ClesSolides]{Distance}; - - Figure(-10u,-10u,10u,10u); - Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); - typetrace:="3D"; - typerepre:="persp"; - if Pointilles=false: - pointilles:="non"; - fi; - color A,B,C,D,E,F,G,H; - color Sommet[]; - trace Pave(A,B,C,D,E,F,G,H)(#3); - currentpicture:=nullpicture; - Sommet1=A; - Sommet2=B; - Sommet3=C; - Sommet4=D; - Sommet5=E; - Sommet6=F; - Sommet7=G; - Sommet8=H; - - DefinirSommets(#1); - - color MSection[]; - numeric RetiensSection[]; - numretienssection:=0; - color RetiensDefSection[]; - numretiensdefsection:=0; - if Sections: - if Section="arete": - for p_=#5: - if numeric p_: - numretienssection:=numretienssection+1; - RetiensSection[numretienssection]=p_; - elseif color p_: - numretiensdefsection:=numretiensdefsection+1; - RetiensDefSection[numretiensdefsection]=p_; - fi; - endfor; - % On dessine la section - MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; - MSection[2]=(RetiensSection[2])[RetiensDefSection[3],RetiensDefSection[4]]; - MSection[3]-MSection[2]=RetiensDefSection[6]-RetiensDefSection[5]; - MSection[4]-MSection[1]=RetiensDefSection[6]-RetiensDefSection[5]; - if RemplisSection: - fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; - fi; -% DotLabel.top(TEX("M1"),MSection[1]); -% DotLabel.top(TEX("M2"),MSection[2]); -% DotLabel.top(TEX("M3"),MSection[3]); -% DotLabel.top(TEX("M4"),MSection[4]); -% if RemplisSection: -% fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; -% fi; -% trace polygone(MSection1,MSection2,MSection3,MSection4); - color dcer,ccer; - % 1er cote -> ok - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); - draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - % 2eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); - draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - % 3eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); - draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; - % 4eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[3],RetiensDefSection[4]+RetiensDefSection[6]-RetiensDefSection[5]); - draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; - else: - %face - for p_=#5: - if numeric p_: - numretienssection:=numretienssection+1; - RetiensSection[numretienssection]=p_; - elseif color p_: - numretiensdefsection:=numretiensdefsection+1; - RetiensDefSection[numretiensdefsection]=p_; - fi; - endfor; - % On dessine la section - MSection[1]=(RetiensSection[1])[RetiensDefSection[1],RetiensDefSection[2]]; - MSection[2]-MSection[1]=RetiensDefSection[4]-RetiensDefSection[3]; - MSection[3]-MSection[2]=RetiensDefSection[5]-RetiensDefSection[4]; - MSection[4]-MSection[1]=MSection[3]-MSection[2]; -% DotLabel.top(TEX("M1"),MSection[1]); -% DotLabel.top(TEX("M2"),MSection[2]); -% DotLabel.top(TEX("M3"),MSection[3]); -% DotLabel.top(TEX("M4"),MSection[4]); - if RemplisSection: - fill polygone(MSection1,MSection2,MSection3,MSection4) withcolor CouleurSection; - fi; - color dcer,ccer; - % 1er cote -> ok - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); - draw chemin(MSection1,MSection2) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - % 2eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); - draw chemin(MSection2,MSection3) if (ProduitScalaire(dcer,ccer)<0):dashed evenly fi; - % 3eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[4],RetiensDefSection[2],RetiensDefSection[1]); - draw chemin(MSection3,MSection4) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; - % 4eme cote - dcer:=Oeil-RetiensDefSection[4]; - ccer:=Normal(RetiensDefSection[5],RetiensDefSection[4],RetiensDefSection[5]+RetiensDefSection[1]-RetiensDefSection[2]); - draw chemin(MSection4,MSection1) if (ProduitScalaire(dcer,ccer)>=0):dashed evenly fi; - fi; - %On trace la section considérée - %trace polygone(MSection1,MSection2,MSection3,MSection4); - fi; - - trace Pave(A,B,C,D,E,F,G,H)(#3); - - DefinirSommetsSection(#4); - - if TraceArete=false: - currentpicture:=nullpicture; - fi; - if NommeSommets: - EcrireSommetsPave(#2); - fi; - u:=0.25u; - marque_p:="croix"; - nbcroix=0; - for p_=#1: - nbcroix:=nbcroix+1; - if nbcroix=4: - if Pointilles: - pointe(p_); - fi; - else: - pointe(p_); - fi; - endfor; - u:=1cm; - if Code: - \useKV[ClesSolides]{Traces}; - fi; - \end{mplibcode} - \fi -} - -\newcommand\MPSolideSphere[3]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean NommeSommets,Code,Sections,Axes,RemplisSection; - NommeSommets=\useKV[ClesSolides]{Sommets}; - Code=\useKV[ClesSolides]{Code}; - Axes:=\useKV[ClesSolides]{Axes}; - Sections=\useKV[ClesSolides]{Sections}; - RemplisSection=\useKV[ClesSolides]{RemplisSection}; - if RemplisSection:color CouleurSection;CouleurSection=\useKV[ClesSolides]{CouleurSection};fi; - %Initialisation - PfCRho=\useKV[ClesSolides]{Rho}; - PfCPhi=0;%\useKV[ClesSolides]{Phi}; - PfCTheta=10;%\useKV[ClesSolides]{Theta}; - PfCDistance=\useKV[ClesSolides]{Distance}; - CoefSection=\useKV[ClesSolides]{CoefSection}; - anglerotationx=\useKV[ClesSolides]{Anglex}; - rayonsphere=\useKV[ClesSolides]{RayonSphere}; - - color PfCOutColor; - PfCOutColor=\useKV[ClesSolides]{Couleur}; - input PfCSolid; - - vardef BaseSphere= - save Cer; - picture Cer; - color PtInter.iso,PtInter[]; - vardef Famille(expr u,v)=(R*(cos(u)*cos(v),cos(u)*sin(v),sin(u))) enddef; - subh:=72; - Cer=image(% - if Sections: - if RemplisSection:fill (Cercles(Image((0,0,0)),Image((0,1,0)),Image((0,0,0)),Image((0,1,0)),Image((-1,0,0))) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)) withcolor CouleurSection; fi; - fi; - %Equateur - umin:=0; umax:=pi/nb; upas:=pi/nb; - vmin:=0; vpas:=2*pi/subh; vmax:=2*pi; - for l=0 upto subh-1: - PtInter[1]:=Image(Famille(umin+(0+1)*upas,vmin+l*vpas)); - PtInter[2]:=Image(Famille(umin+0*upas,vmin+l*vpas)); - PtInter[3]:=Image(Famille(umin+0*upas,vmin+(l+1)*vpas)); - PtInter[4]:=Image(Famille(umin+(0+1)*upas,vmin+(l+1)*vpas)); - PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; - if ProduitScalaire(Oeil-PtInter.iso,Normal(PtInter.iso,PtInter[4],PtInter[1]))>=0: - if Sections: - draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); - fi; - draw segment(PtInter[3],PtInter[2]); - else: - if l mod 2=0: - if Sections: - draw (segment(PtInter[3],PtInter[2]) scaled (sqrt(1-(abs(CoefSection+0.02))**2))) shifted(Projette(MSection1-Sommet1)); - fi; - draw segment(PtInter[3],PtInter[2]); - fi; - fi; - endfor; - - % "Exterieur" - nb:=72; - subh:=18; - umin:=-pi; umax:=pi; upas:=2*pi/nb; - vpas:=2*pi/subh; vmin:=pi/2; vmax:=2*pi; - for k=0 upto nb-1: - PtInter[1]:=Image(Famille(umin+(k+1)*upas,vmin+0*vpas)); - PtInter[2]:=Image(Famille(umin+k*upas,vmin+0*vpas)); - PtInter[3]:=Image(Famille(umin+k*upas,vmin+(0+1)*vpas)); - PtInter[4]:=Image(Famille(umin+(k+1)*upas,vmin+(0+1)*vpas)); - PtInter.iso:=(PtInter[1]+PtInter[2]+PtInter[3]+PtInter[4])/4; - draw segment(PtInter[2],PtInter[1]); - endfor; - ); - Cer - enddef; - - Figure(-10u,-10u,10u,10u); - Initialisation(PfCRho,PfCPhi,PfCTheta,PfCDistance); - typetrace:="3D"; - typerepre:="persp"; - eclairage:=false; - nb:=24;%36 - subh:=36;% - incolor:=blue; - outcolor:=white;%PfCOutColor; - Ferme1:=true; - angx:=anglerotationx; - Objetsphere1("R="&decimal(rayonsphere)); - % traits:=false; - % AffichageObjet1; - color Sommet[],SommetN,SommetS,SommetB; - Sommet1=(0,0,0); - Sommet2=(0,rayonsphere,0); - Sommet3=(-rayonsphere,0,0); - Sommet4=(0,0,rayonsphere); - SommetN=Sommet4; - SommetS=(0,0,-rayonsphere); - SommetB=(rayonsphere,0,0); - Sommet2:=RotXYZ(Sommet2); - Sommet3:=RotXYZ(Sommet3); - Sommet4:=RotXYZ(Sommet4); - SommetN:=RotXYZ(SommetN); - SommetS:=RotXYZ(SommetS); - SommetB:=RotXYZ(SommetB); - color MSection[]; - MSection[1]=CoefSection[Sommet1,SommetN]; - MSection[2]=Image((0,sqrt(1-CoefSection**2),CoefSection)); - - trace BaseSphere; - - DefinirSommets(#1); - DefinirSommetsSection(#3); - - if Axes: - draw segment(1.25[SommetN,SommetS],1.25[SommetS,SommetN]) dashed dashpattern(on6 off3 on3 off3); - remplis (fullcircle scaled 1mm) shifted(Projette(SommetN)); - remplis (fullcircle scaled 1mm) shifted(Projette(SommetS)); - fi; - - if Code: - \useKV[ClesSolides]{Traces}; - fi; - - \end{mplibcode} - \fi -} - -\def\UpdatetoksSolide#1\nil{\addtotok\toksolidelistesommets{"#1",}} -\newtoks\toksolidelistesommets% -\newtoks\toksolidelistepointssections% - -\newcommand\Solide[1][]{% - \useKVdefault[ClesSolides]% - \setKV[ClesSolides]{#1}% - \setsepchar{,}\ignoreemptyitems% - \xdef\foo{\useKV[ClesSolides]{ListeSommets}}% - \readlist*\ListeNomSommet{\foo}%\showitems\ListeNomSommet - \reademptyitems% - \toksolidelistesommets{} - \foreachitem\compteur\in\ListeNomSommet{\expandafter\UpdatetoksSolide\compteur\nil}%\the\toksolidelistesommets% - \IfStrEqCase{\useKV[ClesSolides]{Nom}}{% - {cube}{% - \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{1,1,1}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% - }% - {pave}{% - \MPSolidePave{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{Profondeur},\useKV[ClesSolides]{Largeur},\useKV[ClesSolides]{Hauteur}}{\useKV[ClesSolides]{PointsSection}}{\useKV[ClesSolides]{ObjetSection}}% - }% - {cone}{% - \MPSolideCone{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% - }% - {pyramide}{% - \MPSolidePyramide{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{DecalageSommet}}{\useKV[ClesSolides]{PointsSection}}% - }% - {cylindre}{% - \MPSolideCylindre{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% - }% - {sphere}{% - \MPSolideSphere{\useKV[ClesSolides]{ListeSommets}}{\the\toksolidelistesommets}{\useKV[ClesSolides]{PointsSection}}% - }% - }% -}% - -%%% -% Vue Cubes -%%% -\setKVdefault[VueCubes]{Solution=false,Hauteur=5,Profondeur=4,Largeur=3,Angle=60,Nom=Ex1,Trou=false,Echelle=0.25,CouleurCube=LightSteelBlue,CouleurFleche=LightGray,Face=false,Creation=false,Grilles=false} - -\newtoks\toklisteVueCube% -\def\UpdatetoksVueCube#1\nil{\addtotok\toklisteVueCube{#1,}}% - -\NewDocumentCommand\VueCubes{o m}{% - \useKVdefault[VueCubes]% - \setKV[VueCubes]{#1} - \ifboolKV[VueCubes]{Solution}{% - \BuildVueCubesSolution% - }{% - \ifboolKV[VueCubes]{Creation}{%Le nombre de données doit être compatible avec le "volume du pavé droit" - \ignoreemptyitems% - \readlist*\PfCListeHauteursCubes{#2}% - \reademptyitems% - \toklisteVueCube{}% - \foreachitem\compteur\in\PfCListeHauteursCubes{\expandafter\UpdatetoksVueCube\compteur\nil}% - \BuildVueCubes{\useKV[VueCubes]{Angle}}{\the\toklisteVueCube}% - }{% - \BuildVueCubes{\useKV[VueCubes]{Angle}}{}% - }% - }% -}% - -\NewDocumentCommand\BuildVueCubes{m m}{% - \ifluatex - \mplibforcehmode - \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% - \begin{mplibcode}[\PfCVueCubeNom] - input PfCSolid; - - intensite:=1.5; - - Ferme[0]:=false; - outcolor:=\useKV[VueCubes]{CouleurCube}; - incolor:=white; - nb:=1;subh:=1; - creux:=true; - - Profondeur:=\useKV[VueCubes]{Profondeur}; - Largeur:=\useKV[VueCubes]{Largeur}; - Hauteur:=\useKV[VueCubes]{Hauteur}; - Phi:=#1; - Echelle:=\useKV[VueCubes]{Echelle}; - - color CouleurFleche; - CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; - - boolean Trou,FaceVue,Creation,Grille; - Trou:=\useKV[VueCubes]{Trou}; - FaceVue:=\useKV[VueCubes]{Face}; - Creation:=\useKV[VueCubes]{Creation}; - Grille:=\useKV[VueCubes]{Grilles}; - - TotalObj:=0; - - vardef CreationSolide(text t)= - PfCnbcubes:=0; - for p_=t: - m:=(PfCnbcubes div Profondeur); - k:=(PfCnbcubes mod Profondeur); - hauteurtour[m+1][k+1]:=p_; - for l=1 upto hauteurtour[m+1][k+1]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*k,(m+1)*Echelle,Echelle*l-Echelle/2); - ObjetDeplacement[TotalObj](0); - endfor; - PfCnbcubes:=incr PfCnbcubes; - endfor; - enddef; - - Initialisation(2500,Phi,20,50); - Objetcube0("a="&decimal(Echelle)); - - if Creation: - CreationSolide(#2); - else: - for k=1 upto Profondeur:%4 profondeur - hauteurtour[0][k]:=Hauteur;%5 hauteur totale - endfor; - for m=1 upto Largeur:%3 largeur - for k=1 upto Profondeur:%4 profondeur - if Trou: - if m>1: - hauteurtour[m][k]:=floor(uniformdeviate(hauteurtour[m-1][k]+1));%5 hauteur totale - else: - hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale - fi; - else: - hauteurtour[m][k]:=1+floor(uniformdeviate(hauteurtour[m-1][k]));%5 hauteur totale - fi; - for l=1 upto hauteurtour[m][k]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2); - ObjetDeplacement[TotalObj](0); - endfor; - endfor; - endfor; - fi; - - % Pour la fleche - path Fleche; - color A[]; - if FaceVue: - A0=Echelle*(1,Largeur/2,0); - A1-A0=0.25*(2,2,0); - A2-A1=0.25*(0,-1,0); - A3-A2=0.25*(2,0,0); - A4-A3=0.25*(0,-2,0); - A5-A4=A2-A3; - A6-A5=A2-A1; - Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; - fill Fleche withcolor CouleurFleche; - draw Fleche; - fi; - - nbobj:=TotalObj; - DessineFusion; - - if Grille: - % dessus - color Ad[]; - Ad0=(0.5Echelle,0.5*Echelle,-0.5); - Ad1-Ad0=(0,Largeur*Echelle,0); - Ad2-Ad1=(-Profondeur*Echelle,0,0); - Ad3-Ad2=Ad0-Ad1; - draw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; - for k=1 upto Largeur-1: - draw Projette((k/Largeur)[Ad0,Ad1])--Projette((k/Largeur)[Ad3,Ad2]); - endfor; - for k=1 upto Profondeur-1: - draw Projette((k/Profondeur)[Ad0,Ad3])--Projette((k/Profondeur)[Ad1,Ad2]); - endfor; - % face - color Af[]; - Af0=(-1-Profondeur*Echelle,0.5*Echelle,0); - Af1-Af0=(0,Largeur*Echelle,0); - Af2-Af1=(0,0,Hauteur*Echelle); - Af3-Af2=Af0-Af1; - draw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; - for k=1 upto Largeur-1: - draw Projette((k/Largeur)[Af0,Af1])--Projette((k/Largeur)[Af3,Af2]); - endfor; - for k=1 upto Hauteur-1: - draw Projette((k/Hauteur)[Af0,Af3])--Projette((k/Hauteur)[Af1,Af2]); - endfor; - % droite - color Adg[]; - Adg0=(0.5Echelle,-Largeur*Echelle-1,0); - Adg1-Adg0=(-Profondeur*Echelle,0,0); - Adg2-Adg1=(0,0,Hauteur*Echelle); - Adg3-Adg2=Adg0-Adg1; - draw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; - for k=1 upto Profondeur-1: - draw Projette((k/Profondeur)[Adg0,Adg1])--Projette((k/Profondeur)[Adg3,Adg2]); - endfor; - for k=1 upto Hauteur-1: - draw Projette((k/Hauteur)[Adg0,Adg3])--Projette((k/Hauteur)[Adg1,Adg2]); - endfor; - fi; - - %draw (llcorner currentpicture)--(lrcorner currentpicture)--(urcorner currentpicture)--(ulcorner currentpicture)--cycle; - \end{mplibcode} - \ifboolKV[VueCubes]{Grilles}{}{% - \hspace*{1.5cm} - \begin{mplibcode}[\PfCVueCubeNom] - input PfCSolid; - - intensite:=1.5; - - Ferme[0]:=false; - outcolor:=\useKV[VueCubes]{CouleurCube}; - incolor:=white; - nb:=1;subh:=1; - creux:=true; - - Profondeur:=\useKV[VueCubes]{Profondeur}; - Largeur:=\useKV[VueCubes]{Largeur}; - Hauteur:=\useKV[VueCubes]{Hauteur}; - Phi:=#1; - Echelle:=\useKV[VueCubes]{Echelle}; - - color CouleurFleche; - CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; - - TotalObj:=0; - - Initialisation(2500,Phi+90,30,50); - Objetcube0("a="&decimal(Echelle)); - - for m=1 upto Largeur:%3 largeur - for k=1 upto Profondeur:%4 profondeur - for l=1 upto hauteurtour[m][k]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); - ObjetDeplacement[TotalObj](0); - endfor; - endfor; - endfor; - - if Grille: - undraw Projette(Ad0) for k=1 upto 3: --Projette(Ad[k]) endfor --cycle; - undraw Projette(Af0) for k=1 upto 3: --Projette(Af[k]) endfor --cycle; - undraw Projette(Adg0) for k=1 upto 3: --Projette(Adg[k]) endfor --cycle; - fi; - - path Fleche; - if FaceVue: - Fleche=Projette(A0)--Projette(A1)--Projette(A2)--Projette(A3)--Projette(A4)--Projette(A5)--Projette(A6)--cycle; - fill Fleche withcolor CouleurFleche; - draw Fleche; - fi; - - nbobj:=TotalObj; - DessineFusion; - \end{mplibcode} - }% - \fi -}% - -\NewDocumentCommand\BuildVueCubesSolution{}{% - \ifluatex% - \xdef\PfCVueCubeNom{\useKV[VueCubes]{Nom}}% - \begin{NiceTabular}{ccc}% - Vue de face&Vue de dessus&Vue de gauche\\ - {\begin{mplibcode}[\PfCVueCubeNom] - input PfCSolid; - - intensite:=1.5; - - Ferme[0]:=false; - outcolor:=\useKV[VueCubes]{CouleurCube}; - incolor:=white; - nb:=1;subh:=1; - creux:=true; - - Profondeur:=\useKV[VueCubes]{Profondeur}; - Largeur:=\useKV[VueCubes]{Largeur}; - Hauteur:=\useKV[VueCubes]{Hauteur}; - Phi:=0; - Echelle:=\useKV[VueCubes]{Echelle}; - - color CouleurFleche; - CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; - - TotalObj:=0; - - Initialisation(2500,Phi,0,50); - Objetcube0("a="&decimal(Echelle)); - - for m=1 upto Largeur:%3 largeur - for k=1 upto Profondeur:%4 profondeur - for l=1 upto hauteurtour[m][k]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); - ObjetDeplacement[TotalObj](0); - endfor; - endfor; - endfor; - - nbobj:=TotalObj; - DessineFusion; - \end{mplibcode}}& - {\begin{mplibcode}[\PfCVueCubeNom] - input PfCSolid; - - intensite:=1.5; - - Ferme[0]:=false; - outcolor:=\useKV[VueCubes]{CouleurCube}; - incolor:=white; - nb:=1;subh:=1; - creux:=true; - - Profondeur:=\useKV[VueCubes]{Profondeur}; - Largeur:=\useKV[VueCubes]{Largeur}; - Hauteur:=\useKV[VueCubes]{Hauteur}; - Phi:=0; - Echelle:=\useKV[VueCubes]{Echelle}; - - color CouleurFleche; - CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; - - TotalObj:=0; - - Initialisation(2500,Phi,90,50); - Objetcube0("a="&decimal(Echelle)); - - for m=1 upto Largeur:%3 largeur - for k=1 upto Profondeur:%4 profondeur - for l=1 upto hauteurtour[m][k]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); - ObjetDeplacement[TotalObj](0); - endfor; - endfor; - endfor; - - nbobj:=TotalObj; - DessineFusion; - \end{mplibcode}}&{\begin{mplibcode}[\PfCVueCubeNom] - input PfCSolid; - - intensite:=1.5; - - Ferme[0]:=false; - outcolor:=\useKV[VueCubes]{CouleurCube}; - incolor:=white; - nb:=1;subh:=1; - creux:=true; - - Profondeur:=\useKV[VueCubes]{Profondeur}; - Largeur:=\useKV[VueCubes]{Largeur}; - Hauteur:=\useKV[VueCubes]{Hauteur}; - Phi:=-90; - Echelle:=\useKV[VueCubes]{Echelle}; - - color CouleurFleche; - CouleurFleche:=\useKV[VueCubes]{CouleurFleche}; - - TotalObj:=0; - - Initialisation(2500,Phi,0,50); - Objetcube0("a="&decimal(Echelle)); - - for m=1 upto Largeur:%3 largeur - for k=1 upto Profondeur:%4 profondeur - for l=1 upto hauteurtour[m][k]: - TotalObj:=incr TotalObj; - TR:=(-Echelle*(k-1),m*Echelle,Echelle*l-Echelle/2);%TR:=(-0.5*(k-1),m*0.5,l/2-0.25); - ObjetDeplacement[TotalObj](0); - endfor; - endfor; - endfor; - - nbobj:=TotalObj; - DessineFusion; - \end{mplibcode}}\\ - \end{NiceTabular}% - \fi% -}% - -%%% -% Codage RLE -%%% -\setKVdefault[RLE]{Largeur=10pt,Taille=5,Unite=1cm,Solution=false,Enonce=true} - -\newtoks\toklisterle -\def\UpdatetoksRLE#1\nil{\addtotok\toklisterle{#1,}}% - -%\newlength\PfCRLEHeight% -\NewDocumentCommand\CodageRLE{o m}{% - \useKVdefault[RLE]% - \setKV[RLE]{#1}% - %\setlength{\PfCRLEHeight}{\useKV[RLE]{Largeur}}% - \setsepchar{,}% - \readlist*\PfCListeRLE{#2}% - \toklisterle{}% - \foreachitem\compteur\in\PfCListeRLE{\expandafter\UpdatetoksRLE\compteur\nil}% - \BuildRLE{\the\toklisterle}% -} - -\NewDocumentCommand\BuildRLE{m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - Taille:=\useKV[RLE]{Taille}; - u:=\useKV[RLE]{Unite}; - boolean Solution,Enonce; - Solution:=\useKV[RLE]{Solution}; - Enonce:=\useKV[RLE]{Enonce}; - - color RLEFill; - RLEFill=white; - - numeric nbretenir[][]; - - vardef NombreLigne(text t)= - retiens:=0; - nblignes:=0; - for p_=t: - retiens:=retiens+p_; - if retiens=Taille: - nblignes:=nblignes+1; - retiens:=0; - fi; - endfor; - enddef; - - path Square; - Square=unitsquare scaled u; - - vardef RLE(text t)= - nbcoups:=0; - nbcases:=0; - nbcaseslignes:=0; - cptretiensnb:=0; - cptretiensnblignes:=1; - for p_=t: - if p_=0: - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - RLEFill:=black; - else: - nbcoups:=nbcoups+1; - for l=0 upto p_-1: - if Solution: fill ((Square scaled 0.95) shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille))+u*(0.025,0.025))) withcolor RLEFill; fi; - trace (Square shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille)))); - endfor; - nbcaseslignes:=nbcaseslignes+p_; - nbcases:=nbcases+p_; - if (nbcaseslignes mod Taille)=0: - RLEFill:=white; - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - cptretiensnblignes:=cptretiensnblignes+1; - cptretiensnb:=0; - else: - if RLEFill=white: RLEFill:=black else: RLEFill:=white fi; - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - fi; - fi; - endfor; - enddef; - - string Sequence[]; - - boolean STOP; - STOP:=false; - - vardef Affichage= - for k=1 upto nblignes: - Sequence[k]=decimal(nbretenir[k][1]); - n:=1; - forever: - n:=n+1; - if unknown nbretenir[k][n]: - STOP:=true; - else: - Sequence[k]:=Sequence[k]&","&decimal(nbretenir[k][n]); - fi; - exitif STOP; - endfor; - label.rt(TEX(Sequence[k]),u*(Taille+1,-k+1+0.5)); - STOP:=false; - endfor; - enddef; - - NombreLigne(#1); - RLE(#1); - if Enonce: - Affichage; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - Taille:=\useKV[RLE]{Taille}; - u:=\useKV[RLE]{Unite}; - boolean Solution,Enonce; - Solution:=\useKV[RLE]{Solution}; - Enonce:=\useKV[RLE]{Enonce}; - }] - color RLEFill; - RLEFill=white; - - numeric nbretenir[][]; - - vardef NombreLigne(text t)= - retiens:=0; - nblignes:=0; - for p_=t: - retiens:=retiens+p_; - if retiens=Taille: - nblignes:=nblignes+1; - retiens:=0; - fi; - endfor; - enddef; - - path Square; - Square=unitsquare scaled u; - - vardef RLE(text t)= - nbcoups:=0; - nbcases:=0; - nbcaseslignes:=0; - cptretiensnb:=0; - cptretiensnblignes:=1; - for p_=t: - if p_=0: - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - RLEFill:=black; - else: - nbcoups:=nbcoups+1; - for l=0 upto p_-1: - if Solution: fill ((Square scaled 0.95) shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille))+u*(0.025,0.025))) withcolor RLEFill; fi; - trace (Square shifted(u*((nbcases mod Taille)+l,-(nbcases div Taille)))); - endfor; - nbcaseslignes:=nbcaseslignes+p_; - nbcases:=nbcases+p_; - if (nbcaseslignes mod Taille)=0: - RLEFill:=white; - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - cptretiensnblignes:=cptretiensnblignes+1; - cptretiensnb:=0; - else: - if RLEFill=white: RLEFill:=black else: RLEFill:=white fi; - cptretiensnb:=cptretiensnb+1; - nbretenir[cptretiensnblignes][cptretiensnb]=p_; - fi; - fi; - endfor; - enddef; - - string Sequence[]; - - boolean STOP; - STOP:=false; - - vardef Affichage= - for k=1 upto nblignes: - Sequence[k]=decimal(nbretenir[k][1]); - n:=1; - forever: - n:=n+1; - if unknown nbretenir[k][n]: - STOP:=true; - else: - Sequence[k]:=Sequence[k]&","&decimal(nbretenir[k][n]); - fi; - exitif STOP; - endfor; - label.rt(LATEX(Sequence[k]),u*(Taille+1,-k+1+0.5)); - STOP:=false; - endfor; - enddef; - - NombreLigne(#1); - RLE(#1); - if Enonce: - Affichage; - fi; - \end{mpost} - \fi -} - -%%% -% Engrenages -%%% -\newtoks\tokPfCEngrenages% -\def\UpdatetoksEngrenages#1/#2\nil{\addtotok\tokPfCEngrenages{#1,#2,}}% - -\setKVdefault[Engrenages]{Couleur=LightSteelBlue,Unite=3mm} - -\NewDocumentCommand\Engrenages{o m}{% - \tokPfCEngrenages{} - \useKVdefault[Engrenages]% - \setKV[Engrenages]{#1}% - \setsepchar[*]{,*/}% - \ignoreemptyitems - \readlist*\ListePfCEngrenages{#2}% - \setsepchar{,} - \xdef\PfCFooEngrenages{} - % \foreachitem\compteur\in\ListePfCEngrenages{\expandafter\UpdatetoksEngrenages\compteur\nil}% - \foreachitem\compteur\in\ListePfCEngrenages{% - \xdef\PfCFooEngrenages{\PfCFooEngrenages \ListePfCEngrenages[\compteurcnt,1],\ListePfCEngrenages[\compteurcnt,2],}% - }% - \BuildEngrenages{\PfCFooEngrenages}% -}% - -\NewDocumentCommand\BuildEngrenages{m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCEngrenages; - - u:=\useKV[Engrenages]{Unite}; - CouleurEngrenage=\useKV[Engrenages]{Couleur}; - - vardef LectureDonnees(text t)= - n:=0;k=0;l=0; - for p_=t: - n:=n+1; - if (n mod 2)=0: - l:=l+1; - Zz[l]=p_; - else: - k:=k+1; - Mm[k]=p_; - fi; - endfor; - enddef; - - LectureDonnees(#1); - - pair K; - K=(0,0); - - trace Engrenage(Mm[1],Zz[1],(0,0)); - - Signe=1; - - for w=2 upto (n div 2): - K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0); - AngleRot[w]:=360/(2*Zz[w]); - if w=2: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - if (Zz[w] mod 2)=0: - Signe:=Signe*(-1); - fi; - else: - if (Zz[w] mod 2)=1: - if Signe=-1: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); - else: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - fi; - else: - Signe:=Signe*(-1); - if Signe=1: -trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); - else: -trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - fi; - fi; - fi; - endfor; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={input PfCEngrenages;u:=\useKV[Engrenages]{Unite};CouleurEngrenage=\useKV[Engrenages]{Couleur};}] - vardef LectureDonnees(text t)= - n:=0;k=0;l=0; - for p_=t: - n:=n+1; - if (n mod 2)=0: - l:=l+1; - Zz[l]=p_; - else: - k:=k+1; - Mm[k]=p_; - fi; - endfor; - enddef; - - LectureDonnees(#1); - - pair K; - K=(0,0); - - trace Engrenage(Mm[1],Zz[1],(0,0)); - - Signe=1; - - for w=2 upto (n div 2): - K:=K+pointarc(cercles((0,0),u*Mm[w]*(Zz[w-1]+Zz[w])*0.5+0.04*u),0); - AngleRot[w]:=360/(2*Zz[w]); - if w=2: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - if (Zz[w] mod 2)=0: - Signe:=Signe*(-1); - fi; - else: - if (Zz[w] mod 2)=1: - if Signe=-1: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); - else: - trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - fi; - else: - Signe:=Signe*(-1); - if Signe=1: -trace rotation(Engrenage(Mm[w],Zz[w],K),K,180); - else: -trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); - fi; - fi; - fi; - endfor; - \end{mpost} - \fi -} - -%%% -% Tortue -%%% -\setKVdefault[Tortue]{% - Pas=0.2mm,%Déplacement, - Etapes=false,%Pour arrêter la construction à une étape particulière - Nom=\jobname,%Pour la sauvegarde du fichier mp - Grille=false,%Pour faire apparaître une grille - LargeurG=10,%Largeur Grille - HauteurG=10,%Hauteur Grille - TortueD=false,%Affiche la tortue au départ - TortueF=false,%Affiche la tortue à l'arrivée - Epaisseur=1,%Epaisseur du tracé - Angle=0,%Angle de départ de la tortue - Debut=false,%Pour indiquer que rien n'est fait (utile ?) - Depart={(0,0)},%Point de départ de la tortue - Axes=false,%Affichage des axes ou pas - Origine={(0,0)},%Origine des axes - Cases=false,%Se déplace-t-on sur des cases ? -} -\defKV[Tortue]{Etape=\setKV[Tortue]{Etapes}}%choix de l'étape d'arrêt - -\newcounter{PfCTortue} -\setcounter{PfCTortue}{0} - -\makeatletter -\NewDocumentCommand\TortueCreationFichier{o m}{% - \stepcounter{PfCTortue}% - \useKVdefault[Tortue]% - \setKV[Tortue]{#1}% - \setKV[Tortue]{Nom=\jobname+t\thePfCTortue}% - \setsepchar[*]{,* }% - \readlist*\PfCListeCmdTortue{#2}% - \setsepchar{,}% - \xdef\PfCNbRep{0}% - \savecomparemode% - \newwrite\turtle@out% - \immediate\openout\turtle@out \jobname+t\thePfCTortue.turtle% - \immediate\write\turtle@out{% - numeric ut; - ut=\useKV[Tortue]{Pas}; - pair OrigineAxes;OrigineAxes=\useKV[Tortue]{Origine}; - Etapes=\useKV[Tortue]{Etapes}; - if Etapes:Total=\useKV[Tortue]{Etape};fi; - }% - \ifboolKV[Tortue]{Grille}{% - \immediate\write\turtle@out{% - larg=\useKV[Tortue]{LargeurG}; haut=\useKV[Tortue]{HauteurG}; - for k=-larg upto larg: - draw 3*ut*(10k,-10haut)--3*ut*(10k,10haut) withcolor 0.75white; - endfor; - for k=-haut upto haut: - draw 3*ut*(-10larg,10k)--3*ut*(10larg,10k) withcolor 0.75white; - endfor; - %dotlabel("",ut*OrigineAxes); - if \useKV[Tortue]{Axes}: - drawarrow (3*ut*(-10larg,0)--3*ut*(10larg,0)) shifted(ut*(0,ypart(OrigineAxes-(0,0)))); - drawarrow (3*ut*(0,-10haut)--3*ut*(0,10haut)) shifted(ut*(xpart(OrigineAxes-(0,0)),0)); - %label.llft(btex O etex,(0,0)); - dotlabel.lrt(btex 30 etex,(30*ut,0)+ut*(OrigineAxes-(0,0))); - dotlabel.ulft(btex 30 etex,(0,30*ut)+ut*(OrigineAxes-(0,0))); - fi; - if \useKV[Tortue]{Cases}: - string T[]; - T1="A"; - T2="B"; - T3="C"; - T4="D"; - T5="E"; - T6="F"; - T7="G"; - T8="H"; - T9="I"; - T10="J"; - T11="K"; - T12="L"; - T13="M"; - T14="N"; - T15="O"; - T16="P"; - T17="Q"; - T18="R"; - T19="S"; - T20="T"; - T21="U"; - T22="V"; - T23="W"; - T24="X"; - T25="Y"; - T26="Z"; - for k=-larg upto larg-1: - label(TEX(T[k+larg+1]),3*ut*(10k+5,10haut+5)); - endfor; - for k=haut downto -haut+1: - label(TEX(decimal(haut-k+1)),3*ut*(-10larg-5,10k-5)); - endfor; - fi; - Epaisseur:=1.5; - }% - }{}% - \ifboolKV[Tortue]{Debut}{}{% - \foreachitem\compteur\in\PfCListeCmdTortue{% - \comparestrict% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{MP}[\PfCTestMP]% - \xintifboolexpr{\PfCTestMP==0}{% - \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,2]}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{[}[\PfCTestCrochetO]% - \xintifboolexpr{\PfCTestCrochetO==0}{}{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{]}[\PfCTestCrochetF]% - \xintifboolexpr{\PfCTestCrochetF==0}{% - \immediate\write\turtle@out{TotalRemplis:=tt-1; remplis for l=1 upto TotalRemplis:B[l]--endfor cycle withcolor CouleurRemplis;}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Remplis}[\PfCTestRemplis]% - \xintifboolexpr{\PfCTestRemplis==0}{% - \immediate\write\turtle@out{tt:=0; - TotalRemplis:=0; CouleurRemplis:=\PfCListeCmdTortue[\compteurcnt,2];}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Fin}[\PfCTestFinPour]% - \xintifboolexpr{\PfCTestFinPour==0}{% - \immediate\write\turtle@out{enddef;k:=0;}% - \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Pour}[\PfCTestPour]% - \xintifboolexpr{\PfCTestPour==0}{% - \immediate\write\turtle@out{vardef \PfCListeCmdTortue[\compteurcnt,2](expr \PfCListeCmdTortue[\compteurcnt,3])=}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Rep}[\PfCTestRep]% - \xintifboolexpr{\PfCTestRep==0}{% - \xdef\PfCNbRep{\fpeval{\PfCNbRep+1}}% - \immediate\write\turtle@out{nb[\PfCNbRep]:=0;}% - \immediate\write\turtle@out{forever:}% - \immediate\write\turtle@out{nb[\PfCNbRep]:=nb[\PfCNbRep]+1;}% - % \immediate\write\turtle@out{nbcomp:=nbcomp+1;} - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{)}[\PfCTestParaF]% - \xintifboolexpr{\PfCTestParaF==0}{% - \immediate\write\turtle@out{exitif nb[\PfCNbRep]=\PfCListeCmdTortue[\compteurcnt,2];}% - \immediate\write\turtle@out{endfor;}% - \xdef\PfCNbRep{\fpeval{\PfCNbRep-1}}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{(}[\PfCTestParaO]% - \xintifboolexpr{\PfCTestParaO==0}{% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Bc}[\PfCTestBc]% - \xintifboolexpr{\PfCTestBc==0}{% - \immediate\write\turtle@out{Bc;}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Lc}[\PfCTestLc]% - \xintifboolexpr{\PfCTestLc==0}{% - \immediate\write\turtle@out{Lc;}% - }{% - \StrCompare{\PfCListeCmdTortue[\compteurcnt,1]}{Tlp}[\PfCTestTlp]% - \xintifboolexpr{\PfCTestTlp==0}{% - \immediate\write\turtle@out{Teleporter(\PfCListeCmdTortue[\compteurcnt,2],\PfCListeCmdTortue[\compteurcnt,3]);}% - }{% - \immediate\write\turtle@out{\PfCListeCmdTortue[\compteurcnt,1](\PfCListeCmdTortue[\compteurcnt,2]);}% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - % \immediate\write\turtle@out{Tortue:=currentpicture;Tortue enddef;}% - % \immediate\write\turtle@out{draw Dessin;}% - \ifboolKV[Tortue]{TortueD}{% - \immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[0] scaled 1.5,A[0]);}% - }{}% - \ifboolKV[Tortue]{Etapes}{% - \immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[Total] scaled 1.5,A[Total]);}% - }{\ifboolKV[Tortue]{TortueF}{\immediate\write\turtle@out{drawoptions(withcolor DarkGreen);label(btex \noexpand\Large\noexpand\ding{40} etex rotated RetiensAngle[k] scaled 1.5,A[k]);}}{}}% - \immediate\closeout\turtle@out% - \restorecomparemode% -}% -\makeatother - -\NewDocumentCommand\Tortue{o m}{% - \useKVdefault[Tortue]% - \setKV[Tortue]{#1}% - \TortueCreationFichier[#1]{#2}% - \TortueDessinFinal% -} - -\NewDocumentCommand\TortueDessinFinal{}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCTurtleTestRemplis.mp; - - pair Depart; - Depart=\useKV[Tortue]{Depart} if \useKV[Tortue]{Cases}:+(15,15)fi; - pair A[],B[]; - A[0]=\useKV[Tortue]{Pas}*(xpart(Depart),ypart(Depart)); - B[0]=A[0]; - Epaisseur:=\useKV[Tortue]{Epaisseur}; - Angle:=0; - numeric RetiensAngle[]; - RetiensAngle[0]=\useKV[Tortue]{Angle}; - - pair VecteurDpt; - VecteurDpt=(1,0) rotated RetiensAngle[0]; - input \useKV[Tortue]{Nom}.turtle; - \end{mplibcode} - \else - \fi -}% - -%%% -% Le compte est bon -%%% -\setKVdefault[CompteBon]{NombreCalculs=5,NombrePlaques=4,Solution=false,Relatifs=false,Original=false,Graines=false,Plaques=6} -\defKV[CompteBon]{Graine=\setKV[CompteBon]{Graines}}% - -\makeatletter - -\newcommand\PfC@CreerListeCalculs[4]{% - \xdef\PfC@ListeCalculs{% - #1+#2+#3+#4,% - #1+#2+#3*#4/#1+#3*#4+#2/#3*#4+#1+#2,% - #1+#3+#2*#4/#1+#2*#4+#3/#2*#4+#1+#3,% - #1+#4+#2*#3/#1+#2*#3+#4/#2*#3+#1+#4,% - #2+#3+#1*#4/#2+#1*#4+#3/#1*#4+#2+#3,% - #2+#4+#1*#3/#2+#1*#3+#4/#2+#4+#1*#3,% - #3+#4+#1*#2/#3+#1*#2+#4/#3+#4+#1*#2,% - #1*#2+#3*#4/#3*#4+#1*#2,% - #1*#3+#2*#4/#2*#4+#1*#3,% - #1*#4+#2*#3/#2*#3+#1*#4,% - #1*#2*#3+#4/#4+#1*#2*#3, - #1*#2*#4+#3/#3+#1*#2*#4,% - #1*#3*#4+#2/#2+#1*#3*#4,% - #2*#3*#4+#1/#1+#2*#3*#4,% - #1*#2*#3*#4,% - #1+(#2+#3)*#4/(#2+#3)*#4+#1/#1+#4*(#2+#3)/#4*(#2+#3)+#1,% - #1+(#2+#4)*#3/(#2+#4)*#3+#1/#1+#3*(#2+#4)/#3*(#2+#4)+#1,% - #1+(#3+#4)*#2/(#3+#4)*#2+#1/#1+#2*(#3+#4)/#2*(#3+#4)+#1,% - #2+(#1+#3)*#4,% - #2+(#1+#4)*#3,% - #2+(#3+#4)*#1,% - #3+(#1+#2)*#4,% - #3+(#1+#4)*#2,% - #3+(#2+#4)*#1,% - #4+(#1+#2)*#3,% - #4+(#1+#3)*#2,% - #4+(#2+#3)*#1,% - (#1+#2+#3)*#4,% - (#1+#2+#4)*#3,% - (#1+#3+#4)*#2,% - (#2+#3+#4)*#1,% - (#1+#2)*(#3+#4),% - (#1+#3)*(#2+#4),% - (#1+#4)*(#2+#3)% - }% - \ifboolKV[CompteBon]{Relatifs}{% - \xdef\PfC@ListeCalculs{% - \PfC@ListeCalculs,% - #1-#2-#3-#4,% - #1-#2-#3*#4/#1-#3*#4-#2/#3*#4-#1-#2,% - #1-#3-#2*#4/#1-#2*#4-#3/#2*#4-#1-#3,% - #1-#4-#2*#3/#1-#2*#3-#4/#2*#3-#1-#4,% - #2-#3-#1*#4/#2-#1*#4-#3/#1*#4-#2-#3,% - #2-#4-#1*#3/#2-#1*#3-#4/#2-#4-#1*#3,% - #3-#4-#1*#2/#3-#1*#2-#4/#3-#4-#1*#2,% - #1*#2-#3*#4/#3*#4-#1*#2,% - #1*#3-#2*#4/#2*#4-#1*#3,% - #1*#4-#2*#3/#2*#3-#1*#4,% - #1*#2*#3-#4/#4-#1*#2*#3, - #1*#2*#4-#3/#3-#1*#2*#4,% - #1*#3*#4-#2/#2-#1*#3*#4,% - #2*#3*#4-#1/#1-#2*#3*#4,% - #1*#2*#3*#4,% - #1-(#2-#3)*#4/(#2-#3)*#4-#1/#1-#4*(#2-#3)/#4*(#2-#3)-#1,% - #1-(#2-#4)*#3/(#2-#4)*#3-#1/#1-#3*(#2-#4)/#3*(#2-#4)-#1,% - #1-(#3-#4)*#2/(#3-#4)*#2-#1/#1-#2*(#3-#4)/#2*(#3-#4)-#1,% - #2-(#1-#3)*#4,% - #2-(#1-#4)*#3,% - #2-(#3-#4)*#1,% - #3-(#1-#2)*#4,% - #3-(#1-#4)*#2,% - #3-(#2-#4)*#1,% - #4-(#1-#2)*#3,% - #4-(#1-#3)*#2,% - #4-(#2-#3)*#1,% - (#1-#2-#3)*#4,% - (#1-#2-#4)*#3,% - (#1-#3-#4)*#2,% - (#2-#3-#4)*#1,% - (#1-#2)*(#3-#4),% - (#1-#3)*(#2-#4),% - (#1-#4)*(#2-#3)% - }% - }{}% -}% - -\newtoks\tokPfCCBRappels -\def\UpdatetoksCB#1\nil{\addtotok\tokPfCCBRappels{#1,}}% - -\NewDocumentCommand\PfCCompteBonOriginal{o}{% - \useKVdefault[CompteBon] - \setKV[CompteBon]{#1}% - %On définit la liste des cartes - \xdef\PfCCBListeCartes{1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,25,50,75,100}% - \MelangeListe{\PfCCBListeCartes}{\useKV[CompteBon]{Plaques}} - \readlist*\PfCCBListeTirage{\faa} - \MelangeListe{\faa}{\useKV[CompteBon]{Plaques}} - \readlist*\PfCCBListeTirageAffiche{\faa} - %%Tirage ok - \xdef\PfCCBResultatFinal{1001}% - \whiledo{\PfCCBResultatFinal>1000}{% - \xdef\PfCListeATrier{\PfCCBListeTirage[1]}% - \xintFor* ##1 in{\xintSeq{2}{\useKV[CompteBon]{Plaques}}}\do{% - \xdef\PfCListeATrier{\PfCListeATrier,\PfCCBListeTirage[##1]}% - }% - % - \tokPfCCBRappels{}% - \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[CompteBon]{Plaques}-1}}}\do{% - \MelangeListe{\PfCListeATrier}{2} - \readlist*\PfCCBListeTirageIntermediaire{\faa} - \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==1 || \PfCCBListeTirageIntermediaire[2]==1}{% - % On ne fait pas de multiplication par 1 - \xdef\PfCCBAlea{\fpeval{randint(1,2)}}% - \xintifboolexpr{\PfCCBAlea==1}{% - \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} - \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% - }{% - \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==\PfCCBListeTirageIntermediaire[2]}{% - \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} - }{% - \xdef\PfCCBTest{\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}-\fpeval{min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}=\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])-min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}} - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{abs(\PfCCBListeTirageIntermediaire[1]-\PfCCBListeTirageIntermediaire[2])}} - }% - \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% - }% - \xdef\PfCListeATrier{\fii,\PfCCBResultat}% - }{% - \xdef\PfCCBAlea{\fpeval{randint(1,3)}}% - \xintifboolexpr{\PfCCBAlea==1}{% - \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} - \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% - }{% - \xintifboolexpr{\PfCCBAlea==2}{% - \xintifboolexpr{\PfCCBListeTirageIntermediaire[1]==\PfCCBListeTirageIntermediaire[2]}{% - \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}}% - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]+\PfCCBListeTirageIntermediaire[2]}} - }{% - \xdef\PfCCBTest{\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}-\fpeval{min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}=\fpeval{max(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])-min(\PfCCBListeTirageIntermediaire[1],\PfCCBListeTirageIntermediaire[2])}} - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{abs(\PfCCBListeTirageIntermediaire[1]-\PfCCBListeTirageIntermediaire[2])}} - }% - \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% - }{% - \xdef\PfCCBTest{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]=\fpeval{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]}} - \expandafter\UpdatetoksCB\PfCCBTest\nil% - \xdef\PfCCBResultat{\fpeval{\PfCCBListeTirageIntermediaire[1]*\PfCCBListeTirageIntermediaire[2]}} - \xintifboolexpr{\PfCCBResultat>10000}{\xintBreakFor\xdef\PfCCBResultat{10000}}{}% - } - }% - \xdef\PfCListeATrier{\fii,\PfCCBResultat}% - }% - }% - \xintifboolexpr{\useKV[CompteBon]{Plaques}>5}{\xintifboolexpr{\PfCCBResultat<100}{\xdef\PfCCBResultat{1001}}{}}{}% - \xdef\PfCCBResultatFinal{\PfCCBResultat}% - }% - \begin{center} - \textbf{\PfCCBResultatFinal} - - \fbox{\PfCCBListeTirage[1]} \xintFor* ##1 in{\xintSeq{2}{\useKV[CompteBon]{Plaques}}}\do{\qquad \fbox{\PfCCBListeTirage[##1]}}% - \end{center} - \xdef\PfCCBListeRappels{\the\tokPfCCBRappels} - \setsepchar[*]{,*=}\ignoreemptyitems - \readlist*\PfCCBDecompositionEtapes{\PfCCBListeRappels} - \reademptyitems - \ifboolKV[CompteBon]{Solution}{% - \begin{align*} - \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[CompteBon]{Plaques}-1}}}\do{ - \StrSubstitute{\PfCCBDecompositionEtapes[##1,1]}{*}{\times}[\PfCCBAffiche]\PfCCBAffiche&=\PfCCBDecompositionEtapes[##1,2]\xintifForLast{\\}{} - } - \end{align*} - }{}% -}% - -\NewDocumentCommand\CompteBon{o}{% - \useKVdefault[CompteBon]% - \setKV[CompteBon]{#1}% - \ifboolKV[CompteBon]{Graines}{\PfCGraineAlea{\useKV[CompteBon]{Graine}}}{}% - \ifboolKV[CompteBon]{Original}{% - \PfCCompteBonOriginal[#1]% - }{% - % on choisit NombrePlaques parmi la liste des nombres 1 à 9, 10/25/50/75/100, La moitié +1 devant appartenir à 1..9 - \xdef\PfCCBListeEntiers{2,3,4,5,6,7,8,9}% - \xdef\PfCCBListeMultiples{10,25,50,75,100}% - \xdef\PfCCBNbPlaqueEntiers{\fpeval{floor(\useKV[CompteBon]{NombrePlaques}/2)+1}}% - \xdef\PfCCBNbPlaqueMultiples{\useKV[CompteBon]{NombrePlaques}-\PfCCBNbPlaqueEntiers}% - \MelangeListe{\PfCCBListeEntiers}{\PfCCBNbPlaqueEntiers}% - \setsepchar{,}% - \ignoreemptyitems% - \readlist*\PfCCBListeEntiersChoisis{\faa}% - \MelangeListe{\PfCCBListeMultiples}{\PfCCBNbPlaqueMultiples}% - \ignoreemptyitems% - \readlist*\PfCCBListeMultiplesChoisis{\faa}% - \reademptyitems% - \xdef\PfCCBListeToutesCartes{}% - \foreachitem\compteur\in\PfCCBListeEntiersChoisis{% - \xdef\PfCCBListeToutesCartes{\PfCCBListeToutesCartes{},\PfCCBListeEntiersChoisis[\compteurcnt]}% - }% - \foreachitem\compteur\in\PfCCBListeMultiplesChoisis{% - \xdef\PfCCBListeToutesCartes{\PfCCBListeToutesCartes{},\PfCCBListeMultiplesChoisis[\compteurcnt]}% - }% - \MelangeListe{\PfCCBListeToutesCartes}{4}% - \readlist*\PfCCBListeFinaleCartes{\faa}% - % Choix des calculs - \xdef\PfC@CalculUn{\PfCCBListeFinaleCartes[1]}% - \xdef\PfC@CalculDeux{\PfCCBListeFinaleCartes[2]}% - \xdef\PfC@CalculTrois{\PfCCBListeFinaleCartes[3]}% - \xdef\PfC@CalculQuatre{\PfCCBListeFinaleCartes[4]}% - \PfC@CreerListeCalculs{\PfC@CalculUn}{\PfC@CalculDeux}{\PfC@CalculTrois}{\PfC@CalculQuatre} - \MelangeListe{\PfC@ListeCalculs}{\useKV[CompteBon]{NombreCalculs}}% - \setsepchar[*]{,*/}% - \readlist*\PfC@ListeCalculsChoisis{\faa}% - \begin{center} - \setlength{\tabcolsep}{0.5\tabcolsep} - % Le tableau des nombres - \begin{NiceTabular}{m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}} - \Block[draw]{}{\PfCCBListeFinaleCartes[1]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[2]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[3]}&&\Block[draw]{}{\PfCCBListeFinaleCartes[4]} - \end{NiceTabular} - - \bigskip - - % Le tableau des calculs% - \begin{NiceTabular}{m{30pt}cccm{20pt}m{10pt}m{20pt}m{10pt}m{20pt}m{10pt}m{20pt}} - \xintFor* ##1 in{\xintSeq{1}{\useKV[CompteBon]{NombreCalculs}}}\do{% - \Block[draw]{}{\num{\fpeval{\PfC@ListeCalculsChoisis[##1,1]}}}&&$=$&&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}&\Block{}{~}&\Block[draw]{}{~}\\ - \ifboolKV[CompteBon]{Solution}{\Block{1-11}{\footnotesize Une solution : \StrSubstitute[0]{\PfC@ListeCalculsChoisis[##1,1]}{*}{\times}[\PfCEcritureCalcul]$\PfCEcritureCalcul$}}{}\\ - }% - \end{NiceTabular} - \end{center} - }% -}% - -%%% -% Nombre Astral -%%% -\setKVdefault[NombreAstral]{Solution=false,Graines=false,Echelle=1} -\defKV[NombreAstral]{Graine=\setKV[NombreAstral]{Graines}}% - -\newtoks\toklisteNANombres% -\newtoks\toklisteNAMelange% -\def\UpdatetoksNANombres#1\nil{\addtotok\toklisteNANombres{"#1",}}% -\def\UpdatetoksNAMelange#1\nil{\addtotok\toklisteNAMelange{#1,}}% - -\NewDocumentCommand\NombreAstral{o}{% - \toklisteNANombres{}% - \toklisteNAMelange{}% - \useKVdefault[NombreAstral]% - \setKV[NombreAstral]{#1}% - \ifboolKV[NombreAstral]{Graines}{\PfCGraineAlea{\useKV[NombreAstral]{Graine}}}{}% - \xdef\PfCNACible{\fpeval{2*randint(25,45)}}% - \xdef\PfCNAListeNombres{}% - \xintFor* ##1 in{\xintSeq{11}{\fpeval{floor(\PfCNACible/3)}}}\do{% - \xdef\PfCNAListeNombres{\PfCNAListeNombres ##1,}% - }% - \MelangeListe{\PfCNAListeNombres}{5}% - \setsepchar{,}\ignoreemptyitems% - \readlist*\PfCNAListeNombresBase{\faa}% - \reademptyitems - \readlist*\PfCNAListeNombres{% - \PfCNAListeNombresBase[1],% - \PfCNAListeNombresBase[2],% - \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[5]-\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[3]},% - \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[5]},% - \PfCNAListeNombresBase[3],% - \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[3]-\PfCNAListeNombresBase[5]-\PfCNAListeNombresBase[1]},% - \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[4]-\PfCNAListeNombresBase[1]},% - \fpeval{0.5*\PfCNACible+\PfCNAListeNombresBase[1]-\PfCNAListeNombresBase[2]-\PfCNAListeNombresBase[3]},% - \PfCNAListeNombresBase[4],% - \PfCNAListeNombresBase[5]% - }% - \foreachitem\compteur\in\PfCNAListeNombres{\expandafter\UpdatetoksNANombres\compteur\nil}% - \xdef\PfCNAListeAEffacer{1,2,3,4,5,6,7,8,9,10}% - \MelangeListe{\PfCNAListeAEffacer}{6}% - \ignoreemptyitems% - \readlist*\PfCNAListeMelange{\faa}% - \reademptyitems% - \foreachitem\compteur\in\PfCNAListeMelange{\expandafter\UpdatetoksNAMelange\compteur\nil}% - \BuildNombreAstral{\the\toklisteNANombres}{\the\toklisteNAMelange}% -}% - -\NewDocumentCommand\BuildNombreAstral{m m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - Cible=\PfCNACible; - - boolean Solution; - Solution:=\useKV[NombreAstral]{Solution}; - - Echelle:=\useKV[NombreAstral]{Echelle}; - - string Rappel[]; - Rayon:=4cm; - - path cc,ca[]; - cc=cercles((0,0),Rayon); - - pair A[],C[],D[]; - for k=1 upto 5: - C[k]=pointarc(cc,90+(k-1)*72); - endfor; - - D1=C2+30*unitvector(C2-C4); - D2=C2+30*unitvector(C2-C5); - D3=C3+30*unitvector(C3-C1); - D4=C4+30*unitvector(C4-C1); - D5=C5+30*unitvector(C5-C3); - - drawarrow C2--D1; - drawarrow C2--D2; - drawarrow C3--D3; - drawarrow C4--D4; - drawarrow C5--D5; - - label.ulft(TEX("\bfseries\Large"&decimal(Cible)),D1); - label.lft(TEX("\bfseries\Large"&decimal(Cible)),D2); - label.llft(TEX("\bfseries\Large"&decimal(Cible)),D3); - label.lrt(TEX("\bfseries\Large"&decimal(Cible)),D4); - label.urt(TEX("\bfseries\Large"&decimal(Cible)),D5); - - trace polygone(C1,C3,C5,C2,C4) withpen (pencircle scaled 8); - A1=C1; - A2=C2; - A9=C3; - A10=C4; - A5=C5; - A3=segment(C1,C3) intersectionpoint segment(C2,C5); - A4=segment(C1,C4) intersectionpoint segment(C2,C5); - A6=segment(C1,C3) intersectionpoint segment(C2,C4); - A7=segment(C1,C4) intersectionpoint segment(C3,C5); - A8=segment(C2,C4) intersectionpoint segment(C3,C5); - for k=1 upto 10: - ca[k]=cercles(A[k],0.6u); - fill ca[k] withcolor white; - trace ca[k]; - endfor; - vardef Affichage(text t)= - n:=0; - for p_=t: - n:=n+1; - Rappel[n]=p_; - label(TEX("\Large"&p_),A[n]); - endfor; - enddef; - - vardef Suppression(text t)= - k:=0; - for p_=t: - k:=k+1; - fill ca[p_] withcolor white; - trace ca[p_]; - label(TEX("\Large"&Rappel[p_]),u*(-7,5.6-1.5k)); - trace cercles(u*(-7,5.6-1.5k),0.6u); - endfor; - enddef; - - Affichage(#1); - if Solution=false: - Suppression(#2); - fi; - picture recap;% - recap:=currentpicture scaled Echelle;% - currentpicture:=nullpicture;% - draw recap;% - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - Echelle:=\useKV[NombreAstral]{Echelle}; - Cible=\PfCNACible;boolean Solution;Solution:=\useKV[NombreAstral]{Solution}; - string Rappel[]; - n:=0; - for p_=#1: - n:=n+1; - Rappel[n]=p_; - endfor; - }] - - Rayon:=4cm; - - path cc,ca[]; - cc=cercles((0,0),Rayon); - - pair A[],C[],D[]; - for k=1 upto 5: - C[k]=pointarc(cc,90+(k-1)*72); - endfor; - - D1=C2+30*unitvector(C2-C4); - D2=C2+30*unitvector(C2-C5); - D3=C3+30*unitvector(C3-C1); - D4=C4+30*unitvector(C4-C1); - D5=C5+30*unitvector(C5-C3); - - drawarrow C2--D1; - drawarrow C2--D2; - drawarrow C3--D3; - drawarrow C4--D4; - drawarrow C5--D5; - - label.ulft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)&""),D1); - label.lft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D2); - label.llft(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D3); - label.lrt(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D4); - label.urt(LATEX("\noexpand\bfseries\noexpand\Large"&decimal(Cible)),D5); - - trace polygone(C1,C3,C5,C2,C4) withpen (pencircle scaled 8); - A1=C1; - A2=C2; - A9=C3; - A10=C4; - A5=C5; - A3=segment(C1,C3) intersectionpoint segment(C2,C5); - A4=segment(C1,C4) intersectionpoint segment(C2,C5); - A6=segment(C1,C3) intersectionpoint segment(C2,C4); - A7=segment(C1,C4) intersectionpoint segment(C3,C5); - A8=segment(C2,C4) intersectionpoint segment(C3,C5); - for k=1 upto 10: - ca[k]=cercles(A[k],0.6u); - fill ca[k] withcolor white; - trace ca[k]; - endfor; - vardef Affichage(text t)= - n:=0; - for p_=t: - n:=n+1; - label(LATEX("\noexpand\Large"&Rappel[n]),A[n]); - endfor; - enddef; - - vardef Suppression(text t)= - k:=0; - for p_=t: - k:=k+1; - fill ca[p_] withcolor white; - trace ca[p_]; - label(LATEX("\noexpand\Large"&Rappel[p_]),u*(-7,5.6-1.5k)); - trace cercles(u*(-7,5.6-1.5k),0.6u); - endfor; - enddef; - - Affichage(#1); - if Solution=false: - Suppression(#2); - fi; - - picture recap;% - recap:=currentpicture scaled Echelle;% - currentpicture:=nullpicture;% - draw recap;% - \end{mpost} - \fi -}% - -%%% -% Mentalo -%%% -\NewDocumentCommand\PfCNum{m}{% - \xintifboolexpr{#1<0}{(\num{#1})}{\num{#1}}% -}% - -\setKVdefault[Mentalo]{Questions=10,ValeurMin=1,ValeurMax=15} - -\NewDocumentCommand\Mentalo{o m}{% - \useKVdefault[Mentalo]% - \setKV[Mentalo]{#1}% - \xdef\PfCMentaloEtages{\fpeval{\useKV[Mentalo]{Questions}+1}} +\newcommand\MelangeListe[2]{% + % #1 Liste à mélanger + % #2 Nombre d'éléments à conserver \setsepchar{,}\ignoreemptyitems% - \readlist*\PfCMentaloListeOperations{#2}% - \reademptyitems% - \setlength{\tabcolsep}{0.25\tabcolsep} - \renewcommand{\arraystretch}{1.5} - \begin{NiceTabular}{*{\fpeval{\PfCMentaloEtages}}{m{5pt}}m{20pt}cm{20pt}cl*{\fpeval{\PfCMentaloEtages}}{m{5pt}}*{5}{m{15pt}}*{1}{m{10pt}}} - \Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}% - \Block[draw,fill=gray!15]{1-5}{Arrivée}&&&&&\Block{1-\fpeval{\PfCMentaloEtages}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages}}}\do{&}\\ - \xintFor* ##1 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-1}}}\do{% - \Block{1-\fpeval{\PfCMentaloEtages-##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-##1}}}\do{&}% - \Block[borders={top,left,bottom}]{1-\fpeval{##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{##1}}}\do{&}% - \Block[borders={top,bottom}]{1-1}{% - \xdef\PfCMentaloPremierTerme{\fpeval{randint(\useKV[Mentalo]{ValeurMin},\useKV[Mentalo]{ValeurMax})}}% - \num{\PfCMentaloPremierTerme}}&\Block[borders={top,bottom}]{1-1}{% - \xintifboolexpr{\PfCMentaloListeOperationslen==1}{% - \StrSubstitute{\PfCMentaloListeOperations[1]}{*}{\times}[\PfCCBAffiche]$\PfCCBAffiche$% - }{% - \StrSubstitute{\PfCMentaloListeOperations[##1]}{*}{\times}[\PfCCBAffiche]$\PfCCBAffiche$% - }% - }&% - \Block[borders={top,bottom}]{1-1}{\xdef\PfCMentaloDeuxiemeTerme{\fpeval{randint(\useKV[Mentalo]{ValeurMin},\useKV[Mentalo]{ValeurMax})}}% - \PfCNum{\PfCMentaloDeuxiemeTerme}}&\Block[borders={top,bottom}]{1-1}{$=$}&\Block[borders={top,bottom}]{1-1}{\pointilles[20pt]}&% - \Block[borders={top,right,bottom}]{1-\fpeval{##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{##1}}}\do{&}% - \Block{1-\fpeval{\PfCMentaloEtages-##1}}{~}\xintFor* ##2 in{\xintSeq{1}{\fpeval{\PfCMentaloEtages-##1}}}\do{&}% - &&&&\Block{1-2}{% - \xintifboolexpr{\PfCMentaloListeOperationslen==1}{% - \num{\fpeval{\PfCMentaloPremierTerme\PfCMentaloListeOperations[1]\PfCMentaloDeuxiemeTerme}} - }{% - \num{\fpeval{\PfCMentaloPremierTerme\PfCMentaloListeOperations[##1]\PfCMentaloDeuxiemeTerme}} - }% - }&\\ - }% - \Block[draw,fill=gray!15]{1-\fpeval{2*\PfCMentaloEtages+5}}{Départ}\xintFor* ##2 in{\xintSeq{1}{\fpeval{2*\PfCMentaloEtages+5}}}\do{&}\\% - \CodeAfter - \tikz\draw[dashed] (1-|\fpeval{5+5+2+2*\PfCMentaloEtages-2})--(last-|\fpeval{5+5+2+2*\PfCMentaloEtages-2}); - \end{NiceTabular} -}% - -%%% -% Calculs Croises -%%% -\setKVdefault[CalculsCroises]{Largeur=20pt,Solution=false,Inverse=false,Creation=false,Graines=false,Vide=false,Couleur=LightGray,Negatifs=false,Aide=false} -\defKV[CalculsCroises]{Graine=\setKV[CalculsCroises]{Graines}}% -\defKV[CalculsCroises]{ListeNombres=\setKV[CalculsCroises]{Aide}}% - -\newlength\PfCCalculsCroises% -\NewDocumentCommand\CalculsCroises{o m}{% - \useKVdefault[CalculsCroises]% - \savecomparemode% - \comparestrict% - \setKV[CalculsCroises]{#1}% - \colorlet{PfCCouleurCC}{\useKV[CalculsCroises]{Couleur}}% - \setlength{\PfCCalculsCroises}{\useKV[CalculsCroises]{Largeur}+\tabcolsep}% - \ifboolKV[CalculsCroises]{Inverse}{\setKV[CalculsCroises]{Solution}}{}% - \ifboolKV[CalculsCroises]{Creation}{% - \ifboolKV[CalculsCroises]{Graines}{\PfCGraineAlea{\useKV[CalculsCroises]{Graine}}}{}% - \ifboolKV[CalculsCroises]{Negatifs}{% - \xdef\PfCCCFoo{-1,-2,-3,-4,-5,-6,-7,-8,-9}% - }{% - \xdef\PfCCCFoo{1,2,3,4,5,6,7,8,9}% - }% - \MelangeListe{\PfCCCFoo}{9}% - \setsepchar{,}% - \readlist*\PfCListeCCNb{\faa}% - \readlist*\PfCListeCCOp{#2}% - \xdef\PfCCCfoo{\useKV[CalculsCroises]{ListeNombres}}% - \readlist*\PfCListeCCAide{\PfCCCfoo}% - \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[1]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[1]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[1]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[1]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[1]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[2]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[2]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[2]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[2]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[2]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[3]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[3]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[3]}}{}% - }% - }{}% - }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[1]\PfCListeCCOp[1]\PfCListeCCNb[2]\PfCListeCCOp[2]\PfCListeCCNb[3]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[3]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[3]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[4]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[4]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[5]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[5]$}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[4]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[4]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[4]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[6]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[6]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[5]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[5]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[5]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[7]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[7]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[6]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[6]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[6]}}{}% - }% - }{}% - }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[4]\PfCListeCCOp[6]\PfCListeCCNb[5]\PfCListeCCOp[7]\PfCListeCCNb[6]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[8]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[8]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[9]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[9]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[10]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[10]$}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[7]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[7]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[7]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[11]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[11]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[8]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[8]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[8]}}{}% - }% - }{}% - }}&\StrCompare{\PfCListeCCOp[12]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[12]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCNb[9]}}{% - \ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCNb[9]==\PfCListeCCAide[##1]}{\num{\PfCListeCCNb[9]}}{}% - }% - }{}% - }}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[7]\PfCListeCCOp[11]\PfCListeCCNb[8]\PfCListeCCOp[12]\PfCListeCCNb[9]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[1]\PfCListeCCOp[3]\PfCListeCCNb[4]\PfCListeCCOp[8]\PfCListeCCNb[7]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[2]\PfCListeCCOp[4]\PfCListeCCNb[5]\PfCListeCCOp[9]\PfCListeCCNb[8]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCNb[3]\PfCListeCCOp[5]\PfCListeCCNb[6]\PfCListeCCOp[10]\PfCListeCCNb[9]}}}}\\ - \CodeAfter - \tikz\draw (1-|1) rectangle (6-|6); - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (1-|##1) -- (6-|##1); - }% - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (##1-|1) -- (##1-|6); - }% - \end{NiceTabular} - }{% - \ifboolKV[CalculsCroises]{Vide}{% - \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} - \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block[fill=black]{}{}&\Block{}{}&\Block[fill=black]{}{}&\Block{}{}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block[fill=black]{}{}&\Block{}{}&\Block[fill=black]{}{}&\Block{}{}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block{}{}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{}\\ - \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{}\\ - \CodeAfter - \tikz\draw (1-|1) rectangle (6-|6); - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (1-|##1) -- (6-|##1); - }% - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (##1-|1) -- (##1-|6); - }% - \end{NiceTabular} - }{% - \readlist*\PfCListeCCOp{#2}% - \xdef\PfCCCfoo{\useKV[CalculsCroises]{ListeNombres}}% - \readlist*\PfCListeCCAide{\PfCCCfoo}% - \begin{NiceTabular}{*{6}{m{\useKV[CalculsCroises]{Largeur}}}} - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[1]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[1]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[1]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[2]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[2]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[3]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[3]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[3]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[4]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[4]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[5]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[5]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[5]}}{}% - }% - }{}% -}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[1]\PfCListeCCOp[2]\PfCListeCCOp[3]\PfCListeCCOp[4]\PfCListeCCOp[5]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[6]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[6]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[7]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[7]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[8]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[8]$}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[9]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[9]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[9]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[10]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[10]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[11]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[11]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[11]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[12]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[12]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[13]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[13]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[13]}}{}% - }% - }{}% -}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[9]\PfCListeCCOp[10]\PfCListeCCOp[11]\PfCListeCCOp[12]\PfCListeCCOp[13]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\StrCompare{\PfCListeCCOp[14]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[14]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[15]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[15]$}}&\Block[fill=black]{}{~}&\StrCompare{\PfCListeCCOp[16]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[16]$}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[17]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[17]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[17]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[18]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[18]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[19]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[19]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[19]}}{}% - }% - }{}% -}}&\StrCompare{\PfCListeCCOp[20]}{*}[\PfCTestEtoile]\Block{}{\xintifboolexpr{\PfCTestEtoile==0}{$\times$}{$\PfCListeCCOp[20]$}}&\Block{}{\ifboolKV[CalculsCroises]{Solution}{\num{\PfCListeCCOp[21]}}{\ifboolKV[CalculsCroises]{Aide}{% - \xintFor* ##1 in{\xintSeq{1}{\PfCListeCCAidelen}}\do{% - \xintifboolexpr{\PfCListeCCOp[21]==\PfCListeCCAide[##1]}{\num{\PfCListeCCOp[21]}}{}% - }% - }{}% -}}&\Block[borders={bottom,right,top},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[17]\PfCListeCCOp[18]\PfCListeCCOp[19]\PfCListeCCOp[20]\PfCListeCCOp[21]}}}}\\ - \rule{0pt}{\PfCCalculsCroises}\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[1]\PfCListeCCOp[6]\PfCListeCCOp[9]\PfCListeCCOp[14]\PfCListeCCOp[17]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[3]\PfCListeCCOp[7]\PfCListeCCOp[11]\PfCListeCCOp[15]\PfCListeCCOp[19]}}}}&&\Block[borders={left,bottom,right},fill=PfCCouleurCC]{}{\ifboolKV[CalculsCroises]{Inverse}{}{\num{\fpeval{\PfCListeCCOp[5]\PfCListeCCOp[8]\PfCListeCCOp[13]\PfCListeCCOp[16]\PfCListeCCOp[21]}}}}\\ - \CodeAfter - \tikz\draw (1-|1) rectangle (6-|6); - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (1-|##1) -- (6-|##1); - }% - \xintFor* ##1 in{\xintSeq{2}{5}}\do{% - \tikz\draw (##1-|1) -- (##1-|6); - }% - \end{NiceTabular} - }% - }% - \restorecomparemode% -}% - -%%% -% Shikaku -%%% -\newcounter{PfCShikakuNom} -\setcounter{PfCShikakuNom}{0} - -\setKVdefault[Shikaku]{Couleur=Purple,Taille=4,Largeur=2em,Solution=false,CodeAfter={},Creation=false,TailleHor=10,TailleVer=10,TailleHorMax=5,TailleVerMax=5,Nom=Shikaku\PfCShikakuNom} - -\newlength\PfCShikakuh -\newlength\PfCShikakuv - -\NewDocumentCommand\Shikaku{o m}{% - \stepcounter{PfCShikakuNom}% - \useKVdefault[Shikaku]% - \setKV[Shikaku]{#1}% - \ifboolKV[Shikaku]{Creation}{% - \ifluatex\else\PackageWarning{ProfCollege}{La création automatique de Shikaku n'est disponible qu'avec LuaLaTeX.}\fi% - \ifboolKV[Shikaku]{Solution}{% - \ShikakuCreationSolution% - }{% - \ShikakuCreation% - }% - }{% - \setlength{\PfCShikakuv}{\useKV[Shikaku]{Largeur}+\tabcolsep}% - \setlength{\PfCShikakuh}{\useKV[Shikaku]{Largeur}}% - \colorlet{PfCCouleurShikaku}{\useKV[Shikaku]{Couleur}}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesSKK{#2}% - \savecomparemode% - \comparestrict% - \begin{NiceTabular}{*{\useKV[Shikaku]{Taille}}{m{\PfCShikakuh}}}[hvlines] - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Shikaku]{Taille}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[Shikaku]{Taille}}}\do{% - \rule{0pt}{\PfCShikakuv}% - \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{b}[\PfCTestb]% - \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{l}[\PfCTestl]% - \StrCompare{\ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]% - \xintifboolexpr{\PfCTestb==0}{% - \ifboolKV[Shikaku]{Solution}{% - \Block[borders={bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }{% - \Block[]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }% - }{% Testl - \xintifboolexpr{\PfCTestl==0}{% - \ifboolKV[Shikaku]{Solution}{% - \Block[borders={left,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }{% - \Block[]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }% - }{% Testlb - \xintifboolexpr{\PfCTestlb==0}{% - \ifboolKV[Shikaku]{Solution}{% - \Block[borders={left,bottom,tikz=PfCCouleurShikaku},line-width=2pt]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }{% - \Block[]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }% - }{% - \Block[]{1-1}{% - \ListeCasesSKK[\fpeval{\useKV[Shikaku]{Taille}*##1+##2},2]% - }% - }% - }% - }% - \xintifForLast{\\}{&}% - }% - }% - \CodeAfter% - \useKV[Shikaku]{CodeAfter}% - \ifboolKV[Shikaku]{Solution}{% - \tikz\draw[line width=2pt,PfCCouleurShikaku] (1-|1) rectangle (last-|last);% - }{}% - \end{NiceTabular}% - \restorecomparemode% - }% -}% - -\NewDocumentCommand\ShikakuCreation{}{% - \ifluatex% - \mplibforcehmode - \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}% - \begin{mplibcode}[\PfCNomShikaku]% - Taillehor=\useKV[Shikaku]{TailleHor}; - Taillever=\useKV[Shikaku]{TailleVer}; - - TailleMaxh=\useKV[Shikaku]{TailleHorMax}; - TailleMaxv=\useKV[Shikaku]{TailleVerMax}; - - u:=5mm; - - path R[],S[],RIso[],SIso[]; - numeric RAire[],SAire[]; - numeric RHor[],RVer[],SHor[],SVer[],RAngle[],SAngle[]; - - vardef RetiensLesInfosGenerales(expr depart,Lhor,Lver)= - R[k]:=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); - RIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); - RHor[k]=Lhor; - RVer[k]=Lver; - RAire[k]=Lhor*Lver; - RAngle[k]=ANGLE; - enddef; - - vardef RetiensLesInfosPourLaSuite(expr depart,Lhor,Lver)= - if Lver>0: - S[k]=polygone(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); - SIso[k]=iso(depart,depart+u*(Lhor,0),depart+u*(Lhor,-Lver),depart+u*(0,-Lver)); - SHor[k]=Lhor; - SVer[k]=Lver; - SAire[k]=Lhor*Lver; - SAngle[k]=ANGLE; - fi; - enddef; - - vardef RectangleAuto(expr aa,bb)= - save $; - path $; - $=polygone(aa,aa+(xpart(bb-aa),0),bb,bb-(xpart(bb-aa),0)); - $ - enddef; - - pair T[]; - - pair A[],B[]; - - A1=u*(0,Taillever); - A2-A1=u*(Taillehor,0); - A4=(0,0); - A3-A4=A2-A1; - - nbh=Taillehor div TailleMaxh; - nbv=Taillever div TailleMaxv; - - p:=0; - for l=0 upto nbv: - for k=0 upto nbh: - p:=p+1; - T[p]=A1+u*(k*TailleMaxh,-l*TailleMaxv); - if k<nbh: - Hor[p]=TailleMaxh; - else: - Hor[p]=Taillehor mod TailleMaxh; - fi; - if l<nbv: - Ver[p]=TailleMaxv; - else: - Ver[p]=Taillever mod TailleMaxv; - fi; - endfor; - endfor; - - Total:=p; - - vardef DecomposeUnRectangle(expr BASEA,THOR,TVER)= - TMAXV:=TVER; - pair BBASEA; - BTHOR:=THOR; - BTVER:=TVER; - BBASEA:=BASEA; - forever: - k:=k+1; - hor:=floor(1+uniformdeviate(BTHOR)); - ver:=floor(1+uniformdeviate(BTVER)); - RetiensLesInfosGenerales(BBASEA,hor,ver); - RetiensLesInfosPourLaSuite(BBASEA+u*(0,-ver),hor,TMAXV-ver); - BTHOR:=BTHOR-hor; - BTVER:=ver; - BBASEA:=BBASEA+u*(hor,0); - exitif BTHOR<1; - endfor; - enddef; - - k=0; - for l=1 upto Total: - if uniformdeviate(1)>0.5: - Angle[l]=180; - ANGLE:=Angle[l]; - else: - Angle[l]=0; - ANGLE:=Angle[l]; - fi; - DecomposeUnRectangle(T[l],Hor[l],Ver[l]); - endfor; - Totalk=k; - - picture RTEXT[],STEXT[]; - - drawoptions(withpen pencircle scaled 2); - for n=1 upto Totalk: - trace R[n] withcolor white; - RTEXT[n]=image( - label(decimal(RAire[n]),(0,0)); - ); - RTEXT[n]:=image( - trace rotation(RTEXT[n],center RTEXT[n],RAngle[n]) shifted ((point(0) of R[n]) shifted(u*(0.5+floor(uniformdeviate(RHor[n])),-0.5-floor(uniformdeviate(RVer[n]))))); - ); - trace RTEXT[n]; - endfor; - for n=1 upto Totalk: - if unknown S[n]: - else: - trace S[n] withcolor white; - STEXT[n]=image( - label(decimal(SAire[n]),(0,0)); - ); - STEXT[n]:=image( - trace rotation(STEXT[n],center STEXT[n],SAngle[n]) shifted ((point(0) of S[n]) shifted(u*(0.5+floor(uniformdeviate(SHor[n])),-0.5-floor(uniformdeviate(SVer[n]))))); - ); - trace STEXT[n]; - fi; - endfor; - clip currentpicture to polygone(A1,A2,A3,A4); - - picture CasesAvant[],CasesApres[]; - CasesAvant[0]=currentpicture; - - currentpicture:=nullpicture; - - drawoptions(withpen pencircle scaled 2); - for n=1 upto Totalk: - trace R[n]; - trace RTEXT[n]; - endfor; - for n=1 upto Totalk: - if unknown S[n]: - else: - trace S[n]; - trace STEXT[n]; - fi; - endfor; - clip currentpicture to polygone(A1,A2,A3,A4); - CasesApres[0]:=currentpicture; - - currentpicture:=nullpicture; - - for l=1 upto Total: - CasesAvant[l]=image(% - trace CasesAvant[0]; - clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l])); - ); - currentpicture:=nullpicture; - CasesApres[l]=image( - trace CasesApres[0]; - clip currentpicture to polygone(T[l],T[l]+u*(Hor[l],0),T[l]+u*(Hor[l],-Ver[l]),T[l]+u*(0,-Ver[l])); - ); - currentpicture:=nullpicture; - endfor; - - for l=1 upto Total: - trace rotation(CasesAvant[l],center CasesAvant[l],Angle[l]); - endfor; - - drawoptions(withpen pencircle scaled 2); - trace RectangleAuto(A1,A3); - drawoptions(); - for k=1 upto Taillehor-1: - trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2]; - endfor; - - for k=1 upto Taillever-1: - trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2]; - endfor; - \end{mplibcode} - \fi% -}% - -\NewDocumentCommand\ShikakuCreationSolution{}{% - \ifluatex% - \mplibforcehmode - \xdef\PfCNomShikaku{\useKV[Shikaku]{Nom}}% - \begin{mplibcode}[\PfCNomShikaku]% - for l=1 upto Total: - trace rotation(CasesApres[l],center CasesApres[l],Angle[l]); - endfor; - drawoptions(withpen pencircle scaled 2); - trace RectangleAuto(A1,A3); - drawoptions(); - for k=1 upto Taillehor-1: - trace (k/Taillehor)[A4,A3]--(k/Taillehor)[A1,A2]; - endfor; - - for k=1 upto Taillever-1: - trace (k/Taillever)[A4,A1]--(k/Taillever)[A3,A2]; - endfor; - \end{mplibcode} - \fi% -}% - -%%% -% Kakuro -%%% -\setKVdefault[Kakuro]{CouleurCase=LightGray,TLargeur=5,THauteur=5,Solution=false,Largeur=2em,Aide=false,CouleurSolution=Black,Tailles=false}%,Taille=5 -\defKV[Kakuro]{ListeNombres=\setKV[Kakuro]{Aide}}% -\defKV[Kakuro]{Taille=\setKV[Kakuro]{Tailles}}% - -\newlength\PfCKakuro% - -\NewDocumentCommand\Kakuro{o m}{% - \useKVdefault[Kakuro]% - \setKV[Kakuro]{#1}% - \ifboolKV[Kakuro]{Tailles}{% - \setKV[Kakuro]{THauteur=\useKV[Kakuro]{Taille}}% - \setKV[Kakuro]{TLargeur=\useKV[Kakuro]{Taille}}% - }{}% - \setlength{\PfCKakuro}{\useKV[Kakuro]{Largeur}+\tabcolsep}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesKK{#2}% - \setsepchar{,}% - \xdef\ListeAvantNombres{\useKV[Kakuro]{ListeNombres}}% - \readlist*\ListeKakuroNombres{\ListeAvantNombres}% - \savecomparemode% - \comparestrict% - \begin{NiceTabular}{*{\useKV[Kakuro]{TLargeur}}{m{\useKV[Kakuro]{Largeur}}}}[hvlines] - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Kakuro]{THauteur}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[Kakuro]{TLargeur}}}\do{% - \rule{0pt}{\PfCKakuro}% - \StrCompare{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}{*}[\PfCTestBlack] - \xintifboolexpr{\PfCTestBlack==0}{% - \Block[fill=black]{1-1}{}% - }{% - \xintifboolexpr{\listlen\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2}]==2}{ - \Block[fill=\useKV[Kakuro]{CouleurCase}]{1-1}{\diagbox{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},2]}}% - }{% - \Block{1-1}{\ifboolKV[Kakuro]{Solution}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}}{% - \ifboolKV[Kakuro]{Aide}{% - \xintFor* ##3 in{\xintSeq{1}{\ListeKakuroNombreslen}}\do{% - \Block{1-1}{\xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]==\ListeKakuroNombres[##3]}{\Large\color{\useKV[Kakuro]{CouleurSolution}}\num{\ListeCasesKK[\fpeval{\useKV[Kakuro]{TLargeur}*##1+##2},1]}}{}}% - }% - }{}% - }% - }% - }% - }% - \xintifForLast{\\}{&}% - }% - }% - \end{NiceTabular} - \restorecomparemode% -}% - -%%% -% KenKen -%%% -\setKVdefault[ClesKK]{Solution=false,Taille=3,Largeur=2em,Aide=false}% -\defKV[ClesKK]{Nombre=\setKV[ClesKK]{Aide}}% - -\newlength\PfCKenKen - -\NewDocumentCommand\KenKen{o m}{% - \useKVdefault[ClesKK]% - \setKV[ClesKK]{#1}% - \setlength{\PfCKenKen}{\useKV[ClesKK]{Largeur}+\tabcolsep}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesKK{#2}% - \savecomparemode% - \comparestrict% - \begin{NiceTabular}{*{\useKV[ClesKK]{Taille}}{m{\useKV[ClesKK]{Largeur}}}}% - \CodeBefore - \xintFor* ##1 in {\xintSeq{2}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{% - \tikz\draw[gray] (##1-|1) -- (##1-|last);% - \tikz\draw[gray] (1-|##1) -- (last-|##1);% - }% - \Body - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[ClesKK]{Taille}-1}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{% - \rule{0pt}{\PfCKenKen}% - \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{b}[\PfCTestb]%\PfCTestb - \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{l}[\PfCTestl]%\PfCTestr - \StrCompare{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},1]}{lb}[\PfCTestlb]%\PfCTestbr - \xintifboolexpr{\PfCTestb==0}{% - \Block[borders={bottom},line-width=2pt]{1-1}{% - \ifboolKV[ClesKK]{Solution}{% - \Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% - }{% - \ifboolKV[ClesKK]{Aide}{% - \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \xintifboolexpr{\PfCTestl==0}{% - \Block[borders={left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% - \ifboolKV[ClesKK]{Aide}{% - \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \xintifboolexpr{\PfCTestlb==0}{% - \Block[borders={bottom,left},line-width=2pt]{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% - \ifboolKV[ClesKK]{Aide}{% - \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% - }{}% - }{}% - }% - }% - }{% - \Block{1-1}{\ifboolKV[ClesKK]{Solution}{\Large\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]}{% - \ifboolKV[ClesKK]{Aide}{% - \xintifboolexpr{\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]==\useKV[ClesKK]{Nombre}}{% - \cellcolor{LightGray}\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*##1+##2},3]% - }{}% - }{}% - }% - }% - }% - }% - }% - \xintifForLast{\\}{&}% - }% - }% - \CodeAfter% - \tikz\draw[line width=2pt] (1-|1) rectangle (last-|last);% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesKK]{Taille}}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\useKV[ClesKK]{Taille}}}\do{% - \tikz\node[anchor=west,inner sep=0pt,xshift=1mm,yshift=-0.2\PfCKenKen] at (##1 -|##2) {\scriptsize$\ListeCasesKK[\fpeval{\useKV[ClesKK]{Taille}*(##1-1)+##2},2]$};% - }% - }% - \end{NiceTabular} - \restorecomparemode% -}% - -%%% -% PixelArt -%%% -\newtoks\toklistePANombre% -\def\UpdatetoksPANombre#1\nil{\addtotok\toklistePANombre{"#1",}}% - -\setKVdefault[ClesPixelArt]{Largeur=29,Hauteur=29,Solution=false,Lettres=ABCDEFGHIJK,Nombres=false,ListeCouleurs={Orange,Red,LightGray,Maroon,Purple,black,black,Plum,Orange,White,White},Unite=5mm} -\defKV[ClesPixelArt]{ListeNombres=\setKV[ClesPixelArt]{Nombres}} - -\NewDocumentCommand\PixelArt{o m}{% - \toklistePANombre{}% - \useKVdefault[ClesPixelArt]% - \setKV[ClesPixelArt]{#1}% - \xdef\ListeAvantCouleurs{\useKV[ClesPixelArt]{ListeCouleurs}}% - \xdef\ListeAvantNombres{\useKV[ClesPixelArt]{ListeNombres}}% - \setsepchar{,}% - \readlist*\ListePANombre{\ListeAvantNombres}% - \foreachitem\compteur\in\ListePANombre{\expandafter\UpdatetoksPANombre\compteur\nil}% - \BuildPixelArt{#2}{\useKV[ClesPixelArt]{Lettres}}{\ListeAvantCouleurs}{\the\toklistePANombre}% -}% - -\NewDocumentCommand\BuildPixelArt{m m m m}{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - largeur:=\useKV[ClesPixelArt]{Largeur}; - hauteur:=\useKV[ClesPixelArt]{Hauteur}; - Unite:=\useKV[ClesPixelArt]{Unite}; - boolean Solution,Nombres; - Solution:=\useKV[ClesPixelArt]{Solution}; - Nombres:=\useKV[ClesPixelArt]{Nombres}; - string BaseLettres; - BaseLettres=str #2; - - color ColorEntier[],ColFond; - n:=0; - for p_=#3: - n:=n+1; - ColorEntier[n]:=p_; - endfor; - - string RetiensNombres[]; - if Nombres: - n:=0; - for p_=#4: - n:=n+1; - RetiensNombres[n]=p_; - endfor; - fi; - - vardef Lecturecsv(expr nomfichier)= - for h=hauteur downto 1: - string p_; - p_=readfrom nomfichier; - l:=0; - for p=0 step 2 until 2*largeur-2: - l:=l+1; - if (substring(p,p+1) of p_)="-": - else: - if Nombres: - for m=0 upto (length BaseLettres-1): - if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: - label(TEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite)); - fi; - endfor; - else: - label(TEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite)); - fi; - if Solution: - for m=0 upto (length BaseLettres-1): - if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: - ColFond:=ColorEntier[m+1]; - fi; - endfor; - if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; - fi; - trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); - fi; - endfor; - endfor; - closefrom nomfichier; - enddef; - - Lecturecsv("#1"); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={largeur:=\useKV[ClesPixelArt]{Largeur}; hauteur:=\useKV[ClesPixelArt]{Hauteur}; Unite:=\useKV[ClesPixelArt]{Unite}; boolean Solution,Nombres; Solution:=\useKV[ClesPixelArt]{Solution}; Nombres:=\useKV[ClesPixelArt]{Nombres};}] - string BaseLettres; - BaseLettres=str #2; - - color ColorEntier[],ColFond; - n:=0; - for p_=#3: - n:=n+1; - ColorEntier[n]:=p_; - endfor; - - string RetiensNombres[]; - if Nombres: - n:=0; - for p_=#4: - n:=n+1; - RetiensNombres[n]=p_; - endfor; - fi; - - vardef Lecturecsv(expr nomfichier)= - for h=hauteur downto 1: - string p_; - p_=readfrom nomfichier; - l:=0; - for p=0 step 2 until 2*largeur-2: - l:=l+1; - if (substring(p,p+1) of p_)="-": - else: - if Nombres: - for m=0 upto (length BaseLettres-1): - if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: - label(LATEX(RetiensNombres[m+1]),((l-1)*Unite,(h-1)*Unite)); - fi; - endfor; - else: - label(LATEX(substring(p,p+1) of p_),((l-1)*Unite,(h-1)*Unite)); - fi; - if Solution: - for m=0 upto (length BaseLettres-1): - if (substring(p,p+1) of p_)=substring(m,m+1) of BaseLettres: - ColFond:=ColorEntier[m+1]; - fi; - endfor; - if unknown ColFond: else: fill (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite) withcolor ColFond fi; - fi; - trace (unitsquare scaled Unite) shifted ((l-1)*Unite-0.5*Unite,(h-1)*Unite-0.5*Unite); - fi; - endfor; - endfor; - closefrom nomfichier; - enddef; - - Lecturecsv("#1"); - \end{mpost} - \fi -} - -%%% -% Yohaku -%%% -\setKVdefault[Yohaku]{Taille=2,Largeur=1cm,Hauteur=1cm,Addition,Multiplication=false,Perso=false,Limite=50,Relatif=false,Negatif=false,Pair=false,Impair=false,Premier=false,Solution=false,Visible=false,Bordure=false,CouleurResultat=gray!15,Ligne=0,Colonne=0,PasL=0,PasC=0,CouleurZone=gray!25}% -\defKV[Yohaku]{Case=\setKV[Yohaku]{Visible}}% - -\newlength\PfCYohaku% - -\xdef\PfCYHKpremier{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}% - -\NewDocumentCommand\Yohaku{o m}{% - \useKVdefault[Yohaku]% - \setKV[Yohaku]{#1}% - \xdef\PfCYHKlast{\fpeval{\useKV[Yohaku]{Taille}+1}}% - \xdef\PfCYHKnombre{1}% - \xdef\PfCYHKpair{2}% - \xdef\PfCYHKimpair{1}% - \xdef\PfCYHKnegatif{}% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% - \xdef\PfCYHKnegatif{\PfCYHKnegatif -##1,}% - }% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% - \xdef\PfCYHKnombre{\PfCYHKnombre,##1}% - }% - \xintFor* ##1 in{\xintSeq{2}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% - \xdef\PfCYHKpair{\PfCYHKpair,\fpeval{##1*2}}% - }% - \xintFor* ##1 in{\xintSeq{1}{\fpeval{\useKV[Yohaku]{Limite}}}}\do{% - \xdef\PfCYHKimpair{\PfCYHKimpair,\fpeval{##1*2+1}}% - }% - % - \ifboolKV[Yohaku]{Perso}{% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\PfCYHKListe{#2}% - \setsepchar{,}% - \xdef\PfCYHKListeFoo{}% - \foreachitem\compteur\in\PfCYHKListe[1]{% - \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[1,\compteurcnt],}% - }% - \ignoreemptyitems\readlist*\PfCYHKListeNA{\PfCYHKListeFoo}% - \xdef\PfCYHKListeFoo{}% - \foreachitem\compteur\in\PfCYHKListe[2]{% - \xdef\PfCYHKListeFoo{\PfCYHKListeFoo \PfCYHKListe[2,\compteurcnt],}% - }% - \ignoreemptyitems\readlist*\PfCYHKListeP{\PfCYHKListeFoo}% - }{% - \ifboolKV[Yohaku]{Negatif}{% - \xdef\PfCYHKListe{\PfCYHKnegatif}% - }{% - \ifboolKV[Yohaku]{Premier}{% - \xdef\PfCYHKListe{\PfCYHKpremier}% - }{% - \ifboolKV[Yohaku]{Impair}{% - \xdef\PfCYHKListe{\PfCYHKimpair}% - }{% - \ifboolKV[Yohaku]{Pair}{% - \xdef\PfCYHKListe{\PfCYHKpair}% - }{% - \xdef\PfCYHKListe{\PfCYHKnombre}% - }% - }% - }% - }% - \ifboolKV[Yohaku]{Relatif}{% - \xdef\PfCMoitieCase{\fpeval{floor((\useKV[Yohaku]{Taille}**2)/2)}}% - \xdef\PfCAutreMoitieCase{\fpeval{\useKV[Yohaku]{Taille}**2-\PfCMoitieCase}}% - \xdef\PfCFooRelatifYohaku{}% - \xdef\PfCYohakuAlea{\fpeval{randint(1,2)}}% - \xintifboolexpr{\PfCYohakuAlea==1}{% on choisit M1 négatifs, M2 positifs - \MelangeListe{\PfCYHKnegatif}{\PfCMoitieCase}% - \xdef\PfCYohakuInter{\faa}% - \MelangeListe{\PfCYHKnombre}{\PfCAutreMoitieCase}% - \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}% - }{% on choisit M1 positifs, M2 négatifs - \MelangeListe{\PfCYHKnombre}{\PfCMoitieCase}% - \xdef\PfCYohakuInter{\faa}% - \MelangeListe{\PfCYHKnegatif}{\PfCAutreMoitieCase}% - \xdef\PfCYohakuInter{\PfCYohakuInter,\faa}% - }% - \MelangeListe{\PfCYohakuInter}{\fpeval{\useKV[Yohaku]{Taille}**2}}% - }{% - \MelangeListe{\PfCYHKListe}{\fpeval{\useKV[Yohaku]{Taille}**2}}% - }% - \ignoreemptyitems\readlist*\PfCYHKListeNA{\faa}% - %Sommes/Produits - \xdef\PfCYHKListeProduit{}% - %verticaux - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \ifboolKV[Yohaku]{Multiplication}{% - \xdef\PfCYHKTampon{1}% - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{% - \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}% - }% - }{% - \xdef\PfCYHKTampon{0}% - \xintFor* ##1 in {\xintSeq{0}{\fpeval{\useKV[Yohaku]{Taille}-1}}}\do{% - \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{##2+##1*\useKV[Yohaku]{Taille}}]}}% - }% - }% - \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}% - }% - % horizontaux - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \ifboolKV[Yohaku]{Multiplication}{% - \xdef\PfCYHKTampon{1}% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon*\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}% - }% - }{% - \xdef\PfCYHKTampon{0}% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \xdef\PfCYHKTampon{\fpeval{\PfCYHKTampon+\PfCYHKListeNA[\fpeval{(\useKV[Yohaku]{Taille}-##2)*\useKV[Yohaku]{Taille}+##1}]}}% - }% - }% - \xdef\PfCYHKListeProduit{\PfCYHKListeProduit,\PfCYHKTampon}% - }% - \readlist*\PfCYHKListeP{\PfCYHKListeProduit}% - }% - \setlength{\PfCYohaku}{\useKV[Yohaku]{Largeur}-\tabcolsep}% - \colorlet{PfCFondYohaku}{\useKV[Yohaku]{CouleurResultat}}% - \colorlet{PfCZoneYohaku}{\useKV[Yohaku]{CouleurZone}}% - \begin{NiceTabular}{*{\fpeval{\useKV[Yohaku]{Taille}+1}}{m{\PfCYohaku}}}[hvlines-except-borders] - \CodeBefore - \xintifboolexpr{\useKV[Yohaku]{Ligne}==0 || \useKV[Yohaku]{Colonne}==0}{}{% - \tikz\draw[fill=PfCZoneYohaku](row-\fpeval{\useKV[Yohaku]{Ligne}}-|col-\fpeval{\useKV[Yohaku]{Colonne}}) rectangle (row-\fpeval{\useKV[Yohaku]{Ligne}+\useKV[Yohaku]{PasL}}-|col-\fpeval{\useKV[Yohaku]{Colonne}+\useKV[Yohaku]{PasC}});% - }% - \ifboolKV[Yohaku]{Bordure}{% - \tikz\fill[PfCFondYohaku] (last-|1)--(last-|last)--(1-|last)--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--cycle; - }{} - \Body - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}+1}}}\do{% - \xintifForFirst{\rule{0pt}{\useKV[Yohaku]{Hauteur}}}{&} - }\\% - }% - \CodeAfter - \ifboolKV[Yohaku]{Bordure}{% - \tikz\draw (last-|1)--(last-|last)--(1-|last); - }{}% - \tikz\draw (1-|1)--(1-|last); - \tikz\draw (1-|1)--(last-|1); - \tikz\draw[line width=2pt] (1-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|1)--(\fpeval{\useKV[Yohaku]{Taille}+1}-|\fpeval{\useKV[Yohaku]{Taille}+1})--(1-|\fpeval{\useKV[Yohaku]{Taille}+1})--cycle; - \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\Huge\ifboolKV[Yohaku]{Multiplication}{$\times$}{$+$}}; - % Affichage des termes/facteurs - \ifboolKV[Yohaku]{Solution}{% - \ifboolKV[Yohaku]{Perso}{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]}; - }% - }% - }{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{ - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{ - \tikz\node at (\fpeval{##2+0.5}-|\fpeval{##1+0.5}) {\num{\PfCYHKListeNA[\fpeval{(##2-1)*\useKV[Yohaku]{Taille}+##1}]}}; - }% - }% - }% - }{}% - % Affichage d'un terme/facteur - \ifboolKV[Yohaku]{Visible}{% - \xdef\PfCYohakuCaseAFL{\fpeval{floor((\useKV[Yohaku]{Case}-1)/\useKV[Yohaku]{Taille})}}% - \xdef\PfCYohakuCaseAFC{\fpeval{\useKV[Yohaku]{Case}-\useKV[Yohaku]{Taille}*\PfCYohakuCaseAFL}}% - \ifboolKV[Yohaku]{Perso}{% - \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]}; - }{% - \tikz\node at (\fpeval{\PfCYohakuCaseAFL+1+0.5}-|\fpeval{\PfCYohakuCaseAFC+0.5}) {\num{\PfCYHKListeNA[\fpeval{\useKV[Yohaku]{Case}}]}}; - }% - }{}% - %% Affichage des sommes/produits horizontalement - \ifboolKV[Yohaku]{Perso}{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\PfCYHKListeP[##2]}; - }% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]}; - }% - }{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \tikz\node at (\fpeval{\PfCYHKlast+0.5}-|\fpeval{##2+0.5}) {\num{\PfCYHKListeP[##2]}}; - }% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[Yohaku]{Taille}}}}\do{% - \tikz\node at (\fpeval{\useKV[Yohaku]{Taille}+1-##2+0.5}-|\fpeval{\PfCYHKlast+0.5}) {\num{\PfCYHKListeP[\fpeval{\useKV[Yohaku]{Taille}+##2}]}}; - }% - }% - \end{NiceTabular} -}% - -%%% -% Rose -%%% -\setKVdefault[ClesRose]{Vide=false,Couleur=white,Produits=false,Solution=false,Rayon=2cm,Petales=7,Aide=false,FacteurMin=2,FacteurMax=10,ProduitVide=false,CaseVide=false,Polygone=false,Nom=Rose1}% - -\NewDocumentCommand\RoseMul{o}{% - \useKVdefault[ClesRose]% - \setKV[ClesRose]{#1}% - \ifluatex% - \ifboolKV[ClesRose]{Solution}{% - \DessineRoseMulSol% - }{% - \DessineRoseMul% - }% - \else% - \DessineRoseMul% - \fi% -}% - -\newcommand\DessineRoseMulSol{% - \ifluatex% - \mplibforcehmode% - \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}% - \begin{mplibcode}[\PfCNomRose] - boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; - Aide:=\useKV[ClesRose]{Aide}; - Vide:=\useKV[ClesRose]{Vide}; - Solution:=\useKV[ClesRose]{Solution}; - Produits:=\useKV[ClesRose]{Produits}; - ProduitVide:=\useKV[ClesRose]{ProduitVide}; - CaseVide:=\useKV[ClesRose]{CaseVide}; - if ProduitVide:Solution:=true fi; - if CaseVide:Solution:=true fi; - % on labelise - if Vide=false: - if Produits: - else: - for k=0 upto Petales-1: - label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); - endfor; - fi; - if Produits or Solution: - for k=0 upto Petales-1: - label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); - endfor; - fi; - fi; - % On trace et on affiche...éventuellement :) - if Aide: - for k=0 upto Petales-1: - drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - fi; - if ProduitVide: - %choix=floor(uniformdeviate(Petales-1)); - fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; - fi; - if CaseVide: - %choix:=floor(uniformdeviate(Petales-1)); - for k=0 upto Petales-1: - if k<>choix: - fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; - fi; - endfor; - fi; - trace A0 for k=1 upto Petales:--A[k] endfor --cycle; - for k=0 upto Petales-1: - trace segment(O,B[k]) dashed withdots scaled 0.25; - draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - \end{mplibcode} - \fi -} -\newcommand\DessineRoseMul{% - \ifluatex% - \mplibforcehmode% - \xdef\PfCNomRose{\useKV[ClesRose]{Nom}}% - \begin{mplibcode}[\PfCNomRose] - vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)= - numeric ElementE[],ElementS[]; - %% éléments d'entrée - nbe:=1; - for k=nbmin upto nbmax: - ElementE[nbe]=k; - nbe:=nbe+1; - endfor; - totalE:=(nbmax-nbmin)+1; - numeric rec; - for k=1 upto nbfacteurs: - rec:=ceiling(uniformdeviate(totalE+1-k)); - ElementS[k]=ElementE[rec]; - numeric ElementI[]; - p:=0; - for l=1 upto totalE+1-k: - if l<>rec: - p:=p+1; - ElementI[p]=ElementE[l]; - fi; - endfor; - numeric ElementE[]; - for l=1 upto p: - ElementE[l]=ElementI[l]; - endfor; - endfor; - enddef; - pair A[],B[],O; - Rayon:=\useKV[ClesRose]{Rayon}; - boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; - Aide:=\useKV[ClesRose]{Aide}; - Vide:=\useKV[ClesRose]{Vide}; - Solution:=\useKV[ClesRose]{Solution}; - Produits:=\useKV[ClesRose]{Produits}; - ProduitVide:=\useKV[ClesRose]{ProduitVide}; - CaseVide:=\useKV[ClesRose]{CaseVide}; - if ProduitVide:Solution:=true fi; - if CaseVide:Solution:=true fi; - Polygone:=\useKV[ClesRose]{Polygone}; - Petales:=\useKV[ClesRose]{Petales}; - FacteurMin:=\useKV[ClesRose]{FacteurMin}; - FacteurMax:=\useKV[ClesRose]{FacteurMax}; - color Fond; - Fond:=\useKV[ClesRose]{Couleur}; - O=(0,0); - ExtraireListe(FacteurMin,FacteurMax,Petales); - path cc; - cc=cercles(O,Rayon); - for k=0 upto Petales: - A[k]=pointarc(cc,(360/Petales)*k); - endfor; - for k=0 upto Petales-1: - B[k]=iso(A[k],A[k+1]); - endfor; - path BoiteRec; - if Polygone: - BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u; - else: - 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; - fi; - %On détermine les facteurs et produits - for k=0 upto Petales-1: - Facteur[k]:=ElementS[k+1]; - endfor; - Facteur[Petales]:=Facteur[0]; - for k=0 upto Petales-1: - Produit[k]:=Facteur[k]*Facteur[k+1]; - endfor; - %on labelise - if Vide=false: - if Produits: - else: - for k=0 upto Petales-1: - label(TEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); - endfor; - fi; - if Produits or Solution: - for k=0 upto Petales-1: - label(TEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); - endfor; - fi; - fi; - % On trace et on affiche...éventuellement :) - if Aide: - for k=0 upto Petales-1: - drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - fi; - if ProduitVide: - choix:=floor(uniformdeviate(Petales-1)); - fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; - fi; - if CaseVide: - choix:=floor(uniformdeviate(Petales-1)); - for k=0 upto Petales-1: - if k<>choix: - fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; - fi; - endfor; - fi; - trace A0 for k=1 upto Petales:--A[k] endfor --cycle; - for k=0 upto Petales-1: - trace segment(O,B[k]) dashed withdots scaled 0.25; - draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={Rayon:=\useKV[ClesRose]{Rayon}; - boolean Aide,Produits,Solution,Vide,ProduitVide,CaseVide,Polygone; - Aide:=\useKV[ClesRose]{Aide}; - Vide:=\useKV[ClesRose]{Vide}; - Solution:=\useKV[ClesRose]{Solution}; - Produits:=\useKV[ClesRose]{Produits}; - ProduitVide:=\useKV[ClesRose]{ProduitVide}; - CaseVide:=\useKV[ClesRose]{CaseVide}; - if ProduitVide:Solution:=true fi; - if CaseVide:Solution:=true fi; - Polygone:=\useKV[ClesRose]{Polygone}; - Petales:=\useKV[ClesRose]{Petales}; - FacteurMin:=\useKV[ClesRose]{FacteurMin}; - FacteurMax:=\useKV[ClesRose]{FacteurMax}; - color Fond; - Fond:=\useKV[ClesRose]{Couleur};}] - vardef ExtraireListe(expr nbmin,nbmax,nbfacteurs)= - numeric ElementE[],ElementS[]; - %% éléments d'entrée - nbe=1; - for k=nbmin upto nbmax: - ElementE[nbe]=k; - nbe:=nbe+1; - endfor; - totalE=(nbmax-nbmin)+1; - numeric rec; - for k=1 upto nbfacteurs: - rec:=ceiling(uniformdeviate(totalE+1-k)); - ElementS[k]=ElementE[rec]; - numeric ElementI[]; - p:=0; - for l=1 upto totalE+1-k: - if l<>rec: - p:=p+1; - ElementI[p]=ElementE[l]; - fi; - endfor; - numeric ElementE[]; - for l=1 upto p: - ElementE[l]=ElementI[l]; - endfor; - endfor; - enddef; - pair A[],B[],O; - O=(0,0); - ExtraireListe(FacteurMin,FacteurMax,Petales); - path cc; - cc=cercles(O,Rayon); - for k=0 upto Petales: - A[k]=pointarc(cc,(360/Petales)*k); - endfor; - for k=0 upto Petales-1: - B[k]=iso(A[k],A[k+1]); - endfor; - path BoiteRec; - if Polygone: - BoiteRec=(pointarc(fullcircle,0) for k=1 upto Petales:--pointarc(fullcircle,k*(360/Petales)) endfor --cycle) scaled 1u; - else: - 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; - fi; - %On détermine les facteurs et produits - for k=0 upto Petales-1: - Facteur[k]=ElementS[k+1]; - endfor; - Facteur[Petales]=Facteur[0]; - for k=0 upto Petales-1: - Produit[k]=Facteur[k]*Facteur[k+1]; - endfor; - %on labelise - if Vide=false: - if Produits: - else: - for k=0 upto Petales-1: - label(LATEX("\num{"&decimal(Facteur[k])&"}"),(0.5[O,A[k]]-center BoiteRec)); - endfor; - fi; - if Produits or Solution: - for k=0 upto Petales-1: - label(LATEX("\num{"&decimal(Produit[k])&"}"),(B[k]+0.5*Rayon*unitvector(B[k]))); - endfor; - fi; - fi; - % On trace et on affiche...éventuellement :) - if Aide: - for k=0 upto Petales-1: - drawarrow (0.5[O,A[k]]--1.75[O,B[k]]) cutbefore segment(A[k],A[k+1]) cutafter BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) 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 (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - fi; - if ProduitVide: - choix=floor(uniformdeviate(Petales-1)); - fill (BoiteRec shifted (1.75[O,B[choix]]-center BoiteRec)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,(choix-1)*(360/Petales)) withcolor Fond; - fill rotation(polygone(O,B0,A1,B1),O,choix*(360/Petales)) withcolor Fond; - fi; - if CaseVide: - choix:=floor(uniformdeviate(Petales-1)); - for k=0 upto Petales-1: - if k<>choix: - fill rotation(polygone(O,B0,A1,B1),O,k*(360/Petales)) withcolor Fond; - fi; - endfor; - fi; - trace A0 for k=1 upto Petales:--A[k] endfor --cycle; - for k=0 upto Petales-1: - trace segment(O,B[k]) dashed withdots scaled 0.25; - draw BoiteRec shifted (B[k]+0.5*Rayon*unitvector(B[k])) dashed evenly scaled 0.5; - endfor; - \end{mpost} - \fi -}% - -%%% -% Puissances 4 -%%% -\setKVdefault[ClesPQuatre]{Couleur=Gray,Largeur=2cm,LargeurUn=2cm,Multiplication,Entier,Nombre,Exposant=false,Libre=false,Texte=false,Echelle=2}% -\defKV[ClesPQuatre]{Addition=\setKV[ClesPQuatre]{Multiplication=false}}% -\defKV[ClesPQuatre]{Relatif=\setKV[ClesPQuatre]{Entier=false}}% -\defKV[ClesPQuatre]{Puissance=\setKV[ClesPQuatre]{Exposant}}% -\defKV[ClesPQuatre]{Autre=\setKV[ClesPQuatre]{Nombre=false}\setKV[ClesPQuatre]{Libre}}% -\defKV[ClesPQuatre]{Consignes=\setKV[ClesPQuatre]{Texte}}% - -\newtoks\toklistePQuatreh% -\newtoks\toklistePQuatrev% -\def\UpdatetoksPQuatreh#1\nil{\addtotok\toklistePQuatreh{"#1",}}% -\def\UpdatetoksPQuatrev#1\nil{\addtotok\toklistePQuatrev{"#1",}}% - -\NewDocumentCommand\PQuatre{o +m}{% - \useKVdefault[ClesPQuatre]% - \toklistePQuatreh{}% - \toklistePQuatrev{}% - \setKV[ClesPQuatre]{#1}% - \ifboolKV[ClesPQuatre]{Nombre}{% - \ifboolKV[ClesPQuatre]{Exposant}{% - \def\PQuatreListe{$10^{-10}$,$10^{-9}$,$10^{-8}$,$10^{-7}$,$10^{-6}$,$10^{-5}$,$10^{-4}$,$10^{-3}$,$10^{-2}$,$10^{2}$,$10^{3}$,$10^{4}$,$10^{5}$,$10^{6}$,$10^{7}$,$10^{8}$,$10^{9}$,$10^{10}$}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeH{\faa}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeV{\faa}% - \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% - \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% - }{% - \ifboolKV[ClesPQuatre]{Entier}{% - % On choisit aléatoirement les listes de nombres de 2 à 10 en faisant deux listes : horizontale et verticale - \def\PQuatreListe{2,3,4,5,6,7,8,9,10}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeH{\faa}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeV{\faa}% - \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% - \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% - }{% - % On choisit aléatoirement les listes de nombres de -10 à -2 union 2 à 10 en faisant deux listes : horizontale et verticale - \def\PQuatreListe{$-10$,$-9$,$-8$,$-7$,$-6$,$-5$,$-4$,$-3$,$-2$,2,3,4,5,6,7,8,9,10}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeH{\faa}% - \MelangeListe{\PQuatreListe}{7}% - \readlist*\PQuatreListeV{\faa}% - \foreachitem\compteur\in\PQuatreListeH{\expandafter\UpdatetoksPQuatreh\compteur\nil}% - \foreachitem\compteur\in\PQuatreListeV{\expandafter\UpdatetoksPQuatrev\compteur\nil}% - }% - }% - }{% - % on lit la liste des données fournies par l'utilisateur - \setsepchar[*]{,*/}% - \readlist\PQuatreListes{#2}% - \setsepchar{,}% - \foreachitem\compteur\in\PQuatreListes[1]{\expandafter\UpdatetoksPQuatrev\compteur\nil}% - \foreachitem\compteur\in\PQuatreListes[2]{\expandafter\UpdatetoksPQuatreh\compteur\nil}% - }% - % Une fois les listes construites, on dessine et on place les listes. - \PQuatreGrille{\the\toklistePQuatrev}{\the\toklistePQuatreh}% -}% - -\NewDocumentCommand\PQuatreGrille{m m}{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode} - Largeur=\useKV[ClesPQuatre]{Largeur}; - LargeurUn=\useKV[ClesPQuatre]{LargeurUn}; - Echelle=\useKV[ClesPQuatre]{Echelle}; - color fond; - fond=\useKV[ClesPQuatre]{Couleur}; - boolean Libre,Multiplication,Texte; - Libre:=\useKV[ClesPQuatre]{Libre}; - Multiplication=\useKV[ClesPQuatre]{Multiplication}; - Texte:=\useKV[ClesPQuatre]{Texte}; - - if Texte: - string Consignes; - Consignes=\useKV[ClesPQuatre]{Consignes}; - fi; - - % On calcule le nombre de cases - nchauteur:=0; - for p_=#1: - nchauteur:=incr nchauteur; - endfor; - nclargeur:=0; - for p_=#2: - nclargeur:=incr nclargeur; - endfor; - if Libre=false: - nchauteur:=7; - nclargeur:=7; - fi; - %On affiche - pair A,B,C,D,H[],V[],M[][]; - A=(0,0); - B-A=Largeur*(nclargeur,0); - C-B=Largeur*(0,nchauteur); - D-C=A-B; - fill polygone(A,B,C,D) withcolor fond; - trace polygone(A,B,C,D); - for k=0 upto (nclargeur-1): - for l=0 upto (nchauteur-1): - M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); - fill cercles(M[k][l],0.4*Largeur) withcolor blanc; - trace cercles(M[k][l],0.4*Largeur); - endfor; - endfor; - labeloffset:=labeloffset*2; - if Libre: - if Texte: - label.llft(TEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); - fi; - else: - if Multiplication: - label.llft(btex $\times$ etex scaled Echelle,A); - else: - label.llft(btex $+$ etex scaled Echelle,A); - fi; - fi; - labeloffset:=labeloffset/2; - vardef Vertical(text t)= - n:=0; - for p_=t: - label.lft(TEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); - n:=n+1; - endfor; - enddef; - vardef Horizontal(text t)= - n:=0; - for p_=t: - label.bot(TEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); - n:=n+1; - endfor; - enddef; - labeloffset:=labeloffset*4; - Vertical(#1); - Horizontal(#2); - \end{mplibcode} - \else% - \begin{mpost}[mpsettings={Largeur=\useKV[ClesPQuatre]{Largeur};Largeur=\useKV[ClesPQuatre]{Largeur};LargeurUn=\useKV[ClesPQuatre]{LargeurUn};Echelle=\useKV[ClesPQuatre]{Echelle};color fond;fond=\useKV[ClesPQuatre]{Couleur};boolean Libre,Multiplication,Texte;Libre:=\useKV[ClesPQuatre]{Libre};Multiplication=\useKV[ClesPQuatre]{Multiplication};Texte:=\useKV[ClesPQuatre]{Texte};if Texte:string Consignes;Consignes=\useKV[ClesPQuatre]{Consignes};fi;}] - % On calcule le nombre de cases - nchauteur:=0; - for p_=#1: - nchauteur:=incr nchauteur; - endfor; - nclargeur:=0; - for p_=#2: - nclargeur:=incr nclargeur; - endfor; - if Libre=false: - nchauteur:=7; - nclargeur:=7; - fi; - %On affiche - pair A,B,C,D,H[],V[],M[][]; - A=(0,0); - B-A=Largeur*(nclargeur,0); - C-B=Largeur*(0,nchauteur); - D-C=A-B; - fill polygone(A,B,C,D) withcolor fond; - trace polygone(A,B,C,D); - for k=0 upto (nclargeur-1): - for l=0 upto (nchauteur-1): - M[k][l]=A+0.5*(Largeur,Largeur)+k*(Largeur,0)+l*(0,Largeur); - fill cercles(M[k][l],0.4*Largeur) withcolor blanc; - trace cercles(M[k][l],0.4*Largeur); - endfor; - endfor; - labeloffset:=labeloffset*2; - if Libre: - if Texte: - label.llft(LATEX("\begin{minipage}{"&decimal(LargeurUn)&"pt}"&Consignes&"\end{minipage}") scaled Echelle,A); - fi; - else: - if Multiplication: - label.llft(btex $\times$ etex scaled Echelle,A); - else: - label.llft(btex $+$ etex scaled Echelle,A); - fi; - fi; - labeloffset:=labeloffset/2; - vardef Vertical(text t)= - n:=0; - for p_=t: - label.lft(LATEX(p_) scaled Echelle,A+(0,n*Largeur+Largeur/2)); - n:=n+1; - endfor; - enddef; - vardef Horizontal(text t)= - n:=0; - for p_=t: - label.bot(LATEX(p_) scaled Echelle,A+(n*Largeur+Largeur/2,0)); - n:=n+1; - endfor; - enddef; - labeloffset:=labeloffset*4; - Vertical(#1); - Horizontal(#2); - \end{mpost} - \fi% -}% - -%%% -% Billard -%%% -\setKVdefault[ClesBillard]{Longueur=8cm,Largeur=5cm,Solution=false,Angle=70,Depart=0.5,Vrai=false} - -\NewDocumentCommand\Billard{o m}{% - \useKVdefault[ClesBillard]% - \setKV[ClesBillard]{#1}% - \ifboolKV[ClesBillard]{Solution}{% - \MPBillardSolution{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}% - }{% - \MPBillard{#2}{\useKV[ClesBillard]{Depart}}{\useKV[ClesBillard]{Angle}}% - }% -}% - -\def\MPBillard#1#2#3{% - \mplibcodeinherit{disable}% - \begin{Geometrie}[CoinHD={(\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm)}] - boolean Vrai; - Vrai:=\useKV[ClesBillard]{Vrai}; - % On définit la liste des 25 lettres alphabétiques dans laquelle on choisit autant de lettres que la longueur du mot - % On a retiré la lettre Q pour des questions d'alignements esthétiques. - vardef ChoixLettre= - save Lettre,choixalea; - string Lettre; - choixalea=floor(uniformdeviate(26)+1); - if choixalea=1: - Lettre="A"; - elseif choixalea=2: - Lettre="B"; - elseif choixalea=3: - Lettre="C"; - elseif choixalea=4: - Lettre="D"; - elseif choixalea=5: - Lettre="E"; - elseif choixalea=6: - Lettre="F"; - elseif choixalea=7: - Lettre="G"; - elseif choixalea=8: - Lettre="H"; - elseif choixalea=9: - Lettre="I"; - elseif choixalea=10: - Lettre="J"; - elseif choixalea=11: - Lettre="K"; - elseif choixalea=12: - Lettre="L"; - elseif choixalea=13: - Lettre="M"; - elseif choixalea=14: - Lettre="N"; - elseif choixalea=15: - Lettre="O"; - elseif choixalea=16: - Lettre="P"; - elseif choixalea=17: - Lettre="O"; - elseif choixalea=18: - Lettre="R"; - elseif choixalea=19: - Lettre="S"; - elseif choixalea=20: - Lettre="T"; - elseif choixalea=21: - Lettre="U"; - elseif choixalea=22: - Lettre="V"; - elseif choixalea=23: - Lettre="W"; - elseif choixalea=24: - Lettre="X"; - elseif choixalea=25: - Lettre="Y"; - elseif choixalea=26: - Lettre="Z"; - fi; - Lettre - enddef; - % On crée un Quick Sort - def QS(expr ndeb,nfin)= - begingroup - save v,m,x; - if ndeb<nfin: - v:=l[cpt[ndeb]]; - m:=ndeb; - for i=(ndeb+1) upto nfin: - if l[cpt[i]]<v: - m:=m+1; - x:=cpt[m];cpt[m]:=cpt[i];cpt[i]:=x; - fi - endfor; - x:=cpt[m];cpt[m]:=cpt[ndeb];cpt[ndeb]:=x; - QS(ndeb,m-1); - QS(m+1,nfin); - fi - endgroup - enddef; - % On définit le rectangle - pair M[],Co,Intermed; - M1=u*(1,2); - M2-M1=(\useKV[ClesBillard]{Longueur},0); - M3-M2=(0,\useKV[ClesBillard]{Largeur}); - M4-M3=M1-M2; - Co=iso(M1,M3); - path rec,cote[]; - rec=polygone(M1,M2,M3,M4); - cote1=segment(M1,M2); - cote2=segment(M2,M3); - cote3=segment(M3,M4); - cote4=segment(M4,M1); - trace rec; - pair Pt[],FauxPt[]; - nbfaux=0; - l1=#2; - Pt[1]=point(l1) of rec; - angleref=#3; - if l1>3: - angledepart=90+angleref; - Pt[2]=demidroite(Pt[1],rotation(M1,Pt1,angledepart)) intersectionpoint (subpath(0,3) of rec); - dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]); - elseif l1>2: - angledepart=180+angleref; - Pt[2]=demidroite(Pt[1],rotation(M4,Pt1,angledepart)) intersectionpoint ((subpath(3,4) of rec)--(subpath(0,2) of rec)); - dotlabel.top(TEX(substring(0,1) of #1),Pt[1]); - elseif l1>1: - angledepart=angleref-90; - Pt[2]=demidroite(Pt[1],rotation(M3,Pt1,angledepart)) intersectionpoint ((subpath(2,4) of rec)--(subpath(0,1) of rec)); - dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]); - else: - angledepart=angleref; - Pt[2]=demidroite(Pt[1],rotation(M2,Pt1,angledepart)) intersectionpoint (subpath(1,4) of rec); - dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]); - fi; - tourne=90; - numeric Blong; - BLong:=length #1; - % Détermination des points. - if Vrai: - for k=3 upto BLong: - Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M2-M3); - if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1): - Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; - else: - Intermed:=symetrie(Pt[k-2],Pt[k-1],Pt[k-1]+M1-M2); - Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; - fi; - endfor; - else: - for k=3 upto BLong: - Intermed:=rotation(Pt[k-2],Pt[k-1],tourne); - if (demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectiontimes rec)<>(-1,-1): - Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; - else: - Intermed:=rotation(Pt[k-2],Pt[k-1],-tourne); - Pt[k]:=demidroite(1/1000[Pt[k-1],Intermed],Intermed) intersectionpoint rec; - fi; - endfor; - fi; - % Ajout des faux points - path SPath[]; - cpt[1]:=1; - cpt[BLong+1]:=BLong+1; - l[BLong+1]:=4; - for k=2 upto BLong: - SPath[k]=rec cutafter demidroite(Co,Pt[k]); - l[k]=arclength SPath[k]; - l[k]:=arctime l[k] of rec; - cpt[k]:=k; - endfor; - QS(1,BLong+1); - for k=2 upto BLong+1: - if l[cpt[k]]-l[cpt[k-1]]>0.3: - nbfaux:=nbfaux+1; - FauxPt[nbfaux]=point(l[cpt[k-1]]+0.1) of rec; - nbfaux:=nbfaux+1; - FauxPt[nbfaux]=point(l[cpt[k]]-0.1) of rec; - fi; - endfor; - drawoptions(); - % Tracés - drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25; - % Labelisation - for k=2 upto BLong: - if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1): - dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1): - dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1): - dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1): - dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]); - fi; - endfor; - for k=1 upto nbfaux: - if (demidroite(Co,FauxPt[k]) intersectiontimes cote[1])<>(-1,-1): - dotlabel.bot(TEX(ChoixLettre),FauxPt[k]); - elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[2])<>(-1,-1): - dotlabel.rt(TEX(ChoixLettre),FauxPt[k]); - elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[3])<>(-1,-1): - dotlabel.top(TEX(ChoixLettre),FauxPt[k]); - elseif (demidroite(Co,FauxPt[k]) intersectiontimes cote[4])<>(-1,-1): - dotlabel.lft(TEX(ChoixLettre),FauxPt[k]); - fi; - endfor; - picture Reponse; - Reponse=image( - trace segment((0,0),(7*BLong*mm-2mm,0)) dashed dashpattern(on5mm off2mm); - ); - trace Reponse shifted((xpart(Co),5mm)-center Reponse); - \end{Geometrie}% -}% - -\def\MPBillardSolution#1#2#3{% - \mplibcodeinherit{enable}% - \begin{mplibcode}% - Figure(0,0,\useKV[ClesBillard]{Longueur}+2cm,\useKV[ClesBillard]{Largeur}+3cm); - trace rec; - % Tracés - drawarrow Pt[1]--(Pt[1]+1.5cm*unitvector(Pt[2]-Pt[1])) withpen pencircle scaled 1.25; - for k=1 upto BLong-1: - trace segment(Pt[k],Pt[k+1]); - endfor; - if Vrai=false: - for k=2 upto BLong-1: - trace codeperp(Pt[k-1],Pt[k],Pt[k+1],5); - endfor; - fi; - % Labelisation - if l1>3: - dotlabel.lft(TEX(substring(0,1) of #1),Pt[1]); - elseif l1>2: - dotlabel.top(TEX(substring(0,1) of #1),Pt[1]); - elseif l1>1: - dotlabel.rt(TEX(substring(0,1) of #1),Pt[1]); - else: - dotlabel.bot(TEX(substring(0,1) of #1),Pt[1]); - fi; - for k=2 upto BLong: - if (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[1])<>(-1,-1): - dotlabel.bot(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[2])<>(-1,-1): - dotlabel.rt(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[3])<>(-1,-1): - dotlabel.top(TEX(substring(k-1,k) of #1),Pt[k]); - elseif (demidroite(1/1000[Pt[k-1],Pt[k]],Pt[k]) intersectiontimes cote[4])<>(-1,-1): - dotlabel.lft(TEX(substring(k-1,k) of #1),Pt[k]); - fi; - endfor; - trace Reponse shifted((xpart(Co),5mm)-center Reponse); - % On affiche les lettres de la réponse. - for k=1 upto BLong: - label.top(TEX(substring(k-1,k) of #1),((xpart(Co),5mm)-center Reponse)+(k-1)*(7mm,0)+(2.5mm,0)); - endfor; - \end{mplibcode}% - \mplibcodeinherit{disable}% -}% - -%%% -% Représenter un entier -%%% -\setKVdefault[ClesREntier]{Echelle=1,Unite=false,Compact=false,Impression=false,ListeCouleurs={Tomato,LightSteelBlue,LightGreen,Cornsilk}}% - -\newcommand\RepresenterEntier[2][]{% - \useKVdefault[ClesREntier]% - \setKV[ClesREntier]{#1}% - \ifboolKV[ClesREntier]{Unite}{% - \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)}] - Echelle=\useKV[ClesREntier]{Echelle}; - Initialisation(5,30,15,50*Echelle); - color A,B,C,D,E,F,G,H; - pointilles:="non"; - trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1); - \end{Geometrie} - }{% - % On décompose le nombre - \StrLen{#2}[\LongueurNombreEntier]% - \xdef\FooListeEntier{} - \xintFor* ##1 in{\xintSeq{1}{\LongueurNombreEntier}}\do{% - \StrChar{#2}{##1}[\ChiffreAAjouter] - \xdef\FooListeEntier{\FooListeEntier \ChiffreAAjouter,} - } - \setsepchar{,}\ignoreemptyitems - \readlist*\ListeDesChiffres{\FooListeEntier}% - \xdef\ListeAvantCouleurs{\useKV[ClesREntier]{ListeCouleurs}}% - \readlist*\ListeCouleurEntier{\ListeAvantCouleurs}% - \xintifboolexpr{\LongueurNombreEntier==4}{% - \xdef\NombreMilliers{\ListeDesChiffres[1]}% - \xdef\NombreCentaines{\ListeDesChiffres[2]}% - \xdef\NombreDizaines{\ListeDesChiffres[3]}% - \xdef\NombreUnites{\ListeDesChiffres[4]}% - }{% - \xintifboolexpr{\LongueurNombreEntier==3}{% - \xdef\NombreMilliers{0}% - \xdef\NombreCentaines{\ListeDesChiffres[1]}% - \xdef\NombreDizaines{\ListeDesChiffres[2]}% - \xdef\NombreUnites{\ListeDesChiffres[3]}% - }{% - \xintifboolexpr{\LongueurNombreEntier==2}{% - \xdef\NombreMilliers{0}% - \xdef\NombreCentaines{0}% - \xdef\NombreDizaines{\ListeDesChiffres[1]}% - \xdef\NombreUnites{\ListeDesChiffres[2]}% + \readlist*\ListeInter{#1}% + \xdef\faa{}% Liste construite + \xdef\fii{}% Liste détruite + % on crée les #2 premieres solutions. + \xintFor* ##1 in {\xintSeq{1}{#2}}\do{% + \xintifboolexpr{\ListeInterlen>1}{% + \xdef\Alea{\fpeval{randint(\ListeInterlen)}}% + \xdef\faa{\faa \ListeInter[\Alea],}% + \xdef\fii{}% + \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{% + \xintifboolexpr{##2 == \Alea}{% }{% - \xdef\NombreMilliers{0}% - \xdef\NombreCentaines{0}% - \xdef\NombreDizaines{0}% - \xdef\NombreUnites{\ListeDesChiffres[1]}% - }% - }% - }% - \begin{Geometrie}[TypeTrace="Espace",CoinBG={u*(-10,-10)},CoinHD={u*(20,20)}] - Echelle=\useKV[ClesREntier]{Echelle}; - NM=\NombreMilliers; - NC=\NombreCentaines; - ND=\NombreDizaines; - NU=\NombreUnites; - color ColorEntier[]; - ColorEntier1=\ListeCouleurEntier[1]; - ColorEntier2=\ListeCouleurEntier[2]; - ColorEntier3=\ListeCouleurEntier[3]; - ColorEntier4=\ListeCouleurEntier[4]; - boolean Compact,Print; - Compact=\useKV[ClesREntier]{Compact}; - Print=\useKV[ClesREntier]{Impression}; - Initialisation(5,30,15,50*Echelle); - color A,B,C,D,E,F,G,H; - picture TypePave[]; - TypePave0=image( - trace Pave(A,B,C,D,E,F,G,H)(1,1,1); - currentpicture:=nullpicture; - remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier1 fi; - for k=0 upto 10: - trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]); - endfor; - for k=0 upto 10: - trace chemin((k/10)[B,C],(k/10)[G,H],(k/10)[F,E]); - endfor; - for k=0 upto 10: - trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); - endfor; - ); - color A,B,C,D,E,F,G,H; - TypePave1=image( - trace Pave(A,B,C,D,E,F,G,H)(0.1,1,1); - currentpicture:=nullpicture; - remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier2 fi; - trace chemin(C,H,E); - for k=0 upto 10: - trace chemin((k/10)[A,B],(k/10)[F,G],(k/10)[E,H]); - endfor; - for k=0 upto 10: - trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); - endfor; - ); - color A,B,C,D,E,F,G,H; - TypePave2=image( - trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,1); - currentpicture:=nullpicture; - remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier3 fi; - trace chemin(C,H,E); - trace chemin(A,F,E); - trace chemin(B,G,F); - for k=0 upto 10: - trace chemin((k/10)[A,F],(k/10)[B,G],(k/10)[C,H]); - endfor; - ); - color A,B,C,D,E,F,G,H; - TypePave3=image( - trace Pave(A,B,C,D,E,F,G,H)(0.1,0.1,0.1); - currentpicture:=nullpicture; - remplis polygone(A,B,C,H,E,F) withcolor if Print : blanc else: ColorEntier4 fi; - trace chemin(C,H,E); - trace chemin(A,F,E); - trace chemin(A,B,C); - trace chemin(F,G,H); - trace chemin(B,G); - ); - if Compact: - for k=0 upto (\NombreMilliers-1): - trace TypePave0 shifted ((Projette((k,0,0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreCentaines-1): - trace TypePave1 shifted ((Projette((0.1*k,1.5,0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreDizaines-1): - trace TypePave2 shifted ((Projette((0.1*k,3,0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreUnites-1): - trace TypePave3 shifted ((Projette((0,3.6,0.1*k))-Projette((0,0,0)))); - endfor; - else: - for k=0 upto (\NombreMilliers-1): - trace TypePave0 shifted ((Projette((0,1.1*(k-1),0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreCentaines-1): - trace TypePave1 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(k-1),0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreDizaines-1): - trace TypePave2 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(k-1),0))-Projette((0,0,0)))); - endfor; - for k=0 upto (\NombreUnites-1): - trace TypePave3 shifted ((Projette((0,1.1*\NombreMilliers+1.1*(\NombreCentaines-1)+0.2+0.2*(\NombreDizaines-1),0.2*(k)))-Projette((0,0,0)))); - endfor; - fi; - \end{Geometrie} - } -} - -% Gestion de l'aléatoire (pour la CAN) -\newcommand\ChoixAlea[4][]{% - \ifx\bla#1\bla% - \xdef#4{\fpeval{randint(#2,#3)}}% - \else% - \xdef#4{\fpeval{round(randint(#2,#3)+rand(),#1)}}% - \fi% -}% - -\def\VariableAlea#1#2{% - \xdef#1{\fpeval{#2}}% -}% - -% On bloque la graine de fabrication des nombres aléatoires. -\ExplSyntaxOn -\cs_new_eq:NN \PfCGraineAlea \sys_gset_rand_seed:n -\ExplSyntaxOff - -%%% -% Course aux nombres -%%% -\RequirePackage{longtable} -% https://tex.stackexchange.com/questions/642775/when-displaying-a-datatool-database-with-dtldisplaylongdb-how-to-obtain-a-hor -% Patch éventuel à ajouter -%\makeatletter -%\expandafter\patchcmd\expandafter{\csname\string\DTLdisplaylongdb\endcsname}% -% {\@dtl@resetdoamp\dtldisplaystarttab}% -% {\dtldisplaystarttab\@dtl@resetdoamp}% -% {\message{Patching succeeded.}}% -% {\message{Patching failed.}}% -%\makeatother - -\setKVdefault[ClesMathAlea]{NbQ=5,ChoixTables=2-9,ValeurMax=20,Classique,Trou=false,Melange=false,Multiple=2,Theme=false}% -\defKV[ClesMathAlea]{Trous=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Trou}}% -\defKV[ClesMathAlea]{Melanges=\setKV[ClesMathAlea]{Classique=false}\setKV[ClesMathAlea]{Melange}}% - -\newcommand\MathAlea[2][]{% - \useKVdefault[ClesMathAlea]% - \setKV[ClesMathAlea]{#1}% - \input{#2}% -}% - -\newcommand\CourseNombreTotalQuestions[1]{% - \setKV[ClesCN]{TotalQ=#1}% - \xdef\CNfoo{}% - \xintFor* ##1 in{\xintSeq{1}{#1}}\do{% - \xdef\CNfoo{\CNfoo ##1,}% - }% -}% - -\setKVdefault[ClesCN]{% - Stretch=2.5,%Elasticité du tableau - NbQ=5,%Nb de questions à poser - RAZ=false,%Pour remettre à zéro le compteur des questions - Ordre=false,%Pour mettre toutes les questions dans l'ordre des numéros - Exercice=false,%Pour utiliser l'aléatoire des questions mais sans habillage particulier, autre que des \item - Perso=false,%Pour utiliser un choix personnel des questions - Lecture=false,%Pour différencier avec une lecture automatisée sur les numéros de fichiers - Maitre=false,%Pour indiquer qu'on prend en compte ou pas les sous-dossiers - Nom=false,%Pour afficher le nom des fichiers utilisés. - Theme=false,%Pour afficher le theme travaillé dans les fichiers utilisés (à retravailler). - AMC=false,% - Multi=false,% - CAN=false,%Pour compléter la case réponse. - CoefQ=0.4,%Coefficient multiplication de \linewidth pour la colonne question - CoefR=0.35,%Coefficient multiplication de \linewidth pour la colonne réponse - CoefJ=0.15,%Coefficient multiplication de \linewidth pour la colonne jury -}% -\defKV[ClesCN]{Liste=\setKV[ClesCN]{Perso=true}\setKV[ClesCN]{Lecture}}% -\defKV[ClesCN]{Dossier=\setKV[ClesCN]{Lecture}}% -\defKV[ClesCN]{Debut=\setKV[ClesCN]{RAZ}}% -\setsepchar[*]{,*/}% -\readlist*\ListeMotsCAN{La moitié de /2,Le double de /1,Le triple de /1, Le tiers de /3,Le nombre dix fois plus grand que /1,Le nombre cent fois plus grand que /1,Le nombre mille fois plus grand que /1,Le nombre dix fois plus petit que /10,Le nombre cent fois plus petit que /100,Le nombre mille fois plus petit que /1000}% -\readlist*\ListeMulAstucieuxCAN{50/2,25/4,20/5}% -\readlist*\ListeLieuxObjetsCAN{boulangerie/pains au chocolat/un pain au chocolat,boulangerie/cookies/un cookie,boulangerie/brioches/une brioche,piscine/entrées/une entrée,boucherie/saucisses/une saucisse,boucherie/cuisses de poulet/une cuisse de poulet}% -\readlist*\ListeNomsCAN{Aude/Elle/d'Aude,Bernard/Il/de Bernard,Céline/Elle/de Céline,Daniel/Il/de Daniel,\'Elise/Elle/d'\'Elise,Fabien/Il/de Fabien,Gérard/Il/de Gérard,Hélène/Elle/d'Hélène,Ilies/Il/d'Ilies,Jasmine/Elle/de Jasmine,Kylian/Il/de Kylian,Laurent/Il/de Laurent,Mathilde/Elle/de Mathilde,Nina/Elle/de Nina,Octave/Il/d'Octave,Philippe/Il/de Philippe,Joachim/Il/de Joachim,Thérèse/Elle/de Thérèse,Nawel/Elle/de Nawel,Alexandre/Il/d'Alexandre,Maxence/Il/de Maxence,Sophie/Elle/de Sophie,Christophe/Il/de Christophe,Myriam/Elle/de Myriam,Nathalie/Elle/de Nathalie}% -\readlist*\ListeComposantStatCAN{voitures/un garage/Cross-over/Utilitaires/Berlines,fruits/une corbeille/Pommes/Oranges/Bananes,vêtements/une armoire/Pulls/T-shirts/Chemises,couverts/un tiroir/Fourchettes/Couteaux/Cuillères}% -\readlist*\ListeObjetsSymbolesCAN{fleurs/96,ciseaux/36,crayons/47,enveloppes/41}%uniquement avec pifont -\setsepchar{,}% -\readlist*\ListeObjetsCAN{bonbons,billes,jouets,fruits,biscuits,gâteaux,pommes,poires,pains au chocolat,cookies,croissants,muffins,brioches,saucisses,cuisses de poulet}% -\readlist*\ListePetitsObjetsCAN{bonbons,billes,biscuits,gommes,clous,vis} -\readlist*\ListeFruitsCAN{pommes,poires,abricots,cerises,fraises,framboises,noix,pêches,nectarines,myrtilles} -\readlist*\ListeSommetsCAN{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z} - -\newcommand\ExtraitPetitsObjets[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListePetitsObjetsCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListePetitsObjetsCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \readlist*\PetitsObjetsMelanges{\faa}% -}% - -\newcommand\ExtraitObjets[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeObjetsCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeObjetsCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \readlist*\ObjetsMelanges{\faa}% -}% - -\newcommand\ExtraitSymboles[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeObjetsSymbolesCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeObjetsSymbolesCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \setsepchar[*]{,*/}% - \readlist*\SymbolesMelanges{\faa}% - \setsepchar{,}% -}% - -\newcommand\ExtraitSommet[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeSommetsCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeSommetsCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \readlist*\SommetsMelanges{\faa}% - \readlist*\PtAlea{\faa}% -}% - -\newcommand\ExtraitFruit[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeFruitsCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeFruitsCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \readlist*\FruitsMelanges{\faa}% -}% - -\newcommand\ExtraitNom[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeNomsCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeNomsCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \setsepchar[*]{,*/}% - \readlist*\NomsMelanges{\faa}% - \setsepchar{,}% -}% - -\newcommand\ExtraitElements[1]{% - \xdef\CANSGFoo{}% - \foreachitem\compteur\in\ListeComposantStatCAN{% - \xdef\CANSGFoo{\CANSGFoo \ListeComposantStatCAN[\compteurcnt],}% - }% - \MelangeListe{\CANSGFoo}{#1}% - \setsepchar[*]{,*/}% - \readlist*\ElementsMelanges{\faa}% - \setsepchar{,}% -}% - -\newcounter{CNNumQ}% -\setcounter{CNNumQ}{1}% - -\newcommand\CANNew{% - \textcolor{Crimson}{\faCopy}% -}% - -\newread\RecupNbFichiers -\newread\RecupSSDossiers -\newread\zzz -\def\zzpar{\par}% - -\makeatletter -\def\app@exe{\write18} -% Recuperer les sous-dossiers -\def\RecupererSousDossiers#1{%#1 est le dossier contenant les fichiers can classés en sous-dossier - \app@exe{rm -f RecapSSDossier.tmp ; ls -1 -I "*.tex" #1 > RecapSSDossier.tmp}% - \immediate\openin\zzz=RecapSSDossier.tmp - \loop% - \read\zzz to \tmp% - \ifx\tmp\zzpar\else% - \xdef\CNFOOSSDossiers{\CNFOOSSDossiers \expandafter\detokenize\expandafter{\tmp},}% - \fi% - \ifeof\zzz\else% - \repeat% - \setsepchar{,}\ignoreemptyitems - \readlist*\ListeSSDossiers{\CNFOOSSDossiers} -} - -\def\RecupererFichierTeXSSDossier#1#2{% - \openin\zzz="|ls #1/#2/*.tex"% - \loop% - \read\zzz to \tmp% - \ifx\tmp\zzpar\else% - \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% - \fi% - \ifeof\zzz\else% - \repeat% -} - -\def\RecupererFichierTeXDossier#1{% - \xdef\CNFOO{}% - \openin\zzz="|ls #1/*.tex" - \loop% - \read\zzz to \tmp% - \ifx\tmp\zzpar\else% - \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% - \fi% - \ifeof\zzz\else% - \repeat% -} - -\def\DefinirListeFichiers{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeFichiers{\CNFOO}% -} - -\def\RecupererFichierTeXAllSSDossier#1{% - \RecupererSousDossiers{#1}% - \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}% - \DefinirListeFichiers% -} - -\def\RecupererFichierTeXAllDossier#1{% - \RecupererFichierTeXDossier{#1}% - \DefinirListeFichiers% -} - -\def\RecupererFichierTeXComplet#1{% - \RecupererFichierTeXDossier{#1}% - \RecupererSousDossiers{#1}% - \foreachitem\compteur\in\ListeSSDossiers{\RecupererFichierTeXSSDossier{#1}{\ListeSSDossiers[\compteurcnt]}}% - \DefinirListeFichiers% -} - -\def\RecupererFichierTeXSSDossierPerso#1{% - \openin\zzz="|ls #1/*.tex" - \loop% - \read\zzz to \tmp% - \ifx\tmp\zzpar\else% - \xdef\CNFOO{\CNFOO \expandafter\detokenize\expandafter{\tmp},}% - \fi% - \ifeof\zzz\else% - \repeat% -} - -\makeatother - -\newcommand\CNTheme[1]{}% -\newcommand\CNReponse{}% - -\newlength{\PfCLargeurQuestion}% -\newlength{\PfCLargeurReponse}% -\newlength{\PfCLargeurJury}% - -\NewDocumentCommand\CourseNombre{o m}{% - \useKVdefault[ClesCN]% - \setKV[ClesCN]{#1}% - \ifboolKV[ClesCN]{Theme}{\renewcommand\CNTheme[1]{{\ttfamily Thème : ##1}\par}}{}% - \ifboolKV[ClesCN]{RAZ}{% - \setcounter{CNNumQ}{\useKV[ClesCN]{Debut}}% - }{}% - \setKV[ClesMathAlea]{NbQ=1}% - \xdef\CNFOOSSDossiers{}% - \xdef\CNFOO{}% - \ifboolKV[ClesCN]{Lecture}{% - \ifboolKV[ClesCN]{Perso}{% - % % Ici \useKV[ClesCN]{Liste} - \xdef\CNFOOListePerso{\useKV[ClesCN]{Liste}}% - % % OK -> Là, normalement, c'est la liste des dossiers choisis par l'utilisateur : \CNFOOListePerso - \setsepchar{,}% - \readlist*\ListeDesSSDossiersPerso{\CNFOOListePerso}% - % % \par OK -> Là, normalement, c'est la liste des dossiers perso sous forme de liste : \showitems\ListeDesSSDossiersPerso[]% - \foreachitem\compteur\in\ListeDesSSDossiersPerso{\RecupererFichierTeXSSDossierPerso{\ListeDesSSDossiersPerso[\compteurcnt]}}% - \DefinirListeFichiers% - % % \par OK -> Là, enfin, normalement, c'est la liste des fichiers contenus dans les dossiers perso : - % % \showitems\ListeFichiers[] - }{% - \ifboolKV[ClesCN]{Maitre}{% - % % On récupère tous les fichiers can dans les sous-dossiers - % % et on construit une liste \ListeFichiers contenant les chemins des fichiers considérés. - \RecupererFichierTeXComplet{\useKV[ClesCN]{Dossier}}% - }{% - % % Là - % % On récupère seulement les fichiers can de ce dossier - % % et on consruit une liste \ListeFichiers contenant les chemins des fichiers considérés. - \RecupererFichierTeXAllDossier{\useKV[ClesCN]{Dossier}}% - }% - }% - % % On crée la liste du nombre total de questions - \xdef\CNfooListe{}% - \xintFor* ##1 in{\xintSeq{1}{\ListeFichierslen}}\do{% - \xdef\CNfooListe{\CNfooListe ##1,}% - }% - % % \par OK -> normalement, on a la liste du nombre de questions : \CNfooListe - % On règle maintenant les dimensions nécessaires. - % \ifboolKV[ClesCN]{CAN}{ - \setlength{\PfCLargeurQuestion}{\useKV[ClesCN]{CoefQ}\linewidth}\setlength{\PfCLargeurReponse}{\useKV[ClesCN]{CoefR}\linewidth}\setlength{\PfCLargeurJury}{\useKV[ClesCN]{CoefJ}\linewidth}% - % % On affiche les questions : - \ifboolKV[ClesCN]{Ordre}{% - % % soit dans un exercice - \ifboolKV[ClesCN]{Exercice}{% - % % Attention le style de l'environnement est à choisir par l'utilisateur - \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{% - \item\input{\ListeFichiers[##1]}% + \xdef\fii{\fii \ListeInter[##2],}% }% - }{% Soit toutes les questions au format course - \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}% - \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}% - \hhline{~---}% - \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\% - \hline% - \endhead% - \xintFor* ##1 in {\xintSeq{1}{\ListeFichierslen}}\do{% - \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\input{\ListeFichiers[##1]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&\ifboolKV[ClesCN]{CAN}{\CNReponse}{}&\\% - \hline% - }% - \end{longtable}% - \renewcommand{\arraystretch}{1}% }% }{% - % On prévient l'utilisateur si le nb de questions est inférieur à NbQ - \xintifboolexpr{\ListeFichierslen<\useKV[ClesCN]{NbQ}}{% - \faExclamationCircle~Le nombre maximal de questions disponibles est inférieur au nombre de questions à afficher. Modifier la clé {\ttfamily NbQ} ou ajouter des questions dans le(s) répertoire(s).% - }{%%On choisit NbQ questions parmi la liste de fichiers - \MelangeListe{\CNfooListe}{\useKV[ClesCN]{NbQ}}% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeCNQuestions{\faa} - \ifboolKV[ClesCN]{Exercice}{% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{% - \item\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}% - }% - }{% On les affiche - \renewcommand{\arraystretch}{\useKV[ClesCN]{Stretch}}% - \begin{longtable}{|c|p{\PfCLargeurQuestion}|>{\centering\arraybackslash}p{\PfCLargeurReponse}|p{\PfCLargeurJury}|}% - \hhline{~---}% - \multicolumn{1}{c|}{}&\cellcolor{gray!15}\centering\'Enoncé&\cellcolor{gray!15}\centering Réponse&\cellcolor{gray!15}\centering\arraybackslash Jury\\% - \hline% - \endhead% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesCN]{NbQ}}}\do{% - \ttfamily{\theCNNumQ}\stepcounter{CNNumQ}&\xdef\CNReponse{}\xdef\Numerodelaquestionaposer{\ListeCNQuestions[##1]}\input{\ListeFichiers[\Numerodelaquestionaposer]}\ifboolKV[ClesCN]{Nom}{\par\hfill\footnotesize\ttfamily\ListeFichiers[##1]}{}&\ifboolKV[ClesCN]{CAN}{\CNReponse}{}&\\ - \hline - }% - \end{longtable}% - \renewcommand{\arraystretch}{1}% - }% - }% + \xdef\faa{\faa \ListeInter[1]}% }% - }{% - \input{#2} + \readlist*\ListeInter{\fii}% }% + \reademptyitems% }% -% fin course aux nombres - -%%% -% Frise temporelle -%%% -\setKVdefault[ClesFrise]{Longueur=8cm,Fleches=false,Ecart=5mm,Sup=false}% - -\newtoks\toklistefrise% -\def\UpdatetoksFrise#1/#2/#3\nil{\addtotok\toklistefrise{"#1","#2","#3",}}% - -\newcommand\Frise[2][]{% - \useKVdefault[ClesFrise]% - \setKV[ClesFrise]{#1}% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeTempo{#2}% - \toklistefrise{}% - \foreachitem\compteur\in\ListeTempo{\expandafter\UpdatetoksFrise\compteur\nil} - \MPDessineFrise{\the\toklistefrise}% -} - -\newcommand\MPDessineFrise[1]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - Longueur:=\useKV[ClesFrise]{Longueur}; - Ecart:=\useKV[ClesFrise]{Ecart}; - boolean Fleches; - Fleches=\useKV[ClesFrise]{Fleches}; - boolean Sup; - Sup=\useKV[ClesFrise]{Sup}; - pair A[],B; - A0=(0,0); - B-A0=(Longueur,0); - n=0; - for p_=#1: - n:=n+1; - endfor; - for k=1 upto ((n div 3)-2): - A[k]=(k/((n div 3)-1))[A0,B]; - endfor; - A[(n div 3)-1]=B; - if Sup: - for k=0 upto ((n div 3)-1): - trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; - endfor; - % on définit les points milieu des fleches - path Fleche[]; - pair C[]; - for k=0 upto ((n div 3)-3): - Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); - C[k]=point (0.5*length Fleche[k]) of Fleche[k]; - endfor; - Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart)); - chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart)); - C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2]; - Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); - C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1]; - % - maxx:=n; - trace segment(A0,A[(n div 3)-2]); - trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly; - n:=0; - labeloffset:=labeloffset*2; - for p_=#1: - n:=n+1; - if n<maxx+1: - if (n mod 3)=1: - label.top(TEX(""&p_&""),A[n div 3]); - elseif (n mod 3)=2: - label.top(TEX(""&p_&""),C[n div 3]);% - elseif (n mod 3)=0: - label.bot(TEX(""&p_&""),C[(n div 3)-1]); - fi; - fi; - endfor; - drawoptions(); - labeloffset:=labeloffset/2; - if Fleches: - for k=0 upto ((n div 3)-4): - drawarrow Fleche[k]; - endfor; - drawarrow Fleche[(n div 3)-1]; - drawarrow Fleche[(n div 3)-2]; - drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); - for k=0 upto ((n div 3)-2): - draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; - endfor; - draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; - fi; - %fin Sup - else: - for k=0 upto ((n div 3)-1): - trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; - endfor; - % on définit les points milieu des fleches - path Fleche[]; - pair C[]; - for k=0 upto ((n div 3)-2): - Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); - C[k]=point (0.5*length Fleche[k]) of Fleche[k]; - endfor; - maxx:=n; - trace segment(A0,A[(n div 3)-1]); - n:=0; - labeloffset:=labeloffset*2; - for p_=#1: - n:=n+1; - if n<maxx: - if (n mod 3)=1: - label.top(TEX(""&p_&""),A[n div 3]); - elseif (n mod 3)=2: - if (n div 3)<((maxx div 3)-1):label.top(TEX(""&p_&""),C[n div 3]);fi; - elseif (n mod 3)=0: - label.bot(TEX(""&p_&""),C[(n div 3)-1]); - fi; - fi; - endfor; - labeloffset:=labeloffset/2; - if Fleches: - for k=0 upto ((n div 3)-2): - draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; - drawarrow Fleche[k]; - endfor; - draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; - fi; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - Longueur:=\useKV[ClesFrise]{Longueur}; - Ecart:=\useKV[ClesFrise]{Ecart}; - boolean Fleches; - Fleches=\useKV[ClesFrise]{Fleches}; - boolean Sup; - Sup=\useKV[ClesFrise]{Sup}; - }] - pair A[],B; - A0=(0,0); - B-A0=(Longueur,0); - n=0; - for p_=#1: - n:=n+1; - endfor; - for k=1 upto ((n div 3)-2): - A[k]=(k/((n div 3)-1))[A0,B]; - endfor; - A[(n div 3)-1]=B; - if Sup: - for k=0 upto ((n div 3)-1): - trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; - endfor; - % on définit les points milieu des fleches - path Fleche[]; - pair C[]; - for k=0 upto ((n div 3)-3): - Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); - C[k]=point (0.5*length Fleche[k]) of Fleche[k]; - endfor; - Fleche[(n div 3)-2]=%(A[(n div 3)-3]{dir-30}..{dir30}A[(n div 3)-1]) shifted((0,-Ecart)); - chemin(A[(n div 3)-3]+(0,-Ecart),A[(n div 3)-3]+(0,-4*Ecart),A[(n div 3)-1]+(0,-4*Ecart),A[(n div 3)-1]+(0,-Ecart)); - C[(n div 3)-1]=point (0.5*length Fleche[(n div 3)-2]) of Fleche[(n div 3)-2]; - Fleche[(n div 3)-1]=(A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); - C[(n div 3)-2]=point (0.5*length Fleche[(n div 3)-1]) of Fleche[(n div 3)-1]; - % - maxx:=n; - trace segment(A0,A[(n div 3)-2]); - trace segment(A[(n div 3)-2],A[(n div 3)-1]) dashed evenly; - n:=0; - labeloffset:=labeloffset*2; - for p_=#1: - n:=n+1; - if n<maxx+1: - if (n mod 3)=1: - label.top(LATEX(""&p_&""),A[n div 3]); - elseif (n mod 3)=2: - label.top(LATEX(""&p_&""),C[n div 3]);% - elseif (n mod 3)=0: - label.bot(LATEX(""&p_&""),C[(n div 3)-1]); - fi; - fi; - endfor; - drawoptions(); - labeloffset:=labeloffset/2; - if Fleches: - for k=0 upto ((n div 3)-4): - drawarrow Fleche[k]; - endfor; - drawarrow Fleche[(n div 3)-1]; - drawarrow Fleche[(n div 3)-2]; - drawarrow (A[(n div 3)-1]{dir-150}..{dir150}A[(n div 3)-2]) shifted((0,-Ecart)); - for k=0 upto ((n div 3)-2): - draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; - endfor; - draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; - fi; - %fin Sup - else: - for k=0 upto ((n div 3)-1): - trace (u*(0,-0.1)--u*(0,0.1)) shifted A[k]; - endfor; - % on définit les points milieu des fleches - path Fleche[]; - pair C[]; - for k=0 upto ((n div 3)-2): - Fleche[k]=(A[k]{dir-30}..{dir30}A[k+1]) shifted((0,-Ecart)); - C[k]=point (0.5*length Fleche[k]) of Fleche[k]; - endfor; - maxx:=n; - trace segment(A0,A[(n div 3)-1]); - n:=0; - labeloffset:=labeloffset*2; - for p_=#1: - n:=n+1; - if n<maxx: - if (n mod 3)=1: - label.top(LATEX(""&p_&""),A[n div 3]); - elseif (n mod 3)=2: - if (n div 3)<((maxx div 3)-1):label.top(LATEX(""&p_&""),C[n div 3]);fi; - elseif (n mod 3)=0: - label.bot(LATEX(""&p_&""),C[(n div 3)-1]); - fi; - fi; - endfor; - labeloffset:=labeloffset/2; - if Fleches: - for k=0 upto ((n div 3)-2): - draw segment(A[k],A[k]+(0,-Ecart)) dashed evenly; - drawarrow Fleche[k]; - endfor; - draw segment(A[(n div 3)-1],A[(n div 3)-1]+(0,-Ecart)) dashed evenly; - fi; - fi; - \end{mpost} - \fi -} - -%%% -% Geometrie -%%% -\setKVdefault[Geometrie]{CoinBG={(0,0)},CoinHD={(10u,10u)},TypeTrace="Instruments"}% - -\ifluatex -\NewDocumentEnvironment{Geometrie}{o +b}{% - \useKVdefault[Geometrie]% - \setKV[Geometrie]{#1}% - \mplibforcehmode - \begin{mplibcode} - % input PfCMPFr; - pair Coinbg,Coinhd; - Coinbg=\useKV[Geometrie]{CoinBG}; - Coinhd=\useKV[Geometrie]{CoinHD}; - if \useKV[Geometrie]{TypeTrace}="Instruments": - typetrace:="normal"; - elseif \useKV[Geometrie]{TypeTrace}="MainLevee": - typetrace:="mainlevee"; - elseif \useKV[Geometrie]{TypeTrace}="Espace": - typetrace:="3D"; - typerepre:="persp"; - fi; - xa=xpart(Coinbg); - xb=xpart(Coinhd); - ya=ypart(Coinbg); - yb=ypart(Coinhd); - feuille(xa,ya,xb,yb); - _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi; - _tfig:=2*_tfig; - #2% - \end{mplibcode} -}{} -\else -\NewDocumentEnvironment{Geometrie}{o +b}{% - \useKVdefault[Geometrie]% - \setKV[Geometrie]{#1}% - \begin{mpost}[mpsettings={ - pair Coinbg,Coinhd; - Coinbg=\useKV[Geometrie]{CoinBG}; - Coinhd=\useKV[Geometrie]{CoinHD}; - if \useKV[Geometrie]{TypeTrace}="Instruments": - typetrace:="normal"; - elseif \useKV[Geometrie]{TypeTrace}="MainLevee": - typetrace:="mainlevee"; - elseif \useKV[Geometrie]{TypeTrace}="Espace": - typetrace:="3D"; - typerepre:="persp"; - fi;} - ]% - xa=xpart(Coinbg); - xb=xpart(Coinhd);; - ya=ypart(Coinbg); - yb=ypart(Coinhd); - feuille(xa,ya,xb,yb); - _tfig:=if (xb-xa)>(yb-ya): (xb-xa) else: (yb-ya) fi; - _tfig:=2*_tfig; - #2% - \end{mpost} -}{} -\fi% %%% % Smiley @@ -7627,19306 +570,93 @@ trace rotation(Engrenage(Mm[w],Zz[w],K),K,180-AngleRot[w]); }%\raisebox } -%%%%% -% Enquête -%%%%% -\setKVdefault[ClesEnquete]{Perso=Qui ?,Objet=Quoi ?,Lieu=Où ?,Largeur=4.5cm} - -\newcommand\Enquete[1][]{% - \useKVdefault[ClesEnquete]% - \setKV[ClesEnquete]{#1}% -} - -\newcommand\ListePersonnages[1]{% - \setsepchar{§}% - \readlist*\RetiensListePersonnages{#1}% - \setsepchar{,}% -} - -\newcommand\ListeObjets[1]{% - \setsepchar{§}% - \readlist*\RetiensListeObjets{#1}% - \setsepchar{,}% -} - -\newcommand\ListeLieux[1]{% - \setsepchar{§}% - \readlist*\RetiensListeLieux{#1}% - \setsepchar{,}% -} - -\newcommand\MelangeListe[2]{% - % #1 Liste à mélanger - % #2 Nombre d'éléments à conserver - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeInter{#1}% - \xdef\faa{}% Liste construite - \xdef\fii{}% Liste détruite - % on crée les #2 premieres solutions. - \xintFor* ##1 in {\xintSeq{1}{#2}}\do{% - \xintifboolexpr{\ListeInterlen>1}{% - \xdef\Alea{\fpeval{randint(\ListeInterlen)}}% - \xdef\faa{\faa \ListeInter[\Alea],}% - \xdef\fii{}% - \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{% - \xintifboolexpr{##2 == \Alea}{% - }{% - \xdef\fii{\fii \ListeInter[##2],}% - }% - }% - }{% - \xdef\faa{\faa \ListeInter[1]}% - }% - \readlist*\ListeInter{\fii}% - }% - \reademptyitems% -}% - -\newcommand\ListeQuestions[1]{% - \setsepchar[*]{§*/}% - \readlist*\RetiensListeQuestions{#1} - % On crée la liste des numéros des questions - \xdef\foo{}% - \xintFor* ##1 in {\xintSeq{1}{\RetiensListeQuestionslen}}\do{% - \xdef\foo{\foo ##1,}% - }% - % Mélange des questions - % on crée les 6 premieres solutions. - \MelangeListe{\foo}{\fpeval{\RetiensListePersonnageslen}}% - \readlist*\ListeMelangeePersonnages{\faa}% - \readlist*\ListeRestante{\fii}%\ListeRestante[] - \MelangeListe{\faa}{\fpeval{\RetiensListePersonnageslen-1}}% - \readlist*\ListefuuPerso{\faa}% - % on crée les 6 solutions suivantes. - \xdef\fuuu{}% - \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}% - \MelangeListe{\fuuu}{\fpeval{\RetiensListeObjetslen}}% - \readlist*\ListeMelangeeObjets{\faa}% - \readlist*\ListeRestante{\fii}% - \MelangeListe{\faa}{\fpeval{\RetiensListeObjetslen-1}}% - \readlist*\ListefuuObjets{\faa}% - % on crée les dernieres solutions. - \xdef\fuuu{}% - \foreachitem\compteur\in\ListeRestante{\xdef\fuuu{\fuuu,\ListeRestante[\compteurcnt]}}% - \MelangeListe{\fuuu}{\fpeval{\RetiensListeLieuxlen}} - \readlist*\ListeMelangeeLieux{\faa}% - %% \readlist*\ListeRestante{\fii}% - \MelangeListe{\faa}{\fpeval{\RetiensListeLieuxlen-1}}% - \readlist*\ListefuuLieux{\faa}% - % -------------- - % Liste des questions sauvegardees - \xdef\fuu{}% - \foreachitem\compteur\in\ListefuuPerso{\xdef\fuu{\fuu,\ListefuuPerso[\compteurcnt]}}% - \foreachitem\compteur\in\ListefuuObjets{\xdef\fuu{\fuu,\ListefuuObjets[\compteurcnt]}}% - \foreachitem\compteur\in\ListefuuLieux{\xdef\fuu{\fuu,\ListefuuLieux[\compteurcnt]}}% - \ignoreemptyitems\setsepchar{,}% - \MelangeListe{\fuu}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}% - \readlist*\ListeMelangeeQuestions{\faa}% - \reademptyitems% -}% - -\newcommand\AffichageQuestions{% - \begin{enumerate} - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\RetiensListePersonnageslen+\RetiensListeObjetslen+\RetiensListeLieuxlen-3}}}\do{% - \item\xdef\Compteur{\ListeMelangeeQuestions[##1]}\RetiensListeQuestions[\Compteur,1] - } - \end{enumerate} -} - -\newcommand\AffichageTableau{% - \begin{tabular}{|>{\PfCTBstrut$\square$~}m{\useKV[ClesEnquete]{Largeur}}|} - \hline - \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Perso}}\\ - \hline - \xintFor* ##1 in {\xintSeq{1}{\RetiensListePersonnageslen}}\do{% - \RetiensListePersonnages[##1]\xdef\PfCCompteurMelange{\ListeMelangeePersonnages[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\ - } - % - \hline - \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Objet}}\\ - \hline - \xintFor* ##1 in {\xintSeq{1}{\RetiensListeObjetslen}}\do{% - \RetiensListeObjets[##1]\xdef\PfCCompteurMelange{\ListeMelangeeObjets[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2]\\ - } - % - \hline - \rowcolor{gray!15}\multicolumn{1}{|c|}{\PfCTBstrut\useKV[ClesEnquete]{Lieu}}\\ - \hline - \xintFor* ##1 in {\xintSeq{1}{\RetiensListeLieuxlen}}\do{% - \RetiensListeLieux[##1]\xdef\PfCCompteurMelange{\ListeMelangeeLieux[##1]} $\star$ \RetiensListeQuestions[\PfCCompteurMelange,2] - \\ - } - \hline - \end{tabular} -}% - - -%%% -% Modele en barre -%%% -\setKVdefault[ClesModeleBarre]{Hauteur=0.5cm,Largeur=1cm,Separation=0,Homogene=false}%Separation pour conserver le lien avec les équations. -\defKV[ClesModeleBarre]{Longueur=\setKV[ClesModeleBarre]{Homogene}}% - -\newtoks\toklistemodelbarresup% -\toklistemodelbarresup{}% -\def\UpdateListeModelBarreSup#1\nil{\addtotok\toklistemodelbarresup{#1,}}% -\newtoks\toklistemodelbarreinf% -\toklistemodelbarreinf{}% -\def\UpdateListeModelBarreInf#1\nil{\addtotok\toklistemodelbarreinf{#1,}}% - -\newcommand\ModeleBarre[3][]{% - % #1 options - % #2 éléments de la barre supérieure C1 2 $x$ 1 3/C2 1 1x/ - % #3 éléments de la barre inférieure (même lecture) - \useKVdefault[ClesModeleBarre]% - \setKV[ClesModeleBarre]{#1}% - \setsepchar{\\/ }% - \readlist\ListeModelBarreSup{#2}% - \readlist\ListeModelBarreInf{#3}% - \toklistemodelbarresup{}% - \foreachitem\compteur\in\ListeModelBarreSup{% - \foreachitem\valeur\in\ListeModelBarreSup[\compteurcnt]{% - \expandafter\UpdateListeModelBarreSup\valeur\nil% - }% - }% - \toklistemodelbarreinf{}% - \foreachitem\compteur\in\ListeModelBarreInf{% - \foreachitem\valeur\in\ListeModelBarreInf[\compteurcnt]{% - \expandafter\UpdateListeModelBarreInf\valeur\nil% - }% - }% - \ifboolKV[ClesModeleBarre]{Homogene}{% - \PfCMPDessineModelBarre{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}% - }{% - \PfCMPDessineModelBarreNonHomogene{\the\toklistemodelbarresup}{\the\toklistemodelbarreinf}% - }% -}% - -\newcommand\PfCMPDessineModelBarre[2]{% - \begin{mplibcode}% - Longueur:=\useKV[ClesModeleBarre]{Longueur}; - Hauteur:=\useKV[ClesModeleBarre]{Hauteur}; - - vardef Briquesup(expr col)(text t)= - save $; - picture $; - $=image( - u:=Longueur/MBnbcasessuptotal; - remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col; - draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)); - label(TEX(t),iso((0,0),(u,Hauteur))); - u:=1cm; - ); - $ - enddef; - - vardef Briqueinf(expr col)(text t)= - save $; - picture $; - $=image( - u:=Longueur/MBnbcasesinftotal; - remplis polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)) withcolor col; - draw polygone((0,0),(u,0),(u,Hauteur),(0,Hauteur)); - label(TEX(t),iso((0,0),(u,Hauteur))); - u:=1cm; - ); - $ - enddef; - - numeric MBnbcolsup;%compte combien de couleurs - MBnbcolsup=0; - color MBColSup[];%Sauvegarde les couleurs de la barre sup - numeric MBnbinfosup[];%compte combien d'infos par couleurs. - numeric MBnbcasessup[][]; - numeric MBnbcasessuptotal; - MBnbcasessuptotal=0; - string MBTextcasessup[][]; - vardef toto(text t)= - for p_=t: - if color p_: - MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs - MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases - MBnbinfosup[MBnbcolsup]:=0; - else: - if numeric p_: - MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; - MBnbcasessuptotal:=MBnbcasessuptotal+p_; - MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - else: - MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - fi; - fi; - endfor; - enddef; - - toto(#1); - - numeric MBnbcolinf;%compte combien de couleurs - MBnbcolinf=0; - color MBColInf[];%Sauvegarde les couleurs de la barre inf - numeric MBnbinfoinf[];%compte combien d'infos par couleurs. - numeric MBnbcasesinf[][]; - numeric MBnbcasesinftotal; - MBnbcasesinftotal=0; - string MBTextcasesinf[][]; - vardef tata(text t)= - for p_=t: - if color p_: - MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs - MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases - MBnbinfoinf[MBnbcolinf]:=0; - else: - if numeric p_: - MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; - MBnbcasesinftotal:=MBnbcasesinftotal+p_; - MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - else: - MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - fi; - fi; - endfor; - enddef; - - tata(#2); - - pair VecteurDeplasup; - VecteurDeplasup=(Longueur/MBnbcasessuptotal,0); - - numeric MBnbdepla; - MBnbdepla=0; - for k=1 upto MBnbcolsup: - for l=1 upto MBnbinfosup[k]: - for j=1 upto MBnbcasessup[k][l]: - trace Briquesup(MBColSup[k])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDeplasup); - MBnbdepla:=MBnbdepla+1; - endfor; - endfor; - endfor; - - pair VecteurDeplainf; - VecteurDeplainf=(Longueur/MBnbcasesinftotal,0); - - numeric MBnbdepla; - MBnbdepla=0; - for k=1 upto MBnbcolinf: - for l=1 upto MBnbinfoinf[k]: - for j=1 upto MBnbcasesinf[k][l]: - trace Briqueinf(MBColInf[k])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDeplainf+(0,-Hauteur)); - MBnbdepla:=MBnbdepla+1; - endfor; - endfor; - endfor; - \end{mplibcode} -}% - -\newcommand\PfCMPDessineModelBarreNonHomogene[2]{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode} - Longueur:=\useKV[ClesModeleBarre]{Largeur}; - Hauteur:=\useKV[ClesModeleBarre]{Hauteur}; - Separation:=\useKV[ClesModeleBarre]{Separation}; - - vardef Brique(expr col,nbfois)(text t)= - save $; - picture $; - $=image( - u:=Longueur; - if t="?": - draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly; - else: - remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col; - draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)); - fi; - if nbfois>0: - label(TEX(t),iso((0,0),(u*abs(nbfois),Hauteur))); - else: - label.bot(TEX(t),iso((0,0),(u*abs(nbfois),-Hauteur))); - drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur); - fi; - u:=1cm; - ); - $ - enddef; - - numeric MBnbcolsup;%compte combien de couleurs - MBnbcolsup=0; - color MBColSup[];%Sauvegarde les couleurs de la barre sup - numeric MBnbinfosup[];%compte combien d'infos par couleurs. - numeric MBnbcasessup[][]; - numeric MBnbcasessuptotal; - MBnbcasessuptotal=0; - string MBTextcasessup[][]; - vardef toto(text t)= - for p_=t: - if color p_: - MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs - MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases - MBnbinfosup[MBnbcolsup]:=0; - else: - if numeric p_: - MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; - MBnbcasessuptotal:=MBnbcasessuptotal+p_; - MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - else: - MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - fi; - fi; - endfor; - enddef; - - toto(#1); - - numeric MBnbcolinf;%compte combien de couleurs - MBnbcolinf=0; - color MBColInf[];%Sauvegarde les couleurs de la barre inf - numeric MBnbinfoinf[];%compte combien d'infos par couleurs. - numeric MBnbcasesinf[][]; - numeric MBnbcasesinftotal; - MBnbcasesinftotal=0; - string MBTextcasesinf[][]; - vardef tata(text t)= - for p_=t: - if color p_: - MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs - MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases - MBnbinfoinf[MBnbcolinf]:=0; - else: - if numeric p_: - MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; - MBnbcasesinftotal:=MBnbcasesinftotal+p_; - MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - else: - MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - fi; - fi; - endfor; - enddef; - - tata(#2); - - pair VecteurDepla; - VecteurDepla=(Longueur,0); - - numeric MBnbdepla; - MBnbdepla=0; - for k=1 upto MBnbcolsup: - for l=1 upto MBnbinfosup[k]: - trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla); - MBnbdepla:=MBnbdepla+MBnbcasessup[k][l]; - endfor; - endfor; - - MBnbdepla:=0; - for k=1 upto MBnbcolinf: - for l=1 upto MBnbinfoinf[k]: - trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+(0,-Hauteur)); - if MBnbcasesinf[k][l]<0: - for j=1 upto (abs(MBnbcasesinf[k][l])-1): - trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+(0,-Hauteur)) withcolor black; - endfor; - fi; - MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]); - endfor; - endfor; - - if Separation>0: - draw (u*Separation,-1.5Hauteur)--(u*Separation,1.5Hauteur) withpen pencircle scaled 1.5 dashed evenly withcolor red; - fi; - - \end{mplibcode}% - \else - \begin{mpost}[mpsettings={Longueur:=\useKV[ClesModeleBarre]{Largeur};Hauteur:=\useKV[ClesModeleBarre]{Hauteur};Separation:=\useKV[ClesModeleBarre]{Separation};}] - vardef Brique(expr col,nbfois)(text t)= - save $; - picture $; - $=image( - u:=Longueur; - if t="?": - draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) dashed evenly; - else: - remplis polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)) withcolor col; - draw polygone((0,0),(u*abs(nbfois),0),(u*abs(nbfois),Hauteur),(0,Hauteur)); - fi; - if nbfois>0: - label(LATEXProf(t),iso((0,0),(u*abs(nbfois),Hauteur))); - else: - label.bot(LATEXProf(t),iso((0,0),(u*abs(nbfois),-Hauteur))); - drawdblarrow (0,-0.5*Hauteur)--(u*abs(nbfois),-0.5*Hauteur); - fi; - u:=1cm; - ); - $ - enddef; - - numeric MBnbcolsup;%compte combien de couleurs - MBnbcolsup=0; - color MBColSup[];%Sauvegarde les couleurs de la barre sup - numeric MBnbinfosup[];%compte combien d'infos par couleurs. - numeric MBnbcasessup[][]; - numeric MBnbcasessuptotal; - MBnbcasessuptotal=0; - string MBTextcasessup[][]; - vardef toto(text t)= - for p_=t: - if color p_: - MBnbcolsup:=MBnbcolsup+1;% on incrémente le nombre de couleurs - MBColSup[MBnbcolsup]:=p_;% on définit la couleur de la série de cases - MBnbinfosup[MBnbcolsup]:=0; - else: - if numeric p_: - MBnbinfosup[MBnbcolsup]:=MBnbinfosup[MBnbcolsup]+1; - MBnbcasessuptotal:=MBnbcasessuptotal+p_; - MBnbcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - else: - MBTextcasessup[MBnbcolsup][MBnbinfosup[MBnbcolsup]]:=p_; - fi; - fi; - endfor; - enddef; - - toto(#1); - - numeric MBnbcolinf;%compte combien de couleurs - MBnbcolinf=0; - color MBColInf[];%Sauvegarde les couleurs de la barre inf - numeric MBnbinfoinf[];%compte combien d'infos par couleurs. - numeric MBnbcasesinf[][]; - numeric MBnbcasesinftotal; - MBnbcasesinftotal=0; - string MBTextcasesinf[][]; - vardef tata(text t)= - for p_=t: - if color p_: - MBnbcolinf:=MBnbcolinf+1;% on incrémente le nombre de couleurs - MBColInf[MBnbcolinf]:=p_;% on définit la couleur de la série de cases - MBnbinfoinf[MBnbcolinf]:=0; - else: - if numeric p_: - MBnbinfoinf[MBnbcolinf]:=MBnbinfoinf[MBnbcolinf]+1; - MBnbcasesinftotal:=MBnbcasesinftotal+p_; - MBnbcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - else: - MBTextcasesinf[MBnbcolinf][MBnbinfoinf[MBnbcolinf]]:=p_; - fi; - fi; - endfor; - enddef; - - tata(#2); - - pair VecteurDepla; - VecteurDepla=(Longueur,0); - - numeric MBnbdepla; - MBnbdepla=0; - for k=1 upto MBnbcolsup: - for l=1 upto MBnbinfosup[k]: - trace Brique(MBColSup[k],MBnbcasessup[k][l])(MBTextcasessup[k][l]) shifted(MBnbdepla*VecteurDepla); - MBnbdepla:=MBnbdepla+MBnbcasessup[k][l]; - endfor; - endfor; - - MBnbdepla:=0; - for k=1 upto MBnbcolinf: - for l=1 upto MBnbinfoinf[k]: - trace Brique(MBColInf[k],MBnbcasesinf[k][l])(MBTextcasesinf[k][l]) shifted(MBnbdepla*VecteurDepla+u*(0,-0.5)); - if MBnbcasesinf[k][l]<0: - for j=1 upto (abs(MBnbcasesinf[k][l])-1): - trace ((0,0)--(0,Hauteur)) shifted((MBnbdepla+j)*VecteurDepla+u*(0,-0.5)) withcolor black; - endfor; - fi; - MBnbdepla:=MBnbdepla+abs(MBnbcasesinf[k][l]); - endfor; - endfor; - - if Separation>0: - draw u*(Separation,-0.75)--u*(Separation,0.75) withpen pencircle scaled 1.5 dashed evenly withcolor red; - fi; - - \end{mpost} - \fi -}% - -%%% -% Fiche m\'emorisation active -%%% -\setKVdefault[ClesFicheMemo]{TexteReponses=Réponses,TexteQuestions=Questions,Solution=false,Largeur=\linewidth} - -\newcommand\FicheMemo[3][]{% - \xdef\CountcolUn{0}% - \xdef\CountcolDeux{0}% - \useKVdefault[ClesFicheMemo]% - \setKV[ClesFicheMemo]{#1}% - \setsepchar[*]{§*/}\reademptyitems% - \readlist*\ListeQuestionColonneUn{#2}% - \readlist*\ListeQuestionColonneDeux{#3}% - \renewcommand{\arraystretch}{1.35}% - \begin{NiceTabular}[width=\useKV[ClesFicheMemo]{Largeur}]{X[1]X[1]X[1]X[1]}[hvlines] - \CodeBefore% - \rowcolor{gray!15}{1}% - \tikz\draw[dashed,gray!50](2-|1.5) to (last-|1.5);% - \tikz\draw[dashed,gray!50](2-|4.5) to (last-|4.5);% - \Body% - \Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}&&&\Block{1-1}{\bfseries\useKV[ClesFicheMemo]{TexteReponses}}\\ - \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{% - \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{% - \uppercase{&}}{% - \Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneUn[##1,3]}{}}% - \uppercase{&}\xdef\CountcolUn{\fpeval{\CountcolUn+1}}\Block[l]{\fpeval{\ListeQuestionColonneUn[##1,1]}-1}{\ListeQuestionColonneUn[##1,2]}% - }% - &% - \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{% - \uppercase{&}% - }{% - \xdef\CountcolDeux{\fpeval{\CountcolDeux+1}}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ListeQuestionColonneDeux[##1,2]}\uppercase{&}\Block[l]{\fpeval{\ListeQuestionColonneDeux[##1,1]}-1}{\ifboolKV[ClesFicheMemo]{Solution}{\ListeQuestionColonneDeux[##1,3]}{}}% - }% - \\% - }% - \CodeAfter% - \tikz\node[xshift=0.5em] at (2-|1) {\scriptsize\faCut};% - \xdef\PfCCountCutUn{2}% - \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneUnlen}}\do{% - \xintifboolexpr{\listlen\ListeQuestionColonneUn[##1]==2}{% - }{% - \xdef\PfCCountCutUn{\fpeval{\PfCCountCutUn+\ListeQuestionColonneUn[##1,1]}}% - \tikz\node[xshift=0.5em] at (\fpeval{\PfCCountCutUn}-|1) {\scriptsize\faCut};% - }% - }% - \tikz\node[xshift=-0.5em] at (2-|last) {\scriptsize\rotatebox{180}{\faCut}};% - \xdef\PfCCountCutDeux{2}% - \xintFor* ##1 in {\xintSeq {1}{\ListeQuestionColonneDeuxlen}}\do{% - \xintifboolexpr{\listlen\ListeQuestionColonneDeux[##1]==2}{% - }{% - \xdef\PfCCountCutDeux{\fpeval{\PfCCountCutDeux+\ListeQuestionColonneDeux[##1,1]}}% - \tikz\node[xshift=-0.5em] at (\fpeval{\PfCCountCutDeux}-|last) {\scriptsize\rotatebox{180}{\faCut}};% - }% - }% - \tikz\node[xshift=0.5em] at (1-|1) {\color{gray}\scriptsize\faCut};% - \tikz\node[xshift=0.5em] at (last-|1) {\color{gray}\scriptsize\faCut};% - \tikz\node[xshift=-0.5em] at (1-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};% - \tikz\node[xshift=-0.5em] at (last-|last) {\color{gray}\scriptsize\rotatebox{180}{\faCut}};% - \tikz\node at (1.5-|2.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} 1 à \num{\CountcolUn}};% - \tikz\node at (1.5-|3.5) {\bfseries\useKV[ClesFicheMemo]{TexteQuestions} \num{\fpeval{\CountcolUn+1}} à \num{\fpeval{\CountcolUn+\CountcolDeux}}};% - \end{NiceTabular}% - \renewcommand{\arraystretch}{1}% - \setsepchar{,}% -}% - -%%% -% Op\'erations pos\'es à trou -%%% -%% D'après https://tex.stackexchange.com/questions/277246/drawing-a-circle-around-the-numbers-in-xlop-package - -\newcommand\PfCchiffre[2]{\tikz[remember picture] \node[inner sep=0pt](#1){#2};} - -\newcommand\PfCentoure[2]{\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)]{} ;} - -\newcounter{divxlop}% -\newcounter{mulxlop}% -\newcounter{addxlop}% -\newcounter{subxlop}% - -\setKVdefault[ClesOperations]{Solution=false,CouleurCadre=LightSteelBlue,CouleurSolution=red,CouleurFond=white,CouleurVirgule=white} - -\newcommand\Division[3][]{% - \useKVdefault[ClesOperations]% - \setKV[ClesOperations]{#1}% - \setcounter{divxlop}{0}% - \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}}% - \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}{PfCSolOp}}{\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{mulxlop}{0}% - \ifboolKV[ClesOperations]{Solution}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% - \opmul[decimalsepsymbol={,},lineheight=2em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle=\stepcounter{mulxlop}\color{PfCSolOp}\PfCchiffre{A\themulxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}% - \foreach \i in {1,...,\themulxlop}{% - \PfCentoure{A\i}{A\i}% - }% -}% - -\newcommand\Addition[3][]{% - \useKVdefault[ClesOperations]% - \setKV[ClesOperations]{#1}% - \setcounter{addxlop}{0}% - \ifboolKV[ClesOperations]{Solution}{\opset{carryadd,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carryadd=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% - \opadd[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle=\stepcounter{addxlop}\color{PfCSolOp}\PfCchiffre{A\theaddxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3} - \foreach \i in {1,...,\theaddxlop}{% - \PfCentoure{A\i}{A\i}% - }% -}% - -\newcommand\Soustraction[3][]{% - \useKVdefault[ClesOperations]% - \setKV[ClesOperations]{#1}% - \setcounter{subxlop}{0}% - \ifboolKV[ClesOperations]{Solution}{\opset{carrysub,carrystyle=\color{PfCSolOp}\scriptsize}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurSolution}}\colorlet{PfCCouleurVirgule}{PfCSolOp}}{\opset{carrysub=false}\colorlet{PfCSolOp}{\useKV[ClesOperations]{CouleurFond}}\colorlet{PfCCouleurVirgule}{\useKV[ClesOperations]{CouleurVirgule}}}% - \opsub[decimalsepsymbol={,},lineheight=1.75em,columnwidth=1.5em,displayintermediary=all,voperator=bottom,intermediarystyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle=\stepcounter{subxlop}\color{PfCSolOp}\PfCchiffre{A\thesubxlop},resultstyle.d=\color{PfCCouleurVirgule}]{#2}{#3}% - \foreach \i in {1,...,\thesubxlop}{% - \PfCentoure{A\i}{A\i} - }% -}% - -%%% -% Cartographie -%%% -\setKVdefault[Cartographie]{Echelle=1,Carte=false,All=false,Europe=false,Asie=false,Amsud=false,Amnord=false,Amcentre=false,Caraibes=false,Afrique=false,AfficheEchelle=false,PaysSeul=false,VillesSup=false,Capitales=false,Impression=false,Fleuves=false,CouleurFond=ciel,Largeur=12,Hauteur=12,Arborescence="/usr/local/texlive/2022/texmf-dist/metapost/profcollege/datastest/",Projection=false,TypeProjection="mercator",CouleurPays=Cornsilk,Pasl=2,PasL=2} -\defKV[Cartographie]{EchelleCarte=\setKV[Cartographie]{Carte}} -\defKV[Cartographie]{Pays=\setKV[Cartographie]{PaysSeul}} -\defKV[Cartographie]{Villes=\setKV[Cartographie]{VillesSup}} - -\newcommand\Cartographie[3][]{% - \ifluatex - \useKVdefault[Cartographie] - \setKV[Cartographie]{#1} - \ifboolKV[Cartographie]{Projection}{% - \mplibforcehmode - \begin{mplibcode} - input PfCMonde; - string arborescence; - arborescence:=\useKV[Cartographie]{Arborescence}; - boolean Impression,VillesSup; - VillesSup=\useKV[Cartographie]{VillesSup}; - Impression=\useKV[Cartographie]{Impression}; - - maillage:=true; - fleuves:=false; - lacs:=false; - capitales:=false; - - if Impression: - noncolore:=true; - payscolor:=white; - else: - noncolore:=true; - payscolor:=\useKV[Cartographie]{CouleurPays}; - fi; - - projection:=\useKV[Cartographie]{TypeProjection}; - feuillet:=u*(-20,-20)--u*(20,-20)--u*(20,20)--u*(-20,20)--cycle; - drawoptions(withpen pencircle scaled 0.5 withcolor 0.5white); - Projection(3,48,\useKV[Cartographie]{Echelle}); - drawoptions(); - - if projection="mercator": - clip currentpicture to (mercatorc(-85,-180)--mercatorc(-85,180)--mercatorc(85,180)--mercatorc(85,-180)--cycle); - draw mercatorc(0,-180)--mercatorc(0,180); - draw mercatorc(-85,0)--mercatorc(85,0); - label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),mercatorc(0,0)); - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(-k*10,0)); - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(k*10,0)); - endfor; - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,-k*10)); - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),mercatorc(0,k*10)); - endfor; - elseif projection="cylindrique": - clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle); - draw cylindriquec(0,-180)--cylindriquec(0,180); - draw cylindriquec(-85,0)--cylindriquec(85,0); - label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0)); - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0)); - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0)); - endfor; - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10)); - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10)); - endfor; - elseif projection="winkel": - clip currentpicture to (winkelc(-85,-180)--winkelc(-85,180) for k=-80 step 5 until 85:--winkelc(k,180) endfor --winkelc(85,-180) for k=80 step -5 until -85:--winkelc(k,-180) endfor --cycle); - draw winkelc(0,-180)--winkelc(0,180); - draw winkelc(-85,0)--winkelc(85,0); - label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),winkelc(0,0)); - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(-k*10,0)); - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(k*10,0)); - endfor; - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,-k*10)); - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),winkelc(0,k*10)); - endfor; - elseif projection="cylindrique": - clip currentpicture to (cylindriquec(-85,-180)--cylindriquec(-85,180)--cylindriquec(85,180)--cylindriquec(85,-180)--cycle); - draw cylindriquec(0,-180)--cylindriquec(0,180); - draw cylindriquec(-85,0)--cylindriquec(85,0); - label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),cylindriquec(0,0)); - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(-k*10,0)); - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(k*10,0)); - endfor; - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,-k*10)); - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),cylindriquec(0,k*10)); - endfor; - elseif projection="simple": - clip currentpicture to (simplec(-85,-180)--simplec(-85,180)--simplec(85,180)--simplec(85,-180)--cycle); - draw simplec(0,-180)--simplec(0,180); - draw simplec(-85,0)--simplec(85,0); - label.llft(TEX("\tiny \ang{"&decimal(0)&"}"),simplec(0,0)); - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 8: - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(-k*10,0)); - label.lft(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(k*10,0)); - endfor; - for k=\useKV[Cartographie]{Pasl} step \useKV[Cartographie]{Pasl} until 18: - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,-k*10)); - label.bot(TEX("\tiny \ang{"&decimal(k*10)&"}"),simplec(0,k*10)); - endfor; - fi; - if VillesSup: - nomfichiermul:=\useKV[Cartographie]{Villes}; - nblec:=scantokens readfrom nomfichiermul; - drawoptions(withcolor (0.15,0.15,0.15)); - for p=1 upto nblec: - pair Coord[],latlon;string p_; - latlon=scantokens readfrom nomfichiermul; - p_=scantokens readfrom nomfichiermul; - if projection="mercator": - Coord[p]=mercatorc(ypart(latlon),xpart(latlon)); - elseif projection="winkel": - Coord[p]=winkelc(ypart(latlon),xpart(latlon)); - elseif projection="cylindrique": - Coord[p]=cylindriquec(ypart(latlon),xpart(latlon)); - elseif projection="simple": - Coord[p]=simplec(ypart(latlon),xpart(latlon)); - fi; - marque_p:="croix"; - pointe(Coord[p]); - label.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]); - endfor; - drawoptions(); - closefrom nomfichiermul; - fi; - \end{mplibcode} - }{% - \mplibforcehmode - \begin{mplibcode} - input PfCMonde; - string arborescence; - arborescence:=\useKV[Cartographie]{Arborescence}; - LargeurCadre=\useKV[Cartographie]{Largeur}; - HauteurCadre=\useKV[Cartographie]{Hauteur}; - distanceecran=100*\useKV[Cartographie]{Echelle}; - fleuves:=\useKV[Cartographie]{Fleuves}; - boolean Carte,Impression,VillesSup; - Carte=\useKV[Cartographie]{Carte}; - Impression=\useKV[Cartographie]{Impression}; - VillesSup=\useKV[Cartographie]{VillesSup}; - couleurfond:=\useKV[Cartographie]{CouleurFond}; - if Impression: - noncolore:=true; - payscolor:=0.85white; - couleurfond:=white; - couleurfleuve:=couleurfond; - fi; - capitales:=\useKV[Cartographie]{Capitales}; - All:=\useKV[Cartographie]{All}; - Europe:=\useKV[Cartographie]{Europe}; - Asie:=\useKV[Cartographie]{Asie}; - Amsud:=\useKV[Cartographie]{Amsud}; - Amnord:=\useKV[Cartographie]{Amnord}; - Amcentrale:=\useKV[Cartographie]{Amcentre}; - Caraibes:=\useKV[Cartographie]{Caraibes}; - Afrique:=\useKV[Cartographie]{Afrique}; - if Carte: - Echelle:=\useKV[Cartographie]{AfficheEchelle}; - figure(-0.5u*LargeurCadre,-0.5u*HauteurCadre,0.5u*LargeurCadre,0.5u*HauteurCadre); - if \useKV[Cartographie]{PaysSeul}: - projection:="bonne"; - theta:=#2; - phi:=#3; - zoom(echelle(#2,#3,\useKV[Cartographie]{EchelleCarte})); - fill (bonnec(-90,-180) for k=-85 step 5 until 90:..bonnec(k,-180) endfor)..reverse(bonnec(-90,180) for k=-85 step 5 until 90:..bonnec(k,180) endfor)..cycle withcolor couleurfond; - lecturep(arborescence&\useKV[Cartographie]{Pays}&".dat",couleurfond);% - trace feuillet withpen pencircle scaled 2; - if Echelle=true: - draw ((Xa,Ya)+u*(1,1))--((Xa,Ya)+u*(2,1)); - labeloffset:=labeloffset*1.5; - label.top(btex 0 etex,(Xa,Ya)+u*(1,1)); - label.top(TEX(""&decimal(Long)&"~km"),(Xa,Ya)+u*(2,1)); - labeloffset:=labeloffset/1.5; - draw ((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9)); - draw (((Xa,Ya)+u*(1,1.1))--((Xa,Ya)+u*(1,0.9))) shifted(u*(1,0)); - fi; - else: - projection:="bonne"; - Projection(#2,#3,echelle(#2,#3,\useKV[Cartographie]{EchelleCarte})); - trace feuillet withpen pencircle scaled 2; - fi; - if VillesSup: - nomfichiermul:=\useKV[Cartographie]{Villes}; - nblec:=scantokens readfrom nomfichiermul; - drawoptions(withcolor (0.15,0.15,0.15)); - projection:="bonne"; - for p=1 upto nblec: - pair Coord[],latlon;string p_; - latlon=scantokens readfrom nomfichiermul; - p_=scantokens readfrom nomfichiermul; - Coord[p]=bonnec(ypart(latlon),xpart(latlon)); - dotlabel.scantokens readfrom nomfichiermul(TEX(""&p_&""),Coord[p]); - endfor; - drawoptions(); - closefrom nomfichiermul; - fi; - else: - mappemonde(#2,#3); - fi; - \end{mplibcode} - } - \else - \PackageWarning{ProfCollege}{"La commande Cartographie n'est compatible qu'avec LuaLaTeX."} - \fi -}% - -%%% -% Twitter -%%% -\setKVdefault[Twitter]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Url=ViveLaTeX,EchelleLogo=0.035,Logo=DrStrange,Publie=false} - -\NewEnviron{Twitter}[1][]{% - \useKVdefault[Twitter]% - \setKV[Twitter]{#1}% - \xdef\EchelleLogo{\useKV[Twitter]{EchelleLogo}}% - \begin{tcolorbox}[% - enhanced,% - overlay unbroken and first={% - \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\textbf{\useKV[Twitter]{Auteur}}~{\color{gray}@\ttfamily \useKV[Twitter]{Url} - \useKV[Twitter]{Date}}}; - \node[anchor=center,xshift=1em+2mm,yshift=-2em] at (frame.north west) {\LogoTW{\useKV[Twitter]{Logo}}{\EchelleLogo}}; - \node[xshift=-1em,yshift=-2em] at (frame.north east) {\color{gray}...}; - \coordinate[yshift=1em] (A) at (frame.south west); - \coordinate[yshift=1em] (B) at (frame.south east); - \node[] (C1) at ($(A)!0.1!(B)$) {\faComment[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; - \node[] (C2) at ($(A)!0.325!(B)$) {\faRetweet\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; - \node[] (C3) at ($(A)!0.55!(B)$) {\faHeart[regular]\ifboolKV[Twitter]{Publie}{~\fpeval{randint(1,10)}}{}}; - \node[] (C4) at ($(A)!0.775!(B)$) {\faShareSquare}; - }, - colback=white, - colframe=gray!15, - top=2em, - left=3em, - bottom=2em] - \vspace*{0.5em}\par - \BODY% - \end{tcolorbox} -} - -%%% -% Facebook -%%% -\setKVdefault[Facebook]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Heure=3:14,EchelleLogo=0.035,Logo=DrStrange,Publie=false} - -\NewEnviron{Facebook}[1][]{% - \useKVdefault[Facebook]% - \setKV[Facebook]{#1}% - \xdef\EchelleLogo{\useKV[Facebook]{EchelleLogo}}% - \begin{tcolorbox}[% - enhanced,% - overlay unbroken and first={% - \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Facebook]{Auteur}}}; - \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray}\useKV[Facebook]{Date}, \useKV[Facebook]{Heure}}; - \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Facebook]{Logo}}{\EchelleLogo}}; - \node[xshift=-1em,yshift=-1.5em] at (frame.north east) {\bfseries\color{gray}...}; - \coordinate[yshift=1.15em] (A) at (frame.south west); - \coordinate[yshift=1.15em] (B) at (frame.south east); - \coordinate[xshift=0.5em,yshift=1.8em] (A1) at (frame.south west); - \coordinate[xshift=-0.5em,yshift=1.8em] (B1) at (frame.south east); - \coordinate[xshift=0.5em,yshift=0.5em] (A2) at (frame.south west); - \coordinate[xshift=-0.5em,yshift=0.5em] (B2) at (frame.south east); - \ifboolKV[Facebook]{Publie}{% - \coordinate[xshift=1em,yshift=1em] (A3) at (A1); - \draw[blue,fill=blue] (A3) circle (1.5mm); - \node[] at (A3) {\tiny\color{white}\faThumbsUp}; - \node[anchor=west] at (A3) {~\scriptsize\fpeval{randint(1,150)}}; - \node[anchor=east,xshift=-1em,yshift=1em] at (B1) {\scriptsize\fpeval{randint(2,20)} commentaires~\fpeval{randint(2,10)} partages}; - }{} - \draw[gray] (A1)--(B1); - \draw[gray] (A2)--(B2); - \node[] (C1) at ($(A)!0.15!(B)$) {\footnotesize\faThumbsUp{}~\bfseries J'aime}; - \node[] (C2) at ($(A)!0.5!(B)$) {\footnotesize\faComment*[regular]~\bfseries Commenter}; \node[] (C3) at ($(A)!0.85!(B)$) {\footnotesize\faShareSquare~\bfseries Partager}; - }, - colback=white, - colframe=gray!15, - top=2em, - left=3em, - bottom=4em] - %\vspace*{0.5em}\par - \BODY% - \end{tcolorbox} -} - -%%% -% Instagram -%%% -\setKVdefault[Instagram]{Largeur=0.95\linewidth,Auteur=Christophe,Expediteur=Pierre,Date=\today,Temps=34,Publie=false,Logo=DrStrange,LogoEx=tiger,EchelleLogo=0.035,Texte={}} - -\NewEnviron{Instagram}[1][]{% - \useKVdefault[Instagram]% - \setKV[Instagram]{#1}% - \xdef\EchelleLogo{\useKV[Instagram]{EchelleLogo}}% - \begin{tcolorbox}[% - enhanced,% - underlay unbroken and first={% - \node[anchor=west,xshift=3em,yshift=-1.5em] at (frame.north west) {\textbf{\useKV[Instagram]{Expediteur}}}; - \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Instagram]{LogoEx}}{\EchelleLogo}}; - \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries\color{gray}...}; - \coordinate[yshift=-3em] (HA) at (frame.north west); - \coordinate[yshift=-3em] (HB) at (frame.north east); - \draw[gray!15] (HA)--(HB); - \coordinate[yshift=7em] (BA) at (frame.south west); - \coordinate[yshift=7em] (BB) at (frame.south east); - \draw[gray!15] (BA)--(BB); - \coordinate[xshift=1em,yshift=6em] (A) at (frame.south west); - \node[anchor=west] at (A) {\bfseries\faHeart[regular]\quad\faComment[regular]\quad\faPaperPlane}; - \coordinate[xshift=-1em,yshift=6em] (A1) at (frame.south east); - \node[anchor=east] at (A1) {\bfseries\faBookmark[regular]}; - \coordinate[xshift=1em,yshift=5em] (B) at (frame.south west); - \node[anchor=west] at (B) {\footnotesize\bfseries\fpeval{randint(10,30)} J'aime}; - \coordinate[xshift=1em,yshift=4em] (C) at (frame.south west); - \node[anchor=west] at (C) {\textbf{\useKV[Instagram]{Expediteur}}~\useKV[Instagram]{Texte}}; - \node[anchor=center,xshift=2em,yshift=2.25em] at (frame.south west) {\LogoTW{\useKV[Instagram]{Logo}}{\EchelleLogo}}; - \node[anchor=west,xshift=4em,yshift=2.25em] at (frame.south west) {\textcolor{gray!50}{Ajouter un commentaire\dots}}; - \node[anchor=east,xshift=-1em,yshift=2.25em] at (frame.south east) {\textcolor{red}{\faHeart}\quad\textcolor{Gold}{\faHandSpock}\quad\textcolor{gray!50}{\faPlusCircle}}; - \node[anchor=west,xshift=1em,yshift=0.5em] at (frame.south west) {\scriptsize\color{gray} Il y a \useKV[Instagram]{Temps} secondes}; - }, - colback=white, - colframe=gray!15, - top=3em, - left=3em, - bottom=7em] - \BODY% - \end{tcolorbox} -} - -%%% -% Snapchat -%%% -\setKVdefault[Snapchat]{Largeur=0.95\linewidth,Auteur=Christophe,Date=\today,Temps=34,Logo=DrStrange,EchelleLogo=0.035,Texte=Envoyer un Chat} - -\NewEnviron{Snapchat}[1][]{% - \useKVdefault[Snapchat]% - \setKV[Snapchat]{#1}% - \xdef\EchelleLogo{\useKV[Snapchat]{EchelleLogo}}% - \begin{tcolorbox}[% - enhanced,% - underlay unbroken and first={% - \node[anchor=west,xshift=3em,yshift=-1em] at (frame.north west) {\textbf{\useKV[Snapchat]{Auteur}}}; - \node[anchor=west,xshift=3em,yshift=-2em] at (frame.north west) {\scriptsize\color{gray} il y a \useKV[Snapchat]{Temps}~min}; - \node[anchor=center,xshift=1em+2mm,yshift=-1.5em] at (frame.north west) {\LogoTW{\useKV[Snapchat]{Logo}}{\EchelleLogo}}; - \node[xshift=-1em,yshift=-1.5em,rotate=90] at (frame.north east) {\bfseries...}; - \node[xshift=-3em,yshift=-1.5em] at (frame.north east) {\faBell[regular]}; - \coordinate[xshift=2em,yshift=2em] (P1) at (frame.south west); - \coordinate[xshift=4.5em,yshift=2em] (P2) at (frame.south west); - \coordinate[xshift=-3em,yshift=2em] (P4) at (frame.south west); - \coordinate[xshift=-2em,yshift=2em] (P3) at (frame.south east); - \coordinate[xshift=4.5em,yshift=1em] (P5) at (frame.south west); - \coordinate[xshift=4.5em,yshift=3em] (P8) at (frame.south west); - \coordinate[xshift=-4.5em,yshift=1em] (P6) at (frame.south east); - \coordinate[xshift=-4.5em,yshift=3em] (P7) at (frame.south east); - \draw (P1) circle (1em); - \node at (P1) {\faCamera}; - \draw (P3) circle (1em); - \node[xshift=-0.125em,rotate=-45] at (P3) {\faLocationArrow}; - \node[anchor=west,inner sep=0pt] at (P2) {\useKV[Snapchat]{Texte}}; - \draw (P5) -- (P6) arc(270:450:1em) -- (P7) -- (P8) arc(90:270:1em) -- cycle; - }, - colback=white, - colframe=gray!15, - top=3em, - left=3em, - bottom=3em] - \BODY% - \end{tcolorbox} -} - -%%% -% Bon de sortie -%%% -\newcommand\BonSortieBandeau{% - Nom : \hfill Date : \hspace*{3cm} -} - -\newtcolorbox{Sortie}{% - %Titre - colbacktitle=white, - fonttitle=\color{black}\Large\bfseries, - toptitle=2mm, - bottomtitle=2mm, - title={\BonSortieBandeau}, - %%Cadre principal - enhanced, - nobeforeafter, - width=13.15cm, - height=8.8cm, - colback=white, - valign=top, - %Cadre bas - sidebyside, - righthand width=0.05\linewidth, -} - -\setKVdefault[ClesSortie]{MemeEnonce=false}% - -\newcommand\BonSortieSmiley{% - \Huge - \begin{center} - \RKangry - - \vspace{1em} - - \RKsad - - \vspace{1em} - - \RKsmallsmile - - \vspace{1em} - - \RKbigsmile - \end{center} -} - -\NewDocumentCommand\BonSortie{o m m m m}{% - \clearpage% - \useKVdefault[ClesSortie]% - \setKV[ClesSortie]{#1}% - \begin{tikzpicture}[remember picture, overlay] - \draw[dashed] (current page.north) to (current page.south); - \draw[dashed] (current page.west) to (current page.east); - \coordinate[xshift=7.425cm,yshift=-5.25cm] (A) at (current page.north west); - \coordinate[xshift=-7.425cm,yshift=-5.25cm] (B) at (current page.north east); - \coordinate[xshift=7.425cm,yshift=5.25cm] (C) at (current page.south west); - \coordinate[xshift=-7.425cm,yshift=5.25cm] (D) at (current page.south east); - \ifboolKV[ClesSortie]{MemeEnonce}{% - \foreach\i\in in {A,B,C,D}{% - \node (\i1) at (\i) {\begin{Sortie} - #2 - \tcblower - \BonSortieSmiley - \end{Sortie} - }; - } - }{% - \node (A1) at (A) {\begin{Sortie} - #2 - \tcblower - \BonSortieSmiley - \end{Sortie} - }; - \node (B1) at (B) {\begin{Sortie} - #3 - \tcblower - \BonSortieSmiley - \end{Sortie} - }; - \node (C1) at (C) {\begin{Sortie} - #4 - \tcblower - \BonSortieSmiley - \end{Sortie} - }; - \node (D1) at (D) {\begin{Sortie} - #5 - \tcblower - \BonSortieSmiley - \end{Sortie} - }; - } - \end{tikzpicture} -} - -%%% -% Ecriture des nombres en lettres -%%% -\setKVdefault[ClesEcriture]{Math=false,Majuscule=false,E=false,Tradition=false,Zero=false} - -\newcommand\EcriturePluriel[1]{% - \xintifboolexpr{#1 > 1}{s}{}% -} - -\newcommand\EcritureDecimale{% - \StrLen{\ListeEcriture[2]}[\LongueurDecimale]% - \xintifboolexpr{\LongueurDecimale == 6}{% - ~millionième\EcriturePluriel{\ListeEcriture[2]}% - }{\xintifboolexpr{\LongueurDecimale == 5}{% - ~cent-millième\EcriturePluriel{\ListeEcriture[2]} - }{\xintifboolexpr{\LongueurDecimale == 4}{% - ~dix-millième\EcriturePluriel{\ListeEcriture[2]} - }{\xintifboolexpr{\LongueurDecimale == 3}{% - ~millième\EcriturePluriel{\ListeEcriture[2]} - }{\xintifboolexpr{\LongueurDecimale == 2}{% - ~centième\EcriturePluriel{\ListeEcriture[2]} - }{\xintifboolexpr{\LongueurDecimale == 1}{% - ~dixième\EcriturePluriel{\ListeEcriture[2]} - }{}% - }% - }% - }% - }% - }% -}% - -\newcommand\Ecriture[2][]{% - \useKVdefault[ClesEcriture]% - \setKV[ClesEcriture]{#1}% - \ifboolKV[ClesEcriture]{Tradition}{% - \fmtcountsetoptions{french={dash or space=traditional}}% - }{% - \fmtcountsetoptions{french={dash or space=always}}% - }% - \setsepchar{.}% - \readlist*\ListeEcriture{#2}% - \xintifboolexpr{\ListeEcriturelen == 2}{% - \ifboolKV[ClesEcriture]{Majuscule}{% - \ifboolKV[ClesEcriture]{Zero}{}{\Numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}% - }{% - \ifboolKV[ClesEcriture]{Zero}{}{\numberstringnum{\ListeEcriture[1]}}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{Zero}{}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]} et }}{\ifboolKV[ClesEcriture]{Tradition}{ virgule }{-virgule-}}\numberstringnum{\ListeEcriture[2]}\ifboolKV[ClesEcriture]{Math}{\EcritureDecimale}{}% - }}{% - \ifboolKV[ClesEcriture]{Majuscule}{% - \Numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}% - }{% - \numberstringnum{\ListeEcriture[1]}\ifboolKV[ClesEcriture]{Math}{\ifboolKV[ClesEcriture]{E}{e}{}~unité\EcriturePluriel{\ListeEcriture[1]}}{}% - }% - }% -}% - -%%% -% 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}}% - }% - }% - }% - }% -}% - -%%% -% 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% - }% -}% - -%%% -% Tables Addition-Multiplication -%%% -\setKVdefault[Tables]{Addition=false,Multiplication=true,Seul=false,Debut=0,Fin=10,Couleur=white} - -% pour m\'emoire -\newcommand\TableMultiplicationComplete{% - \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% - \begin{tabular}{|>{\columncolor{gray!15}\centering\arraybackslash}p{1.5em}|*{\NbColTabMul}{>{\centering\arraybackslash}p{1.5em}|}}% - \hline - $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\cellcolor{gray!15}\fpeval{##1} - } - \\ - \hline - \xintFor* ##1 in {\xintSeq {0}{10}}\do{% - ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\fpeval{##2*##1} - } - \\ - \hline - } - \end{tabular}% -} -%%%% - -\newcommand\TableMultiplicationCompleteColore{% - \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% - \begin{tabular}{|>{\columncolor{gray!15}\centering}p{15pt}|*{\NbColTabMul}{>{\centering\arraybackslash}p{15pt}|}}% - \hline - $\times$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\cellcolor{gray!15}\fpeval{##1}% - } - \\ - \hline - \xintFor* ##1 in {\xintSeq {0}{10}}\do{% - ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\xintifboolexpr{##2<##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##1*10}}}{\xintifboolexpr{##2>##1}{\cellcolor{\useKV[Tables]{Couleur}!\fpeval{##2*10}}}{}}\fpeval{##2*##1}% - }% - \\ - \hline - }% - \end{tabular}% -}% - -\newcommand\TableAdditionComplete{% - \xdef\NbColTabMul{\fpeval{\useKV[Tables]{Fin}+1-\useKV[Tables]{Debut}}}% - \begin{tabular}{|>{\columncolor{gray!15}\centering}p{15pt}|*{\NbColTabMul}{>{\centering\arraybackslash}p{15pt}|}}% - \hline - $+$\xintFor* ##1 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\cellcolor{gray!15}\fpeval{##1} - } - \\ - \hline - \xintFor* ##1 in {\xintSeq {0}{10}}\do{% - ##1\xintFor* ##2 in {\xintSeq {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{% - &\fpeval{##2+##1} - } - \\ - \hline - } - \end{tabular}% -} - -\newcommand\TableMultiplicationSeule[1]{% - \ensuremath{% - \begin{array}{ccccc}% - \xintFor* ##1 in {\xintSeq - {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{ - ##1&\times&=&\fpeval{##1*#1}\\ - } - \end{array} - }% -}% - -\newcommand\TableAdditionSeule[1]{% - \ensuremath{% - \begin{array}{ccccc} - \xintFor* ##1 in {\xintSeq - {\useKV[Tables]{Debut}}{\useKV[Tables]{Fin}}}\do{ - ##1&+&=&\fpeval{##1+#1}\\ - } - \end{array} - }% -}% - -\newcommand\Tables[2][]{% - \useKVdefault[Tables]% - \setKV[Tables]{#1}% - \ifboolKV[Tables]{Seul}{% - \ifboolKV[Tables]{Addition}{% - \TableAdditionSeule{#2}% - }{% - \TableMultiplicationSeule{#2}% - }% - }{% - \ifboolKV[Tables]{Addition}{% - \TableAdditionComplete% - }{% - \TableMultiplicationCompleteColore% - }% - }% -}% - -%%% -% Defi Table -%%% - -\setKVdefault[DefiTable]{Solution=false,Math=false,LargeurT=5mm,Graines=false,Creation=false} -\defKV[DefiTable]{Graine=\setKV[DefiTable]{Graines}}% - -\newcommand\MelangeListeNew[2]{% - % #1 Liste à mélanger - % #2 Nombre d'éléments à conserver - \setsepchar[*]{/}\ignoreemptyitems% - \readlist*\ListeInter{#1}% - \xdef\faa{}% Liste construite - \xdef\fii{}% Liste détruite - % on crée les #2 premieres solutions. - \xintFor* ##1 in {\xintSeq{1}{#2}}\do{% - \xintifboolexpr{\ListeInterlen>1}{% - \xdef\Alea{\fpeval{randint(\ListeInterlen)}}% - \xdef\faa{\faa \ListeInter[\Alea]/}% - \xdef\fii{}% - \xintFor* ##2 in {\xintSeq{1}{\ListeInterlen}}\do{% - \xintifboolexpr{##2 == \Alea}{% - }{% - \xdef\fii{\fii \ListeInter[##2]/}% - }% - }% - }{% - \xdef\faa{\faa \ListeInter[1]}% - }% - \readlist*\ListeInter{\fii}% - }% - \reademptyitems% -}% - -\newcommand\DefiTableNombreLettreduCode[1]{% - \xdef\ListeDesCaracteresFoo{a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/à/é/è/ê/ï/î/ô/ö/ù/ç/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/À/É/È/,/$?$/$;$/./$!$/$:$/-} - \savecomparemode% - \comparestrict% - \xdef\PfCFooDepart{} - \StrLen{#1}[\LongueurMot]% - \xintFor* ##1 in{\xintSeq{1}{\LongueurMot}}\do{% - \StrChar{#1}{##1}[\LettreMot] - \xdef\PfCFooDepart{\PfCFooDepart \LettreMot/} - }% - \setsepchar[*]{/}\reademptyitems% - \readlist*\ListeDesLettres{\PfCFooDepart}% - \xdef\PfCFooArrivee{\ListeDesLettres[1]}% - \xintFor* ##1 in{\xintSeq{2}{\LongueurMot}}\do{% - \StrCompare{\ListeDesLettres[##1]}{\\}[\PfCRetiensEtoile] - \StrCompare{\ListeDesLettres[##1]}{ }[\PfCRetiensPara] - \xintifboolexpr{\PfCRetiensEtoile==0 || \PfCRetiensPara==0}{}{% - \xdef\PfCTotal{0}% - \xintFor* ##2 in{\xintSeq{1}{\fpeval{##1-1}}}\do{% - \StrCompare{\ListeDesLettres[##1]}{\ListeDesLettres[##2]}[\PfCRetiens] - \xdef\PfCTotal{\fpeval{\PfCTotal+\PfCRetiens}}% - }% - \xintifboolexpr{\PfCTotal==\fpeval{##1-1}}{\xdef\PfCFooArrivee{\PfCFooArrivee/\ListeDesLettres[##1]}}{}% - }% - }% - %Arrivee = \PfCFooArrivee\par - \setsepchar[*]{/}\ignoreemptyitems% - \readlist*\ListeDesLettresUniques{\PfCFooArrivee}% - %La liste des lettres uniques ainsi créée :\par - %\showitems\ListeDesLettresUniques[]% - % Il faut retirer les lettres uniques de la liste des caracteres - \readlist*\ListeTotaleDesCaracteres{\ListeDesCaracteresFoo}% - %\par - %La liste totale des caractères est :\par - %\showitems\ListeTotaleDesCaracteres[] - %\par - \xdef\ListeCaracteresUniques{}% - \xintFor* ##1 in{\xintSeq{1}{\ListeTotaleDesCaractereslen}}\do{% - %Le caractère testé est \ListeTotaleDesCaracteres[##1]. On le compare à :% - \xdef\PfCTotal{0}% - \xintFor* ##2 in{\xintSeq{1}{\ListeDesLettresUniqueslen}}\do{% - \StrCompare{\ListeTotaleDesCaracteres[##1]}{\ListeDesLettresUniques[##2]}[\PfCRetiens] - \xdef\PfCTotal{\fpeval{\PfCTotal+\PfCRetiens}}% - }% - \xintifboolexpr{\PfCTotal==\ListeDesLettresUniqueslen}{\xdef\ListeCaracteresUniques{\ListeCaracteresUniques\ListeTotaleDesCaracteres[##1]/}}{}% - }% - %La liste des caractères uniques à ajouter - \MelangeListeNew{\ListeCaracteresUniques}{\fpeval{42-\ListeDesLettresUniqueslen}}% - %\par La liste des éléments à mélanger est :\par - \xdef\ListeDesCaracteresAUtiliser{} - \xintFor* ##1 in{\xintSeq{1}{\ListeDesLettresUniqueslen}}\do{% - \xdef\ListeDesCaracteresAUtiliser{\ListeDesCaracteresAUtiliser \ListeDesLettresUniques[##1]/}% - }% - \xdef\ListeDesCaracteresAUtiliser{\ListeDesCaracteresAUtiliser \faa} - \MelangeListeNew{\ListeDesCaracteresAUtiliser}{42} - %Finalement, on utilise ces caractères :\par - \ignoreemptyitems% - \readlist*\ListeFinaleDesCaracteres{\faa} - \xdef\ListeDesProduitsFoo{1/2/3/4/5/6/7/8/9/10/12/14/16/18/20/15/21/24/27/30/28/32/36/40/25/35/45/50/42/48/54/60/49/56/63/70/64/72/80/81/90/100} - \MelangeListeNew{\ListeDesProduitsFoo}{42} - %Les produits mélangés sont :\par - \readlist*\ListeDesProduits{\faa}% - \restorecomparemode - \reademptyitems -} - -\newcommand\DefiTable[2][]{% - % 1 les clés - % 2 la table de décodage - \useKVdefault[DefiTable]% - \setKV[DefiTable]{#1}% - \ifboolKV[DefiTable]{Creation}{ - \ifboolKV[DefiTable]{Graines}{\PfCGraineAlea{\useKV[DefiTable]{Graine}}}{}% - \DefiTableNombreLettreduCode{#2} - \begin{center} - \begin{tabular}{|>{\columncolor{gray!15}}c|*{10}{c|}} - \hline - \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{% - \xintifForFirst{}{&}##1% - }\\\hline% - \xintFor* ##1 in{\xintSeq{1}{10}}\do{% - ##1\xintFor* ##2 in{\xintSeq{1}{10}}\do{% - &\xintFor* ##3 in{\xintSeq{1}{42}}\do{% - \xintifboolexpr{\fpeval{##1*##2}==\ListeDesProduits[##3]}{\ListeFinaleDesCaracteres[##3]}{}% - }% - }\\\hline% - }% - \end{tabular}% - \end{center} - }{% - \setsepchar[*]{§* }% - \readlist*\ListeDefiTableCode{#2}% - \begin{NiceTabular}{>{\columncolor{gray!15}}{c}*{10}{c}}[hvlines] - \rowcolor{gray!15}$\times$&\xintFor* ##1 in {\xintSeq {1}{10}}\do{% - \xintifForFirst{}{&}##1} - \\ - 1\xintFor* ##1 in {\xintSeq {1}{10}}\do{% - &\ListeDefiTableCode[1,##1]% - }\\ - \xintFor* ##1 in {\xintSeq {2}{9}}\do{% - ##1\xintFor* ##2 in {\xintSeq {1}{##1}}\do{% - &\ListeDefiTableCode[##2,\fpeval{##1-##2+1}]% - }\xintFor* ##2 in {\xintSeq {1}{\fpeval{10-##1}}}\do{% - &\ListeDefiTableCode[##1,\fpeval{##2+1}]% - }% - \\ - }% - 10&\ListeDefiTableCode[1,10]&\ListeDefiTableCode[2,9]&\ListeDefiTableCode[3,8]&\ListeDefiTableCode[4,7]&\ListeDefiTableCode[5,6]&\ListeDefiTableCode[6,5]&\ListeDefiTableCode[7,4]&\ListeDefiTableCode[8,3]&\ListeDefiTableCode[9,2]&\ListeDefiTableCode[10,1]\\ - \end{NiceTabular}% - }% -}% - -\newcommand\DefiTableTexte[3][]{% - \useKVdefault[DefiTable]% - \setKV[DefiTable]{#1}% - \ifboolKV[DefiTable]{Creation}{% - \setsepchar[*]{\\* }% - \readlist*\ListeDefiTableTableau{#3}% - \xdef\ListeDefiTableMax{0}% - \xintFor* ##1 in{\xintSeq{1}{\ListeDefiTableTableaulen}}\do{% - \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% - \xintifboolexpr{\ListeDefiTableMax<\PfCDTLongueur}{\xdef\ListeDefiTableMax{\fpeval{\PfCDTLongueur}}}{}%% - }% - %\par Le max est \ListeDefiTableMax - \begin{NiceTabular}{*{\fpeval{\ListeDefiTableMax}}{>{\centering\arraybackslash}m{\useKV[DefiTable]{LargeurT}}}} - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeDefiTableTableaulen}}}\do{% - \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% - \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% - \xintifForFirst{}{&}% - \StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}[\DefiTableMaLettre]% - \IfStrEq{\DefiTableMaLettre}{ }{\Block[]{1-1}{}}{\Block[borders={bottom}]{1-1}{\ifboolKV[DefiTable]{Solution}{\StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}}{}}}% - }\\ - \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% - \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% - \xintifForFirst{}{&}% - \StrMid{\ListeDefiTableTableau[##1]}{##2}{##2}[\DefiTableMaLettre]% - \IfStrEq{\DefiTableMaLettre}{*}{}{% - \xintFor* ##3 in{\xintSeq{1}{42}}\do{% - \IfStrEq{\DefiTableMaLettre}{\ListeFinaleDesCaracteres[##3]}{\Block{}{\footnotesize\ListeDesProduits[##3]}}{}% - }% - }% - }\\ - \StrLen{\ListeDefiTableTableau[##1]}[\PfCDTLongueur]% - \xintFor* ##2 in {\xintSeq {1}{\PfCDTLongueur}}\do{% - \xintifForFirst{}{&} - }\\ - }% - \end{NiceTabular}% - }{% - \setsepchar[*]{§*/}% - \readlist*\ListeDefiTableTableau{#2}% - \xdef\ListeDefiTableMax{0}% - \setsepchar{§}% - \readlist*\ListeDefiTablePhrase{#3}% - \foreachitem\compteur\in\ListeDefiTableTableau{% - \xintifboolexpr{\ListeDefiTableMax<\listlen\ListeDefiTableTableau[\compteurcnt]}{\xdef\ListeDefiTableMax{\fpeval{\listlen\ListeDefiTableTableau[\compteurcnt]}}}{}% - }% - \begin{NiceTabular}{*{\fpeval{\ListeDefiTableMax}}{>{\centering\arraybackslash}m{\useKV[DefiTable]{LargeurT}}}} - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeDefiTableTableaulen}}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% - \xintifForFirst{}{&}\ifboolKV[DefiTable]{Solution}{% - \StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}[\DefiTableMaLettre]% - \IfStrEq{\DefiTableMaLettre}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{\StrMid{\ListeDefiTablePhrase[##1]}{##2}{##2}}}% - }{% - \IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{\Block[]{2-1}{}}{\Block[borders={bottom}]{2-1}{}}% - }%% - }\\ - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% - \xintifForFirst{}{&} - }\\ - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeDefiTableTableau[##1]}}\do{% - \xintifForFirst{}{&}\IfStrEq{\ListeDefiTableTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[DefiTable]{Math}{\ListeDefiTableTableau[##1,##2]}{\num{\ListeDefiTableTableau[##1,##2]}}}% - }\\ - }% - \end{NiceTabular}% - }% -}% - -%%% -% Rangement des nombres -%%% -\setKVdefault[ClesRgt]{Croissant,Decroissant=false,Strict,Fraction=false,Details=false} - -\dtlexpandnewvalue% -\DTLgnewdb{mtnumedb}% -\DTLgnewdb{mtRGTdb}% Pb de doublon avec mtdb de Mediane - -\newcommand\Rangement[2][]{% - \useKVdefault[ClesRgt]% - \setKV[ClesRgt]{#1}% - \ifboolKV[ClesRgt]{Fraction}{% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeRgt{#2}% - % on cherche le d\'enominateur commun - \ppcm=1\relax - \foreachitem\x\in\ListeRgt{% - \PPCM{\fpeval{\ListeRgt[\xcnt,2]}}{\fpeval{\the\ppcm}}% - }% - % On cr\'ee la liste des rangements. - \DTLcleardb{mtnumedb}% -% % on les trie pour les ranger par ordre croissant - \foreachitem\x\in\ListeRgt{% - \DTLnewrow{mtnumedb}% - \xdef\toto{\fpeval{\ListeRgt[\xcnt,1]*\the\ppcm/\ListeRgt[\xcnt,2]}}% - \DTLnewdbentry{mtnumedb}{numeric}{\toto}% - }% -% % On trie - \ifboolKV[ClesRgt]{Decroissant}{% -% % On trie la liste - \dtlsort{numeric=descending}{mtnumedb}{\dtlicompare}% - \ifboolKV[ClesRgt]{Details}{\ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}}{% - \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}% - } - }{% -% % On trie la liste - \dtlsort{numeric}{mtnumedb}{\dtlicompare}% - \ifboolKV[ClesRgt]{Details}{% - \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\frac{\num{\numeroDonnee}}{\num{\the\ppcm}}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% - }{% - \ensuremath{\DTLforeach{mtnumedb}{\numeroDonnee=numeric}{\Simplification{\numeroDonnee}{\ppcm}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% - }% - }% - }{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeRgt{#2}% - % on cr\'ee la base de donn\'ees des valeurs - \DTLcleardb{mtRGTdb}% -% % on les trie pour les ranger par ordre croissant - \foreachitem\x\in\ListeRgt{% - \DTLnewrow{mtRGTdb}% - \itemtomacro\ListeRgt[\xcnt]\y% - \DTLnewdbentry{mtRGTdb}{numeric}{\y}% - }% -% % - \ifboolKV[ClesRgt]{Decroissant}{% - % On trie la liste - \dtlsort{numeric=descending}{mtRGTdb}{\dtlicompare}% - \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{>}{\geqslant}}}}% - }{% -% % On trie la liste - \dtlsort{numeric}{mtRGTdb}{\dtlicompare}% - \ensuremath{\DTLforeach{mtRGTdb}{\numeroDonnee=numeric}{\num{\numeroDonnee}\DTLiflastrow{}{\ifboolKV[ClesRgt]{Strict}{<}{\leqslant}}}}% - }% - }% -}% - -%%% -% Mots Cod\'es -%%% -\setKVdefault[MotsCodes]{LargeurT=1cm,Colonnes=5,Largeur=3cm,Solution=false,Math=false}% - -\newcommand\MotsCodes[2][]{% - \useKVdefault[MotsCodes]% - \setKV[MotsCodes]{#1}% - \setsepchar[*]{§*/}% - \readlist*\ListeMotsCodes{#2}% - \xdef\ListeMotsCodesPas{\fpeval{\ListeMotsCodeslen/\useKV[MotsCodes]{Colonnes}}}% - \begin{NiceTabular}{*{\fpeval{\useKV[MotsCodes]{Colonnes}}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{Largeur}}}} - \xintFor* ##1 in {\xintSeq {1}{\ListeMotsCodesPas}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% - \xintifForFirst{}{&}\Block[draw=black]{4-1}{}% - }\\ - \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% - \xintifForFirst{}{&}\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},1] - }\\ - \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% - \xintifForFirst{}{&}% - }\\ - \xintFor* ##2 in {\xintSeq {1}{\fpeval{\useKV[MotsCodes]{Colonnes}}}}\do{% - \xintifForFirst{}{&}\textbf{\Large\ListeMotsCodes[\fpeval{(##1-1)*\useKV[MotsCodes]{Colonnes}+##2},2]} - }\\ - }% - \end{NiceTabular}% -}% - -\newcommand\MotsCodesTableau[3][]{% - \useKVdefault[MotsCodes]% - \setKV[MotsCodes]{#1}% - \setsepchar[*]{,*/}% - \readlist*\ListeMotsCodesTableau{#2}% - \xdef\ListeMotsCodesMax{0}% - \setsepchar{,}% - \readlist*\ListeMotsCodesPhrase{#3}% - \foreachitem\compteur\in\ListeMotsCodesTableau{% - \xintifboolexpr{\ListeMotsCodesMax<\listlen\ListeMotsCodesTableau[\compteurcnt]}{\xdef\ListeMotsCodesMax{\fpeval{\listlen\ListeMotsCodesTableau[\compteurcnt]}}}{}% - }% - \begin{NiceTabular}{*{\fpeval{\ListeMotsCodesMax}}{>{\centering\arraybackslash}m{\useKV[MotsCodes]{LargeurT}}}} - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsCodesTableaulen}}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% - \xintifForFirst{}{&}\ifboolKV[MotsCodes]{Solution}{% - \StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}[\MotsCodesMaLettre]% - \IfStrEq{\MotsCodesMaLettre}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{\StrMid{\ListeMotsCodesPhrase[##1]}{##2}{##2}}}% - }{% - \IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{\Block[draw=black,fill=black]{3-1}{}}{\Block[draw=black]{3-1}{}}% - }%% - }\\ - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% - \xintifForFirst{}{&} - }\\ - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeMotsCodesTableau[##1]}}\do{% - \xintifForFirst{}{&}\IfStrEq{\ListeMotsCodesTableau[##1,##2]}{*}{}{\footnotesize\ifboolKV[MotsCodes]{Math}{\ListeMotsCodesTableau[##1,##2]}{\num{\ListeMotsCodesTableau[##1,##2]}}}% - }\\ - }% - \end{NiceTabular}% -}% - -%%% -% Labyrinthe -%%% -\setKVdefault[Labyrinthe]{Lignes=6,Colonnes=3,Longueur=4,Hauteur=2,Passages=false,EcartH=1,EcartV=1,CouleurF=gray!50,Texte=\color{black},SensImpose=false,Slop} - -\tikzset{FDirect/.style={-stealth}} -\tikzset{FIndirect/.style={stealth-}} -\tikzset{FBidirect/.style={stealth-stealth}} - -\newlength{\LabyLongCM} - -\newcommand\Labyrinthe[3][]{% - \useKVdefault[Labyrinthe]% - \setKV[Labyrinthe]{#1}% - \setsepchar[*]{,*/}% - \readlist*\ListeLaby{#2}% - \xdef\LabySlop{\ifboolKV[Labyrinthe]{Slop}{sloped}{}}% - \ifboolKV[Labyrinthe]{Passages}{% - \readlist*\ListeLabySol{#3}% - }{}% - \xdef\LabyLong{\useKV[Labyrinthe]{Longueur}}% -% \setlength{\LabyLongCM}{\fpeval{\LabyLong*28.3465}pt}% - \xdef\LabyHaut{\useKV[Labyrinthe]{Hauteur}}% - \ifboolKV[Labyrinthe]{SensImpose}{% - \xdef\TotalLaby{\fpeval{4*(\useKV[Labyrinthe]{Colonnes}-1)+1}}% - }{% - \xdef\TotalLaby{\fpeval{3*\useKV[Labyrinthe]{Colonnes}-2}}% - }% - \xdef\CouleurF{\useKV[Labyrinthe]{CouleurF}}% - \xdef\MotifTexte{\noexpand\useKV[Labyrinthe]{Texte}}% - \xintifboolexpr{\ListeLabylen==\fpeval{\useKV[Labyrinthe]{Lignes}*\useKV[Labyrinthe]{Colonnes}}}{% - \begin{tikzpicture}[remember picture]% -% % on dessine les cadres - \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% - \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% - \xdef\ColorFill{\ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},2]}% - \node[fill=\ColorFill,draw,minimum height=\LabyHaut*1cm,minimum width=\LabyLong*1cm,name=A-\compteurh-\compteurv] at - (\fpeval{\LabyLong+\useKV[Labyrinthe]{EcartH}}*\compteurh,-\fpeval{\LabyHaut+\useKV[Labyrinthe]{EcartV}}*\compteurv) {% -% \begin{minipage}{\LabyLongCM} - \ListeLaby[\fpeval{\useKV[Labyrinthe]{Colonnes}*(\compteurv-1)+\compteurh},1]% -% \end{minipage} - };% - }% - }% - % fin des cadres - % on dessine les fl\`eches - \ifboolKV[Labyrinthe]{SensImpose}{% - %verticales - \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% - \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},1]}% - \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% - \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,midway,inner sep=2pt]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});}{}% - }{% - \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});% - }% - }% - }% -% % horizontales - \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},1]}% - \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\compteurh},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% - \draw[\CouleurF,line width=3pt,\NomStyle](A-\compteurh-\compteurv) -- node[fill=white,midway,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv);}{} - }{% - \draw[\CouleurF,line width=3pt,FBidirect](A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv);% - }% - }% - }% -% % diagonales "inverses" - \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},1]}% - \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]>0}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-2)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+2},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}}% - \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); - }{} - }{% - \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); - }% - }% - }% -%% % diagonales directes - \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},1]}% - \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]>0}{% - \xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==1}{\xdef\NomStyle{FDirect}}{\xintifboolexpr{\ListeLabySol[\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+3*(\compteurh-1)+1},2]==2}{\xdef\NomStyle{FIndirect}}{\xdef\NomStyle{FBidirect}}} - \draw[\CouleurF,line width=3pt,\NomStyle] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop,inner sep=2pt]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); - }{}% - }{% - \draw[\CouleurF,line width=3pt,FBidirect] (A-\compteurh-\compteurv) -- node[fill=white,near start,\LabySlop]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); - }% - }% - }% - }{% - \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% - \foreach \compteurh in {1,...,\useKV[Labyrinthe]{Colonnes}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)}]}% - \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\compteurh-\fpeval{\compteurv+1});% - }{% - \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\compteurh-\fpeval{\compteurv+1});% - }% - }% - }% - \foreach \compteurv in {1,...,\useKV[Labyrinthe]{Lignes}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\compteurh}]}% - \draw[\CouleurF,line width=3pt,stealth-stealth] - (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\compteurv); - }{% - \draw[\CouleurF,line width=3pt,stealth-stealth] - (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\compteurv); - }% - } - } - \foreach \compteurv in {2,...,\fpeval{\useKV[Labyrinthe]{Lignes}}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv-1}); - } - } - \foreach \compteurv in {1,...,\fpeval{\useKV[Labyrinthe]{Lignes}-1}}{% - \foreach \compteurh in {1,...,\fpeval{\useKV[Labyrinthe]{Colonnes}-1}}{% - \ifboolKV[Labyrinthe]{Passages}{% - \xdef\NomNode{\noexpand\ListeLabySol[1,\fpeval{\TotalLaby*(\compteurv-1)+\useKV[Labyrinthe]{Colonnes}+2*(\compteurh-1)+1}]}% - \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- node[fill=white,midway]{\MotifTexte\NomNode}(A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); - }{% - \draw[\CouleurF,line width=3pt,stealth-stealth] (A-\compteurh-\compteurv) -- (A-\fpeval{\compteurh+1}-\fpeval{\compteurv+1}); - }% - }% - }% -% % fin des fl\`eches - } - \end{tikzpicture} - }{ - \textbf{! Le nombre d'informations n'est pas compatible avec les - d\'efinitions de {\ttfamily Colonnes} et {\ttfamily Lignes} !}}% -} - -%%% -% Triominos -%%% -\setKVdefault[ClesTriomino]{Longueur=5cm,Etages=3,Ecart=0.6,AffichagePiece=false,Hexagone=false,Recapitulatif=false,Colonnes=2}% -\defKV[ClesTriomino]{Piece=\setKV[ClesTriomino]{AffichagePiece=true}}% - -\def\TraceTriomino#1{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesTriomino]{Longueur}; - Rayon:=0.75*u*sqrt(3)/6; - Etages:=\useKV[ClesTriomino]{Etages}; - pair A,B,C,D,E,F; - A=(0,0); - B-A=Etages*u*(1,0); - C=rotation(B,A,60); - D=(1/Etages)[C,A]; - E=(1/Etages)[C,B]; - F=C; - trace polygone(A,B,C); - for k=1 upto Etages-1: - trace (k/Etages)[C,A]--(k/Etages)[C,B]; - trace (k/Etages)[A,C]--(k/Etages)[A,B]; - trace (k/Etages)[B,A]--(k/Etages)[B,C]; - endfor; - pair G[];color H[];%Couleur pour garder l'orientation des textes... - G[1]=iso(D,E,F); - H1=blue; - n=1; - for k=1 upto Etages-1: - for l=0 upto (2*k): - n:=n+1; - if (l mod 2=0): - G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D)); - H[n]=blue; - else: - G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D)); - H[n]=green; - fi; - endfor; - endfor; - % affichage des textes - nba=0; - for p_=#1: - if (nba mod 3)=1: - if H[(nba div 3)+1]=blue: - label(TEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30)); - else: - label(TEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90)); - fi; - elseif (nba mod 3)=2: - if H[(nba div 3)+1]=blue: - label(TEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270)); - else: - label(TEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330)); - fi; - else: - if H[(nba div 3)+1]=blue: - label(TEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150)); - else: - label(TEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210)); - fi; - fi; - nba:=nba+1; - endfor; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur}; Etages:=\useKV[ClesTriomino]{Etages};}] - Rayon:=0.75*u*sqrt(3)/6; - pair A,B,C,D,E,F; - A=(0,0); - B-A=Etages*u*(1,0); - C=rotation(B,A,60); - D=(1/Etages)[C,A]; - E=(1/Etages)[C,B]; - F=C; - trace polygone(A,B,C); - for k=1 upto Etages-1: - trace (k/Etages)[C,A]--(k/Etages)[C,B]; - trace (k/Etages)[A,C]--(k/Etages)[A,B]; - trace (k/Etages)[B,A]--(k/Etages)[B,C]; - endfor; - pair G[];color H[];%Couleur pour garder l'orientation des textes... - G[1]=iso(D,E,F); - H1=blue; - n=1; - for k=1 upto Etages-1: - for l=0 upto (2*k): - n:=n+1; - if (l mod 2=0): - G[n]=G[1] shifted(k*(D-F)+(l div 2)*(E-D)); - H[n]=blue; - else: - G[n]=symetrie(G[1],D,E) shifted((k-1)*(D-F)+(l div 2)*(E-D)); - H[n]=green; - fi; - endfor; - endfor; - % affichage des textes - nba=0; - for p_=#1: - if (nba mod 3)=1: - if H[(nba div 3)+1]=blue: - label(LATEX(p_) rotated 120,pointarc(cercles(G[(nba div 3)+1],Rayon),30)); - else: - label(LATEX(p_) rotated 180,pointarc(cercles(G[(nba div 3)+1],Rayon),90)); - fi; - elseif (nba mod 3)=2: - if H[(nba div 3)+1]=blue: - label(LATEX(p_),pointarc(cercles(G[(nba div 3)+1],Rayon),270)); - else: - label(LATEX(p_) rotated 60,pointarc(cercles(G[(nba div 3)+1],Rayon),330)); - fi; - else: - if H[(nba div 3)+1]=blue: - label(LATEX(p_) rotated 240,pointarc(cercles(G[(nba div 3)+1],Rayon),150)); - else: - label(LATEX(p_) rotated 300,pointarc(cercles(G[(nba div 3)+1],Rayon),210)); - fi; - fi; - nba:=nba+1; - endfor; - \end{mpost} - \fi -} - -\def\TraceTriominoHexa#1{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesTriomino]{Longueur}; - RayonCercle:=u; - Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6; - pair O,A,B,C,D,E,F,G,H[],I[]; - O=(0,0); - path cc; - cc=cercles(O,RayonCercle); - A=pointarc(cc,0); - B=rotation(A,O,60); - C=rotation(B,O,60); - D=rotation(C,O,60); - E=rotation(D,O,60); - F=rotation(E,O,60); - G=rotation(F,O,60); - H1=iso(A,B); - H2=iso(B,C); - H3=iso(C,D); - H4=iso(D,E); - H5=iso(E,F); - H6=iso(F,A); - I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60)); - I2=symetrie(I1,C,F); - I3=symetrie(I2,1/2[B,C],1/2[D,E]); - I4=symetrie(I3,1/2[B,C],1/2[F,A]); - I5=symetrie(I4,B,E); - I6-I1=0.5*(D-C); - I7-I2=0.5*(D-C); - I8-I3=0.5*(D-C); - I9-I4=0.5*(D-C); - I10-I5=0.5*(D-C); - I11=symetrie(I10,1/2[C,B],1/2[F,A]); - I12=symetrie(I11,1/2[A,B],1/2[E,F]); - I13=symetrie(I6,A,D); - I14=symetrie(I7,A,D); - I15=symetrie(I8,A,D); - I16=symetrie(I9,A,D); - I17=symetrie(I10,A,D); - I18=symetrie(I11,A,D); - I19=symetrie(I12,A,D); - I20=symetrie(I1,A,D); - I21=symetrie(I2,A,D); - I22=symetrie(I3,A,D); - I23=symetrie(I4,A,D); - I24=symetrie(I5,A,D); - trace polygone(A,B,C,D,E,F); - trace polygone(H1,H3,H5); - trace polygone(H2,H4,H6); - trace segment(A,D); - trace segment(B,E); - trace segment(C,F); - color N[];%Couleur pour garder l'orientation des textes... - N1=blue; - for l=2 upto 5: - if (l mod 2=0): - N[l]=green; - else: - N[l]=blue; - fi; - endfor; - for l=6 upto 12: - if (l mod 2=0): - N[l]=blue; - else: - N[l]=green; - fi; - endfor; - for l=13 upto 19: - if (l mod 2=0): - N[l]=blue; - else: - N[l]=green; - fi; - endfor; - for l=20 upto 24: - if (l mod 2=0): - N[l]=green; - else: - N[l]=blue; - fi; - endfor; - % affichage des textes - nba=0; - for p_=#1: - if (nba mod 3)=1: - if N[(nba div 3)+1]=blue: - label(TEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30)); - else: - label(TEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90)); - fi; - elseif (nba mod 3)=2: - if N[(nba div 3)+1]=blue: - label(TEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270)); - else: - label(TEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330)); - fi; - else: - if N[(nba div 3)+1]=blue: - label(TEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150)); - else: - label(TEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210)); - fi; - fi; - nba:=nba+1; - endfor; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesTriomino]{Longueur};RayonCercle:=u; Rayon:=\useKV[ClesTriomino]{Ecart}*0.5*u*sqrt(3)/6;}] - pair O,A,B,C,D,E,F,G,H[],I[]; - O=(0,0); - path cc; - cc=cercles(O,RayonCercle); - A=pointarc(cc,0); - B=rotation(A,O,60); - C=rotation(B,O,60); - D=rotation(C,O,60); - E=rotation(D,O,60); - F=rotation(E,O,60); - G=rotation(F,O,60); - H1=iso(A,B); - H2=iso(B,C); - H3=iso(C,D); - H4=iso(D,E); - H5=iso(E,F); - H6=iso(F,A); - I1=iso(C,1/2[C,D],rotation(1/2[C,D],C,60)); - I2=symetrie(I1,C,F); - I3=symetrie(I2,1/2[B,C],1/2[D,E]); - I4=symetrie(I3,1/2[B,C],1/2[F,A]); - I5=symetrie(I4,B,E); - I6-I1=0.5*(D-C); - I7-I2=0.5*(D-C); - I8-I3=0.5*(D-C); - I9-I4=0.5*(D-C); - I10-I5=0.5*(D-C); - I11=symetrie(I10,1/2[C,B],1/2[F,A]); - I12=symetrie(I11,1/2[A,B],1/2[E,F]); - I13=symetrie(I6,A,D); - I14=symetrie(I7,A,D); - I15=symetrie(I8,A,D); - I16=symetrie(I9,A,D); - I17=symetrie(I10,A,D); - I18=symetrie(I11,A,D); - I19=symetrie(I12,A,D); - I20=symetrie(I1,A,D); - I21=symetrie(I2,A,D); - I22=symetrie(I3,A,D); - I23=symetrie(I4,A,D); - I24=symetrie(I5,A,D); - trace polygone(A,B,C,D,E,F); - trace polygone(H1,H3,H5); - trace polygone(H2,H4,H6); - trace segment(A,D); - trace segment(B,E); - trace segment(C,F); - color N[];%Couleur pour garder l'orientation des textes... - N1=blue; - for l=2 upto 5: - if (l mod 2=0): - N[l]=green; - else: - N[l]=blue; - fi; - endfor; - for l=6 upto 12: - if (l mod 2=0): - N[l]=blue; - else: - N[l]=green; - fi; - endfor; - for l=13 upto 19: - if (l mod 2=0): - N[l]=blue; - else: - N[l]=green; - fi; - endfor; - for l=20 upto 24: - if (l mod 2=0): - N[l]=green; - else: - N[l]=blue; - fi; - endfor; - % affichage des textes - nba=0; - for p_=#1: - if (nba mod 3)=1: - if N[(nba div 3)+1]=blue: - label(LATEX(p_) rotated 120,pointarc(cercles(I[(nba div 3)+1],Rayon),30)); - else: - label(LATEX(p_) rotated 180,pointarc(cercles(I[(nba div 3)+1],Rayon),90)); - fi; - elseif (nba mod 3)=2: - if N[(nba div 3)+1]=blue: - label(LATEX(p_),pointarc(cercles(I[(nba div 3)+1],Rayon),270)); - else: - label(LATEX(p_) rotated 60,pointarc(cercles(I[(nba div 3)+1],Rayon),330)); - fi; - else: - if N[(nba div 3)+1]=blue: - label(LATEX(p_) rotated 240,pointarc(cercles(I[(nba div 3)+1],Rayon),150)); - else: - label(LATEX(p_) rotated 300,pointarc(cercles(I[(nba div 3)+1],Rayon),210)); - fi; - fi; - nba:=nba+1; - endfor; - \end{mpost} - \fi -} - -\newtoks\toklisteTriomino% -\def\UpdatetoksTriomino#1\nil{\addtotok\toklisteTriomino{"#1",}}% - -\newcommand\Triomino[2][]{% - \useKVdefault[ClesTriomino]% - \setKV[ClesTriomino]{#1}% - \setsepchar{§}%\ignoreemptyitems% - \readlist*\ListeTriominos{#2}% - \toklisteTriomino{}% - \ifboolKV[ClesTriomino]{Recapitulatif}{% - %\begin{longtable}{|>{\centering}p{0.45\linewidth}|p{0.45\linewidth}|} - % \hline - % \xintFor* ##1 in {\xintSeq{1}{\ListeTriominoslen}}\do{ - % &\\ - % &\\ - % \ListeTriominos[##1]&\\ - % &\\ - % &\\ - % \hline - % }% - %\end{longtable} - }{% - \ifboolKV[ClesTriomino]{AffichagePiece}{% - \setKV[ClesTriomino]{Etages=1}% - \TraceTriomino{"\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-2}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}-1}]","\ListeTriominos[\fpeval{3*\useKV[ClesTriomino]{Piece}}]"}% - }{% - \foreachitem\compteur\in\ListeTriominos{\expandafter\UpdatetoksTriomino\compteur\nil}% - \ifboolKV[ClesTriomino]{Hexagone}{% - \TraceTriominoHexa{\the\toklisteTriomino}% - }{% - \TraceTriomino{\the\toklisteTriomino}% - }% - }% - }% -}% - -%%% -% Labyrinthe Nombre -%%% -\setKVdefault[ClesLabyNb]{Multiple=5,XDepart=0,YDepart=0,Longueur=7,Largeur=4,XArrivee=6,YArrivee=3,Solution=false,Echelle=1,Angle=0,Couleur=red,Murs=false,Nom=Ex1,CouleurChemin=LightSteelBlue,DoubleOperation=false,Chemin=false,EntreeSortie=false,Entree="Nord",Sortie="Sud",SortieUnique=true} - -\newcommand\LabyNombre[1][]{% - \useKVdefault[ClesLabyNb]% - \setKV[ClesLabyNb]{#1}% - \ifboolKV[ClesLabyNb]{Solution}{% - \TraceLabyFactoSolution{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }{% - \TraceLabyFacto{\useKV[ClesLabyNb]{Multiple}}{\useKV[ClesLabyNb]{Longueur}}{\useKV[ClesLabyNb]{Largeur}}{(\useKV[ClesLabyNb]{YDepart},\useKV[ClesLabyNb]{XDepart})}{(\useKV[ClesLabyNb]{YArrivee},\useKV[ClesLabyNb]{XArrivee})}{\useKV[ClesLabyNb]{Solution}}% - }% -}% - -\newcommand\TraceLabyFacto[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - input PfCLabyNombre; - - boolean Murs; - Murs=\useKV[ClesLabyNb]{Murs}; - - string Entree,Sortie; - Entree=\useKV[ClesLabyNb]{Entree}; - Sortie=\useKV[ClesLabyNb]{Sortie}; - boolean SortieUnique,EntreeSortie; - SortieUnique:=\useKV[ClesLabyNb]{SortieUnique}; - EntreeSortie:=\useKV[ClesLabyNb]{EntreeSortie}; - picture Square; - Square=image( - path Test; - Test=unitsquare scaled 10mm; - trace subpath(0.85,1.15) of Test; - trace subpath(1.85,2.15) of Test; - trace subpath(2.85,3.15) of Test; - trace subpath(3.85,4.15) of Test; - ); - - vardef RemplissagePremier= - Totalpremier:=if indiceChemin<62:62 else: indiceChemin fi; - - numeric p[]; boolean n_is_prime; p[1]=2; kis:=1; - for nis=3 step 2 until infinity: - n_is_prime := true; - for jis=2 upto kis: - if nis mod p[jis]=0: n_is_prime := false; fi - exitif nis/p[jis] < p[jis]; - endfor - if n_is_prime: p[incr kis] := nis; exitif kis=Totalpremier; fi - endfor fi - - numeric PR[],pretiens[]; - - for ki=1 upto Totalpremier-1: - pretiens[ki]:=p[ki+1]; - endfor; - - Kk:=0; - - for ki=Totalpremier-1 downto 1: - alea:=1+floor(uniformdeviate(ki)); - PR[incr Kk]:=pretiens[alea]; - % message("k="&decimal(k)&" alea="&decimal(alea)&" Kk="&decimal(Kk)&" PR[Kk]="&decimal(PR[Kk])); - Kkl:=0; - for li=1 upto ki: - if li<>alea: - pretiens[incr Kkl]:=pretiens[li]; - % message("Kkl="&decimal(Kkl)); - fi; - endfor; - endfor; - enddef; - - numeric Multiple; - Multiple=#1; - % Initialisation du labyrinthe - InitialisationLabyrinthe(#2,#3); - % On initialise les paramètres du parcours - numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; - choixligneD=xpart(#4); - choixcolonneD=ypart(#4); - choixligneA=xpart(#5); - choixcolonneA=ypart(#5);% - pair Depart; - Depart=N[choixligneD][choixcolonneD]; - pair Arrivee; - Arrivee=N[choixligneA][choixcolonneA]; - pair Mobile; - Mobile=Depart; - % - RAZPileChemin; - - if \useKV[ClesLabyNb]{SortieUnique}: - if (Sortie="Est") or (Sortie="Ouest"): - for k=0 upto LargeurLaby-1: - if k<>choixligneA: - CaseExploree[k][choixcolonneA]:=true; - fi; - endfor; - elseif (Sortie="Nord") or (Sortie="Sud"): - for k=0 upto LongueurLaby-1: - if k<>choixcolonneA: - CaseExploree[choixligneA][k]:=true; - fi; - endfor; - fi; - fi; - % Exploration du labyrinthe - if Entree="Nord": - CaseExploree[choixligneD-1][choixcolonneD]:=true; - elseif Entree="Sud": - CaseExploree[choixligneD+1][choixcolonneD]:=true; - elseif Entree="Est": - CaseExploree[choixligneD][choixcolonneD+1]:=true; - elseif Entree="Ouest": - CaseExploree[choixligneD][choixcolonneD-1]:=true; - fi; - % - PushChemin((choixligneD,choixcolonneD)); - CaseExploree[choixligneD][choixcolonneD]:=true; - VoisinDispo(choixligneD,choixcolonneD); - forever: exitif Mobile=Arrivee;%nb=0; - nb:=ceiling(uniformdeviate(nbvoisin)); - if nb>0: - for k=1 upto nbvoisin: - CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; - endfor; - PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); - Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; - VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); - else: - PopCheminMathAlea; - fi; - endfor; - % Affichagefinal - % on sauvegarde les nombres aléatoires - numeric NbAffiche[]; - numeric NbSol[]; - % on écrit des nombres au hasard, mais sans être multiple du nombre choisi - numeric nbaffiche; - nbaffiche=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - if Multiple=1:%On affichera que des multiples de 2/3/5/9/10 pour afficher un chemin de nombre premiers - mathalea:=uniformdeviate(5); - if mathalea<1: - NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*2; - elseif mathalea<2: - NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*3; - elseif mathalea<3: - NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*5; - elseif mathalea<4: - NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*9; - else: NbAffiche[nbaffiche]:=(10+ceiling(uniformdeviate(100)))*10; - fi; - else: - NbAffiche[nbaffiche]:=(50+ceiling(uniformdeviate(100)))*Multiple+ceiling(uniformdeviate(Multiple-1)); - fi; - endfor; - endfor; - % On crée des multiples du nombre choisi - RemplissagePremier; - - for k=1 upto indiceChemin: - if Multiple>1: - NbSol[k]=(50+ceiling(uniformdeviate(100)))*Multiple; - else: - NbSol[k]=PR[k]; - fi; - endfor; - % On affiche - picture Corps; - Corps=image( - nbaffiche:=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - for k=1 upto indiceChemin: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - if EntreeSortie=false: - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - trace TraceLabyrinthe; - else: - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - trace Square shifted N[k][l]; - endfor; - endfor; - trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; - % On dessine l'entrée. - if Entree="Nord": - N[-1][-1]:=Depart+(0,10mm); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Ouest": - N[-1][-1]:=Depart+(-10mm,0); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Sud": - N[-1][-1]:=Depart+(0,-10mm); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Est": - N[-1][-1]:=Depart+(10mm,0); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - fi; - % On dessine les sorties - if Sortie="Nord": - N[-2][-2]=Arrivee+(5mm,20mm); - for k=0 upto LongueurLaby-1: - draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); - draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); - undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); - endfor; - elseif Sortie="Ouest": - N[-2][-2]=Arrivee+(-10mm,5mm); - for k=0 upto LargeurLaby-1: - draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); - draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); - undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); - endfor; - elseif Sortie="Sud": - N[-2][-2]=Arrivee+(5mm,-10mm); - for k=0 upto LongueurLaby-1: - draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); - draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); - undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); - endfor; - elseif Sortie="Est": - N[-2][-2]=Arrivee+(20mm,5mm); - for k=0 upto LargeurLaby-1: - draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); - draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); - undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); - endfor; - fi; - fi; - ); - Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace Corps; - \end{mplibcode} -} - -\newcommand\TraceLabyFactoSolution[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - color CouleurChemin; - CouleurChemin:=\useKV[ClesLabyNb]{CouleurChemin}; - picture CorpsSolution; - CorpsSolution=image( - nbaffiche:=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - if EntreeSortie=false: - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - else: - for k=1 upto indiceChemin: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - fi; - if EntreeSortie=false: - trace TraceLabyrinthe; - else: - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - trace Square shifted N[k][l]; - endfor; - endfor; - trace u*(0,0)--u*(LongueurLaby,0)--u*(LongueurLaby,-LargeurLaby)--u*(0,-LargeurLaby)--cycle; - % On dessine l'entrée. - if Entree="Nord": - N[-1][-1]:=Depart+(0,10mm); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(1,4) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Ouest": - N[-1][-1]:=Depart+(-10mm,0); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(2,5) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(1.15,1.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Sud": - N[-1][-1]:=Depart+(0,-10mm); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(3,6) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(2.15,2.85) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - elseif Entree="Est": - N[-1][-1]:=Depart+(10mm,0); - fill ((unitsquare scaled 10mm) shifted N[-1][-1]) withcolor white; - draw (subpath(0,3) of unitsquare scaled 10mm) shifted N[-1][-1]; - undraw (subpath(3.18,3.82) of unitsquare scaled 10mm) shifted N[-1][-1] withpen pencircle scaled 1.25; - label(btex \footnotesize Départ etex,(center Square) shifted N[-1][-1]); - fi; - % On dessine les sorties - if Sortie="Nord": - N[-2][-2]=Arrivee+(5mm,20mm); - for k=0 upto LongueurLaby-1: - draw ((point(0.15) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); - draw ((point(0.85) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[0][k]+(0,10mm)); - undraw (subpath(0.18,0.82) of unitsquare scaled 10mm) shifted (N[0][k]+(0,10mm)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[0][k]+(0,10mm))); - endfor; - elseif Sortie="Ouest": - N[-2][-2]=Arrivee+(-10mm,5mm); - for k=0 upto LargeurLaby-1: - draw ((point(1.15) of unitsquare scaled 10mm)--0.5[(point(1.15) of unitsquare scaled 10mm),(point(3.85) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); - draw ((point(1.85) of unitsquare scaled 10mm)--0.5[(point(1.85) of unitsquare scaled 10mm),(point(3.15) of unitsquare scaled 10mm)]) shifted (N[k][0]+(-10mm,0)); - undraw (subpath(1.18,1.82) of unitsquare scaled 10mm) shifted (N[k][0]+(-10mm,0)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][0]+(-10mm,0))); - endfor; - elseif Sortie="Sud": - N[-2][-2]=Arrivee+(5mm,-10mm); - for k=0 upto LongueurLaby-1: - % draw (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withcolor red; - draw ((point(2.85) of unitsquare scaled 10mm)--0.5[(point(0.15) of unitsquare scaled 10mm),(point(2.85) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); - draw ((point(2.15) of unitsquare scaled 10mm)--0.5[(point(0.85) of unitsquare scaled 10mm),(point(2.15) of unitsquare scaled 10mm)]) shifted (N[LargeurLaby-1][k]+(0,-10mm)); - undraw (subpath(2.18,2.82) of unitsquare scaled 10mm) shifted (N[LargeurLaby-1][k]+(0,-10mm)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[LargeurLaby-1][k]+(0,-10mm))); - endfor; - elseif Sortie="Est": - N[-2][-2]=Arrivee+(20mm,5mm); - for k=0 upto LargeurLaby-1: - draw ((point(3.15) of unitsquare scaled 10mm)--0.5[(point(3.15) of unitsquare scaled 10mm),(point(1.85) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); - draw ((point(3.85) of unitsquare scaled 10mm)--0.5[(point(3.85) of unitsquare scaled 10mm),(point(1.15) of unitsquare scaled 10mm)]) shifted (N[k][LongueurLaby-1]+(10mm,0)); - undraw (subpath(3.18,3.8) of unitsquare scaled 10mm) shifted (N[k][LongueurLaby-1]+(10mm,0)) withpen pencircle scaled 1.25; - label(TEX("\footnotesize S"&decimal(k)),center (Square) shifted (N[k][LongueurLaby-1]+(10mm,0))); - endfor; - fi; - path CheminSolution; - CheminSolution=(N[-1][-1] shifted (5mm,5mm))--((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) - for k=2 upto indiceChemin-1: - -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) - endfor - --((center unitsquare scaled 10mm) shifted Arrivee)--N[-2][-2]; - trace CheminSolution dashed evenly withcolor CouleurChemin; - fi; - ); - CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace CorpsSolution; - \end{mplibcode} -} - -\newcommand\TraceLabyNombreDouble[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - input PfCLabyNombre; - - boolean Murs; - Murs=\useKV[ClesLabyNb]{Murs}; - - numeric Multiple; - Multiple=#1; - % Initialisation du labyrinthe - InitialisationLabyrinthe(#2,#3); - % On initialise les paramètres du parcours - numeric choixligneD,choixligneA,choixcolonneD,choixcolonneA; - choixligneD=xpart(#4); - choixcolonneD=ypart(#4); - choixligneA=xpart(#5); - choixcolonneA=ypart(#5);% - pair Depart; - Depart=N[choixligneD][choixcolonneD]; - pair Arrivee; - Arrivee=N[choixligneA][choixcolonneA]; - pair Mobile; - Mobile=Depart; - RAZPileChemin; - % Exploration du labyrinthe - PushChemin((choixligneD,choixcolonneD)); - CaseExploree[choixligneD][choixcolonneD]:=true; - VoisinDispo(choixligneD,choixcolonneD); - forever: exitif Mobile=Arrivee;%nb=0; - nb:=ceiling(uniformdeviate(nbvoisin)); - if nb>0: - for k=1 upto nbvoisin: - CaseExploree[xpart(PileVoisin[k])][ypart(PileVoisin[k])]:=true; - endfor; - PushChemin((xpart(PileVoisin[nb]),ypart(PileVoisin[nb]))); - Mobile:=N[xpart(PileChemin[indiceChemin])][ypart(PileChemin[indiceChemin])]; - VoisinDispo(xpart(PileChemin[indiceChemin]),ypart(PileChemin[indiceChemin])); - else: - PopChemin; - fi; - endfor; - % Affichagefinal - % on sauvegarde les nombres aléatoires - numeric NbAffiche[]; - numeric NbSol[]; - % on écrit des nombres au hasard, mais sans être multiple du nombre choisi - numeric nbaffiche; - nbaffiche=0; - NbAffiche[0]=5+ceiling(uniformdeviate(7)); - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - mathalea:=uniformdeviate(1); - if mathalea<0.95: - NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]+Multiple+1; - else: - NbAffiche[nbaffiche]=NbAffiche[nbaffiche-1]*(Multiple-1); - fi; - endfor; - endfor; - % On crée des multiples du nombre choisi - NbSol[1]=5+ceiling(uniformdeviate(7)); - for k=2 upto indiceChemin-1: - mathalea:=uniformdeviate(1); - if mathalea<0.9: - NbSol[k]=NbSol[k-1]+Multiple; - else: - NbSol[k]=NbSol[k-1]*Multiple; - fi; - endfor; - % On affiche - picture Corps; - Corps=image( - nbaffiche:=0; - for k=0 upto LargeurLaby-1: - for l=0 upto LongueurLaby-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - trace TraceLabyrinthe; - ); - Corps:=(Corps scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace Corps; - \end{mplibcode} -} - -\newcommand\TraceDoubleSolution[6]{% - \mplibforcehmode% - \xdef\PfCNomLabyrinthe{\useKV[ClesLabyNb]{Nom}}% - \begin{mplibcode}[\PfCNomLabyrinthe] - picture CorpsSolution; - CorpsSolution=image( - nbaffiche:=0; - for k=0 upto #3-1: - for l=0 upto #2-1: - nbaffiche:=nbaffiche+1; - label(TEX("\num{"&decimal(NbAffiche[nbaffiche])&"}"),M[k][l]); - endfor; - endfor; - remplis ((unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) withcolor \useKV[ClesLabyNb]{Couleur}; - remplis ((unitsquare scaled 10mm) shifted Arrivee) withcolor \useKV[ClesLabyNb]{Couleur}; - if \useKV[ClesLabyNb]{Chemin}: - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor white; - endfor; - trace ((center unitsquare scaled 10mm) shifted N[choixligneD][choixcolonneD]) - for k=2 upto indiceChemin-1: - -- ((center unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) - endfor - --((center unitsquare scaled 10mm) shifted Arrivee) dashed evenly withcolor Brown; - for k=2 upto indiceChemin-1: - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - else: - for k=2 upto indiceChemin-1: - remplis ((unitsquare scaled 10mm) shifted N[xpart(PileChemin[k])][ypart(PileChemin[k])]) withcolor \useKV[ClesLabyNb]{CouleurChemin}; - label(TEX("\num{"&decimal(NbSol[k])&"}"),M[xpart(PileChemin[k])][ypart(PileChemin[k])]); - endfor; - fi; - trace TraceLabyrinthe; - ); - CorpsSolution:=(CorpsSolution scaled \useKV[ClesLabyNb]{Echelle}) rotated \useKV[ClesLabyNb]{Angle}; - trace CorpsSolution; - \end{mplibcode} -}% - -%%% -% Mots croisés -%%% -\setKVdefault[ClesCroises]{Lignes=6,Colonnes=8,Solution=false,Croises=false,Couleur=gray,Largeur=1em} - -\newcounter{PfCLettreHorizontal} - -\newcommand\MotsCroises[2][]{% - \useKVdefault[ClesCroises]% - \setKV[ClesCroises]{#1}% - \setcounter{PfCLettreHorizontal}{0}% - \setsepchar[*]{§*,*/}% - \readlist*\ListeCasesCroises{#2}% - \begin{NiceTabular}{*{\fpeval{\useKV[ClesCroises]{Colonnes}}}{p{\useKV[ClesCroises]{Largeur}}}}[first-row,first-col]% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% - &\ifboolKV[ClesCroises]{Croises}{\stepcounter{PfCLettreHorizontal}\footnotesize\Alph{PfCLettreHorizontal}}{} - }\\ - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{% - \ifboolKV[ClesCroises]{Croises}{\footnotesize##1}{}\xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% - &\IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{% - }{% - \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{% - \Block[draw,fill=black]{}{\PfCTBstrut}}{% - \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{% - \Block[draw,fill=\useKV[ClesCroises]{Couleur}]{}{% - \PfCTBstrut\ifboolKV[ClesCroises]{Solution}{% - \ListeCasesCroises[##1,##2,2]% - }{}% - } - }{% - \Block[draw]{}{\PfCTBstrut\ifboolKV[ClesCroises]{Solution}{% - \ListeCasesCroises[##1,##2,2]}{}% - }% - }% - }% - }% - }\\ - }% - \CodeAfter - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Lignes}}}}\do{% - \xintFor* ##2 in {\xintSeq{1}{\fpeval{\useKV[ClesCroises]{Colonnes}}}}\do{% - \IfStrEq{\ListeCasesCroises[##1,##2,1]}{!}{% - }{% - \IfStrEq{\ListeCasesCroises[##1,##2,1]}{*}{% - }{% - \IfStrEq{\ListeCasesCroises[##1,##2,1]}{+}{% - }{% - \xintifboolexpr{\fpeval{\ListeCasesCroises[##1,##2,1]}>0}{\tikz\node[transform canvas={xshift=1mm,yshift=-1mm}] at (\fpeval{##1}-|\fpeval{##2}){\tiny\ListeCasesCroises[##1,##2,1]};}{}% - }% - }% - }% - }% - }% - \end{NiceTabular}% - \setsepchar{,}% -}% - - -%%% -% Mots empilés -%%% -\setKVdefault[ClesMotEmpile]{Colonne=4,Solution=false,Couleur=black} - -\newcounter{CompteurMotEmpile} - -\newcommand\MotsEmpiles[2][]{% - \useKVdefault[ClesMotEmpile]% - \setKV[ClesMotEmpile]{#1}% - \setcounter{CompteurMotEmpile}{0}% - \setsepchar[*]{,*/}% - \readlist*\ListeMotsEmpiles{#2}% - \xdef\ListeMotsEmpilesMax{0}% - \colorlet{MotEmpileCouleur}{\useKV[ClesMotEmpile]{Couleur}}% - \foreachitem\compteur\in\ListeMotsEmpiles{% - \StrLen{\ListeMotsEmpiles[\compteurcnt,2]}[\LongueurMot]% - \xintifboolexpr{\ListeMotsEmpilesMax<\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}{\xdef\ListeMotsEmpilesMax{\fpeval{\ListeMotsEmpiles[\compteurcnt,1]+\LongueurMot}}}{}% - }% - \begin{NiceTabular}{c|*{\fpeval{\ListeMotsEmpilesMax}}{m{10pt}}}% - \Block{1-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}}{}\xintFor* ##1 in {\xintSeq {1}{\fpeval{\useKV[ClesMotEmpile]{Colonne}}}}\do{&}&$\downarrow$\xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpilesMax-\useKV[ClesMotEmpile]{Colonne}-1}}}\do{&}\\ - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\ListeMotsEmpileslen}}}\do{% - \rule[-1.2ex]{0pt}{3.8ex}\stepcounter{CompteurMotEmpile}\Alph{CompteurMotEmpile}&\Block{1-\fpeval{\ListeMotsEmpiles[##1,1]}}{}\xintFor* ##2 in {\xintSeq {1}{\fpeval{\ListeMotsEmpiles[##1,1]}}}\do{% - & - }% - \StrLen{\ListeMotsEmpiles[##1,2]}[\LongueurMot]% - \xintFor* ##3 in {\xintSeq {1}{\fpeval{\LongueurMot}}}\do{% - \xintifForFirst{}{&}\Block[draw=black]{1-1}{\ifboolKV[ClesMotEmpile]{Solution}{\centering\arraybackslash\StrMid{\ListeMotsEmpiles[##1,2]}{##3}{##3}}{}}%% - }% - \\ - }% - \CodeAfter\tikz\draw[line width=1.5pt,MotEmpileCouleur](row-2-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+2}) rectangle (row-\fpeval{\ListeMotsEmpileslen+2}-|col-\fpeval{\useKV[ClesMotEmpile]{Colonne}+3}); - \end{NiceTabular}% -}% - -%%% Colorilude %%% -\setKVdefault[Colorilude]{Largeur=10,Lignes=10,Legende=false,Coef=0.6,Solution=false,CartonReponse=false,Resultats=false} - -\newcommand\dispogpfc[3][]{% - \setbox1=\hbox{#2}% - \setbox2=\hbox{#3}% - \begin{minipage}{\wd2}% - #3% - \end{minipage}% - \quad% - \begin{minipage}{\wd1}% - #2% - \end{minipage}% -}% - -\newcommand\TraceEchiquierColorilude{% - \ifluatex - \begin{mplibcode} - pair A,B,C,D;%pour la grille - A=(0,0); - B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0); - C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes}); - D-C=A-B; - nblargeur=\useKV[Colorilude]{Largeur}; - nblignes=\useKV[Colorilude]{Lignes}; - for k=1 upto nblargeur-1: - draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; - endfor; - for k=1 upto nblignes-1: - draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; - endfor; - draw polygone(A,B,C,D) withpen pensquare scaled 1.5; - if \useKV[Colorilude]{Legende}: - label.lrt(btex \tiny d'après APMEP etex rotated 90,B); - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={boolean Legende; - Legende=\useKV[Colorilude]{Legende}; - nblargeur:=\useKV[Colorilude]{Largeur}; - nblignes:=\useKV[Colorilude]{Lignes}; - coef:=\useKV[Colorilude]{Coef};}] - pair A,B,C,D;%pour la grille - A=(0,0); - B-A=u*coef*(nblargeur,0); - C-B=u*coef*(0,-nblignes); - D-C=A-B; - for k=1 upto nblargeur-1: - draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; - endfor; - for k=1 upto nblignes-1: - draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; - endfor; - draw polygone(A,B,C,D) withpen pensquare scaled 1.5; - if Legende: - label.lrt(\btex \tiny d'après APMEP etex rotated 90,B); - fi; - \end{mpost} - \fi -}% - -\newcommand\TraceEchiquierColoreColorilude{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode} - pair A,B,C,D;%pour la grille - A=(0,0); - B-A=u*\useKV[Colorilude]{Coef}*(\useKV[Colorilude]{Largeur},0); - C-B=u*\useKV[Colorilude]{Coef}*(0,-\useKV[Colorilude]{Lignes}); - D-C=A-B; - numeric nblargeur,nblignes; - nblargeur:=\useKV[Colorilude]{Largeur}; - nblignes:=\useKV[Colorilude]{Lignes}; - % on récupère les données de coloriage - numeric n; - n:=0; - numeric nbCases[]; - color ColorSucc[]; - for p_=\the\toklisteremplissage: - n:=n+1; - if (n mod 2)=0: - nbCases[n div 2]:=p_; - else: - ColorSucc[n div 2]:=p_; - fi; - endfor; - % on colorie :) - numeric NBCASES; - NBCASES:=0; - for l=1 upto (n div 2): - fill ((unitsquare xscaled (\useKV[Colorilude]{Coef}*u*nbCases[l]) yscaled (\useKV[Colorilude]{Coef}*u)) shifted(\useKV[Colorilude]{Coef}*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1]; - NBCASES:=NBCASES+nbCases[l]; - endfor; - % on trace le quadrillage - for k=1 upto nblargeur-1: - draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; - endfor; - for k=1 upto nblignes-1: - draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; - endfor; - draw polygone(A,B,C,D) withpen pensquare scaled 1.5; - if \useKV[Colorilude]{Legende}: - label.lrt(btex \tiny d'après APMEP etex rotated 90,B); - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={boolean Legende; - Legende=\useKV[Colorilude]{Legende}; - nblargeur:=\useKV[Colorilude]{Largeur}; - nblignes:=\useKV[Colorilude]{Lignes}; - coef:=\useKV[Colorilude]{Coef}; - numeric n; - n:=0; - numeric nbCases[]; - color ColorSucc[]; - for p_=\the\toklisteremplissage: - n:=n+1; - if (n mod 2)=0: - nbCases[n div 2]:=p_; - else: - ColorSucc[n div 2]:=p_; - fi; - endfor; - }] - pair A,B,C,D;%pour la grille - A=(0,0); - B-A=u*coef*(nblargeur,0); - C-B=u*coef*(0,-nblignes); - D-C=A-B; - % on colorie :) - numeric NBCASES; - NBCASES:=0; - for l=1 upto (n div 2): - fill ((unitsquare xscaled (coef*u*nbCases[l]) yscaled (coef*u)) shifted(coef*u*(NBCASES mod nblargeur,-1-(NBCASES div nblargeur)))) withcolor ColorSucc[l-1]; - NBCASES:=NBCASES+nbCases[l]; - endfor; - % on trace le quadrillage - for k=1 upto nblargeur-1: - draw (k/nblargeur)[A,B]--(k/nblargeur)[D,C]; - endfor; - for k=1 upto nblignes-1: - draw (k/nblignes)[A,D]--(k/nblignes)[B,C]; - endfor; - draw polygone(A,B,C,D) withpen pensquare scaled 1.5; - if Legende: - label.lrt(\btex \tiny d'après APMEP etex rotated 90,B); - fi; - \end{mpost} - \fi -}% - -\newtoks\toklisteremplissage% -\toklisteremplissage{}% -\def\UpdateRemplissage#1\nil{\addtotok\toklisteremplissage{#1,}}% - -\newcommand\ColoriludeEnonce{% -Pour chaque ligne de la grille, colorie de gauche à droite, de la -couleur indiquée, le nombre de cases donné par le résultat du calcul. -}% - -\newcommand\ColoriludeListeCouleur[1]{% - \setsepchar{ }% - \readlist\ListeColoriludeCouleurs{#1}% - \foreachitem\compteur\in\ListeColoriludeCouleurs{% - \ifodd\compteurcnt\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\compteur}\end{minipage}}~\else\compteur\quad\fi% - }% -}% - -\newcommand\Colorilude[2][]{% - \useKVdefault[Colorilude]% - \setKV[Colorilude]{#1}% - \setsepchar{\\/ }% - \readlist\ListeColorilude{#2}% - \ifboolKV[Colorilude]{Solution}{% - \toklisteremplissage{}% - \foreachitem\compteur\in\ListeColorilude{% - \foreachitem\couleur\in\ListeColorilude[\compteurcnt]{% - \expandafter\UpdateRemplissage\couleur\nil}% - }% - \TraceEchiquierColoreColorilude% - }{% - \dispogpfc{% - \TraceEchiquierColorilude% - }{% - % On cherche le nombre max de colonnes - \xdef\ListeColoriludeMax{0}% - \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{% - \xintifboolexpr{\listlen\ListeColorilude[##1]>\ListeColoriludeMax}{% - \xdef\ListeColoriludeMax{\listlen\ListeColorilude[##1]}% - }{}% - }% - \setlength{\tabcolsep}{0.2\tabcolsep}% - \begin{NiceTabular}{*{\fpeval{\ListeColoriludeMax/2}}{rl}}% - \xintFor* ##1 in {\xintSeq {1}{\ListeColoriludelen}}\do{% - \xintifboolexpr{\listlen\ListeColorilude[##1]==\ListeColoriludeMax}{% - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% - \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% - }% - }{% - \xintFor* ##2 in {\xintSeq {1}{\listlen\ListeColorilude[##1]}}\do{% - \xintifForFirst{}{&~}\ifodd##2\fbox{\begin{minipage}{1em}\centering\text{\ttfamily\bfseries\ListeColorilude[##1,##2]}\end{minipage}}\ifboolKV[Colorilude]{Resultats}{\fbox{\begin{minipage}{1em}\centering\ttfamily\bfseries \phantom{R}\end{minipage}}}{}~\else\ifboolKV[Colorilude]{CartonReponse}{\pointilles[25pt]}{$\ListeColorilude[##1,##2]$}\fi% - }% - &\hbox to5pt{}&\Cdots% - }% - \\[0.5em]% - }% - \end{NiceTabular}% - }% - }% -}% - -%%% -% Mosaique -%%% -\setKVdefault[ClesMosaique]{Largeur=2,Hauteur=2,Solution=false,Type=1,Label,Echelle=1cm} - -\newcommand\DessineMosaique[2][]{% - \useKVdefault[ClesMosaique]% - \setKV[ClesMosaique]{#1}% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode} - u:=\useKV[ClesMosaique]{Echelle}; - Type:=\useKV[ClesMosaique]{Type}; - input PfCMosaique; - trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi; - \end{mplibcode}% - \else% - \begin{mpost}[mpsettings={u:=\useKV[ClesMosaique]{Echelle};Type:=\useKV[ClesMosaique]{Type};}]% - input PfCMosaique; - trace if Type=1:MosaiqueUn[#2] elseif Type=2: MosaiqueDeux[#2] fi; - \end{mpost}% - \fi% -}% - -\newcommand\DessineMosaiqueComplet[1]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCMosaique; - Largeur=\useKV[ClesMosaique]{Largeur}; - Hauteur=\useKV[ClesMosaique]{Hauteur}; - Type=\useKV[ClesMosaique]{Type}; - boolean Solution,Label; - Solution=\useKV[ClesMosaique]{Solution}; - Label=\useKV[ClesMosaique]{Label}; - pair A,B,C,D; - A=u*(0,1); - B-A=u*(Largeur,0); - C-B=u*(0,-Hauteur); - D-C=A-B; - picture mosaique; - path case; - case=unitsquare scaled 1cm; - if Type=1: - mosaique=image( - trace case withcolor 0.5white; - trace (point(0) of case)--(point(2) of case) withcolor 0.75white; - trace (point(1) of case)--(point(3) of case) withcolor 0.75white; - trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; - trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; - ); - else: - mosaique=image( - trace case withcolor 0.5white; - trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; - trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; - trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white; - ); - fi; - if Solution: - nbmos:=0; - for p_=#1: - trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); - nbmos:=nbmos+1; - endfor; - else: - nbmos:=0; - for p_=#1: - trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); - if Label: - label(TEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))))); - fi; - nbmos:=nbmos+1; - endfor; - fi; - trace polygone(A,B,C,D); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={Largeur=\useKV[ClesMosaique]{Largeur};Hauteur=\useKV[ClesMosaique]{Hauteur};Type=\useKV[ClesMosaique]{Type};boolean Solution,Label;Solution=\useKV[ClesMosaique]{Solution};}] - Label=\useKV[ClesMosaique]{Label}; - input PfCMosaique; - pair A,B,C,D; - A=u*(0,1); - B-A=u*(Largeur,0); - C-B=u*(0,-Hauteur); - D-C=A-B; - picture mosaique; - path case; - case=unitsquare scaled 1cm; - if Type=1: - mosaique=image( - trace case withcolor 0.5white; - trace (point(0) of case)--(point(2) of case) withcolor 0.75white; - trace (point(1) of case)--(point(3) of case) withcolor 0.75white; - trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; - trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; - ); - else: - mosaique=image( - trace case withcolor 0.5white; - trace (point(0.5) of case)--(point(2.5) of case) withcolor 0.75white; - trace (point(1.5) of case)--(point(3.5) of case) withcolor 0.75white; - trace (point(0.5) of case)--(point(1.5) of case)--(point(2.5) of case)--(point(3.5) of case)--cycle withcolor 0.75white; - ); - fi; - if Solution: - nbmos:=0; - for p_=#1: - trace if Type=1:MosaiqueUn[xpart(p_)] else: MosaiqueDeux[xpart(p_)] fi shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); - nbmos:=nbmos+1; - endfor; - else: - nbmos:=0; - for p_=#1: - trace mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))); - if Label: - label(LATEX("\num{"&decimal(ypart(p_))&"}"),center (mosaique shifted(u*(nbmos mod Largeur,-(nbmos div Largeur))))); - fi; - nbmos:=nbmos+1; - endfor; - fi; - trace polygone(A,B,C,D); - \end{mpost} - \fi -}% - -\newtoks\toklistecaseM% -\def\UpdatetoksMosaique#1/#2\nil{\addtotok\toklistecaseM{(#1,#2),}}% - -\newcommand\Mosaique[2][]{% - \useKVdefault[ClesMosaique]% - \setKV[ClesMosaique]{#1}% - \setsepchar[*]{,*/}% - \readlist*\ListeMosaique{#2}% - \toklistecaseM{}% - \foreachitem\compteur\in\ListeMosaique{\expandafter\UpdatetoksMosaique\compteur\nil}% - \DessineMosaiqueComplet{\the\toklistecaseM}% -}% - -%%% -% Qui suis-je -%%% -\setKVdefault[Quisuisje]{Solution=false,Largeur=5mm,Colonnes=5,CodePerso=false,TexteA=Lettre,TexteB=R\'esultat du calcul}% - -\newcommand\QuisuisjeEnonce{% - Chaque lettre du mot à découvrir porte un numéro qui correspond à un - calcul à effectuer. Pour trouver les lettres de ce mot, tu dois donc - effectuer les calculs proposés. Les résultats que tu auras trouvés - te donneront, à l'aide du tableau de correspondance ci-dessous, les - lettres du mot. -}% - -\newcommand\QuisuisjeTableau[2][]{% - \setKV[Quisuisje]{#1}% - \setsepchar[*]{§*/}\ignoreemptyitems% - \readlist*\ListeQuisuisje{#2}% - \begin{NiceTabular}{|l|*{\ListeQuisuisjelen}{m{\useKV[Quisuisje]{Largeur}}|}}% - \hline - \useKV[Quisuisje]{TexteA}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{% - &\centering\arraybackslash\ListeQuisuisje[##1,1] - }\\ - \hline - \useKV[Quisuisje]{TexteB}\xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjelen}}\do{% - &\centering\arraybackslash\ListeQuisuisje[##1,2] - }\\ - \hline - \end{NiceTabular}% -}% - -\newcommand\QuisuisjeCodePerso[3][]{% - \setKV[Quisuisje]{#1}% - \setsepchar{ }% - \readlist*\ListeQuisuisjeCode{#2}% - \readlist*\ListeQuisuisjeLettres{#3}% - \par\hfill% - \begin{NiceTabular}{|*{\ListeQuisuisjeLettreslen}{m{7mm}|}} - \hline - \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{% - \xintifForFirst{}{&}\ifboolKV[Quisuisje]{Solution}{\hfill\ListeQuisuisjeLettres[##1]}{\phantom{1}} - }\\ - \xintFor* ##1 in {\xintSeq {1}{\ListeQuisuisjeLettreslen}}\do{% - \xintifForFirst{}{&}\tiny\ListeQuisuisjeCode[##1]% - }\\ - \hline - \end{NiceTabular}% -}% - -\newcommand\Quisuisje[3][]{% - \useKVdefault[Quisuisje]% - \setKV[Quisuisje]{#1}% - \ifboolKV[Quisuisje]{CodePerso}{}{% - \setsepchar{ }% - \readlist\ListeLettres{#3}% - }% - \setsepchar{§}% - \readlist\ListeCalculs{#2}% - \ifboolKV[Quisuisje]{CodePerso}{}{% - \par\hfill% - \begin{NiceTabular}{|*{\ListeLettreslen}{m{7mm}|}} - \hline - \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{% - \xintifForFirst{}{&} \ifboolKV[Quisuisje]{Solution}{\hfill\ListeLettres[##1]}{\phantom{1}} - }\\ - \xintFor* ##1 in {\xintSeq {1}{\ListeLettreslen}}\do{% - \xintifForFirst{}{&}\tiny\num{##1}% - }\\ - \hline - \end{NiceTabular}% - }% - \par\bigskip\par - \ifboolKV[Quisuisje]{Solution}{}{% - \begin{multicols}{\useKV[Quisuisje]{Colonnes}}% - \begin{enumerate} - \xintFor* ##1 in {\xintSeq {1}{\ListeCalculslen}}\do{% - \item\ListeCalculs[##1] - } - \end{enumerate}% - \end{multicols}% - }% -}% - -%%% -% Dessin Gradue -%%% -\setKVdefault[DessinGradue]{Lignes=10,Debut=-5,Fin=5,Pas=10,Solution=false,EcartVertical=1.5,LignesIdentiques,Longueur=10,Echelle=1,Droites=false,DemiDroites=false,OrigineVariable=false,Code=false} -\defKV[DessinGradue]{Traces=\setKV[DessinGradue]{Code}}% - -\def\TraceDessinGradueComplet#1#2#3{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - % Paramètres - LongueurLigne=\useKV[DessinGradue]{Longueur}; - EcartVertical=\useKV[DessinGradue]{EcartVertical}; - Pas:=\useKV[DessinGradue]{Pas}; - NbLignes=\useKV[DessinGradue]{Lignes}; - Echelle=\useKV[DessinGradue]{Echelle}; - Debut:=\useKV[DessinGradue]{Debut}; - Fin:=\useKV[DessinGradue]{Fin}; - - boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code; - Solution=\useKV[DessinGradue]{Solution}; - LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques}; - OrigineVariable:=\useKV[DessinGradue]{OrigineVariable}; - Droites=\useKV[DessinGradue]{Droites}; - DemiDroites=\useKV[DessinGradue]{DemiDroites}; - Code=\useKV[DessinGradue]{Code}; - - pair La,Lb,Lab[]; - pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; - - La=(0,0); - Lb-La=u*(\useKV[DessinGradue]{Longueur},0); - - % On définit une fonction pour tracer les lignes en fonction du pas "Partage" - vardef TraceLignes(expr Partage)= - save RecupLigne; - picture RecupLigne; - RecupLigne=image( - if \useKV[DessinGradue]{Droites}: - drawarrow 1.05[Lb,La]--1.05[La,Lb]; - elseif \useKV[DessinGradue]{DemiDroites}: - drawarrow La--1.05[La,Lb]; - else: - trace segment(La,Lb); - fi; - for kl=0 upto Partage: - Lab[kl]:=(kl/Partage)[La,Lb]; - trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1)); - endfor; - ); - RecupLigne - enddef; - - % On définit une fonction pour nommer les points nécessaires. - vardef DefinirPoints(text t)= - numeric nblignes,nbpas; - n:=0; - for p_=t: - n:=n+1; - if (n mod 3)=1: - nblignes:=p_; - elseif (n mod 3)=2: - nbpas:=p_; - elseif (n mod 3)=0: - p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical))); - fi; - endfor; - enddef; - - % On détermine le nombre de lignes et les origines particulières - pair OrigA[],OrigB[]; - if LignesIdentiques: - for k=1 upto NbLignes: - TotalPas[k]:=Pas; - OrigA[k]=(Debut,0); - OrigB[k]=(Fin,TotalPas[k]); - endfor; - else: - if OrigineVariable: - n:=0; - for p_=#1: - n:=n+1; - OrigA[n]:=p_; - TotalPas[n]:=Pas; - endfor; - NbLignes:=n/2; - else: - n:=0; - for p_=#1: - n:=n+1; - TotalPas[n]=bluepart(p_); - OrigA[n]=(redpart(p_),0); - OrigB[n]=(greenpart(p_),TotalPas[n]); - endfor; - NbLignes:=n; - fi; - fi; - - picture EnsembleLignes; - - DefinirPoints(#2); - - EnsembleLignes=image( - if Solution: - drawoptions(withcolor 0.5white); - fi; - % On trace les lignes et on labelise le numéro de la ligne. - for k=0 upto NbLignes-1: - trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical)); - if Droites: - label.lft(TEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical))); - else: - label.lft(TEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical))); - fi; - endfor; - % On labelise les origines - labeloffset:=labeloffset*1.5; - for k=0 upto NbLignes-1: - if OrigineVariable: - label.top(TEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); - label.top(TEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); - else: - label.top(TEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical)); - label.top(TEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical)); - fi; - endfor; - drawoptions(); - labeloffset:=labeloffset/1.5; - - % On trace la solution - if Solution: - for p_=#3: - trace p_ withpen pencircle scaled 1.5; - endfor; - fi; - % On ajoute des tracés si nécessaire - if Code: - \useKV[DessinGradue]{Traces}; - fi; - ); - trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - LongueurLigne=\useKV[DessinGradue]{Longueur}; - EcartVertical=\useKV[DessinGradue]{EcartVertical}; - Pas:=\useKV[DessinGradue]{Pas}; - NbLignes=\useKV[DessinGradue]{Lignes}; - Echelle=\useKV[DessinGradue]{Echelle}; - Debut:=\useKV[DessinGradue]{Debut}; - Fin:=\useKV[DessinGradue]{Fin}; - boolean Solution,Droites,DemiDroites,LignesIdentiques,OrigineVariable,Code; - Solution=\useKV[DessinGradue]{Solution}; - LignesIdentiques:=\useKV[DessinGradue]{LignesIdentiques}; - OrigineVariable:=\useKV[DessinGradue]{OrigineVariable}; - Droites=\useKV[DessinGradue]{Droites}; - DemiDroites=\useKV[DessinGradue]{DemiDroites}; - Code=\useKV[DessinGradue]{Code}; - vardef EffectuerLesTraces= - if Code: - \useKV[DessinGradue]{Traces}; - fi; - enddef; - }] - pair La,Lb,Lab[]; - pair A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,A',B',C',D',E',F',G',H',I',J',K',L',M',N',O',P',Q',R',S',T',U',V',W',X',Y',Z',A'',B'',C'',D'',E'',F'',G'',H'',I'',J'',K'',L'',M'',N'',O'',P'',Q'',R'',S'',T'',U'',V'',W'',X'',Y'',Z''; - - La=(0,0); - Lb-La=u*(\useKV[DessinGradue]{Longueur},0); - - % On définit une fonction pour tracer les lignes en fonction du pas "Partage" - vardef TraceLignes(expr Partage)= - save RecupLigne; - picture RecupLigne; - RecupLigne=image( - if \useKV[DessinGradue]{Droites}: - drawarrow 1.05[Lb,La]--1.05[La,Lb]; - elseif \useKV[DessinGradue]{DemiDroites}: - drawarrow La--1.05[La,Lb]; - else: - trace segment(La,Lb); - fi; - for kl=0 upto Partage: - Lab[kl]:=(kl/Partage)[La,Lb]; - trace (Lab[kl]+u*(0,-0.1))--(Lab[kl]+u*(0,0.1)); - endfor; - ); - RecupLigne - enddef; - - % On définit une fonction pour nommer les points nécessaires. - vardef DefinirPoints(text t)= - numeric nblignes,nbpas; - n:=0; - for p_=t: - n:=n+1; - if (n mod 3)=1: - nblignes:=p_; - elseif (n mod 3)=2: - nbpas:=p_; - elseif (n mod 3)=0: - p_=(nbpas/TotalPas[nblignes])[La,Lb] shifted(u*(0,(nblignes-1)*(-EcartVertical))); - fi; - endfor; - enddef; - - % On détermine le nombre de lignes et les origines particulières - pair OrigA[],OrigB[]; - if LignesIdentiques: - for k=1 upto NbLignes: - TotalPas[k]:=Pas; - OrigA[k]=(Debut,0); - OrigB[k]=(Fin,TotalPas[k]); - endfor; - else: - if OrigineVariable: - n:=0; - for p_=#1: - n:=n+1; - OrigA[n]:=p_; - TotalPas[n]:=Pas; - endfor; - NbLignes:=n/2; - else: - n:=0; - for p_=#1: - n:=n+1; - TotalPas[n]=bluepart(p_); - OrigA[n]=(redpart(p_),0); - OrigB[n]=(greenpart(p_),TotalPas[n]); - endfor; - NbLignes:=n; - fi; - fi; - - picture EnsembleLignes; - - DefinirPoints(#2); - - EnsembleLignes=image( - if Solution: - drawoptions(withcolor 0.5white); - fi; - % On trace les lignes et on labelise le numéro de la ligne. - for k=0 upto NbLignes-1: - trace TraceLignes(TotalPas[k+1]) shifted(k*u*(0,-EcartVertical)); - if Droites: - label.lft(LATEX("(\num{"&decimal(k+1)&"})"),1.05[Lb,La] shifted(k*u*(0,-EcartVertical))); - else: - label.lft(LATEX("(\num{"&decimal(k+1)&"})"),La shifted(k*u*(0,-EcartVertical))); - fi; - endfor; - % On labelise les origines - labeloffset:=labeloffset*1.5; - for k=0 upto NbLignes-1: - if OrigineVariable: - label.top(LATEX("\num{"&decimal(xpart(OrigA[2*k+1]))&"}"),(ypart(OrigA[2*k+1])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); - label.top(LATEX("\num{"&decimal(xpart(OrigA[2*(k+1)]))&"}"),(ypart(OrigA[2*(k+1)])/Pas)[La,Lb]+u*(0,-k*EcartVertical)); - else: - label.top(LATEX("\num{"&decimal(xpart(OrigA[k+1]))&"}"),La+u*(0,-k*EcartVertical)); - label.top(LATEX("\num{"&decimal(xpart(OrigB[k+1]))&"}"),Lb+u*(0,-k*EcartVertical)); - fi; - endfor; - drawoptions(); - labeloffset:=labeloffset/1.5; - - % On trace la solution - if Solution: - for p_=#3: - trace p_ withpen pencircle scaled 1.5; - endfor; - fi; - % On ajoute des tracés si nécessaire - if Code: - EffectuerLesTraces; - fi; - ); - trace EnsembleLignes scaled \useKV[DessinGradue]{Echelle}; - \end{mpost} - \fi -}% - -\def\UpdateLignes#1/#2/#3\nil{\addtotok\toklisteptsgrad{#1,#3,#2,}}% -\def\UpdateTraces#1\nil{\addtotok\toklistetracesgrad{#1,}}% -\def\UpdateDefLignes#1/#2/#3\nil{\addtotok\toklistedefligne{(#1,#2,#3),}}% - -\newcommand\DessinGradue[4][]{% - \useKVdefault[DessinGradue]% - \setKV[DessinGradue]{#1}% - \newtoks\toklisteptsgrad% - \newtoks\toklistetracesgrad% - % On retiens les données pour la solution - \setsepchar[*]{,*/}% - \readlist\ListePG{#3}% - \setsepchar[*]{§*/}% - \readlist\ListeTraces{#4}% - \foreachitem\compteur\in\ListePG{\expandafter\UpdateLignes\compteur\nil}% - \foreachitem\compteur\in\ListeTraces{\expandafter\UpdateTraces\compteur\nil}% - \ifboolKV[DessinGradue]{LignesIdentiques}{% - \TraceDessinGradueComplet{}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% - }{% - \setsepchar[*]{,*/}% - \readlist\ListeDefLigne{#2}% - \xdef\toklistedefligne{}% - \ifboolKV[DessinGradue]{OrigineVariable}{% - \foreachitem\compteur\in\ListeDefLigne{% - \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2]),(\ListeDefLigne[\compteurcnt,3],\ListeDefLigne[\compteurcnt,4]),}% - }% - }{% - \foreachitem\compteur\in\ListeDefLigne{% - \xdef\toklistedefligne{\toklistedefligne (\ListeDefLigne[\compteurcnt,1],\ListeDefLigne[\compteurcnt,2],\ListeDefLigne[\compteurcnt,3]),}% - }% - }% - \TraceDessinGradueComplet{\toklistedefligne}{\the\toklisteptsgrad}{\the\toklistetracesgrad}% - }% -}% - -%%% Autonomie %%% -\setKVdefault[Autonomie]{AfficheMarge=false,TitreEnigme=Enigme,TitreAtoi=\`A toi,Enigme=false,TexteCorrection=\bfseries Correction,ARemplir=false,Deux=false,Landscape=false}% - -\newcommand\Autonomie[3][]{% - \useKVdefault[Autonomie]% - \setKV[Autonomie]{#1}% - \setsepchar[*]{§*/}% - \readlist*\ListeAutoQ{#2}% - % \setsepchar{§} - % \readlist*\ListeAutoR{#3}% - \setsepchar[*]{§*/}% - \readlist*\ListeAutoEn{#3}% - \clearpage - \begin{tikzpicture}[remember picture,overlay]% - \ifboolKV[Autonomie]{AfficheMarge}{% - \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};% - \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};% - \draw[blue,dashed] (PfCA) rectangle (PfCB);% - }{}% - \foreach \i in {1,...,3}{% - \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);% - \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);% - }% - \foreach \i in{1,...,4}{% - \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);% - \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);% - \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);% - \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);% - }% - \ifboolKV[Autonomie]{Deux}{% - \draw (C2) to (D2);% - \draw (E2) to (F2);% - }{% - \foreach\i in{1,...,4}{% - \draw (C\i) to (D\i);% - \draw (E\i) to (F\i);% - }% - }% - \coordinate (O1) at ($(D1)!0.5!(D2)$); - \coordinate (O2) at ($(D3)!0.5!(D4)$); - \coordinate (O3) at ($(E1)!0.5!(E2)$); - \coordinate (O4) at ($(E3)!0.5!(E4)$); - \coordinate (Q1) at ($(F1)!0.5!(A3)$);% - \coordinate (Q2) at ($(F2)!0.5!(E1)$);% - \coordinate (Q3) at ($(F3)!0.5!(E2)$);% - \coordinate (Q4) at ($(F4)!0.5!(E3)$);% - \coordinate (Q5) at ($(C1)!0.5!(A1)$);% - \coordinate (Q6) at ($(C2)!0.5!(D1)$);% - \coordinate (Q7) at ($(C3)!0.5!(D2)$);% - \coordinate (Q8) at ($(C4)!0.5!(D3)$);% - \ifboolKV[Autonomie]{Landscape}{% - \draw[dashed] (C1) to (F1); - \draw[dashed] (C3) to (F3); - \draw (A2) to (B2);% - }{% - \ifboolKV[Autonomie]{Deux}{% - \draw (C2) to (D2); - \draw (E2) to (F2); - }{% - \foreach\i in{1,...,4}{% - \draw (C\i) to (D\i); - \draw (E\i) to (F\i); - }% - }% - \draw[dashed] (A1) to (B1);% - \draw[dashed] (A3) to (B3);% - }% - %\draw[dashed] (A1) to (B1);% - %\draw[dashed] (A3) to (B3);% - \ifboolKV[Autonomie]{ARemplir}{% - \ifboolKV[Autonomie]{Landscape}{% - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O1) {\ListeAutoQ[1,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O2) {\ListeAutoQ[2,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O3) {\ListeAutoQ[3,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (O4) {\ListeAutoQ[4,1]}; - }{% - \ifboolKV[Autonomie]{Deux}{% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test1) at ($(Q1)!0.5!(Q2)$) {\ListeAutoQ[1,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test2) at ($(Q3)!0.5!(Q4)$) {\ListeAutoQ[2,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test3) at ($(Q5)!0.5!(Q6)$) {\ListeAutoQ[3,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test4) at ($(Q7)!0.5!(Q8)$) {\ListeAutoQ[4,1]};% - }{% - \foreach \i in {1,...,4}{% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};% - }% - \foreach \i in {5,...,8}{% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] (Test\i) at (Q\i) {\ListeAutoQ[\i,1]};% - }% - }% - }% - }{% - \foreach \i in {1,...,4}{% - \node[xshift=-5mm,align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};% - }% - \foreach \i in {5,...,8}{% - \node[align=justify,anchor=center,text width=0.8*0.25\textwidth] (Test\i) at (Q\i) {\ding{\fpeval{171+\i}}~\ListeAutoQ[\i,1]};% - }% - }% - \end{tikzpicture}% - \clearpage% - \begin{tikzpicture}[remember picture,overlay]% - \ifboolKV[Autonomie]{AfficheMarge}{% - \node[xshift=5mm,yshift=-5mm,circle] (PfCA) at (current page.north west) {};% - \node[xshift=-5mm,yshift=5mm] (PfCB) at (current page.south east) {};% - \draw[blue,dashed] (PfCA) rectangle (PfCB);% - }{}% - \foreach \i in {1,...,3}{% - \coordinate[xshift=\i*0.25*\paperwidth] (A\i) at (current page.north west);% - \coordinate[xshift=\i*0.25*\paperwidth] (B\i) at (current page.south west);% - }% - \foreach \i in{1,...,4}{% - \coordinate[yshift=-\i*0.25*\paperheight] (C\i) at (current page.north west);% - \coordinate[yshift=-\i*0.25*\paperheight] (F\i) at (current page.north east);% - \coordinate[yshift=-\i*0.25*\paperheight] (D\i) at (A1);% - \coordinate[yshift=-\i*0.25*\paperheight] (G\i) at (A2);% - \coordinate[yshift=-\i*0.25*\paperheight] (E\i) at (A3);% - }% - \ifboolKV[Autonomie]{Deux}{% - \draw (C2) to (F2);% - }{% - \foreach \i in{1,...,4}{% - \draw (C\i) to (F\i);% - }% - }% - \coordinate (T1) at ($(current page.north west)!0.5!(A1)$);% - \coordinate (T2) at ($(C1)!0.5!(D1)$);% - \coordinate (T3) at ($(C2)!0.5!(D2)$);% - \coordinate (T4) at ($(C3)!0.5!(D3)$);% - \coordinate (T5) at ($(current page.north east)!0.5!(A3)$);% - \coordinate (T6) at ($(E1)!0.5!(F1)$);% - \coordinate (T7) at ($(E2)!0.5!(F2)$);% - \coordinate (T8) at ($(E3)!0.5!(F3)$);% - \coordinate (U1) at ($(C1)!0.5!(D1)$);% - \coordinate (U2) at ($(C2)!0.5!(D2)$);% - \coordinate (U3) at ($(C3)!0.5!(D3)$);% - \coordinate (U4) at ($(current page.south west)!0.5!(B1)$);% - \coordinate (U5) at ($(E1)!0.5!(F1)$);% - \coordinate (U6) at ($(E2)!0.5!(F2)$);% - \coordinate (U7) at ($(E3)!0.5!(F3)$);% - \coordinate (U8) at ($(B3)!0.5!(current page.south east)$);% - \coordinate (R1) at ($(D1)!0.5!(A2)$);% - \coordinate (R2) at ($(D2)!0.5!(G1)$);% - \coordinate (R3) at ($(D3)!0.5!(G2)$);% - \coordinate (R4) at ($(D4)!0.5!(G3)$);% - \coordinate (R5) at ($(E1)!0.5!(A2)$);% - \coordinate (R6) at ($(E2)!0.5!(G1)$);% - \coordinate (R7) at ($(E3)!0.5!(G2)$);% - \coordinate (R8) at ($(E4)!0.5!(G3)$);% - \coordinate (S1) at ($(A1)!0.5!(D1)$);% - \coordinate (S2) at ($(D1)!0.5!(D2)$);% - \coordinate (S3) at ($(D2)!0.5!(D3)$);% - \coordinate (S4) at ($(D3)!0.5!(B1)$);% - \coordinate (S5) at ($(R1)!0.5!(R5)$);% - \coordinate (S6) at ($(R2)!0.5!(R6)$);% - \coordinate (S7) at ($(R3)!0.5!(R7)$);% - \coordinate (S8) at ($(R4)!0.5!(R8)$);% - \coordinate (V1) at ($(T1)!0.5!(U1)$);% - \coordinate (V2) at ($(T2)!0.5!(U2)$);% - \coordinate (V3) at ($(T3)!0.5!(U3)$);% - \coordinate (V4) at ($(T4)!0.5!(U4)$);% - \coordinate (V5) at ($(T5)!0.5!(U5)$);% - \coordinate (V6) at ($(T6)!0.5!(U6)$);% - \coordinate (V7) at ($(T7)!0.5!(U7)$);% - \coordinate (V8) at ($(T8)!0.5!(U8)$);% - \coordinate (W1) at ($(A3)!0.5!(E1)$); - \coordinate (W2) at ($(E1)!0.5!(E2)$); - \coordinate (W3) at ($(E2)!0.5!(E3)$); - \coordinate (W4) at ($(E3)!0.5!(E4)$); - \coordinate (W5) at ($(A1)!0.5!(D1)$); - \coordinate (W6) at ($(D1)!0.5!(D2)$); - \coordinate (W7) at ($(D2)!0.5!(D3)$); - \coordinate (W8) at ($(D3)!0.5!(D4)$); - \ifboolKV[Autonomie]{Landscape}{% - \draw[dashed] (C1) to (F1);% - \draw[dashed] (C3) to (F3); - \draw (A2) to (B2);% - }{% - \draw[dashed] (A1) to (B1);% - \draw[dashed] (A2) to (B2); - \draw[dashed] (A3) to (B3);% - }% - %\draw[dashed] (A1) to (B1);% - %\draw[dashed] (A2) to (B2);% - %\draw[dashed] (A3) to (B3);% - \ifboolKV[Autonomie]{ARemplir}{% - \ifboolKV[Autonomie]{Landscape}{% - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W2) {\ListeAutoEn[4,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W4) {\ListeAutoEn[3,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W6) {\ListeAutoEn[2,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W8) {\ListeAutoEn[1,1]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W1) {\ListeAutoQ[4,2]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W3) {\ListeAutoQ[3,2]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W5) {\ListeAutoQ[2,2]}; - \node[align=justify,anchor=center,text width=0.9*0.5\textwidth] at (W7) {\ListeAutoQ[1,2]}; - }{% - \ifboolKV[Autonomie]{Deux}{% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V1)!0.5!(V2)$) {\ListeAutoEn[1,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V3)!0.5!(V4)$) {\ListeAutoEn[2,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V5)!0.5!(V6)$) {\ListeAutoEn[3,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(V7)!0.5!(V8)$) {\ListeAutoEn[4,1]};% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R1)!0.5!(R2)$) {\ListeAutoQ[1,2]};%% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R3)!0.5!(R4)$) {\ListeAutoQ[2,2]};%% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R5)!0.5!(R6)$) {\ListeAutoQ[3,2]};%% - \node[align=justify,anchor=center,text width=0.9*0.25\textwidth] at ($(R7)!0.5!(R8)$) {\ListeAutoQ[4,2]};%% - }{% - \foreach \i in {1,...,8}{% - \node[text width=0.9*0.25\paperwidth] at (V\i) {\ListeAutoQ[\i,2]};% - \node[text width=0.9*0.25\paperwidth] at (R\i) {\ListeAutoEn[\i,1]};% - }% - }% - }% - }{% - \foreach \i in {1,...,8}{% - \node[rotate=90,anchor=north] (Cor\i) at (S\i) {\useKV[Autonomie]{TexteCorrection}};% - \node[anchor=west,xshift=2em,text width=0.8*0.25\paperwidth] (Test\i) - at (S\i) {\ListeAutoQ[\i,2]};% - \node[anchor=north,yshift=-1em,text width=0.85*0.25\paperwidth] (TestEn\i) - at (T\i) {\textbf{\useKV[Autonomie]{TitreAtoi}} \ListeAutoEn[\i,1]};% - \ifboolKV[Autonomie]{Enigme}{% - \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i) - at (U\i) {% - \ListeAutoEn[\i,2] : \pointilles\\% - Lettre \ding{\fpeval{171+\i}} : \pointilles% - };% - }{% - \node[anchor=south,yshift=1em,text width=0.85*0.25\paperwidth] (TestREn\i) - at (U\i) {% - \ListeAutoEn[\i,2]% - };% - }% - }% - }% - \end{tikzpicture}% -}% - -%%% -% Calculatrice -%%% -%https://tex.stackexchange.com/questions/290321/mimicking-a-calculator-inputs-and-screen -\definecolor{lightorange}{rgb}{0.9,0.4,0}% -\definecolor{lightestorange}{rgb}{1,0.8,0.5}% -\definecolor{darkorange}{rgb}{0.2,0.1,0}% - -\colorlet{blackened}{black!90!white}% -\colorlet{blackish}{black!70!white}% -\colorlet{greyish}{black!60!white}% -\colorlet{whiteish}{white}% -\colorlet{orangeish}{yellow!90!red}% -\colorlet{greenish}{green!16!gray}% -\colorlet{redish}{red!80!black}% - -\tcbset{calbackground/.style={ - enhanced, - leftright skip=0.25cm,beforeafter skip=0pt, - toptitle=0mm,bottomtitle=0mm, - right=2mm,left=2mm, - top=1pt, - bottom=0.25cm, - boxsep=0pt, - boxrule=0mm, - sharp corners, - sidebyside, - sidebyside gap=2mm, - lefthand ratio=0.6, - bicolor, - colback=black!10!white, - colbacklower=greenish, - colframe=white, - autoparskip, - }}% - -\newtcbox{\KY}[1][]{ - enhanced, - on line, - arc=2pt,outer arc=2pt, - boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, - boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, - interior style={top color=blackish,bottom color=blackened}, - colframe=greyish, - width=2.5em, - tcbox width=forced center, - equal height group=K, - valign=center, - fontupper=\footnotesize\sffamily, - coltext=orangeish, - before upper=\vrule width 0pt height 2ex depth 1ex\relax, -}% - -\newtcbox{\KYm}[1][]{ - enhanced, - on line, - arc=2pt,outer arc=2pt, - boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, - boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, - interior style={top color=blackish,bottom color=blackened}, - colframe=greyish, - width=2.5em, - tcbox width=forced center, - equal height group=K, - valign=center, - fontupper=\footnotesize\sffamily, - coltext=orangeish, - before upper=\vrule width 0pt height 2ex depth 1ex\relax$, - after upper=$, -}% - -\newtcbox{\KN}{ - enhanced, - on line, - arc=2pt,outer arc=2pt, - boxrule=0pt,bottomrule=0.25mm,rightrule=0.2mm, - boxsep=0pt,left=0pt,right=0pt,top=1pt,bottom=1pt, - interior style={top color=blackish,bottom color=blackened}, - colframe=greyish, - width=1.5em, - tcbox width=forced center, - equal height group=K, - valign=center, - fontupper=\footnotesize\sffamily, - coltext=whiteish, - before upper=\vrule width 0pt height 2ex depth 1ex\relax, -}% - -\newtcolorbox{calc}[1][]{% - enhanced,bicolor, - boxsep=0pt, - boxrule=0pt, - top=6pt,bottom=0pt,left=6pt,right=0pt, - sharp corners, - frame empty, - colback=black!10, - colbacklower=greenish, - sidebyside, - sidebyside align=top seam, - sidebyside gap=0pt, - righthand width=50.7mm, - before lower=\begin{tabular}{@{}l@{}}, - after lower=\end{tabular}, - overlay={\node[inner sep=0pt, outer sep=0pt, text height=5pt, text - depth=1pt, text width=50.7mm, fill=greenish, anchor=north - east, font=\sffamily\tiny\bfseries, align=flush right] - at (frame.north east) {#1};} -} - -\def\MPCalculatrice#1#2#3{ - % #1 Calcul %2 r\'eponse - \ifluatex - \mplibforcehmode% - \begin{mplibcode}% - input PfCCalculatrice; - LargeurEcran:=\useKV[ClesCalculatrice]{Largeur}; - LCD(#1)(#2)(#3); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={input PfCCalculatrice;LargeurEcran:=\useKV[ClesCalculatrice]{Largeur};}] - LCD(#1)(#2)(#3); - \end{mpost} - \fi -} - -\setKVdefault[ClesCalculatrice]{Ecran=false,NbLignes=0,BL=0.775,Largeur=120} - -\newcommand\Calculatrice[2][]{% - \setstackgap{L}{\useKV[ClesCalculatrice]{BL}\baselineskip}% - \useKVdefault[ClesCalculatrice]% - \setKV[ClesCalculatrice]{#1}% - \ifboolKV[ClesCalculatrice]{Ecran}{% - \setsepchar[*]{,*/}% - \readlist\ListeCalc{#2}% - \MPCalculatrice{\ListeCalc[1,1]}{\ListeCalc[1,2]}{\useKV[ClesCalculatrice]{NbLignes}}% - }{% - \setsepchar[*]{,*/}% - \readlist\ListeCalc{#2}% - \foreachitem\compteur\in\ListeCalc{\xintifboolexpr{\listlen\ListeCalc[\compteurcnt]==2}{\Longstack{{\tiny\ListeCalc[\compteurcnt,1]} \KN{\ListeCalc[\compteurcnt,2]}}}{\Longstack{{\tiny\ListeCalc[\compteurcnt,2]} \KY{\ListeCalc[\compteurcnt,3]}}}% - }% - }% - \setstackgap{L}{\baselineskip}% -}% - -%%% -% Questions Flash -%%% -\tcbset{Expression/.style={colback=white,valign=center,left=0mm,right=0mm,top=1mm,bottom=1mm,colframe=white}}% -\tcbset{ExpressionSerie1/.style={colback=\useKV[ClesFlash]{Couleur1},left=0mm,right=0mm,top=1mm,bottom=1mm}}% -\tcbset{ExpressionSerie2/.style={colback=\useKV[ClesFlash]{Couleur2},left=0mm,right=0mm,top=1mm,bottom=1mm}}% -\tcbset{ExpressionSerie3/.style={colback=\useKV[ClesFlash]{Couleur3},left=0mm,right=0mm,top=1mm,bottom=1mm}} -\tcbset{ExpressionSerie4/.style={colback=\useKV[ClesFlash]{Couleur4},left=0mm,right=0mm,top=1mm,bottom=1mm}} -\tcbset{BoiteExpression/.style={enhanced,nobeforeafter,tcbox raise base,colback=white,right=3.5mm,left=3.5mm,halign=center,colframe=black}} -\newtcolorbox{CadreNombre}[1][]{% - Expression,#1} - -\newcommand\BoiteFlash[2][40pt]{% - \ifx\bla#2\bla% - \tcbox[BoiteExpression]{\hbox to#1{\phantom{A}}}% - \else - \tcbox[BoiteExpression]{#2}% - \fi -} - -\setKVdefault[ClesFlash]{Hauteur=0.2\textheight,Simple=false,Intrus=false,Kahout=false,Daily=false,Expression=false,Mental=false,Mesure=false,Heure=false,Decimal=false,Operation=Multiplie,Numeration=false,Evaluation=false,Pause=false,Couleur1=blue!10,Couleur2=orange!10,Couleur3=green!10,Couleur4=yellow!10,Numerique=false,Seul=false} - -\newlength{\HauteurFlash} - -\def\MPAfficheur#1#2#3{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=0.5u; - draw Afficheur(#1 div10,0); - draw Afficheur(#1 mod10,0) shifted(u*(1,0)); - draw Afficheur(10,0) shifted(u*(2,0)); - draw Afficheur(#2 div10,0) shifted(u*(3,0)); - draw Afficheur(#2 mod10,0) shifted(u*(4,0)); - draw Afficheur(10,0) shifted(u*(5,0)); - draw Afficheur(#3 div10,0) shifted(u*(6,0)); - draw Afficheur(#3 mod10,0) shifted(u*(7,0)); - \end{mplibcode} - \else - \begin{mpost} - u:=0.5u; - draw Afficheur(#1 div10,0); - draw Afficheur(#1 mod10,0) shifted(u*(1,0)); - draw Afficheur(10,0) shifted(u*(2,0)); - draw Afficheur(#2 div10,0) shifted(u*(3,0)); - draw Afficheur(#2 mod10,0) shifted(u*(4,0)); - draw Afficheur(10,0) shifted(u*(5,0)); - draw Afficheur(#3 div10,0) shifted(u*(6,0)); - draw Afficheur(#3 mod10,0) shifted(u*(7,0)); - \end{mpost} - \fi -} - -\def\MPHorloge#1#2#3{ - \ifluatex - \mplibforcehmode - \begin{mplibcode} - marque_horloge=1; - save Hor; - picture Hor; - path gdeaig,pteaig,trot; - pair centrehorloge; - centrehorloge=(0,0); - path tourhorloge; - tourhorloge=cercles(centrehorloge,marque_horloge*cm); - Hor=image( - %% dessin de l'horloge - draw tourhorloge; - for i=0 upto 59: - if (i mod 5)=0: - if (i mod 15)=0: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp; - else: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp; - fi; - else: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))); - fi; - endfor; - path graduhorloge; - graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0)))); - % - marque_p:="plein"; - pointe(centrehorloge); - marque_p:="rien"; - %% placement des aiguilles - gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4; - draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25; - draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp; - ); - draw Hor; - \end{mplibcode} -\else - \begin{mpost}[mpsettings={input PfCGeometrie;}] - marque_horloge=1; - save Hor; - picture Hor; - path gdeaig,pteaig,trot; - pair centrehorloge; - centrehorloge=(0,0); - path tourhorloge; - tourhorloge=cercles(centrehorloge,marque_horloge*cm); - Hor=image( - %% dessin de l'horloge - draw tourhorloge; - for i=0 upto 59: - if (i mod 5)=0: - if (i mod 15)=0: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 2bp; - else: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (5*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))) withpen pencircle scaled 1.5bp; - fi; - else: - draw pointarc(tourhorloge,6*i)--(pointarc(tourhorloge,6*i) shifted (3*unitvector(centrehorloge-pointarc(tourhorloge,6*i)))); - fi; - endfor; - path graduhorloge; - graduhorloge=cercles(centrehorloge,marque_horloge*cm+5*abs(unitvector(centrehorloge-pointarc(tourhorloge,0)))); - % - marque_p:="plein"; - pointe(centrehorloge); - marque_p:="rien"; - %% placement des aiguilles - gdeaig=centrehorloge--(pointarc(tourhorloge,0) shifted (7*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - pteaig=centrehorloge--(pointarc(tourhorloge,0) shifted (18*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - trot=centrehorloge--(pointarc(tourhorloge,0) shifted (10*unitvector(centrehorloge-pointarc(tourhorloge,0)))); - draw rotation(trot,centrehorloge,90-6*#3) withpen pencircle scaled0.4; - draw rotation(gdeaig,centrehorloge,90-6*#2) withpen pencircle scaled1.25; - draw rotation(pteaig,centrehorloge,90-30*(#1+#2/60)) withpen pencircle scaled 2bp; - ); - draw Hor; - \end{mpost} - \fi -} - -\newcommand\QFNumeration{% - \begin{CadreNombre} - {\Large LE NOMBRE DU JOUR est : } - \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{Le chiffre des \ListeFlash[1,2] est :} - \tcbox[BoiteExpression]{\phantom{1500000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \textbf{Le chiffre \ListeFlash[1,3] repr\'esente le - chiffre des :} - \tcbox[BoiteExpression]{\phantom{1500000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{Le nombre de \ListeFlash[1,4] est :} - \tcbox[BoiteExpression]{\phantom{1500000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{\ListeFlash[1,5] est le nombre des :} - \tcbox[BoiteExpression]{\phantom{1500000}} - \end{tcolorbox} - \end{CadreNombre} -} - -\newcommand\QFHeure{% - \begin{CadreNombre} - {\Large L'HEURE DU JOUR est : }\ifboolKV[ClesFlash]{Numerique}{\raisebox{-0.3cm}{\MPAfficheur{\NbHeures}{\NbMinutes}{\NbSecondes}}}{\raisebox{-0.9cm}{{\MPHorloge{\NbHeures}{\NbMinutes}{\NbSecondes}}}} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{\ListeFlash[1,2] :} - \tcbox[BoiteExpression]{\phantom{1500000000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \textbf{\ListeFlash[1,3] :} - \tcbox[BoiteExpression]{\phantom{1500000000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{\ListeFlash[1,4] :} - \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{15}}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{\ListeFlash[1,5] :} - \tcbox[BoiteExpression]{\phantom{\hbox to4.5em{1500000}}} - \end{tcolorbox} - \end{CadreNombre} -} - -\newcommand\QFMesure{% - \begin{CadreNombre} - {\Large LA MESURE DU JOUR est : } - \tcbox[BoiteExpression]{\ListeFlash[1,1]} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{Convertis-la en \ListeFlash[1,2] :} - \tcbox[BoiteExpression]{\phantom{1500000000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \textbf{Elle peut aussi s'\'ecrire \ListeFlash[1,3] } - \tcbox[BoiteExpression]{\phantom{1500000000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{Ajoute-lui \ListeFlash[1,4] :} - \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{Enl\`eve-lui \ListeFlash[1,5] :} - \tcbox[BoiteExpression]{\phantom{\hbox to5em{1500000}}} - \end{tcolorbox} - \end{CadreNombre} -} - -\tikzset{ - arrow/.style={ - draw, - minimum height=1.25cm, - inner sep=0.25em, - shape=signal, - signal from=west, - signal to=east, - signal pointer angle=150, - } -} - -\newcommand\QFDaily{% - \begin{tikzpicture}% - \begin{scope}[start chain=transition going right,node distance=-\pgflinewidth]% - \foreach \s in {1,...,\ListeFlashlen}{% - \xintifboolexpr{\s == 1}{% - \node[arrow,on chain] {\Huge\bfseries\ListeFlash[\s]};% - \ifboolKV[ClesFlash]{Pause}{\pause}{}% - }{% - \xintifboolexpr{\s == \ListeFlashlen}{% - \node[arrow,on chain] {\Huge\bfseries?};% - }{% - \node[arrow,on chain] {\ListeFlash[\s]};% - \ifboolKV[ClesFlash]{Pause}{\pause}{}% - }% - }% - }% - \end{scope}% - \end{tikzpicture}% -}% - -\newcommand\QFDecimal{% - \begin{CadreNombre} - {\Large LE NOMBRE DU JOUR est : } - \tcbox[BoiteExpression]{\num{\ListeFlash[1,1]}} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{\'Ecris-le en fraction d\'ecimale :} - \tcbox[BoiteExpression]{$\dfrac{\phantom{1000000}}{\phantom{1000000}}$} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \begin{tabular}{c} - \textbf{Partie}\\ - \textbf{enti\`ere} - \end{tabular} \textbf{: } - \tcbox[BoiteExpression]{\phantom{100000}}\hfill% - $\square$ \begin{tabular}{c} - \textbf{Partie}\\ - \textbf{d\'ecimale} - \end{tabular} \textbf{: } - \tcbox[BoiteExpression]{\phantom{100000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{\useKV[ClesFlash]{Operation}-le par - \ListeFlash[1,2] :} \tcbox[BoiteExpression]{\phantom{1000000000}} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{Trouve le nombre entier le plus proche :} \tcbox[BoiteExpression]{\phantom{10000000}} - \end{tcolorbox} - \end{CadreNombre} -} - -\newcommand\QFMental{% - \begin{CadreNombre} - {\Large LE NOMBRE DU JOUR est : } - \tcbox[BoiteExpression]{\ListeFlash[1,1]} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{Ajoute-lui} - \tcbox[BoiteExpression]{\ListeFlash[1,2]}\hfill$\square$ - \textbf{Soustrais-lui} \tcbox[BoiteExpression]{\ListeFlash[1,3]} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \textbf{Multiplie-le par } - \tcbox[BoiteExpression]{\ListeFlash[1,4]}\hfill$\square$ - \textbf{Divise-le par } \tcbox[BoiteExpression]{\ListeFlash[1,5]} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{Trouve} - \tcbox[BoiteExpression]{\ListeFlash[1,6]} - \textbf{\% de ce nombre.} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{Trouve } \tcbox[BoiteExpression]{\ListeFlash[1,7]} - \textbf{de ce nombre.} - \end{tcolorbox} - \end{CadreNombre} -} - -\newcommand\QFExpression{% - \begin{CadreNombre} - {\Large L'EXPRESSION DU JOUR est : } - \tcbox[BoiteExpression]{\ListeFlash[1,1]} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie1] - $\square$ \textbf{Ajoute-lui} - \tcbox[BoiteExpression]{\ListeFlash[1,2]} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie2] - $\square$ \textbf{Soustrais-lui} - \tcbox[BoiteExpression]{\ListeFlash[1,3]} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie3] - $\square$ \textbf{Multiplie-la par} - \tcbox[BoiteExpression]{\ListeFlash[1,4]} - \end{tcolorbox} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie4] - $\square$ \textbf{\'Evalue-la lorsque} \tcbox[BoiteExpression]{\ListeFlash[1,5]} - \end{tcolorbox} - \end{CadreNombre} -} - - - -\newcommand\QFVide{% - \begin{CadreNombre} - {\ListeFlash[1]} - \xintFor* ##1 in {\xintSeq {1}{\ListeFlashlen-1}}\do{% - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{tcolorbox}[ExpressionSerie##1] - \ListeFlash[1+##1] - \end{tcolorbox} - } - \end{CadreNombre} -} - -\newcommand\QFlash[2][]{% - \useKVdefault[ClesFlash]% - \setKV[ClesFlash]{#1}% - \setlength{\HauteurFlash}{\useKV[ClesFlash]{Hauteur}}% - \colorlet{CouleurUn}{\useKV[ClesFlash]{Couleur1}}% - \colorlet{CouleurDeux}{\useKV[ClesFlash]{Couleur2}}% - \colorlet{CouleurTrois}{\useKV[ClesFlash]{Couleur3}}% - \colorlet{CouleurQuatre}{\useKV[ClesFlash]{Couleur4}}% - \ifboolKV[ClesFlash]{Evaluation}{% - \ifboolKV[ClesFlash]{Seul}{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \QFVide% - }{% - \ifboolKV[ClesFlash]{Numeration}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \QFNumeration% - }{% - \ifboolKV[ClesFlash]{Heure}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]% - \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]% - \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]% - \QFHeure% - }{% - \ifboolKV[ClesFlash]{Mesure}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \QFMesure% - }{% - \ifboolKV[ClesFlash]{Daily}{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \QFDaily% - }{% - \ifboolKV[ClesFlash]{Decimal}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \QFDecimal% - }{% - \ifboolKV[ClesFlash]{Mental}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \QFMental% - }{% - \ifboolKV[ClesFlash]{Expression}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \QFExpression% - }{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \ifboolKV[ClesFlash]{Simple}{% - \ListeFlash[1] - \begin{tcolorbox}[valign=center] - \ListeFlash[2] - \end{tcolorbox} - }{% - \setsepchar[*]{*/}% - \readlist*\ListeFlash{#2}% - \ifboolKV[ClesFlash]{Kahout}{% - \setsepchar[*]{*/}% - \readlist*\ListeFlash{#2}% - \begin{tcolorbox}[halign=center,valign=center] - \ListeFlash[1,1] - \end{tcolorbox} - % \par - \begin{multicols}{4} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center] - \ListeFlash[1,2] - \end{tcolorbox} - % \hfill% - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center] - \ListeFlash[1,3] - \end{tcolorbox} - % \hfill% - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center] - \ListeFlash[1,4] - \end{tcolorbox} - % \hfill% - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center] - \ListeFlash[1,5] - \end{tcolorbox} - \end{multicols} - }{% - \setsepchar[*]{*/}% - \readlist*\ListeFlash{#2}% - \begin{tcolorbox}[halign=center,valign=center] - \ListeFlash[1,1] - \end{tcolorbox} - \begin{multicols}{4} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,2] - \end{tcolorbox} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,3] - \end{tcolorbox} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center] - \ListeFlash[1,4] - \end{tcolorbox} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,5] - \end{tcolorbox} - \end{multicols} - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }{% - \ifboolKV[ClesFlash]{Seul}{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFVide% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Numeration}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFNumeration% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Heure}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \StrMid{\ListeFlash[1,1]}{1}{2}[\NbHeures]% - \StrMid{\ListeFlash[1,1]}{3}{4}[\NbMinutes]% - \StrMid{\ListeFlash[1,1]}{5}{6}[\NbSecondes]% - \begin{frame} - \QFHeure% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Mesure}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFMesure% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Daily}{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFDaily% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Decimal}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFDecimal% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Mental}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFMental% - \end{frame} - }{% - \ifboolKV[ClesFlash]{Expression}{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \QFExpression% - \end{frame} - }{% - \setsepchar[*]{/}% - \readlist*\ListeFlash{#2}% - \ifboolKV[ClesFlash]{Simple}{% - \begin{frame} - \ListeFlash[1] - \begin{tcolorbox}[valign=center] - \ListeFlash[2] - \end{tcolorbox} - \end{frame} - }{% - \setsepchar[*]{,*/}% - \readlist*\ListeFlash{#2}% - \ifboolKV[ClesFlash]{Kahout}{% - \setsepchar[*]{*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \begin{tcolorbox}[valign=center] - \ListeFlash[1,1] - \end{tcolorbox} - \vfill - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{columns}[T] - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=CouleurUn,halign=center,valign=center] - \ListeFlash[1,2] - \end{tcolorbox} - \end{column} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=CouleurDeux,halign=center,valign=center] - \ListeFlash[1,3] - \end{tcolorbox} - \end{column} - \end{columns} - \bigskip - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{columns}[T] - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,colback=CouleurTrois,halign=center,valign=center] - \ListeFlash[1,4] - \end{tcolorbox} - \end{column} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=CouleurQuatre,halign=center,valign=center] - \ListeFlash[1,5] - \end{tcolorbox} - \end{column} - \end{columns} - \end{frame} - }{% - \setsepchar[*]{*/}% - \readlist*\ListeFlash{#2}% - \begin{frame} - \begin{tcolorbox}[valign=center] - \ListeFlash[1,1] - \end{tcolorbox} - \vfill - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{columns}[T] - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurUn!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,2] - \end{tcolorbox} - \end{column} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurDeux!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,3] - \end{tcolorbox} - \end{column} - \end{columns} - \bigskip - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{columns}[T] - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurTrois!150,boxrule=1mm,colback=white,halign=center,valign=center] - \ListeFlash[1,4] - \end{tcolorbox} - \end{column} - \ifboolKV[ClesFlash]{Pause}{\pause}{} - \begin{column}{0.45\linewidth} - \begin{tcolorbox}[height=\HauteurFlash,colframe=CouleurQuatre!150,colback=white,boxrule=1mm,halign=center,valign=center] - \ListeFlash[1,5] - \end{tcolorbox} - \end{column} - \end{columns} - \end{frame} - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -%%% -% Rapido -%%% -%% D'après https://www.facebook.com/groups/994675223903586/user/100017057226847 -%% et une programmation de Laurent Lassale-Carrere -\newcounter{PfCnexo} -\newtcolorbox[use counter=PfCnexo,number format=\arabic]{RapidoBox}{% - % Titre - colbacktitle=white, - fonttitle=\color{black}\Large\bfseries, - toptitle=1mm, - bottomtitle=1mm, - bottom=1mm, - title={\useKV[ClesRapido]{Titre}}, - %% Cadre principal - enhanced, - width=\WidthRapido, - colback=white, - valign=top, - drop lifted shadow -} -\newtcolorbox{QuestionBox}{enhanced,nobeforeafter,size=small,sidebyside adapt=left} -\newtcolorbox{QuestionReponse}{enhanced,nobeforeafter,upperbox=invisible,colback=white,width=1.5cm,grow to left by=3mm,grow to right by=3mm,height=10mm} - -\setKVdefault[ClesRapido]{Debut=false,Largeur=0.9\linewidth,Titre={Rapido n°\thetcbcounter\hfill Date :\hspace*{2.5cm}}}% -\defKV[ClesRapido]{Numero=\setKV[ClesRapido]{Debut=true}} - -\newlength{\WidthRapido} - -\newcommand\Rapido[2][]{% numéro -\useKVdefault[ClesRapido]% -\setKV[ClesRapido]{#1}% -% -\ifboolKV[ClesRapido]{Debut}{% - \setcounter{PfCnexo}{\fpeval{\useKV[ClesRapido]{Numero}-1}} -}{}% -\setlength{\WidthRapido}{\useKV[ClesRapido]{Largeur}}% -% -\setsepchar[*]{§*/}% -\readlist*\ListeRapido{#2}% -\begin{RapidoBox} - \xintFor* ##1 in {\xintSeq {1}{\ListeRapidolen}}\do{% - \tcbsidebyside[% - sidebyside adapt=right, - bicolor, - colback=white,colbacklower=yellow!10!white, - nobeforeafter, - top=0mm,left=1mm, - grow to left by=3mm, - grow to right by=3mm, - bottom=0mm - ]{% - \ListeRapido[##1,1] - }{% - \ListeRapido[##1,2] - } - }% -\end{RapidoBox} -}% - -\newcommand\BoiteRapido[1]{% - \ifx\bla#1\bla% - \tcbox[BoiteExpression]{\phantom{100000}}% - \else% - \tcbox[BoiteExpression]{#1}% - \fi -}% - -%%% -% Fractions -%%% -\setKVdefault[ClesFraction]{Rayon=2cm,Disque,Regulier=false,Segment=false,Rectangle=false,Longueur=5cm,Largeur=2cm,Cotes=5,Triangle=false,Parts=3,Couleur=green,Reponse=false,Multiple=1,Hachures=false,Epaisseur=1} - -\def\MPFractionTriangle#1#2#3#4#5{% - % #1 longueur du c\^ot\'e - % #2 partage sur le c\^ot\'e - % #3 num - % #4 d\'eno (attention : = #2^2) - % #5 couleur - \ifluatex - \mplibforcehmode - \begin{mplibcode} - nbtriangle=0; - - vardef Ligne(expr longueur)= - for k=0 upto 2*(longueur-1): - nbtriangle:=nbtriangle+1; - if (k mod 2)=0: - M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - else: - M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - fi; - endfor; - enddef; - - pair A,B,C; - A=u*(0.5,0.5); - B-A=(#1,0); - C=rotation(B,A,60); - - nbparts:=#2; - - path M[]; - - path Tria,Trir; - Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); - Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); - - for k=nbparts downto 1: - Ligne(k); - endfor; - - m:=#3 div #4; - - drawoptions(shifted(m*(#1+1cm,0))); - for l=1 upto (#3 mod #4): - fill M[l] withcolor #5; - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - endfor; - - for l=0 upto (m-1): - drawoptions(shifted(l*(#1+1cm,0))); - remplis polygone(A,B,C) withcolor #5; - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - endfor; - \end{mplibcode} - \else - \begin{mpost} - nbtriangle=0; - - vardef Ligne(expr longueur)= - for k=0 upto 2*(longueur-1): - nbtriangle:=nbtriangle+1; - if (k mod 2)=0: - M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - else: - M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - fi; - endfor; - enddef; - - pair A,B,C; - A=u*(0.5,0.5); - B-A=(#1,0); - C=rotation(B,A,60); - - nbparts:=#2; - - path M[]; - - path Tria,Trir; - Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); - Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); - - for k=nbparts downto 1: - Ligne(k); - endfor; - - m:=#3 div #4; - - drawoptions(shifted(m*(#1+1cm,0))); - for l=1 upto (#3 mod #4): - fill M[l] withcolor #5; - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - endfor; - - for l=0 upto (m-1): - drawoptions(shifted(l*(#1+1cm,0))); - remplis polygone(A,B,C) withcolor #5; - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - endfor; - \end{mpost} - \fi - } - - \def\MPFractionTriangleH#1#2#3#4#5#6{ - % #1 longueur du c\^ot\'e - % #2 partage sur le c\^ot\'e - % #3 num - % #4 d\'eno (attention : = #2^2) - % #5 couleur - % #6 \'epaisseur - \ifluatex - \mplibforcehmode - \begin{mplibcode} - nbtriangle=0; - - vardef Ligne(expr longueur)= - for k=0 upto 2*(longueur-1): - nbtriangle:=nbtriangle+1; - if (k mod 2)=0: - M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - else: - M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - fi; - endfor; - enddef; - - pair A,B,C; - A=u*(0.5,0.5); - B-A=(#1,0); - C=rotation(B,A,60); - - nbparts:=#2; - - path M[]; - - path Tria,Trir; - Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); - Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); - - for k=nbparts downto 1: - Ligne(k); - endfor; - - m:=#3 div #4; - - for l=1 upto (#3 mod #4): - drawoptions(withpen pencircle scaled #6); - trace hachurage(M[l] shifted(m*(#1+1cm,0)),90,0.2,0) withcolor #5;%M[l] withcolor #5; - for k=1 upto nbparts: - drawoptions(withpen pencircle scaled #6); - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]) shifted(m*(#1+1cm,0)); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]) shifted(m*(#1+1cm,0)); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]) shifted(m*(#1+1cm,0)); - endfor; - endfor; - - for l=0 upto (m-1): - drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6); - trace hachurage(polygone(A,B,C),90,0.2,0) withcolor #5;%polygone(A,B,C) withcolor #5; - drawoptions(shifted(l*(#1+1cm,0)) withpen pencircle scaled #6); - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - endfor; - \end{mplibcode} - \else - \begin{mpost} - nbtriangle=0; - - vardef Ligne(expr longueur)= - for k=0 upto 2*(longueur-1): - nbtriangle:=nbtriangle+1; - if (k mod 2)=0: - M[nbtriangle]=(Tria shifted(0.5*k*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - else: - M[nbtriangle]=(Trir shifted(0.5*(k-1)*(1/nbparts)*(B-A))) shifted((nbparts-longueur)*(1/nbparts)*(C-A)); - fi; - endfor; - enddef; - - pair A,B,C; - A=u*(0.5,0.5); - B-A=(#1,0); - C=rotation(B,A,60); - - nbparts:=#2; - - path M[]; - - path Tria,Trir; - Tria=polygone(A,(1/nbparts)[A,B],(1/nbparts)[A,C]); - Trir=symetrie(Tria,(1/nbparts)[A,B],(1/nbparts)[A,C]); - - for k=nbparts downto 1: - Ligne(k); - endfor; - - diversite=floor(uniformdeviate(#2**2-#3-1)); - - for k=(1+diversite) upto (#3+diversite): - drawoptions(withpen pencircle scaled #6); - trace hachurage(M[k],90,0.2,0) withcolor #5; - endfor; - drawoptions(withpen pencircle scaled #6); - - for k=1 upto nbparts: - trace segment((k/nbparts)[A,B],(k/nbparts)[A,C]); - trace segment((k/nbparts)[B,A],(k/nbparts)[B,C]); - trace segment((k/nbparts)[C,A],(k/nbparts)[C,B]); - endfor; - \end{mpost} - \fi - } - -\def\MPFractionRegulier#1#2#3#4#5{% - % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair O,A[],B[]; - O=u*(0,0); - path cc,cd; - cc=cercles(O,#1); - for k=0 upto #2: - A[k]=pointarc(cc,k*(360/#2)); - endfor; - cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); - for k=0 upto #4-1: - B[k]=point(k*(#2/#4)) of cd; - endfor; - picture fondcolore; - fondcolore=image( - remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5; - clip currentpicture to cd; - for k=0 upto #4-1: - draw segment(O,B[k]) cutafter cd; - endfor; - trace cd; - ); - currentpicture:=nullpicture; - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5; - trace cd shifted(l*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); - endfor; - fi; - endfor; - fi; - draw fondcolore shifted(m*(#1*2+0.5cm,0)); - draw cd shifted(m*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); - endfor; - fi; - \end{mplibcode} - \else - \begin{mpost} - pair O,A[],B[]; - O=u*(0,0); - path cc,cd; - cc=cercles(O,#1); - for k=0 upto #2: - A[k]=pointarc(cc,k*(360/#2)); - endfor; - cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); - for k=0 upto #4-1: - B[k]=point(k*(#2/#4)) of cd; - endfor; - picture fondcolore; - fondcolore=image( - remplis O--arccercle(B[0],B[#3 mod #4],O)--cycle withcolor #5; - clip currentpicture to cd; - for k=0 upto #4-1: - draw segment(O,B[k]) cutafter cd; - endfor; - trace cd; - ); - currentpicture:=nullpicture; - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - fill cd shifted(l*(#1*2+0.5cm,0)) withcolor #5; - trace cd shifted(l*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); - endfor; - fi; - endfor; - fi; - draw fondcolore shifted(m*(#1*2+0.5cm,0)); - draw cd shifted(m*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); - endfor; - fi; - \end{mpost} - \fi -} - -\def\MPFractionRegulierH#1#2#3#4#5#6{% - % #1 rayon, #2 nb c\^ot\'es, #3 num, #4 deno, #5 couleur, #6 épaisseur - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair O,A[],B[]; - O=u*(0,0); - path cc,cd; - cc=cercles(O,#1); - for k=0 upto #2: - A[k]=pointarc(cc,k*(360/#2)); - endfor; - cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); - for k=0 upto #4-1: - B[k]=point(k*(#2/#4)) of cd; - endfor; - picture fondcolore; - fondcolore=image(% - drawoptions(withpen pencircle scaled #6); - trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5; - clip currentpicture to cd; - drawoptions(withpen pencircle scaled #6); - for k=0 upto #4-1: - draw segment(O,B[k]) cutafter cd; - endfor; - trace cd; - ); - currentpicture:=nullpicture; - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled #6); - trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5; - drawoptions(withpen pencircle scaled #6); - trace cd shifted(l*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - drawoptions(withpen pencircle scaled #6); - draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); - endfor; - fi; - endfor; - fi; - draw fondcolore shifted(m*(#1*2+0.5cm,0)); - drawoptions(withpen pencircle scaled #6); - draw cd shifted(m*(#1*2+0.5cm,0)); - if #4>1: - drawoptions(withpen pencircle scaled #6); - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); - endfor; - fi; - \end{mplibcode} - \else -\begin{mpost} - pair O,A[],B[]; - O=u*(0,0); - path cc,cd; - cc=cercles(O,#1); - for k=0 upto #2: - A[k]=pointarc(cc,k*(360/#2)); - endfor; - cd=polygone(A0 for k=1 upto #2-1:,A[k] endfor); - for k=0 upto #4-1: - B[k]=point(k*(#2/#4)) of cd; - endfor; - picture fondcolore; - fondcolore=image(% - drawoptions(withpen pencircle scaled #6); - trace hachurage(O--arccercle(B[0],B[#3 mod #4],O)--cycle,1.5*360/#2,0.25,0) withcolor #5; - clip currentpicture to cd; - drawoptions(withpen pencircle scaled #6); - for k=0 upto #4-1: - draw segment(O,B[k]) cutafter cd; - endfor; - trace cd; - ); - currentpicture:=nullpicture; - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled #6); - trace hachurage(cd shifted(l*(#1*2+0.5cm,0)),1.5*360/#2,0.25,0) withcolor #5; - drawoptions(withpen pencircle scaled #6); - trace cd shifted(l*(#1*2+0.5cm,0)); - if #4>1: - for k=0 upto #4-1: - drawoptions(withpen pencircle scaled #6); - draw (segment(O,B[k]) cutafter cd) shifted(l*(#1*2+0.5cm,0)); - endfor; - fi; - endfor; - fi; - draw fondcolore shifted(m*(#1*2+0.5cm,0)); - drawoptions(withpen pencircle scaled #6); - draw cd shifted(m*(#1*2+0.5cm,0)); - if #4>1: - drawoptions(withpen pencircle scaled #6); - for k=0 upto #4-1: - draw (segment(O,B[k]) cutafter cd) shifted(m*(#1*2+0.5cm,0)); - endfor; - fi; - \end{mpost} - \fi -} - -\def\MPFractionRectangle#1#2#3#4#5#6{% - % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,B,C,D,M[],N[],R[],S[]; - A=(1,1); - B-A=(#1,0); - C-B=(0,#2); - D-C=A-B; - numeric parts; - parts=(#4 div #6); - for k=0 upto parts: - M[k]=(k/parts)[A,B]; - N[k]=(k/parts)[D,C]; - endfor; - if #6>1: - for k=0 upto #6: - R[k]=(k/#6)[A,D]; - S[k]=(k/#6)[B,C]; - endfor; - fi; - picture FondRectangle; - FondRectangle=image(% - draw polygone(A,B,C,D); - for k=1 upto (parts-1): - draw segment(M[k],N[k]); - endfor; - if #6>1: - for k=1 upto (#6-1): - draw segment(R[k],S[k]); - endfor; - fi; - ); - picture FondRectangleColorie; - FondRectangleColorie=image(% - if #6=1: - remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5; - else: - DDiv=(#3 mod #4) div parts; - MMod=(#3 mod #4) mod parts; - remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5; - remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5; - fi; - ); - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto m-1: - remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5; - trace FondRectangle shifted(l*(#1+1cm,0)); - endfor; - fi; - if (#3 mod #4)<>0: - trace FondRectangleColorie shifted(m*(#1+1cm,0)); - else: - remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5; - fi; - trace FondRectangle shifted(m*(#1+1cm,0)); - \end{mplibcode} - \else -\begin{mpost} - pair A,B,C,D,M[],N[],R[],S[]; - A=(1,1); - B-A=(#1,0); - C-B=(0,#2); - D-C=A-B; - numeric parts; - parts=(#4 div #6); - for k=0 upto parts: - M[k]=(k/parts)[A,B]; - N[k]=(k/parts)[D,C]; - endfor; - if #6>1: - for k=0 upto #6: - R[k]=(k/#6)[A,D]; - S[k]=(k/#6)[B,C]; - endfor; - fi; - picture FondRectangle; - FondRectangle=image(% - draw polygone(A,B,C,D); - for k=1 upto (parts-1): - draw segment(M[k],N[k]); - endfor; - if #6>1: - for k=1 upto (#6-1): - draw segment(R[k],S[k]); - endfor; - fi; - ); - picture FondRectangleColorie; - FondRectangleColorie=image(% - if #6=1: - remplis polygone(A,M[#3 mod #4],N[#3 mod #4],D) withcolor #5; - else: - DDiv=(#3 mod #4) div parts; - MMod=(#3 mod #4) mod parts; - remplis polygone(A,B,S[DDiv],R[DDiv]) withcolor #5; - remplis polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]) withcolor #5; - fi; - ); - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto m-1: - remplis (polygone(A,B,C,D) shifted(l*(#1+1cm,0))) withcolor #5; - trace FondRectangle shifted(l*(#1+1cm,0)); - endfor; - fi; - if (#3 mod #4)<>0: - trace FondRectangleColorie shifted(m*(#1+1cm,0)); - else: - remplis (polygone(A,B,C,D) shifted(m*(#1+1cm,0))) withcolor #5; - fi; - trace FondRectangle shifted(m*(#1+1cm,0)); - \end{mpost} - \fi -} - -\def\MPFractionRectangleH#1#2#3#4#5#6#7{% - % #1 longueur, #2 largeur, #3 num, #4 deno, #5 couleur, #6 multiple - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,B,C,D,M[],N[],R[],S[]; - A=(1,1); - B-A=(#1,0); - C-B=(0,#2); - D-C=A-B; - numeric parts; - parts=(#4 div #6); - for k=0 upto parts: - M[k]=(k/parts)[A,B]; - N[k]=(k/parts)[D,C]; - endfor; - if #6>1: - for k=0 upto #6: - R[k]=(k/#6)[A,D]; - S[k]=(k/#6)[B,C]; - endfor; - fi; - picture FondRectangle; - FondRectangle=image(% - draw polygone(A,B,C,D); - for k=1 upto (parts-1): - draw segment(M[k],N[k]); - endfor; - if #6>1: - for k=1 upto (#6-1): - draw segment(R[k],S[k]); - endfor; - fi; - ); - picture FondRectangleColorie; - FondRectangleColorie=image(% - if #6=1: - drawoptions(withpen pencircle scaled#7); - trace hachurage(polygone(A,M[#3 mod #4],N[#3 mod #4],D),45,0.25,0) withcolor #5; - else: - DDiv=(#3 mod #4) div parts; - MMod=(#3 mod #4) mod parts; - drawoptions(withpen pencircle scaled#7); - trace hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5; - drawoptions(withpen pencircle scaled#7); - trace hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5; - fi; - ); - m=#3 div #4; - if (#3 mod #4)=0:m:=m-1; fi; - if m>0: - for l=0 upto m-1: - drawoptions(withpen pencircle scaled#7); - trace hachurage(polygone(A,B,C,D) shifted(l*(#1+1cm,0)),45,0.25,0) withcolor #5; - drawoptions(withpen pencircle scaled#7); - trace FondRectangle shifted(l*(#1+1cm,0)); - endfor; - fi; - if (#3 mod #4)<>0: - drawoptions(withpen pencircle scaled#7); - trace FondRectangleColorie shifted(m*(#1+1cm,0)); - else: - drawoptions(withpen pencircle scaled#7); - trace hachurage(polygone(A,B,C,D) shifted(m*(#1+1cm,0)),45,0.25,0) withcolor #5; - fi; - drawoptions(withpen pencircle scaled#7); - trace FondRectangle shifted(m*(#1+1cm,0)); - \end{mplibcode} - \else -\begin{mpost} - pair A,B,C,D,M[],N[],R[],S[]; - A=(1,1); - B-A=(#1,0); - C-B=(0,#2); - D-C=A-B; - numeric parts; - parts=(#4 div #6); - for k=0 upto parts: - M[k]=(k/parts)[A,B]; - N[k]=(k/parts)[D,C]; - endfor; - if #6>1: - for k=0 upto #6: - R[k]=(k/#6)[A,D]; - S[k]=(k/#6)[B,C]; - endfor; - fi; - if #6=1: - drawoptions(withpen pencircle scaled#7); - draw hachurage(polygone(A,M[#3],N[#3],D),45,0.25,0) withcolor #5; - else: - DDiv=#3 div parts; - MMod=#3 mod parts; - drawoptions(withpen pencircle scaled#7); - draw hachurage(polygone(A,B,S[DDiv],R[DDiv]),45,0.25,0) withcolor #5; - drawoptions(withpen pencircle scaled#7); - draw hachurage(polygone(R[DDiv],(xpart(M[MMod]),ypart(R[DDiv])),(xpart(M[MMod]),ypart(R[DDiv+1])),R[DDiv+1]),45,0.25,0) withcolor #5; - fi; - drawoptions(withpen pencircle scaled#7); - draw polygone(A,B,C,D); - for k=1 upto (parts-1): - draw segment(M[k],N[k]); - endfor; - if #6>1: - for k=1 upto (#6-1): - draw segment(R[k],S[k]); - endfor; - drawoptions(); - fi; - \end{mpost} - \fi -} - -\def\MPFractionDisque#1#2#3#4{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,B[]; - A=(0,0); - path cc; - cc=cercles(A,#1); - for k=0 upto #3: - B[k]=pointarc(cc,(360/#3)*k); - endfor; - m=(#2 div #3); - if (#2 mod #3)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - fill cc shifted(l*(2*#1+1cm,0)) withcolor #4; - endfor; - fi; - fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4; - for l=0 upto m: - draw cc shifted(l*(2*#1+1cm,0)); - for k=0 upto (#3-1): - draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); - endfor; - endfor; - \end{mplibcode} - \else - \begin{mpost} - pair A,B[]; - A=(0,0); - path cc; - cc=cercles(A,#1); - for k=0 upto #3: - B[k]=pointarc(cc,(360/#3)*k); - endfor; - m=#2 div #3; - if (#2 mod #3)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - fill cc shifted(l*(2*#1+1cm,0)) withcolor #4; - endfor; - fi; - fill ((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted (m*(2*#1+1cm,0))) withcolor #4; - for l=0 upto m: - draw cc shifted(l*(2*#1+1cm,0)); - for k=0 upto (#3-1): - draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); - endfor; - endfor; - \end{mpost} - \fi -} - -\def\MPFractionDisqueH#1#2#3#4#5{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,B[]; - A=(0,0); - path cc; - cc=cercles(A,#1); - for k=0 upto #3: - B[k]=pointarc(cc,(360/#3)*k); - endfor; - m=#2 div #3; - if (#2 mod #3)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled#5); - draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; - endfor; - fi; - drawoptions(withpen pencircle scaled#5); - draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - for l=0 upto m: - draw cc shifted(l*(2*#1+1cm,0)); - for k=0 upto (#3-1): - draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); - endfor; - endfor; - \end{mplibcode} - \else - \begin{mpost} - pair A,B[]; - A=(0,0); - path cc; - cc=cercles(A,#1); - for k=0 upto #3: - B[k]=pointarc(cc,(360/#3)*k); - endfor; - m=#2 div #3; - if (#2 mod #3)=0:m:=m-1; fi; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled#5); - draw hachurage(cc shifted(l*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; - endfor; - fi; - drawoptions(withpen pencircle scaled#5); - draw hachurage((A--B0--arccercle(B[0],B[#2 mod #3],A)--cycle) shifted(m*(2*#1+1cm,0)),1.5*360/#3,0.25,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - for l=0 upto m: - draw cc shifted(l*(2*#1+1cm,0)); - for k=0 upto (#3-1): - draw segment(A,B[k]) shifted(l*(2*#1+1cm,0)); - endfor; - endfor; - \end{mpost} - \fi -} - -\def\MPFractionSegment#1#2#3#4{ - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,C,B[]; - A=(0,0); - C-A=(#1,0); - for k=0 upto #3: - B[k]=(k/#3)[A,C]; - endfor; - m=#2 div #3; - if m>0: - for l=0 upto (m-1): - draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; - endfor; - fi; - if (#2 mod #3)<>0: - draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; - draw segment(A,C) shifted(m*(#1+1cm,0)); - fi; - marque_p:="tiretv"; - for l=0 upto m-1: - for k=0 upto #3: - pointe(B[k] shifted(l*(#1+1cm,0))); - endfor; - endfor; - if (#2 mod #3)<>0: - for k=0 upto #3: - pointe(B[k] shifted(m*(#1+1cm,0))); - endfor; - fi; - \end{mplibcode} - \else - \begin{mpost} - pair A,C,B[]; - A=(0,0); - C-A=(#1,0); - for k=0 upto #3: - B[k]=(k/#3)[A,C]; - endfor; - m=#2 div #3; - if m>0: - for l=0 upto (m-1): - draw (segment(B[0],B[#3]) shifted(l*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; - endfor; - fi; - if (#2 mod #3)<>0: - draw (segment(B[0],B[#2 mod #3]) shifted(m*(#1+1cm,0))) withpen pencircle scaled 2 withcolor #4; - draw segment(A,C) shifted(m*(#1+1cm,0)); - fi; - marque_p:="tiretv"; - for l=0 upto m-1: - for k=0 upto #3: - pointe(B[k] shifted(l*(#1+1cm,0))); - endfor; - endfor; - if (#2 mod #3)<>0: - for k=0 upto #3: - pointe(B[k] shifted(m*(#1+1cm,0))); - endfor; - fi; - \end{mpost} - \fi -} - -\def\MPFractionSegmentH#1#2#3#4#5{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair A,C,B[]; - A=(0,0); - C-A=(#1,0); - for k=0 upto #3: - B[k]=(k/#3)[A,C]; - endfor; - m=#2 div #3; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled#5); - draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - draw segment(A,C) shifted(l*(#1+1cm,0)); - endfor; - fi; - if (#2 mod #3)<>0: - drawoptions(withpen pencircle scaled#5); - draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - draw segment(A,C) shifted(m*(#1+1cm,0)); - fi; - marque_p:="tiretv"; - for l=0 upto m-1: - for k=0 upto #3: - pointe(B[k] shifted(l*(#1+1cm,0))); - endfor; - endfor; - if (#2 mod #3)<>0: - for k=0 upto #3: - pointe(B[k] shifted(m*(#1+1cm,0))); - endfor; - fi; - \end{mplibcode} - \else - \begin{mpost} - pair A,C,B[]; - A=(0,0); - C-A=(#1,0); - for k=0 upto #3: - B[k]=(k/#3)[A,C]; - endfor; - m=#2 div #3; - if m>0: - for l=0 upto (m-1): - drawoptions(withpen pencircle scaled#5); - draw hachurage(polygone(B[0]+u*(0,-0.15),B[#3]+u*(0,-0.15),B[#3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(l*(#1+1cm,0)),120,0.2,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - draw segment(A,C) shifted(l*(#1+1cm,0)); - endfor; - fi; - if (#2 mod #3)<>0: - drawoptions(withpen pencircle scaled#5); - draw hachurage(polygone(B[0]+u*(0,-0.15),B[#2 mod #3]+u*(0,-0.15),B[#2 mod #3]+u*(0,0.15),B[0]+u*(0,0.15)) shifted(m*(#1+1cm,0)),120,0.2,0) withcolor #4; - drawoptions(withpen pencircle scaled#5); - draw segment(A,C) shifted(m*(#1+1cm,0)); - fi; - marque_p:="tiretv"; - for l=0 upto m-1: - for k=0 upto #3: - pointe(B[k] shifted(l*(#1+1cm,0))); - endfor; - endfor; - if (#2 mod #3)<>0: - for k=0 upto #3: - pointe(B[k] shifted(m*(#1+1cm,0))); - endfor; - fi; - \end{mpost} - \fi -} - -\newcommand\Fraction[2][]{% - \useKVdefault[ClesFraction]% - \setKV[ClesFraction]{#1}% - \setsepchar[*]{/}% - \readlist*\ListeFraction{#2}% - \ifboolKV[ClesFraction]{Triangle}{% - \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% - \ifboolKV[ClesFraction]{Hachures}{% - \MPFractionTriangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% - }{% - \MPFractionTriangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Parts}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% - }% - }{% - \ifboolKV[ClesFraction]{Regulier}{% - \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% - \ifboolKV[ClesFraction]{Hachures}{% - \MPFractionRegulierH{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% - }{% - \MPFractionRegulier{\useKV[ClesFraction]{Rayon}}{\useKV[ClesFraction]{Cotes}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% - }% - }{% - \ifboolKV[ClesFraction]{Segment}{% - \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% - \ifboolKV[ClesFraction]{Hachures}{% - \MPFractionSegmentH{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% - }{% - \MPFractionSegment{\useKV[ClesFraction]{Longueur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% - }% - }{% - \ifboolKV[ClesFraction]{Rectangle}{%rectangle - \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% - \ifboolKV[ClesFraction]{Hachures}{% - \MPFractionRectangleH{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}{\useKV[ClesFraction]{Epaisseur}}% - }{% - \MPFractionRectangle{\useKV[ClesFraction]{Longueur}}{\useKV[ClesFraction]{Largeur}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Multiple}}% - }% - }{%disque - \ifboolKV[ClesFraction]{Reponse}{}{\setKV[ClesFraction]{Couleur=white}}% - \ifboolKV[ClesFraction]{Hachures}{% - \MPFractionDisqueH{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}{\useKV[ClesFraction]{Epaisseur}}% - }{% - \MPFractionDisque{\useKV[ClesFraction]{Rayon}}{\ListeFraction[1]}{\ListeFraction[2]}{\useKV[ClesFraction]{Couleur}}% - }% - }% - }% - }% - }% -}% - -%%% -% R\'eponses \`a relier -%%% -\setKVdefault[ClesRelie]{Solution=false,LargeurG=5cm,LargeurD=2cm,Stretch=1.5,Ecart=2cm,Couleur=black} - -\newcommand\Relie[2][]{% - \useKVdefault[ClesRelie]% - \setKV[ClesRelie]{#1}% - \setsepchar[*]{,*/}% - \readlist*\ListeRelie{#2}% - \buildtabrelie% - \ifboolKV[ClesRelie]{Solution}{% - \colorlet{PfCRelieCouleurTrace}{\useKV[ClesRelie]{Couleur}}% - \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{% - \itemtomacro\ListeRelie[##1,1]\untest - \ifx\bla\untest\bla% - \else - \tikz[remember picture,overlay]{\draw[PfCRelieCouleurTrace] (RelieG-##1) -- (RelieD-\ListeRelie[##1,3]);}% - \fi - }% - }{% - }% -} - -\newcounter{NbRelie} - -\def\buildtabrelie{% - \setcounter{NbRelie}{0}% - \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}% - \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember - picture]{\node[name=RelieD-\theNbRelie,inner - sep=0pt]{};\fill[] (RelieD-\theNbRelie) circle[radius=1.5pt]}}cp{\useKV[ClesRelie]{LargeurD}}}% - \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest% -\ifx\bla\untest\bla% - \uppercase{&}\stepcounter{NbRelie}% - \else - \uppercase{&}\stepcounter{NbRelie}\tikz[remember - picture,overlay]{\node[name=RelieG-\theNbRelie,inner - sep=0pt]{};\fill[] - (RelieG-\theNbRelie) circle[radius=1.5pt];} -\fi&&&\ListeRelie[##1,2]\\}% - \end{tabular}% - \setcounter{NbRelie}{0}% -}% - -\def\buildtabrelieold{% - \setcounter{NbRelie}{0}% - \renewcommand{\arraystretch}{\useKV[ClesRelie]{Stretch}}% - \begin{tabular}{p{\useKV[ClesRelie]{LargeurG}}cp{\useKV[ClesRelie]{Ecart}}>{\tikz[remember - picture,baseline]{\node[name=RelieD-\theNbRelie]{\Large\textbullet};}}cp{\useKV[ClesRelie]{LargeurD}}}% - \xintFor* ##1 in {\xintSeq {1}{\ListeRelielen}}\do{\ListeRelie[##1,1]\itemtomacro\ListeRelie[##1,1]\untest% -\ifx\bla\untest\bla% - \uppercase{&}\stepcounter{NbRelie}% - \else - \uppercase{&}\stepcounter{NbRelie}\tikz[remember picture,baseline]{\node[name=RelieG-\theNbRelie]{\Large\textbullet};} -\fi&&&\ListeRelie[##1,2]\\}% - \end{tabular}% - \setcounter{NbRelie}{0}% -}% - -%%% -% QCM -%%% -\setKVdefault[ClesQCM]{Reponses=3,Solution=false,Stretch=1,Largeur=2cm,Couleur=gray!15,Titre=false,Nom=R\'eponse,NomV=Vrai,NomF=Faux,Alph=false,AlphT=false,VF=false,Depart=1,Alterne=false,Noms={A/B/C},Multiple=false}% -\newlength{\LargeurQCM}% -\newlength{\PfCLargeurQCM}% -\newcounter{QuestionQCM}% -\newcounter{TitreQCM}% -\ifdef{\QCM}{% - \PackageWarning{ProfCollege}{La commande \noexpand\QCM étant définie par la classe du document, ProfCollege modifie sa commande \noexpand\QCM en \noexpand\QCMPfC.}% - \newcommand\QCMPfC[2][]{% - \useKVdefault[ClesQCM]% - \setKV[ClesQCM]{#1}% - \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}% - \setcounter{TitreQCM}{0} - \setsepchar[*]{§*&}\ignoreemptyitems% - \readlist*\ListeQCM{#2}% - \ifboolKV[ClesQCM]{Multiple}{% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \xdef\ListeNom{\useKV[ClesQCM]{Noms}}% - \setsepchar[*]{/}% - \readlist*\ListeNomsMul{\ListeNom}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \cline{2-\NBcases}% - \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ListeNomsMul[##2]}% - \\ - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}% - }\\ - }% - \hline% - \end{tabular}% - }{% - \ifboolKV[ClesQCM]{VF}{% - \setKV[ClesQCM]{Reponses=2}% - \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% - \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \cline{2-\NBcases}% - \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\ - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}% - }\\ - }% - \hline% - \end{tabular} - }{% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}% - \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}% - \\ - }{} - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]% - }\\ - }% - \hline% - \end{tabular}% - }% - }% - \renewcommand{\arraystretch}{1}% - }% -}{% - \newcommand\QCM[2][]{% - \useKVdefault[ClesQCM]% - \setKV[ClesQCM]{#1}% - \setcounter{QuestionQCM}{\fpeval{\useKV[ClesQCM]{Depart}-1}}% - \setcounter{TitreQCM}{0} - \setsepchar[*]{,*&}\ignoreemptyitems% - \readlist*\ListeQCM{#2}% - \ifboolKV[ClesQCM]{Multiple}{% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \xdef\ListeNom{\useKV[ClesQCM]{Noms}}% - \setsepchar[*]{/}% - \readlist*\ListeNomsMul{\ListeNom}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \cline{2-\NBcases}% - \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ListeNomsMul[##2]}% - \\ - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{\ListeQCM[##1,\fpeval{##2+1}]==1}{$\boxtimes$}{$\square$}}{$\square$}% - }\\ - }% - \hline% - \end{tabular}% - \renewcommand{\arraystretch}{1}% - }{% - \ifboolKV[ClesQCM]{VF}{% - \setKV[ClesQCM]{Reponses=2}% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\PfCLargeurQCM}{\useKV[ClesQCM]{Largeur}}% - \setlength{\LargeurQCM}{\linewidth-6\tabcolsep-2\PfCLargeurQCM-4\arrayrulewidth}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \cline{2-\NBcases}% - \multicolumn{1}{c|}{}&\useKV[ClesQCM]{NomV}&\useKV[ClesQCM]{NomF}\\ - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xintifboolexpr{##2==\ListeQCM[##1,2]}{$\boxtimes$}{$\square$}}{$\square$}% - }\\ - }% - \hline% - \end{tabular} - }{% - \renewcommand{\arraystretch}{\useKV[ClesQCM]{Stretch}}% - \setlength{\LargeurQCM}{\fpeval{(\linewidth-\useKV[ClesQCM]{Reponses}*(3*\tabcolsep+\useKV[ClesQCM]{Largeur}))}pt}% - \xdef\NBcases{\fpeval{\useKV[ClesQCM]{Reponses}+1}}% - \begin{tabular}{|p{\LargeurQCM}|*{\useKV[ClesQCM]{Reponses}}{>{\centering\arraybackslash}p{\useKV[ClesQCM]{Largeur}}|}}% - \ifboolKV[ClesQCM]{Titre}{\cline{2-\NBcases}% - \multicolumn{1}{c|}{}\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\stepcounter{TitreQCM}\useKV[ClesQCM]{Nom} \ifboolKV[ClesQCM]{AlphT}{\Alph{TitreQCM}}{##2}}% - \\ - }{} - \hline% - \xintFor* ##1 in {\xintSeq {1}{\ListeQCMlen}}\do{% - \stepcounter{QuestionQCM}\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Alph}{\textbf{\Alph{QuestionQCM}}/}{\textbf{\theQuestionQCM/}}~\ListeQCM[##1,1]\xintFor* ##2 in {\xintSeq {1}{\useKV[ClesQCM]{Reponses}}}\do{% - &\ifboolKV[ClesQCM]{Alterne}{\modulo{\theQuestionQCM}{2}\ifnum\remainder=0\cellcolor{gray!15}\fi}{}\ifboolKV[ClesQCM]{Solution}{\xdef\NumeroReponse{\fpeval{\useKV[ClesQCM]{Reponses}+2}}\xintifboolexpr{##2==\ListeQCM[##1,\NumeroReponse]}{\cellcolor{\useKV[ClesQCM]{Couleur}}}{}}{}\ListeQCM[##1,##2+1]% - }\\ - }% - \hline% - \end{tabular}% - }% - }% - \renewcommand{\arraystretch}{1}% - }% -} - -%%% -% Somme des angles -%%% -\setKVdefault[ClesSommeAngle]{Detail=true,Isocele=false,Rectangle=false,Figure=false,FigureSeule=false,Angle=0,Perso=false,Echelle=1cm}% - -\def\MPFigureSommeAngle#1#2#3#4#5{% - % #1 Premier sommet - % #2 Deuxi\`eme sommet - % #3 Troisi\`eme sommet - % #4 1er angle - % #5 2eme angle - \ifluatex - %\mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - pair A,B,C,O,I;% - u:=\useKV[ClesSommeAngle]{Echelle}; - Angle:=\useKV[ClesSommeAngle]{Angle}; - boolean Rectangle,Isocele; - Rectangle=\useKV[ClesSommeAngle]{Rectangle};% - Isocele=\useKV[ClesSommeAngle]{Isocele}; - A=u*(1,1); - B-A=u*(4,0); - if Rectangle: - C=3/5[B,rotation(A,B,-90)]; - else: - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - fi; - O=CentreCercleC(A,B,C); - % On tourne pour \'eventuellement moins de lassitude :) - A:=rotation(A,O,Angle); - B:=rotation(B,O,Angle); - C:=rotation(C,O,Angle); - % On d\'efinit le centre du cercle inscrit - I=CentreCercleI(A,B,C); - % on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - % pour marquer les angles - path cc; - cc=fullcircle scaled 1u; - picture MAngle; - path cd; pair M[]; - MAngle=image(% - if Isocele:% - if Rectangle: - trace codeperp(A,B,C,5); - cd=A--(A+B+C)/3; - M1=cd intersectionpoint (cc shifted A); - trace 9/10[A,M1]--11/10[A,M1]; - cd:=C--(A+B+C)/3; - M1:=cd intersectionpoint (cc shifted C); - trace 9/10[C,M1]--11/10[C,M1]; - else: - cd=B--(A+B+C)/3; - M1=cd intersectionpoint (cc shifted B); - trace 9/10[B,M1]--11/10[B,M1]; - cd:=C--(A+B+C)/3; - M1:=cd intersectionpoint (cc shifted C); - trace 9/10[C,M1]--11/10[C,M1]; - fi; - fi; - if Rectangle: - trace codeperp(A,B,C,5); - else: - draw (cc shifted B); - fi; - draw (cc shifted A); - draw (cc shifted C); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - % on labelise - label(btex #1 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #3 etex,1.2[O,C]); - % Codage - if Isocele: - marque_s:=marque_s/2; - if Rectangle: - draw Codelongueur(A,B,B,C,2); - else: - draw Codelongueur(A,B,A,C,2); - fi; - marque_s:=marque_s*2; - fi; - % Affichage des angles: - if Isocele: - if Rectangle: - label(btex ? etex,A+0.95u*unitvector(I-A)); - else: - if #4>#5:%Cas où b est vide donc on affiche la mesure commune - label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A)); - label(btex ? etex,B+0.95u*unitvector(I-B)); - else: - label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B)); - label(btex ? etex,A+0.95u*unitvector(I-A)); - fi; - fi; - else: - if Rectangle: - if #4>#5: - label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C)); - else: - label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); - fi; - else: - label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B)); - label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); - fi; - label(btex ? etex,A+0.95u*unitvector(I-A)); - fi; - \end{mplibcode} - %\mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesSommeAngle]{Echelle};boolean Rectangle,Isocele; - Rectangle=\useKV[ClesSommeAngle]{Rectangle};Isocele=\useKV[ClesSommeAngle]{Isocele};Angle:=\useKV[ClesSommeAngle]{Angle};}] - pair A,B,C,O,I;% - A=u*(1,1); - B-A=u*(4,0); - if Rectangle: - C=3/5[B,rotation(A,B,-90)]; - else: - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - fi; - O=CentreCercleC(A,B,C); - % On tourne pour \'eventuellement moins de lassitude :) - A:=rotation(A,O,Angle); - B:=rotation(B,O,Angle); - C:=rotation(C,O,Angle); - % On d\'efinit le centre du cercle inscrit - I=CentreCercleI(A,B,C); - % on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - % pour marquer les angles - path cc; - cc=fullcircle scaled 1u; - picture MAngle; - path cd; pair M[]; - MAngle=image(% - if Isocele:% - if Rectangle: - trace codeperp(A,B,C,5); - cd=A--(A+B+C)/3; - M1=cd intersectionpoint (cc shifted A); - trace 9/10[A,M1]--11/10[A,M1]; - cd:=C--(A+B+C)/3; - M1:=cd intersectionpoint (cc shifted C); - trace 9/10[C,M1]--11/10[C,M1]; - else: - cd=B--(A+B+C)/3; - M1=cd intersectionpoint (cc shifted B); - trace 9/10[B,M1]--11/10[B,M1]; - cd:=C--(A+B+C)/3; - M1:=cd intersectionpoint (cc shifted C); - trace 9/10[C,M1]--11/10[C,M1]; - fi; - fi; - if Rectangle: - trace codeperp(A,B,C,5); - else: - draw (cc shifted B); - fi; - draw (cc shifted A); - draw (cc shifted C); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - % on labelise - label(btex #1 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #3 etex,1.2[O,C]); - % Codage - if Isocele: - marque_s:=marque_s/2; - if Rectangle: - draw Codelongueur(A,B,B,C,2); - else: - draw Codelongueur(A,B,A,C,2); - fi; - marque_s:=marque_s*2; - fi; - % Affichage des angles: - if Isocele: - if Rectangle: - label(btex ? etex,A+0.95u*unitvector(I-A)); - else: - if #4>#5:%Cas où b est vide donc on affiche la mesure commune - label(btex $\ang{#4}$ etex,A+0.95u*unitvector(I-A)); - label(btex ? etex,B+0.95u*unitvector(I-B)); - else: - label(btex $\ang{#5}$ etex,B+0.95u*unitvector(I-B)); - label(btex ? etex,A+0.95u*unitvector(I-A)); - fi; - fi; - else: - if Rectangle: - if #4>#5: - label(btex $\ang{#4}$ etex,C+0.95u*unitvector(I-C)); - else: - label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); - fi; - else: - label(btex $\ang{#4}$ etex,B+0.95u*unitvector(I-B)); - label(btex $\ang{#5}$ etex,C+0.95u*unitvector(I-C)); - fi; - label(btex ? etex,A+0.95u*unitvector(I-A)); - fi; - \end{mpost} - \fi -} - -\xdef\RedactionSomme{} - -\newcommand\RedactionSom[4][]{% - % #1 : nom du triangle pA pB pC - % #2 : mesure de l'angle pApBpC - % #3 : mesure de l'angle pBpCpA - \useKVdefault[ClesSommeAngle]% - \setKV[ClesSommeAngle]{#1}% - % On r\'ecup\`ere les noms des sommets. - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - \xdef\NomTriangle{\NomA\NomB\NomC}% - \xdef\NomSommetB{\NomB}% - \xdef\NomSommetA{\NomA}% - \xdef\NomSommetC{\NomC}% - % On r\'edige - \ifboolKV[ClesSommeAngle]{Perso}{\RedactionSomme}{Dans le triangle $\NomA\NomB\NomC$, \ifboolKV[ClesSommeAngle]{Rectangle}{ rectangle \ifboolKV[ClesSommeAngle]{Isocele}{isocèle }{}en $\NomB$, }{\ifboolKV[ClesSommeAngle]{Isocele}{ isoc\`ele en $\NomA$, }}% - on a :}% - \ifboolKV[ClesSommeAngle]{Rectangle}{% - \ifboolKV[ClesSommeAngle]{Isocele}{% - \ifx\bla#3\bla% - \begin{align*} - 2\times\widehat{\NomB\NomA\NomC}&=\ang{90}\\% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\frac{\ang{90}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{45}}% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{45}}{}% - \end{align*} - \fi - }{% - \ifx\bla#3\bla% - \begin{align*} - \widehat{\NomB\NomA\NomC}+\widehat{\NomB\NomC\NomA}&=\ang{90}\\% - \widehat{\NomB\NomA\NomC}+\ang{#4}&=\ang{90}\\% - \xdef\totalangle{\fpeval{90-#4}}\ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{90}-\ang{#4}\\}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomB\NomA\NomC}&=\ang{\totalangle}}{}% - \end{align*} - \fi - }% - }{% - \ifboolKV[ClesSommeAngle]{Isocele}{% - \ifx\bla#4\bla% - \begin{align*}% - \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - 2\times\ang{#3}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - \xdef\sommeangle{\fpeval{2*#3}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}% - \end{align*}% - \xdef\ResultatAngle{\totalangle}% - \else% - \begin{align*}% - \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - 2\times\widehat{\NomA\NomB\NomC}+\ang{#4}&=\ang{180}\\% - \xdef\totalangle{\fpeval{180-#4}}% - \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{180}-\ang{#4}\\}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}% - \ifboolKV[ClesSommeAngle]{Detail}{2\times\widehat{\NomA\NomB\NomC}&=\ang{\totalangle}\\}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\frac{\ang{\totalangle}}{2}\\}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}}%\\ - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomA\NomB\NomC}&=\ang{\fpeval{0.5*(180-#4)}}\\}{}% - \end{align*}% - \xdef\ResultatAngle{\fpeval{0.5*(180-#4)}}% - \fi% - }{% - \begin{align*}% - \widehat{\NomA\NomB\NomC}+\widehat{\NomB\NomC\NomA}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - \ang{#3}+\ang{#4}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - \xdef\sommeangle{\fpeval{#3+#4}}\xdef\totalangle{\fpeval{180-\sommeangle}}\ang{\sommeangle}+\widehat{\NomC\NomA\NomB}&=\ang{180}\\% - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{180}-\ang{\sommeangle}\\}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}%\\ - \ifboolKV[ClesSommeAngle]{Detail}{\widehat{\NomC\NomA\NomB}&=\ang{\totalangle}}{}% - \end{align*}% - \xdef\ResultatAngle{\totalangle}% - }% - }% -}% - -\newcommand\SommeAngles[4][]{% Macro calculant la mesure de l'angle pCpApB - % #1 : nom du triangle pA pB pC - % #2 : mesure de l'angle pApBpC - % #3 : mesure de l'angle pBpCpA - \useKVdefault[ClesSommeAngle]%obligatoire car la macro n'est pas dans un groupe. - \setKV[ClesSommeAngle]{#1}%lit les arguments optionnels - % On r\'ecup\`ere les noms des sommets. - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - % Figure ou pas ? - \ifboolKV[ClesSommeAngle]{FigureSeule}{% - \ifx\bla#3\bla% - \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}% - \else% - \ifx\bla#4\bla% - \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}% - \else% - \MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}% - \fi% - \fi% - }{% - \ifboolKV[ClesSommeAngle]{Figure}{% - \begin{multicols}{2}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \ifx\bla#3\bla% - \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#4}{0}\]% - \else% - \ifx\bla#4\bla% - \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{0}{#3}\]% - \else% - \[\MPFigureSommeAngle{\NomA}{\NomB}{\NomC}{#3}{#4}\]% - \fi% - \fi% - \par\columnbreak\par% - \RedactionSom[#1]{#2}{#3}{#4}% - \end{multicols}% - }{% on r\'edige - \RedactionSom[#1]{#2}{#3}{#4}% - }% - }% -}% - -%%% -% Le th\'eor\`eme de Pythagore -%%% -\setKVdefault[ClesPythagore]{Exact=false,AvantRacine=false,Racine=false,Entier=false,Egalite=false,Precision=2,Soustraction=false,Figure=false,FigureSeule=false,Angle=0,Echelle=1cm,Reciproque=false,ReciColonnes=false,Faible=false,Unite=cm,EnchaineA=false,EnchaineB=false,EnchaineC=false,ValeurA=0,ValeurB=0,ValeurC=0,Perso=false,AllPerso=false,SansMots=false} - -% On d\'efinit les figures \`a utiliser -\def\MPFigurePytha#1#2#3#4#5#6{% - % #1 Premier sommet - % #2 Sommet de l'angle droit - % #3 troisi\`eme sommet - % #4 1ere longueur - % #5 2eme longueur - % #6 angle de rotation de la figure - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesPythagore]{Echelle}; - pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit - O=u*(2.5,2.5); - path cc; - cc=(fullcircle scaled 4u) shifted O; - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.9*length cc) of cc; - B=A rotatedabout(O,-120); - C=2[A,O]; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % On d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - draw D--E--F; - numeric decalage; - decalage=3mm; - if (#4<#5) or (#4=#5) : - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi - else: - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) - rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; - label(btex #3 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #1 etex,1.2[O,C]); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}] - pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit - O=u*(2.5,2.5); - path cc; - cc=(fullcircle scaled 4u) shifted O; - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.9*length cc) of cc; - B=A rotatedabout(O,-120); - C=2[A,O]; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % On d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - draw D--E--F; - decalage=3mm; - if (#4<#5) or (#4=#5) : - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#4} etex,1/2[C,B]-decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi - else: - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) - rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; - label(btex #3 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #1 etex,1.2[O,C]); - \end{mpost} - \fi -} - -\def\MPFigureReciPytha#1#2#3#4#5#6#7{% - % #1 Premier sommet - % #2 Sommet de l'angle droit - % #3 troisi\`eme sommet - % #4 1ere longueur - % #5 2eme longueur - % #6 3eme longueur - % #7 angle de rotation de la figure - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesPythagore]{Echelle}; - pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit - O=u*(2.5,2.5); - path cc; - cc=(fullcircle scaled 4u) shifted O; - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.8*length cc) of cc; - B=A rotatedabout(O,-100); - C=2[A,O]; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#7); - B:=B rotatedabout(O,#7); - C:=C rotatedabout(O,#7); - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - decalage=3mm; - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); - label(btex \num{#5} etex,1/2[C,B]-decalage*(unitvector(C-B))); - label(btex \num{#6} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - label(btex \num{#6} etex,1/2[C,B]-decalage*(unitvector(A-B))); - fi; - label(btex #1 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #3 etex,1.2[O,C]); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesPythagore]{Echelle};}] - pair A,B,C,O,D,E,F;%B est le sommet de l'angle droit - O=u*(2.5,2.5); - path cc; - cc=(fullcircle scaled 4u) shifted O; - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.8*length cc) of cc; - B=A rotatedabout(O,-100); - C=2[A,O]; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#7); - B:=B rotatedabout(O,#7); - C:=C rotatedabout(O,#7); - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - decalage=3mm; - if ypart(B)>ypart(O) : - label(LATEX("\num{"&decimal(#4)&"}") rotated angle(C-A),1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); - label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(C-B)),1/2[C,B]-decalage*(unitvector(C-B))); - label(LATEX("\num{"&decimal(#6)&"}") rotated(angle(B-A)),1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(LATEX("\num{"&decimal(#4)&"}") rotated angle(A-C),1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); - label(LATEX("\num{"&decimal(#5)&"}") rotated(angle(A-B)),1/2[A,B]-decalage*(unitvector(C-B))); - label(LATEX("\num{"&decimal(#6)&"}") rotated angle(C-B),1/2[C,B]-decalage*(unitvector(A-B))); - fi; - label(btex #1 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #3 etex,1.2[O,C]); - \end{mpost} - \fi -} - -\def\MPFigurePythaSansMots#1#2#3#4#5#6{% - % #1 Premier sommet - % #2 Sommet de l'angle droit - % #3 troisi\`eme sommet - % #4 1ere longueur - % #5 2eme longueur - % #6 angle de rotation de la figure - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesPythagore]{Echelle}; - pair A,B,C,O,D,E,F,L[],M[],N[];%B est le sommet de l'angle droit - O=u*(2.5,2.5); - path cc; - cc=(fullcircle scaled 4u) shifted O; - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.9*length cc) of cc; - B=A rotatedabout(O,-120); - C=2[A,O]; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % On d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - trace polygone(A,B,C); - draw D--E--F; - L1=rotation(B,A,90); - L2-L1=B-A; - trace chemin(A,L1,L2,B); - M1=rotation(C,B,90); - M2-M1=C-B; - trace chemin(B,M1,M2,C); - N1=rotation(A,C,90); - N2-N1=A-C; - trace chemin(C,N1,N2,A); - numeric decalage; - decalage=3mm; - if (#4<#5) or (#4=#5) : - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,B]+decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]+decalage*(unitvector(C-B))); - label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(B,M2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}+\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4+#5*#5}}$\\\end{tabular}"),iso(C,N2)); - else: - label(btex \num{#4} etex,1/2[C,B]+decalage*(unitvector(A-B))); - label(btex \num{#5} etex,1/2[A,B]+decalage*(unitvector(C-B))); - label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(B,M2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}+\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4+#5*#5}}$\\\end{tabular}"),iso(C,N2)); - drawarrow 2/10[iso(A,L2),iso(C,N2)]--8/10[iso(A,L2),iso(C,N2)]; - drawarrow 2/10[iso(B,M2),iso(C,N2)]--8/10[iso(B,M2),iso(C,N2)]; - fi - else: - if ypart(B)>ypart(O) : - label(btex \num{#4} etex,1/2[C,A]-decalage*(unitvector(C-A) rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(C,N2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}-\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4-#5*#5}}$\\\end{tabular}"),iso(B,M2)); - drawarrow 2/10[iso(A,L2),iso(B,M2)]--8/10[iso(A,L2),iso(B,M2)]; - drawarrow 2/10[iso(C,N2),iso(B,M2)]--8/10[iso(C,N2),iso(B,M2)]; - else: - label(btex \num{#4} etex,1/2[A,C]+decalage*(unitvector(A-C) rotated 90)); - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - label(TEX("\begin{tabular}{c}Aire\\$\num{#5}\times\num{#5}$\\$\num{\fpeval{#5*#5}}$\\\end{tabular}"),iso(A,L2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{#4}\times\num{#4}$\\$\num{\fpeval{#4*#4}}$\\\end{tabular}"),iso(C,N2)); - label(TEX("\begin{tabular}{c}Aire\\$\num{\fpeval{#4*#4}}-\num{\fpeval{#5*#5}}$\\$\num{\fpeval{#4*#4-#5*#5}}$\\\end{tabular}"),iso(B,M2)); - drawarrow 2/10[iso(A,L2),iso(B,M2)]--8/10[iso(A,L2),iso(B,M2)]; - drawarrow 2/10[iso(C,N2),iso(B,M2)]--8/10[iso(C,N2),iso(B,M2)]; - fi; - fi; - label(btex #3 etex,1.2[O,A]); - label(btex #2 etex,1.2[O,B]); - label(btex #1 etex,1.2[O,C]); - \end{mplibcode} - \fi -} - -\newcommand\RedactionPythagore{}% -\newcommand\RedactionReciPythagore{}% -\newcommand\RedactionCalculsPythagore{}% -\newcommand\RedactionCalculsReciPythagore{}% -\newcommand\RedactionConclusionReciPythagore{}% - -% \newcommand\Pythagore[5][]{% -\NewDocumentCommand\Pythagore{o m m m m}{% - % #1 Param\`etres sous forme de cl\'es - % #2 Nom "complet" du triangle : ABC par exemple - % #3 Premi\`ere longueur - % #4 Deuxi\`eme longueur - % #5 Troisi\`eme longueur (\'eventuellement vide) - \useKVdefault[ClesPythagore]%obligatoire car la macro n'est pas dans un groupe. - \setKV[ClesPythagore]{#1}%On lit les arguments optionnels - \DeclareSIUnit{\PfCPythaUnit}{\useKV[ClesPythagore]{Unite}}% - \ifboolKV[ClesPythagore]{Reciproque}{% - % On retient les noms des sommets - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - \xdef\NomTriangle{\NomA\NomB\NomC}% - % on stocke les valeurs donn\'ees - \opcopy{#3}{A1}% - \opcopy{#4}{A2}% - \opcopy{#5}{A3}% - \xdef\GrandCote{#3}% - \xdef\PetitCote{#4}% - \xdef\MoyenCote{#5}% - % On trace une figure ou pas ? - \ifboolKV[ClesPythagore]{FigureSeule}{% - \MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}% - }{% - \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation - \begin{multicols}{2} - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigureReciPytha{\NomA}{\NomB}{\NomC}{#3}{#4}{#5}{\useKV[ClesPythagore]{Angle}}\]% - \par\columnbreak\par% - \ifboolKV[ClesPythagore]{AllPerso}{% - \RedactionReciPythagore% - \RedactionCalculsReciPythagore% - \RedactionConclusionReciPythagore% - }{% - % on r\'edige - \ifboolKV[ClesPythagore]{Perso}{% - \RedactionReciPythagore% - }{% - Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.% - } - \ifboolKV[ClesPythagore]{ReciColonnes}{% - \[ - \begin{array}{cccc|cccc} - &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\ - &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\ - &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\ - &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\ - \end{array} - \] - }{% - \[\left. - \begin{array}{l} - \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\ - \\ - \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\ - \end{array} - \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi - \] - } - \ifboolKV[ClesPythagore]{Egalite}{% - \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi% - \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi% - }{% - \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle - en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi% - \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le - triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi% - } - } - \end{multicols} - }{% - \ifboolKV[ClesPythagore]{AllPerso}{% - \RedactionReciPythagore% - \RedactionCalculsReciPythagore% - \RedactionConclusionReciPythagore% - }{% - \ifboolKV[ClesPythagore]{Perso}{\RedactionReciPythagore}{% - Dans le triangle $#2$, $[\NomA\NomC]$ est le plus grand c\^ot\'e.% - } - \ifboolKV[ClesPythagore]{ReciColonnes}{% - \[ - \begin{array}{cccc|cccc} - &&\NomA\NomC^2&&&\NomA\NomB^2&+&\NomB\NomC^2\\ - &&\opexport{A1}{\Aun}\num{\Aun}^2&&&\opexport{A2}{\Adeux}\num{\Adeux}^2&+&\opexport{A3}{\Atrois}\num{\Atrois}^2\\ - &&\opmul*{A1}{A1}{a1}&&&\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}&+&\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}\\ - &&\opexport{a1}{\Aun}\num{\Aun}&&&\multicolumn{3}{c}{\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}}\\ - \end{array} - \] - }{% - \[\left. - \begin{array}{l} - \NomA\NomC^2=\opexport{A1}{\Aun}\num{\Aun}^2=\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}\\ - \\ - \NomA\NomB^2+\NomB\NomC^2=\opexport{A2}{\Adeux}\num{\Adeux}^2+\opexport{A3}{\Atrois}\num{\Atrois}^2=\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}+\opmul*{A3}{A3}{a3}\opexport{a3}{\Atrois}\num{\Atrois}=\opadd*{a2}{a3}{a4}\opexport{a4}{\Aquatre}\num{\Aquatre}\\ - \end{array} - \right\}\opcmp{a1}{a4}\ifopeq\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2\fi\opcmp{a1}{a4}\ifopneq\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2\fi - \] - }% - \ifboolKV[ClesPythagore]{Egalite}{% - \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee. Donc le triangle $#2$ est rectangle en $\NomB$.\fi% - \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors l'\'egalit\'e de Pythagore n'est pas v\'erifi\'ee. Donc le triangle $#2$ n'est pas rectangle.\fi% - }{% - \opcmp{a1}{a4}\ifopeq Comme $\NomA\NomC^2=\NomA\NomB^2+\NomB\NomC^2$, alors le triangle $#2$ est rectangle - en $\NomB$ d'apr\`es la r\'eciproque du th\'eor\`eme de Pythagore.\fi% - \opcmp{a1}{a4}\ifopneq Comme $\NomA\NomC^2\not=\NomA\NomB^2+\NomB\NomC^2$, alors le - triangle $#2$ n'est pas rectangle\ifboolKV[ClesPythagore]{Faible}{.}{ d'apr\`es la contrapos\'ee du th\'eor\`eme de Pythagore.}\fi% - }% - }% - }% - }% - }{% - % [xlop] param\`etres de calcul - \opcopy{#3}{A1}% - \opcopy{#4}{A2}% - \opcopy{\useKV[ClesPythagore]{Precision}}{pres}% - \xintifboolexpr{#3<#4 || #3==#4}{ - \xdef\PetitCote{#3}% - \xdef\MoyenCote{#4}% - \xdef\GrandCote{}% - }{% - \xdef\GrandCote{#3}% - \xdef\MoyenCote{#4}% - \xdef\PetitCote{}% Pour la personnalisation - } - % On retient les noms des sommets - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - \xdef\NomTriangle{\NomA\NomB\NomC}% - \xdef\NomAngleDroit{\NomB}% - \xdef\NomSommetA{\NomA}% - \xdef\NomSommetC{\NomC}% - % On trace une figure ou pas ? - \ifboolKV[ClesPythagore]{FigureSeule}{% - \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% - }{% - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% - }% - \MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}} - }{% - \ifboolKV[ClesPythagore]{Figure}{%Utilisation obligatoire de l'option --shell-escape de la compilation - \begin{multicols}{2}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigurePytha{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}\] - \par\columnbreak\par% - % On d\'emarre la r\'esolution - \ifboolKV[ClesPythagore]{AllPerso}{% - \RedactionPythagore% - \RedactionCalculsPythagore% - }{% - \ifboolKV[ClesPythagore]{Perso}{% - \RedactionCalculsPythagore% - }{% - \ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :% - }% - } - \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% - \begin{align*} - \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ - \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ - \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ - \ifboolKV[ClesPythagore]{AvantRacine}{}{% - \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} - \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ - }% - \end{align*} - }{%\else% - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% - \begin{align*} - \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ - \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ - \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ - \ifboolKV[ClesPythagore]{AvantRacine}{}{% - \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} - \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ - }% - \end{align*} - }%\fi% - } - \end{multicols} - }{% - % On d\'emarre la r\'esolution - \ifboolKV[ClesPythagore]{SansMots}{% - \MPFigurePythaSansMots{\NomA}{\NomB}{\NomC}{#3}{#4}{\useKV[ClesPythagore]{Angle}}% - }{% - \ifboolKV[ClesPythagore]{AllPerso}{% - \RedactionPythagore% - \RedactionCalculsPythagore% - }{% - \ifboolKV[ClesPythagore]{Perso}{\RedactionPythagore}{\ifboolKV[ClesPythagore]{Egalite}{Comme le triangle $#2$ est rectangle en $\NomB$, alors l'\'egalit\'e de Pythagore est v\'erifi\'ee :}{Dans le triangle $#2$ rectangle en $\NomB$, le th\'eor\`eme de Pythagore permet d'\'ecrire :% - }}% - \xintifboolexpr{#3<#4 || #3==#4}{%\ifnum#3<#4% - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2+#4^2),\useKV[ClesPythagore]{Precision})}}% - \begin{align*} - \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ - \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opcopy{\useKV[ClesPythagore]{ValeurA}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ - \NomA\NomC^2&=\ifboolKV[ClesPythagore]{EnchaineA}{\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomC^2&=\opadd*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ - \ifboolKV[ClesPythagore]{AvantRacine}{}{% - \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomC&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} - \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomC&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomC&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ - } - \end{align*} - }{%\else - \xdef\ResultatPytha{\fpeval{round(sqrt(#3^2-#4^2),\useKV[ClesPythagore]{Precision})}}% - \ifboolKV[ClesPythagore]{Soustraction}{% - \begin{align*} - \NomA\NomB^2&=\NomA\NomC^2-\NomB\NomC^2\\ - \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}-\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ - \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ - \ifboolKV[ClesPythagore]{AvantRacine}{}{% - \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}} - \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ - } - \end{align*} - }{% - \begin{align*} - \NomA\NomC^2&=\NomA\NomB^2+\NomB\NomC^2\\ - \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opexport{A1}{\Aun}\num{\Aun}^2}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opcopy{\useKV[ClesPythagore]{ValeurB}}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}{\opexport{A2}{\Adeux}\num{\Adeux}^2}\\ - \ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}&=\NomA\NomB^2+\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomB^2&=\ifboolKV[ClesPythagore]{EnchaineC}{\opcopy{\useKV[ClesPythagore]{ValeurC}}{a1}\opexport{a1}{\Aun}\num{\Aun}}{\opmul*{A1}{A1}{a1}\opexport{a1}{\Aun}\num{\Aun}}-\ifboolKV[ClesPythagore]{EnchaineB}{\opexport{a2}{\Adeux}\num{\Adeux}}{\opmul*{A2}{A2}{a2}\opexport{a2}{\Adeux}\num{\Adeux}}\\ - \NomA\NomB^2&=\opsub*{a1}{a2}{a3}\opexport{a3}{\Atrois}\num{\Atrois}%\\ - \ifboolKV[ClesPythagore]{AvantRacine}{}{% - \ifboolKV[ClesPythagore]{Entier}{}{\\\NomA\NomB&=\sqrt{\opexport{a3}{\Atrois}\num{\Atrois}}}% - \ifboolKV[ClesPythagore]{Racine}{}{\\\ifboolKV[ClesPythagore]{Exact}{\NomA\NomB&=\opsqrt[maxdivstep=3]{a3}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}{\NomA\NomB&\approx\opsqrt[maxdivstep=5]{a3}{a4}\opround{a4}{pres}{a4}\opunzero{a4}\opexport{a4}{\Aquatre}\SI{\Aquatre}{\PfCPythaUnit}}}%\\ - } - \end{align*} - }% - }%\fi% - }% - }% - }% - }% - }% -}% - -%%% -% Distributivit\'e -%%% -% https://tex.stackexchange.com/questions/168972/draw-arrows-to-show-multiplication-pattern-distributive-property/169278?noredirect=1 -\newcommand\Tikzmark[1]{% - \tikz[remember picture,baseline,inner sep=0pt]{% - \node[name=Distri-\theNbDistri,anchor=base] {${#1}$};}% - \stepcounter{NbDistri}% -}% - -\newcommand\DrawArrow{% - \begin{tikzpicture}[overlay,remember picture] - \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-2.north); - \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-0.north) to (Distri-3.north); - \draw[-stealth,out=-50,in=-140,DCFlechesb,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-2.south); - \draw[-stealth,out=-50,in=-140,DCFlechesb!50,transform canvas={yshift=-2pt}] (Distri-1.south) to (Distri-3.south); - \end{tikzpicture} -} - -\newcommand\DrawArrowSimple[1]{% - \begin{tikzpicture}[overlay,remember picture] - \draw[-stealth,out=50,in=140,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-2.north); - \draw[-stealth,out=50,in=140,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-3.north); - \end{tikzpicture} -} - -\newcommand\DrawArrowSimpleRenverse[1]{% - \begin{tikzpicture}[overlay,remember picture] - \draw[-stealth,out=140,in=50,DCFlechesh,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-0.north); - \draw[-stealth,out=140,in=50,DCFlechesh!50,transform canvas={yshift=2pt}] (Distri-#1.north) to (Distri-1.north); - \end{tikzpicture} -} - -\newcounter{NbDistri}% -\setcounter{NbDistri}{0}% - -\newcounter{NbCalculDistri}%Pour compter combien de distributivit\'e il -% y a dans un "seul calcul". -\setcounter{NbCalculDistri}{0} - -\setKVdefault[ClesDistributivite]{Cours=false,Etape=1,Lettre=x,Fleches=false,AideMul=false,Reduction=false,AideAdda=false,AideAddb=false,CouleurAide=red,CouleurReduction=black,CouleurFH=blue,CouleurFB=red,Somme=false,Difference=false,RAZ=false,Oppose=false,All=false,NomExpression=A,Fin=4,Numerique=false,Remarquable=false,Echange=0,Tuile=false,Vide=false,Reperes=false,Impression=false,Tableau=false}%,AideAdd=false:inutile ? - -\newcommand\Tuile[4]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean Vide,Reperes,Print; - Vide=\useKV[ClesDistributivite]{Vide}; - Reperes=\useKV[ClesDistributivite]{Reperes}; - Print=\useKV[ClesDistributivite]{Impression}; - pair _CoinTuilev; - _CoinTuilev=(0,0); - numeric largeur,longueur,ecart; - largeur=0.75; - longueur=sqrt(3); - ecart=0.6; - pair _CoinTuileh; - _CoinTuileh=u*(largeur+ecart,ecart); - vardef tuilev(expr LL,ll,nb,col)(text t)= - save $; picture $; - save TT; picture TT; - TT=image( - path cc; - cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)); - if Print=false: - fill cc withcolor col; - fi; - trace cc; - label(TEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll))); - ); - $=image( - for k=0 upto nb-1: - trace TT shifted(_CoinTuilev+k*u*(0,-ll)); - endfor; - _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll)); - ); - $ - enddef; - vardef tuileh(expr LL,ll,nb,col)(text t)= - save $; picture $; - picture TT; - TT=image( - path cc; - cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)); - if Print=false: - fill cc withcolor col; - fi; - trace cc; - label(TEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll))); - ); - $=image( - for k=0 upto nb-1: - trace TT shifted(_CoinTuileh+k*u*(LL,0)); - endfor; - _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0)); - ); - $ - enddef; - color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg; - ColorLetter=LightGreen; - ColorLetterPos=ColorLetter; - ColorLetterNeg=Tomato; - ColorNum=Orange; - ColorNumPos=ColorNum; - ColorNumNeg=Tomato; - ColorCarrePos:=LightBlue; - ColorCarreNeg:=Tomato; - if #1<0: - ColorLetter:=Tomato; - trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$"); - else: - ColorLetter:=LightGreen; - trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$"); - fi; - if #2<0: - ColorNum:=Tomato; - trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$"); - else: - ColorNum:=Orange; - trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$"); - fi; - if #3<0: - ColorLetter:=Tomato; - trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$"); - else: - ColorLetter:=LightGreen; - trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$"); - fi; - if #4<0: - ColorNum:=Tomato; - trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$"); - else: - ColorNum:=Orange; - trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$"); - fi; - trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2; - trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2; - drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2; - labeloffset:=labeloffset*2; - label.ulft(TEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart))); - labeloffset:=labeloffset/2; - if Vide: - if Reperes: - %%%% - %% tuile a*c - if #1*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); - trace titi withcolor 0.6white; - endfor; - endfor; - fi; - %tuile a*d - if #1*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); - trace titi withcolor 0.6white; - endfor; - endfor; - fi; - %tuile b*c - if #2*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); - trace titi withcolor 0.6white; - endfor; - endfor; - fi; - %tuile b*d - if #2*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); - trace titi withcolor 0.6white; - endfor; - endfor; - fi; - fi; - %%% - else: - %% tuile a*c - if #1*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); - if Print=false: - fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi; - fi; - trace titi; - if #1*#3>0: - label(TEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); - else: - label(TEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); - fi; - endfor; - endfor; - fi; - %tuile a*d - if #1*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); - if Print=false: - fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi; - fi; - trace titi; - if #1*#4>0: - label(TEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); - else: - label(TEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); - fi; - endfor; - endfor; - fi; - %tuile b*c - if #2*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); - if Print=false: - fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi; - fi; - trace titi; - if #2*#3>0: - label(TEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); - else: - label(TEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); - fi; - endfor; - endfor; - fi; - %tuile b*d - if #2*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); - if Print=false: - fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi; - fi; - trace titi; - if #2*#4>0: - label(TEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); - else: - label(TEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); - fi; - endfor; - endfor; - fi; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={boolean Vide,Print; Vide=\useKV[ClesDistributivite]{Vide}; Print=\useKV[ClesDistributivite]{Impression};}] - pair _CoinTuilev; - _CoinTuilev=(0,0); - numeric largeur,longueur,ecart; - largeur=0.75; - longueur=sqrt(3); - ecart=0.6; - pair _CoinTuileh; - _CoinTuileh=u*(largeur+ecart,ecart); - vardef tuilev(expr LL,ll,nb,col)(text t)= - save $; picture $; - save TT; picture TT; - TT=image( - path cc; - cc=polygone((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll)); - if Print=false: - fill cc withcolor col; - fi; - trace cc; - label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,-ll),u*(0,-ll))); - ); - $=image( - for k=0 upto nb-1: - trace TT shifted(_CoinTuilev+k*u*(0,-ll)); - endfor; - _CoinTuilev:=_CoinTuilev shifted(nb*u*(0,-ll)); - ); - $ - enddef; - vardef tuileh(expr LL,ll,nb,col)(text t)= - save $; picture $; - picture TT; - TT=image( - path cc; - cc=polygone((0,0),u*(LL,0),u*(LL,ll),u*(0,ll)); - if Print=false: - fill cc withcolor col; - fi; - trace cc; - label(LATEX(t),iso((0,0),u*(LL,0),u*(LL,ll),u*(0,ll))); - ); - $=image( - for k=0 upto nb-1: - trace TT shifted(_CoinTuileh+k*u*(LL,0)); - endfor; - _CoinTuileh:=_CoinTuileh shifted(nb*u*(LL,0)); - ); - $ - enddef; - color ColorLetter,ColorLetterPos,ColorLetterNeg,ColorNum,ColorNumPos,ColorNumNeg,ColorCarrePos,ColorCarreNeg; - ColorLetter=LightGreen; - ColorLetterPos=ColorLetter; - ColorLetterNeg=Tomato; - ColorNum=Orange; - ColorNumPos=ColorNum; - ColorNumNeg=Tomato; - ColorCarrePos:=LightBlue; - ColorCarreNeg:=Tomato; - if #1<0: - ColorLetter:=Tomato; - trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$-x$"); - else: - ColorLetter:=LightGreen; - trace tuilev(largeur,longueur,abs(#1),ColorLetter)("$x$"); - fi; - if #2<0: - ColorNum:=Tomato; - trace tuilev(largeur,largeur,abs(#2),ColorNum)("$-1$"); - else: - ColorNum:=Orange; - trace tuilev(largeur,largeur,abs(#2),ColorNum)("$1$"); - fi; - if #3<0: - ColorLetter:=Tomato; - trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$-x$"); - else: - ColorLetter:=LightGreen; - trace tuileh(longueur,largeur,abs(#3),ColorLetter)("$x$"); - fi; - if #4<0: - ColorNum:=Tomato; - trace tuileh(largeur,largeur,abs(#4),ColorNum)("$-1$"); - else: - ColorNum:=Orange; - trace tuileh(largeur,largeur,abs(#4),ColorNum)("$1$"); - fi; - trace u*(largeur+ecart/2,largeur+ecart)--((largeur+ecart/2)*u,ypart(_CoinTuilev)) withpen pencircle scaled2; - trace u*(0,ecart/2)--(xpart(_CoinTuileh),u*(ecart/2)) withpen pencircle scaled2; - drawarrow u*(largeur/2,ecart/2){dir90}..{dir0}u*(largeur+ecart/2,largeur/2+ecart) withpen pencircle scaled2; - labeloffset:=labeloffset*2; - label.ulft(LATEX("$\times$"),iso(u*(largeur/2,ecart/2),u*(largeur+ecart/2,largeur/2+ecart))); - labeloffset:=labeloffset/2; - if Vide=false: - %% tuile a*c - if #1*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur))); - if Print=false: - fill titi withcolor if #1*#3>0:ColorCarrePos else: ColorCarreNeg fi; - fi; - trace titi; - if #1*#3>0: - label(LATEX("$x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); - else: - label(LATEX("$-x^2$"),iso((0,0),u*(longueur,0),u*(longueur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart,0)+(u*(k*longueur,-l*longueur)))); - fi; - endfor; - endfor; - fi; - %tuile a*d - if #1*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#1)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur))); - if Print=false: - fill titi withcolor if #1*#4>0:ColorLetterPos else: ColorLetterNeg fi; - fi; - trace titi; - if #1*#4>0: - label(LATEX("$x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); - else: - label(LATEX("$-x$"),iso((0,0),u*(largeur,0),u*(largeur,-longueur),u*(0,-longueur)) shifted (u*(largeur+ecart+abs(#3)*longueur,0)+(u*(k*largeur,-l*longueur)))); - fi; - endfor; - endfor; - fi; - %tuile b*c - if #2*#3<>0: - for k=0 upto (abs(#3)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur))); - if Print=false: - fill titi withcolor if #2*#3>0:ColorLetterPos else: ColorLetterNeg fi; - fi; - trace titi; - if #2*#3>0: - label(LATEX("$x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); - else: - label(LATEX("$-x$"),iso((0,0),u*(longueur,0),u*(longueur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart,-abs(#1)*longueur)+(u*(k*longueur,-l*largeur)))); - fi; - endfor; - endfor; - fi; - %tuile b*d - if #2*#4<>0: - for k=0 upto (abs(#4)-1): - for l=0 upto (abs(#2)-1): - path titi; - titi=polygone((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur))); - if Print=false: - fill titi withcolor if #2*#4>0:ColorNumPos else: ColorNumNeg fi; - fi; - trace titi; - if #2*#4>0: - label(LATEX("$1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); - else: - label(LATEX("$-1$"),iso((0,0),u*(largeur,0),u*(largeur,-largeur),u*(0,-largeur)) shifted (u*(largeur+ecart+abs(#3)*longueur,-abs(#1)*longueur)+(u*(k*largeur,-l*largeur)))); - fi; - endfor; - endfor; - fi; - fi; - \end{mpost} - \fi -} - -\newcommand\Affichage[4][]{% - \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels - \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}% - \ensuremath{% - % partie du x^2 - \xintifboolexpr{#2==0}{}{\xintifboolexpr{#2==1}{}{\xintifboolexpr{#2==-1}{-}{\num{#2}}}\LETTRE^2}% - % partie du x - \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{% - \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}}% - }\LETTRE}% - % partie du nombre - \xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{}{+}}{+}\num{#4}}{% - \xintifboolexpr{#2==0}{\xintifboolexpr{#3==0}{\num{#4}}{-\num{\fpeval{abs(#4)}}}}{-\num{\fpeval{abs(#4)}}}}}% - % - }% -}% - -\xdef\SommeA{0}% -\xdef\SommeB{0}% -\xdef\SommeC{0}% - -\newcommand\Distri[5][]{% - \useKVdefault[ClesDistributivite]%obligatoire car la macro n'est pas dans un groupe. - \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels - \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}% - \setcounter{NbCalculDistri}{0}% - }{}% - \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}% - \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}% - \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}% - \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}% - \ifboolKV[ClesDistributivite]{Cours}{% - \ensuremath{% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{}{(}}\xintifboolexpr{#2==0}{\Tikzmark{}}{\Tikzmark{a}} - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#3==0}{\Tikzmark{}}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{b}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% - % - \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double - \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk - % - \xintifboolexpr{\Multi==0}{\times% - \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% - \Tikzmark{c}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{d}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{\Multi==0}{% - \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% - % - = - % - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}% - } - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(-}{}a\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(-}{}c\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(-}{}b\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(-}{}d\xintifboolexpr{#5<0}{)}{}% - }% - % Fleches - \ifboolKV[ClesDistributivite]{Fleches}{% - \xdef\Multi{\fpeval{#2*#3*#4*#5}}% - \xintifboolexpr{\Multi==0}{% - \xdef\Multij{\fpeval{#2*#3}}%\relax - \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1} - }{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% - }{% - \DrawArrow% - }% - }{}\setcounter{NbDistri}{0}% - }% - }{% - \ifboolKV[ClesDistributivite]{Tuile}{% - \Tuile{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesDistributivite]{Tableau}{% - \DistriTableau[#1]{#2}{#3}{#4}{#5}% - }{% - \ensuremath{% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}>0}{% - \DistriEchange[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesDistributivite]{Remarquable}{% - \ifboolKV[ClesDistributivite]{Numerique}{% - \ifx\bla#4\bla% - \xintifboolexpr{#3>0}{% - \num{\fpeval{#2+#3}}^2=(\num{#2}+\num{#3})^2=\num{#2}^2+2\times\num{#2}\times\num{#3}+\num{#3}^2=\num{\fpeval{#2*#2}}+\num{\fpeval{2*#2*#3}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)**2}} - }{% - \num{\fpeval{#2+#3}}^2=(\num{#2}\num{#3})^2=\num{#2}^2-2\times\num{#2}\times\num{\fpeval{-#3}}+\num{\fpeval{-#3}}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{2*#2*abs(#3)}}+\num{\fpeval{#3*#3}}=\num{\fpeval{(#2-abs(#3))**2}} - } - \else - \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}=(\num{#2}+\num{#3})\times(\num{#4}\num{#5})=\num{#2}^2-\num{#3}^2=\num{\fpeval{#2*#2}}-\num{\fpeval{#3*#3}}=\num{\fpeval{(#2+#3)*(#2-#3)}} - \fi% - }{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% - \ifx\bla#4\bla(\Affichage{0}{#2}{#3})^2\else(\Affichage{0}{#2}{#3})(\Affichage{0}{#4}{#5})\fi% - }{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\ifx\bla#4\bla\xintifboolexpr{#3>0}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2+2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{#3}+\num{#3}^2}{\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-2\times\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesDistributivite]{Lettre}\times\num{\fpeval{0-#3}}+\num{\fpeval{0-#3}}^2}\else\xintifboolexpr{#2==1}{}{(\num{#2}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#2==1}{}{)}^2-\num{#3}^2\fi}{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - \stepcounter{NbCalculDistri}% - \ifx\bla#4\bla% - \xdef\Multi{\fpeval{#2*#2}}% - \xdef\Multij{\fpeval{#2*#3}}% - \xdef\Multik{\fpeval{#3*#2}}% - \xdef\Multil{\fpeval{#3*#3}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#3+#3*#2}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \Affichage{\Multi}{\Multim}{\Multil}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#2}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#3*#3}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#2}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#3*#3}}}{}% - \else% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \Affichage{\Multi}{\Multim}{\Multil}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% - \fi% - }{}% - % fin Remarquable - }% - }{% - \ifboolKV[ClesDistributivite]{Numerique}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==0}{% - \num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}\multido{\i=2+1}{4}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}% - }{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==-1}{% - \Distri[Numerique,Etape=3]{#2}{#3}{#4}{#5}\multido{\i=2+-1}{2}{=\Distri[Numerique,Etape=\i]{#2}{#3}{#4}{#5}}=\num{\fpeval{(#2+#3)*(#4+#5)}}% - }{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\num{\fpeval{#2+#3}}\times\num{\fpeval{#4+#5}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{\num{\fpeval{#2+#3}}\times(\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#5)}})}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{\num{#3}\times\num{#4}\xintifboolexpr{#5>0}{+}{-}\num{#3}\times\num{\fpeval{abs(#5)}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{\num{\fpeval{#3*#4}}\xintifboolexpr{#5>0}{+}{-}\num{\fpeval{abs(#3*#5)}}}{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==5}{\num{\fpeval{#3*#4+#3*#5}}}{}% - }% - }% - }{% - \ifboolKV[ClesDistributivite]{All}{% - \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% - \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% - \xdef\NomVariable{\useKV[ClesDistributivite]{Lettre}}% - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do - {\NomLettre&=\Distri[Etape=##1,Lettre=\NomVariable]{#2}{#3}{#4}{#5}\\}% - \NomLettre&=\Distri[Etape=\NomFin,Lettre=\NomVariable]{#2}{#3}{#4}{#5}% - }{% - % Etape 1 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{}{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{#2==0}{}{\xintifboolexpr{#3==0}{}{)}}% - % - \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double - \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk - % - \xintifboolexpr{\Multi==0}{\times% - \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% - \Tikzmark{\Affichage[#1]{0}{#4}{0}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{\Multi==0}{% - \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% - \ifboolKV[ClesDistributivite]{Fleches}{% - \xdef\Multi{\fpeval{#2*#3*#4*#5}}% - \xintifboolexpr{\Multi==0}{% - \xdef\Multij{\fpeval{#2*#3}}%\relax - \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}}% - }{% - \DrawArrow% - }% - }{}\setcounter{NbDistri}{0}% - }{} - % Etape 2 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - } - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - }{}% - % Etape 3 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \stepcounter{NbCalculDistri}% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% - \ifboolKV[ClesDistributivite]{Reduction}{\mathunderline{DCReduction}{% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{{}+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% - }% - }{% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\Affichage{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#2==0}{}{+}}\xintifboolexpr{\Multik<0}{(}{}\Affichage{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% - }% - \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% - }{}% - % Etape 4 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - \stepcounter{NbCalculDistri}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\Affichage{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\Affichage{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\Affichage{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\Affichage{\Multi}{0}{0})}{\Affichage{\Multi}{0}{0}}}{\Affichage{\Multi}{0}{0}}% - \xintifboolexpr{\Multim==0}{}{% - \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% - }% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil<0}{-\Affichage{0}{0}{\fpeval{-\Multil}}}{+\Affichage{0}{0}{\Multil}}}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#2*#4}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#3*#5}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#2*#4}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#3*#5}}}{}% - }{}% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -\newcommand\DistriTableau[5][]{% - \useKVdefault[ClesDistributivite]% - \setKV[ClesDistributivite]{#1}% - \ensuremath{% - \begin{array}{|>{\columncolor{gray!15}}c|c|c|} - \hline - \rowcolor{gray!15}\times&\Affichage[#1]{0}{#4}{0}&\Affichage[#1]{0}{0}{#5}\\ - \hline - \xintifboolexpr{#2==0}{}{\Affichage[#1]{0}{#2}{0}&\Affichage[#1]{\fpeval{#2*#4}}{0}{0}&\xintifboolexpr{\fpeval{#2*#5}>0}{+}{}\Affichage[#1]{0}{\fpeval{#2*#5}}{0}\\ - \hline}% - \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+}{}\Affichage[#1]{0}{0}{#3}&\xintifboolexpr{\fpeval{#3*#4}>0}{+}{}\Affichage[#1]{0}{\fpeval{#3*#4}}{0}&\xintifboolexpr{\fpeval{#3*#5}>0}{+}{}\Affichage[#1]{0}{0}{\fpeval{#3*#5}}\\ - \hline} - \end{array} - }% -}% - -\newcommand\Resultat[1][]{% - \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels - \ensuremath{% - \Affichage{\SommeA}{\SommeB}{\SommeC} - }% -} - -\newcommand\AffichageEchange[4][]{% - \setKV[ClesDistributivite]{#1}%On lit les arguments optionnels - \def\LETTRE{\useKV[ClesDistributivite]{Lettre}}% - \ensuremath{% - % partie du nombre - \xintifboolexpr{#2==0}{}{\num{#2}}% - % partie du x - \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}\xintifboolexpr{#3==1}{}{\num{#3}}}{% - \xintifboolexpr{#2==0}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}{\xintifboolexpr{#3==-1}{-}{-\num{\fpeval{abs(#3)}}}} - }\LETTRE}% - % partie du x^2 - \xintifboolexpr{#4==0}{}{% - \xintifboolexpr{#4>0}{% - \xintifboolexpr{#2==0}{% - \xintifboolexpr{#3==0}{% - }{+}% - }{+}% - \xintifboolexpr{#4==1}{}{\num{#4}% - }% - }{% - \xintifboolexpr{#2==0}{% - \xintifboolexpr{#3==0}{% - \num{#4}% - }{-\num{\fpeval{abs(#4)% - }% - }% - }% - }{% - \xintifboolexpr{#4==-1}{-}{-\num{\fpeval{abs(#4)}}}}}% - \LETTRE^2}% - }% -}% - -\newcommand\DistriEchange[5][]{% - \ensuremath{% - \useKVdefault[ClesDistributivite]% - \setKV[ClesDistributivite]{#1}% - \ifboolKV[ClesDistributivite]{RAZ}{\xdef\SommeA{0}\xdef\SommeB{0}\xdef\SommeC{0}% - \setcounter{NbCalculDistri}{0}% - }{}% - \colorlet{DCAide}{\useKV[ClesDistributivite]{CouleurAide}}% - \colorlet{DCReduction}{\useKV[ClesDistributivite]{CouleurReduction}}% - \colorlet{DCFlechesh}{\useKV[ClesDistributivite]{CouleurFH}}% - \colorlet{DCFlechesb}{\useKV[ClesDistributivite]{CouleurFB}}% - \ifboolKV[ClesDistributivite]{Remarquable}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{\ifx\bla#4\bla(\AffichageEchange{#2}{#3}{0})^2\else(\AffichageEchange{#2}{#3}{0})(\AffichageEchange{#4}{#5}{0})\fi - }{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% - \ifx\bla#4\bla\xintifboolexpr{#3>0}{% - \num{#2}^2+2\times\num{#2}\times\xintifboolexpr{#3==1}{}{\num{#3}}\useKV[ClesDistributivite]{Lettre}+ - \xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2% - }{% - \num{#2}^2-2\times\num{#2}\times\xintifboolexpr{#3==-1}{}{\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}+ - \xintifboolexpr{#3==-1}{}{(\num{\fpeval{0-#3}}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==-1}{}{)}^2% - }% - \else\num{#2}^2-\xintifboolexpr{#3==1}{}{(\num{#3}}\useKV[ClesDistributivite]{Lettre}\xintifboolexpr{#3==1}{}{)}^2% - \fi% - }{} - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - \stepcounter{NbCalculDistri}% - \ifx\bla#4\bla% - \xdef\Multi{\fpeval{#2*#2}}% - \xdef\Multij{\fpeval{#2*#3}}% - \xdef\Multik{\fpeval{#3*#2}}% - \xdef\Multil{\fpeval{#3*#3}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#3+#3*#2}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \AffichageEchange{\Multi}{\Multim}{\Multil}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#3}}\xdef\SommeB{\fpeval{\SommeB+#2*#3+#3*#2}}\xdef\SommeC{\fpeval{\SommeC+#2*#2}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#3}}\xdef\SommeB{\fpeval{\SommeB-#2*#3-#3*#2}}\xdef\SommeC{\fpeval{\SommeC-#2*#2}}}{}% - \else% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multi{\fpeval{-\Multi}}% - \xdef\Multim{\fpeval{-\Multim}}% - \xdef\Multil{\fpeval{-\Multil}}% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{(}{}\AffichageEchange{\Multi}{0}{0}\xintifboolexpr{\Multi<0}{)}{}}% - \xintifboolexpr{\Multim==0}{}{\xintifboolexpr{\Multim>0}{+}{+(}\AffichageEchange{0}{\Multim}{0}\xintifboolexpr{\Multim<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{\xintifboolexpr{\Multil>0}{+}{+(}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}}% - }{% - \AffichageEchange{\Multi}{\Multim}{\Multil}% - } - % \`a faire - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+#3*#5}}\xdef\SommeB{\fpeval{\SommeB+#2*#5+#3*#4}}\xdef\SommeC{\fpeval{\SommeC+#2*#4}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-#3*#5}}\xdef\SommeB{\fpeval{\SommeB-#2*#5-#3*#4}}\xdef\SommeC{\fpeval{\SommeC-#2*#4}}}{}% - % - \fi% - }{}% - }{% - \ifboolKV[ClesDistributivite]{Numerique}{% - }{% - \ifboolKV[ClesDistributivite]{All}{% - \xdef\NomLettre{\useKV[ClesDistributivite]{NomExpression}}% - \xdef\NomFin{\useKV[ClesDistributivite]{Fin}}% - \xdef\ValeurEchange{\useKV[ClesDistributivite]{Echange}} - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesDistributivite]{Fin}-1}}\do - {\NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=##1]{#2}{#3}{#4}{#5}\\}% - \NomLettre&=\DistriEchange[Echange=\ValeurEchange,Etape=\NomFin]{#2}{#3}{#4}{#5}% - }{% - % Etape 1 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==1}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1||\useKV[ClesDistributivite]{Echange}==3}{% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{% - }{(}}\Tikzmark{\Affichage[#1]{0}{0}{#2}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{\fpeval{abs(#3)}}{0}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{% - }{)}}% - }{ - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{% - }{(}}\Tikzmark{\Affichage[#1]{0}{#2}{0}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#3>0}{\xintifboolexpr{#2==0}{}{+}}{\xintifboolexpr{#3<0}{-}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#3)}}}% - \ifboolKV[ClesDistributivite]{AideAdda}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{#2==0}{% - }{\xintifboolexpr{#3==0}{% - }{)}}% - }% - % - \ifboolKV[ClesDistributivite]{AideMul}{\times}{}%on aide dans le cas double - \xdef\Multi{\fpeval{#4*#5}}%affichage auto si (a+b)xk - % - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2||\useKV[ClesDistributivite]{Echange}==3}{% - \xintifboolexpr{\Multi==0}{\times% - \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% - \Tikzmark{\AffichageEchange[#1]{#4}{0}{0}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{-}{}}\Tikzmark{\AffichageEchange[#1]{0}{\fpeval{abs(#5)}}{0}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{\Multi==0}{% - \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% - }{% - \xintifboolexpr{\Multi==0}{\times% - \xintifboolexpr{#4<0}{(}{\xintifboolexpr{#5<0}{(}{}}}{(}% - \Tikzmark{\Affichage[#1]{0}{#4}{0}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{+(}}{}% - \xintifboolexpr{#5>0}{\xintifboolexpr{#4==0}{}{+}}{\xintifboolexpr{#5<0}{\xintifboolexpr{#4==0}{{-}}{-}}{}}\Tikzmark{\Affichage[#1]{0}{0}{\fpeval{abs(#5)}}}% - \ifboolKV[ClesDistributivite]{AideAddb}{\mathcolor{DCAide}{)}}{}% - \xintifboolexpr{\Multi==0}{% - \xintifboolexpr{#4<0}{)}{\xintifboolexpr{#5<0}{)}{}}}{)}% - }% - \ifboolKV[ClesDistributivite]{Fleches}{% - \xdef\Multi{\fpeval{#2*#3*#4*#5}}% - \xintifboolexpr{\Multi==0}{% - \xdef\Multij{\fpeval{#2*#3}}%\relax - \xintifboolexpr{\Multij==0}{\xintifboolexpr{#2==0}{\DrawArrowSimple{1}}{\DrawArrowSimple{0}}}{\xintifboolexpr{#4==0}{\DrawArrowSimpleRenverse{3}}{\DrawArrowSimpleRenverse{2}}} - }{% - \DrawArrow - }% - }{}\setcounter{NbDistri}{0}% - }{}% - % Etape 2 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==2}{% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\Affichage[#1]{0}{#4}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\Affichage[#1]{0}{0}{#5}\xintifboolexpr{#5<0}{)}{}% - }% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(}{}\Affichage[#1]{0}{#2}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(}{}\Affichage[#1]{0}{0}{#3}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% - }% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xintifboolexpr{\Multi==0}{}{% - \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multij{\fpeval{#2*#5}}% - \xintifboolexpr{\Multij==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#2<0}{(}{}\AffichageEchange[#1]{#2}{0}{0}\xintifboolexpr{#2<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% - }% - \xdef\Multik{\fpeval{#3*#4}}% - \xintifboolexpr{\Multik==0}{}{% - \xintifboolexpr{\Multi==0}{}{+}% - \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#4<0}{(}{}\AffichageEchange[#1]{#4}{0}{0}\xintifboolexpr{#4<0}{)}{}% - }% - \xdef\Multil{\fpeval{#3*#5}}% - \xintifboolexpr{\Multil==0}{}{+% - \xintifboolexpr{#3<0}{(}{}\AffichageEchange[#1]{0}{#3}{0}\xintifboolexpr{#3<0}{)}{}\times\xintifboolexpr{#5<0}{(}{}\AffichageEchange[#1]{0}{#5}{0}\xintifboolexpr{#5<0}{)}{}% - }% - }{} - }{} - % Etape 3 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==3}{% - \stepcounter{NbCalculDistri}% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{\Multij}{0}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2=0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{0}{\Multik}\xintifboolexpr{\Multik<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}% - \xdef\Multim{\fpeval{#2*#4+#3*#5}}% - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{0}{\Multi}{0})}{\AffichageEchange{0}{\Multi}{0}}}{\AffichageEchange{0}{\Multi}{0}}% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{0}{\Multij}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{\Multik}{0}{0}\xintifboolexpr{\Multik<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{\Multil}{0}\xintifboolexpr{\Multil<0}{)}{}% - \xdef\Multim{\fpeval{#2*#4+#3*#5}}% - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multi<0}{(\AffichageEchange{\Multi}{0}{0})}{\AffichageEchange{\Multi}{0}{0}}}{\AffichageEchange{\Multi}{0}{0}}% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multi==0}{}{+}\xintifboolexpr{\Multij<0}{(}{}\AffichageEchange{0}{\Multij}{0}\xintifboolexpr{\Multij<0}{)}{}}% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multil==0}{\xintifboolexpr{#2==0}{}{+}}{+}\xintifboolexpr{\Multik<0}{(}{}\AffichageEchange{0}{\Multik}{0}\xintifboolexpr{\Multik<0}{)}{}}% - \xintifboolexpr{\Multil==0}{}{+}\xintifboolexpr{\Multil<0}{(}{}\AffichageEchange{0}{0}{\Multil}\xintifboolexpr{\Multil<0}{)}{}% - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}% - }{}% - }{}%fin etape3 - % Etape 4 - \xintifboolexpr{\useKV[ClesDistributivite]{Etape}==4}{% - \xdef\Multi{\fpeval{#2*#4}}% - \xdef\Multij{\fpeval{#2*#5}}% - \xdef\Multik{\fpeval{#3*#4}}% - \xdef\Multil{\fpeval{#3*#5}}% - %% ils sont red\'efinis pour pouvoir envisager la somme de deux - %% expressions \`a d\'evelopper - % \xintifboolexpr{\theNbCalculDistri>1}{\setcounter{NbCalculDistri}{0}}{}% - %\stepcounter{NbCalculDistri}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==1}{% - \xdef\Multim{\fpeval{#2*#4+#3*#5}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multiko{\fpeval{-\Multik}}% - \xdef\Multimo{\fpeval{-\Multim}}% - \xdef\Multijo{\fpeval{-\Multij}}% - \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko<0}{(}{}\Affichage{\Multiko}{0}{0}\xintifboolexpr{\Multiko<0}{)}{}}% - \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% - \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo>0}{+}{+(}\Affichage{0}{0}{\Multijo}\xintifboolexpr{\Multijo<0}{)}{}}% - }{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multik<0}{(\Affichage{\Multik}{0}{0})}{\Affichage{\Multik}{0}{0}}}{\Affichage{\Multik}{0}{0}}% - \xintifboolexpr{\Multim==0}{}{% - \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% - }% - \xintifboolexpr{\Multij==0}{}{\xintifboolexpr{\Multij<0}{-\Affichage{0}{0}{\fpeval{-\Multij}}}{+\Affichage{0}{0}{\Multij}}}% - }% - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multik}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multij}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multik}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multij}}}{}% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==2}{% - \xdef\Multim{\fpeval{#2*#4+#3*#5}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multijo{\fpeval{-\Multij}}% - \xdef\Multimo{\fpeval{-\Multim}}% - \xdef\Multiko{\fpeval{-\Multik}}% - \xintifboolexpr{\Multijo==0}{}{\xintifboolexpr{\Multijo<0}{(}{}\Affichage{\Multijo}{0}{0}\xintifboolexpr{\Multijo<0}{)}{}}% - \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% - \xintifboolexpr{\Multiko==0}{}{\xintifboolexpr{\Multiko>0}{+}{+(}\Affichage{0}{0}{\Multiko}\xintifboolexpr{\Multiko<0}{)}{}}% - }{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multij<0}{%%%%%%%%%%%%%%%%%%%%% - (\Affichage{\Multij}{0}{0})}{\Affichage{\Multij}{0}{0}}}{\Affichage{\Multij}{0}{0}}% - \xintifboolexpr{\Multim==0}{}{% - \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% - }% - \xintifboolexpr{\Multik==0}{}{\xintifboolexpr{\Multik<0}{-\Affichage{0}{0}{\fpeval{-\Multik}}}{+\Affichage{0}{0}{\Multik}}}% - }% - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multij}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multik}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multij}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multik}}}{}% - }{}% - \xintifboolexpr{\useKV[ClesDistributivite]{Echange}==3}{% - \xdef\Multim{\fpeval{#2*#5+#3*#4}}% - \ifboolKV[ClesDistributivite]{Oppose}{% - \xdef\Multilo{\fpeval{-\Multil}}% - \xdef\Multimo{\fpeval{-\Multim}}% - \xdef\Multio{\fpeval{-\Multi}}% - \xintifboolexpr{\Multilo==0}{}{\xintifboolexpr{\Multilo<0}{(}{}\Affichage{\Multilo}{0}{0}\xintifboolexpr{\Multilo<0}{)}{}}% - \xintifboolexpr{\Multimo==0}{}{\xintifboolexpr{\Multimo>0}{+}{+(}\Affichage{0}{\Multimo}{0}\xintifboolexpr{\Multimo<0}{)}{}}% - \xintifboolexpr{\Multio==0}{}{\xintifboolexpr{\Multio>0}{+}{+(}\Affichage{0}{0}{\Multio}\xintifboolexpr{\Multio<0}{)}{}}% - }{% - \xintifboolexpr{\theNbCalculDistri>1}{\xintifboolexpr{\Multil<0}{(\Affichage{\Multil}{0}{0})}{\Affichage{\Multil}{0}{0}}}{\Affichage{\Multil}{0}{0}}% - \xintifboolexpr{\Multim==0}{}{% - \xintifboolexpr{\Multim>0}{+\Affichage{0}{\Multim}{0}}{-\Affichage{0}{\fpeval{-\Multim}}{0}}% - }% - \xintifboolexpr{\Multi==0}{}{\xintifboolexpr{\Multi<0}{-\Affichage{0}{0}{\fpeval{-\Multi}}}{+\Affichage{0}{0}{\Multi}}}% - } - \ifboolKV[ClesDistributivite]{Somme}{\xdef\SommeA{\fpeval{\SommeA+\Multil}}\xdef\SommeB{\fpeval{\SommeB+\Multim}}\xdef\SommeC{\fpeval{\SommeC+\Multi}}}{}% - \ifboolKV[ClesDistributivite]{Difference}{\xdef\SommeA{\fpeval{\SommeA-\Multil}}\xdef\SommeB{\fpeval{\SommeB-\Multim}}\xdef\SommeC{\fpeval{\SommeC-\Multi}}}{}% - }{}% - }{}% - }% - }% - }% - }% -}% - -%%% -% Nombre Premier -%%% -\setKVdefault[ClesNombrePremier]{Tableau=false,TableauVide=false,TableauVertical=false,TableauVerticalVide=false,Exposant=false,Longue=false,All=false,Arbre=false,ArbreVide=false,ArbreComplet=false,ArbreDessine=false,ArbreDessineVide=false,Entoure=false,Entourefin=false,Diviseurs=false,DiviseursT=false,Dot=\dotfill,Impose=false,ImposeAll=false,Potence=false,Decalage=10,Vide=false,CouleurFeuillage=ForestGreen,CouleurTronc=BurlyWood,CouleurFruits=Red,CouleurTexte=white}% -\defKV[ClesNombrePremier]{Nombre=\ifboolKV[ClesNombrePremier]{ArbreDessine}{}{\ifboolKV[ClesNombrePremier]{ArbreDessineVide}{}{\setKV[ClesNombrePremier]{Impose}}}}% -\defKV[ClesNombrePremier]{AllNombre=\setKV[ClesNombrePremier]{ImposeAll}}% -\defKV[ClesNombrePremier]{Impression=\setKV[ClesNombrePremier]{CouleurFeuillage=white,CouleurTronc=white,CouleurFruits=gris,CouleurTexte=black}} - -\newcommand\Decomposition[2][]{% - \useKVdefault[ClesNombrePremier]% - \setKV[ClesNombrePremier]{#1}% - \ifboolKV[ClesNombrePremier]{Impose}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{Nombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{Nombre}}}}{}% - \ifboolKV[ClesNombrePremier]{ImposeAll}{\NombrePremierImpose{#2}{\useKV[ClesNombrePremier]{AllNombre}}{\fpeval{#2/\useKV[ClesNombrePremier]{AllNombre}}}}{}% - \ifboolKV[ClesNombrePremier]{Tableau}{\NombrePremier{#2}}{}% - \ifboolKV[ClesNombrePremier]{TableauVide}{\NombrePremier{#2}}{}% - \ifboolKV[ClesNombrePremier]{Potence}{\NombrePremierPotence{#2}}{}% - \ifboolKV[ClesNombrePremier]{TableauVertical}{\NombrePremierVertical{#2}}{}% - \ifboolKV[ClesNombrePremier]{TableauVerticalVide}{\NombrePremierVerticalVide{#2}}{}% - \ifboolKV[ClesNombrePremier]{Exposant}{\PremierExposant{#2}}{}% - \ifboolKV[ClesNombrePremier]{Longue}{\PremierLong{#2}}{}% - \ifboolKV[ClesNombrePremier]{All}{\NombrePremierExposant{#2}}{}% - \ifboolKV[ClesNombrePremier]{Arbre}{\MPArbre{#2}}{}% - \ifboolKV[ClesNombrePremier]{ArbreComplet}{\MPArbreComplet{#2}}{}% - \ifboolKV[ClesNombrePremier]{ArbreVide}{\MPArbreVide{#2}}{}% - \ifboolKV[ClesNombrePremier]{ArbreDessine}{\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% - \ifboolKV[ClesNombrePremier]{ArbreDessineVide}{\setKV[ClesNombrePremier]{Vide=true}\MPArbreDessine{#2}{\useKV[ClesNombrePremier]{Nombre}}}{}% - \ifboolKV[ClesNombrePremier]{Diviseurs}{\ListeDiviseur{#2}}{}% - \ifboolKV[ClesNombrePremier]{DiviseursT}{\ListeDiviseurT{#2}}{}% -}% - -\def\MPArbre#1{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCArithmetique; - numeric depart; - pair Ancre[]; - numeric decalage; - decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; - - k:=0; - Ancre0:=(0,0); - racine:=#1; - - label(btex \num{#1} etex,(0,0)); - forever: - PremierSimple(racine); - exitif racine=1; - endfor; - - if \useKV[ClesNombrePremier]{Entoure}: - for l=1 upto k: - if Estcepremier(retenirnb[l]): - draw cercles(Ancre[l],0.25*decalage); - fi; - endfor; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; boolean Entoure; Entoure=\useKV[ClesNombrePremier]{Entoure};}] - input PfCArithmetique; - numeric depart; - pair Ancre[]; - - k:=0; - Ancre0:=(0,0); - racine:=#1; - label(LATEX("\num{"&decimal(racine)&"}"),(0,0)); - forever: - PremierSimplePdf(racine); - exitif racine=1; - endfor; - - if \useKV[ClesNombrePremier]{Entoure}: - for l=1 upto k: - if Estcepremier(retenirnb[l]): - draw cercles(Ancre[l],0.25*decalage); - fi; - endfor; - fi; -\end{mpost} -\fi -} - -\def\MPArbreComplet#1{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCArithmetique; - numeric depart; - pair Ancre[]; - numeric decalage; - decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; - - dx:=1cm; - dy:=1cm; - - pair N[][]; - nbe:=NbEtape(#1); - Positions(nbe); - if \useKV[ClesNombrePremier]{Entoure}: - draw polygone(N[nbe-1][0]+(-0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,0.25*decalage),N[nbe-1][nbe-1]+(0.25*dx,-0.25*decalage),N[nbe-1][0]+(-0.25*dx,-0.25*decalage)) dashed evenly; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] - input PfCArithmetique; - numeric depart; - pair Ancre[]; - - dx:=1cm; - dy:=1cm; - - pair N[][]; - - PositionsPdf(NbEtape(#1)); - \end{mpost} - \fi -} - -\def\MPArbreVide#1{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - input PfCArithmetique; - numeric depart; - pair Ancre[]; - numeric decalage; - decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; - - dx:=1cm; - dy:=1cm; - - pair N[][]; - - PositionsVide(NbEtape(#1)); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric decalage; decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;}] - input PfCArithmetique; - numeric depart; - pair Ancre[]; - - dx:=1cm; - dy:=1cm; - - pair N[][]; - - PositionsVidePdf(NbEtape(#1)); - \end{mpost} - \fi -} - -\def\MPArbreDessine#1#2{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode} - input PfCArithmetique; - numeric depart; - pair Ancre[]; - numeric decalage; - decalage=\useKV[ClesNombrePremier]{Decalage}*1mm; - rayonfruits:=3mm; - - color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte; - CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc}; - CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage}; - CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; - CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; - - k:=0; - Ancre0:=(0,0); - racine:=#1; - k:=1; - Ancre1:=(-decalage,-decalage); - draw Branche(Ancre0,Ancre1); - retenirnb[1]:=#2; - racine:=#2; - forever: - PremierSimpleArbre(racine); - exitif racine=1; - endfor; - k:=k+1; - Ancre[k]:=(decalage,-decalage); - draw Branche(Ancre0,Ancre[k]); - retenirnb[k]:=#1 div #2; - racine:=retenirnb[k]; - forever: - PremierSimpleArbre(racine); - exitif racine=1; - endfor; - - fill cercles(Ancre[0],rayonfruits) withcolor white; - label(btex \num{#1} etex,(0,0)); - for l=1 upto k: - if \useKV[ClesNombrePremier]{Vide}: - fill cercles(Ancre[l],rayonfruits) withcolor white; - else: - if Estcepremier(retenirnb[l]): - fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; - drawoptions(withcolor CouleurTexte); - label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); - drawoptions(); - else: - fill cercles(Ancre[l],rayonfruits) withcolor white; - label(TEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); - fi; - fi; - endfor; - for l=0 upto k: - draw cercles(Ancre[l],rayonfruits); - endfor; - picture Bilan; - Bilan=currentpicture; - currentpicture:=nullpicture; - % Habillage - % On récupère le min des ordonnées des Ancre pour le feuillage - minord=1000; - nbancrearetenir=0; - for l=0 upto k: - if ypart(Ancre[l])<minord: - minord:=ypart(Ancre[l]); - nbancrearetenir:=l; - fi; - endfor; - pair D[]; - D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; - dotlabel("",D0); - % Herbe du sol - pair A[]; - A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); - A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); - for l=1 upto 9: - A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); - endfor; - %Pour le tronc - pair B[]; - B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); - B2=symetrie(B1,Ancre0,1/2[A0,A10]);%=(-2mm,0); - B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; - path tronc; - tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% - fill tronc withcolor CouleurTronc; - trace tronc; - % Pour le feuillage - path feuillage; - feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% - pair C[]; - for l=0 upto 7: - C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; - endfor; - feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; - fill feuillage withcolor CouleurFeuillage; - trace feuillage; - draw Bilan; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric decalage;decalage=\useKV[ClesNombrePremier]{Decalage}*1mm;color CouleurTronc,CouleurFeuillage,CouleurFruits,CouleurTexte;CouleurTronc=\useKV[ClesNombrePremier]{CouleurTronc};CouleurFeuillage=\useKV[ClesNombrePremier]{CouleurFeuillage};CouleurFruits=\useKV[ClesNombrePremier]{CouleurFruits}; CouleurTexte=\useKV[ClesNombrePremier]{CouleurTexte}; boolean Vide; Vide=\useKV[ClesNombrePremier]{Vide};}] - input PfCArithmetiquePDF; - numeric depart; - pair Ancre[]; - rayonfruits:=3mm; - - k:=0; - Ancre0:=(0,0); - racine:=#1; - k:=1; - Ancre1:=(-decalage,-decalage); - draw Branche(Ancre0,Ancre1); - retenirnb[1]:=#2; - racine:=#2; - forever: - PremierSimpleArbre(racine); - exitif racine=1; - endfor; - k:=k+1; - Ancre[k]:=(decalage,-decalage); - draw Branche(Ancre0,Ancre[k]); - retenirnb[k]:=#1 div #2; - racine:=retenirnb[k]; - forever: - PremierSimpleArbre(racine); - exitif racine=1; - endfor; - - fill cercles(Ancre[0],rayonfruits) withcolor white; - label(btex \num{#1} etex,(0,0)); - for l=1 upto k: - if Vide: - fill cercles(Ancre[l],rayonfruits) withcolor white; - else: - if Estcepremier(retenirnb[l]): - fill cercles(Ancre[l],rayonfruits) withcolor CouleurFruits; - drawoptions(withcolor CouleurTexte); - label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); - drawoptions(); - else: - fill cercles(Ancre[l],rayonfruits) withcolor white; - label(LATEX("\num{"&decimal(retenirnb[l])&"}"),Ancre[l]); - fi; - fi; - endfor; - for l=0 upto k: - draw cercles(Ancre[l],rayonfruits); - endfor; - picture Bilan; - Bilan=currentpicture; - currentpicture:=nullpicture; - % Habillage - minord=1000; - nbancrearetenir=0; - for l=0 upto k: - if ypart(Ancre[l])<minord: - minord:=ypart(Ancre[l]); - nbancrearetenir:=l; - fi; - endfor; - pair D[]; - D0=0.5[Ancre0,(0,ypart(Ancre[nbancrearetenir]))]; - pair A[]; - A0=(xpart(Ancre0)-1cm,ypart(Ancre[nbancrearetenir])-2cm); - A10=(xpart(Ancre0)+1cm,ypart(Ancre[nbancrearetenir])-2cm); - for l=1 upto 9: - A[l]=(l/10)[A0,A10]+uniformdeviate(5)*(unitvector(A10-A0) rotated 90); - endfor; - pair B[]; - B1=D0+(10+uniformdeviate(10))*(unitvector(D0-A0) rotated 90); - B2=symetrie(B1,Ancre0,1/2[A0,A10]);% - B3=1/2[Ancre0,(xpart(1/2[A0,A10]),ypart(Ancre[k]))]; - path tronc; - tronc=A0{dir angle(A1-A0)}..{dir90}B1--B2{dir-90}..{dir angle(A10-A9)}A10--reverse(A0 for l=1 upto 10:--A[l] endfor)--cycle;% - fill tronc withcolor CouleurTronc; - trace tronc; - path feuillage; - feuillage=cercles((0,0),abs(Ancre[nbancrearetenir]-D0));% - pair C[]; - for l=0 upto 7: - C[l]=(pointarc(feuillage,l*45+(-5+uniformdeviate(10))) xscaled 1.25 yscaled 1) shifted D0; - endfor; - feuillage:=C[0] for l=1 upto 7:..(C[l] if (l mod 2)=0:+(0,2mm) else: +(0,-2mm) fi) endfor ..cycle; - fill feuillage withcolor CouleurFeuillage; - trace feuillage; - draw Bilan; - \end{mpost} -\fi -} - -\newcount\premier% - -\newcommand\NombrePremier[1]{%\'ecrire la d\'ecomposition compl\`ete - % #1 le nombre premier \`a tester - \newcount\anp\newcount\bnp\newcount\cnp% - \anp=#1\relax - \bnp=2\relax - \premier=-1\relax - % Pour d\'eterminer le nombre d'\'etapes - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \global\premier=\numexpr\premier+1\relax - \cnp=\numexpr\anp/\bnp\relax - \anp=\cnp\relax - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - } - \ifnum\premier=0 - Le nombre \num{#1} est un nombre premier. - \else - \begin{align*} - \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\ifboolKV[ClesNombrePremier]{TableauVide}{\phantom{\PremierEtape{#1}{##1}}}{\PremierEtape{#1}{##1}}\xintifboolexpr{##1<\premier}{\\}{}}% - \end{align*} - \fi -} - -\newcount\premierun -\newcount\premierdeux - -\newcommand\NombrePremierImpose[3]{% - % #1 le nombre premier \`a tester - % #2 est le premier facteur imposé - % #3 est le deuxième facteur imposé - \newcount\anp\newcount\bnp\newcount\cnp% - % Pour d\'eterminer le nombre d'\'etapes pour #1 - \anp=#1\relax - \bnp=2\relax - \premier=-1\relax - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \global\premier=\numexpr\premier+1\relax - \cnp=\numexpr\anp/\bnp\relax - \anp=\cnp\relax - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - }% - % Pour d\'eterminer le nombre d'\'etapes pour #2 - \anp=#2\relax - \bnp=2\relax - \premierun=-1\relax - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \global\premierun=\numexpr\premierun+1\relax - \cnp=\numexpr\anp/\bnp\relax - \anp=\cnp\relax - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - }% - % Pour d\'eterminer le nombre d'\'etapes pour #3 - \anp=#3\relax - \bnp=2\relax - \premierdeux=-1\relax - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \global\premierdeux=\numexpr\premierdeux+1\relax - \cnp=\numexpr\anp/\bnp\relax - \anp=\cnp\relax - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - }% - \ifboolKV[ClesNombrePremier]{ImposeAll}{\xdef\PfCRappelImposeAll{1}}{\xdef\PfCRappelImposeAll{0}}% - \ifnum\premier=0 - Le nombre \num{#1} est un nombre premier. - \else - \xintifboolexpr{\premierun>\premierdeux}{\premier=\premierun}{\premier=\premierdeux} - \begin{align*} - \num{#1}&=\num{#2}\times\num{#3}%\\ - \xintifboolexpr{\premier>0}{\\% - \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\xintifboolexpr{##1<\premierun}{\PremierEtape{#2}{##1}}{\Decomposition[Longue]{#2}}\mathrel{\times}\xintifboolexpr{##1<\premierdeux}{\PremierEtape{#3}{##1}}{\Decomposition[Longue]{#3}}\xintifboolexpr{##1<\premier}{\\}{}}% - }{}% - \xintifboolexpr{\PfCRappelImposeAll==1}{\\\num{#1}&=\PremierExposant{#1}}{}% - \end{align*} - \fi -}% - -\newcommand\NombrePremierVertical[1]{%\'ecrire la d\'ecomposition compl\`ete - % #1 le nombre premier \`a tester - \newcount\anpv\newcount\bnpv\newcount\cnpv% - \anpv=#1\relax - \bnpv=2\relax - \premier=-1\relax - % Pour d\'eterminer le nombre d'\'etapes - \whiledo{\anpv > 1}{% - \modulo{\the\anpv}{\the\bnpv} - \ifnum\remainder=0\relax - \global\premier=\numexpr\premier+1\relax - \cnpv=\numexpr\anpv/\bnpv\relax - \anpv=\cnpv\relax - \else% - \bnpv=\numexpr\bnpv+1\relax% - \fi% - } - \ifnum\premier=0 - Le nombre \num{#1} est un nombre premier. - \else - \begin{tabular}{c|c} - \xintFor* ##1 in {\xintSeq {0}{\premier}}\do - {\PremierMultipleVide{#1}{##1}&\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape} - \xintifboolexpr{##1<\premier}{\\}{\\1\\}}% - \end{tabular} - \fi -} - -\newcommand\NombrePremierPotence[1]{% - % #1 le nombre premier \`a tester - \newcount\anpv\newcount\bnpv\newcount\cnpv% - \anpv=#1\relax - \bnpv=2\relax - \premier=-1\relax - % Pour d\'eterminer le nombre d'\'etapes - \whiledo{\anpv > 1}{% - \modulo{\the\anpv}{\the\bnpv} - \ifnum\remainder=0\relax - \global\premier=\numexpr\premier+1\relax - \cnpv=\numexpr\anpv/\bnpv\relax - \anpv=\cnpv\relax - \else% - \bnpv=\numexpr\bnpv+1\relax% - \fi% - } - \ifnum\premier=0% - Le nombre \num{#1} est un nombre premier.% - \else% - \xdef\PotenceCases{\fpeval{\premier+2}}% - \begin{NiceTabular}{*{\PotenceCases}{c}} - %\Body - \PremierMultipleVide{#1}{0}&\multicolumn{1}{|c}{\PremierDiviseurVide{#1}{1}}\\ - \hhline{~-} - \xintFor* ##1 in {\xintSeq {1}{\premier}}\do{% - \xintifboolexpr{##1 == 0}{}{\xintFor* ##2 in {\xintSeq {1}{##1}}\do{% - &}% - }% - \multicolumn{1}{|c}{\PremierMultipleVide{#1}{##1}}&\multicolumn{1}{|c}{\xdef\Etape{\fpeval{##1+1}}\PremierDiviseurVide{#1}{\Etape}}\\ - \hhline{*{\fpeval{##1+1}}{~}-} - }% - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\PotenceCases-2}}}\do{% - &}&\multicolumn{1}{|c}{1}\\ - \CodeAfter - \tikz \draw [white,fill=white] (1 -|2) circle (0.5mm); - \xintFor* ##1 in {\xintseq{2}{\PotenceCases}}\do{% - \tikz \draw [white,fill=white,transform canvas={xshift=0mm}] (\fpeval{##1-1} -|##1) circle (0.5mm); - }% - \end{NiceTabular}% - \fi% -} - -\newcommand\PremierDiviseurVide[2]{% - %#1 : le nombre entier \`a tester - %#2 : le nombre d'\'etapes \`a effectuer - \newcount\anpvv\newcount\bnpvv\newcount\cnpvv\newcount\dnpvv% - \ensuremath{% - \anpvv=#1\relax - \bnpvv=2\relax - \dnpvv=0\relax% - \whiledo{\anpvv > 1}{% - \whiledo{\dnpvv < \number#2}{% - \modulo{\the\anpvv}{\the\bnpvv} - \ifnum\remainder=0\relax - \dnpvv=\numexpr\dnpvv+1\relax - \cnpvv=\numexpr\anpvv/\bnpvv\relax - \anpvv=\cnpvv\relax - \else% - \bnpvv=\numexpr\bnpvv+1\relax% - \fi% - } - \num{\the\bnpvv}% - \anpvv=1% - } - } -} - -\newcommand\PremierMultipleVide[2]{% - %#1 : le nombre entier \`a tester - %#2 : le nombre d'\'etapes \`a effectuer - \newcount\anpmv\newcount\bnpmv\newcount\cnpmv\newcount\dnpmv% - \ensuremath{% - \anpmv=#1\relax - \bnpmv=2\relax - \dnpmv=0\relax% - \whiledo{\anpmv > 1}{% - \whiledo{\dnpmv < \number#2}{% - \modulo{\the\anpmv}{\the\bnpmv} - \ifnum\remainder=0\relax - \dnpmv=\numexpr\dnpmv+1\relax - \cnpmv=\numexpr\anpmv/\bnpmv\relax - \anpmv=\cnpmv\relax - \else% - \bnpmv=\numexpr\bnpmv+1\relax% - \fi% - } - \num{\the\anpmv}% - \anpmv=1% - } - } -} - -\newcommand\NombrePremierVerticalVide[1]{% - % #1 le nombre premier \`a tester - \newcount\anpv\newcount\bnpv\newcount\cnpv% - \anpv=#1\relax - \bnpv=2\relax - \premier=-1\relax - % Pour d\'eterminer le nombre d'\'etapes - \whiledo{\anpv > 1}{% - \modulo{\the\anpv}{\the\bnpv} - \ifnum\remainder=0\relax - \global\premier=\numexpr\premier+1\relax - \cnpv=\numexpr\anpv/\bnpv\relax - \anpv=\cnpv\relax - \else% - \bnpv=\numexpr\bnpv+1\relax% - \fi% - } - \ifnum\premier=0 - Le nombre \num{#1} est un nombre premier.% - \else - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{c|c} - \PremierMultipleVide{#1}{0}&\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}\\ - \xintFor* ##1 in {\xintSeq {1}{\premier}}\do - {\hbox to1cm{\useKV[ClesNombrePremier]{Dot}}&\hbox - to1cm{\useKV[ClesNombrePremier]{Dot}}\xintifboolexpr{##1<\premier}{\\}{\\\hbox - to1cm{\useKV[ClesNombrePremier]{Dot}}\\}}% - \end{tabular} - \renewcommand{\arraystretch}{1} - \fi -} - -\newcommand\NombrePremierExposant[1]{% - \newcount\anp\newcount\bnp\newcount\cnp% - % #1 le nombre premier \`a tester - \anp=#1\relax% - \bnp=2\relax% - \premier=-1\relax% - % Pour d\'eterminer le nombre d'\'etapes - \whiledo{\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax% - \global\premier=\numexpr\premier+1\relax% - \cnp=\numexpr\anp/\bnp\relax% - \anp=\cnp\relax% - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - }% - \ifnum\premier=0% - Le nombre \num{#1} est un nombre premier.% - \else% - \begin{align*} - \xintFor* ##1 in {\xintSeq {1}{\premier}}\do {\num{#1}&=\PremierEtape{#1}{##1}\\}% - \num{#1}&=\PremierExposant{#1}% - \end{align*}% - \fi% -}% - -\newcommand\PremierEtape[2]{% - %#1 : le nombre entier \`a tester - %#2 : le nombre d'\'etapes \`a effectuer - \newcount\anp\newcount\bnp\newcount\cnp\newcount\dnp% - \ensuremath{% - \anp=#1\relax - \bnp=2\relax - \dnp=0\relax% - \whiledo{\anp > 1}{% - \whiledo{\dnp < \number#2}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \dnp=\numexpr\dnp+1\relax - \cnp=\numexpr\anp/\bnp\relax - \anp=\cnp\relax - \num{\the\bnp}\times% - \else% - \bnp=\numexpr\bnp+1\relax% - \fi% - } - \num{\the\anp}% - \anp=1% - } - } -} - -\newcommand\PremierExposant[1]{% - %#1 : le nombre entier \`a tester - \ensuremath{% - \newcount\anp\newcount\bnp\newcount\cnp% - \newcount\pileb\newcount\exposant% - \exposant=0\relax% - \anp=#1\relax% - \bnp=2\relax% - \pileb=2\relax% - \whiledo{\the\anp > 1}{% - \modulo{\the\anp}{\the\bnp} - \ifnum\remainder=0\relax - \cnp=\numexpr\anp/\bnp\relax - \ifnum\pileb=\bnp - \exposant=\numexpr\exposant+1\relax - \fi - \anp=\cnp\relax - \else% - \ifnum\exposant>0\relax - \num{\the\pileb}\ifnum\exposant>1 ^{\num{\the\exposant}}\fi\times% - \fi - \bnp=\numexpr\bnp+1\relax% - \pileb=\bnp\relax% - \exposant=0\relax% - \fi% - }% - \num{\the\pileb}\ifnum\exposant>1^{\num{\the\exposant}}\fi% - }% -}% - -\newcommand\PremierLong[1]{% - %#1 : le nombre entier \`a tester - \ensuremath{% - \newcount\anpl\newcount\bnpl\newcount\cnpl% - \newcount\pilebl% - \anpl=#1\relax% - \bnpl=2\relax% - \pilebl=2\relax% - \whiledo{\the\anpl > 1}{% - \modulo{\the\anpl}{\the\bnpl} - \ifnum\remainder=0\relax - \cnpl=\numexpr\anpl/\bnpl\relax - \num{\the\bnpl}\ifnum\anpl>\bnpl\times\fi% - \anpl=\cnpl\relax - \else% - \bnpl=\numexpr\bnpl+1\relax% - \pilebl=\bnpl\relax% - \fi% - } - } -} - -\newcommand\ListeDiviseur[1]{%#1 : le nombre entier \`a tester - \newcount\anp\newcount\bnp% - \anp=#1% - \bnp=2\relax% - 1 % - \whiledo{\bnp<\anp}{% - \modulo{\the\anp}{\the\bnp}{}% - \ifnum\remainder=0% - ; $\num{\the\bnp}$ % - \fi% - \bnp=\numexpr\bnp+1% - }% - et \num{\the\anp}% -} - -\newcount\anpT\newcount\bnpT\newcount\cnpT\newcount\dnpT% - -\newcommand\ListeDiviseurT[1]{%#1 : le nombre entier \`a tester - \anpT=#1% - \bnpT=2\relax% - %On compte les diviseurs propres. - \cnpT=0\relax% - \whiledo{\bnpT<\anpT}{% - \modulo{\the\anpT}{\the\bnpT}{}% - \ifnum\remainder=0% - \cnpT=\numexpr\cnpT+1% - \fi% - \bnpT=\numexpr\bnpT+1% - }% - \ifodd\cnpT% - \begin{tabular}{c|c}% - 1&\num{#1}\\ - \xintFor* ##1 in {\xintSeq {1}{\fpeval{(\cnpT+1)/2}}}\do{% - \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\xintifboolexpr{\dnpT=\fpeval{#1/\dnpT}}{}{\num{\fpeval{#1/\dnpT}}}\\ - } - \end{tabular}% - \else% - \begin{tabular}{c|c} - 1&\num{#1}\\ - \xintFor* ##1 in {\xintSeq {1}{\fpeval{\cnpT/2}}}\do{% - \DiviseurNumero{#1}{##1}\num{\fpeval{\dnpT}}\uppercase{&}\DiviseurNumero{#1}{##1}\num{\fpeval{#1/\dnpT}}\\ - } - \end{tabular}% - \fi% -}% - -\newcommand\DiviseurNumero[2]{% - % #1 nb entier \`a tester - % #2 no du diviseur (\`a part 1 et #1) - \anpT=#1% - \bnpT=2\relax% - %On compte les diviseurs propres. - \cnpT=0\relax% - \whiledo{\bnpT<\anpT}{% - \modulo{\the\anpT}{\the\bnpT}{}% - \ifnum\remainder=0% - \cnpT=\numexpr\cnpT+1% - \ifnum\cnpT=\numexpr#2-1% - \dnpT=\bnpT% - \bnpT=\anpT% - \fi% - \fi% - \bnpT=\numexpr\bnpT+1% - }% -} - -%%% -% Simplification -%%% -\makeatletter%by christian Tellechea -% Calcul du PGCD de #1 et #2 -\newcount\cnt@a\newcount\cnt@b\newcount\pgcd -\def\PGCD#1#2{% - \ifnum#1>#2\cnt@a#1\cnt@b#2\else\cnt@a#2\cnt@b#1\relax\fi - \PGCD@i -} -\def\PGCD@i{\edef\PGCD@ii##1{##1{\number\cnt@a}{\number\cnt@b}}\PGCD@ii\PGCD@iii} -\def\PGCD@iii#1#2{% - \cnt@b#1\relax\global\divide\cnt@b#2% - \global\cnt@b\numexpr#1-#2*\cnt@b% - \global\cnt@a#2\global\pgcd\cnt@a% - \ifnum\cnt@b>\z@\expandafter\PGCD@i% - \fi}% -\makeatother - -\def\SSimplifie#1#2{% - % Simplification d'une \'ecriture #1/#2 - \ensuremath{ - \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno - \numerateur=\number#1 - \denominateur=\number#2 - \ifnum\number#1<0\relax - \valabsnum=\numexpr0-\number#1 - \else - \valabsnum=\number#1 - \fi - \ifnum\number#2<0\relax - \valabsdeno=\numexpr0-\number#2 - \else - \valabsdeno=\number#2 - \fi - \ifnum\the\numerateur<0\relax - \ifnum\the\denominateur<0\relax - \numerateur=\valabsnum - \denominateur=\valabsdeno - \fi - \else - \ifnum\the\denominateur<0\relax - \numerateur=-\valabsnum - \denominateur=\valabsdeno - \fi - \fi - \ifnum\number#2=0\relax - \text{\bfseries(???)} - \else - \ifnum\number#1=0\relax - 0 - \else - \PGCD{\the\valabsnum}{\the\valabsdeno}% - \ifnum\pgcd>1\relax - \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{% - \divide\numerateur by \denominateur\num{\the\numerateur} - }{\divide\numerateur by\pgcd% - \divide\denominateur by\pgcd% - \frac{\num{\the\numerateur}}{\num{\the\denominateur}} - } - \else%%%comme on est avec les n\'egatifs, on doit regarder si la valeur absolue est \'egale \`a 1 - \ifnum\valabsdeno=1\relax - \divide\numerateur by \denominateur\num{\the\numerateur} - \else - \frac{\num{\the\numerateur}}{\num{\the\denominateur}} - \fi - \fi% - \fi% - \fi% - }% -} - - -\newcommand\SSimpli[2]{% - % D\'ecomposition d'une simplification de #1/#2 - \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno% - \numerateur=\number#1 - \denominateur=\number#2 - \ifnum\number#1<0 - \valabsnum=\numexpr0-\number#1 - \else - \valabsnum=\number#1 - \fi - \ifnum\number#2<0 - \valabsdeno=\numexpr0-\number#2 - \else - \valabsdeno=\number#2 - \fi - \ifnum\the\numerateur<0\relax - \ifnum\the\denominateur<0\relax - \numerateur=\valabsnum - \denominateur=\valabsdeno - \fi - \else - \ifnum\the\denominateur<0\relax - \numerateur=-\valabsnum - \denominateur=\valabsdeno - \fi - \fi - \ifnum\number#2=0\relax - \ensuremath{\text{\bfseries(???)}} - \else - \ifnum\number#1=0\relax - 0 - \else - \PGCD{\the\valabsnum}{\the\valabsdeno}% - \ifnum\pgcd>1\relax - \ifthenelse{\pgcd=\number#2 \OR \pgcd=\the\valabsdeno}{% - \divide\numerateur by \denominateur\num{\the\numerateur} - }{%\divide\numerateur by\pgcd% - % \divide\denominateur by\pgcd% - \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}}% - } - \else - \ifnum\denominateur=1\relax - \ensuremath{\frac{\num{\the\numerateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}{\num{\the\denominateur}_{\mbox{\tiny$\div\num{\number\pgcd}$}}}} - \else - \ensuremath{\frac{\num{\the\numerateur}}{\num{\the\denominateur}}} - \fi - \fi - \fi - \fi -} - -\newcount\anpdc\newcount\bnpdc\newcount\cnpdc\newcount\dnpdc% -\newcount\DivCom -\newcommand\DiviseurCommun[2]{% - % #1 : le premier nombre entier - % #2 : le deuxi\`eme nombre entier - % nombre 1 vaut #1 - Nombre 2 vaut #2 - \anpdc=#1% - \cnpdc=#2% - \bnpdc=2\relax% - \dnpdc=\numexpr#1+1\relax% - \DivCom=1\relax% - \whiledo{\bnpdc<\dnpdc}{% - \modulo{\the\anpdc}{\the\bnpdc}\relax - \ifnum\remainder=0% - \modulo{\the\cnpdc}{\the\bnpdc} - \ifnum\remainder=0% - \DivCom=\bnpdc% - \bnpdc=\anpdc% - \else% - \DivCom=1% - \fi - \else% - \DivCom=1% - \fi - \bnpdc=\numexpr\bnpdc+1\relax% - }% -} - -\newcommand\LongueSimplification[2]{% - \xdef\NumerateurDiv{#1}% - \xdef\DenominateurDiv{#2}% - \DiviseurCommun{#1}{#2}% - \ensuremath{% - \whiledo{\DivCom>1}{% - \frac{\num{\fpeval{\NumerateurDiv/\the\DivCom}}\times\num{\the\DivCom}}{\num{\fpeval{\DenominateurDiv/\the\DivCom}}\times\num{\the\DivCom}}=\frac{\num{\fpeval{\NumerateurDiv/\DivCom}}}{\num{\fpeval{\DenominateurDiv/\DivCom}}}% - \xdef\NumerateurDiv{\fpeval{\NumerateurDiv/\DivCom}}% - \xdef\DenominateurDiv{\fpeval{\DenominateurDiv/\DivCom}}% - \DiviseurCommun{\NumerateurDiv}{\DenominateurDiv}% - \xintifboolexpr{\DivCom>1}{=}{}% - }% - }% -}% - -\setKVdefault[ClesSimplification]{Details=false,All=false,Longue=false,Fleches=false,Contraire=0} - -\newcounter{NbFrac}% -\setcounter{NbFrac}{0}% - -\newcommand\Simplification[3][]{% - \stepcounter{NbFrac}% - \useKVdefault[ClesSimplification]% - \setKV[ClesSimplification]{#1}% - \ifboolKV[ClesSimplification]{Fleches}{% - \setsepchar[*]{,*/}%\ignoreemptyitems - \readlist*\Listea{#2}% - \readlist*\Listeb{#3}% - \setbox1=\hbox{\Listea[1,1]{}}% - \setbox2=\hbox{\Listeb[1,1]}% - \setbox3=\hbox{\Listea[1,3]}% - \setbox4=\hbox{\Listeb[1,3]}% - \ensuremath{% - \frac{\tikzmarknode[anchor=north]{A-\theNbFrac}{\Listea[1,1]}{}}{\tikzmarknode[anchor=south]{B-\theNbFrac}{\Listeb[1,1]}{}}=\frac{\tikzmarknode[anchor=north]{C-\theNbFrac}{\Listea[1,3]}{}}{\tikzmarknode[anchor=south]{D-\theNbFrac}{\Listeb[1,3]}{}}% - }% - \begin{tikzpicture}[remember picture,overlay]% - \draw[out=45,in=135,-stealth,transform canvas={yshift=0.25em}] - let - \p1=(pic cs:A-\theNbFrac), - \p2=(pic cs:C-\theNbFrac) - in (pic cs:A-\theNbFrac) to node[midway,above]{\Listea[1,2]}(\x2,\y1); - \draw[out=-45,in=-135,-stealth,transform canvas={yshift=-0.25em}] (pic cs:B-\theNbFrac) to node[midway,below]{\Listeb[1,2]}(pic cs:D-\theNbFrac);% - \end{tikzpicture}% - }{% - \xintifboolexpr{\useKV[ClesSimplification]{Contraire}>1}{% - \ensuremath{% - \frac{\num{#2}}{\num{#3}}=\frac{\num{#2}\times\num{\useKV[ClesSimplification]{Contraire}}}{\num{#3}\times\num{\useKV[ClesSimplification]{Contraire}}}=\frac{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#2}}}{\num{\fpeval{\useKV[ClesSimplification]{Contraire}*#3}}}% - }% - }{% - \ifboolKV[ClesSimplification]{Longue}{% - \LongueSimplification{#2}{#3}% - }{% - \ifboolKV[ClesSimplification]{Details}{\SSimpli{#2}{#3}}{\ifboolKV[ClesSimplification]{All}{\ensuremath{\SSimpli{#2}{#3}=\SSimplifie{#2}{#3}}}{\SSimplifie{#2}{#3}}}% - }% - }% - }% -}% - -%%% -% Thales -%%% -\newcount\ppcm% - -\newcommand\PPCM[2]{% - \PGCD{#1}{#2}% - \ppcm=\numexpr#1*#2/\pgcd\relax% -}% - -\setKVdefault[ClesThales]{Calcul=true,Droites=false,Propor=false,Segment=false,Figure=false,FigureSeule=false,Figurecroisee=false,FigurecroiseeSeule=false,Angle=0,Precision=2,Entier=false,Unite=cm,Reciproque=false,Produit=false,ChoixCalcul=0,Simplification,Redaction=false,Remediation=false,Echelle=1cm,Perso=false,CalculsPerso=false,IntroCalculs,CouleursNum=false,CouleursDen=false} -\defKV[ClesThales]{CouleurNum=\setKV[ClesThales]{CouleursNum}} -\defKV[ClesThales]{CouleurDen=\setKV[ClesThales]{CouleursDen}} - -\DeclareSIUnit{\PfCThalesUnit}{\useKV[ClesThales]{Unite}}% - -%On d\'efinit la figure \`a utiliser -\def\MPFigThales#1#2#3#4#5#6{ - % #1 Premier sommet - % #2 Deuxi\`eme sommet - % #3 Troisi\`eme sommet - % #4 point sur le segment #1#2 - % #5 point sur le segment #1#3 - % #6 angle de rotation - \ifluatex -% \mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesThales]{Echelle}; - boolean CouleursNum,CouleursDen; - CouleursNum=\useKV[ClesThales]{CouleursNum}; - CouleursDen=\useKV[ClesThales]{CouleursDen}; - color CouleurNum,CouleurDen; - if CouleursNum: - CouleurNum=\useKV[ClesThales]{CouleurNum} - else: - CouleurNum=black - fi; - if CouleursDen: - CouleurDen=\useKV[ClesThales]{CouleurDen} - else: - CouleurDen=black - fi; - pair A,B,C,M,N,O;% - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(4,0); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - M=point(0.4*length cotes1) of cotes1; - N=point(0.6*length cotes3) of cotes3; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - path triangle; - triangle=cotes1--cotes2--cotes3--cycle; - draw triangle; - draw cotes4; - if CouleursDen: - draw triangle dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen; - fi; - if CouleursNum: - draw (cotes1 cutafter cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - draw (cotes4 cutbefore cotes1 cutafter cotes3) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - draw (cotes3 cutbefore cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - fi; - %on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex #4 etex,1.1[C,M]); - label(btex #5 etex,1.1[B,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); - pair I,J,K; - I=1/2[M,N]; - J=1/2[B,C]; - K=1/2[I,J]; - path cd; - cd=(fullcircle scaled 6mm) shifted K; - drawoptions(withcolor 0.75*white); - drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); - drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); - draw cd; - label(btex $//$ etex ,K); - drawoptions(); - \end{mplibcode} -% \mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};boolean CouleursNum,CouleursDen; - CouleursNum=\useKV[ClesThales]{CouleursNum}; - CouleursDen=\useKV[ClesThales]{CouleursDen}; - color CouleurNum,CouleurDen; - if CouleursNum: - CouleurNum=\useKV[ClesThales]{CouleurNum} - else: - CouleurNum=black - fi; - if CouleursDen: - CouleurDen=\useKV[ClesThales]{CouleurDen} - else: - CouleurDen=black - fi;}] - pair A,B,C,M,N,O;% - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(4,0); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - M=point(0.4*length cotes1) of cotes1; - N=point(0.6*length cotes3) of cotes3; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - path triangle; - triangle=cotes1--cotes2--cotes3--cycle; - draw triangle; - draw cotes4; - if CouleursDen: - draw triangle dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen; - fi; - if CouleursNum: - draw (cotes1 cutafter cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - draw (cotes4 cutbefore cotes1 cutafter cotes3) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - draw (cotes3 cutbefore cotes4) dashed dashpattern(off 3 on 3) withpen pencircle scaled 1.5 withcolor CouleurNum; - fi; - %on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex #4 etex,1.1[C,M]); - label(btex #5 etex,1.1[B,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); - pair I,J,K; - I=1/2[M,N]; - J=1/2[B,C]; - K=1/2[I,J]; - path cd; - cd=(fullcircle scaled 6mm) shifted K; - drawoptions(withcolor 0.75*white); - drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); - drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); - draw cd; - label(btex $//$ etex ,K); - drawoptions(); - \end{mpost} - \fi -} - -%On d\'efinit la figure \`a utiliser -\def\MPFigReciThales#1#2#3#4#5#6{ - % #1 Premier sommet - % #2 Deuxi\`eme sommet - % #3 Troisi\`eme sommet - % #4 point sur le segment #1#2 - % #5 point sur le segment #1#3 - \ifluatex - \mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesThales]{Echelle}; - pair A,B,C,M,N,O;% - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(4,0); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - M=point(0.4*length cotes1) of cotes1; - N=point(0.6*length cotes3) of cotes3; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - path triangle; - triangle=cotes1--cotes2--cotes3--cycle; - draw triangle; - draw cotes4; - %on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex #4 etex,1.1[C,M]); - label(btex #5 etex,1.1[B,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); - \end{mplibcode} - \mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}] - pair A,B,C,M,N,O;% - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(4,0); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - cotes2=B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - cotes3=C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - M=point(0.4*length cotes1) of cotes1; - N=point(0.6*length cotes3) of cotes3; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - path triangle; - triangle=cotes1--cotes2--cotes3--cycle; - draw triangle; - draw cotes4; - %on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex #4 etex,1.1[C,M]); - label(btex #5 etex,1.1[B,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes4); - \end{mpost} - \fi -} - -%On d\'efinit la deuxi\`eme figure \`a utiliser -\def\MPFigThalesCroisee#1#2#3#4#5#6{% - % #1 Premier sommet - % #2 Deuxi\`eme sommet - % #3 Troisi\`eme sommet - % #4 point sur la droite #1#2 - % #5 point sur la droite #1#3 - \ifluatex - \mplibforcehmode - \mplibcodeinherit{enable} - \begin{mplibcode} - u:=\useKV[ClesThales]{Echelle}; - boolean CouleursNum,CouleursDen; - CouleursNum=\useKV[ClesThales]{CouleursNum}; - CouleursDen=\useKV[ClesThales]{CouleursDen}; - color CouleurNum,CouleurDen; - if CouleursNum: - CouleurNum=\useKV[ClesThales]{CouleurNum} - else: - CouleurNum=black - fi; - if CouleursDen: - CouleurDen=\useKV[ClesThales]{CouleurDen} - else: - CouleurDen=black - fi; - pair A,B,C,M,N,O;% - O=(2.5u,2.5u); - path cc; - cc=(fullcircle scaled 3u) shifted O; - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.1*length cc) of cc; - B=A rotatedabout(O,130); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - M=1.4[B,A]; - N=1.4[C,A]; - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; - cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; - cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; - cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; - for k=1 upto 6: - draw cotes[k]; - endfor; - if CouleursDen: - drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen); - draw (cotes[1] cutafter cotes[2]); - draw (cotes[2] cutbefore cotes[1] cutafter cotes[3]); - draw (cotes[3] cutbefore cotes[2]); - drawoptions(); - fi; - if CouleursNum: - drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurNum); - draw (cotes[5] cutafter cotes[4]); - draw (cotes[4] cutbefore cotes[5] cutafter cotes[6]); - draw (cotes[6] cutafter cotes[4]); - drawoptions(); - fi; - pair I; - % On d\'efinit le centre du cercle inscrit \`a AMC - (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; - (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; - %on labelise - label(btex #1 etex,I); - label(btex #2 etex,1.2[M,B]); - label(btex #3 etex,1.2[N,C]); - label(btex #4 etex,1.1[B,M]); - label(btex #5 etex,1.1[C,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); - pair I,J,K; - I=1.1[N,M]; - J=1.1[B,C]; - K=1/2[I,J]; - path cd; - cd=(fullcircle scaled 6mm) shifted K; - drawoptions(withcolor 0.75*white); - drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); - drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); - draw cd; - label(btex $//$ etex ,K); - drawoptions(); - \end{mplibcode} - \mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};boolean CouleursNum,CouleursDen; - CouleursNum=\useKV[ClesThales]{CouleursNum}; - CouleursDen=\useKV[ClesThales]{CouleursDen}; - color CouleurNum,CouleurDen; - if CouleursNum: - CouleurNum=\useKV[ClesThales]{CouleurNum} - else: - CouleurNum=black - fi; - if CouleursDen: - CouleurDen=\useKV[ClesThales]{CouleurDen} - else: - CouleurDen=black - fi;}] - pair A,B,C,M,N,O;% - O=(2.5u,2.5u); - path cc; - cc=(fullcircle scaled 3u) shifted O; - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.1*length cc) of cc; - B=A rotatedabout(O,130); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - M=1.4[B,A]; - N=1.4[C,A]; - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; - cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; - cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; - cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; - for k=1 upto 6: - draw cotes[k]; - endfor; - if CouleursDen: - drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurDen); - draw (cotes[1] cutafter cotes[2]); - draw (cotes[2] cutbefore cotes[1] cutafter cotes[3]); - draw (cotes[3] cutbefore cotes[2]); - drawoptions(); - fi; - if CouleursNum: - drawoptions(dashed evenly withpen pencircle scaled 1.5 withcolor CouleurNum); - draw (cotes[5] cutafter cotes[4]); - draw (cotes[4] cutbefore cotes[5] cutafter cotes[6]); - draw (cotes[6] cutafter cotes[4]); - drawoptions(); - fi; - pair I; - % On d\'efinit le centre du cercle inscrit \`a AMC - (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; - (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; - %on labelise - label(btex #1 etex,I); - label(btex #2 etex,1.2[M,B]); - label(btex #3 etex,1.2[N,C]); - label(btex #4 etex,1.1[B,M]); - label(btex #5 etex,1.1[C,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); - pair I,J,K; - I=1.1[N,M]; - J=1.1[B,C]; - K=1/2[I,J]; - path cd; - cd=(fullcircle scaled 6mm) shifted K; - drawoptions(withcolor 0.75*white); - drawarrow reverse((I{dir(210+angle(I-J))}..{dir(150+angle(I-J))}K) cutafter cd); - drawarrow reverse((J{dir(210+angle(J-I))}..{dir(150+angle(J-I))}K) cutafter cd); - draw cd; - label(btex $//$ etex ,K); - drawoptions(); - \end{mpost} - \fi -} - -%On d\'efinit la deuxi\`eme figure \`a utiliser -\def\MPFigReciThalesCroisee#1#2#3#4#5#6{% - % #1 Premier sommet - % #2 Deuxi\`eme sommet - % #3 Troisi\`eme sommet - % #4 point sur la droite #1#2 - % #5 point sur la droite #1#3 - \ifluatex - \mplibforcehmode - \mplibcodeinherit{enable} - \begin{mplibcode} - u:=\useKV[ClesThales]{Echelle}; - pair A,B,C,M,N,O;% - O=(2.5u,2.5u); - path cc; - cc=(fullcircle scaled 3u) shifted O; - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.1*length cc) of cc; - B=A rotatedabout(O,130); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - M=1.4[B,A]; - N=1.4[C,A]; - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; - cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; - cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; - cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; - for k=1 upto 6: - draw cotes[k]; - endfor; - pair I; - % On d\'efinit le centre du cercle inscrit \`a AMC - (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; - (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; - %on labelise - label(btex #1 etex,I); - label(btex #2 etex,1.2[M,B]); - label(btex #3 etex,1.2[N,C]); - label(btex #4 etex,1.1[B,M]); - label(btex #5 etex,1.1[C,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2); - \end{mplibcode} - \mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesThales]{Echelle};}] - pair A,B,C,M,N,O;% - O=(2.5u,2.5u); - path cc; - cc=(fullcircle scaled 3u) shifted O; - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=point(0.1*length cc) of cc; - B=A rotatedabout(O,130); - C=(A--2[A,B rotatedabout(A,45)]) intersectionpoint (B--2[B,A rotatedabout(B,-60)]); - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#6); - B:=B rotatedabout(O,#6); - C:=C rotatedabout(O,#6); - % on dessine \`a main lev\'ee :) - M=1.4[B,A]; - N=1.4[C,A]; - path cotes[]; - cotes1=A{dir(angle(B-A)+5)}..1.15[A,B]{dir(angle(B-A)+5)}; - cotes2=1.15[C,B]{dir(angle(C-B)+5)}..1.15[B,C]{dir(angle(C-B)+5)}; - cotes3=1.15[A,C]{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - cotes4=1.5[N,M]{dir(angle(N-M)+5)}..1.5[M,N]{dir(angle(N-M)+5)}; - cotes5=A{dir(angle(M-A)+5)}..1.15[A,M]{dir(angle(M-A)+5)}; - cotes6=A{dir(angle(N-A)+5)}..1.15[A,N]{dir(angle(N-A)+5)}; - for k=1 upto 6: - draw cotes[k]; - endfor; - pair I; - % On d\'efinit le centre du cercle inscrit \`a AMC - (I-C) rotated ((angle(A-C)-angle(M-C))/2) shifted C=whatever[A,C]; - (I-M) rotated ((angle(C-M)-angle(A-M))/2) shifted M=whatever[M,C]; - %on labelise - label(btex #1 etex,I); - label(btex #2 etex,1.2[M,B]); - label(btex #3 etex,1.2[N,C]); - label(btex #4 etex,1.1[B,M]); - label(btex #5 etex,1.1[C,N]); - fill (fullcircle scaled 0.75mm) shifted (cotes5 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes6 intersectionpoint cotes4); - fill (fullcircle scaled 0.75mm) shifted (cotes1 intersectionpoint cotes2); - fill (fullcircle scaled 0.75mm) shifted (cotes3 intersectionpoint cotes2); - \end{mpost} - \fi -} - -\newcommand\RedactionThales{}% -\newcommand\EcritureCalculs{}% -\newcommand\EcritureQuotients{}% - -%%% -\newcommand\TTThales[6][]{% - \useKVdefault[ClesThales]% - \setKV[ClesThales]{#1}% - \ifboolKV[ClesThales]{Perso}{\RedactionThales}{% - \ifboolKV[ClesThales]{Droites}{% - Les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#5)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#4#6)$} sont s\'ecantes en \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2$}.% - }{% - Dans le triangle \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$#2#3#4$}, \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#5$} est un point \ifboolKV[ClesThales]{Segment}{du segment}{de la - droite} - \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#3]$}{$(#2#3)$}}, - \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{$#6$} est un - point \ifboolKV[ClesThales]{Segment}{du segment}{de la droite} - \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{\ifboolKV[ClesThales]{Segment}{$[#2#4]$}{$(#2#4)$}}.% - } - \\Comme les droites \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#5#6)$} et \ifboolKV[ClesThales]{Remediation}{\pointilles[2cm]}{$(#3#4)$} sont parall\`eles, alors \ifboolKV[ClesThales]{Propor}{le tableau% - \[\begin{array}{c|c|c} - \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#5}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#6}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#5#6}\\ - \hline - \ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#3}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#2#4}&\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{#3#4}\\ - \end{array} - \] - est un tableau de proportionnalit\'e\ifboolKV[ClesThales]{Segment}{.}{ d'apr\`es le th\'eor\`eme de Thal\`es.}% - }{% - \ifboolKV[ClesThales]{Segment}{on a :}{le th\'eor\`eme de Thal\`es permet d'\'ecrire :}% - \[\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#2#5}}{#2#5}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#2#3}}{#2#3}}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#2#6}}{#2#6}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#2#4}}{#2#4}}}=\frac{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursNum}{\mathcolor{\useKV[ClesThales]{CouleurNum}}{#5#6}}{#5#6}}}{\ifboolKV[ClesThales]{Remediation}{\pointilles[1cm]}{\ifboolKV[ClesThales]{CouleursDen}{\mathcolor{\useKV[ClesThales]{CouleurDen}}{#3#4}}{#3#4}}}\]% - }% - }% -}% - -\newcommand\TThalesCalculsD[8][]{% - \setKV[ClesThales]{#1}% - \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire% - \def\Nomx{}% - \def\Nomy{}% - \def\Nomz{}% - \zzz=0\yyy=0\xxx=0% - \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par -\IfDecimal{#3}{% - \IfDecimal{#6}{}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \xxx=5263%#6&=\frac{#3\times#7}{#4}\\ - \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#7}{Valx}\opcopy{#4}{denox}% - \xdef\ResultatThalesx{\fpeval{round(#3*#7/#4,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] - \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}% - \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] - \edef\Nomx{#6}\opcopy{#3}{valx}\opcopy{#8}{Valx}\opcopy{#5}{denox}% - \xdef\ResultatThalesx{\fpeval{round(#3*#8/#5,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - } - }{% - \IfDecimal{#6}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]% - \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#4}{Valx}\opcopy{#7}{denox}% - \xdef\ResultatThalesx{\fpeval{round(#6*#4/#7,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 - \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\] - \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 - \edef\Nomx{#3}\opcopy{#6}{valx}\opcopy{#5}{Valx}\opcopy{#8}{denox}%\[#3=\frac{#6\times#5}{#8}\] - \xdef\ResultatThalesx{\fpeval{round(#6*#5/#8,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{} - }% - % - \IfDecimal{#4}{% - \IfDecimal{#7}{}{% - \IfDecimal{#5}{% - \IfDecimal{#8}{% - \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]% - \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#8}{Valy}\opcopy{#5}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#4*#8/#5,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] - \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] - \edef\Nomy{#7}\opcopy{#4}{valy}\opcopy{#6}{Valy}\opcopy{#3}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#4*#6/#3,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - } - }{% - \IfDecimal{#7}{% - \IfDecimal{#5}{% - \IfDecimal{#8}{% - \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]% - \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#5}{Valy}\opcopy{#8}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#7*#5/#8,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] - \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] - \edef\Nomy{#4}\opcopy{#7}{valy}\opcopy{#3}{Valy}\opcopy{#6}{denoy}% - \xdef\ResultatThalesy{\fpeval{round(#7*#3/#6,\useKV[ClesThales]{Precision})}}% - }{}}{} - }}{}}% - % - \IfDecimal{#5}{% - \IfDecimal{#8}{}{% - \IfDecimal{#4}{ - \IfDecimal{#7}{ - \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]% - \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#7}{Valz}\opcopy{#4}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#5*#7/#4,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] - \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] - \edef\Nomz{#8}\opcopy{#5}{valz}\opcopy{#6}{Valz}\opcopy{#3}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#5*#6/#3,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - } - }{% - \IfDecimal{#8}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]% - \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#4}{Valz}\opcopy{#7}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#8*#4/#7,\useKV[ClesThales]{Precision})}}% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] - \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] - \edef\Nomz{#5}\opcopy{#8}{valz}\opcopy{#3}{Valz}\opcopy{#6}{denoz}% - \xdef\ResultatThalesz{\fpeval{round(#8*#3/#6,\useKV[ClesThales]{Precision})}}% - }{}}{} - }}{} - }% - %% - \StrMid{\the\zzz}{1}{1}[\cmza]% - \StrMid{\the\yyy}{1}{1}[\cmya]% - \StrMid{\the\xxx}{1}{1}[\cmxa]% - \ifboolKV[ClesThales]{Calcul}{% - %%%%%%%%%%%%%%%%%%%%%%%%%%% - \ifboolKV[ClesThales]{IntroCalculs}{On remplace par les longueurs connues :}{}% - \ifboolKV[ClesThales]{CalculsPerso}{% - \EcritureQuotients% - }{% - \ifboolKV[ClesThales]{Propor}{% - \[\begin{array}{c|c|c} - \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\ - \hline - \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8} - \end{array} - \] - }{% - \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\] - }% - }% - % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs. - \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}% - \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}{}% - %% on fait les calculs - \ifboolKV[ClesThales]{CalculsPerso}{% - \EcritureCalculs% - }{% - \begin{align*} - % Premier compteur \xxx - \ifnum\cmxa>0 - \Nomx\uppercase{&}=\frac{\opexport{valx}{\valx}\num{\valx}\times\opexport{Valx}{\Valx}\num{\Valx}}{\opexport{denox}{\denox}\num{\denox}}\relax%\global\numx=\numexpr\opprint{valx}*\opprint{Valx}\relax - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \ifnum\cmxa=0 - \else - \uppercase{&} - \fi% - \Nomy\uppercase{&}=\frac{\opexport{valy}{\valy}\num{\valy}\times\opexport{Valy}{\Valy}\num{\Valy}}{\opexport{denoy}{\denoy}\num{\denoy}}\relax%\global\numy=\numexpr\opprint{valy}*\opprint{Valy}\relax - \fi - % Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \ifnum\cmxa=0 - \ifnum\cmya=0 - % - \else - \uppercase{&} - \fi - \Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax - \else - \uppercase{&}\Nomz\uppercase{&}=\frac{\opexport{valz}{\valz}\num{\valz}\times\opexport{Valz}{\Valz}\num{\Valz}}{\opexport{denoz}{\denoz}\num{\denoz}}\relax%\global\numz=\numexpr\opprint{valz}*\opprint{Valz}\relax - \fi - \fi - \\ -% % 2eme ligne du tableau : calcul des num\'erateurs -% %Premier compteur \xxx - \ifnum\cmxa>0 - \Nomx\uppercase{&}=\frac{\opmul*{valx}{Valx}{numx}\opexport{numx}{\numx}\num{\numx}}{\opexport{denox}{\denox}\num{\denox}} - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \ifnum\cmxa=0 - % - \else - \uppercase{&} - \fi - \Nomy\uppercase{&}=\frac{\opmul*{valy}{Valy}{numy}\opexport{numy}{\numy}\num{\numy}}{\opexport{denoy}{\denoy}\num{\denoy}}% - \fi -% %Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \ifnum\cmxa=0 - \ifnum\cmya=0 - % - \else - \uppercase{&} - \fi - \Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}} - \else - \uppercase{&}\Nomz\uppercase{&}=\frac{\opmul*{valz}{Valz}{numz}\opexport{numz}{\numz}\num{\numz}}{\opexport{denoz}{\denoz}\num{\denoz}} - \fi - \fi - \\ -% % 3eme ligne : Calculs - \ifnum\cmxa>0 - \Nomx\uppercase{&}\opdiv*{numx}{denox}{resultatx}{restex}\opcmp{restex}{0}\ifopeq=\SI{\ResultatThalesx}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesx,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \ifnum\cmxa=0 - % - \else - \uppercase{&} - \fi - \Nomy\uppercase{&}\opdiv*{numy}{denoy}{resultaty}{restey}\opcmp{restey}{0}\ifopeq=\SI{\ResultatThalesy}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesy,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% - \fi -% %Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \ifnum\cmxa=0 - \ifnum\cmya=0 - % - \else - \uppercase{&} - \fi - \Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% - \else - \uppercase{&}\Nomz\uppercase{&}\opdiv*{numz}{denoz}{resultatz}{restez}\opcmp{restez}{0}\ifopeq=\SI{\ResultatThalesz}{\PfCThalesUnit}\else\approx\SI{\fpeval{round(\ResultatThalesz,\useKV[ClesThales]{Precision})}}{\PfCThalesUnit}\fi% - \fi - \fi - \end{align*} - } -}{} -} - -\newcommand\TThalesCalculsE[8][]{% - \setKV[ClesThales]{#1}% - \newcount\zzz\newcount\yyy\newcount\xxx%Pour se rappeller des calculs \`a faire et combien en faire% - \newcount\valx\newcount\Valx% - \newcount\valy\newcount\Valy% - \newcount\valz\newcount\Valz% - \newcount\numx\newcount\numy\newcount\numz% - \newcount\denox\newcount\denoy\newcount\denoz% - \def\Nomx{}% - \def\Nomy{}% - \def\Nomz{}% - \zzz=0\yyy=0\xxx=0% - \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par% -\IfDecimal{#3}{% - \IfDecimal{#6}{}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \xxx=5263%#6&=\frac{#3\times#7}{#4}\\ - \edef\Nomx{#6}\valx=#3\Valx=#7\denox=#4% - }{% - \IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] - \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5% - }{}}{} - } - }{\IfDecimal{#8}{\IfDecimal{#5}{\xxx=5274%\[#6=\frac{#3\times#8}{#5}\] - \edef\Nomx{#6}\valx=#3\Valx=#8\denox=#5% - }{}}{} - } - } - }{% - \IfDecimal{#6}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \xxx=2536%\[#3=\frac{#6\times#4}{#7}\]% - \edef\Nomx{#3}\valx=#6\Valx=#4\denox=#7% - }{% - \IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 - \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\] - }{}}{} - } - }{\IfDecimal{#5}{\IfDecimal{#8}{\xxx=2547 - \edef\Nomx{#3}\valx=#6\Valx=#5\denox=#8%\[#3=\frac{#6\times#5}{#8}\] - }{}}{} - } - }{} - }% - % - \IfDecimal{#4}{% - \IfDecimal{#7}{}{% - \IfDecimal{#5}{% - \IfDecimal{#8}{% - \yyy=6374%\[#7=\frac{#4\times#8}{#5}\]% - \edef\Nomy{#7}\valy=#4\Valy=#8\denoy=#5% - }{% - \IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] - \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3% - }{}}{} - } - }{\IfDecimal{#6}{\IfDecimal{#3}{\yyy=6352%\[#7=\frac{#4\times#6}{#3}\] - \edef\Nomy{#7}\valy=#4\Valy=#6\denoy=#3% - }{}}{} - } - } - }{% - \IfDecimal{#7}{% - \IfDecimal{#5}{% - \IfDecimal{#8}{% - \yyy=3647%\[#4=\frac{#7\times#5}{#8}\]% - \edef\Nomy{#4}\valy=#7\Valy=#5\denoy=#8% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] - \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\yyy=3625%\[#4=\frac{#7\times#3}{#6}\] - \edef\Nomy{#4}\valy=#7\Valy=#3\denoy=#6% - }{}}{} - }}{}}% - % - \IfDecimal{#5}{% - \IfDecimal{#8}{}{% - \IfDecimal{#4}{ - \IfDecimal{#7}{ - \zzz=7463%\[#8=\frac{#5\times#7}{#4}\]% - \edef\Nomz{#8}\valz=#5\Valz=#7\denoz=#4% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] - \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=7452%\[#8=\frac{#5\times#6}{#3}\] - \edef\Nomz{#8}\valz=#5\Valz=#6\denoz=#3% - }{}}{} - } - } - }{% - \IfDecimal{#8}{% - \IfDecimal{#4}{% - \IfDecimal{#7}{% - \zzz=4736% \[#5=\frac{#8\times#4}{#7}\]% - \edef\Nomz{#5}\valz=#8\Valz=#4\denoz=#7% - }{% - \IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] - \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6% - }{}}{} - } - }{\IfDecimal{#3}{\IfDecimal{#6}{\zzz=4725%\[#5=\frac{#8\times#3}{#6}\] - \edef\Nomz{#5}\valz=#8\Valz=#3\denoz=#6% - }{}}{} - }}{} - }% - %% -\StrMid{\the\zzz}{1}{1}[\cmza]% -\StrMid{\the\yyy}{1}{1}[\cmya]% -\StrMid{\the\xxx}{1}{1}[\cmxa]% -\ifboolKV[ClesThales]{Calcul}{% - %%%%%%%%%%%%%%%%%%%%%%%%%%% - On remplace par les longueurs connues : - \ifboolKV[ClesThales]{Propor}{% - \[\begin{array}{c|c|c} - \IfDecimal{#3}{\num{#3}}{#3}&\IfDecimal{#4}{\num{#4}}{#4}&\IfDecimal{#5}{\num{#5}}{#5}\\ - \hline - \IfDecimal{#6}{\num{#6}}{#6}&\IfDecimal{#7}{\num{#7}}{#7}&\IfDecimal{#8}{\num{#8}}{#8}\\ - \end{array} - \] - }{% - \[\frac{\IfDecimal{#3}{\num{#3}}{#3}}{\IfDecimal{#6}{\num{#6}}{#6}}=\frac{\IfDecimal{#4}{\num{#4}}{#4}}{\IfDecimal{#7}{\num{#7}}{#7}}=\frac{\IfDecimal{#5}{\num{#5}}{#5}}{\IfDecimal{#8}{\num{#8}}{#8}}\] - }% - % On choisit \'eventuellement le calcul \`a faire s'il y en a plusieurs. - \xdef\CompteurCalcul{\useKV[ClesThales]{ChoixCalcul}}% - \xintifboolexpr{\CompteurCalcul>0}{\xintifboolexpr{\CompteurCalcul==1}{\xdef\cmya{0}\xdef\cmza{0}}{\xintifboolexpr{\CompteurCalcul==2}{\xdef\cmxa{0}\xdef\cmza{0}}{\xdef\cmxa{0}\xdef\cmya{0}}}}% - %%on fait les calculs -\begin{align*} - %Premier compteur \xxx - \ifnum\cmxa>0 - \Nomx\uppercase{&}=\frac{\the\valx\times\the\Valx}{\the\denox}\global\numx=\numexpr\the\valx*\the\Valx\relax - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \ifnum\cmxa=0 - \else - \uppercase{&} - \fi% - \Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax - % \else - % \uppercase{&}\Nomy\uppercase{&}=\frac{\the\valy\times\the\Valy}{\the\denoy}\global\numy=\numexpr\the\valy*\the\Valy\relax - % \fi - \fi - % Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \ifnum\cmxa=0 - \ifnum\cmya=0 - %\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax - \else - \uppercase{&}%\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax - \fi - \Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax - \else - \uppercase{&}\Nomz\uppercase{&}=\frac{\the\valz\times\the\Valz}{\the\denoz}\global\numz=\numexpr\the\valz*\the\Valz\relax - \fi - \fi - \\ - % 2eme ligne du tableau : calcul des num\'erateurs - %Premier compteur \xxx - \ifnum\cmxa>0 - \Nomx\uppercase{&}=\frac{\num{\the\numx}}{\num{\the\denox}} - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \ifnum\cmxa=0 - %\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}} - \else - \uppercase{&}%\Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}} - \fi - \Nomy\uppercase{&}=\frac{\num{\the\numy}}{\num{\the\denoy}}% - \fi - %Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \ifnum\cmxa=0 - \ifnum\cmya=0 - %\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} - \else - \uppercase{&}%\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} - \fi - \Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} - \else - \uppercase{&}\Nomz\uppercase{&}=\frac{\num{\the\numz}}{\num{\the\denoz}} - \fi - \fi - \\ - % 3eme ligne : faire les simplifications ou pas ? - %Premier compteur \xxx - \ifnum\cmxa>0 - \PGCD{\the\numx}{\the\denox} - \ifnum\pgcd>1 - \Nomx\uppercase{&}=\SSimpli{\the\numx}{\the\denox} - \else - \uppercase{&} - \fi - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \PGCD{\the\numy}{\the\denoy} - \ifnum\cmxa=0 - \ifnum\pgcd>1 - \Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy} - \else - \uppercase{&} - \fi - \else - \ifnum\pgcd>1 - \uppercase{&}\Nomy\uppercase{&}=\SSimpli{\the\numy}{\the\denoy} - \else - \uppercase{&&} - \fi - \fi - \fi - %Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \PGCD{\the\numz}{\the\denoz} - \ifnum\cmxa=0 - \ifnum\cmya=0 - \ifnum\pgcd>1 - \Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} - \else - \uppercase{&} - \fi - \else - \ifnum\pgcd>1 - \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} - \else - \uppercase{&&} - \fi - \fi - \else - \ifnum\pgcd>1 - \uppercase{&}\Nomz\uppercase{&}=\SSimpli{\the\numz}{\the\denoz} - \else - \uppercase{&&} - \fi - \fi - \fi - \\ - % 4eme ligne : Terminer les simplifications ? - %Premier compteur \xxx - \ifnum\cmxa>0 - \PGCD{\the\numx}{\the\denox} - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denox - \Nomx\uppercase{&}=\SSimplifie{\the\numx}{\the\denox} - \else - \uppercase{&} - \fi - \else - \uppercase{&} - \fi - \fi - % % Deuxi\`eme compteur \yyy - \ifnum\cmya>0 - \PGCD{\the\numy}{\the\denoy} - \ifnum\cmxa=0 - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denoy - \Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy} - \else - \uppercase{&} - \fi - \else - \uppercase{&} - \fi - \else - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denoy - \uppercase{&}\Nomy\uppercase{&}=\SSimplifie{\the\numy}{\the\denoy} - \else - \uppercase{&&} - \fi - \else - \uppercase{&&} - \fi - \fi - \fi - %Troisi\`eme compteur \zzz - \ifnum\cmza>0 - \PGCD{\the\numz}{\the\denoz} - \ifnum\cmxa=0 - \ifnum\cmya=0 - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denoz - \Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} - \else - \uppercase{&} - \fi - \else - \uppercase{&} - \fi - \else - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denoz - \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} - \else - \uppercase{&&} - \fi - \else - \uppercase{&&} - \fi - \fi - \else - \ifnum\pgcd>1 - \ifnum\pgcd<\the\denoz - \uppercase{&}\Nomz\uppercase{&}=\SSimplifie{\the\numz}{\the\denoz} - \else - \uppercase{&&} - \fi - \else - \uppercase{&&} - \fi - \fi - \fi%\\ -\end{align*} -}{}% -} - -\newcommand\TThales[8][]{% - \setKV[ClesThales]{#1}% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \ifboolKV[ClesThales]{FigureSeule}{% - \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{% - \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{% - \ifboolKV[ClesThales]{Figure}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \begin{multicols}{2}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% - \par\columnbreak\par% - \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% - \end{multicols}% - }{\ifboolKV[ClesThales]{Figurecroisee}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \begin{multicols}{2}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% - \par\columnbreak\par% - \ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}% - \end{multicols}% - }{\ifboolKV[ClesThales]{Entier}{\TThalesCalculsE[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}{\TThalesCalculsD[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}% - }% - }% - }% -}% -%%%% - -\newcommand\ReciThales[6][]{% - \ifboolKV[ClesThales]{Droites}{% - Les droites $(#3#5)$ et $(#4#6)$ sont s\'ecantes en $#2$. - }{% - Dans le triangle $#2#3#4$, $#5$ est un point - \ifboolKV[ClesThales]{Segment}{du segment $[#2#3]$}{de la - droite $(#2#3)$}, $#6$ est un point - \ifboolKV[ClesThales]{Segment}{du segment $[#2#4]$}{de la droite - $(#2#4)$}. - } % - \ifboolKV[ClesThales]{Propor}{Le tableau $\begin{array}{c|c} - #2#5#6\\ - \hline - #2#3#4\\ - \end{array} - $ est-il un tableau de proportionnalit\'e ? - }{% - } -} - -\newcommand\ReciThalesCalculs[8][]{% - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - \StrMid{#2}{4}{4}[\NomM]% - \StrMid{#2}{5}{5}[\NomN]% - \ifboolKV[ClesThales]{Produit}{% - \begin{align*} - \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}&&\dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}} - \end{align*} - Effectuons les produits en croix :\xdef\NumA{\fpeval{#3*#6}}\xdef\NumB{\fpeval{#4*#5}} - \begin{align*} - \num{#3}\times\num{#6}&=\num{\fpeval{#3*#6}}&&&\num{#4}\times\num{#5}&=\num{\fpeval{#4*#5}} - \end{align*} - \xintifboolexpr{\NumA == \NumB}{Comme les produits en croix sont - \'egaux, alors - $\dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\[0.5em]% - }{% - Comme les produits en croix sont diff\'erents, alors - $\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}$.\\% - }% - }{% - \[\left. - \begin{array}{l} - \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\num{#3}}{\num{#4}}\ifx\bla#7\bla\ifboolKV[ClesThales]{Simplification}{\PGCD{#3}{#4}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM... - \PGCD{#5}{#6}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#6/\pgcd}}\PPCM{#4}{\DenomSimpaa}\xintifboolexpr{\ppcm==#4}{}{=\dfrac{#3\times\num{\fpeval{\ppcm/#4}}}{#4\times\num{\fpeval{\ppcm/#4}}}=\dfrac{\num{\fpeval{#3*\ppcm/#4}}}{\num{\fpeval{\ppcm}}}}}{}% - }{=\displaystyle\Simplification[All]{#3}{#4}\PGCD{#3}{#4}\xdef\NumSimp{\fpeval{#3/\pgcd}}\xdef\DenomSimp{\fpeval{#4/\pgcd}}\PGCD{#5}{#6}\xdef\NumSimpa{\fpeval{#5/\pgcd}}\xdef\DenomSimpa{\fpeval{#6/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#4}==1}{}{=\dfrac{\num{#3}\times\num{\fpeval{\the\ppcm/#4}}}{\num{#4}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#4}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#3*\the\ppcm/#4}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#6}}\else% - \xintifboolexpr{#7==1}{}{=\dfrac{\num{#3}\times\num{#7}}{\num{#4}\times\num{#7}}=\dfrac{\num{\fpeval{#3*#7}}}{\num{\fpeval{#4*#7}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#4*#7}}{}{=\dfrac{\num{\fpeval{#3*#7}}\times\num{\fpeval{\the\ppcm/(#4*#7)}}}{\num{\fpeval{#4*#7}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#4*#7)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#3*\the\ppcm/#4}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}}}\xdef\NumA{\fpeval{#3*#7*#6*#8}} - \fi - \\ - \\ - \dfrac{\NomA\NomN}{\NomA\NomC}=\dfrac{\num{#5}}{\num{#6}}% - \ifx\bla#8\bla% - \ifboolKV[ClesThales]{Simplification}{\PGCD{#5}{#6}\xintifboolexpr{\pgcd==1}{%il faut regarder si on doit continuer avec le PPCM... - \PGCD{#3}{#4}\xintifboolexpr{\pgcd>1}{\xdef\DenomSimpaa{\fpeval{#4/\pgcd}}\PPCM{#6}{\DenomSimpaa}\xintifboolexpr{\ppcm==#6}{}{=\dfrac{#5\times\num{\fpeval{\ppcm/#6}}}{#6\times\num{\fpeval{\ppcm/#6}}}=\dfrac{\num{\fpeval{#5*\ppcm/#6}}}{\num{\fpeval{\ppcm}}}}}{}% - }{=\displaystyle\Simplification[All]{#5}{#6}\PGCD{#5}{#6}\xdef\NumSimp{\fpeval{#5/\pgcd}}\xdef\DenomSimp{\fpeval{#6/\pgcd}}\PGCD{#3}{#4}\xdef\NumSimpa{\fpeval{#3/\pgcd}}\xdef\DenomSimpa{\fpeval{#4/\pgcd}}\PPCM{\DenomSimp}{\DenomSimpa}\xintifboolexpr{\fpeval{\the\ppcm/\DenomSimp}==1}{}{=\dfrac{\num{\NumSimp}\times\num{\fpeval{\the\ppcm/\DenomSimp}}}{\num{\DenomSimp}\times\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\the\ppcm/\DenomSimp}}}=\dfrac{\PPCM{\DenomSimp}{\DenomSimpa}\num{\fpeval{\NumSimp*\the\ppcm/\DenomSimp}}}{\PPCM{\DenomSimp}{\DenomSimpa}\num{\the\ppcm}}}}}{\PPCM{#4}{#6}\xintifboolexpr{\fpeval{\the\ppcm/#6}==1}{}{=\dfrac{\num{#5}\times\num{\fpeval{\the\ppcm/#6}}}{\num{#6}\times\PPCM{#4}{#6}\num{\fpeval{\the\ppcm/#6}}}=\dfrac{\PPCM{#4}{#6}\num{\fpeval{#5*\the\ppcm/#6}}}{\PPCM{#4}{#6}\num{\the\ppcm}}}}\xdef\NumB{\fpeval{#5*#4}}% - \else% - \xintifboolexpr{#8==1}{}{=\dfrac{\num{#5}\times\num{#8}}{\num{#6}\times\num{#8}}=\dfrac{\num{\fpeval{#5*#8}}}{\num{\fpeval{#6*#8}}}}\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\xintifboolexpr{\the\ppcm==\fpeval{#6*#8}}{}{=\dfrac{\num{\fpeval{#5*#8}}\times\num{\fpeval{\the\ppcm/(#6*#8)}}}{\num{\fpeval{#6*#8}}\times\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm/(#6*#8)}}}=\dfrac{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{#5*\the\ppcm/#6}}}{\xdef\NumC{\fpeval{#4*#7}}\xdef\NumD{\fpeval{#6*#8}}\PPCM{\NumC}{\NumD}\num{\fpeval{\the\ppcm}}} - }\xdef\NumB{\fpeval{#5*#8*#4*#7}} - \fi\\ - \end{array} - \right\}\ifnum\NumA=\NumB \dfrac{\NomA\NomM}{\NomA\NomB}=\dfrac{\NomA\NomN}{\NomA\NomC}\else\dfrac{\NomA\NomM}{\NomA\NomB}\not=\dfrac{\NomA\NomN}{\NomA\NomC}\fi - \] - } - \ifboolKV[ClesThales]{Propor}{% - \ifnum\NumA=\NumB Donc le tableau $\begin{array}{c|c} - \NomA\NomM&\NomA\NomN\\ - \hline - \NomA\NomB&\NomA\NomC\\ - \end{array} - $ est bien un tableau de proportionnalit\'e.\\De plus, les points - $\NomA$, $\NomM$, $\NomB$ sont align\'es dans le m\^eme ordre que les - points $\NomA$, $\NomN$, $\NomC$. Donc les droites $(\NomM\NomN)$ - et $(\NomB\NomC)$ sont parall\`eles d'apr\`es la r\'eciproque du - th\'eor\`eme de Thal\`es.\else% - Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas parall\`eles.\fi - }{% - \xintifboolexpr{\NumA==\NumB}{% - De plus, les points $\NomA$, $\NomM$, $\NomB$ sont align\'es dans - le m\^eme ordre que les points $\NomA$, $\NomN$, $\NomC$. Donc les - droites $(\NomM\NomN)$ et $(\NomB\NomC)$ sont parall\`eles d'apr\`es - la r\'eciproque du th\'eor\`eme de Thal\`es.}{% - Donc les droites $(\NomM\NomN)$ et $(\NomB\NomC)$ ne sont pas - parall\`eles.} - } -} - -\newcommand\ReciproqueThales[8][]{% - % #1 Cl\'es - % #2 NomTriangle + Points ABCEF pour droite (BC)//(EF) - % #3 longueur AE - % #4 longueur AB - % #5 longueur AF - % #6 longueur AC - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \ifboolKV[ClesThales]{FigureSeule}{% -% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{\ifboolKV[ClesThales]{FigurecroiseeSeule}{% -% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{% - \ifboolKV[ClesThales]{Figure}{% -% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \begin{multicols}{2} - {\em La figure est donn\'ee \`a titre indicatif.} - \[\MPFigReciThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\] - \par\columnbreak\par - \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par - \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8} - \end{multicols} - }{\ifboolKV[ClesThales]{Figurecroisee}{% -% \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN] - \begin{minipage}{0.4\linewidth}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigReciThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% - \end{minipage} - \hfill - \begin{minipage}{0.55\linewidth}% - \ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par - \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - \end{minipage}% - }{\ReciThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}\par - \ReciThalesCalculs[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - }% - }% - }% - }% -}% - -\newcommand\Thales[8][]{% - \useKVdefault[ClesThales]% - \setKV[ClesThales]{#1}% - %Définir les points pour une utilisation perso - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \xdef\NomPointA{\NomA}% - \xdef\NomPointB{\NomB}% - \xdef\NomPointC{\NomC}% - \xdef\NomTriangle{\NomA\NomB\NomC}% - \xdef\NomPointM{\NomM}% - \xdef\NomPointN{\NomN}% - % - \ifboolKV[ClesThales]{Reciproque}{% - \ReciproqueThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - }{% - \ifboolKV[ClesThales]{FigureSeule}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{% - \ifboolKV[ClesThales]{FigurecroiseeSeule}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}% - }{% - \ifboolKV[ClesThales]{Redaction}{% - \ifboolKV[ClesThales]{Figure}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \begin{multicols}{2} - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigThales{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% - \par\columnbreak\par% - \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% - \end{multicols}% - }{% - \ifboolKV[ClesThales]{Figurecroisee}{% - \StrMid{#2}{1}{1}[\NomA]\StrMid{#2}{2}{2}[\NomB]\StrMid{#2}{3}{3}[\NomC]\StrMid{#2}{4}{4}[\NomM]\StrMid{#2}{5}{5}[\NomN]% - \begin{multicols}{2} - {\em La figure est donn\'ee \`a titre indicatif.}% - \[\MPFigThalesCroisee{\NomA}{\NomB}{\NomC}{\NomM}{\NomN}{\useKV[ClesThales]{Angle}}\]% - \par\columnbreak\par% - \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% - \end{multicols} - }{% - \TTThales[#1]{\StrMid{#2}{1}{1}}{\StrMid{#2}{2}{2}}{\StrMid{#2}{3}{3}}{\StrMid{#2}{4}{4}}{\StrMid{#2}{5}{5}}% - } - } - }{% - \TThales[#1]{#2}{#3}{#4}{#5}{#6}{#7}{#8}% - }% - }% - }% - }% -}% - -%%% -% Trigonom\'etrie -%%% -\def\MPFigTrigo#1#2#3#4#5#6#7#8{% - \ifluatex - \mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesTrigo]{Echelle}; - pair A,B,C,O,I,D,E,F;% - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(3,0); - C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#8); - B:=B rotatedabout(O,#8); - C:=C rotatedabout(O,#8); - % On d\'efinit le centre du cercle inscrit - (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; - (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; - % on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - % on d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; - % L'angle :) - path cc; - cc=fullcircle scaled 1u; - % on marque les angles - picture MAngle; - MAngle=image( - draw (cc shifted A); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - % on labelise - picture z; - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex \ang{#7} etex,A+0.95u*unitvector(I-A)); - decalage:=3mm; - if #6<0: - else: - if angle(1/2[A,C]-B)>0: - if #6=0: - label(btex ? etex,1.1[B,1/2[A,C]]); - else: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - fi; - else: - if #6=0: - label(btex ? etex,1.1[B,1/2[A,C]]); - else: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - fi; - fi; - fi; - if #4<0: - else: - if angle(1/2[B,C]-A)>0: - if #4=0: - label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - fi; - else: - if #4=0: - label(btex ? etex,1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - fi; - fi; - fi; - if #5<0: - else: - if angle(1/2[A,B]-C)>0: - if #5=0: - label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - else: - if #5=0: - label(btex ? etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; - fi; - \end{mplibcode} - \mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}] - pair A,B,C,O,I,D,E,F;% - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(3,0); - C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#8); - B:=B rotatedabout(O,#8); - C:=C rotatedabout(O,#8); - % On d\'efinit le centre du cercle inscrit - (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; - (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; - % on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - % on d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; - % L'angle :) - path cc; - cc=fullcircle scaled 1u; - % on marque les angles - picture MAngle; - MAngle=image( - draw (cc shifted A); - % draw (cc shifted B); - % draw (cc shifted C); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - % on labelise - picture z; - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex \ang{#7} etex,A+0.95u*unitvector(I-A)); - decalage:=3mm; - if #6<0: - else: - if angle(1/2[A,C]-B)>0: - if #6=0: - label(btex ? etex rotated angle(C-A),1.1[B,1/2[A,C]]); - else: - label(btex \num{#6} etex rotated angle(C-A),1.2[B,1/2[A,C]]); - fi; - else: - if #6=0: - label(btex ? etex rotated angle(A-C),1.1[B,1/2[A,C]]); - else: - label(btex \num{#6} etex rotated angle(A-C),1.2[B,1/2[A,C]]); - fi; - fi; - fi; - if #4<0: - else: - if angle(1/2[B,C]-A)>0: - if #4=0: - label(btex ? etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex rotated(angle(B-C)),1/2[B,C]-decalage*(unitvector(A-B))); - fi; - else: - if #4=0: - label(btex ? etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex rotated(angle(C-B)),1/2[B,C]-decalage*(unitvector(A-B))); - fi; - fi; - fi; - if #5<0: - else: - if angle(1/2[A,B]-C)>0: - if #5=0: - label(btex ? etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex rotated angle(A-B),1/2[A,B]-decalage*(unitvector(C-B))); - fi; - else: - if #5=0: - label(btex ? etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex rotated angle(B-A),1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; - fi; -\end{mpost} -\fi -} - -\def\MPFigTrigoAngle#1#2#3#4#5#6#7{% - % #1 A - % #2 B - % #3 C - % #4 opp - % #5 adj - % #6 hyp - % #7 angle de rotation - \ifluatex - \mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesTrigo]{Echelle}; - pair A,B,C,O,I,D,E,F;% - % On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(3,0); - C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#7); - B:=B rotatedabout(O,#7); - C:=C rotatedabout(O,#7); - % On d\'efinit le centre du cercle inscrit - (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; - (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; - %on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - %on d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; - %L'angle :) - path cc; - cc=fullcircle scaled 1u; - % on marque les angles - picture MAngle; - MAngle=image( - draw (cc shifted A); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - % on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex ? etex,A+0.95u*unitvector(I-A)); - decalage:=3mm; - if #6>0: - if angle(1/2[A,C]-B)>0: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - else: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - fi; - fi; - if #4>0: - if angle(1/2[B,C]-A)>0: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - fi; - fi; - if #5>0: - if angle(1/2[A,B]-C)>0: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; -\end{mplibcode} -\mplibcodeinherit{disable} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesTrigo]{Echelle};}] - u:=1cm; - pair A,B,C,O,I,D,E,F;% - %On place les points A,B,C sur le cercle de mani\`ere \`a faciliter la rotation de la figure - A=u*(1,1); - B-A=u*(3,0); - C=(A--2[A,B rotatedabout(A,50)]) intersectionpoint (B--2[B,A rotatedabout(B,-90)]); - % On d\'efinit le centre du cercle circonscrit - O - .5[A,B] = whatever * (B-A) rotated 90; - O - .5[B,C] = whatever * (C-B) rotated 90; - % On tourne pour \'eventuellement moins de lassitude :) - A:=A rotatedabout(O,#7); - B:=B rotatedabout(O,#7); - C:=C rotatedabout(O,#7); - % On d\'efinit le centre du cercle inscrit - (I-C) rotated ((angle(A-C)-angle(B-C))/2) shifted C=whatever[A,C]; - (I-B) rotated ((angle(C-B)-angle(A-B))/2) shifted B=whatever[B,C]; - %on dessine \`a main lev\'ee :) - path triangle; - triangle=A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}--B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}--C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}--cycle; - %on d\'efinit l'angle droit - D-B=7*unitvector(C-B); - F-B=7*unitvector(A-B); - E-D=F-B; - draw D{dir(angle(E-D)+5)}..E{dir(angle(E-D)+5)}--E{dir(angle(F-E)+5)}..F{dir(angle(F-E)+5)}; - %L'angle :) - path cc; - cc=fullcircle scaled 1u; - % on marque les angles - picture MAngle; - MAngle=image( - draw (cc shifted A); - ); - draw MAngle; - clip currentpicture to triangle; - draw A{dir(angle(B-A)+5)}..B{dir(angle(B-A)+5)}; - draw B{dir(angle(C-B)+5)}..C{dir(angle(C-B)+5)}; - draw C{dir(angle(A-C)+5)}..A{dir(angle(A-C)+5)}; - %on labelise - label(btex #1 etex,1.15[O,A]); - label(btex #2 etex,1.15[O,B]); - label(btex #3 etex,1.15[O,C]); - label(btex ? etex,A+0.95u*unitvector(I-A)); - decalage:=3mm; - if #6>0: - if angle(1/2[A,C]-B)>0: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - else: - label(btex \num{#6} etex,1.2[B,1/2[A,C]]); - fi; - fi; - if #4>0: - if angle(1/2[B,C]-A)>0: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - else: - label(btex \num{#4} etex,1/2[B,C]-decalage*(unitvector(A-B))); - fi; - fi; - if #5>0: - if angle(1/2[A,B]-C)>0: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - else: - label(btex \num{#5} etex,1/2[A,B]-decalage*(unitvector(C-B))); - fi; - fi; -\end{mpost} -\fi -} - -\setKVdefault[ClesTrigo]{Angle=0,Propor=false,Figure=false,FigureSeule=false,ValeurExacte=false,Precision=2,Unite=cm,Sinus=false,Cosinus=false,Tangente=false,Perso=false,Echelle=1cm}% - -\newcommand\RedactionTrigo{}% - -\newcommand\TrigoCalculs[5][]{% - \setKV[ClesTrigo]{#1}% - % #1 Cl\'es - % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC - % #3 Longueur #4 Longueur #5 angle - % On d\'efinit les points - \DeclareSIUnit{\PfCTrigoUnit}{\useKV[ClesTrigo]{Unite}}% - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - \xdef\NomTriangle{\NomA\NomB\NomC}% - \xdef\NomAngleDroit{\NomB}% - \xdef\NomSommetA{\NomA}% - \xdef\NomSommetB{\NomB}% - \xdef\NomSommetC{\NomC}% - \ifboolKV[ClesTrigo]{Perso}{% - \RedactionTrigo% - }{% - Dans le triangle $\NomA\NomB\NomC$, rectangle en $\NomB$, on a :% - }% - \ifboolKV[ClesTrigo]{Cosinus}{% - \ifx\bla#3\bla%on calcule le c\^ot\'e adjacent - \xdef\ResultatTrigo{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ - \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\ - \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB} - \end{align*}% - }{% - \begin{align*} - \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ - \cos(\ang{#5})&=\frac{\NomA\NomB}{\num{#4}}\\ - \num{#4}\times\cos(\ang{#5})&=\NomA\NomB%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \SI{\fpeval{round(#4*cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*cosd(#5),9)}}{=}{\approx}\NomA\NomB}% - \end{align*} - }% - \else% - \ifx\bla#4\bla%on calcule l'hypoth\'enuse - \xdef\ResultatTrigo{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ - \NomA\NomC\times\cos(\ang{#5})&=\num{#3}\\ - \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*} - }{% - \begin{align*} - \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ - \cos(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\ - \NomA\NomC&=\frac{\num{#3}}{\cos(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomC&\IfInteger{\fpeval{round(#3/cosd(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/cosd(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*}% - }% - \else%on calcule l'angle - \xdef\ResultatTrigo{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \setKV[ClesTrigo]{Precision=0}% - \setKV[ClesTrigo]{#1}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\cos(\widehat{\NomB\NomA\NomC})&=\NomA\NomB\\ - \num{#4}\times\cos(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ - \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }{% - \begin{align*} - \cos(\widehat{\NomB\NomA\NomC})&=\frac{\NomA\NomB}{\NomA\NomC}\\ - \cos(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(acosd(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(acosd(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }% - \fi% - \fi% - }{}% - \ifboolKV[ClesTrigo]{Sinus}{% - \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e - \xdef\ResultatTrigo{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ - \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}% - \end{align*}% - }{% - \begin{align*} - \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ - \sin(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\ - \num{#4}\times\sin(\ang{#5})&=\NomB\NomC%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \SI{\fpeval{round(#4*sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*sind(#5),9)}}{=}{\approx}\NomB\NomC}% - \end{align*}% - }% - \else - \ifx\bla#4\bla%on calcule l'hypoth\'enuse - \xdef\ResultatTrigo{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ - \NomA\NomC\times\sin(\ang{#5})&=\num{#3}\\ - \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*}% - }{% - \begin{align*} - \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ - \sin(\ang{#5})&=\frac{\num{#3}}{\NomA\NomC}\\ - \NomA\NomC&=\frac{\num{#3}}{\sin(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomC&\IfInteger{\fpeval{round(#3/sind(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/sind(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*}% - }% - \else%on calcule l'angle - \xdef\ResultatTrigo{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \setKV[ClesTrigo]{Precision=0}% - \setKV[ClesTrigo]{#1}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomC\times\sin(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ - \num{#4}\times\sin(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ - \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }{% - \begin{align*} - \sin(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomC}\\ - \sin(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(asind(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(asind(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }% - \fi% - \fi% - }{}% - \ifboolKV[ClesTrigo]{Tangente}{% - \ifx\bla#3\bla%on calcule le c\^ot\'e oppos\'e - \xdef\ResultatTrigo{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\% - \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\% - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}% - \end{align*}% - }{% - \begin{align*} - \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ - \tan(\ang{#5})&=\frac{\NomB\NomC}{\num{#4}}\\ - \num{#4}\times\tan(\ang{#5})&=\NomB\NomC%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \SI{\fpeval{round(#4*tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}&\IfInteger{\fpeval{round(#4*tand(#5),9)}}{=}{\approx}\NomB\NomC}% - \end{align*}% - }% - \else - \ifx\bla#4\bla%on calcule l'adjacent - \xdef\ResultatTrigo{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ - \NomA\NomB\times\tan(\ang{#5})&=\num{#3}\\ - \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*}% - }{% - \begin{align*} - \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ - \tan(\ang{#5})&=\frac{\num{#3}}{\NomA\NomB}\\ - \NomA\NomB&=\frac{\num{#3}}{\tan(\ang{#5})}%\\ - \ifboolKV[ClesTrigo]{ValeurExacte}{}{\\% - \NomA\NomB&\IfInteger{\fpeval{round(#3/tand(#5),9)}}{=}{\approx}\SI{\fpeval{round(#3/tand(#5),\useKV[ClesTrigo]{Precision})}}{\PfCTrigoUnit}}% - \end{align*}% - }% - \else%on calcule l'angle - \setKV[ClesTrigo]{Precision=0}% - \setKV[ClesTrigo]{#1}% - \xdef\ResultatTrigo{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \ifboolKV[ClesTrigo]{Propor}{% - \begin{align*} - \NomA\NomB\times\tan(\widehat{\NomB\NomA\NomC})&=\NomB\NomC\\ - \num{#4}\times\tan(\widehat{\NomB\NomA\NomC})&=\num{#3}\\ - \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }{% - \begin{align*} - \tan(\widehat{\NomB\NomA\NomC})&=\frac{\NomB\NomC}{\NomA\NomB}\\ - \tan(\widehat{\NomB\NomA\NomC})&=\frac{\num{#3}}{\num{#4}}\\ - \widehat{\NomB\NomA\NomC}&\IfInteger{\fpeval{round(atand(#3/#4),9)}}{=}{\approx}\ang{\fpeval{round(atand(#3/#4),\useKV[ClesTrigo]{Precision})}}% - \end{align*}% - }% - \fi% - \fi% - }{}% -}% - -\newcommand\Trigo[5][]{% - \useKVdefault[ClesTrigo]% - \setKV[ClesTrigo]{#1}% - % #1 Cl\'es - % #2 Nom du triangle ABC, rectangle en B, angle connu ou pas : BAC - % #3 Longueur #4 Longueur #5 angle - % On d\'efinit les points - \StrMid{#2}{1}{1}[\NomA]% - \StrMid{#2}{2}{2}[\NomB]% - \StrMid{#2}{3}{3}[\NomC]% - % On r\'edige - \ifboolKV[ClesTrigo]{FigureSeule}{% - \ifx\bla#5\bla% - \ifboolKV[ClesTrigo]{Cosinus}{% - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}} - }{}% - \ifboolKV[ClesTrigo]{Sinus}{% - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}} - }{}% - \ifboolKV[ClesTrigo]{Tangente}{% - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}} - }{}% - \else%}{%figure pour calculer une longueur - \ifboolKV[ClesTrigo]{Cosinus}{% - \ifx\bla#3\bla%adjacent inconnu - \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}} - \else - \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}} - \fi - }{}% - \ifboolKV[ClesTrigo]{Sinus}{% - \ifx\bla#3\bla%adjacent inconnu - \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}} - \else - \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}} - \fi - }{}% - \ifboolKV[ClesTrigo]{Tangente}{% - \ifx\bla#3\bla%adjacent inconnu - \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}} - \else% - \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}} - \fi% - }{}% - \fi% - }{% - \ifboolKV[ClesTrigo]{Figure}{% - \begin{multicols}{2}% - {\em La figure est donn\'ee \`a titre indicatif.}% - \ifx\bla#5\bla% - \ifboolKV[ClesTrigo]{Cosinus}{% - \begin{center} - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{-1}{#3}{#4}{\useKV[ClesTrigo]{Angle}} - \end{center} - }{}% - \ifboolKV[ClesTrigo]{Sinus}{% - \begin{center} - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{-1}{#4}{\useKV[ClesTrigo]{Angle}} - \end{center} - }{}% - \ifboolKV[ClesTrigo]{Tangente}{% - \begin{center} - \MPFigTrigoAngle{\NomA}{\NomB}{\NomC}{#3}{#4}{-1}{\useKV[ClesTrigo]{Angle}} - \end{center} - }{}% - \else%}{%figure pour calculer une longueur - \ifboolKV[ClesTrigo]{Cosinus}{% - \ifx\bla#3\bla%adjacent inconnu - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{0}{#4}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \else - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{-1}{#3}{0}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \fi - }{}% - \ifboolKV[ClesTrigo]{Sinus}{% - \ifx\bla#3\bla%adjacent inconnu - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{-1}{#4}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \else - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{-1}{0}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \fi - }{}% - \ifboolKV[ClesTrigo]{Tangente}{% - \ifx\bla#3\bla%adjacent inconnu - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{0}{#4}{-1}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \else% - \begin{center} - \MPFigTrigo{\NomA}{\NomB}{\NomC}{#3}{0}{-1}{#5}{\useKV[ClesTrigo]{Angle}} - \end{center} - \fi% - }{}% - \fi% - \par\columnbreak\par - \TrigoCalculs[#1]{#2}{#3}{#4}{#5}% - \end{multicols} - }{% - \TrigoCalculs[#1]{#2}{#3}{#4}{#5}% - }% - }% -}% - -%%% -% Statistiques -%%% -\newcommand\NbDonnees{}% -\newcommand\SommeDonnees{}% -\newcommand\EffectifTotal{}% -\newcommand\Moyenne{}% -\newcommand\Etendue{}% -\newcommand\Mediane{}% -\newcommand\DonneeMax{}% -\newcommand\DonneeMin{}% -\newcommand\EffectifMax{}% - -\setKVdefault[ClesStat]{ColVide=0,CaseVide=false,EffVide=false,% -FreqVide=false,AngVide=false,ECCVide=false,TotalVide=false,Sondage=false,Liste=false,% -Tableau=false,Stretch=1,Frequence=false,EffectifTotal=false,% -Etendue=false,Moyenne=false,SET=false,ValeurExacte=false,Mediane=false,QuartileUn=false,QuartileTrois=false,Total=false,Concret=false,% -Unite={},Largeur=1cm,Precision=2,PrecisionF=0,Donnee=Valeurs,Effectif=Effectif,Grille=false,Origine=0,Angle=false,SemiAngle=false,Qualitatif=false,TableauVide=false,ECC=false,Coupure=10,CouleurTab=gray!15,Graphique=false,Batons=true,% -% Pour les diags batons -EpaisseurBatons=1,ListeCouleursB={a},Lecture=false,LectureFine=false,AideLecture=false,Reponses=false,DonneesSup=false,AbscisseRotation=false,Tiret=false,AngleRotationAbscisse=0,Pasx=1,Pasy=1,Unitex=0.5,Unitey=0.5,Depart=0,CouleurDefaut=black,% -% Pour les diags circulaires -Rayon=3cm,AffichageAngle=false,AffichageDonnee=false,ListeCouleurs={white},Hachures=false,LectureInverse=false,EcartHachures=0.25,EpaisseurHachures=1,Legende,LegendeVide=false,ACompleter=false,% -%Pour les représentations -Representation=false,% -%Pour les barres horizontales -Barre=false,Longueur=10cm,Hauteur=5mm,Bicolore=false,EcartBarre=0%Grille est dispo -}% -%compl\'ements -\defKV[ClesStat]{AngleRotationAbscisse=\setKV[ClesStat]{AbscisseRotation}}% -\defKV[ClesStat]{AffichageDonnees=\setKV[ClesStat]{AffichageAngle=false}\setKV[ClesStat]{AffichageDonnee}}% -\defKV[ClesStat]{CasesVides=\setKV[ClesStat]{CaseVide}}% -\defKV[ClesStat]{LegendesVides=\setKV[ClesStat]{LegendeVide}}% -% La construction du tableau -\def\addtotok#1#2{#1\expandafter{\the#1#2}}% -\newtoks\tabtoksa\newtoks\tabtoksb\newtoks\tabtoksc% -\def\updatetoks#1/#2\nil{\addtotok\tabtoksa{\ifboolKV[ClesStat]{Qualitatif}{}{&\num{#1}}}\addtotok\tabtoksb{&\num{#2}}}% -% -\newcounter{PfCCompteLignes}% -% -\def\BuildtabStat{% %%Tableau sans total - \setcounter{PfCCompteLignes}{0}% - \tabtoksa{\useKV[ClesStat]{Donnee}}\tabtoksb{\useKV[ClesStat]{Effectif}}% - \foreachitem\compteur\in\ListeComplete{\expandafter\updatetoks\compteur\nil}% - \ifboolKV[ClesStat]{Total}{% - \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}% - \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen+1}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}% - \CodeBefore% - \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}% - \columncolor{\useKV[ClesStat]{CouleurTab}}{1}% - \Body% - \the\tabtoksa&Total\\% - \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb&\num{\EffectifTotal}}\\% - \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{100}}\\}{}% - \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{360}}\\}{}% - \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{180}}\\}{}% - \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\num{\EffectifTotal}}}\\}{}% - \CodeAfter% - % On crée la liste des colonnes à vider - \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{% - \xdef\FooStat{\useKV[ClesStat]{ColVide}}% - \setsepchar{,}% - \readlist*\ListeColonnesAVider{\FooStat}% - \foreachitem\compteur\in\ListeColonnesAVider{% - \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});% - }% - }{}% - % On crée la liste des cases à vider - \ifboolKV[ClesStat]{CaseVide}{% - \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesAVider{\FooStatCases}% - \foreachitem\compteur\in\ListeCasesAVider{% - \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});% - }% - }{}% - % On retrace le tableau - %Les colonnes - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+3}}}\do{% - \tikz\draw (row-1-|col-##1) -- (last-|col-##1);% - }% - % Les lignes - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{% - \tikz\draw (row-##1-|col-1) -- (row-##1-|last);% - }% - \end{NiceTabular}% - }{% - \renewcommand{\arraystretch}{\useKV[ClesStat]{Stretch}}% - \begin{NiceTabular}{c*{\fpeval{\ListeCompletelen}}{>{\centering\arraybackslash}p{\useKV[ClesStat]{Largeur}}}}% - \CodeBefore% - \rowcolor{\useKV[ClesStat]{CouleurTab}}{1}% - \columncolor{\useKV[ClesStat]{CouleurTab}}{1}% - \Body% - \the\tabtoksa\\% - \ifboolKV[ClesStat]{EffVide}{\useKV[ClesStat]{Effectif}\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&}}{\the\tabtoksb}\\% - \ifboolKV[ClesStat]{Frequence}{\stepcounter{PfCCompteLignes}Fr\'equence (\%)\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{FreqVide}{}{\num{\CalculFrequence{##1}}}}}\\}{}% - \ifboolKV[ClesStat]{Angle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculAngle{##1}}}}\\}{}% - \ifboolKV[ClesStat]{SemiAngle}{\stepcounter{PfCCompteLignes}Angle (\si{\degree})\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{AngVide}{}{\CalculSemiAngle{##1}}}}\\}{}% - \ifboolKV[ClesStat]{ECC}{\stepcounter{PfCCompteLignes}E.C.C.\xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{&\ifboolKV[ClesStat]{TableauVide}{}{\ifboolKV[ClesStat]{ECCVide}{}{\CalculECC{##1}}}}\\}{}% - \CodeAfter% - % On crée la liste des colonnes à vider - \xintifboolexpr{\useKV[ClesStat]{ColVide}>0}{% - \xdef\FooStat{\useKV[ClesStat]{ColVide}}% - \setsepchar{,}% - \readlist*\ListeColonnesAVider{\FooStat}% - \foreachitem\compteur\in\ListeColonnesAVider{% - \tikz\fill[white] (row-2-|col-\fpeval{\compteur+1}) rectangle (last-|col-\fpeval{\compteur+2});% - }% - }{}% - % On crée la liste des cases à vider - \ifboolKV[ClesStat]{CaseVide}{% - \xdef\FooStatCases{\useKV[ClesStat]{CasesVides}}% - \setsepchar[*]{,*/}% - \readlist*\ListeCasesAVider{\FooStatCases}% - \foreachitem\compteur\in\ListeCasesAVider{% - \tikz\fill[white] (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+1}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+1}) rectangle (row-\fpeval{\ListeCasesAVider[\compteurcnt,1]+2}-|col-\fpeval{\ListeCasesAVider[\compteurcnt,2]+2});% - }% - }{}% - % On retrace le tableau - %Les colonnes - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeCompletelen+2}}}\do{% - \tikz\draw (row-1-|col-##1) -- (last-|col-##1);% - }% - % Les lignes - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\thePfCCompteLignes+3}}}\do{% - \tikz\draw (row-##1-|col-1) -- (row-##1-|last);% - }% - \end{NiceTabular}% - }% -}% - -% Pour construire le diagramme en barres horizontales -\def\UpdatetoksHor#1/#2/#3\nil{\addtotok\toklistenomhor{"#1",}\addtotok\toklistedonhor{#3,}\addtotok\toklisteaffhor{"#2",}}% - -\newcommand\buildgraphbarhor{% - \newtoks\toklistenomhor% - \newtoks\toklistedonhor% - \newtoks\toklisteaffhor% - \newtoks\toklistecouleur% - \xdef\PfCfooStat{}% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,2],}% - }% - \xdef\DivMax{\fpeval{max(\PfCfooStat)}}% - \xdef\ExposantDivMax{\fpeval{round(ln(\DivMax)/ln(10))}}% - \xdef\DivMax{\fpeval{10**\ExposantDivMax}}% - \xdef\PfCfooStat{}% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xdef\PfCfooStat{\PfCfooStat \ListeComplete[##1,1]/\ListeComplete[##1,2]/\fpeval{\ListeComplete[##1,2]/\DivMax},}% - }% - \readlist*\ListeCompleteDiagHor{\PfCfooStat}% - \foreachitem\compteur\in\ListeCompleteDiagHor{\expandafter\UpdatetoksHor\compteur\nil}% - \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}% - \readlist*\ListeCouleur{\ListeAvantCouleurs}% - \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% - \NewMPDiagBarreHor{\the\toklistenomhor}{\the\toklistedonhor}{\the\toklisteaffhor}{\the\toklistecouleur}% -}% - -% Pour construire le diagramme en bâtons -\def\Updatetoks#1/#2\nil{\addtotok\toklistepoint{(#1,#2),}}% -\newcommand\buildgraph[1][]{% - \newtoks\toklistepoint% - \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoks\compteur\nil}% - \newtoks\toklistecouleur% - \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}% - \readlist*\ListeCouleur{\ListeAvantCouleurs}% - \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% - \MPStatNew{\the\toklistepoint}{\the\toklistecouleur}% -}% - -% Pour construire le diagramme en bâtons qualitatif -\def\Updatetoksq#1/#2\nil{\addtotok\toklistepointq{"#1",#2,}}% -\newcommand\buildgraphq[1][]{% - \newtoks\toklistepointq% - \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}% - \newtoks\toklistecouleur% - \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleursB}}% - \readlist*\ListeCouleur{\ListeAvantCouleurs}% - \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% - \MPStatNew{\the\toklistepointq}{\the\toklistecouleur}% -}% - -\def\UpdateCoul#1\nil{\addtotok\toklistecouleur{#1,}}% -\def\UpdateLegende#1\nil{\addtotok\toklistelegende{#1,}}% - -% Pour construire le diagramme circulaire qualitatif -\def\buildgraphcq#1{% - \newtoks\toklistepointq\toklistepointq{}% - \newtoks\toklistecouleur\toklistecouleur{}% - \newtoks\toklistelegende\toklistelegende{}% - \ifboolKV[ClesStat]{LegendeVide}{% - \xdef\foo{\useKV[ClesStat]{LegendesVides}}% - \readlist*\ListeLegendesAEffacer{\foo}% - }{\xdef\foo{0}\readlist*\ListeLegendesAEffacer{\foo}% - }% - \foreachitem\compteur\in\ListeLegendesAEffacer{\expandafter\UpdateLegende\compteur\nil}% - % - \foreachitem\compteur\in\ListeComplete{\expandafter\Updatetoksq\compteur\nil}% - \xdef\ListeAvantCouleurs{\useKV[ClesStat]{ListeCouleurs}}% - \readlist*\ListeCouleur{\ListeAvantCouleurs}% - \foreachitem\couleur\in\ListeCouleur{\expandafter\UpdateCoul\couleur\nil}% - \NewMPStatCirculaireQ{\the\toklistepointq}{#1}{\the\toklistecouleur}{\the\toklistelegende}% -}% - -%% calcul des fr\'equences -\newcommand\CalculFrequence[1]{% - \fpeval{round(\ListeComplete[#1,2]*100/\EffectifTotal,\useKV[ClesStat]{PrecisionF})} -} - -%% calcul des angles -\newcommand\CalculAngle[1]{% - \fpeval{round(\ListeComplete[#1,2]*360/\EffectifTotal,0)} -} -\newcommand\CalculSemiAngle[1]{% - \fpeval{round(\ListeComplete[#1,2]*180/\EffectifTotal,0)} -} - -%% calcul des ECC -\newcount\CompteurECC% -\newcount\CompteurECCTotal% - -\newcommand\CalculECC[1]{% - \xdef\TotalECC{0}% - \CompteurECC=1% - \CompteurECCTotal=\numexpr#1+1% - \whiledo{\CompteurECC < \CompteurECCTotal}{% - \xdef\TotalECC{\fpeval{\TotalECC+\ListeComplete[\the\CompteurECC,2]}}% - \CompteurECC=\numexpr\CompteurECC+1% - }% - \num{\TotalECC}% -} - -% Construction d'un diagramme en barres horizontal -\newcommand\NewMPDiagBarreHor[4]{% - % #1 Liste des noms - % #2 Liste des valeurs associées - % #3 Liste des valeurs à afficher (si pb calcul MP) - % #4 Liste des couleurs - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - Longueur:=\useKV[ClesStat]{Longueur}; - Hauteur:=\useKV[ClesStat]{Hauteur}; - Ecart:=\useKV[ClesStat]{EcartBarre}; - ExposantDivMax:=\ExposantDivMax; - ecarthachures=\useKV[ClesStat]{EcartHachures}; - epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; - boolean Hachures; - Hachures=\useKV[ClesStat]{Hachures}; - boolean Bicolore; - Bicolore=\useKV[ClesStat]{Bicolore}; - boolean Grille; - Grille=\useKV[ClesStat]{Grille}; - boolean AffichageDonnee; - AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; - boolean LegendeVide; - LegendeVide=\useKV[ClesStat]{LegendeVide}; - vardef CalculNombreDonneesEtDonneeMax(text t)= - nbdon:=0;%nombre de données - DonneeMax:=0;%donnée DonneeMaximale - for p_=t: - nbdon:=nbdon+1; - if p_>DonneeMax: - DonneeMax:=p_; - fi; - endfor; - enddef; - vardef ListeDonnees(text t)= - n:=0; - for p_=t: - n:=n+1; - Donnees[n]:=p_; - endfor; - enddef; - vardef RecuperationCouleurs(text t)= - color Col[]; - n:=0; - for p_=t: - n:=n+1; - Col[n]=p_; - endfor; - enddef; - vardef TraceDiag= - if Grille: - pair Zz[];%Pour déterminer "le dernier point" - Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart); - Zz2=(0,(Hauteur+Ecart)); - Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart); - Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi; - if ExposantDivMax=0: - for k=1 upto DonneeMax+1: - trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white; - endfor; - else: - for k=1 upto (floor(DonneeMax*10+2)): - trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white; - endfor; - fi; - if ExposantDivMax=0: - for k=1 upto (DonneeMax+1): - label.bot(TEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0)); - endfor; - else: - if ExposantDivMax<5: - for k=1 upto (floor(DonneeMax*10+2)): - label.bot(TEX("\num{\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0)); - endfor; - else: - dotlabel.bot(TEX("\num{\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1); - fi; - fi; - fi; - for k=0 upto nbdon-1: - path RectangleDonnee; - RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart)); - if Hachures: - fill RectangleDonnee withcolor white; - trace Hachurage(RectangleDonnee,60 if - (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi) - withpen pencircle scaled epaisseurhachures; - else: - remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi; - fi; - trace RectangleDonnee; - endfor; - if Grille: - drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5; - drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5; - fi; - enddef; - vardef AffichageNom(text t)= - k:=0; - for p_=t: - label.lft(TEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart))); - k:=k+1; - endfor; - enddef; - vardef AffichageDonnees(text t)= - k:=0; - for p_=t: - label.rt(TEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart))); - k:=k+1; - endfor; - enddef; - CalculNombreDonneesEtDonneeMax(#2); - ListeDonnees(#2); - RecuperationCouleurs(#4); - TraceDiag; - if LegendeVide=false: - AffichageNom(#1); - fi; - if AffichageDonnee: - AffichageDonnees(#3); - fi; - \end{mplibcode} - \else% - \begin{mpost}[mpsettings={% - Longueur:=\useKV[ClesStat]{Longueur}; - Hauteur:=\useKV[ClesStat]{Hauteur}; - Ecart:=\useKV[ClesStat]{EcartBarre}; - ExposantDivMax:=\ExposantDivMax; - ecarthachures=\useKV[ClesStat]{EcartHachures}; - epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; - boolean Hachures; - Hachures=\useKV[ClesStat]{Hachures}; - boolean Bicolore; - Bicolore=\useKV[ClesStat]{Bicolore}; - boolean Grille; - Grille=\useKV[ClesStat]{Grille}; - boolean AffichageDonnee; - AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; - boolean LegendeVide; - LegendeVide=\useKV[ClesStat]{LegendeVide}; - }] - vardef CalculNombreDonneesEtDonneeMax(text t)= - nbdon:=0;%nombre de données - DonneeMax:=0;%donnée DonneeMaximale - for p_=t: - nbdon:=nbdon+1; - if p_>DonneeMax: - DonneeMax:=p_; - fi; - endfor; - enddef; - vardef ListeDonnees(text t)= - n:=0; - for p_=t: - n:=n+1; - Donnees[n]:=p_; - endfor; - enddef; - vardef RecuperationCouleurs(text t)= - color Col[]; - n:=0; - for p_=t: - n:=n+1; - Col[n]=p_; - endfor; - enddef; - vardef TraceDiag= - if Grille: - pair Zz[];%Pour déterminer "le dernier point" - Zz0=(0,-(nbdon-1)*(Hauteur+Ecart)-Ecart); - Zz2=(0,(Hauteur+Ecart)); - Zz1=((1/DonneeMax)*Longueur,-(nbdon-1)*(Hauteur+Ecart)-Ecart); - Zz3=if ExposantDivMax=0 : (DonneeMax+1)[Zz0,Zz1] else: ((floor(DonneeMax*10+2))/10)[Zz0,Zz1];fi; - if ExposantDivMax=0: - for k=1 upto DonneeMax+1: - trace (Zz0--Zz2) shifted (k*(Zz1-Zz0)) dashed evenly withcolor 0.5white; - endfor; - else: - for k=1 upto (floor(DonneeMax*10+2)): - trace (Zz0--Zz2) shifted ((k/10)*(Zz1-Zz0)) dashed evenly withcolor 0.5white; - endfor; - fi; - if ExposantDivMax=0: - for k=1 upto (DonneeMax+1): - label.bot(LATEX("\num{"&decimal(k)&"}"),Zz0+k*(Zz1-Zz0)); - endfor; - else: - if ExposantDivMax<5: - for k=1 upto (floor(DonneeMax*10+2)): - label.bot(LATEX("\num{\noexpand\fpeval{"&decimal(k)&"*(10**"&decimal(ExposantDivMax-1)&")}}"),Zz0+(k/10)*(Zz1-Zz0)); - endfor; - else: - dotlabel.bot(LATEX("\num{\noexpand\fpeval{10**"&decimal(ExposantDivMax)&"}}"),Zz1); - fi; - fi; - fi; - for k=0 upto nbdon-1: - path RectangleDonnee; - RectangleDonnee=(unitsquare xscaled ((Donnees[k+1]/DonneeMax)*Longueur) yscaled Hauteur) shifted(0,-k*(Hauteur+Ecart)); - if Hachures: - fill RectangleDonnee withcolor white; - trace Hachurage(RectangleDonnee,60 if - (k mod 2)=0: +90 fi,ecarthachures,if (k mod 2)=0 : 0 else: 1 fi) - withpen pencircle scaled epaisseurhachures; - else: - remplis RectangleDonnee withcolor if unknown Col[k+1]: if Bicolore:Col[(k mod 2)+1] else: white fi; else:if Bicolore:Col[(k mod 2)+1] else: Col[k+1] fi; fi; - fi; - trace RectangleDonnee; - endfor; - if Grille: - drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(0,(Hauteur+Ecart)) withpen pencircle scaled 1.5; - drawarrow (0,-(nbdon-1)*(Hauteur+Ecart)-Ecart)--(Zz3+u*(0.25,0)) withpen pencircle scaled 1.5; - fi; - enddef; - vardef AffichageNom(text t)= - k:=0; - for p_=t: - label.lft(LATEX(p_),0.5[(0,0),(0,Hauteur)] shifted (0,-k*(Hauteur+Ecart))); - k:=k+1; - endfor; - enddef; - vardef AffichageDonnees(text t)= - k:=0; - for p_=t: - label.rt(LATEX("\num{"&p_&"}"),0.5[(0,0),(0,Hauteur)] shifted (((Donnees[k+1]/DonneeMax)*Longueur),-k*(Hauteur+Ecart))); - k:=k+1; - endfor; - enddef; - CalculNombreDonneesEtDonneeMax(#2); - ListeDonnees(#2); - RecuperationCouleurs(#4); - TraceDiag; - if LegendeVide=false: - AffichageNom(#1); - fi; - if AffichageDonnee: - AffichageDonnees(#3); - fi; - \end{mpost} - \fi% -}% - -% Construction du graphique en bâtons -\newcommand\MPStatNew[2]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - maxx:=0; - maxy:=0; - unitex:=\useKV[ClesStat]{Unitex}*cm; - unitey:=\useKV[ClesStat]{Unitey}*cm; - xpartorigine:=\useKV[ClesStat]{Origine}; - AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse}; - boolean Rotation; - Rotation=\useKV[ClesStat]{AbscisseRotation}; - boolean Lecture; - Lecture:=\useKV[ClesStat]{Lecture}; - boolean LectureFine; - LectureFine:=\useKV[ClesStat]{LectureFine}; - boolean AideLecture; - AideLecture:=\useKV[ClesStat]{AideLecture}; - boolean DonneesSup; - DonneesSup:=\useKV[ClesStat]{DonneesSup}; - boolean Reponses; - Reponses:=\useKV[ClesStat]{Reponses}; - epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons}; - boolean Qualitatif; - Qualitatif=\useKV[ClesStat]{Qualitatif}; - boolean Tiret; - Tiret=\useKV[ClesStat]{Tiret}; - color CoulDefaut; - CoulDefaut=\useKV[ClesStat]{CouleurDefaut}; - Depart=\useKV[ClesStat]{Depart}; - % on r\'ecup\`ere les couleurs - color Col[]; - n:=0; - for p_=#2: - n:=n+1; - if color p_: - Col[n]=p_; - else: - Col[n]=CoulDefaut; - fi; - endfor; - % - pair A[],B[],P[]; - vardef toto(text t)=%points quantitatif - n:=0; - for p_=t: - if pair p_: - n:=n+1; - P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey); - if xpart(p_)>maxx: - maxx:=xpart(p_)-(xpartorigine); - fi; - if ypart(p_)>maxy: - maxy:=ypart(p_); - fi; - A[n]=unitex*(xpart(p_)-(xpartorigine),0); - B[n]=unitey*(0,ypart(p_)); - fi; - endfor; - enddef; - vardef tutu(text t)=%points qualitatif - n:=0; - for p_=t: - if numeric p_: - P[n]=((n)*unitex,unitey*(p_-Depart)); - B[n]=(0,unitey*(p_-Depart)); - if p_>maxy: - maxy:=p_; - fi; - else: - n:=n+1; - A[n]=unitex*(n,0); - fi; - endfor; - maxy:=maxy-Depart; - maxx:=n; - enddef; - vardef tata(text t)=%affichage quantitatif - l=0; - for p_=t: - if pair p_: - l:=l+1; - if Rotation: - label.bot(TEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]); - else : - label.bot(TEX("\num{"&decimal(xpart(p_))&"}"),A[l]); - fi; - if Reponses: - if DonneesSup: - label.top(TEX("\num{"&decimal(ypart(p_))&"}"),P[l]); - else: - if Tiret: - trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); - label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); - else: - dotlabel.lft(TEX("\num{"&decimal(ypart(p_))&"}"),B[l]); - fi; - fi; - fi; - fi; - endfor; - enddef; - vardef titi(text t)=%affichage qualitatif - l:=0; - for p_=t: - if numeric p_: - if Reponses: - if DonneesSup: - label.top(TEX("\num{"&decimal(p_)&"}"),P[l]); - else: - if Tiret: - trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); - label.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); - else: - dotlabel.lft(TEX("\num{"&decimal(p_)&"}"),B[l]); - fi; - fi; - fi; - else: - l:=l+1; - if Rotation: - if AngleRotation<>0: - picture TEXTELABEL; - TEXTELABEL=image( - labeloffset:=labeloffset*2; - label.lft(TEX(p_),A[l]); - labeloffset:=labeloffset/2; - ); - trace rotation(TEXTELABEL,A[l],AngleRotation); - else : - label.bot(TEX(p_),A[l]); - fi; - fi; - fi; - endfor; - enddef; - if Qualitatif: tutu(#1); else: toto(#1); fi; - boolean Grille; - Grille:=\useKV[ClesStat]{Grille}; - Pasx:=\useKV[ClesStat]{Pasx}; - Pasy:=\useKV[ClesStat]{Pasy}; - if Grille: - drawoptions(withcolor 0.75white); - for k=0 step Pasx until ((maxx+1)): - trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy)); - endfor; - for k=0 step Pasy until ((maxy+2*Pasy)): - trace (0,k*unitey)--(unitex*(maxx+1),k*unitey); - endfor; - drawoptions(); - fi; - if epaisseurbatons<>0: - for k=1 upto n: - fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi; - if AideLecture: - draw B[k]--P[k] dashed evenly; - fi; - endfor; - fi; - if LectureFine: - for k=0 step Pasy until ((maxy+1*Pasy)): - if Tiret: - trace (1pt,k*unitey)--(-1pt,k*unitey); - label.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey)); - else: - dotlabel.lft(TEX("\num{"&decimal(k+Depart)&"}"),(0,k*unitey)); - fi; - endfor; - fi; - if Lecture: - for k=0 step Pasy until Pasy: - if Tiret: - trace (1pt,k*unitey)--(-1pt,k*unitey); - label.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - else: - dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - fi; - endfor; - fi; - drawarrow (0,0)--unitex*(maxx+1,0); - drawarrow (0,0)--unitey*(0,maxy+2*Pasy); - label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0)); - label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy)); - if Qualitatif: titi(#1); else:tata(#1); fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - unitex:=\useKV[ClesStat]{Unitex}*cm; - unitey:=\useKV[ClesStat]{Unitey}*cm; - xpartorigine:=\useKV[ClesStat]{Origine}; - AngleRotation=\useKV[ClesStat]{AngleRotationAbscisse}; - boolean Rotation; - Rotation=\useKV[ClesStat]{AbscisseRotation}; - boolean Lecture; - Lecture:=\useKV[ClesStat]{Lecture}; - boolean LectureFine; - LectureFine:=\useKV[ClesStat]{LectureFine}; - boolean AideLecture; - AideLecture:=\useKV[ClesStat]{AideLecture}; - boolean DonneesSup; - DonneesSup:=\useKV[ClesStat]{DonneesSup}; - boolean Reponses; - Reponses:=\useKV[ClesStat]{Reponses}; - epaisseurbatons=\useKV[ClesStat]{EpaisseurBatons}; - boolean Qualitatif; - Qualitatif=\useKV[ClesStat]{Qualitatif}; - boolean Tiret; - Tiret=\useKV[ClesStat]{Tiret}; - color CoulDefaut; - CoulDefaut=\useKV[ClesStat]{CouleurDefaut};} - Depart=\useKV[ClesStat]{Depart}; - ] - maxx:=0; - maxy:=0; - % on r\'ecup\`ere les couleurs - color Col[]; - n:=0; - for p_=#2: - n:=n+1; - if color p_: - Col[n]=p_; - else: - Col[n]=CoulDefaut; - fi; - endfor; - % - pair A[],B[],P[]; - vardef toto(text t)=%points quantitatif - n:=0; - for p_=t: - if pair p_: - n:=n+1; - P[n]=((xpart(p_)-(xpartorigine))*unitex,ypart(p_)*unitey); - if xpart(p_)>maxx: - maxx:=xpart(p_)-(xpartorigine); - fi; - if ypart(p_)>maxy: - maxy:=ypart(p_); - fi; - A[n]=unitex*(xpart(p_)-(xpartorigine),0); - B[n]=unitey*(0,ypart(p_)); - fi; - endfor; - enddef; - vardef tata(text t)=%affichage quantitatif - l=0; - for p_=t: - if pair p_: - l:=l+1; - if Rotation: - label.bot(LATEX("\num{"&decimal(xpart(p_))&"}") rotated AngleRotation,A[l]); - else : - label.bot(LATEX("\num{"&decimal(xpart(p_))&"}"),A[l]); - fi; - if Reponses: - if DonneesSup: - label.top(LATEX("\num{"&decimal(ypart(p_))&"}"),P[l]); - else: - if Tiret: - trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); - label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); - else: - dotlabel.lft(LATEX("\num{"&decimal(ypart(p_))&"}"),B[l]); - fi; - fi; - fi; - fi; - endfor; - enddef; - vardef tutu(text t)=%points qualitatif - n:=0; - for p_=t: - if numeric p_: - P[n]=((n)*unitex,unitey*p_); - B[n]=(0,unitey*p_); - if p_>maxy: - maxy:=p_; - fi; - else: - n:=n+1; - A[n]=unitex*(n,0); - fi; - endfor; - maxx:=n; - enddef; - vardef titi(text t)=%affichage qualitatif - l:=0; - for p_=t: - if numeric p_: - if Reponses: - if DonneesSup: - label.top(LATEX("\num{"&decimal(p_)&"}"),P[l]); - else: - if Tiret: - trace (B[l]+(-1pt,0))--(B[l]+(1pt,0)); - label.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); - else: - dotlabel.lft(LATEX("\num{"&decimal(p_)&"}"),B[l]); - fi; - fi; - fi; - else: - l:=l+1; - if Rotation: - if AngleRotation<>0: - picture TEXTELABEL; - TEXTELABEL=image( - labeloffset:=labeloffset*2; - label.lft(LATEX(p_),A[l]); - labeloffset:=labeloffset/2; - ); - trace rotation(TEXTELABEL,A[l],AngleRotation); - else : - label.bot(LATEX(p_),A[l]); - fi; - fi; - fi; - endfor; - enddef; - if Qualitatif: tutu(#1); else: toto(#1); fi; - boolean Grille; - Grille:=\useKV[ClesStat]{Grille}; - Pasx:=\useKV[ClesStat]{Pasx}; - Pasy:=\useKV[ClesStat]{Pasy}; - if Grille: - drawoptions(withcolor 0.75white); - for k=0 step Pasx until ((maxx+1)): - trace (k*unitex,0)--(k*unitex,unitey*(maxy+2*Pasy)); - endfor; - for k=0 step Pasy until ((maxy+2*Pasy)): - trace (0,k*unitey)--(unitex*(maxx+1),k*unitey); - endfor; - drawoptions(); - fi; - if epaisseurbatons<>0: - for k=1 upto n: - fill polygone(A[k]-(epaisseurbatons*1pt,0),A[k]+(epaisseurbatons*1pt,0),P[k]+(epaisseurbatons*1pt,0),P[k]-(epaisseurbatons*1pt,0)) withcolor if unknown Col[k]: CoulDefaut else:Col[k] fi; - if AideLecture: - draw B[k]--P[k] dashed evenly; - fi; - endfor; - fi; - if LectureFine: - for k=0 step Pasy until ((maxy+1*Pasy)): - if Tiret: - trace (1pt,k*unitey)--(-1pt,k*unitey); - label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - else: - dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - fi; - endfor; - fi; - if Lecture: - for k=0 step Pasy until Pasy: - if Tiret: - trace (1pt,k*unitey)--(-1pt,k*unitey); - label.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - else: - dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(0,k*unitey)); - fi; - endfor; - fi; - drawarrow (0,0)--unitex*(maxx+1,0); - drawarrow (0,0)--unitey*(0,maxy+2*Pasy); - label.lrt(btex \useKV[ClesStat]{Donnee} etex,unitex*(maxx+1,0)); - label.urt(btex \useKV[ClesStat]{Effectif} etex,unitey*(0,maxy+2*Pasy)); - if Qualitatif: titi(#1); else:tata(#1); fi; - \end{mpost} - \fi -} - -% la construction du graphique qualitatif -\def\NewMPStatCirculaireQ#1#2#3#4{% - %#1 : la liste des données - %#2 : 360 ou 180 - %#3 : liste des couleurs - %#4 : liste des légendes à effacer. - \ifluatex - \mplibforcehmode - \begin{mplibcode} - Rayon:=\useKV[ClesStat]{Rayon}; - ecarthachures=\useKV[ClesStat]{EcartHachures}; - epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; - boolean AffichageAngle; - AffichageAngle=\useKV[ClesStat]{AffichageAngle}; - boolean AffichageDonnee; - AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; - boolean Hachures; - Hachures=\useKV[ClesStat]{Hachures}; - boolean Inverse; - Inverse=\useKV[ClesStat]{LectureInverse}; - boolean Legende; - Legende=\useKV[ClesStat]{Legende}; - boolean LegendeVide; - LegendeVide=\useKV[ClesStat]{LegendeVide}; - boolean Retour; - Retour=false; - boolean ACompleter; - ACompleter=\useKV[ClesStat]{ACompleter}; - pair A[],O,B[],C[],D[]; - O=(0,0); - n:=0; - numeric total[],ang[]; - total[0]=0; - ang[0]:=0; - path cc; - cc=(fullcircle scaled (2*Rayon)); - % on r\'ecup\`ere les couleurs - color Col[]; - n:=0; - for p_=#3: - n:=n+1; - Col[n]=p_; - endfor; - if Inverse=false: - A[0]=point(0) of cc; - else: - A[0]=point(180) of cc; - fi; - vardef toto(text t)= - n:=0; - for p_=t: - if numeric p_: - n:=n+1; - total[n]:=total[n-1]+p_; - fi; - endfor; - N=n; - for k=1 upto N: - ang[k]=(#2/total[N])*total[k]; - endfor; - n:=0; - for p_=t: - if numeric p_: - n:=n+1; - if Inverse=false: - A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N])); - else: - A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N])); - fi; - %hachure ou pas ? - if Hachures=false: - fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else: - arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi; - else: - draw - Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O) - else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if - (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi) - withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi; - fi; - if ACompleter=false: - draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi; - fi; - % Affichage des angles associ\'es - if AffichageAngle: - if round(p_*(#2/total[N]))>15: - if (n mod 2)=0: - marque_a:=20*0.75*Rayon/cm; - else: - marque_a:=20*0.5*Rayon/cm; - fi; - if Hachures: - if Inverse=false: - undraw - Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - else: - undraw - Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - fi; - fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor - blanc; - fi; - if Inverse=false: - draw - Codeangle(A[n-1],O,A[n],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - else: - draw - Codeangle(A[n],O,A[n-1],0,(((TEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - fi; - fi; - elseif AffichageDonnee: - if round(p_*(#2/total[N]))>15: - if (n mod 2)=0: - marque_a:=20*0.75*Rayon/cm; - else: - marque_a:=20*0.5*Rayon/cm; - fi; - if Hachures: - if Inverse=false: - undraw - Codeangle(A[n-1],O,A[n],0,TEX(""&decimal(p_)&"")); - else: - undraw - Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&""))))); - fi; - fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor - blanc; - fi; - if Inverse=false: - draw - Codeangle(A[n-1],O,A[n],0,(((TEX(""&decimal(p_)&""))))); - else: - draw - Codeangle(A[n],O,A[n-1],0,(((TEX(""&decimal(p_)&""))))); - fi; - fi; - fi; - % - fi; - endfor; - if #2=360: - draw cc if Hachures: withpen pencircle scaled2 fi; - else: - draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;; - fi; - n:=0; - if Legende: - for p_=t: - if string p_: - n:=n+1; - C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2); - draw 0.95[O,C[n]]--1.05[O,C[n]]; - C[n]:=1.05[O,C[n]]; - Test(n); - if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)): - D[n]=C[n]+(0.5cm,0); - draw C[n]--D[n]; - if Retour=false:label.urt(TEX(p_),D[n]);fi; - fi; - if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)): - D[n]=C[n]-(0.5cm,0); - draw C[n]--D[n]; - if Retour=false:label.ulft(TEX(p_),D[n]);fi; - fi; - if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)): - D[n]=C[n]-(0.5cm,0); - draw C[n]--D[n]; - if Retour=false:label.llft(TEX(p_),D[n]);fi; - fi; - if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)): - D[n]=C[n]+(0.5cm,0); - draw C[n]--D[n]; - if Retour=false:label.lrt(TEX(p_),D[n]);fi; - fi; - fi; - endfor; - fi; - enddef; - vardef Test(expr nb)= - Retour:=false; - op:=0; - for l_=#4: - if l_=nb: - op:=op+1; - fi; - endfor; - if op>0: - Retour:=true; - fi; - enddef; - Figure(-10u,-10u,10u,10u); - toto(#1); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - Rayon:=\useKV[ClesStat]{Rayon}; - ecarthachures=\useKV[ClesStat]{EcartHachures}; - epaisseurhachures=\useKV[ClesStat]{EpaisseurHachures}; - boolean AffichageAngle; - AffichageAngle=\useKV[ClesStat]{AffichageAngle}; - boolean AffichageDonnee; - AffichageDonnee=\useKV[ClesStat]{AffichageDonnee}; - boolean Hachures; - Hachures=\useKV[ClesStat]{Hachures}; - boolean Inverse; - Inverse=\useKV[ClesStat]{LectureInverse}; - boolean Legende; - Legende=\useKV[ClesStat]{Legende}; - boolean LegendeVide; - LegendeVide=\useKV[ClesStat]{LegendeVide}; - boolean ACompleter; - ACompleter=\useKV[ClesStat]{ACompleter}; - }] - boolean Retour; - Retour=false; - pair A[],O,B[],C[],D[]; - O=(0,0); - n:=0; - numeric total[],ang[]; - total[0]=0; - ang[0]:=0; - path cc; - cc=(fullcircle scaled (2*Rayon)); - % on r\'ecup\`ere les couleurs - color Col[]; - n:=0; - for p_=#3: - n:=n+1; - Col[n]=p_; - endfor; - if Inverse=false: - A[0]=point(0) of cc; - else: - A[0]=point(180) of cc; - fi; - vardef toto(text t)= - n:=0; - for p_=t: - if numeric p_: - n:=n+1; - total[n]:=total[n-1]+p_; - fi; - endfor; - N=n; - for k=1 upto N: - ang[k]=(#2/total[N])*total[k]; - endfor; - n:=0; - for p_=t: - if numeric p_: - n:=n+1; - if Inverse=false: - A[n]=A[n-1] rotatedabout(O,p_*(#2/total[N])); - else: - A[n]=A[n-1] rotatedabout(O,-p_*(#2/total[N])); - fi; - %hachure ou pas ? - if Hachures=false: - fill (O--if Inverse=false:arccercle(A[n-1],A[n],O) else: - arccercle(A[n],A[n-1],O) fi--cycle) withcolor if unknown Col[n]: white else:Col[n] fi; - else: - draw - Hachurage((O--if Inverse=false:arccercle(A[n-1],A[n],O) - else:arccercle(A[n],A[n-1],O) fi--cycle),p_*(#2/total[N]) if - (n mod 2)=0: +90 else: -90 fi,ecarthachures,if (n mod 2)=0 : 0 else: 1 fi) - withpen pencircle scaled epaisseurhachures if AffichageAngle: withcolor 0.5white fi; - fi; - if ACompleter=false: - draw A[n-1]--O--A[n] if Hachures: withpen pencircle scaled2 fi; - fi; - % Affichage des angles associ\'es - if AffichageAngle: - if round(p_*(#2/total[N]))>15: - if (n mod 2)=0: - marque_a:=20*0.75*Rayon/cm; - else: - marque_a:=20*0.5*Rayon/cm; - fi; - if Hachures: - if Inverse=false: - undraw - Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - else: - undraw - Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - fi; - fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor - blanc; - fi; - if Inverse=false: - draw - Codeangle(A[n-1],O,A[n],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - else: - draw - Codeangle(A[n],O,A[n-1],0,(((LATEX("\ang{"&decimal(round(p_*(#2/total[N])))&"}"))))); - fi; - fi; - elseif AffichageDonnee: - if round(p_*(#2/total[N]))>15: - if (n mod 2)=0: - marque_a:=20*0.75*Rayon/cm; - else: - marque_a:=20*0.5*Rayon/cm; - fi; - if Hachures: - if Inverse=false: - undraw - Codeangle(A[n-1],O,A[n],0,LATEX(""&decimal(p_)&"")); - else: - undraw - Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&""))))); - fi; - fill cercles(w shifted(marque_ang*unitvector(w-O)),3mm) withcolor - blanc; - fi; - if Inverse=false: - draw - Codeangle(A[n-1],O,A[n],0,(((LATEX(""&decimal(p_)&""))))); - else: - draw - Codeangle(A[n],O,A[n-1],0,(((LATEX(""&decimal(p_)&""))))); - fi; - fi; - fi; - % - fi; - endfor; - if #2=360: - draw cc if Hachures: withpen pencircle scaled2 fi; - else: - draw (subpath(0,length cc/2) of cc)--cycle if Hachures: withpen pencircle scaled2 fi;; - fi; - n:=0; - if Legende: - for p_=t: - if string p_: - n:=n+1; - C[n]=A[n-1] rotatedabout(O,if Inverse:-1* fi(ang[n]-ang[n-1])/2); - draw 0.95[O,C[n]]--1.05[O,C[n]]; - C[n]:=1.05[O,C[n]]; - Test(n); - if Retour=false: - if (xpart(C[n])>xpart(O)) and (ypart(C[n])>ypart(O)): - D[n]=C[n]+(0.5cm,0); - draw C[n]--D[n]; - label.urt(LATEX(p_),D[n]); - fi; - if (xpart(C[n])<xpart(O)) and (ypart(C[n])>ypart(O)): - D[n]=C[n]-(0.5cm,0); - draw C[n]--D[n]; - label.ulft(LATEX(p_),D[n]); - fi; - if (xpart(C[n])<xpart(O)) and (ypart(C[n])<ypart(O)): - D[n]=C[n]-(0.5cm,0); - draw C[n]--D[n]; - label.llft(LATEX(p_),D[n]); - fi; - if (xpart(C[n])>xpart(O)) and (ypart(C[n])<ypart(O)): - D[n]=C[n]+(0.5cm,0); - draw C[n]--D[n]; - label.lrt(LATEX(p_),D[n]); - fi; - fi; - fi; - endfor; - fi; - enddef; - vardef Test(expr nb)= - Retour:=false; - op:=0; - for l_=#4: - if l_=nb: - op:=op+1; - fi; - endfor; - if op>0: - Retour:=true; - fi; - enddef; - Figure(-10u,-10u,10u,10u); - toto(#1); - \end{mpost} - \fi -}% - -%Pour la m\'ediane. -\DTLgnewdb{mtdb}% -\dtlexpandnewvalue% -\newcount\nbdonnees% -% -\def\AjoutListEEaa#1\nil{\addtotok\tabtoksEEa{#1,}}% -\def\AjoutListEEab#1\nil{\addtotok\tabtoksEEa{#1/}}% -\def\AjoutListEEb#1\nil{\addtotok\tabtoksEEb{#1,}}% -\def\AjoutListEEx#1\nil{\addtotok\tabtoksEE{#1,}}% -\def\AjoutListEEy#1\nil{\addtotok\tabtoksEE{#1/}}% - -\DTLgnewdb{mtdbEE}% -\DTLgnewdb{mtdbEEqual}% -% -\newcommand\Stat[2][]{% - \useKVdefault[ClesStat]% - \setKV[ClesStat]{#1}% - \ifboolKV[ClesStat]{Representation}{% - \setKV[TraceG]{Xmin=0,Ymin=0}% - \setKV[TraceG]{#1}% - \readlist*\ListePointsPlaces{#2}% - \newtoks\toklistepoint% - \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}% - \MPPlacePoint[#1]{\the\toklistepoint}% - }{% - \ifboolKV[ClesStat]{Liste}{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\Liste{#2}% - \xdef\foo{}% - \setsepchar[*]{,*/}\ignoreemptyitems% - \xintFor* ##1 in {\xintSeq {1}{\Listelen}}\do{% - \xdef\foo{\foo 1/\Liste[##1],}% - }% - \readlist*\ListeComplete{\foo}% - \setKV[ClesStat]{Qualitatif}% - }{% - \ifboolKV[ClesStat]{Sondage}{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\Liste{#2}% - % "liste vide" - \newtoks\tabtoksEEa% - \tabtoksEEa{}% - % - % "liste vide" - \newtoks\tabtoksEEb% - \tabtoksEEb{}% - % - \readlist*\ListeSansDoublonsEE{999}% %% Pour ne pas avoir une liste vide - % - \newcount\cmptEE% - \newcount\PasNumEE% %% Permettra de savoir si ce sondage est qualitatif ou quantitatif - \PasNumEE=0\relax% - \DTLcleardb{mtdbEE}% - % on range les resultats du sondage par ordre croissant. - \foreachitem\x\in\Liste{% - \DTLnewrow{mtdbEE}% - \DTLnewdbentry{mtdbEE}{Numeric}{\x}% - }% - \dtlsort{Numeric}{mtdbEE}{\dtlicompare}% - \DTLforeach{mtdbEE}{\nba=Numeric}{% - \IfDecimal{\nba}{}{\PasNumEE=\numexpr\PasNumEE+1\relax}% - \cmptEE=0\relax% - \foreachitem\nbb\in\ListeSansDoublonsEE{% - \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}% - }% - \ifthenelse{\equal{\the\cmptEE}{0}}{% - \expandafter\AjoutListEEb\nba\nil% - \xdef\listEEa{\the\tabtoksEEb}% - \ignoreemptyitems% - \setsepchar{,}% - \readlist*\ListeSansDoublonsEE\listEEa% %%% Enl\`eve tous les \'elements - %%% identiques de Liste - }{}% - }% - \foreachitem\nba\in\ListeSansDoublonsEE{% - \cmptEE=0\relax% - \DTLforeach{mtdbEE}{\nbb=Numeric}{% - \ifthenelse{\equal{\nba}{\nbb}}{\cmptEE=\numexpr\cmptEE+1\relax}{}% - }% - \expandafter\AjoutListEEab\nba\nil% - \expandafter\AjoutListEEaa\the\cmptEE\nil% %%% Compte tous les \'elements - %%% identiques de Liste - }% - \xdef\listEEb{\the\tabtoksEEa} - \ignoreemptyitems% - \setsepchar[*]{,*/}% - \readlist*\ListeComplete\listEEb% - % - \ifthenelse{\equal{\the\PasNumEE}{0}}{\setKV[ClesStat]{Quantitatif}}{\setKV[ClesStat]{Qualitatif}}% - }{% - \ifboolKV[ClesStat]{Qualitatif}{% - % % on lit la liste \'ecrite sous la forme valeur/effectif - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeInitiale{#2}% - % "liste vide" - \newtoks\tabtoksEE% - \tabtoksEE{}% - \DTLcleardb{mtdbEEqual}% - \foreachitem\x\in\ListeInitiale{% - \DTLnewrow{mtdbEEqual}% - \itemtomacro\ListeInitiale[\xcnt,1]\x% - \DTLnewdbentry{mtdbEEqual}{Val}{\x}% - \itemtomacro\ListeInitiale[\xcnt,2]\y% - \DTLnewdbentry{mtdbEEqual}{Eff}{\y}% - }% - \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{% - \expandafter\AjoutListEEy\Val\nil% - \expandafter\AjoutListEEx\Eff\nil% - }% - \xdef\listEE{\the\tabtoksEE} - \ignoreemptyitems% - \setsepchar[*]{,*/}% - \readlist*\ListeComplete\listEE% - }{% Dans le qualitatif, on trie d'abord les valeurs. - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeInitiale{#2}% - % "liste vide" - \newtoks\tabtoksEE% - \tabtoksEE{}% - \DTLcleardb{mtdbEEqual}% - \foreachitem\x\in\ListeInitiale{% - \DTLnewrow{mtdbEEqual}% - \itemtomacro\ListeInitiale[\xcnt,1]\x% - \DTLnewdbentry{mtdbEEqual}{Val}{\x}% - \itemtomacro\ListeInitiale[\xcnt,2]\y% - \DTLnewdbentry{mtdbEEqual}{Eff}{\y}% - }% - \dtlsort{Val}{mtdbEEqual}{\dtlicompare}% - \DTLforeach{mtdbEEqual}{\Val=Val,\Eff=Eff}{% - \expandafter\AjoutListEEy\Val\nil% - \expandafter\AjoutListEEx\Eff\nil% - }% - \xdef\listEE{\the\tabtoksEE} - \ignoreemptyitems% - \setsepchar[*]{,*/}% - \readlist*\ListeComplete\listEE% - }}}% - % on cr\'ee la base de donn\'ees des valeurs dans le cas qualitatif - \DTLcleardb{mtdb}% - % on les trie pour la m\'ediane dans le cas qualitatif % Touhami / Texnique.fr - \foreachitem\x\in\ListeComplete{% - \DTLnewrow{mtdb}% - \itemtomacro\ListeComplete[\xcnt,2]\y% - \DTLnewdbentry{mtdb}{Numeric}{\y}% - }% - \dtlsort{Numeric}{mtdb}{\dtlicompare}% - % % on r\'einitialise les valeurs des crit\`eres de position et de - % dispersion - \renewcommand\NbDonnees{}% - \renewcommand\SommeDonnees{}% - \renewcommand\EffectifTotal{}% - \renewcommand\Moyenne{}% - \renewcommand\Etendue{}% - \renewcommand\Mediane{}% - \renewcommand\DonneeMax{0}% - \renewcommand\EffectifMax{0}% - \renewcommand\DonneeMin{999999999}% - \ifboolKV[ClesStat]{Qualitatif}{%D\'ebut qualitatif - % Calculs - % %% celui de la somme des donn\'ees - \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,2]}}}% - % %% celui de l'effectif total - \ifboolKV[ClesStat]{EffectifTotal}{% - \ifboolKV[ClesStat]{Liste}{L'effectif total de la s\'erie est - \num{\ListeCompletelen}.\par}{% - \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}% - L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in - {\xintSeq {2}{\ListeCompletelen}}\do{% - +\ListeComplete[##1,2]}=\num{\EffectifTotal}\]} - }{}% - \ifboolKV[ClesStat]{Liste}{\xdef\EffectifTotal{\ListeCompletelen}}{\xdef\EffectifTotal{\SommeDonnees}}% - % %% celui de la moyenne - \xdef\Moyenne{\fpeval{\SommeDonnees/\ListeCompletelen}}% - \ifboolKV[ClesStat]{Moyenne}{% - \ifboolKV[ClesStat]{Liste}{% - La somme des donn\'ees de la s\'erie est :% - \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% - \[ - \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% - +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% - \]}{% - \[ - \num{\ListeComplete[1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{3}}\do{% - +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{% - +\num{\ListeComplete[##1,2]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% - \]% - }% - \ifboolKV[ClesStat]{SET}{}{Le nombre de donn\'ees de la s\'erie est \num{\ListeCompletelen}.\\}% - Donc la moyenne de la s\'erie est \'egale \`a :% - \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\ListeCompletelen}}%\IfInteger{\fpeval{round(\fpeval{\SommeDonnees/\ListeCompletelen},\useKV[ClesStat]{Precision})}}{=}{\approx} - \ifboolKV[ClesStat]{ValeurExacte}{}{% - \opdiv*{\SommeDonnees}{\ListeCompletelen}{resultatmoy}{restemoy}% - \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}% - \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi% - \num{\fpeval{round(\SommeDonnees/\ListeCompletelen,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% - }% - \]% - }{Pas de moyenne possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}% - % % %% celui de l'\'etendue - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintifboolexpr{\ListeComplete[##1,2]>\DonneeMax}{% - \xdef\DonneeMax{\ListeComplete[##1,2]}% - }{}% - \xintifboolexpr{\ListeComplete[##1,2]<\DonneeMin}{% - \xdef\DonneeMin{\ListeComplete[##1,2]}% - }{}% - }% - \xdef\EffectifMax{\DonneeMax}% - \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}% - \ifboolKV[ClesStat]{Etendue}{% - \ifboolKV[ClesStat]{Liste}{% - L'\'etendue de la s\'erie est \'egale \`a $\num{\DonneeMax}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\DonneeMin}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% - }{Pas d'\'etendue possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{}% - % celui de la mediane - %%% Recuperation de la mediane %%%%%%%%%%%%%%%%%%%%% - \newcount\Recapmed% - \newcount\Recapmeda% - \ifodd\number\ListeCompletelen%odd impair - \Recapmed=\fpeval{(\ListeCompletelen+1)/2}\relax% - \else% - \Recapmed=\fpeval{\ListeCompletelen/2}\relax% - \Recapmeda=\numexpr\Recapmed+1\relax% - \fi% - \newcount\Recapk% - \Recapk=0% - \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\Recapk=\numexpr\Recapk+1\relax% - \ifnum\Recapk=\Recapmed% - \ifodd\number\ListeCompletelen% - \xdef\Mediane{\numeroDonnee}% - \else% - \xdef\Mediane{\numeroDonnee}% - \fi% - \fi% - \ifnum\Recapk=\Recapmeda% - \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}% - \fi% - }% - %%% - \ifboolKV[ClesStat]{Mediane}{% - \ifboolKV[ClesStat]{Liste}{% - On range les donn\'ees par ordre croissant :% - \nbdonnees=0% - \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% - \[\DTLforeach{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{;}}\]% - }{% - \medskip% - \begin{center} - \begin{minipage}{0.9\linewidth} - \DTLforeach*{mtdb}{\numeroDonnee=Numeric}{\num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\DTLiflastrow{.}{; - }\nbdonnees=\fpeval{\nbdonnees+1}\modulo{\nbdonnees}{\useKV[ClesStat]{Coupure}}\xintifboolexpr{\remainder==0}{\\}{}} - \end{minipage} - \end{center}% - \medskip% - }% - \newcount\med% - \newcount\meda% - \ifodd\number\ListeCompletelen%odd impair - \med=\fpeval{(\ListeCompletelen+1)/2}\relax% - L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$.\\ - \else% pair - \med=\fpeval{\ListeCompletelen/2}\relax% - \meda=\numexpr\med+1\relax% - L'effectif total de la s\'erie est \num{\ListeCompletelen}. Or, $\num{\ListeCompletelen}=\num{\the\med}+\num{\the\med}$.\\ - \fi% - \newcount\k% - \k=0% - \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\k=\numexpr\k+1\relax% - \ifnum\k=\med %La m\'ediane vaut \numeroDonnee\fi - \ifodd\number\ListeCompletelen% - La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee.\\Donc la m\'ediane de la s\'erie est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% - \xdef\Mediane{\numeroDonnee}% - \else% - La \the\med\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\numeroDonnee}% - \fi% - \fi% - \ifnum\k=\meda - La \the\meda\ieme{} donn\'ee est \num{\numeroDonnee}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.} Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\numeroDonnee)/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% - \fi% - }% - %%%%%%% - }{Pas de m\'ediane possible pour une s\'erie de donn\'ees \`a caract\`ere qualitatif.}}{} - %%% Quartile un - \newcount\PfCQuartileUn% - \modulo{\ListeCompletelen}{4}\relax% - \ifnum\remainder=0% - \PfCQuartileUn=\fpeval{\ListeCompletelen/4}% - \else% - \PfCQuartileUn=\fpeval{ceil(\ListeCompletelen/4)}% - \fi% - \newcount\PfCQunk% - \PfCQunk=0% - \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQunk=\numexpr\PfCQunk+1\relax% - \ifnum\PfCQunk=\PfCQuartileUn% - \xdef\QuartileUn{\numeroDonnee}% - \fi% - }% - %%% Quartile trois - \newcount\PfCQuartileTrois% - \modulo{\ListeCompletelen}{4}\relax% - \ifnum\remainder=0% - \PfCQuartileTrois=\fpeval{3*\ListeCompletelen/4}% - \else% - \PfCQuartileTrois=\fpeval{ceil(3*\ListeCompletelen/4)}% - \fi% - \newcount\PfCQtroisk% - \PfCQtroisk=0% - \DTLforeach{mtdb}{\numeroDonnee=Numeric}{\PfCQtroisk=\numexpr\PfCQtroisk+1\relax% - \ifnum\PfCQtroisk=\PfCQuartileTrois%La m\'ediane vaut \numeroDonnee\fi - \xdef\QuartileTrois{\numeroDonnee}% - \fi% - }% - % Construction du tableau - \ifboolKV[ClesStat]{Tableau}{% - \ifboolKV[ClesStat]{Liste}{Pas de tableau possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un tableau avec cette liste.}{\BuildtabStat}}{}% - % Construction du graphique - \ifboolKV[ClesStat]{Graphique}{% - \ifboolKV[ClesStat]{Liste}{Pas de graphique possible avec la cl\'e Liste.\\Utilisez plut\^ot la cl\'e Sondage si vous voulez un graphique avec cette liste.}{% - \ifboolKV[ClesStat]{Barre}{% - \buildgraphbarhor% - }{\ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraphq[#1]}}}% - }}{}% - }{%%%%%%%%%%%%%%%%%%%%%D\'ebut quantitatif - % % on effectue les calculs - % %% celui de la somme des donn\'ees - \foreachitem\don\in\ListeComplete{\xdef\SommeDonnees{\fpeval{\SommeDonnees+\ListeComplete[\doncnt,1]*\ListeComplete[\doncnt,2]}}}% - % %% celui de l'effectif total - \foreachitem\don\in\ListeComplete{\xdef\EffectifTotal{\fpeval{\EffectifTotal+\ListeComplete[\doncnt,2]}}}% - % %% celui de l'\'etendue - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintifboolexpr{\ListeComplete[##1,1]>\DonneeMax}{% - \xdef\DonneeMax{\ListeComplete[##1,1]}% - }{}% - \xintifboolexpr{\ListeComplete[##1,1]<\DonneeMin}{% - \xdef\DonneeMin{\ListeComplete[##1,1]}% - }{}% - }% - % \xdef\EffectifMax{\DonneeMax}% - \xdef\Etendue{\fpeval{\DonneeMax-\DonneeMin}}%% - % %% celui de la moyenne - \xdef\Moyenne{\fpeval{\SommeDonnees/\EffectifTotal}}% - \ifboolKV[ClesStat]{EffectifTotal}{% - L'effectif total de la s\'erie est : \[\ListeComplete[1,2]\xintFor* ##1 in - {\xintSeq {2}{\ListeCompletelen}}\do{% - +\ListeComplete[##1,2]}=\num{\EffectifTotal}\] - }{}% - \ifboolKV[ClesStat]{Moyenne}{% - La somme des donn\'ees de la s\'erie est :% - \xintifboolexpr{\ListeCompletelen<\useKV[ClesStat]{Coupure}}{% - \[ - \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% - +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - \] - }{% - \[ - \ifnum\ListeComplete[1,2]=1\else\num{\ListeComplete[1,2]}\times\fi\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}\xintFor* ##1 in {\xintSeq {2}{2}}\do{% - +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - }+\dots\xintFor* ##1 in {\xintSeq {\ListeCompletelen-1}{\ListeCompletelen}}\do{% - +\ifnum\ListeComplete[##1,2]=1\else\num{\ListeComplete[##1,2]}\times\fi\num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - }=\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{} - \] - }% - \ifboolKV[ClesStat]{SET}{}{L'effectif total de la s\'erie est :% - \ifboolKV[ClesStat]{Liste}{ \num{\EffectifTotal}\\}{% - \[\num{\ListeComplete[1,2]}\xintFor* ##1 in {\xintSeq {2}{\ListeCompletelen}}\do{% - +\num{\ListeComplete[##1,2]} - }=\num{\EffectifTotal} - \]% - }% - }% - Donc la moyenne de la s\'erie est \'egale \`a :% - \[\frac{\num{\SommeDonnees}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}}{\num{\EffectifTotal}}% - \ifboolKV[ClesStat]{ValeurExacte}{}{% - \opdiv*{\SommeDonnees}{\EffectifTotal}{resultatmoy}{restemoy}% - \opround{resultatmoy}{\useKV[ClesStat]{Precision}}{resultatmoy1}% - \opcmp{resultatmoy}{resultatmoy1}\ifopeq=\else\approx\fi% - \num{\fpeval{round(\SommeDonnees/\EffectifTotal,\useKV[ClesStat]{Precision})}}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}% - }% - \]% - }{}% - % % Affichage des r\'eponses. - % %% pour l'\'etendue - \ifboolKV[ClesStat]{Etendue}{L'\'etendue de la s\'erie est \'egale \`a $\num{\ListeComplete[\ListeCompletelen,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}-\num{\ListeComplete[1,1]}\ifboolKV[ClesStat]{Concret}{~\text{\useKV[ClesStat]{Unite}}}{}=\num{\Etendue}$\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}}{}% - % pour la m\'ediane - %%% Recuperation Mediane - \newcount\Recupmed% - \newcount\Recupmeda% - \ifodd\number\EffectifTotal%odd impair - \Recupmed=\fpeval{(\EffectifTotal+1)/2}\relax% - \else% pair - \Recupmed=\fpeval{\EffectifTotal/2}\relax% - \Recupmeda=\numexpr\Recupmed+1\relax% - \fi% - \newcount\Recupk% - \Recupk=0% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% - \Recupk=\numexpr\Recupk+1\relax% - \ifnum\Recupk=\Recupmed% - \ifodd\number\EffectifTotal% - \xdef\Mediane{\ListeComplete[##1,1]}% - \else% - \xdef\Mediane{\ListeComplete[##1,1]}% - \fi% - \fi% - \ifnum\Recupk=\Recupmeda% - \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}% - \fi% - }% - }% - %%% - \ifboolKV[ClesStat]{Mediane}{% - - \newcount\med% - \newcount\meda% - \ifodd\number\EffectifTotal%odd impair - \med=\fpeval{(\EffectifTotal+1)/2}\relax% - L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med-1}}+1+\num{\fpeval{\med-1}}$. % - \else% pair - \med=\fpeval{\EffectifTotal/2}\relax% - \meda=\numexpr\med+1\relax% - L'effectif total de la s\'erie est \num{\EffectifTotal}. Or, $\num{\EffectifTotal}=\num{\fpeval{\med}}+\num{\fpeval{\med}}$. % - \fi% - \newcount\k% - \k=0% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% - \k=\numexpr\k+1\relax% - \ifnum\k=\med% - \ifodd\number\EffectifTotal% - La m\'ediane de la s\'erie est la \the\med\ieme{} donn\'ee. Donc la m\'ediane de la s\'erie est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% - \else% - La \the\med\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}. }{. }\xdef\Mediane{\ListeComplete[##1,1]}% - \fi% - \fi% - \ifnum\k=\meda% - La \the\meda\ieme{} donn\'ee est \num{\ListeComplete[##1,1]}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}\\Donc la m\'ediane de la s\'erie est \xdef\Mediane{\fpeval{(\Mediane+\ListeComplete[##1,1])/2}}\num{\Mediane}\ifboolKV[ClesStat]{Concret}{~\useKV[ClesStat]{Unite}.}{.}% - \fi% - }% - }% - }{}% - %%% Quartile un - \newcount\PfCQuartileUn% - \modulo{\EffectifTotal}{4}\relax% - \ifnum\remainder=0% - \PfCQuartileUn=\fpeval{\EffectifTotal/4}% - \else% - \PfCQuartileUn=\fpeval{ceil(\EffectifTotal/4)}% - \fi% - \newcount\PfCQunk% - \PfCQunk=0% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% - \PfCQunk=\numexpr\PfCQunk+1\relax% - \ifnum\PfCQunk=\PfCQuartileUn% - \xdef\QuartileUn{\ListeComplete[##1,1]}% - \fi% - }% - }% - %%% Quartile trois - \newcount\PfCQuartileTrois% - \modulo{\EffectifTotal}{4}\relax% - \ifnum\remainder=0% - \PfCQuartileTrois=\fpeval{3*\EffectifTotal/4}% - \else% - \PfCQuartileTrois=\fpeval{ceil(3*\EffectifTotal/4)}% - \fi% - \newcount\PfCQtroisk% - \PfCQtroisk=0% - \xintFor* ##1 in {\xintSeq {1}{\ListeCompletelen}}\do{% - \xintFor* ##2 in {\xintSeq {1}{\ListeComplete[##1,2]}}\do{% - \PfCQtroisk=\numexpr\PfCQtroisk+1\relax% - \ifnum\PfCQtroisk=\PfCQuartileTrois% - \xdef\QuartileTrois{\ListeComplete[##1,1]}% - \fi% - }% - }% - % Construction de tableau - \ifboolKV[ClesStat]{Tableau}{\BuildtabStat}{}% - % Construction du graphique ?? - \ifboolKV[ClesStat]{Graphique}{% - \ifboolKV[ClesStat]{Angle}{\buildgraphcq{360}}{\ifboolKV[ClesStat]{SemiAngle}{\buildgraphcq{180}}{\buildgraph[#1]}} - }{}% - }% - }% -}% - -%%% -% Radar -%%% -\setKVdefault[ClesRadar]{Rayon=3cm,Reference=20,MoyenneClasse=false,Disciplines=false,Pas=5} - -\newtoks\toklisteradara%pour la moyenne de l'\'el\`eve -\newtoks\toklisteradarb%pour la discipline -\newtoks\toklisteradarc%pour la moyenne de classe - -\def\UpdateRadara#1/#2/#3\nil{\addtotok\toklisteradara{#1,}} -\def\UpdateRadarb#1/#2/#3\nil{\addtotok\toklisteradarb{"#2",}} -\def\UpdateRadarc#1/#2/#3\nil{\addtotok\toklisteradarc{#3,}} - -\newcommand\MPRadar[6]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - pair O; - O=(0,0); - path cc; - cc=cercles(O,#1); - %%etiquettage des disciplines - n:=0;%compter le nombre de disciplines - for p_=#2: - n:=n+1; - endfor; - for k=1 upto n: - N[k]=k*(360/n); - trace segment(O,pointarc(cc,N[k]));% dashed evenly; - endfor; - p:=0; - for p_=#2: - p:=p+1; - if (N[p]<90) or (N[p]=90): - label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if ((N[p]>90) and (N[p]<180)) or (N[p]=180): - label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if (N[p]>180) and (N[p]<270): - label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if (N[p]>270) or (N[p]=270): - label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - endfor; - % trac\'e des pas: - pas=#4/#3; - for k=1 upto pas-1: - trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor - --cycle dashed evenly withcolor 0.5white; - endfor; - trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor - --cycle; - % etiquettage des pas - dotlabel.urt(TEX("\tiny"&decimal(#4)),pointarc(cc,0)); - dotlabel.urt(TEX("\tiny"&decimal(#3)),(1/pas)[O,pointarc(cc,0)]); - % trac\'e des r\'esultats \'el\`eves - pair El[]; - el=0; - for p_=#5: - el:=el+1; - El[el]=(p_/#4)[O,pointarc(cc,N[el])]; - endfor; - trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen - pencircle scaled 1.5 withcolor blue; - % trac\'e des r\'esultats classe - pair Cl[]; - cl=0; - for p_=#6: - cl:=cl+1; - Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])]; - endfor; - trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge; - \end{mplibcode} - \else - \begin{mpost} - pair O; - O=(0,0); - path cc; - cc=cercles(O,#1); - %%etiquettage des disciplines - n:=0;%compter le nombre de disciplines - for p_=#2: - n:=n+1; - endfor; - for k=1 upto n: - N[k]=k*(360/n); - trace segment(O,pointarc(cc,N[k]));% dashed evenly; - endfor; - p:=0; - for p_=#2: - p:=p+1; - if (N[p]<90) or (N[p]=90): - label.urt(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if ((N[p]>90) and (N[p]<180)) or (N[p]=180): - label.ulft(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if (N[p]>180) and (N[p]<270): - label.llft(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - if (N[p]>270) or (N[p]=270): - label.lrt(TEX(p_),1.025[O,pointarc(cc,N[p])]); - fi; - endfor; - % trac\'e des pas: - pas=#4/#3; - for k=1 upto pas-1: - trace (k/pas)[O,pointarc(cc,N[1])] for l=2 upto n: --(k/pas)[O,pointarc(cc,N[l])] endfor - --cycle dashed evenly withcolor 0.5white; - endfor; - trace pointarc(cc,N[1]) for l=2 upto n: --pointarc(cc,N[l]) endfor - --cycle; - % etiquettage des pas - dotlabel.top(LATEX("\noexpand\tiny"&decimal(#4)&"") rotated -90,pointarc(cc,0)); - dotlabel.urt(LATEX("\noexpand\tiny"&decimal(#3)&""),(1/pas)[O,pointarc(cc,0)]); - % trac\'e des r\'esultats \'el\`eves - pair El[]; - el=0; - for p_=#5: - el:=el+1; - El[el]=(p_/#4)[O,pointarc(cc,N[el])]; - endfor; - trace El[1] for p=2 upto n:--El[p] endfor --cycle withpen - pencircle scaled 1.5 withcolor blue; - % trac\'e des r\'esultats classe - pair Cl[]; - cl=0; - for p_=#6: - cl:=cl+1; - Cl[cl]=(p_/#4)[O,pointarc(cc,N[cl])]; - endfor; - trace Cl[1] for p=2 upto n:--Cl[p] endfor --cycle withcolor rouge; - \end{mpost} - \fi -} - -\newcommand\Radar[2][]{% - % 1 les param\`etres - % 2 la r\'epartition des notes - \useKVdefault[ClesRadar]% - \setKV[ClesRadar]{#1}% - \ignoreemptyitems% - \setsepchar[*]{,}% - \readlist*\ListeRadar{#2}% - \toklisteradara{}% - \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadara\compteur\nil}% - \ifboolKV[ClesRadar]{Disciplines}{}{% - \toklisteradarb{}% - \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarb\compteur\nil}% - }% - \ifboolKV[ClesRadar]{MoyenneClasse}{}{% - \toklisteradarc{}% - \foreachitem\compteur\in\ListeRadar{\expandafter\UpdateRadarc\compteur\nil}% - }% - \MPRadar{\useKV[ClesRadar]{Rayon}}{\the\toklisteradarb}{\useKV[ClesRadar]{Pas}}{\useKV[ClesRadar]{Reference}}{\the\toklisteradara}{\the\toklisteradarc}% -} - -%%% -% Barres de niveaux -%%% -\setKVdefault[ClesBarre]{Niveau=false,LimiteI=25,LimiteF=50,LimiteS=75,TexteOrigine=0,TexteReference=100,CouleurGraduation=white,CouleurFond=gray!50,CouleurBarre=black,Graduation=false,Nom=D\'efaut,Pas=10,CouleurI=red,CouleurF=orange,CouleurS=yellow,CouleurM=green} - -\newlength{\barrewidth} - -\newcommand\Jauge[2][]{% - \setlength{\barrewidth}{\linewidth-2\fboxsep}% - \useKVdefault[ClesBarre]% - \setKV[ClesBarre]{#1}% - \xdef\NomComp{\useKV[ClesBarre]{Nom}}% - \def\TexteOrigine{\useKV[ClesBarre]{TexteOrigine}}% - \def\TexteReference{\useKV[ClesBarre]{TexteReference}}% - \xdef\CouleurFond{\useKV[ClesBarre]{CouleurFond}}% - \xdef\CouleurGrad{\useKV[ClesBarre]{CouleurGraduation}}% - \xdef\CouleurBarre{\useKV[ClesBarre]{CouleurBarre}}% - \xdef\CouleurI{\useKV[ClesBarre]{CouleurI}}% - \xdef\CouleurF{\useKV[ClesBarre]{CouleurF}}% - \xdef\CouleurS{\useKV[ClesBarre]{CouleurS}}% - \xdef\CouleurM{\useKV[ClesBarre]{CouleurM}}% - \ifboolKV[ClesBarre]{Niveau}{% - \begin{tikzpicture}[rounded corners=2pt,very thin] - \fill [gray!50] (0,0) rectangle (\barrewidth, 0.15); - \xintifboolexpr{#2<\useKV[ClesBarre]{LimiteI}}{% - \fill [\CouleurI] (0,0) rectangle (#2/100*\barrewidth, 0.15); - }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteF}}{% - \fill [\CouleurF] (0,0) rectangle (#2/100*\barrewidth, 0.15); - }{\xintifboolexpr{#2<\useKV[ClesBarre]{LimiteS}}{% - \fill [\CouleurS] (0,0) rectangle (#2/100*\barrewidth, 0.15); - }{\fill [\CouleurM] (0,0) rectangle (#2/100*\barrewidth, 0.15);} - }% - }% - \node[anchor=south west] at (0,0.5em) {\NomComp};% - \node[anchor=north] at (0,-0.25em) {\TexteOrigine}; - \node[anchor=north] at (\barrewidth,-0.25em) {\TexteReference}; - \ifboolKV[ClesBarre]{Graduation}{% - \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}% - { - \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15); - } - }{} - \foreach \s in {\useKV[ClesBarre]{LimiteI},\useKV[ClesBarre]{LimiteF},\useKV[ClesBarre]{LimiteS}}% - { - \draw[black] (\s/100*\barrewidth,-0.1)--(\s/100*\barrewidth,0.2);% - } - \end{tikzpicture}% - }{% - \begin{tikzpicture}[rounded corners=2pt,very thin] - \fill [\CouleurFond] (0,0) rectangle (\barrewidth, 0.15);% - \fill [\CouleurBarre] (0,0) rectangle (#2/100*\barrewidth, 0.15);% - \node[anchor=south west] at (0,0.5em) {\NomComp};% - \node[anchor=north] at (0,-0.25em) {\useKV[ClesBarre]{TexteOrigine}};% - \node[anchor=north] at (\barrewidth,-0.25em) {\useKV[ClesBarre]{TexteReference}};% - \ifboolKV[ClesBarre]{Graduation}{% - \foreach \s in {1,...,\fpeval{\useKV[ClesBarre]{Pas}-1}}% - { - \draw[\CouleurGrad] (\s/\useKV[ClesBarre]{Pas}*\barrewidth,0)--(\s/\useKV[ClesBarre]{Pas}*\barrewidth,0.15); - }}{}% - \end{tikzpicture}% - } -} - -%%% -% Equations -%%% -\setKVdefault[ClesEquation]{Ecart=0.5,Fleches=false,FlecheDiv=false,Laurent=false,Decomposition=false,Terme=false,Composition=false,Symbole=false,Decimal=false,Entier=false,Lettre=x,Solution=false,LettreSol=true,Bloc=false,Simplification=false,CouleurTerme=black,CouleurCompo=black,CouleurSous=red,CouleurSymbole=orange,Verification=false,Nombre=0,Egalite=false,Produit=false,Facteurs=false,Carre=false,Exact=false,Pose=false,Equivalence=false} - -\newcommand\rightcomment[4]{% - \begin{tikzpicture}[remember picture,overlay] - \draw[Cfleches,-stealth] - ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$) - .. controls +(0.2,-0.05) and +(0.2,0.1) .. - node[right,align=left]{#4} - ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$); - \end{tikzpicture}% -}% - -\newcommand\leftcomment[4]{% - \begin{tikzpicture}[remember picture,overlay] - \draw[Cfleches,-stealth] - ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$) - .. controls +(-0.2,-0.05) and +(-0.2,0.1) .. - node[left,align=right]{#4} - ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$); - \end{tikzpicture}% -}% - -\newcommand\Rightcomment[4]{% - \begin{tikzpicture}[remember picture,overlay] - \draw[Cfleches,-stealth] - ($({pic cs:#3}|-{pic cs:#1})+(\useKV[ClesEquation]{Ecart},0)$) - .. controls +(0.2,-0.05) and +(0.2,0.1) .. - node[right,align=left]{#4} - ($({pic cs:#3}|-{pic cs:#2})+(\useKV[ClesEquation]{Ecart},0.1)$); - \end{tikzpicture}% -}% -\newcommand\Leftcomment[4]{% - \begin{tikzpicture}[remember picture,overlay] - \draw[Cfleches,-stealth] - ($({pic cs:#3}|-{pic cs:#1})-(\useKV[ClesEquation]{Ecart},0)$) - .. controls +(-0.2,-0.05) and +(-0.2,0.1) .. - node[left,align=right]{#4} - ($({pic cs:#3}|-{pic cs:#2})-(\useKV[ClesEquation]{Ecart},-0.1)$); - \end{tikzpicture}% -}% - -% Pour "oublier" les tikzmarks. En cas de plusieurs utilisations de la macro \ResolEquation -\newcounter{Nbequa} -\setcounter{Nbequa}{0} - -%CT -\newdimen\fdashwidth \fdashwidth = 0.8pt % \'epaisseur traits -\newdimen\fdashlength \fdashlength = 0.5mm % longueur des pointill\'es et s\'eparation entre pointill\'es -\newdimen\fdashsep \fdashsep = 3pt % s\'eparateur entre contenu et traits - -\def\fdash#1{% - \leavevmode\begingroup% - \setbox0\hbox{#1}% - \def\hdash{\vrule height\fdashwidth width\fdashlength\relax}% - \def\vdash{\hrule height\fdashlength width\fdashwidth\relax}% - \def\dashblank{\kern\fdashlength}% - \ifdim\fdashsep>0pt - \setbox0\hbox{\vrule width0pt height\dimexpr\ht0+\fdashsep depth\dimexpr\dp0+\fdashsep\kern\fdashsep\unhbox0 \kern\fdashsep}% - \fi - \edef\hdash{\hbox to\the\wd0{\noexpand\color{Csymbole}\hdash\kern.5\fdashlength\xleaders\hbox{\hdash\dashblank}\hfil\hdash}}% - \edef\vdash{\vbox to\the\dimexpr\ht0+\dp0+2\fdashwidth{\noexpand\color{Csymbole}\vdash\kern.5\fdashlength\xleaders\vbox{\vdash\dashblank}\vfil\vdash}}% - \hbox{% - \vdash - \vtop{\vbox{\offinterlineskip\hdash\hbox{\unhbox0 }\hdash}}% - \vdash}% - \endgroup -} -% fin CT -\def\Fdash#1{\raisebox{-2\fdashsep+\fdashwidth}{\fdash{#1}}} - -%Une simplification de a/b est possible ou non ? -\newboolean{Simplification} - -\newcommand\SSimpliTest[2]{% - % Test d'une simplification possible ou pas de #1/#2 - \newcount\numerateur\newcount\denominateur\newcount\valabsnum\newcount\valabsdeno% - \numerateur=\number#1 - \denominateur=\number#2 - \ifnum\number#1<0 - \valabsnum=\numexpr0-\number#1 - \else - \valabsnum=\number#1 - \fi - \ifnum\number#2<0 - \valabsdeno=\numexpr0-\number#2 - \else - \valabsdeno=\number#2 - \fi - \ifnum\the\valabsnum=0 - \setboolean{Simplification}{true} - \else - \PGCD{\the\valabsnum}{\the\valabsdeno} - \ifnum\pgcd>1 - \setboolean{Simplification}{true} - \else - \ifnum\the\numerateur<0 - \ifnum\the\denominateur<0 - \setboolean{Simplification}{true} - \else - \ifnum\valabsdeno=1\relax - \setboolean{Simplification}{true} - \else - \setboolean{Simplification}{false} - \fi - \fi - \else - \ifnum\valabsdeno=1\relax - \setboolean{Simplification}{true} - \else - \setboolean{Simplification}{false} - \fi - \fi - \fi - \fi -} - -\definecolor{Cfleches}{RGB}{100,100,100}% - -\newcommand\AffichageEqua[4]{% - \def\LETTRE{\useKV[ClesEquation]{Lettre}}% - \ensuremath{% - % partie du x - \xintifboolexpr{#1==0}{}{\xintifboolexpr{#1==1}{}{\xintifboolexpr{#1==-1}{-}{\num{#1}}}\LETTRE}% - % partie du nombre - \xintifboolexpr{#2==0}{\xintifboolexpr{#1==0}{0}{}}{\xintifboolexpr{#2>0}{\xintifboolexpr{#1==0}{}{+}\num{#2}}{\num{#2}}}% - % egal - = - % partie du x - \xintifboolexpr{#3==0}{}{\xintifboolexpr{#3==1}{}{\xintifboolexpr{#3==-1}{-}{\num{#3}}}\LETTRE}% - % partie du nombre - \xintifboolexpr{#4==0}{% - \xintifboolexpr{#3==0}{0}{} - }{% - \xintifboolexpr{#4>0}{\xintifboolexpr{#3==0}{}{+}\num{#4}}{\num{#4}}% - } - }% -}% - -\newcommand\EcrireSolutionEquation[4]{% - L'équation \AffichageEqua{#1}{#2}{#3}{#4} a une unique solution : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$. -}% - -\input{PfCEquationSoustraction2}% -\input{PfCEquationTerme1}% -\input{PfCEquationComposition2}% -\input{PfCEquationPose1}% -\input{PfCEquationSymbole1}% -\input{PfCEquationLaurent1} - -\newcommand\ResolEquation[5][]{% - \useKVdefault[ClesEquation]% - \setKV[ClesEquation]{#1}% - \colorlet{Cterme}{\useKV[ClesEquation]{CouleurTerme}}% - \colorlet{Ccompo}{\useKV[ClesEquation]{CouleurCompo}}% - \colorlet{Csymbole}{\useKV[ClesEquation]{CouleurSymbole}}% - \colorlet{Cdecomp}{\useKV[ClesEquation]{CouleurSous}}% - \ifboolKV[ClesEquation]{Carre}{% - \ResolEquationCarre[#1]{#2}% - }{% - \ifboolKV[ClesEquation]{Produit}{% - \ResolEquationProduit[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesEquation]{Verification}{% - \Verification[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesEquation]{Symbole}{% - \ResolEquationSymbole[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesEquation]{Laurent}{% - \ResolEquationLaurent[#1]{#2}{#3}{#4}{#5}% - }{% - \ifboolKV[ClesEquation]{Terme}{% - \ResolEquationTerme[#1]{#2}{#3}{#4}{#5}% - }{\ifboolKV[ClesEquation]{Composition}{% - \ResolEquationComposition[#1]{#2}{#3}{#4}{#5}% - }{\ifboolKV[ClesEquation]{Pose}{% - \ResolEquationL[#1]{#2}{#3}{#4}{#5}% - }{% - \ResolEquationSoustraction[#1]{#2}{#3}{#4}{#5}% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -\newcommand\ResolEquationCarre[2][]{% - \setKV[ClesEquation]{#1}% - \xintifboolexpr{#2<0}{% - Comme $\num{#2}$ est n\'egatif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ n'a aucune solution.% - }{\xintifboolexpr{#2==0}{% - L'\'equation $\useKV[ClesEquation]{Lettre}^2=0$ a une unique solution : $\useKV[ClesEquation]{Lettre}=0$.% - }{% - Comme \num{#2} est positif, alors l'\'equation $\useKV[ClesEquation]{Lettre}^2=\num{#2}$ a deux solutions :% - \begin{align*} - \useKV[ClesEquation]{Lettre}&=\sqrt{\num{#2}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\sqrt{\num{#2}}%\\ - \ifboolKV[ClesEquation]{Exact}{\\% - \useKV[ClesEquation]{Lettre}&=\num{\fpeval{sqrt(#2)}}&&\text{et}&\useKV[ClesEquation]{Lettre}&=-\num{\fpeval{sqrt(#2)}}}{}% - \end{align*} - }% - }% -}% - -\newcommand\ResolEquationProduit[5][]{% - \setKV[ClesEquation]{#1}% - \ifboolKV[ClesEquation]{Equivalence}{}{C'est un produit nul donc \ifboolKV[ClesEquation]{Facteurs}{l'un au - moins des facteurs est nul}{} :}% - \ifboolKV[ClesEquation]{Equivalence}{% - \[\Distri{#2}{#3}{#4}{#5}=0\] - \begin{align*}% - &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&\quad&\makebox[0pt]{ou}\quad&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\ - &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\ - \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1 - &\makebox[0pt]{$\Longleftrightarrow$}&\xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}} - % accolade%\\ - %%%% - \ifboolKV[ClesEquation]{Entier}{% - \xdef\TSimp{}% - \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}} - \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{} - \xintifboolexpr{\TSimp==0}{}{\\ - \ifboolKV[ClesEquation]{Simplification}{% - &\makebox[0pt]{$\Longleftrightarrow$}&\SSimpliTest{\Coeffb}{\Coeffa}\xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\ - } - }{} - &&&\ifboolKV[ClesEquation]{Simplification}{% - \SSimpliTest{\Coeffd}{\Coeffc}% - \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\ - } - }{} - } - }{} - } - \end{align*} - }{% - \begin{align*} - \xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}&=0&&\text{ou}&\xintifboolexpr{#5==0}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}&=0\\ - \xintifboolexpr{#3==0}{\xdef\Coeffa{1}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{#2==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffa{#2}\xdef\Coeffb{\fpeval{0-#3}}\xintifboolexpr{\Coeffa==1}{}{\num{\Coeffa}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffb}}&&&\xintifboolexpr{#5==0}{\xdef\Coeffc{1}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{#4==1}{&}{\useKV[ClesEquation]{Lettre}&=0}}{\xdef\Coeffc{#4}\xdef\Coeffd{\fpeval{0-#5}}\xintifboolexpr{\Coeffc==1}{}{\num{\Coeffc}}\useKV[ClesEquation]{Lettre}&=\num{\Coeffd}}%\\ - \xintifboolexpr{\Coeffa==1 'and' \Coeffc==1}{}{\\%\ifnum\cmtd>1 - \xintifboolexpr{\Coeffa==1}{&}{\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffb}}{\num{\Coeffa}}}\xintifboolexpr{\Coeffc==1}{}{&&&\useKV[ClesEquation]{Lettre}&=\frac{\num{\Coeffd}}{\num{\Coeffc}}} - %accolade%\\ - %%%% - \ifboolKV[ClesEquation]{Entier}{% - \xdef\TSimp{} - \SSimpliTest{\Coeffb}{\Coeffa}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#3==0}{\xdef\TSimp{0}}{\xdef\TSimp{1}}}{\xdef\TSimp{0}} - \SSimpliTest{\Coeffd}{\Coeffc}\ifthenelse{\boolean{Simplification}}{\xintifboolexpr{#5==0}{}{\xdef\TSimp{\fpeval{\TSimp+1}}}}{} - \xintifboolexpr{\TSimp==0}{}{\\ - \ifboolKV[ClesEquation]{Simplification}{% - \SSimpliTest{\Coeffb}{\Coeffa} - \xintifboolexpr{\Coeffa==1}{&}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffb}{\Coeffa}}{&}%\\ - } - }{} - &&&\ifboolKV[ClesEquation]{Simplification}{% - \SSimpliTest{\Coeffd}{\Coeffc}% - \xintifboolexpr{\Coeffc==1}{}{\ifthenelse{\boolean{Simplification}}{\useKV[ClesEquation]{Lettre}&=\SSimplifie{\Coeffd}{\Coeffc}}{}%\\ - } - }{} - } - }{} - } - \end{align*} - }% - \ifboolKV[ClesEquation]{Solution}{L'\'equation $\xintifboolexpr{#3==0}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}})}\xintifboolexpr{#5==0}{\times\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}}{(\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}})}=0$ a deux solutions : \opdiv*{\Coeffb}{\Coeffa}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffb}{\Coeffa}}{\frac{\num{\Coeffb}}{\num{\Coeffa}}}\fi$ et \opdiv*{\Coeffd}{\Coeffc}{solution}{resteequa}\opcmp{resteequa}{0}$\ifboolKV[ClesEquation]{LettreSol}{\useKV[ClesEquation]{Lettre}=}{}\displaystyle\ifopeq\opexport{solution}{\solution}\num{\solution}\else\ifboolKV[ClesEquation]{Entier}{\SSimplifie{\Coeffd}{\Coeffc}}{\frac{\num{\Coeffd}}{\num{\Coeffc}}}\fi$. - }{}% -} - -\newcommand\Verification[5][]{% - \setKV[ClesEquation]{#1}% - \xdef\ValeurTest{\useKV[ClesEquation]{Nombre}}% - Testons la valeur $\useKV[ClesEquation]{Lettre}=\num{\ValeurTest}$ :% - \begin{align*} - \xintifboolexpr{#2==0}{\num{#3}}{\num{#2}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{\num{#5}}{\num{#4}\times\xintifboolexpr{\ValeurTest<0}{(\num{\ValeurTest})}{\num{\ValeurTest}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\ - \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{\num{#3}}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}}}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{\num{#5}}}}\\ - \xintifboolexpr{#2==0}{}{\num{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}}&&\xintifboolexpr{#4==0}{}{\num{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}} - \end{align*} - \xdef\Testa{\fpeval{#2*\useKV[ClesEquation]{Nombre}+#3}}\xdef\Testb{\fpeval{#4*\useKV[ClesEquation]{Nombre}+#5}}% - \ifboolKV[ClesEquation]{Egalite}{% - Comme \xintifboolexpr{\Testa==\Testb}{$\num{\Testa}=\num{\Testb}$}{$\num{\Testa}\not=\num{\Testb}$}, alors l'\'egalit\'e $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$ \xintifboolexpr{\Testa==\Testb}{ est v\'erifi\'ee }{ n'est pas v\'erifi\'ee } pour $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$.% - }{\xintifboolexpr{\Testa==\Testb}{Comme $\num{\Testa}=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ est bien }{Comme $\num{\Testa}\not=\num{\Testb}$, alors $\useKV[ClesEquation]{Lettre}=\num{\useKV[ClesEquation]{Nombre}}$ n'est pas }une solution de l'\'equation $\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#2==1}{}{\num{#2}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}=\xintifboolexpr{#4==0}{\num{#5}}{\xintifboolexpr{#4==1}{}{\num{#4}}\useKV[ClesEquation]{Lettre}\xintifboolexpr{#5==0}{}{\xintifboolexpr{#5>0}{+\num{#5}}{-\num{\fpeval{0-#5}}}}}$.}% -}% - -%%% -% Proportionnalit\'e -%%% -\setKVdefault[ClesPropor]{GrandeurA=Grandeur A,GrandeurB=Grandeur B,Largeur=1cm,Math=false,Stretch=1,ColorFill=white,CouleurTab=gray!15,Vertical=false}% - -\def\Updatetoksmath#1/#2\nil{\addtotok\tabtoksa{}\addtotok\tabtoksb{}}% -\def\updatetokspropor#1/#2\nil{\addtotok\tabtoksa{&\num{#1}}\addtotok\tabtoksb{&\num{#2}}} -\def\Buildtabpropor{% - \setcounter{NbProporG}{0}% - \setcounter{NbProporD}{0}% - \renewcommand{\arraystretch}{\useKV[ClesPropor]{Stretch}}% - \ifboolKV[ClesPropor]{Vertical}{% - \begin{tabular}{c|*{2}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}c}% - \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPH}&\multicolumn{1}{c}{\TikzPH}&\\ - \hhline{~--~}% - &\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}&\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}&\\ - \hhline{~--~}% - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\ListeValeurlen}}}\do{% - \stepcounter{NbProporG}\TikzPG&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,1]}{\num{\ListeValeur[##1,1]}}&\ifboolKV[ClesPropor]{Math}{\ListeValeur[##1,2]}{\num{\ListeValeur[##1,2]}}&\stepcounter{NbProporD}\TikzPD\\ - \hhline{~--~}% - }% - \multicolumn{1}{c}{}&\multicolumn{1}{c}{\setcounter{NbPropor}{1}\TikzPB}&\multicolumn{1}{c}{\TikzPB}&\\ - \end{tabular}% - }{% - \tabtoksa{}\tabtoksb{}% - \tabtoksa{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurA}}\tabtoksb{\cellcolor{\useKV[ClesPropor]{CouleurTab}}\useKV[ClesPropor]{GrandeurB}}% - \ifboolKV[ClesPropor]{Math}{% - \foreachitem\compteur\in\ListeValeur{\expandafter\Updatetoksmath\compteur\nil}% - }{\foreachitem\compteur\in\ListeValeur{\expandafter\updatetokspropor\compteur\nil}% - }% - \xdef\LongListe{\ListeValeurlen}% - \begin{tabular}{rc|*{\number\numexpr\ListeValeurlen}{>{\centering\arraybackslash}p{\useKV[ClesPropor]{Largeur}}|}l}% - \multicolumn{1}{c}{}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPH}}&\multicolumn{1}{c}{}\\% - \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% - \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksa&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% - \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% - \multicolumn{1}{c|}{\stepcounter{NbProporG}\TikzPG}&\the\tabtoksb&\multicolumn{1}{c}{\stepcounter{NbProporD}\TikzPD}\\% - \hhline{~*{\number\numexpr\ListeValeurlen+1}{-}~}% - \multicolumn{1}{c}{\stepcounter{NbProporG}\TikzPG}&\multicolumn{1}{c}{}\setcounter{NbPropor}{1}\xintFor* ##1 in {\xintSeq {1}{\ListeValeurlen}}\do{&\multicolumn{1}{c}{\TikzPB}}&\multicolumn{1}{c}{}\\% - \end{tabular}% - }% - \renewcommand{\arraystretch}{1}% -}% - -\newcounter{NbPropor}% - -\newcommand\TikzPH{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporH-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}% - \stepcounter{NbPropor}% -}% - -\newcommand\TikzPB{% - \tikz[remember picture, overlay]{% - \coordinate[name=ProporB-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}% - \stepcounter{NbPropor}% -}% - -\newcommand\TikzPG{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporG-\theNbProporG,xshift=\tabcolsep+\arrayrulewidth,yshift=\getstrut\dp];}% -}% -\newcommand\TikzPD{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporD-\theNbProporD,xshift=-\tabcolsep-\arrayrulewidth,yshift=\getstrut\dp];}% -}% - -\newcommand\TikzPHD{% - \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}% - \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}% - \xintifboolexpr{\wd1>\wd2}{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporHD,xshift=-0.5\wd1,yshift=-\getstrut\dp*\arraystretch];}% - }{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporHD,xshift=-0.5\wd2,yshift=-\getstrut\dp*\arraystretch];}% - } -}% - -\newcommand\TikzPBD{% - \setbox1=\hbox{\useKV[ClesPropor]{GrandeurA}}% - \setbox2=\hbox{\useKV[ClesPropor]{GrandeurB}}% - \xintifboolexpr{\wd1>\wd2}{% - \tikz[remember picture, overlay]{% - \coordinate[name=ProporBD,xshift=-0.5*\the\wd1,yshift=\getstrut\ht*\arraystretch];}% - }{% - \tikz[remember picture, overlay]{% - \coordinate[name=ProporBD,xshift=-0.5*\the\wd2,yshift=\getstrut\ht*\arraystretch];}% - } - \stepcounter{NbPropor}% -}% -% -\newcommand\FlechesPH[3]{% - \begin{tikzpicture}[remember picture,overlay]% - \ifnum#1<#2\relax% - \draw[-stealth,out=50,in=130] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);% - \else% - \draw[-stealth,out=130,in=50] (ProporH-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporH-#2);% - \fi% - \end{tikzpicture}% -}% -% -\newcommand\FlechesPB[3]{% - \ifnum\number#1<\number#2\relax% - \begin{tikzpicture}[remember picture,overlay]% - \draw[-stealth,out=-50,in=-130] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);% - \end{tikzpicture}% - \else% - \begin{tikzpicture}[remember picture,overlay]% - \draw[-stealth,out=-130,in=-50] (ProporB-#1) to node[inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, sloped]{#3}(ProporB-#2);% - \end{tikzpicture}% - \fi% -}% -% -\newcommand\FlechesPG[3]{% - \begin{tikzpicture}[remember picture,overlay]% - \ifnum#1<#2\relax% - \draw[-stealth,out=-150,in=150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,left]{#3}(ProporG-#2);% - \else% - \draw[-stealth,out=150,in=-150] (ProporG-#1) to node[transform canvas={xshift=-1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5, left]{#3}(ProporG-#2);% - \fi% - \end{tikzpicture}% -}% - -\newcommand\FlechesPD[3]{% - \begin{tikzpicture}[remember picture,overlay]% - \ifnum#1<#2\relax% - \draw[-stealth,out=-30,in=30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);% - \else% - \draw[-stealth,out=30,in=-30] (ProporD-#1) to node[transform canvas={xshift=1pt},inner sep=0pt, inner xsep=1pt,fill=\colorfill, pos=0.5,right]{#3}(ProporD-#2);% - \fi% - \end{tikzpicture}% -}% - -\newcommand\FlecheLineaireG[4]{% - \begin{tikzpicture}[remember picture,overlay,node distance=1em]% - \node[inner sep=0pt] (MilieuH) at ($(ProporG-#1)!0.5!(ProporG-#2)$) {};% - \node[circle,draw,inner sep=0pt] [left of=MilieuH] (aux) {#4} ;% - \coordinate[left of=aux] (aux1);% - \draw[-stealth] (ProporG-#1) -| (aux);% - \draw[-stealth] (ProporG-#2) -| (aux);% - \draw[-stealth] (aux) -- (aux1) |- (ProporG-#3);% - \end{tikzpicture}% -}% - -\newcommand\FlecheLineaireD[4]{% - \begin{tikzpicture}[remember picture,overlay,node distance=1em]% - \node[inner sep=0pt] (MilieuH) at ($(ProporD-#1)!0.5!(ProporD-#2)$) {};% - \node[circle,draw,inner sep=0pt] [right of=MilieuH] (aux) {#4} ;% - \coordinate[right of=aux] (aux1);% - \draw[-stealth] (ProporD-#1) -| (aux);% - \draw[-stealth] (ProporD-#2) -| (aux);% - \draw[-stealth] (aux) -- (aux1) |- (ProporD-#3);% - \end{tikzpicture}% -}% - -\newcounter{NbProporG}% -\newcounter{NbProporD}% - -\newcommand\Propor[2][]{% - \useKVdefault[ClesPropor]% - \setKV[ClesPropor]{#1}% - \xdef\colorfill{\useKV[ClesPropor]{ColorFill}}% - \xdef\EcartLargeur{\useKV[ClesPropor]{Largeur}}% - % % on lit la liste \'ecrite sous la forme valeur/effectif - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeValeur{#2}% - \Buildtabpropor% -}% - -\newcommand\FlecheCoef[2][\EcartLargeur]{% - \begin{tikzpicture}[remember picture, overlay]% - \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};% - \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};% - \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);% - \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);% - \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);% - \end{tikzpicture}% -}% - -\newcommand\FlecheCoefDebut[2][\tabcolsep+\arrayrulewidth]{% - \begin{tikzpicture}[remember picture, overlay]% - \node[] (Noeud1) at ($(ProporHD)!0.1!(ProporBD)$) {};% - \node[] (Noeud2) at ($(ProporHD)!0.9!(ProporBD)$) {};% - \coordinate[left of=Noeud1,node distance=#1] (noeud1);% - \coordinate[left of=Noeud2,node distance=#1] (noeud2);% - \draw[-stealth,out=160,in=-160] (noeud2) to node[midway,left,inner sep=1pt]{#2}(noeud1);% - \end{tikzpicture}% -}% - -\newcommand\FlecheCoefInv[2][1cm]{% - \begin{tikzpicture}[remember picture, overlay]% - \node[] (Point1) at ($(ProporH-\LongListe)!0.1!(ProporB-\LongListe)$) {};% - \node[] (Point2) at ($(ProporH-\LongListe)!0.9!(ProporB-\LongListe)$) {};% - \coordinate[right of=Point1,node distance=0.5*#1+\tabcolsep] (point1);% - \coordinate[right of=Point2,node distance=0.5*#1+\tabcolsep] (point2);% - \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);% - \end{tikzpicture}% -}% - -\newcommand\FlecheLineaireH[4]{% - \begin{tikzpicture}[remember picture,overlay,node distance=\getstrut\ht]% - \node[inner sep=0pt] (MilieuH) at ($(ProporH-#1)!0.5!(ProporH-#2)$) {};% - \node[circle,draw,inner sep=0pt] [above of=MilieuH] (aux) {#4} ;% - \coordinate[above of=aux] (aux1);% - \draw[-stealth] (ProporH-#1) |- (aux);% - \draw[-stealth] (ProporH-#2) |- (aux);% - \draw[-stealth] (aux) -- (aux1) -| (ProporH-#3);% - \end{tikzpicture}% -}% - -\newcommand\FlecheLineaireB[4]{% - \begin{tikzpicture}[remember picture,overlay,node distance=3mm]% - \node[inner sep=0pt] (MilieuB) at ($(ProporB-#1)!0.5!(ProporB-#2)$) {};% - \node[circle,draw,inner sep=0pt] [below of=MilieuB] (aux) {#4};% - \coordinate[below of=aux,node distance=3mm] (aux1);% - \draw[-stealth] (ProporB-#1) |- (aux);% - \draw[-stealth] (ProporB-#2) |- (aux);% - \draw[-stealth] (aux) -- (aux1) -| (ProporB-#3);% - \end{tikzpicture}% -}% - -%%% -% Application : pourcentage -%%% -\setKVdefault[ClesPourcentage]{Appliquer,Calculer=false,Augmenter=false,Reduire=false,Fractionnaire=false,Decimal,Formule=false,Unite=g,Concret=false,GrandeurA=Grandeur A,GrandeurB=Total,Largeur=1cm,MotReduction=diminution,AideTableau=false,ColorFill=white,CouleurTab=gray!15} - -\newcommand\Pourcentage[3][]{% - \useKVdefault[ClesPourcentage]% - \setKV[ClesPourcentage]{#1}% - \ifboolKV[ClesPourcentage]{Reduire}{% - \ifboolKV[ClesPourcentage]{Formule}{% - R\'eduire une quantit\'e de \num{#2}~\%, cela revient \`a multiplier cette quantit\'e par $1-\dfrac{\num{#2}}{100}$. Par cons\'equent, si on r\'eduit \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne : - \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1-\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1-\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1-#2/100)}}=\num{\fpeval{#3*(1-#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\] - }{% - Calculons ce que repr\'esente la \useKV[ClesPourcentage]{MotReduction} de \num{#2}~\%. - \ifboolKV[ClesPourcentage]{AideTableau}{% - \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% - \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% - \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% - \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% - \begin{center} - \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100} - \end{center} - \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}% - On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}. Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.% - }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul : - \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% - On obtient une \useKV[ClesPourcentage]{MotReduction} de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}-\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1-#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.} - } - }{% - \ifboolKV[ClesPourcentage]{Augmenter}{% - \ifboolKV[ClesPourcentage]{Formule}{% - Augmenter de \num{#2}~\% une quantit\'e, cela revient \`a multiplier cette quantit\'e par $1+\dfrac{\num{#2}}{100}$. Par cons\'equent, si on augmente \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{} de \num{#2}~\%, cela donne : - \[\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\left(1+\frac{\num{#2}}{100}\right)=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times(1+\num{\fpeval{#2/100}})=\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\times\num{\fpeval{(1+#2/100)}}=\num{\fpeval{#3*(1+#2/100)}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\] - }{% - Calculons ce que repr\'esente l'augmentation de \num{#2}~\%. % - \ifboolKV[ClesPourcentage]{AideTableau}{% - \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% - \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% - \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% - \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% - \begin{center}% - \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{/\num{#3},\num{#2}/100}% - \end{center}% - \FlecheCoefInv{\tiny$\times\num{\fpeval{#2/100}}$}% - On obtient une augmentation de $\num{\fpeval{#2/100}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.% - }{Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul : - \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% - On obtient une augmentation de $\num{\fpeval{#3*#2/100}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.\\Donc un total de $\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}+\num{\fpeval{#3*#2/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\num{\fpeval{#3*(1+#2/100)}}$\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}.} - } - }{% - \ifboolKV[ClesPourcentage]{Calculer}{% - \xdef\NomA{\useKV[ClesPourcentage]{GrandeurA}}% - \xdef\NomB{\useKV[ClesPourcentage]{GrandeurB}}% - \xdef\NomCouleurTab{\useKV[ClesPourcentage]{CouleurTab}}% - \xdef\NomLargeurTab{\useKV[ClesPourcentage]{Largeur}}% - \Propor[Math,GrandeurA=\NomA,GrandeurB=\NomB,CouleurTab=\NomCouleurTab,Largeur=\NomLargeurTab]{\num{#2}/\num{#3},/100}% - \xdef\colorfill{\useKV[ClesPourcentage]{ColorFill}}% - \FlechesPB{2}{1}{\scriptsize$\times\num{\fpeval{#3/100}}$}% - \FlechesPH{1}{2}{\scriptsize$\div\num{\fpeval{#3/100}}$}% - \xdef\ResultatPourcentage{\fpeval{#2*100/#3}}% - }{% - Pour calculer \num{#2}~\% de \num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\useKV[ClesPourcentage]{Unite}}{}, on effectue le calcul :% - \[\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{#2}}{100}}{\num{\fpeval{#2/100}}}\times\num{#3}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}=\ifboolKV[ClesPourcentage]{Fractionnaire}{\frac{\num{\fpeval{#2*#3}}}{100}}{\num{\fpeval{#2*#3/100}}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}\ifboolKV[ClesPourcentage]{Fractionnaire}{=\num{\fpeval{#2*#3/100}}\ifboolKV[ClesPourcentage]{Concret}{~\text{\useKV[ClesPourcentage]{Unite}}}{}}{}\]% - }% - }% - }% -}% - -%%% -% Lien : ratio -%%% -\setKVdefault[ClesRatio]{FigureCours=false,Figure=false,Longueur=5cm,TexteTotal=quantit\'e,TextePart=part,Tableau=false,GrandeurA=Grandeur A,GrandeurB=Part(s),Largeur=1cm,Stretch=1,Nom=false,CouleurUn=gris,CouleurDeux=0.5gris+0.5blanc,CouleurTrois=white,CouleurTab=gray!15} - -\newcommand\MPTest[9][]{% - % #2 : Longueur de la barre unit\'e - % #3 : premier nombre - % #4 : deuxi\`eme nombre - % #5 : troisi\`eme nombre - % #6 : ne sert à rien. Laissé en attente. - % #7 \`a #9: Couleurs de remplissage - \ifluatex - \mplibforcehmode - \begin{mplibcode} - vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio - pair A,B,C,D; - A=u*(1,1); - B-A=(long,0); - C-B=u*(0,0.5); - D-C=A-B; - n:=0;%n pour savoir si le ratio est a:b ou a:b:c - numeric N[];%Pour sauvegarder les \'el\'ements du ratio - for p_=t: - n:=n+1; - N[n]=p_; - endfor; - % on fait la somme totale "du ratio" - somme=0; - somme:=somme for k=1 upto n:+N[k] endfor; - %Figure(0,0,long+2u,3u); - remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) - withcolor #7; - remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) - withcolor #8; - if n>2: - remplis - polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) - withcolor #8; - remplis - polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) - withcolor #9; - fi; - drawoptions(withpen pencircle scaled1.5bp); - draw polygone(A,B,C,D); - for k=1 upto somme-1: - draw segment((k/somme)[A,B],(k/somme)[D,C]); - endfor; - drawoptions(); - % accolades - labeloffset:=labeloffset/2; - label.top(TEX("\footnotesize$\overbrace{\hbox - to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C)); - labeloffset:=labeloffset*2; - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - enddef; - RatioTrois(#2)(#3,#4,#5); - %etiquettage - labeloffset:=labeloffset*3; - label.top(btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C)); - if #3>1: - label.bot(btex #3~\useKV[ClesRatio]{TextePart}s - etex,iso(A,(N[1]/somme)[A,B])); - else: - label.bot(btex #3~\useKV[ClesRatio]{TextePart} etex,iso(A,(N[1]/somme)[A,B])); - fi; - if #4>1: - label.bot(btex #4~\useKV[ClesRatio]{TextePart}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - else: - label.bot(btex #4~\useKV[ClesRatio]{TextePart} - etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - fi; - if n>2: - if #5>1: - label.bot(btex #5~\useKV[ClesRatio]{TextePart}s etex,iso(B,((N[1]+N[2])/somme)[A,B])); - else: - label.bot(btex #5~\useKV[ClesRatio]{TextePart} etex,iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - fi; - \end{mplibcode} - \else - \mpxcommands{% - \usepackage{ProfCollege} - \setKVdefault[ClesRatio]{TexteTotal=quantit\'e,TextePart=part} - \setKV[ClesRatio]{#1} - } - \begin{mpost} - vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio - pair A,B,C,D; - A=u*(1,1); - B-A=(long,0); - C-B=u*(0,0.5); - D-C=A-B; - n:=0;%n pour savoir si le ratio est a:b ou a:b:c - numeric N[];%Pour sauvegarder les \'el\'ements du ratio - for p_=t: - n:=n+1; - N[n]=p_; - endfor; - % on fait la somme totale "du ratio" - somme=0; - somme:=somme for k=1 upto n:+N[k] endfor; - Figure(0,0,long+2u,3u); - remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) - withcolor #7; - remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) - withcolor #8; - if n>2: - remplis - polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) - withcolor #8; - remplis - polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) - withcolor #9; - fi; - drawoptions(withpen pencircle scaled1.5bp); - draw polygone(A,B,C,D); - for k=1 upto somme-1: - draw segment((k/somme)[A,B],(k/somme)[D,C]); - endfor; - drawoptions(); - %accolades - label.top(LATEX("\noexpand\footnotesize$\noexpand\overbrace{\noexpand\hbox - to"&decimal(abs(A-B))&"pt{}}$"),iso(D,C)); - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - enddef; - RatioTrois(#2)(#3,#4,#5); - %etiquettage - labeloffset:=labeloffset*3; - label.top(\btex \useKV[ClesRatio]{TexteTotal} etex,iso(D,C)); - if #3>1: - label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(A,(N[1]/somme)[A,B])); - else: - label.bot(btex #3\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(A,(N[1]/somme)[A,B])); - fi; - if #4>1: - label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - else: - label.bot(btex #4\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - fi; - if n>2: - if #5>1: - label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}}s etex,iso(B,((N[1]+N[2])/somme)[A,B])); - else: - label.bot(btex #5\unexpanded{~\useKV[ClesRatio]{TextePart}} etex,iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - fi; - \end{mpost} - \fi -}% - -\newcommand\MPTestCours[9][]{% - % #2 : Longueur de la barre unit\'e - % #3 : premier nombre - % #4 : deuxi\`eme nombre - % #5 : troisi\`eme nombre - % #6 : Valeurs du ratio - % #7 \`a #9: Couleurs de remplissage - \ifluatex - \mplibforcehmode - \begin{mplibcode} - vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio - pair A,B,C,D; - A=u*(1,1); - B-A=(long,0); - C-B=u*(0,0.5); - D-C=A-B; - n:=0;%n pour savoir si le ratio est a:b ou a:b:c - numeric N[];%Pour sauvegarder les \'el\'ements du ratio - for p_=t: - n:=n+1; - N[n]=p_; - endfor; - % on fait la somme totale "du ratio" - somme=0; - somme:=somme for k=1 upto n:+N[k] endfor; - %%Figure(0,0,long+2u,3u); - remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) - withcolor #7; - remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) - withcolor #8; - if n>2: - remplis - polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) - withcolor #8; - remplis - polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) - withcolor #9; - fi; - drawoptions(withpen pencircle scaled1.5bp); - draw polygone(A,B,C,D); - for k=1 upto somme-1: - draw segment((k/somme)[A,B],(k/somme)[D,C]); - endfor; - drawoptions(); - % accolades - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(TEX("\footnotesize$\underbrace{\hbox - to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - enddef; - RatioTrois(#2)(#3,#4,#5); - %etiquettage - labeloffset:=labeloffset*3; - label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B])); - label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - \end{mplibcode} - \else - \begin{mpost} - vardef RatioTrois(expr long)(text t)=%longueur de la barre / quantit\'e \`a partager / textepart :) / t le ratio - pair A,B,C,D; - A=u*(1,1); - B-A=(long,0); - C-B=u*(0,0.5); - D-C=A-B; - n:=0;%n pour savoir si le ratio est a:b ou a:b:c - numeric N[];%Pour sauvegarder les \'el\'ements du ratio - for p_=t: - n:=n+1; - N[n]=p_; - endfor; - % on fait la somme totale "du ratio" - somme=0; - somme:=somme for k=1 upto n:+N[k] endfor; - %Figure(0,0,long+2u,3u); - remplis polygone(A,(N[1]/somme)[A,B],(N[1]/somme)[D,C],D) - withcolor #7; - remplis polygone(B,(N[1]/somme)[A,B],(N[1]/somme)[D,C],C) - withcolor #8; - if n>2: - remplis - polygone((N[1]/somme)[A,B],((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],(N[1]/somme)[D,C]) - withcolor #8; - remplis - polygone(B,((N[1]+N[2])/somme)[A,B],((N[1]+N[2])/somme)[D,C],C) - withcolor #9; - fi; - drawoptions(withpen pencircle scaled1.5bp); - draw polygone(A,B,C,D); - for k=1 upto somme-1: - draw segment((k/somme)[A,B],(k/somme)[D,C]); - endfor; - drawoptions(); - % accolades - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs((N[1]/somme)[A,B]-A))&"pt{}}$"),iso(A,(N[1]/somme)[A,B])); - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs((N[1]/somme)[A,B]-((N[1]+N[2])/somme)[A,B]))&"pt{}}$"),iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(LATEX("\noexpand\footnotesize$\noexpand\underbrace{\noexpand\hbox - to"&decimal(abs(((N[1]+N[2])/somme)[A,B]-B))&"pt{}}$"),iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - enddef; - RatioTrois(#2)(#3,#4,#5); - %etiquettage - labeloffset:=labeloffset*3; - label.bot(btex $a$ etex,iso(A,(N[1]/somme)[A,B])); - label.bot(btex $b$ etex,iso(((N[1]+N[2])/somme)[A,B],(N[1]/somme)[A,B])); - if n>2: - label.bot(btex $c$ etex,iso(B,((N[1]+N[2])/somme)[A,B])); - fi; - \end{mpost} - \fi -} - -\newtoks\toklisteratio -\def\UpdateRatio#1\nil{\addtotok\toklisteratio{#1,}} - -\def\updateratiotoks#1/#2/#3\nil{\addtotok\tabtoksa{&\ifx\bla#2\bla\else\num{#2}\fi}\addtotok\tabtoksb{&\ifx\bla#3\bla\else\num{#3}\fi}\addtotok\tabtoksc{}} - -\def\buildtabratio{% - \tabtoksa{}\tabtoksb{}\tabtoksc{}% - \tabtoksa{\useKV[ClesRatio]{GrandeurA}}\tabtoksb{\useKV[ClesRatio]{GrandeurB}} - \foreachitem\compteur\in\ListeRatio{\expandafter\updateratiotoks\compteur\nil}% - \xdef\LongListe{\ListeRatiolen}% - \renewcommand{\arraystretch}{\useKV[ClesRatio]{Stretch}}% - \begin{tabular}{|>{\columncolor{\useKV[ClesRatio]{CouleurTab}}}c|*{\number\numexpr\ListeRatiolen}{>{\centering\arraybackslash}p{\useKV[ClesRatio]{Largeur}}|}l} - \ifboolKV[ClesRatio]{Nom}{% - \hhline{~*{\number\numexpr\ListeRatiolen}{-}} - \multicolumn{1}{c|}{}\the\tabtoksc\\ - }{} - \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% - \the\tabtoksa&\setcounter{NbPropor}{1}\TikzRH\\% - \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% - \the\tabtoksb&\setcounter{NbPropor}{1}\TikzRB\\% - \hhline{*{\number\numexpr\ListeRatiolen+1}{-}}% - \end{tabular}% -}% - -\newcommand\TikzRH{% - \tikz[remember picture,overlay]{% - \coordinate[name=ProporH-\theNbPropor,yshift=\getstrut\ht*\arraystretch];}% - \stepcounter{NbPropor}% - }% - - \newcommand\TikzRB{% - \tikz[remember picture, overlay]{% - \coordinate[name=ProporB-\theNbPropor,yshift=-\getstrut\dp*\arraystretch];}% - \stepcounter{NbPropor}% - }% - -\newcommand\FlecheRatio[2][\EcartLargeur]{% - \begin{tikzpicture}[remember picture, overlay]% - \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};% - \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};% - \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);% - \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);% - \draw[-stealth,out=-20,in=20] (point1) to node[midway,right,inner sep=1pt]{#2}(point2);% -\end{tikzpicture}% -}% - -\newcommand\FlecheInvRatio[2][\EcartLargeur]{% - \begin{tikzpicture}[remember picture, overlay]% - \node[] (Point1) at ($(ProporH-1)!0.1!(ProporB-1)$) {};% - \node[] (Point2) at ($(ProporH-1)!0.9!(ProporB-1)$) {};% - \coordinate[right of=Point1,node distance=0*#1-\tabcolsep] (point1);% - \coordinate[right of=Point2,node distance=0*#1-\tabcolsep] (point2);% - \draw[-stealth,out=20,in=-20] (point2) to node[midway,right,inner sep=1pt]{#2}(point1);% -\end{tikzpicture}% -}% - -\newcommand\Ratio[2][]{% - \useKVdefault[ClesRatio]% - \setKV[ClesRatio]{#1}% - \xdef\EcartLargeur{\useKV[ClesRatio]{Largeur}}% - \ifboolKV[ClesRatio]{FigureCours}{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeRatio{#2}% - \toklisteratio{}% - \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}% - \itemtomacro\ListeRatio[1]\NbUn% - \itemtomacro\ListeRatio[2]\NbDeux% - \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}% - \MPTestCours[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}% - }{% - \ifboolKV[ClesRatio]{Figure}{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeRatio{#2}% - \toklisteratio{}% - \foreachitem\compteur\in\ListeRatio{\expandafter\UpdateRatio\compteur\nil}% - \itemtomacro\ListeRatio[1]\NbUn% - \itemtomacro\ListeRatio[2]\NbDeux% - \xintifboolexpr{\ListeRatiolen>2}{\itemtomacro\ListeRatio[3]\NbTrois}{\xdef\NbTrois{}}% - \MPTest[#1]{\useKV[ClesRatio]{Longueur}}{\NbUn}{\NbDeux}{\NbTrois}{\the\toklisteratio}{\useKV[ClesRatio]{CouleurUn}}{\useKV[ClesRatio]{CouleurDeux}}{\useKV[ClesRatio]{CouleurTrois}}% - }{% - \ifboolKV[ClesRatio]{Tableau}{% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeRatio{#2}% - \buildtabratio% - }{}% - }% - }% -}% -%%% -% Cartes Mentales -%%% -\setKVdefault[ClesMentales]{Nom={Bulle}, Largeur=5cm, Ancre={0,0},Pointilles=false,CTrace=black,CFond=white,Epaisseur=1pt,Rayon=1}% -\newenvironment{Mind}{\begin{tikzpicture}}{\end{tikzpicture}}% - -\newlength{\RoundedBoxWidth}% - -\NewEnviron{Bulle}[1][]{% - \setKV[ClesMentales]{#1}% - \setlength{\RoundedBoxWidth}{\useKV[ClesMentales]{Largeur}}% - \xdef\Pointilles{\ifboolKV[ClesMentales]{Pointilles}{dashed}{}}% - \xdef\CouleurTrace{\useKV[ClesMentales]{CTrace}}% - \xdef\CouleurFond{\useKV[ClesMentales]{CFond}}% - \xdef\EpaisseurLigne{\useKV[ClesMentales]{Epaisseur}}% - \xdef\RayonCoin{\useKV[ClesMentales]{Rayon}}% - \node(\useKV[ClesMentales]{Nom}) [align=justify,draw=\CouleurTrace,line width=\EpaisseurLigne,\Pointilles,fill=\CouleurFond,rounded corners=\RayonCoin,text width=\RoundedBoxWidth] at (\useKV[ClesMentales]{Ancre}) {\begin{minipage}{\RoundedBoxWidth}\BODY\end{minipage}};% - \multido{\i=1+1}{9}{% - \xdef\x{\fpeval{\i/10}} - \coordinate (\useKV[ClesMentales]{Nom}-H-\i) at ($(\useKV[ClesMentales]{Nom}.north west)!\x!(\useKV[ClesMentales]{Nom}.north east)$); - \coordinate (\useKV[ClesMentales]{Nom}-D-\i) at ($(\useKV[ClesMentales]{Nom}.north east)!\x!(\useKV[ClesMentales]{Nom}.south east)$); - \coordinate (\useKV[ClesMentales]{Nom}-B-\i) at ($(\useKV[ClesMentales]{Nom}.south east)!\x!(\useKV[ClesMentales]{Nom}.south west)$); - \coordinate (\useKV[ClesMentales]{Nom}-G-\i) at ($(\useKV[ClesMentales]{Nom}.south west)!\x!(\useKV[ClesMentales]{Nom}.north west)$); - } -} - -%%% -% Ppt\'es des droites (6eme) -%%% -\setKVdefault[ClesDroites]{Brouillon=false,CitePropriete=false,Num=1,Figure=false,Remediation=false} - -\newcommand\Redaction[4][]{% - \ifboolKV[ClesDroites]{Remediation}{% - \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% - - Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.% - - Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% - }{% - Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux parall\`eles \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles.% - } - }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.% - - Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.% - - Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. - }{% - Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(\hbox to2em{\dotfill})$, alors les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. - } - }{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles. Les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires.% - - Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.% - - Donc les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont perpendiculaires. - }{% - Comme les droites $(\hbox to2em{\dotfill})$ et $(\hbox to2em{\dotfill})$ sont parall\`eles, alors la droite $(\hbox to2em{\dotfill})$ qui est perpendiculaire \`a $(\hbox to2em{\dotfill})$ est \'egalement perpendiculaire \`a la droite $(\hbox to2em{\dotfill})$. - } - } - }% - }{% - \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont parall\`eles.% - - Or, si deux droites sont parall\`eles, alors toute droite parall\`ele \`a l'une est parall\`ele \`a l'autre.% - - Donc les droites $(#2)$ et $(#3)$ sont parall\`eles. - }{% - Comme les droites $(#2)$ et $(#3)$ sont toutes les deux parall\`eles \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles. - } - }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(#2)$ et $(#4)$ sont perpendiculaires. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.% - - Or, si deux droites sont perpendiculaires \`a une m\^eme droite, alors elles sont parall\`eles.% - - Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires. - }{% - Comme les droites $(#2)$ et $(#3)$ sont toutes les deux perpendiculaires \`a la m\^eme droite $(#4)$, alors les droites $(#2)$ et $(#3)$ sont parall\`eles. - } - }{% - \ifboolKV[ClesDroites]{CitePropriete}{% - Les droites $(#2)$ et $(#4)$ sont parall\`eles. Les droites $(#3)$ et $(#4)$ sont perpendiculaires.% - - Or, si deux droites sont parall\`eles, alors toute droite droite perpendiculaire \`a l'une est perpendiculaire \`a l'autre.% - - Donc les droites $(#2)$ et $(#3)$ sont perpendiculaires. - }{% - Comme les droites $(#2)$ et $(#4)$ sont parall\`eles, alors la droite $(#3)$ qui est perpendiculaire \`a $(#4)$ est \'egalement perpendiculaire \`a la droite $(#2)$. - }% - }% - }% - }% -}% - -\newcommand\Brouillon[4][]{% - \setlength{\abovedisplayskip}{0pt} - \ifboolKV[ClesDroites]{Remediation}{% - \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% - \[\left. - \begin{array}{l} - (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\ - \\ - (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) - \end{array} - \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) - \] - }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% - \[\left. - \begin{array}{l} - (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ - \\ - (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ - \end{array} - \right\}(\hbox to2em{\dotfill})//(\hbox to2em{\dotfill}) - \] - }{% - \[\left. - \begin{array}{l} - (\hbox to2em{\dotfill})//(\hbox to2em{\dotfill})\\ - \\ - (\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill})\\ - \end{array} - \right\}(\hbox to2em{\dotfill})\perp(\hbox to2em{\dotfill}) - \] - } - } - }{ - \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% - \[\left. - \begin{array}{l} - (#2)//(#4)\\ - \\ - (#3)//(#4) - \end{array} - \right\}(#2)//(#3) - \] - }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% - \[\left. - \begin{array}{l} - (#2)\perp(#4)\\ - \\ - (#3)\perp(#4)\\ - \end{array} - \right\}(#2)//(#3) - \] - }{% - \[\left. - \begin{array}{l} - (#2)//(#4)\\ - \\ - (#3)\perp(#4)\\ - \end{array} - \right\}(#2)\perp(#3) - \] - }% - }% - }% -}% - -\def\MPFigureDroite#1#2{% - \ifluatex - %\mplibcodeinherit{enable} - \mplibforcehmode - \begin{mplibcode} - pair A,B,C,D,E,F,G,H,I,J,K; - u:=7.5mm; - A=u*(1,3); - B-A=u*(3,2); - C-A=u*(2,-1); - E-C=u*(1,-1.5); - G-E=u*(1.5,0); - I-A=whatever*(B-A); - I-G=whatever*((B-A) rotated 90); - D-B=C-A; - F-D=E-C; - H=1.1[G,I]; - J=(C--D) intersectionpoint (G--H); - K=(E--F) intersectionpoint (G--H); - path Codeperp[]; - pair M[]; - M1-I=7*unitvector(B-I); - M3-I=7*unitvector(J-I); - M2-M3=M1-I; - Codeperp1=M1--M2--M3; - Codeperp2=Codeperp1 shifted(J-I); - picture Codepara[]; - pair R,S,T; - path cd; - Codepara1=image( - R=1/3[A,B]; - T=1/3[E,F]; - S=1/3[R,T]; - cd=(fullcircle scaled 6mm) shifted S; - drawoptions(withcolor 0.75*white); - drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); - drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); - draw cd; - label(btex $//$ etex ,S); - drawoptions(); - ); - Codepara2=image( - R:=1/2[C,D]; - T:=1/2[E,F]; - S:=1/2[R,T]; - cd:=(fullcircle scaled 6mm) shifted S; - drawoptions(withcolor 0.75*white); - drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); - drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); - draw cd; - label(btex $//$ etex ,S); - drawoptions(); - ); - path d[]; - d1=A--B; - d2=C--D; - d3=E--F; - d4=G--H; - picture reste; - reste=image( - %trac\'es des droites - draw d1; - if #1=2: - draw d2; - elseif #1=3: - draw d3; - fi; - if #2=3: - draw d3; - elseif #2=4: - draw d4; - fi; - % trac\'es des codes - if (#1=2) and (#2=3): - draw Codepara1; draw Codepara2; - fi; - if (#1=2) and (#2=4): - draw Codeperp1; draw Codeperp2; - fi; - if (#1=3) and (#2=4): - draw Codepara1; draw Codeperp1; - fi; - ); - reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180)); - draw reste; - \end{mplibcode} - %\mplibcodeinherit{disable} - \else - \begin{mpost} - pair A,B,C,D,E,F,G,H,I,J,K; - u:=7.5mm; - A=u*(1,3); - B-A=u*(3,2); - C-A=u*(2,-1); - E-C=u*(1,-1.5); - G-E=u*(1.5,0); - I-A=whatever*(B-A); - I-G=whatever*((B-A) rotated 90); - D-B=C-A; - F-D=E-C; - H=1.1[G,I]; - J=(C--D) intersectionpoint (G--H); - K=(E--F) intersectionpoint (G--H); - path Codeperp[]; - pair M[]; - M1-I=7*unitvector(B-I); - M3-I=7*unitvector(J-I); - M2-M3=M1-I; - Codeperp1=M1--M2--M3; - Codeperp2=Codeperp1 shifted(J-I); - picture Codepara[]; - pair R,S,T; - path cd; - Codepara1=image( - R=1/3[A,B]; - T=1/3[E,F]; - S=1/3[R,T]; - cd=(fullcircle scaled 6mm) shifted S; - drawoptions(withcolor 0.75*white); - drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); - drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); - draw cd; - label(btex $//$ etex ,S); - drawoptions(); - ); - Codepara2=image( - R:=1/2[C,D]; - T:=1/2[E,F]; - S:=1/2[R,T]; - cd:=(fullcircle scaled 6mm) shifted S; - drawoptions(withcolor 0.75*white); - drawarrow reverse((R{dir(210+angle(R-T))}..{dir(150+angle(R-T))}S) cutafter cd); - drawarrow reverse((T{dir(210+angle(T-R))}..{dir(150+angle(T-R))}S) cutafter cd); - draw cd; - label(btex $//$ etex ,S); - drawoptions(); - ); - path d[]; - d1=A--B; - d2=C--D; - d3=E--F; - d4=G--H; - picture reste; - reste=image( - %trac\'es des droites - draw d1; - if #1=2: - draw d2; - elseif #1=3: - draw d3; - fi; - if #2=3: - draw d3; - elseif #2=4: - draw d4; - fi; - % trac\'es des codes - if (#1=2) and (#2=3): - draw Codepara1; draw Codepara2; - fi; - if (#1=2) and (#2=4): - draw Codeperp1; draw Codeperp2; - fi; - if (#1=3) and (#2=4): - draw Codepara1; draw Codeperp1; - fi; - ); - reste:=reste rotatedabout(u*(3,3),-90+uniformdeviate(180)); - draw reste; - \end{mpost} - \fi -} - -\newcommand\FaireFigure[4][]{% - \setlength{\abovedisplayskip}{0pt} - \xintifboolexpr{\useKV[ClesDroites]{Num}==1}{% - \MPFigureDroite{2}{3}% - }{\xintifboolexpr{\useKV[ClesDroites]{Num}==2}{% - \MPFigureDroite{2}{4}% - }{% - \MPFigureDroite{3}{4}% - }% - }% -}% - -\newcommand\ProprieteDroites[4][]{% - \useKVdefault[ClesDroites]% - \setKV[ClesDroites]{#1}% - \ifboolKV[ClesDroites]{Figure}{% - \begin{multicols}{2}% - \begin{center}% - \FaireFigure[#1]{#2}{#3}{#4}% - \end{center}% - \columnbreak - \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}% - \Redaction[#1]{#2}{#3}{#4}% - \par% - \end{multicols} - }{% - \ifboolKV[ClesDroites]{Brouillon}{\Brouillon[#1]{#2}{#3}{#4}}{}% - \Redaction[#1]{#2}{#3}{#4}% - }% -}% - -%%% -% Fonction Affine -%%% -\setKVdefault[ClesAffine]{Nom=f,Variable=x,Ligne=false,Image=false,Antecedent=false,Graphique=false,Retrouve=false,ProgCalcul=false,Unitex=1,Unitey=1,VoirCoef=false,ACoef=0,Redaction=false,Ecriture=false,Definition=false}%ACoefficient=false%: inutile ? - -\newcommand\FonctionAffine[5][]{% - % #1 nombre ou abscisse premier point - % #2 a ou ordonn\'ee premier point - % #3 b ou abscisse deuxi\`eme point - % #4 {} ou ordonn\'ee deuxi\`eme point - \useKVdefault[ClesAffine]%A supprimer car appel r\'ecursif avec Redaction - \setKV[ClesAffine]{#1}% - \ifboolKV[ClesAffine]{Image}{% - \ifboolKV[ClesAffine]{Ligne}{% - \ensuremath{\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}=\num{\fpeval{#2*#3}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\xintifboolexpr{#4==0}{}{=\num{\fpeval{#2*#3+#4}}}}% - }{% - \ifboolKV[ClesAffine]{ProgCalcul}{% - \begin{align*} - \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}}\\ - \useKV[ClesAffine]{Nom}&:\num{#2}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{\fpeval{#3*#2+#4}}} - \end{align*} - }{% - \begin{align*} - \useKV[ClesAffine]{Nom}(\num{#2})&=\num{#3}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}\\ - \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}%\\ - \xintifboolexpr{#4==0}{}{\\ - \useKV[ClesAffine]{Nom}(\num{#2})&=\num{\fpeval{#3*#2+#4}}%\\ - } - \end{align*} - }% - }% - }{\ifboolKV[ClesAffine]{Antecedent}{% - \ifboolKV[ClesAffine]{ProgCalcul}{% - La fonction affine $\useKV[ClesAffine]{Nom}$ est d\'efinie par : - \begin{align*} - \useKV[ClesAffine]{Nom}&:\useKV[ClesAffine]{Variable}\stackrel{\times\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longrightarrow}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{+\num{#4}}{\longrightarrow}}{\stackrel{\num{#4}}{\longrightarrow}}\num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{\num{#4}}}} - \end{align*} - Nous cherchons le nombre $\useKV[ClesAffine]{Variable}$ tel que son image par la fonction $\useKV[ClesAffine]{Nom}$ soit $\num{#2}$. Donc on obtient : - \begin{align*} - \useKV[ClesAffine]{Nom}&:\frac{\num{\fpeval{#2-#4}}}{\num{#3}}\stackrel{\div\xintifboolexpr{#3<0}{(\num{#3})}{\num{#3}}}{\longleftarrow}\num{\fpeval{#2-#4}}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{\stackrel{-\num{#4}}{\longleftarrow}}{\stackrel{+\num{\fpeval{0-#4}}}{\longleftarrow}}\num{#2}} - \end{align*} - }{% - On cherche l'ant\'ec\'edent de $\num{#2}$ par la fonction - $\useKV[ClesAffine]{Nom}$, c'est-\`a-dire le nombre - $\useKV[ClesAffine]{Variable}$ tel que - $\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\num{#2}$. Or, - la fonction $\useKV[ClesAffine]{Nom}$ est d\'efinie par : \[% - \useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#3==0}{}{\num{#3}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#3==0}{\num{#4}}{\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}} - \] - Par cons\'equent, on a : - \begin{align*} - \num{#3}\useKV[ClesAffine]{Variable}\xintifboolexpr{#4==0}{}{\xintifboolexpr{#4>0}{+\num{#4}}{-\num{\fpeval{0-#4}}}}&=\num{#2}\\ - \xintifboolexpr{#4==0}{\useKV[ClesAffine]{Variable}\uppercase{&}=\frac{\num{#2}}{\num{#3}}%\\ - }{\num{#3}\useKV[ClesAffine]{Variable}&=\num{\fpeval{#2-#4}}\\ - \useKV[ClesAffine]{Variable}&=\frac{\num{\fpeval{#2-#4}}}{\num{#3}}%\\ - } - \end{align*} - }% - }{% - \ifboolKV[ClesAffine]{Retrouve}{% - On sait que $\useKV[ClesAffine]{Nom}$ est une fonction affine. Donc elle s'\'ecrit sous la forme : \[\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=a\useKV[ClesAffine]{Variable}+b\] - Or, $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$ et $\useKV[ClesAffine]{Nom}(\num{#4})=\num{#5}$. Par cons\'equent, d'apr\`es la propri\'et\'e des accroissements : - \begin{align*} - a&=\frac{\useKV[ClesAffine]{Nom}(\num{#2})-\useKV[ClesAffine]{Nom}(\num{#4})}{\num{#2}-\xintifboolexpr{#4<0}{(\num{#4})}{\num{#4}}}\\ - a&=\frac{\num{#3}-\xintifboolexpr{#5<0}{(\num{#5})}{\num{#5}}}{\num{\fpeval{#2-#4}}}\\ - a&=\frac{\num{\fpeval{#3-#5}}}{\num{\fpeval{#2-#4}}}%\\ - \SSimpliTest{\fpeval{#3-#5}}{\fpeval{#2-#4}}\ifthenelse{\boolean{Simplification}}{\\a&=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}}{}% - \end{align*} - La fonction $\useKV[ClesAffine]{Nom}$ s'\'ecrit alors sous la forme $\displaystyle\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}+b$. - \\De plus, comme $\useKV[ClesAffine]{Nom}(\num{#2})=\num{#3}$, alors : - \begin{align*} - \SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\times\xintifboolexpr{#2<0}{(\num{#2})}{\num{#2}}+b&=\num{#3}\\ - \SSimplifie{\fpeval{(#3-#5)*#2}}{\fpeval{#2-#4}}+b&=\num{#3}\\ - b&=\num{\fpeval{#3-(#3-#5)*#2/(#2-#4)}} - \end{align*} - \xdef\OrdOrigine{\fpeval{#3-(#3-#5)*#2/(#2-#4)}} - La fonction affine $\useKV[ClesAffine]{Nom}$ cherch\'ee est : - \[\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\SSimplifie{\fpeval{#3-#5}}{\fpeval{#2-#4}}\useKV[ClesAffine]{Variable}\xintifboolexpr{\OrdOrigine==0}{}{\xintifboolexpr{\OrdOrigine>0}{+\num{\OrdOrigine}}{-\num{\fpeval{0-\OrdOrigine}}}}\] - }{% - % - }% - }% - }% - \ifboolKV[ClesAffine]{Graphique}{% - \ifboolKV[ClesAffine]{VoirCoef}{% - \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{\useKV[ClesAffine]{ACoef}}% - }{% - \MPFonctionAffine{\useKV[ClesAffine]{Unitex}}{\useKV[ClesAffine]{Unitey}}{#2}{#3}{#4}{#5}{""}}{}% - }{}% - \ifboolKV[ClesAffine]{Redaction}{% - \xintifboolexpr{#2==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$ - est une fonction constante, alors sa repr\'esentation graphique est une droite parall\`ele \`a l'axe des abscisses passant par le point de coordonn\'ees $(0;\num{#3})$.}% - {\xintifboolexpr{#3==0}{Comme la fonction $\useKV[ClesAffine]{Nom}$ est une fonction lin\'eaire, alors sa repr\'esentation graphique est une droite passant par l'origine du rep\`ere.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomFonctionA{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonctionA,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$. - }{% - Comme $\useKV[ClesAffine]{Nom}$ est une fonction affine, alors sa repr\'esentation graphique est une droite.\\Je choisis $\useKV[ClesAffine]{Variable}=\num{#4}$. Son image est \xdef\NomVariable{\useKV[ClesAffine]{Variable}}\xdef\NomFonction{\useKV[ClesAffine]{Nom}}\FonctionAffine[Nom=\NomFonction,Image,Ligne]{#4}{#2}{#3}{#5}. On place le point de coordonn\'ees $(\num{#4};\num{\fpeval{#2*#4+#3}})$.\\Je choisis \setKV[ClesAffine]{Variable=\NomVariable}$\useKV[ClesAffine]{Variable}=\num{#5}$. Son image est \FonctionAffine[Nom=\NomFonction,Image,Ligne]{#5}{#2}{#3}{#4}. On place le point de coordonn\'ees $(\num{#5};\num{\fpeval{#2*#5+#3}})$.% - }% - }% - }% - {}% - \ifboolKV[ClesAffine]{Ecriture}{\ensuremath{\useKV[ClesAffine]{Nom}(\useKV[ClesAffine]{Variable})=\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}% - \ifboolKV[ClesAffine]{Definition}{\ensuremath{\useKV[ClesAffine]{Nom}:\useKV[ClesAffine]{Variable}\mapsto\xintifboolexpr{#2==0}{}{\num{#2}\useKV[ClesAffine]{Variable}}\xintifboolexpr{#2==0}{\num{#3}}{\xintifboolexpr{#3==0}{}{\xintifboolexpr{#3>0}{+\num{#3}}{-\num{\fpeval{0-#3}}}}}}}{}% -}% - -\def\MPFonctionAffine#1#2#3#4#5#6#7{% - % #1 Unitex #2 Unitey - % #2 a pour f1 - #4 b pour f1 - % #5 abscisse du premier point - % #6 abscisse du deuxi\`eme point - \ifluatex - \mplibforcehmode - \begin{mplibcode} - XMin=-2; - XMax=2; - if #5<XMin: - XMin:=#5; - fi; - if #6<XMin: - XMin:=#6; - fi; - if #5>XMax: - XMax:=#5; - fi; - if #6>XMax: - XMax:=#6; - fi; - YMax=2; - YMin=-2; - if (#5*#3+(#4))>YMax: - YMax:=(#5*#3+(#4)); - fi; - if (#6*#3+(#4))>YMax: - YMax:=(#6*#3+(#4)); - fi; - if (#5*#3+(#4))<YMin: - YMin:=(#5*#3+(#4)); - fi; - if (#6*#3+(#4))<YMin: - YMin:=(#6*#3+(#4)); - fi; - unitex:=#1*cm; - unitey:=#2*cm; - XMax:=XMax+2; - XMin:=XMin-2; - YMax:=YMax+2; - YMin:=YMin-2; - %On trace la grille - drawoptions(withcolor 0.95white); - for k=0 upto (XMax-XMin): - draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey); - endfor; - for k=0 upto (YMax-YMin): - draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey); - endfor; - drawoptions(); - %On trace les axes - drawarrow (XMin*unitex,0)--(XMax*unitex,0); - drawarrow (0,YMin*unitey)--(0,YMax*unitey); - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,(unitex,0)); - dotlabel.lft(btex 1 etex,(0,unitey)); - % On trace la droite - pair A[]; - A1=(#5*unitex,(#5*#3+(#4))*unitey); - A2=(#6*unitex,(#6*#3+(#4))*unitey); - draw 2[A1,A2]--2[A2,A1]; - clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle); - %On labellise les points - fill (fullcircle scaled 1mm) shifted A1; - fill (fullcircle scaled 1mm) shifted A2; - draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly; - draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly; - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.top(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); - else: - label.bot(TEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.top(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); - else: - label.bot(TEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); - fi; - fi; - if #3=0: - label.urt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - if #3>0: - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - else: - label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - fi; - fi; - else: - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.lft(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - label.rt(TEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.lft(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - else: - label.rt(TEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - fi; - fi; - fi; - fi; - % On affiche ou pas "la marche" du coef directeur - for p_=#7: - if numeric p_: - draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red; - fi; - endfor; - \end{mplibcode} - \else - \begin{mpost} - % On d\'efinit les constantes - XMin=-2; - XMax=2; - if #5<XMin: - XMin:=#5; - fi; - if #6<XMin: - XMin:=#6; - fi; - if #5>XMax: - XMax:=#5; - fi; - if #6>XMax: - XMax:=#6; - fi; - YMax=2; - YMin=-2; - if (#5*#3+(#4))>YMax: - YMax:=(#5*#3+(#4)); - fi; - if (#6*#3+(#4))>YMax: - YMax:=(#6*#3+(#4)); - fi; - if (#5*#3+(#4))<YMin: - YMin:=(#5*#3+(#4)); - fi; - if (#6*#3+(#4))<YMin: - YMin:=(#6*#3+(#4)); - fi; - unitex:=#1*cm; - unitey:=#2*cm; - XMax:=XMax+2; - XMin:=XMin-2; - YMax:=YMax+2; - YMin:=YMin-2; - %On trace la grille - drawoptions(withcolor 0.95white); - for k=0 upto (XMax-XMin): - draw ((XMin+k)*unitex,YMin*unitey)--((XMin+k)*unitex,YMax*unitey); - endfor; - for k=0 upto (YMax-YMin): - draw (XMin*unitex,(YMin+k)*unitey)--(XMax*unitex,(YMin+k)*unitey); - endfor; - drawoptions(); - %On trace les axes - drawarrow (XMin*unitex,0)--(XMax*unitex,0); - drawarrow (0,YMin*unitey)--(0,YMax*unitey); - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,(unitex,0)); - dotlabel.lft(btex 1 etex,(0,unitey)); - % On trace la droite - pair A[]; - A1=(#5*unitex,(#5*#3+(#4))*unitey); - A2=(#6*unitex,(#6*#3+(#4))*unitey); - draw 2[A1,A2]--2[A2,A1]; - clip currentpicture to ((XMin*unitex,YMin*unitey)--(XMax*unitex,YMin*unitey)--(XMax*unitex,YMax*unitey)--(XMin*unitex,YMax*unitey)--cycle); - %On labellise les points - fill (fullcircle scaled 1mm) shifted A1; - fill (fullcircle scaled 1mm) shifted A2; - draw (xpart(A1),0)--A1--(0,ypart(A1)) dashed evenly; - draw (xpart(A2),0)--A2--(0,ypart(A2)) dashed evenly; - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.top(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); - else: - label.bot(LATEX("\num{"&decimal(#5)&"}"),(xpart(A1),0)); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.top(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); - else: - label.bot(LATEX("\num{"&decimal(#6)&"}"),(xpart(A2),0)); - fi; - fi; - if #3=0: - label.urt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - if #3>0: - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - else: - label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - fi; - fi; - else: - if (#5*#3+(#4))=0: - else: - if (#5*#3+(#4))<0: - label.lft(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - else: - label.rt(LATEX("\num{"&decimal(#5*#3+(#4))&"}"),(0,ypart(A1))); - fi; - fi; - if (#6*#3+(#4))=0: - else: - if (#6*#3+(#4))<0: - label.lft(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - else: - label.rt(LATEX("\num{"&decimal(#6*#3+(#4))&"}"),(0,ypart(A2))); - fi; - fi; - fi; - fi; - % On affiche ou pas "la marche" du coef directeur - for p_=#7: - if numeric p_: - draw ((#7*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,(#7*#3+(#4))*unitey)--((#7+1)*unitex,((#7+1)*#3+(#4))*unitey)) withcolor red; - fi; - endfor; - \end{mpost} - \fi -} - -%%% -% Fonction -%%% -\setKVdefault[ClesFonction]{Nom=f,Variable=x,Calcul=x,Tableau=false,Largeur=5mm,Ecriture=false,Definition=false,Points=false,Tangentes=false,PasX=1,PasY=1,UniteX=1,UniteY=1,Prolonge=false,Trace=false,Catmull=false,Epaisseur=1,Couleur=black,CouleurTrace=black,PointsCourbe=true,Codes=false,Origine={(0,0)},Vide=false} -\defKV[ClesFonction]{Traces=\setKV[ClesFonction]{Codes}}% - -\newtoks\toklistePtsFn%pour la discipline - -\def\UpdatePtsFn#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{#1,(#2,#3),#4,}}% -\def\UpdatePtsFN#1/#2/#3/#4\nil{\addtotok\toklistePtsFn{(#2,#3),}}% - -\NewDocumentCommand\Fonction{o m}{% - \useKVdefault[ClesFonction]% - \setKV[ClesFonction]{#1}% - \ifboolKV[ClesFonction]{Trace}{% - \useKVdefault[TraceG]% - \setKV[TraceG]{#1}% - \MPTraceFonction[#1]{\useKV[ClesFonction]{Calcul}}% - }{% - \ifboolKV[ClesFonction]{Points}{% - \toklistePtsFn{}% - \setsepchar[*]{§*/}%\ignoreemptyitems% - \readlist*\ListePoints{#2}% - \ifboolKV[ClesFonction]{Catmull}{% - \xdef\PfCFooListePoints{(\ListePoints[1,2],\ListePoints[1,3]),}% - \foreachitem\compteur\in\ListePoints{% - \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),}% - }% - \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\ListePointslen,2],\ListePoints[\ListePointslen,3]),}% - \MPCatmull{\PfCFooListePoints}{\useKV[ClesFonction]{PasX}}{\useKV[ClesFonction]{PasY}}{\useKV[ClesFonction]{UniteX}}{\useKV[ClesFonction]{UniteY}}% - }{% - \xdef\PfCFooListePoints{} - \ifboolKV[ClesFonction]{Tangentes}{% - \foreachitem\compteur\in\ListePoints{% - % \expandafter\UpdatePtsFn\compteur\nil% - \xdef\PfCFooListePoints{\PfCFooListePoints \ListePoints[\compteurcnt,1],(\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),\ListePoints[\compteurcnt,4],}% - }% - }{% - \foreachitem\compteur\in\ListePoints{% - % \expandafter\UpdatePtsFN\compteur\nil% - \xdef\PfCFooListePoints{\PfCFooListePoints (\ListePoints[\compteurcnt,2],\ListePoints[\compteurcnt,3]),}% - }% - }% - \MPCourbeNew{\PfCFooListePoints}%\the\toklistePtsFn}% - }% - }{% - \setsepchar{,}\ignoreemptyitems% - \readlist*\ListeFonction{#2}% - \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{\i}[\temp]% - \StrSubstitute{\useKV[ClesFonction]{Calcul}}{**}{^}[\tempa]% - \StrSubstitute{\tempa}{*}{}[\tempab]% - \ifboolKV[ClesFonction]{Ecriture}{% - \ensuremath{\useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})=\tempab}% - }{}% - \ifboolKV[ClesFonction]{Definition}{% - \ensuremath{\useKV[ClesFonction]{Nom}:\useKV[ClesFonction]{Variable}\mapsto\tempab}% - }{}% - \ifboolKV[ClesFonction]{Tableau}{% - \buildtabfonction% - }{}% - \reademptyitems% - }% - }% -}% - -\def\MPCourbeNew#1{%#2#3#4#5#6{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - x.u:=\useKV[ClesFonction]{PasX}; - y.u:=\useKV[ClesFonction]{PasY}; - X.u:=\useKV[ClesFonction]{UniteX}; - Y.u:=\useKV[ClesFonction]{UniteY}; - Epaisseur:=\useKV[ClesFonction]{Epaisseur}; - - boolean Prolonge,Tangentes,PointsCourbe,Codes; - Prolonge=\useKV[ClesFonction]{Prolonge}; - Tangentes=\useKV[ClesFonction]{Tangentes}; - PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; - Codes=\useKV[ClesFonction]{Codes}; - - color CouleurTrace; - CouleurTrace=\useKV[ClesFonction]{CouleurTrace}; - - def enplace= - xscaled X.u yscaled Y.u - enddef; - - vardef placepoint(expr q,r)= - (q,r)*cm enplace - enddef; - - numeric dirav[],dirap[]; - pair Fn[],Gn[]; - n=0; - if Tangentes: - for p_=#1: - if (n mod 3)=0: - dirav[n div 3]=p_; - fi; - if (n mod 3)=1: - Gn[n div 3]=p_; - Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - fi; - if (n mod 3)=2: - dirap[n div 3]=p_; - fi; - n:=n+1; - endfor; - N:=(n-1) div 3; - else: - for p_=#1: - Gn[n]=p_; - Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - n:=n+1; - endfor; - N:=(n-1); - fi; - MinX=999; - MaxX=-999; - MinY=999; - MaxY=-999; - for k=0 upto N: - if xpart(Gn[k])<MinX: - MinX:=xpart(Gn[k]); - fi; - if xpart(Gn[k])>MaxX: - MaxX:=xpart(Gn[k]); - fi; - if ypart(Gn[k])<MinY: - MinY:=ypart(Gn[k]); - fi; - if ypart(Gn[k])>MaxY: - MaxY:=ypart(Gn[k]); - fi; - endfor; - if MinY<0: - if MinY<>ceiling(MinY): - MinY:=ceiling(MinY)-1; - fi; - fi; - if MinX<0: - if MinX<>ceiling(MinX): - MinX:=ceiling(MinX)-1; - fi; - fi; - if MaxY<>ceiling(MaxY): - MaxY:=ceiling(MaxY); - fi; - if MaxX<>ceiling(MaxX): - MaxX:=ceiling(MaxX); - fi; - if MaxX<1: - MaxX:=1; - fi; - if MaxY<1: - MaxY:=1; - fi; - if Prolonge: - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX step x.u until MaxX: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - else: - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX-1 step x.u until MaxX+1: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - fi; - if Prolonge: - drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); - drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0); - else: - drawarrow (0,(MinY-1)*Y.u*cm)--(0*cm,(MaxY+1)*Y.u*cm); - drawarrow ((MinX-1)*X.u*cm,0*cm)--((MaxX+1)*X.u*cm,0*cm); - fi; - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); - dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); - draw if Tangentes: - Fn[0]{dir dirap[0]} - for k=1 upto (N-1): - ..{dir dirav[k]}Fn[k]{dir dirap[k]} - endfor - ..{dir dirav[N]}Fn[N] - else: - Fn[0] - for k=1 upto N: - ..Fn[k] - endfor fi withpen pencircle scaled Epaisseur withcolor CouleurTrace; - if PointsCourbe: - if Prolonge: - for k=1 upto N-1: - fill cercles(Fn[k],0.5mm); - endfor; - else: - for k=0 upto N: - fill cercles(Fn[k],0.5mm); - endfor; - fi; - fi; - if Codes: - \useKV[ClesFonction]{Traces}; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={% - x.u:=\useKV[ClesFonction]{PasX};y.u:=\useKV[ClesFonction]{PasY}; - X.u:=\useKV[ClesFonction]{UniteX};Y.u:=\useKV[ClesFonction]{UniteY}; - Epaisseur:=\useKV[ClesFonction]{Epaisseur}; - boolean Prolonge,Tangentes,PointsCourbe,Codes; - Prolonge=\useKV[ClesFonction]{Prolonge}; - Tangentes=\useKV[ClesFonction]{Tangentes}; - PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; - Codes=\useKV[ClesFonction]{Codes}; - color CouleurTrace; - CouleurTrace=\useKV[ClesFonction]{CouleurTrace}; - }] - def enplace= - xscaled X.u yscaled Y.u - enddef; - vardef placepoint(expr q,r)= - (q,r)*cm enplace - enddef; - numeric dirav[],dirap[]; - pair Fn[],Gn[]; - n=0; - if Tangentes: - for p_=#1: - if (n mod 3)=0: - dirav[n div 3]=p_; - fi; - if (n mod 3)=1: - Gn[n div 3]=p_; - Fn[n div 3]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - fi; - if (n mod 3)=2: - dirap[n div 3]=p_; - fi; - n:=n+1; - endfor; - N:=(n-1) div 3; - else: - for p_=#1: - Gn[n]=p_; - Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - n:=n+1; - endfor; - N:=(n-1); - fi; - MinX=999; - MaxX=-999; - MinY=999; - MaxY=-999; - for k=0 upto N: - if xpart(Gn[k])<MinX: - MinX:=xpart(Gn[k]); - fi; - if xpart(Gn[k])>MaxX: - MaxX:=xpart(Gn[k]); - fi; - if ypart(Gn[k])<MinY: - MinY:=ypart(Gn[k]); - fi; - if ypart(Gn[k])>MaxY: - MaxY:=ypart(Gn[k]); - fi; - endfor; - if MinY<0: - if MinY<>ceiling(MinY): - MinY:=ceiling(MinY)-1; - fi; - fi; - if MinX<0: - if MinX<>ceiling(MinX): - MinX:=ceiling(MinX)-1; - fi; - fi; - if MaxY<>ceiling(MaxY): - MaxY:=ceiling(MaxY); - fi; - if MaxX<>ceiling(MaxX): - MaxX:=ceiling(MaxX); - fi; - if MaxX<1: - MaxX:=1; - fi; - if MaxY<1: - MaxY:=1; - fi; - if Prolonge: - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX)*X.u,k*Y.u)--cm*((MaxX)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX step x.u until MaxX: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - else: - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX-1 step x.u until MaxX+1: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - fi; - if Prolonge: - drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); - drawarrow ((MinX)*X.u*cm,0)--((MaxX)*X.u*cm,0); - else: - drawarrow (0,(MinY-1)*Y.u*cm)--(0*cm,(MaxY+1)*Y.u*cm); - drawarrow ((MinX-1)*X.u*cm,0*cm)--((MaxX+1)*X.u*cm,0*cm); - fi; - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); - dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); - draw if Tangentes: - Fn[0]{dir dirap[0]} - for k=1 upto (N-1): - ..{dir dirav[k]}Fn[k]{dir dirap[k]} - endfor - ..{dir dirav[N]}Fn[N] - else: - Fn[0] - for k=1 upto N: - ..Fn[k] - endfor fi withpen pencircle scaled Epaisseur withcolor CouleurTrace; - if PointsCourbe: - if Prolonge: - for k=1 upto N-1: - fill cercles(Fn[k],0.5mm); - endfor; - else: - for k=0 upto N: - fill cercles(Fn[k],0.5mm); - endfor; - fi; - fi; - \end{mpost} - \fi -} - -\def\MPCatmull#1#2#3#4#5{% - % #1 la liste des points - % #2: pas en x - % #3: pas en y - % #4: unit\'e en x - % #5: unit\'e en y - \ifluatex - \mplibforcehmode - \begin{mplibcode} - boolean PointsCourbe; - PointsCourbe=\useKV[ClesFonction]{PointsCourbe}; - - boolean Code; - Code=\useKV[ClesFonction]{Codes}; - - x.u:=#2; - y.u:=#3; - X.u:=#4; - Y.u:=#5; - - def enplace= - xscaled X.u yscaled Y.u - enddef; - - vardef placepoint(expr q,r)= - (q,r)*cm enplace - enddef; - - pair Fn[],Gn[]; - n=0; - for p_=#1: - Gn[n]=p_; - Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - n:=n+1; - endfor; - N:=(n-1); - MinX=999; - MaxX=-999; - MinY=999; - MaxY=-999; - debutbalai=0; - finbalai=N; - if \useKV[ClesFonction]{Prolonge}: - debutbalai:=2; - finbalai:=N-2; - fi; - for k=debutbalai upto finbalai: - if xpart(Gn[k])<MinX: - MinX:=xpart(Gn[k]); - fi; - if xpart(Gn[k])>MaxX: - MaxX:=xpart(Gn[k]); - fi; - if ypart(Gn[k])<MinY: - MinY:=ypart(Gn[k]); - fi; - if ypart(Gn[k])>MaxY: - MaxY:=ypart(Gn[k]); - fi; - endfor; - if MaxY<1: - MaxY:=2; - fi; - if MinY>-1: - MinY:=-2; - fi; - if MinY<0: - if MinY<>ceiling(MinY): - MinY:=ceiling(MinY)-1; - fi; - fi; - if MinX<0: - if MinX<>ceiling(MinX): - MinX:=ceiling(MinX)-1; - fi; - fi; - if MaxY<>ceiling(MaxY): - MaxY:=ceiling(MaxY); - fi; - if MaxX<>ceiling(MaxX): - MaxX:=ceiling(MaxX); - fi; - if MaxX<1: - MaxX:=1; - fi; - if MaxY<1: - MaxY:=1; - fi; - % - path cadreexterieur; - cadreexterieur=(((MinX-1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MaxY+1)*Y.u*cm)--((MinX-1)*X.u*cm,(MaxY+1)*Y.u*cm)--cycle); - draw Fn[1] - for k=2 upto N-1: - ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} - endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur} withcolor \useKV[ClesFonction]{Couleur}; - clip currentpicture to cadreexterieur; - picture RetiensCourbe; - RetiensCourbe=currentpicture; - currentpicture:=nullpicture; - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX-1 step x.u until MaxX+1: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - if PointsCourbe: - for k=debutbalai upto finbalai: - fill cercles(Fn[k],0.5mm); - endfor; - fi; - drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); - drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); - % - draw RetiensCourbe; - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); - dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); - if Code: - \useKV[ClesFonction]{Traces}; - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={numeric Epaisseur; Epaisseur=\useKV[ClesFonction]{Epaisseur}; color CouleurCourbe; CouleurCourbe=\useKV[ClesFonction]{Couleur};boolean PointsCourbe;PointsCourbe=\useKV[ClesFonction]{PointsCourbe};}] - x.u:=#2; - y.u:=#3; - X.u:=#4; - Y.u:=#5; - - pair Fn[],Gn[]; - n=0; - for p_=#1: - Gn[n]=p_; - Fn[n]=cm*(X.u*xpart(p_),Y.u*ypart(p_)); - n:=n+1; - endfor; - N:=(n-1); - MinX=999; - MaxX=-999; - MinY=999; - MaxY=-999; - debutbalai=0; - finbalai=N; - if \useKV[ClesFonction]{Prolonge}: - debutbalai:=2; - finbalai:=N-2; - fi; - for k=debutbalai upto finbalai: - if xpart(Gn[k])<MinX: - MinX:=xpart(Gn[k]); - fi; - if xpart(Gn[k])>MaxX: - MaxX:=xpart(Gn[k]); - fi; - if ypart(Gn[k])<MinY: - MinY:=ypart(Gn[k]); - fi; - if ypart(Gn[k])>MaxY: - MaxY:=ypart(Gn[k]); - fi; - endfor; - if MaxY<1: - MaxY:=2; - fi; - if MinY>-1: - MinY:=-2; - fi; - if MinY<0: - if MinY<>ceiling(MinY): - MinY:=ceiling(MinY)-1; - fi; - fi; - if MinX<0: - if MinX<>ceiling(MinX): - MinX:=ceiling(MinX)-1; - fi; - fi; - if MaxY<>ceiling(MaxY): - MaxY:=ceiling(MaxY); - fi; - if MaxX<>ceiling(MaxX): - MaxX:=ceiling(MaxX); - fi; - if MaxX<1: - MaxX:=1; - fi; - if MaxY<1: - MaxY:=1; - fi; - % - path cadreexterieur; - cadreexterieur=(((MinX-1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MinY-1)*Y.u*cm)--((MaxX+1)*X.u*cm,(MaxY+1)*Y.u*cm)--((MinX-1)*X.u*cm,(MaxY+1)*Y.u*cm)--cycle); - draw Fn[1] - for k=2 upto N-1: - ..{dir angle(Fn[k+1]-Fn[k-1])}Fn[k]{dir angle(Fn[k+1]-Fn[k-1])} - endfor withpen pencircle scaled \useKV[ClesFonction]{Epaisseur} withcolor \useKV[ClesFonction]{Couleur}; - clip currentpicture to cadreexterieur; - picture RetiensCourbe; - RetiensCourbe=currentpicture; - currentpicture:=nullpicture; - for k=MinY-1 step y.u until MaxY+1: - draw cm*((MinX-1)*X.u,k*Y.u)--cm*((MaxX+1)*X.u,k*Y.u) withcolor 0.75white; - endfor; - for k=MinX-1 step x.u until MaxX+1: - draw cm*(k*X.u,(MinY-1)*Y.u)--cm*(k*X.u,(MaxY+1)*Y.u) withcolor 0.75white; - endfor; - if PointsCourbe: - for k=debutbalai upto finbalai: - fill cercles(Fn[k],0.5mm); - endfor; - fi; - drawarrow (0,(MinY-1)*Y.u*cm)--(0,(MaxY+1)*Y.u*cm); - drawarrow ((MinX-1)*X.u*cm,0)--((MaxX+1)*X.u*cm,0); - % - draw RetiensCourbe; - label.llft(btex O etex,(0,0)); - dotlabel.bot(btex 1 etex,cm*X.u*(1,0)); - dotlabel.lft(btex 1 etex,cm*Y.u*(0,1)); - \end{mpost} - \fi -}% - -\def\buildtabfonction{% - \[% - \begin{array}{|>{\columncolor{gray!15}}c|*{\number\numexpr\ListeFonctionlen}{>{\centering\arraybackslash}p{\useKV[ClesFonction]{Largeur}}|}}% - \hline% - \useKV[ClesFonction]{Variable}\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{&\num{\ListeFonction[##1]}}\\ - \hline% - \useKV[ClesFonction]{Nom}(\useKV[ClesFonction]{Variable})\xintFor* ##1 in {\xintSeq {1}{\ListeFonctionlen}}\do{& \StrSubstitute{\useKV[ClesFonction]{Calcul}}{\useKV[ClesFonction]{Variable}}{(\ListeFonction[##1])}[\tempab]\num{\fpeval{\tempab}}}% - \\\hline - \end{array}% - \]% -}% - -%%% -% Diff\'erentes représentations graphiques -%%% -\setKVdefault[TraceG]{Grille=false,Graduations=false,PasGradX=1,PasGradY=1,PasGrilleX=1,PasGrilleY=1,Xmin=-5.5,Xmax=5.5,Xstep=1,Ymin=-5.5,Ymax=5.5,Ystep=1,Bornea=-5.5,Borneb=5.5,LabelX={},LabelY={},LabelC=0.5,NomCourbe={},Origine={(5.5,5.5)},Fonction=false,Points=false,Invisible=false,CouleurPoint=red,CouleurTrace=black,Epaisseur=1,Relie=false,RelieSegment=false,Marque=dot,Code=false,Vide=false,NbPointsCourbe=100}% -\defKV[TraceG]{Traces=\setKV[TraceG]{Code}}% - -\newcommand\TraceGraphique[2][]{% - \useKVdefault[TraceG]% - \setKV[TraceG]{#1}% - \ifboolKV[TraceG]{Fonction}{% - \MPTraceFonction[#1]{#2}% - }{% - \setKV[TraceG]{Xmin=0,Ymin=0} - \setKV[TraceG]{#1}% - \readlist*\ListePointsPlaces{#2}% - \newtoks\toklistepoint% - \foreachitem\compteur\in\ListePointsPlaces{\expandafter\Updatetoks\compteur\nil}% - \MPPlacePoint[#1]{\the\toklistepoint} - }% -}% - -\newcommand\MPPlacePoint[2][]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - xmin=\useKV[TraceG]{Xmin}; - xmax=\useKV[TraceG]{Xmax}; - ymin=\useKV[TraceG]{Ymin}; - ymax=\useKV[TraceG]{Ymax}; - pasx=\useKV[TraceG]{Xstep}; - pasy=\useKV[TraceG]{Ystep}; - x.u=1cm/\useKV[TraceG]{Xstep}; - y.u=1cm/\useKV[TraceG]{Ystep}; - grillex=\useKV[TraceG]{PasGrilleX}; - grilley=\useKV[TraceG]{PasGrilleY}; - pos=\useKV[TraceG]{LabelC}; - - marque_p:=str \useKV[TraceG]{Marque}; - m_c:=m_c*2; - - color colorpoint,colortrace; - colorpoint=\useKV[TraceG]{CouleurPoint}; - colortrace=\useKV[TraceG]{CouleurTrace}; - boolean Grille; - Grille=\useKV[TraceG]{Grille}; - - boolean Graduations; - Graduations=\useKV[TraceG]{Graduations}; - - boolean Relie; - Relie=\useKV[TraceG]{Relie}; - - boolean RelieSegment; - RelieSegment=\useKV[TraceG]{RelieSegment}; - - boolean Invisible; - Invisible=\useKV[TraceG]{Invisible}; - - pair Origine; - Origine=(0,0); - - if Grille: - drawoptions(withcolor 0.75white); - for k=0 step grillex until (xmax-xmin): - trace (k*x.u,ypart(Origine))--(x.u*k,y.u*(ymax-ymin)); - endfor; - for k=0 step grilley until (ymax-ymin): - trace (xpart(Origine),k*y.u)--(x.u*(xmax-xmin),y.u*k); - endfor; - drawoptions(); - fi; - - if Graduations: - for k=0 step grillex until (xmax-xmin): - trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*x.u,0) shifted Origine) withpen pencircle scaled1.25; - label.bot(TEX("\num{"&decimal(xmin+k)&"}"),(k*x.u,0) shifted Origine); - endfor; - label.ulft(TEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine); - for k=grilley step grilley until (ymax-ymin): - trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*y.u) shifted Origine) withpen pencircle scaled1.25; - label.lft(TEX("\num{"&decimal(ymin+k)&"}"),(0,k*y.u) shifted Origine); - endfor; - fi; - drawoptions(withpen pencircle scaled1.5); - drawarrow Origine--(xpart(Origine),y.u*(ymax-ymin)); - drawarrow Origine--((xmax-xmin)*x.u,ypart(Origine)); - drawoptions(); - - % On relie éventuellement les points - if Relie: - pair N[]; - nbpoint=0; - for p_=#2: - nbpoint:=nbpoint+1; - N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)); - endfor; - draw N[1] for k=2 upto nbpoint: - ..N[k] - endfor withcolor colortrace; - fi; - if RelieSegment: - pair N[]; - nbpoint=0; - for p_=#2: - nbpoint:=nbpoint+1; - N[nbpoint]=(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin)); - endfor; - draw N[1] for k=2 upto nbpoint: - --N[k] - endfor withcolor colortrace; - fi; - - % On place les points - if Invisible=false: - drawoptions(withcolor colorpoint); - for p_=#2: - if marque_p="dot": - dotlabel("",(x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin))); - elseif marque_p="croix": - pointe((x.u*(xpart(p_)-xmin),y.u*(ypart(p_)-ymin))); - fi; - endfor; - drawoptions(); - fi; - %on labelise les axes - label.urt(btex \useKV[TraceG]{LabelX} etex,(x.u*(xmax-xmin),ypart(Origine))); - label.urt(btex \useKV[TraceG]{LabelY} etex,(xpart(Origine),y.u*(ymax-ymin))); - \end{mplibcode} - \else - \mpxcommands{% - \usepackage{ProfCollege} - \setKV[TraceG]{#1} - } - \begin{mpost}[mpsettings={xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};color colorpoint,colortrace;colorpoint=\useKV[TraceG]{CouleurPoint};colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille;Grille=\useKV[TraceG]{Grille};boolean Graduations;Graduations=\useKV[TraceG]{Graduations};boolean Relie;Relie=\useKV[TraceG]{Relie};boolean RelieSegment;RelieSegment=\useKV[TraceG]{RelieSegment};boolean Invisible;Invisible=\useKV[TraceG]{Invisible};}] - pair Origine; - Origine=(0,0); - - if Grille: - drawoptions(withcolor 0.75white); - for k=0 step grillex until (xmax-xmin): - trace (k*xu,ypart(Origine))--(xu*k,yu*(ymax-ymin)); - endfor; - for k=0 step grilley until (ymax-ymin): - trace (xpart(Origine),k*yu)--(xu*(xmax-xmin),yu*k); - endfor; - drawoptions(); - fi; - - if Graduations: - for k=0 step grillex until (xmax-xmin): - trace ((0,-0.5mm)--(0,0.5mm)) shifted ((k*xu,0) shifted Origine) withpen pencircle scaled1.25; - label.bot(LATEX("\num{"&decimal(xmin+k)&"}"),(k*xu,0) shifted Origine); - endfor; - label.ulft(LATEX("\num{"&decimal(ymin)&"}"),(0,0) shifted Origine); - for k=grilley step grilley until (ymax-ymin): - trace ((-0.5mm,0)--(0.5mm,0)) shifted ((0,k*yu) shifted Origine) withpen pencircle scaled1.25; - label.lft(LATEX("\num{"&decimal(ymin+k)&"}"),(0,k*yu) shifted Origine); - endfor; - fi; - drawoptions(withpen pencircle scaled1.5); - drawarrow Origine--(xpart(Origine),yu*(ymax-ymin)); - drawarrow Origine--((xmax-xmin)*xu,ypart(Origine)); - drawoptions(); - - % On relie éventuellement les points - if Relie: - pair N[]; - nbpoint=0; - for p_=#2: - nbpoint:=nbpoint+1; - N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin)); - endfor; - draw N[1] for k=2 upto nbpoint: - ..N[k] - endfor withcolor colortrace; - fi; - if RelieSegment: - pair N[]; - nbpoint=0; - for p_=#2: - nbpoint:=nbpoint+1; - N[nbpoint]=(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin)); - endfor; - draw N[1] for k=2 upto nbpoint: - --N[k] - endfor withcolor colortrace; - fi; - - % On place les points - if Invisible=false: - drawoptions(withcolor colorpoint); - for p_=#2: - dotlabel("",(xu*(xpart(p_)-xmin),yu*(ypart(p_)-ymin))); - endfor; - drawoptions(); - fi; - %on labelise les axes - label.urt(btex \unexpanded{\useKV[TraceG]{LabelX}} etex,(xu*(xmax-xmin),ypart(Origine))); - label.urt(btex \unexpanded{\useKV[TraceG]{LabelY}} etex,(xpart(Origine),yu*(ymax-ymin))); - \end{mpost} - \fi -} - -\newcommand\MPTraceFonction[2][]{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - borneinf=\useKV[TraceG]{Bornea}; - bornesup=\useKV[TraceG]{Borneb}; - nbpointsCourbe:=\useKV[TraceG]{NbPointsCourbe}; - xmin=\useKV[TraceG]{Xmin}; - xmax=\useKV[TraceG]{Xmax}; - ymin=\useKV[TraceG]{Ymin}; - ymax=\useKV[TraceG]{Ymax}; - pasx=\useKV[TraceG]{Xstep}; - pasy=\useKV[TraceG]{Ystep}; - x.u=1cm/\useKV[TraceG]{Xstep}; - y.u=1cm/\useKV[TraceG]{Ystep}; - grillex=\useKV[TraceG]{PasGrilleX}; - grilley=\useKV[TraceG]{PasGrilleY}; - gradx=\useKV[TraceG]{PasGradX}; - grady=\useKV[TraceG]{PasGradY}; - pos=\useKV[TraceG]{LabelC}; - Epaisseur:=\useKV[TraceG]{Epaisseur}; - - color colortrace; - colortrace=\useKV[TraceG]{CouleurTrace}; - - pair Origine; - Origine=(xmin,ymin)+\useKV[TraceG]{Origine}; - - boolean Grille,Vide; - Grille=\useKV[TraceG]{Grille}; - Vide=\useKV[TraceG]{Vide}; - - boolean Graduations; - Graduations=\useKV[TraceG]{Graduations}; - - vardef sin(expr t) = sind(c*t) enddef; - - vardef cos(expr t) = cosd(c*t) enddef; - - vardef tan(expr t) = sin(t)/cos(t) enddef; - - vardef exp(expr t) = e**t enddef; - - vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; - - vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; - - vardef ln(expr t) = mlog(t)/256 enddef; - - vardef arcsin(expr x)=%Définition mathématique en radian - pi*angle((sqrt(1-x**2),x))/180 - enddef; - - vardef arccos(expr x)=%Définition mathématique en radian - pi*angle((x,sqrt(1-x**2)))/180 - enddef; - - def enplace= - xscaled x.u yscaled y.u shifted (Origine*cm) - enddef; - - vardef placepoint(expr q,r)= - (q,r) enplace - enddef; - - path Cb[]; - - vardef courbe[](expr a,b,nb)(text texte)= - path Courbe; - for i:=0 upto nb : - x@[i]:=(a+i*(b-a)/nb); - x:=x@[i]; - y@[i]:=texte; - endfor ; - Cb@:=(x@.0*x.u,y@.0*y.u) - for i:=1 upto nb : - ..(x@[i]*x.u,y@[i]*y.u) - endfor; - Cb@:=Cb@ shifted (Origine*cm); - Courbe=Cb@; - Courbe - enddef; - - if Grille: - drawoptions(withcolor 0.75white); - for k=xpart(Origine) step grillex until xmax: - trace u*(k,ymin)--u*(k,ymax); - endfor; - for k=xpart(Origine) step -grillex until xmin: - trace u*(k,ymin)--u*(k,ymax); - endfor; - for k=ypart(Origine) step grilley until ymax: - trace u*(xmin,k)--u*(xmax,k); - endfor; - for k=ypart(Origine) step -grilley until ymin: - trace u*(xmin,k)--u*(xmax,k); - endfor; - drawoptions(); - fi; - if Graduations: - for k=gradx step gradx until bornesup:%xmax*gradx/grillex: - dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); - endfor; - for k=-gradx step -gradx until borneinf:%xmin*gradx/grillex: - dotlabel.bot(TEX("\num{"&decimal(k)&"}"),(k*x.u+xpart(Origine*cm),ypart(Origine*cm))); - endfor; - for k=grady step grady until ymax*grady/grilley: - dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); - endfor; - for k=-grady step -grady until ymin*grady/grilley: - dotlabel.lft(TEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*y.u+ypart(Origine*cm))); - endfor; - fi; - - drawoptions(withpen pencircle scaled(1)); - drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); - drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); - label.llft(btex 0 etex,u*Origine); - drawoptions(); - if Vide: - else: - draw courbe1(borneinf,bornesup,nbpointsCourbe)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; - % labelisation - numeric t; - t=pos*length Cb1; - pair PT,Tangente; - PT:=point (pos*length Cb1) of Cb1; - Tangente:=unitvector(direction t of Cb1); - label(TEX("\useKV[TraceG]{NomCourbe}") rotated angle(Tangente),PT+2mm*(Tangente rotated 90)); - % fin labelisation - clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax)); - label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine))); - label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax)); - if \useKV[TraceG]{Code}: - \useKV[TraceG]{Traces} - fi; - fi; - \end{mplibcode} - \else - \mpxcommands{% - \usepackage{ProfCollege} - \setKV[TraceG]{#1} - } - \begin{mpost}[mpsettings={borneinf=\useKV[TraceG]{Bornea};bornesup=\useKV[TraceG]{Borneb};nbpointsCourbe:=\useKV[TraceG]{NbPointsCourbe};xmin=\useKV[TraceG]{Xmin};xmax=\useKV[TraceG]{Xmax};ymin=\useKV[TraceG]{Ymin};ymax=\useKV[TraceG]{Ymax};pasx=\useKV[TraceG]{Xstep};pasy=\useKV[TraceG]{Ystep};xu=1cm/\useKV[TraceG]{Xstep};yu=1cm/\useKV[TraceG]{Ystep};grillex=\useKV[TraceG]{PasGrilleX};grilley=\useKV[TraceG]{PasGrilleY};pos=\useKV[TraceG]{LabelC};Epaisseur=\useKV[TraceG]{Epaisseur}; color colortrace;colortrace=\useKV[TraceG]{CouleurTrace};boolean Grille,Vide;Grille=\useKV[TraceG]{Grille};Vide=\useKV[TraceG]{Vide};boolean Graduations;Graduations=\useKV[TraceG]{Graduations}; - pair Origine; - Origine=(xmin,ymin)+\useKV[TraceG]{Origine};}] - - vardef sin(expr t) = sind(c*t) enddef; - - vardef cos(expr t) = cosd(c*t) enddef; - - vardef tan(expr t) = sin(t)/cos(t) enddef; - - vardef exp(expr t) = e**t enddef; - - vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; - - vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; - - vardef ln(expr t) = mlog(t)/256 enddef; - - vardef arcsin(expr x)=%Définition mathématique en radian - pi*angle((sqrt(1-x**2),x))/180 - enddef; - - vardef arccos(expr x)=%Définition mathématique en radian - pi*angle((x,sqrt(1-x**2)))/180 - enddef; - - path Cb[]; - - vardef courbe[](expr a,b,nb)(text texte)= - path Courbe; - for i:=0 upto nb : - x@[i]:=(a+i*(b-a)/nb); - x:=x@[i]; - y@[i]:=texte; - endfor ; - Cb@:=(x@.0*xu,y@.0*yu) - for i:=1 upto nb : - ..(x@[i]*xu,y@[i]*yu) - endfor; - Cb@:=Cb@ shifted (Origine*cm); - Courbe=Cb@; - Courbe - enddef; - - if Grille: - drawoptions(withcolor 0.75white); - for k=xpart(Origine) step grillex until xmax: - trace u*(k,ymin)--u*(k,ymax); - endfor; - for k=xpart(Origine) step -grillex until xmin: - trace u*(k,ymin)--u*(k,ymax); - endfor; - for k=ypart(Origine) step grilley until ymax: - trace u*(xmin,k)--u*(xmax,k); - endfor; - for k=ypart(Origine) step -grilley until ymin: - trace u*(xmin,k)--u*(xmax,k); - endfor; - drawoptions(); - fi; - if Graduations: - for k=1 upto xmax/grillex: - dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm))); - endfor; - for k=-1 downto xmin/grillex: - dotlabel.bot(LATEX("\num{"&decimal(k)&"}"),(k*xu+xpart(Origine*cm),ypart(Origine*cm))); - endfor; - for k=1 upto ymax/grilley: - dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm))); - endfor; - for k=-1 downto ymin/grilley: - dotlabel.lft(LATEX("\num{"&decimal(k)&"}"),(xpart(Origine*cm),k*yu+ypart(Origine*cm))); - endfor; - fi; - drawoptions(withpen pencircle scaled1.5); - drawarrow (u*(0,ymin)--u*(0,ymax)) shifted (u*(xpart(Origine),0)); - drawarrow (u*(xmin,0)--u*(xmax,0)) shifted (u*(0,ypart(Origine))); - drawoptions(); - if Vide: - else: - draw courbe1(borneinf,bornesup,nbpointsCourbe)(#2) withpen (pencircle scaled Epaisseur) withcolor colortrace; -% % labelisation - numeric t; - t=pos*length Cb1; - pair PT,Tangente; - PT:=point (pos*length Cb1) of Cb1; - Tangente:=unitvector(direction t of Cb1); - label(btex \noexpand\useKV[TraceG]{NomCourbe} etex rotated angle(Tangente),PT+2mm*(Tangente rotated 90)); -% % fin labelisation - clip currentpicture to polygone(u*(xmin,ymin),u*(xmax,ymin),u*(xmax,ymax),u*(xmin,ymax)); - label.rt(btex \useKV[TraceG]{LabelX} etex,u*(xmax,ypart(Origine))); - label.top(btex \useKV[TraceG]{LabelY} etex,u*(xpart(Origine),ymax)); - fi; - \end{mpost} - \fi -} - -%%% -% Formules -%%% -\setKVdefault[ClesFormule]{Perimetre=false,Aire=false,Volume=false,Surface=carr\'e,Solide=pav\'e,Angle=0,Ancre={(0,0)},Largeur=5cm,Couleur=white,EchelleEspace=70,Echelle=1cm} - -\def\MPFigureCarre{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0); - C=rotation(A,B,-90); - D-C=A-B; - draw polygone(A,B,C,D); - draw codeperp(A,B,C,5); - draw codeperp(B,C,D,5); - draw codeperp(C,D,A,5); - draw codeperp(D,A,B,5); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $c$ etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0); - C=rotation(A,B,-90); - D-C=A-B; - draw polygone(A,B,C,D); - draw codeperp(A,B,C,5); - draw codeperp(B,C,D,5); - draw codeperp(C,D,A,5); - draw codeperp(D,A,B,5); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $c$ etex); - \end{mpost} - \fi -} - -\def\MPFigurePolygone{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - pair A,B,C,D,E,F; - A=u*(1,1); - B-A=u*(2,0); - C=3/5[B,rotation(A,B,-120)]; - D-C=u*(0,1); - E-D=u*(-1.25,-1); - F-E=u*(-1,1); - draw polygone(A,B,C,D,E,F); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - pair A,B,C,D,E,F; - A=u*(1,1); - B-A=u*(2,0); - C=3/5[B,rotation(A,B,-120)]; - D-C=u*(0,1); - E-D=u*(-1.25,-1); - F-E=u*(-1,1); - draw polygone(A,B,C,D,E,F); - \end{mpost} - \fi -} - -\def\MPFigureParallelogramme{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesFormule]{Echelle}; - vardef marque_para(expr dd,ee,pa)= - save im; - picture im; - pair kk,ll,mn,mo; - kk=point(pa*length dd) of dd; - ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee); - mn=iso(kk,ll); - mo=(mn--kk) intersectionpoint cercles(mn,3mm); - im=image( - drawarrow mo--kk; - drawarrow symetrie(mo,mn)--ll; - label(btex $//$ etex,mn); - ); - im - enddef; - - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2.25,0.25); - D=4/5[A,rotation(B,A,40)]; - C-D=B-A; - draw polygone(A,B,C,D); - drawoptions(withcolor gris); - draw marque_para(droite(A,B),droite(C,D),0.455); - draw marque_para(droite(B,C),droite(A,D),0.43); - draw segment(B,2.5[C,B]) dashed evenly; - draw segment(A,1.5[D,A]) dashed evenly; - draw segment(A,1.55[B,A]) dashed evenly; - draw segment(D,2[C,D]) dashed evenly; - drawoptions(); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - vardef marque_para(expr dd,ee,pa)= - save im; - picture im; - pair kk,ll,mn,mo; - kk=point(pa*length dd) of dd; - ll=projection(kk,point(0.25*length ee) of ee,point(0.5*length ee) of ee); - mn=iso(kk,ll); - mo=(mn--kk) intersectionpoint cercles(mn,3mm); - im=image( - drawarrow mo--kk; - drawarrow symetrie(mo,mn)--ll; - label(btex $//$ etex,mn); - ); - im - enddef; - - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2.25,0.25); - D=4/5[A,rotation(B,A,40)]; - C-D=B-A; - draw polygone(A,B,C,D); - drawoptions(withcolor gris); - draw marque_para(droite(A,B),droite(C,D),0.455); - draw marque_para(droite(B,C),droite(A,D),0.43); - draw segment(B,2.5[C,B]) dashed evenly; - draw segment(A,1.5[D,A]) dashed evenly; - draw segment(A,1.55[B,A]) dashed evenly; - draw segment(D,2[C,D]) dashed evenly; - drawoptions(); - \end{mpost} - \fi -} - -\def\MPFigureParallelogrammeAire{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,10u,5u); - pair A,B,C,D,I,J; - A=u*(1,1); - B-A=u*(2,0.5); - D=3/5[A,rotation(B,A,40)]; - C-D=B-A; - I=projection(D,A,B); - draw polygone(A,B,C,D) withcolor gris; - draw segment(A,B); - draw segment(D,I); - draw codeperp(D,I,B,5); - A:=A+3*u*(1,0); - B:=A+u*(2,0.5); - D:=3/5[A,rotation(B,A,40)]; - C:=D+B-A; - J=projection(B,A,D); - draw polygone(A,B,C,D) withcolor gris; - draw segment(D,1.5[A,D]) dashed evenly withcolor gris; - draw segment(A,D); - draw segment(B,J); - draw codeperp(B,J,A,5); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,10u,5u); - pair A,B,C,D,I,J; - A=u*(1,1); - B-A=u*(2,0.5); - D=3/5[A,rotation(B,A,40)]; - C-D=B-A; - I=projection(D,A,B); - draw polygone(A,B,C,D) withcolor gris; - draw segment(A,B); - draw segment(D,I); - draw codeperp(D,I,B,5); - A:=A+3*u*(1,0); - B:=A+u*(2,0.5); - D:=3/5[A,rotation(B,A,40)]; - C:=D+B-A; - J=projection(B,A,D); - draw polygone(A,B,C,D) withcolor gris; - draw segment(D,1.5[A,D]) dashed evenly withcolor gris; - draw segment(A,D); - draw segment(B,J); - draw codeperp(B,J,A,5); - \end{mpost} - \fi -} - -\def\MPFigureSphere{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace}); - color O,A,B,C; - O=(0,0,0); - A-O=(0,1/2,0); - C-O=(-1/2,0,0); - B-O=(0,0,1/2); - path cc,cd; - cc=cercles(O,A,O,A,C); - cd=cercles(O,A,O,A,B); - draw cd; - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw cotationmil(O,A,0,18,btex rayon $r$ etex); - marque_p:="plein"; - pointe(O); - marque_p:="non"; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,0,10,v); - color O,A,B,C; - O=(0,0,0); - A-O=(0,1/2,0); - C-O=(-1/2,0,0); - B-O=(0,0,1/2); - path cc,cd; - cc=cercles(O,A,O,A,C); - cd=cercles(O,A,O,A,B); - draw cd; - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw cotationmil(O,A,0,18,btex rayon $r$ etex); - marque_p:="plein"; - pointe(O); - marque_p:="non"; - \end{mpost} - \fi -} - -\def\MPFigurePave{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,115); - color A,B,C,D,E,F,G,H; - draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris; - draw segment(A,B); - draw segment(E,F); - draw segment(A,F); - draw appelation(A,B,-2mm,btex $\ell$ etex); - draw appelation(F,E,2mm,btex $p$ etex); - draw appelation(A,F,2mm,btex $h$ etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,115); - color A,B,C,D,E,F,G,H; - draw Pave(A,B,C,D,E,F,G,H)(0.5,1,1/3) withcolor gris; - draw segment(A,B); - draw segment(E,F); - draw segment(A,F); - draw appelation(A,B,-2mm,\btex $\ell$ etex); - draw appelation(F,E,2mm,\btex $p$ etex); - draw appelation(A,F,2mm,\btex $h$ etex); - \end{mpost} - \fi -} - -\def\MPFigurePrisme{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,\useKV[ClesFormule]{EchelleEspace}); - color A,B,C,D,E,F,G,H; - D=(0.75,0,0); - G=(0,1,0); - H=(0,0,0); - A-D=(0,0,0.5); - C-D=G-H; - E-H=A-D; - F-E=(0,0.6,0); - B-A=F-E; - NbS:=8; - Sommet1:=A; - Sommet2:=B; - Sommet3:=C; - Sommet4:=D; - Sommet5:=E; - Sommet6:=F; - Sommet7:=G; - Sommet8:=H; - NF:=6; - Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; - Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8; - Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3; - Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7; - Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5; - Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6; - CoulTrace:=gris; - DessineObjet; - drawoptions(withcolor gris); - draw codeperp(B,A,E,5); - draw codeperp(A,B,F,5); - draw codeperp(H,D,C,5); - draw codeperp(D,C,G,5); - drawoptions(); - draw polygone(A,B,C,D); - draw hachurage(polygone(A,B,C,D),60,0.3,0); - draw segment(A,E); - draw appelation(A,E,3mm,btex hauteur etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,115); - color A,B,C,D,E,F,G,H; - D=(0.75,0,0); - G=(0,1,0); - H=(0,0,0); - A-D=(0,0,0.5); - C-D=G-H; - E-H=A-D; - F-E=(0,0.6,0); - B-A=F-E; - NbS:=8; - Sommet1:=A; - Sommet2:=B; - Sommet3:=C; - Sommet4:=D; - Sommet5:=E; - Sommet6:=F; - Sommet7:=G; - Sommet8:=H; - NF:=6; - Fc[100]:=4;Fc[101]:=1;Fc[102]:=4;Fc[103]:=3;Fc[104]:=2; - Fc[200]:=4;Fc[201]:=4;Fc[202]:=1;Fc[203]:=5;Fc[204]:=8; - Fc[300]:=4;Fc[301]:=4;Fc[302]:=8;Fc[303]:=7;Fc[304]:=3; - Fc[400]:=4;Fc[401]:=8;Fc[402]:=5;Fc[403]:=6;Fc[404]:=7; - Fc[500]:=4;Fc[501]:=1;Fc[502]:=2;Fc[503]:=6;Fc[504]:=5; - Fc[600]:=4;Fc[601]:=2;Fc[602]:=3;Fc[603]:=7;Fc[604]:=6; - CoulTrace:=gris; - DessineObjet; - drawoptions(withcolor gris); - draw codeperp(B,A,E,5); - draw codeperp(A,B,F,5); - draw codeperp(H,D,C,5); - draw codeperp(D,C,G,5); - drawoptions(); - draw polygone(A,B,C,D); - draw hachurage(polygone(A,B,C,D),60,0.3,0); - draw segment(A,E); - draw appelation(A,E,3mm,btex hauteur etex); - \end{mpost} - \fi -} - -\def\MPFigureCylindre{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,0,20,\useKV[ClesFormule]{EchelleEspace}); - color O,O',A,A',B,B',C,C'; - O=(0,0,0); - O'-O=(0,0,1); - A-O=(0,1,0); - A'-A=O'-O; - C=symetrie(A,O); - C'-C=O'-O; - B-O=(-1/2,0,0); - B'-B=O'-O; - path cc,cd; - cc=cercles(O,A,O,A,B); - cd=cercles(O',A',O',A',B'); - draw cd; - draw segment(C,C'); - draw segment(A,A'); - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw segment(O,A); - draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex); - draw appelation(O,A,2mm,btex rayon $r$ etex); - marque_p:="croix"; - pointe(O); - marque_p:="non"; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,0,20,70); - color O,O',A,A',B,B',C,C'; - O=(0,0,0); - O'-O=(0,0,1); - A-O=(0,1,0); - A'-A=O'-O; - C=symetrie(A,O); - C'-C=O'-O; - B-O=(-1/2,0,0); - B'-B=O'-O; - path cc,cd; - cc=cercles(O,A,O,A,B); - cd=cercles(O',A',O',A',B'); - draw cd; - draw segment(C,C'); - draw segment(A,A'); - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw segment(O,A); - draw cotationmil(C,C',3mm,25,btex hauteur $h$ etex); - draw appelation(O,A,2mm,btex rayon $r$ etex); - marque_p:="croix"; - pointe(O); - marque_p:="non"; - \end{mpost} - \fi -} - -\def\MPFigureCone{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,0,10,\useKV[ClesFormule]{EchelleEspace}); - color O,O',A,B,C; - O=(0,0,0); - O'-O=(0,0,1.5); - A-O=(0,1,0); - C=symetrie(A,O); - B-O=(-1/2,0,0); - path cc; - cc=cercles(O,A,O,A,B); - draw chemin(C,O',A); - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw chemin(O',O,A); - draw appelation(O,O',2mm,btex hauteur etex); - draw appelation(O,A,1mm,btex rayon $r$ etex); - marque_p:="croix"; - pointe(O); - marque_p:="non"; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,0,10,70); - color O,O',A,B,C; - O=(0,0,0); - O'-O=(0,0,1.5); - A-O=(0,1,0); - C=symetrie(A,O); - B-O=(-1/2,0,0); - path cc; - cc=cercles(O,A,O,A,B); - draw chemin(C,O',A); - draw (subpath(0,length cc/2) of cc) dashed evenly; - draw subpath(length cc/2,length cc) of cc; - draw chemin(O',O,A); - draw appelation(O,O',2mm,btex hauteur etex); - draw appelation(O,A,1mm,btex rayon $r$ etex); - marque_p:="croix"; - pointe(O); - marque_p:="non"; - \end{mpost} - \fi -} - -\def\MPFigurePyramide{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - u:=0.5cm; - z0=(-0.5,0)*u; - z1=(2.5,0.5)*u; - z2=(4,2)*u; - z3=(-0.5,2.75)*u; - z4=(-3,1.5)*u; - z5=(0.5,6)*u; - z6=(0.5,1.5)*u; - z7=z6 shifted (5u,0); - draw z5--z0 withcolor gris; - draw z5--z1 withcolor gris; - draw z5--z2 withcolor gris; - draw z5--z4 withcolor gris; - draw z5--z3 dashed evenly withcolor gris; - draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0); - remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white; - draw z4--z0--z1--z2; - draw z2--z3--z4 dashed evenly; - draw z5--z6 dashed evenly; - draw codeperp(z7,z6,z5,8); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - Figure(-10u,-10u,10u,10u); - u:=0.5cm; - z0=(-0.5,0)*u; - z1=(2.5,0.5)*u; - z2=(4,2)*u; - z3=(-0.5,2.75)*u; - z4=(-3,1.5)*u; - z5=(0.5,6)*u; - z6=(0.5,1.5)*u; - z7=z6 shifted (5u,0); - draw z5--z0 withcolor gris; - draw z5--z1 withcolor gris; - draw z5--z2 withcolor gris; - draw z5--z4 withcolor gris; - draw z5--z3 dashed evenly withcolor gris; - draw hachurage(polygone(z4,z0,z1,z2,z3,z4),60,0.4,0); - remplis codeperp(z7,z6,z5,8)--z6--cycle withcolor white; - draw z4--z0--z1--z2; - draw z2--z3--z4 dashed evenly; - draw z5--z6 dashed evenly; - draw codeperp(z7,z6,z5,8); - \end{mpost} - \fi -} - -\def\MPFigureCube{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - drawoptions( dashed dashpattern(on1cm)); - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,80); - color A,B,C,D,E,F,G,H; - draw Cube(A,B,C,D,E,F,G,H) withcolor gris; - draw segment(E,H); - draw appelation(E,H,2mm,btex $a$ etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={v:=\useKV[ClesFormule]{EchelleEspace};}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-10u,-10u,10u,10u); - Initialisation(5,30,20,80); - color A,B,C,D,E,F,G,H; - draw Cube(A,B,C,D,E,F,G,H) withcolor gris; - draw segment(E,H); - draw appelation(E,H,2mm,btex $a$ etex); - \end{mpost} - \fi -} - -\def\MPFigureLosange{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} - u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0.5); - D=rotation(B,A,40); - C-D=B-A; - draw polygone(A,B,C,D); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $c$ etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0.5); - D=rotation(B,A,40); - C-D=B-A; - draw polygone(A,B,C,D); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $c$ etex); - \end{mpost} - \fi -} - -\def\MPFigureLosangeAire{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0.5); - D=rotation(B,A,40); - C-D=B-A; - draw polygone(A,B,C,D) withcolor gris; - draw segment(A,C); - draw segment(B,D); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(2,0.5); - D=rotation(B,A,40); - C-D=B-A; - draw polygone(A,B,C,D) withcolor gris; - draw segment(A,C); - draw segment(B,D); - marque_s:=marque_s/3; - draw Codelongueur(A,B,B,C,C,D,D,A,2); - marque_s:=marque_s*3; - \end{mpost} - \fi -} - -\def\MPFigureRectangle{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - pair A,B,C,D; - A=u*(1,1); - B-A=u*(3,0); - C=2/3[B,rotation(A,B,-90)]; - D-C=A-B; - draw polygone(A,B,C,D); - draw codeperp(A,B,C,5); - draw codeperp(B,C,D,5); - draw codeperp(C,D,A,5); - draw codeperp(D,A,B,5); - marque_s:=marque_s/3; - draw Codelongueur(A,B,C,D,2); - draw Codelongueur(A,D,C,B,5); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $L$ etex); - label.lft(btex $\ell$ etex,iso(A,D)); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - pair A,B,C,D; - A=u*(1,1); - B-A=u*(3,0); - C=2/3[B,rotation(A,B,-90)]; - D-C=A-B; - draw polygone(A,B,C,D); - draw codeperp(A,B,C,5); - draw codeperp(B,C,D,5); - draw codeperp(C,D,A,5); - draw codeperp(D,A,B,5); - marque_s:=marque_s/3; - draw Codelongueur(A,B,C,D,2); - draw Codelongueur(A,D,C,B,5); - marque_s:=marque_s*3; - draw appelation(A,B,-3mm,btex $L$ etex); - label.lft(btex $\ell$ etex,iso(A,D)); - \end{mpost} - \fi -} - -\def\MPFigureTriangle{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(1,1); - B-A=u*(3,0); - C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - draw polygone(A,B,C); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(1,1); - B-A=u*(3,0); - C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - draw polygone(A,B,C); - \end{mpost} - \fi -} - -\def\MPFigureCercle{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(2.5,2.5); - path cc; - cc=cercles(A,1.25u); - B=pointarc(cc,195); - C=symetrie(B,A); - draw cc withcolor gris; - draw segment(B,C); - marque_p:="croix"; - pointe(A); - draw appelation(B,C,3mm,btex diam\`etre etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(2.5,2.5); - path cc; - cc=cercles(A,1.25u); - B=pointarc(cc,195); - C=symetrie(B,A); - draw cc withcolor gris; - draw segment(B,C); - marque_p:="croix"; - pointe(A); - draw appelation(B,C,3mm,\btex diam\`etre etex); - \end{mpost} - \fi -} - -\def\MPFigureDisque{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(2.5,2.5); - path cc; - cc=cercles(A,1.25u); - B=pointarc(cc,195); - C=symetrie(B,A); - draw cc withcolor gris; - draw segment(A,C); - marque_p:="croix"; - pointe(A); - draw appelation(A,C,3mm,btex rayon $r$ etex); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C; - A=u*(2.5,2.5); - path cc; - cc=cercles(A,1.25u); - B=pointarc(cc,195); - C=symetrie(B,A); - draw cc withcolor gris; - draw segment(A,C); - marque_p:="croix"; - pointe(A); - draw appelation(A,C,3mm,\btex rayon $r$ etex); - \end{mpost} - \fi -} - -\def\MPFigureTriangleAire{% - \ifluatex - \mplibforcehmode - \begin{mplibcode} -u:=\useKV[ClesFormule]{Echelle}; - drawoptions( dashed dashpattern(on1cm)); - pair A,B,C,H,I,J; - A=u*(0.5,1); - B-A=u*(1.4,0); - C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - H=projection(C,A,B); - I=projection(A,B,C); - J=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(C,H); - draw segment(A,B); - draw codeperp(C,H,B,5); - drawoptions(); - A:=A+u*(2.5,0); - B:=A+u*(1.4,0); - C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - I:=projection(A,B,C); - J:=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(A,I); - draw segment(C,B); - draw codeperp(A,I,B,5); - drawoptions(); - A:=A-u*(1.25,1); - B:=A+u*(1.4,0); - C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - J:=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(B,J); - draw segment(C,A); - draw codeperp(B,J,C,5); - drawoptions(); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={u:=\useKV[ClesFormule]{Echelle};}] - Figure(-5u,-5u,5u,5u); - pair A,B,C,H,I,J; - A=u*(0.5,1); - B-A=u*(1.4,0); - C=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - H=projection(C,A,B); - I=projection(A,B,C); - J=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(C,H); - draw segment(A,B); - draw codeperp(C,H,B,5); - drawoptions(); - A:=A+u*(2.5,0); - B:=A+u*(1.4,0); - C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - I:=projection(A,B,C); - J:=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(A,I); - draw segment(C,B); - draw codeperp(A,I,B,5); - drawoptions(); - A:=A-u*(1.25,1); - B:=A+u*(1.4,0); - C:=demidroite(A,rotation(B,A,60)) intersectionpoint demidroite(B,rotation(A,B,-45)); - J:=projection(B,C,A); - draw polygone(A,B,C) withcolor gris; - drawoptions(); - draw segment(B,J); - draw segment(C,A); - draw codeperp(B,J,C,5); - drawoptions(); - \end{mpost} - \fi -}% - -\newcommand\Formule[1][]{% - \useKVdefault[ClesFormule]% - \setKV[ClesFormule]{#1}% - \setlength{\RoundedBoxWidth}{\useKV[ClesFormule]{Largeur}}% - \xdef\ColorFill{\useKV[ClesFormule]{Couleur}}% - \ifboolKV[ClesFormule]{Perimetre}{% - \begin{tikzpicture}[remember picture, overlay] - \node[draw,fill=\ColorFill,dashed,rounded corners,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% - \IfStrEqCase{\useKV[ClesFormule]{Surface}}{% - {carre}{\begin{center} - \MPFigureCarre\par - P\'erim\`etre d'un carr\'e :\par$4\times c$ - \end{center}}% - {polygone}{% - \begin{center} - \MPFigurePolygone\par - P\'erim\`etre d'un polygone : \par$\text{Somme des c\^ot\'es}$ - \end{center} - }% - {rectangle}{% - \begin{center} - \MPFigureRectangle\par - P\'erim\`etre d'un rectangle : \par$2\times(L+\ell)$ - \end{center} - }% - {losange}{% - \begin{center} - \MPFigureLosange\par - P\'erim\`etre d'un losange : \par$4\times c$ - \end{center} - }% - {triangle}{% - \begin{center} - \MPFigureTriangle\par - P\'erim\`etre d'un triangle : \par Somme des c\^ot\'es - \end{center} - }% - {cercle}{% - \begin{center} - \MPFigureCercle\par - P\'erim\`etre d'un cercle : \par$\pi\times\text{diam\`etre}$ - \end{center} - }% - {parallelogramme}{% - \begin{center} - \MPFigureParallelogramme\par - P\'erim\`etre d'un parall\'elogramme : \par Somme des c\^ot\'es - \end{center} - }} - \end{minipage}}; - \end{tikzpicture} - }{\ifboolKV[ClesFormule]{Aire}{% - \begin{tikzpicture}[remember picture, overlay] - \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% - \IfStrEqCase{\useKV[ClesFormule]{Surface}}{% - {carre}{\begin{center} - \MPFigureCarre\par - Aire d'un carr\'e :\par$c\times c$ - \end{center}}% - {rectangle}{% - \begin{center} - \MPFigureRectangle\par - Aire d'un rectangle :\par$L\times\ell$ - \end{center} - }% - {losange}{% - \begin{center} - \MPFigureLosangeAire\par - Aire d'un losange :\par$\dfrac{\text{grande diagonale}\times\text{petite diagonale}}{2}$ - \end{center} - }% - {triangle}{% - \begin{center} - \MPFigureTriangleAire\par\vspace{1em}\par - Aire d'un triangle : $\displaystyle\frac{\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}}{2}$ - \end{center} - }% - {disque}{% - \begin{center} - \MPFigureDisque\par - Aire d'un disque :\par$\pi\times r\times r$ - \end{center} - }% - {parallelogramme}{% - \begin{center} - \MPFigureParallelogrammeAire\par - Aire d'un parall\'elogramme : $\text{c\^ot\'e}\times\text{hauteur relative \`a ce c\^ot\'e}$ - \end{center} - } - {sphere}{% - \begin{center} - \MPFigureSphere\par - Aire d'une sph\`ere : $4\times\pi\times r^2$ - \end{center} - }} - \end{minipage}}; - \end{tikzpicture} - }{%Volume - \begin{tikzpicture}[remember picture, overlay] - \node[draw,fill=\ColorFill,dashed,rounded corners=2,rotate={\useKV[ClesFormule]{Angle}}] (test) at \useKV[ClesFormule]{Ancre} {\begin{minipage}{\RoundedBoxWidth}% - \IfStrEqCase{\useKV[ClesFormule]{Solide}}{% - {boule}{\begin{center} - \MPFigureSphere\par - Volume d'une boule : $\dfrac{4\times\pi\times r^3}{3}$ - \end{center}}% - {cube}{% - \begin{center} - \MPFigureCube\par - Volume d'un cube : $a^3\quad(a\times a\times a)$ - \end{center} - }% - {pave}{% - \begin{center} - \MPFigurePave\par - Volume d'un pav\'e droit : $\ell\times h\times p$ - \end{center} - } - {prisme}{% - \begin{center} - \MPFigurePrisme\par - Volume d'un prisme droit : $\text{Aire de la base}\times\mbox{hauteur}$ - \end{center} - } - {cylindre}{% - \begin{center} - \MPFigureCylindre\par - Volume d'un cylindre de r\'evolution : $\pi\times r^2\times h$ - \end{center} - } - {pyramide}{% - \begin{center} - \MPFigurePyramide\par - Volume d'une pyramide : $\dfrac{\text{Aire de la base}\times\text{hauteur}}{3}$ - \end{center} - } - {cone}{% - \begin{center} - \MPFigureCone\par - Volume d'un c\^one de r\'evolution : $\displaystyle\dfrac{\pi\times r^2\times h}{3}$ - \end{center} - } - } - \end{minipage}}; - \end{tikzpicture} - } - } -} - -%%% -% Proba -%%% -\setKVdefault[ClesProba]{Echelle=false,Arbre=false,Branche=2,Angle=60,Rayon=0.25,LongueurEchelle=5,Affichage=0,Grille=1,Incline} - -\def\Updatetoksproba#1/#2\nil{\addtotok\toklistepointproba{"#1","\footnotesize #2",}} -\def\Updatetoksprobapdf#1/#2\nil{\addtotok\toklistepointproba{"#1","\noexpand\footnotesize #2",}} -\def\Updatetoksprobaechelle#1/#2/#3\nil{\addtotok\toklistepointproba{#1,#2,"#3",}} - -\newtoks\toklistepointproba - -% Pour construire l'arbre de probabilit\'e -\def\buildarbreproba{% - \toklistepointproba{}% - \ifluatex - \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksproba\compteur\nil}% - \else - \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobapdf\compteur\nil}% - \fi - \MPArbreProba{\useKV[ClesProba]{Branche}}{\useKV[ClesProba]{Angle}}{\the\toklistepointproba}{\useKV[ClesProba]{Rayon}}% -}% - -% Pour construire l'\'echelle de probabilit\'e -\def\buildechelleproba{% - \toklistepointproba{}% - \foreachitem\compteur\in\ListeProba{\expandafter\Updatetoksprobaechelle\compteur\nil}% - \MPEchelleProbaUn{\useKV[ClesProba]{LongueurEchelle}}{\the\toklistepointproba}{\useKV[ClesProba]{Affichage}}{\useKV[ClesProba]{Grille}}% -} - -\def\MPEchelleProbaUn#1#2#3#4{% - % #1:longueur du segment repr\'esentant l'\'echelle - % #2:Liste des \'ev\`enements/proba - % #3: pour l'affichage des labels (0 : rien, 1: fleches, 2 : fleches+ev\`enements, 3: fleches+proba, 4 : tout) - % #4 : dimension de "la grille" associ\'ee - \ifluatex - \begin{mplibcode} - pair A,B,C[],D[];%les noeuds de l'arbre - %Figure(-10u,-10u,10u,10u); - A=u*(1,1); - B-A=u*(#1,0); - draw segment(A,B); - draw marquesegment(A,B); - marque_s:=marque_s/2; - if #4>1: - for k=0 upto (#4-1): - D[k]=(k/#4)[A,B]; - endfor; - if (#4 mod 2)=0: - for k=0 step 2 until (#4-1): - draw marquesegment(D[k],D[k+1]); - endfor; - else: - for k=1 step 2 until (#4-1): - draw marquesegment(D[k],D[k+1]); - endfor; - fi; - fi; - marque_s:=marque_s*2; - labeloffset:=labeloffset*3; - label.bot(btex 0 etex,A); - label.bot(btex 1 etex,B); - labeloffset:=labeloffset/3; - n:=1;%compter les informations - k:=1;% compter les informations noeud pour les placer - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - num:=p_; - fi; - if (n mod 3)=2: - deno:=p_; - fi; - if (n mod 3=0): - C[k]=(num/deno)[A,B]; - if (#3>0): - drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15)); - fi; - if (#3=2) or (#3=4): - dotlabel.top(TEX(p_),C[k]); - fi; - if (#3=1) or (#3=3): - dotlabel.top("",C[k]); - fi; - if (#3>2): - label.bot(TEX("$\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5)); - fi; - k:=k+1; - fi; - n:=n+1; - endfor; - enddef; - toto(#2); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={input PfCGeometrie;}] - pair A,B,C[],D[];%les noeuds de l'arbre - Figure(-10u,-10u,10u,10u); - A=u*(1,1); - B-A=u*(#1,0); - draw segment(A,B); - draw marquesegment(A,B); - marque_s:=marque_s/2; - if #4>1: - for k=0 upto (#4-1): - D[k]=(k/#4)[A,B]; - endfor; - if (#4 mod 2)=0: - for k=0 step 2 until (#4-1): - draw marquesegment(D[k],D[k+1]); - endfor; - else: - for k=1 step 2 until (#4-1): - draw marquesegment(D[k],D[k+1]); - endfor; - fi; - fi; - marque_s:=marque_s*2; - labeloffset:=labeloffset*3; - label.bot(btex 0 etex,A); - label.bot(btex 1 etex,B); - labeloffset:=labeloffset/3; - n:=1;%compter les informations - k:=1;% compter les informations noeud pour les placer - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - num:=p_; - fi; - if (n mod 3)=2: - deno:=p_; - fi; - if (n mod 3=0): - C[k]=(num/deno)[A,B]; - if (#3>0): - drawarrow (C[k]-u*(0,0.5))--(C[k]-u*(0,0.15)); - fi; - if (#3=2) or (#3=4): - dotlabel.top(LATEX(p_),C[k]); - fi; - if (#3=1) or (#3=3): - dotlabel.top("",C[k]); - fi; - if (#3>2): - label.bot(LATEX("$\noexpand\frac{"&decimal(num)&"}{"&decimal(deno)&"}$"),C[k]-u*(0,0.5));%Le \noexpand est n\'ecessaire pour \'eviter un probl\`eme \`a la compilation, dû \`a l'expansion du \frac par gmp. - fi; - k:=k+1; - fi; - n:=n+1; - endfor; - enddef; - toto(#2); - \end{mpost} - \fi -} - -\def\MPArbreProba#1#2#3#4{% - % #1:longueur d'une branche - % #2:angle entre deux branches de m\^eme origine - % #3:Liste des \'ev\`enements/proba - \ifluatex - \begin{mplibcode} - boolean Incline; - Incline=\useKV[ClesProba]{Incline}; - pair A[],B[];%les noeuds de l'arbre - A0=u*(1,1); - B0-A0=u*(#1,0); - A1=rotation(B0,A0,#2/2); - A2=rotation(B0,A0,-#2/2); - B1-A1=B0-A0; - A3=rotation(B1,A1,#2/3); - A4=rotation(B1,A1,-#2/3); - B2-A2=B0-A0; - A5=rotation(B2,A2,#2/3); - A6=rotation(B2,A2,-#2/3); - draw segment(A4,A1); - draw segment(A5,A2); - draw chemin(A3,A1,A0,A2,A6); - for k=1 upto 6: - fill cercles(A[k],#4*cm) withcolor white; - endfor; - n:=1;%compter les informations - k:=1;% compter les informations noeud pour les placer - l:=1;% compter les informations "num\'eriques" - vardef toto(text t)= - for p_=t: - if (n mod 2)=1: - if p_<>"": - label(TEX(p_),A[k]); - fi; - k:=k+1; - else: - if (l mod 2)=1: - if p_<>"": - if Incline: - draw appelation(A[(l-1) div 2],A[l],4mm,TEX(p_)); - else: - label.ulft(TEX(p_),iso(A[(l-1) div 2],A[l])); - fi; - fi; - else: - if p_<>"": - if Incline: - draw appelation(A[(l-1) div 2],A[l],-4mm,TEX(p_)); - else: - label.llft(TEX(p_),iso(A[(l-1) div 2],A[l])); - fi; - fi; - fi; - l:=l+1; - fi; - n:=n+1; - endfor; - enddef; - toto(#3); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={%input PfCGeometrie; - boolean Incline; Incline=\useKV[ClesProba]{Incline};}] - pair A[],B[];%les noeuds de l'arbre - %Figure(-10u,-10u,10u,10u); - A0=u*(1,1); - B0-A0=u*(#1,0); - A1=rotation(B0,A0,#2/2); - A2=rotation(B0,A0,-#2/2); - B1-A1=B0-A0; - A3=rotation(B1,A1,#2/3); - A4=rotation(B1,A1,-#2/3); - B2-A2=B0-A0; - A5=rotation(B2,A2,#2/3); - A6=rotation(B2,A2,-#2/3); - draw segment(A4,A1); - draw segment(A5,A2); - draw chemin(A3,A1,A0,A2,A6); - for k=1 upto 6: - fill cercles(A[k],#4*cm) withcolor white; - endfor; - n:=1;%compter les informations - k:=1;% compter les informations noeud pour les placer - l:=1;% compter les informations "num\'eriques" - vardef toto(text t)= - for p_=t: - if (n mod 2)=1: - if p_<>"": - label(LATEX(p_),A[k]); - fi; - k:=k+1; - else: - if (l mod 2)=1: - if p_<>"": - if Incline: - draw appelation(A[(l-1) div 2],A[l],4mm,LATEX(p_)); - else: - label.ulft(LATEX(p_),iso(A[(l-1) div 2],A[l])); - fi; - fi; - else: - if p_<>"": - if Incline: - draw appelation(A[(l-1) div 2],A[l],-4mm,LATEX(p_)); - else: - label.llft(LATEX(p_),iso(A[(l-1) div 2],A[l])); - fi; - fi; - fi; - l:=l+1; - fi; - n:=n+1; - endfor; - enddef; - toto(#3); - \end{mpost} - \fi -} - -\newcommand\Proba[2][]{% - \useKVdefault[ClesProba]% - \setKV[ClesProba]{#1}% - % On liste les diff\'erents \'el\'ements sous la forme Ev\`enement/proba - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListeProba{#2}% - \ifboolKV[ClesProba]{Echelle}{% - \buildechelleproba% - }{\ifboolKV[ClesProba]{Arbre}{% - \buildarbreproba% - }{}% - }% - \setsepchar{,}% -}% - -%%% -% Reperage -%%% -\setKVdefault[ClesReperage]{Unitex=1,Pasx=1,Unitey=1,Pasy=1,Unitez=1,Pasz=1,DemiDroite=false,Droite=false,Plan=false,Trace=false,ListeSegment={},Espace=false,Sphere=false,AnglePhi=30,CouleurLa=white,CouleurLon=Tomato,AffichageNom=false,AffichageGrad=false,AffichageAbs=0,AffichageCoord=false,LectureCoord=false,ValeurUnitex=1,ValeurUnitey=1,ValeurOrigine=0,NomOrigine=O,EchelleEspace=50,CouleurCoord=black,Thermometre=false,Mercure=false,CouleurMercure=black,Celsius,Kelvin=false,Farenheit=false,ValeurMin=-4000,ValeurMax=4000,Etages=4,Code=false} -\defKV[ClesReperage]{Traces=\setKV[ClesReperage]{Code}} -% ValeurOrigine permet de faire des morceaux de demi-droite gradu\'ee en passant par droite :) - -\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} -\def\Updatetoksdroite#1/#2\nil{\addtotok\toklistepointdroite{#1,"#2",}} -\def\Updatetoksdemidroite#1/#2\nil{\addtotok\toklistenompointdemidroite{"#2",}} -\def\Updatetoksrepere#1/#2/#3\nil{\addtotok\toklistepointrepere{#1,#2,"#3",}} -\def\Updatetoksespace#1/#2/#3/#4\nil{\addtotok\toklistepointespace{#1,#2,#3,"#4",}} - -\newtoks\toklistepointrepere% -\newtoks\toklistepointdroite% -\newtoks\toklistepointdemidroite% -\newtoks\toklistenompointdemidroite% -\newtoks\toklistepointespace% - -% Pour construire le rep\`ere de l'espace -\def\buildespace{% - \toklistepointespace{}% - \ifboolKV[ClesReperage]{Sphere}{% - \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksrepere\compteur\nil}% - \[\MPEspaceSphere{\the\toklistepointrepere}{\useKV[ClesReperage]{EchelleEspace}}\] - }{% - \foreachitem\compteur\in\ListePointEspace{\expandafter\Updatetoksespace\compteur\nil}% - \ifboolKV[ClesReperage]{AffichageNom}{% - \ifboolKV[ClesReperage]{AffichageCoord}{% - \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{3}{\useKV[ClesReperage]{EchelleEspace}}\]% - }{% - \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{2}{\useKV[ClesReperage]{EchelleEspace}}\]% - }% - }{% - \ifboolKV[ClesReperage]{AffichageCoord}{% - \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{1}{\useKV[ClesReperage]{EchelleEspace}}\]% - }{% - \[\MPEspacePave{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\useKV[ClesReperage]{Unitez}}{\useKV[ClesReperage]{Pasz}}{\the\toklistepointespace}{0}{\useKV[ClesReperage]{EchelleEspace}}\]% - }% - }% - }% -}% - -\def\MPEspaceSphere#1#2{% - \ifluatex - \begin{mplibcode} - typetrace:="3D"; - typerepre:="persp"; - anglephi:=\useKV[ClesReperage]{AnglePhi}; - Initialisation(1500,anglephi,10,#2); - color O,A,B,C,D,Z,M[]; - O=(0,0,0); - A=(cosd(anglephi+90),sind(anglephi+90),0); - B=(cosd(anglephi+180),sind(anglephi+180),0); - C=(1,0,0); - D=(0,1,0); - Z=(0,0,1); - trace cercles(O,A,O,A,Z) withcolor 0.7white; - path Equateur; - Equateur=cercles(O,C,O,C,D); - trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; - trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; - path greenwich; - greenwich=cercles(O,C,O,C,Z); - trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; - clip currentpicture to cercles(O,A,O,A,Z); - trace chemin(C,O,Z) dashed evenly withcolor 0.85white; - trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; - - vardef toto(text t)= - n:=1; - for p_=t: - if (n mod 3)=1: - k:=p_; - fi; - if (n mod 3)=2: - l:=p_; - fi; - if (n mod 3)=0: - M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); - path Codageun,Codagedeux; - if k>0: - Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); - elseif k<0: - Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); - fi; - if l>0: - Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); - elseif l<0: - Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); - fi; - %%%% if l>0: - %%%fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; - %%%fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; - %%%else: - %%%fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; - %%%fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; - %%%fi; - if unknown Codageun: else: trace Codageun; fi; - if unknown Codagedeux: else: trace Codagedeux; fi; - if \useKV[ClesReperage]{AffichageCoord}: - picture CodageUn,CodageDeux; - CodageUn=image( - if k>0: - label.bot(TEX("\scriptsize\ang{"&decimal(k)&"} E"),(0,0)); - else: - label.bot(TEX("\scriptsize\ang{"&decimal(abs(k))&"} O"),(0,0)); - fi; - ); - CodageDeux=image( - if k>0: - label.rt(TEX("\scriptsize\ang{"&decimal(l)&"} N"),(0,0)); - else: - label.lft(TEX("\scriptsize\ang{"&decimal(abs(l))&"} S"),(0,0)); - fi; - ); - fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; - trace CodageUn shifted (point(0.5*length Codageun) of Codageun); - fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; - trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); - fi; - trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; - trace chemin(O,M[n]) dashed withdots scaled 0.5; - trace chemin(O,C) dashed withdots scaled 0.5; - if \useKV[ClesReperage]{AffichageNom}: - if l>0:dotlabel.top(p_,Projette(M[n])); - else: - dotlabel.bot(p_,Projette(M[n])); - fi; - fi; - fi; - n:=n+1; - endfor; - enddef; - toto(#1); - label.llft(btex \tiny \ang{0} etex,Projette(C)); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={boolean AffichageCoord; AffichageCoord=\useKV[ClesReperage]{AffichageCoord}; boolean AffichageNom; AffichageNom=\useKV[ClesReperage]{AffichageNom};anglephi:=\useKV[ClesReperage]{AnglePhi};}] - typetrace:="3D"; - typerepre:="persp"; - Initialisation(1500,anglephi,10,#2); - color O,A,B,C,D,Z,M[]; - O=(0,0,0); - A=(cosd(anglephi+90),sind(anglephi+90),0); - B=(cosd(anglephi+180),sind(anglephi+180),0); - C=(1,0,0); - D=(0,1,0); - Z=(0,0,1); - trace cercles(O,A,O,A,Z) withcolor 0.7white; - path Equateur; - Equateur=cercles(O,C,O,C,D); - trace (subpath((0.25+anglephi/360)*length Equateur,(0.75+anglephi/360)*length Equateur) of Equateur) dashed evenly withcolor 0.7white; - trace (subpath((0.75+anglephi/360)*length Equateur,(1.25+anglephi/360)*length Equateur) of Equateur) withcolor 0.7white; - path greenwich; - greenwich=cercles(O,C,O,C,Z); - trace subpath(3*length greenwich/4,5*length greenwich/4) of greenwich withcolor 0.7white; - clip currentpicture to cercles(O,A,O,A,Z); - trace chemin(C,O,Z) dashed evenly withcolor 0.85white; - trace chemin(O,2[Z,O]) dashed evenly withcolor 0.85white; - - vardef toto(text t)= - n:=1; - for p_=t: - if (n mod 3)=1: - k:=p_; - fi; - if (n mod 3)=2: - l:=p_; - fi; - if (n mod 3)=0: - M[n]=(cosd(k)*cosd(l),sind(k)*cosd(l),sind(l)); - path Codageun,Codagedeux; - if k>0: - Codageun=cercles(O,1[O,C],O,1[O,C],D) cutafter chemin(O,(cosd(k),sind(k),0)); - elseif k<0: - Codageun=cercles(O,1[O,C],O,1[O,C],D) cutbefore chemin(O,(cosd(k),sind(k),0)); - fi; - if l>0: - Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutafter chemin(O,M[n]); - elseif k<0: - Codagedeux=cercles(O,(cosd(k),sind(k),0),O,(cosd(k),sind(k),0),Z) cutbefore chemin(O,M[n]); - fi; - %if l>0: - %fill Projette(O)--Projette((cosd(k),sind(k),0))--Codagedeux--cycle withcolor \useKV[ClesReperage]{CouleurLa}; - %fill Projette(O)--Projette(C)--Codageun--cycle withcolor \useKV[ClesReperage]{CouleurLon}; - %else: - %fill Projette(O)--Codagedeux--Projette((cosd(k),sind(k),0))--cycle withcolor \useKV[ClesReperage]{CouleurLa}; - %fill Projette(O)--Codageun--Projette(C)--cycle withcolor \useKV[ClesReperage]{CouleurLon}; - %fi; - if unknown Codageun: else: trace Codageun; fi; - if unknown Codagedeux: else: trace Codagedeux; fi; - if AffichageCoord: - picture CodageUn,CodageDeux; - CodageUn=image( - if k>0: - label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(k)&"} E"),(0,0)); - else: - label.bot(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(k))&"} O"),(0,0)); - fi; - ); - CodageDeux=image( - if k>0: - label.rt(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(l)&"} N"),(0,0)); - else: - label.lft(LATEX("\noexpand\scriptsize\noexpand\ang{"&decimal(abs(l))&"} S"),(0,0)); - fi; - ); - fill (polygone(llcorner CodageUn,lrcorner CodageUn,urcorner CodageUn,ulcorner CodageUn) shifted(point(0.5*length Codageun) of Codageun)) withcolor blanc; - trace CodageUn shifted (point(0.5*length Codageun) of Codageun); - fill (polygone(llcorner CodageDeux,lrcorner CodageDeux,urcorner CodageDeux,ulcorner CodageDeux) shifted(point(0.5*length Codagedeux) of Codagedeux)) withcolor blanc; - trace CodageDeux shifted (point(0.5*length Codagedeux) of Codagedeux); - fi; - trace chemin(O,(cosd(k),sind(k),0)) dashed withdots scaled 0.5; - trace chemin(O,M[n]) dashed withdots scaled 0.5; - trace chemin(O,C) dashed withdots scaled 0.5; - if AffichageNom: - if l>0:dotlabel.top(p_,Projette(M[n])); - else: - dotlabel.bot(p_,Projette(M[n])); - fi; - fi; - fi; - n:=n+1; - endfor; - enddef; - toto(#1); - label.llft(LATEX("\noexpand\tiny\noexpand\ang{0}"),Projette(C)); - \end{mpost} - \fi -} - -\def\MPEspacePave#1#2#3#4#5#6#7#8#9{% - \ifluatex - \begin{mplibcode} - typetrace:="3D"; - typerepre:="persp"; - Figure(-20u,-20u,20u,20u); - Initialisation(1500,30,20,abs(#9)); - %marque_r:=marque_r/2; - marque_p:="plein"; - color A,B,C,D,E,F,G,H,M[],N[]; - draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); - if #9>0: - drawarrow Projette(A)--Projette(1.5[D,A]); - drawarrow Projette(C)--Projette(1.5[D,C]); - drawarrow Projette(E)--Projette(1.5[D,E]); - label.top(btex $x$ etex,Projette(1.5[D,A])); - label.top(btex $y$ etex,Projette(1.5[D,C])); - label.top(btex $z$ etex,Projette(1.5[D,E])); - label.ulft(btex 1 etex,Projette((1/#2)[D,A])); - label.bot(btex 1 etex,Projette((1/#4)[D,C])); - label.lft(btex 1 etex,Projette((1/#6)[D,E])); - for k=1 upto (#2): - pointe((k/#2)[D,A]); - endfor; - for k=1 upto (#4): - pointe((k/#4)[D,C]); - endfor; - for k=1 upto (#6): - pointe((k/#6)[D,E]); - endfor; - else: - drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; - drawarrow Projette(B)--Projette(1.5[A,B]); - drawarrow Projette(F)--Projette(1.5[A,F]); - label.lrt(btex $x$ etex,Projette(1.5[A,D])); - label.top(btex $y$ etex,Projette(1.5[A,B])); - label.top(btex $z$ etex,Projette(1.5[A,F])); - label.ulft(btex 1 etex,Projette((1/#2)[A,D])); - label.bot(btex 1 etex,Projette((1/#4)[A,B])); - label.lft(btex 1 etex,Projette((1/#6)[A,F])); - for k=1 upto (#2): - pointe((k/#2)[A,D]); - endfor; - for k=1 upto (#4): - pointe((k/#4)[A,B]); - endfor; - for k=1 upto (#6): - pointe((k/#6)[A,F]); - endfor; - fi; - vardef tata(text t)= - n:=1;%pour compter combien de points - k:=0;%pour garder l'abscisse - l:=0;%pour garder l'ordonn\'ee - m:=0;%pour garder l'altitude - if #8>0: - for p_=t: - if (n mod 4)=1: - k:=p_; - fi; - if (n mod 4)=2: - l:=p_; - fi; - if (n mod 4)=3: - m:=p_; - fi; - if (n mod 4)=0: - M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); - N[n]=(k/#2)[D,A]+(l/#4)*(C-D); - if (#8>1): - label.top(TEX(p_),Projette(M[n])); - pointe(M[n]); - fi; - if (#8=1) or (#8=3) : - drawoptions(dashed evenly withcolor gris); - draw segment(M[n],(0,0,bluepart(M[n]))); - draw segment(M[n],N[n]); - draw segment(N[n],(redpart(M[n]),0,0)); - draw segment(N[n],(0,greenpart(M[n]),0)); - drawoptions(); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - vardef toto(text t)= - n:=1;%pour compter combien de points - k:=0;%pour garder l'abscisse - l:=0;%pour garder l'ordonn\'ee - m:=0;%pour garder l'altitude - if #8>0: - for p_=t: - if (n mod 4)=1: - k:=p_; - fi; - if (n mod 4)=2: - l:=p_; - fi; - if (n mod 4)=3: - m:=p_; - fi; - if (n mod 4)=0: - % message("je suis ici : "&p_); - M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); - N[n]=(k/#2)[A,D]+(l/#4)*(B-A); - if (#8>1): - label.top(TEX(p_),Projette(M[n])); - pointe(M[n]); - fi; - if (#8=1) or (#8=3) : - drawoptions(dashed evenly withcolor gris); - draw segment(M[n],A+(0,0,bluepart(M[n]))); - draw segment(M[n],N[n]); - draw segment(N[n],A+(l/#4)*(B-A)); - draw segment(N[n],A+(k/#2)*(D-A)); - drawoptions(); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - if #9>0: - tata(#7); - else: - toto(#7); - fi; - draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); - if \useKV[ClesReperage]{Code}: - \useKV[ClesReperage]{Traces} - fi; - \end{mplibcode} - \else - \begin{mpost}[mpsettings={input PfCGeometrie;}] - typetrace:="3D"; - typerepre:="persp"; - Figure(-20u,-20u,20u,20u); - Initialisation(1500,30,20,abs(#9)); - %marque_r:=marque_r/2; - marque_p:="plein"; - color A,B,C,D,E,F,G,H,M[],N[]; - draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); - if #9>0: - drawarrow Projette(A)--Projette(1.5[D,A]); - drawarrow Projette(C)--Projette(1.5[D,C]); - drawarrow Projette(E)--Projette(1.5[D,E]); - label.ulft(btex 1 etex,Projette((1/#2)[D,A])); - label.bot(btex 1 etex,Projette((1/#4)[D,C])); - label.lft(btex 1 etex,Projette((1/#6)[D,E])); - for k=1 upto (#2): - pointe((k/#2)[D,A]); - endfor; - for k=1 upto (#4): - pointe((k/#4)[D,C]); - endfor; - for k=1 upto (#6): - pointe((k/#6)[D,E]); - endfor; - else: - drawarrow Projette(D)--Projette(1.5[A,D]) dashed evenly; - drawarrow Projette(B)--Projette(1.5[A,B]); - drawarrow Projette(F)--Projette(1.5[A,F]); - label.ulft(btex 1 etex,Projette((1/#2)[A,D])); - label.bot(btex 1 etex,Projette((1/#4)[A,B])); - label.lft(btex 1 etex,Projette((1/#6)[A,F])); - for k=1 upto (#2): - pointe((k/#2)[A,D]); - endfor; - for k=1 upto (#4): - pointe((k/#4)[A,B]); - endfor; - for k=1 upto (#6): - pointe((k/#6)[A,F]); - endfor; - fi; - vardef tata(text t)= - n:=1;%pour compter combien de points - k:=0;%pour garder l'abscisse - l:=0;%pour garder l'ordonn\'ee - m:=0;%pour garder l'altitude - if #8>0: - for p_=t: - if (n mod 4)=1: - k:=p_; - fi; - if (n mod 4)=2: - l:=p_; - fi; - if (n mod 4)=3: - m:=p_; - fi; - if (n mod 4)=0: - M[n]=(k/#2)[D,A]+(l/#4)*(C-D)+(m/#6)*(E-D); - N[n]=(k/#2)[D,A]+(l/#4)*(C-D); - if (#8>1): - label.top(LATEX(p_),Projette(M[n])); - pointe(M[n]); - fi; - if (#8=1) or (#8=3) : - drawoptions(dashed evenly withcolor gris); - draw segment(M[n],(0,0,bluepart(M[n]))); - draw segment(M[n],N[n]); - draw segment(N[n],(redpart(M[n]),0,0)); - draw segment(N[n],(0,greenpart(M[n]),0)); - drawoptions(); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - vardef toto(text t)= - n:=1;%pour compter combien de points - k:=0;%pour garder l'abscisse - l:=0;%pour garder l'ordonn\'ee - m:=0;%pour garder l'altitude - if #8>0: - for p_=t: - if (n mod 4)=1: - k:=p_; - fi; - if (n mod 4)=2: - l:=p_; - fi; - if (n mod 4)=3: - m:=p_; - fi; - if (n mod 4)=0: - % message("je suis ici : "&p_); - M[n]=(k/#2)[A,D]+(l/#4)*(B-A)+(m/#6)*(F-A); - N[n]=(k/#2)[A,D]+(l/#4)*(B-A); - if (#8>1): - label.top(LATEX(p_),Projette(M[n])); - pointe(M[n]); - fi; - if (#8=1) or (#8=3) : - drawoptions(dashed evenly withcolor gris); - draw segment(M[n],A+(0,0,bluepart(M[n]))); - draw segment(M[n],N[n]); - draw segment(N[n],A+(l/#4)*(B-A)); - draw segment(N[n],A+(k/#2)*(D-A)); - drawoptions(); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - if #9>0: - tata(#7); - else: - toto(#7); - fi; - draw Pave(A,B,C,D,E,F,G,H)(#1,#3,#5); - \end{mpost} - \fi -}% - -% Pour construire le rep\`ere du plan -\def\buildreperenew{% - \toklistepointrepere{}% - \foreachitem\compteur\in\ListePointRepere{\expandafter\Updatetoksrepere\compteur\nil}% - \ifboolKV[ClesReperage]{Trace}{% - \[\MPPlanTrace{\useKV[ClesReperage]{Unitex}}{\useKV[ClesReperage]{Pasx}}{\useKV[ClesReperage]{Unitey}}{\useKV[ClesReperage]{Pasy}}{\the\toklistepointrepere}{2}{\useKV[ClesReperage]{ValeurUnitex}}{\useKV[ClesReperage]{ValeurUnitey}}{\useKV[ClesReperage]{ListeSegment}}\]% - }{% - \xdef\AfficheNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{3}}{\xdef\AfficheNom{2}}}{\ifboolKV[ClesReperage]{LectureCoord}{\xdef\AfficheNom{1}}{}}% - \xdef\AfficheGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AfficheGrad{1}}{}% - \xdef\AfficheCoord{\useKV[ClesReperage]{AffichageAbs}}% - \MPPlannew{(\useKV[ClesReperage]{Unitex},\useKV[ClesReperage]{Pasx})}{(\useKV[ClesReperage]{Unitey},\useKV[ClesReperage]{Pasy})}{\the\toklistepointrepere}{\AfficheNom}{\AfficheCoord}{\AfficheGrad}{(\useKV[ClesReperage]{ValeurUnitex},\useKV[ClesReperage]{ValeurUnitey})}% - }% -} - -\def\MPPlannew#1#2#3#4#5#6#7{% - %#1 : Unitex, pasx - %#2 : unitey, pasy - %#3 : liste de points - %#4 : Affichage nom + lecture graphique - %#5 : Affichage des (abscisses/ordonn\'ees) - %#6 : Graduation compl\`ete ? - %#7 : (unitex,unitey) - \ifluatex - \begin{mplibcode} - maxx:=-4000; - minx=4000; - unitex:=(xpart(#1))*cm; - pasx=ypart(#1); - unitpx:=unitex/pasx; - maxy:=-4000; - miny:=4000; - unitey:=(xpart(#2))*cm; - pasy:=ypart(#2); - unitpy:=unitey/pasy; - n:=1; - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - if p_>maxx: - maxx:=p_; - fi; - if p_<minx: - minx:=p_; - fi; - fi; - if (n mod 3)=2: - if p_>maxy: - maxy:=p_; - fi; - if p_<miny: - miny:=p_; - fi; - fi; - n:=n+1; - endfor; - maxx:=maxx+1; - minx:=minx-1; - if maxx<(ypart(#1)+1): - maxx:=ypart(#1)+1; - fi; - if minx>(-ypart(#1)-1): - minx:=-ypart(#1)-1; - fi; - maxy:=maxy+1; - miny:=miny-1; - if maxy<(ypart(#2)+1): - maxy:=ypart(#2)+1; - fi; - if miny>(-ypart(#2)-1): - miny:=-ypart(#2)-1; - fi; - enddef; - toto(#3); - Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); - pair A,B,C,D,E; - A=(0,0); - B=(minx*unitpx,0); - C=(maxx*unitpx,0); - D=(0,miny*unitpy); - E=(0,maxy*unitpy); - for k=0 upto (maxx-minx): - draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; - endfor; - for k=0 upto (maxy-miny): - draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; - endfor; - drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); - drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); - % graduation compl\`ete ou pas ? - label.llft(btex \footnotesize 0 etex,A); - if #6>0: - for k=minx upto maxx: - if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): - if k<>0: - dotlabel.lrt(TEX("\footnotesize\num{"&decimal(k)&"}"),(k*unitex,0)); - fi; - fi; - endfor; - for k=miny upto maxy: - if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): - if k<>0: - dotlabel.ulft(TEX("\footnotesize\num{"&decimal(k)&"}"),(0,k*unitey)); - fi; - fi; - endfor; - else: - dotlabel.lrt(TEX("\footnotesize\num{"&decimal(xpart(#7))&"}"),(unitex,0)); - dotlabel.ulft(TEX("\footnotesize\num{"&decimal(ypart(#7))&"}"),(0,unitey)); - fi; - % apparition du nom des points ou pas - m_c:=m_c*3; - marque_p:="croix"; - vardef tata(text t)=%on place les points - if #4>0: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if #4>1: - if p_<>"": - if (k>0) and (l>0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l>0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l=0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l>0): - label.ulft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l<0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l<0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l=0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l<0): - label.lrt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - pointe((k*unitpx,l*unitpy)); - fi; - fi; - if (#4=1) or (#4=3): - draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; - fi; - fi; - n:=n+1; - endfor; - fi; - if #5=2: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if p_<>"": - if (k mod pasx)<>0: - label.lrt(TEX("\footnotesize$\frac{\num{"&decimal(k)&"}}{\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); - else: - label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); - fi; - if (l mod pasy)<>0: - label.ulft(TEX("\footnotesize$\frac{\num{"&decimal(l)&"}}{\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); - else: - label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); - fi; - pointe((k*unitpx,0),(0,l*unitpy)); - fi; - fi; - n:=n+1; - endfor; - elseif #5=1: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if p_<>"": - label.lrt(TEX("\footnotesize\num{\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); - label.ulft(TEX("\footnotesize\num{\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); - pointe((k*unitpx,0),(0,l*unitpy)); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - tata(#3); - \end{mplibcode} - \else - \begin{mpost} - maxx:=-4000; - minx=4000; - unitex:=(xpart(#1))*cm; - pasx=ypart(#1); - unitpx:=unitex/pasx; - maxy:=-4000; - miny:=4000; - unitey:=(xpart(#2))*cm; - pasy:=ypart(#2); - unitpy:=unitey/pasy; - n:=1; - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - if p_>maxx: - maxx:=p_; - fi; - if p_<minx: - minx:=p_; - fi; - fi; - if (n mod 3)=2: - if p_>maxy: - maxy:=p_; - fi; - if p_<miny: - miny:=p_; - fi; - fi; - n:=n+1; - endfor; - maxx:=maxx+1; - minx:=minx-1; - if maxx<(ypart(#1)+1): - maxx:=ypart(#1)+1; - fi; - if minx>(-ypart(#1)-1): - minx:=-ypart(#1)-1; - fi; - maxy:=maxy+1; - miny:=miny-1; - if maxy<(ypart(#2)+1): - maxy:=ypart(#2)+1; - fi; - if miny>(-ypart(#2)-1): - miny:=-ypart(#2)-1; - fi; - enddef; - toto(#3); - Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); - pair A,B,C,D,E; - A=(0,0); - B=(minx*unitpx,0); - C=(maxx*unitpx,0); - D=(0,miny*unitpy); - E=(0,maxy*unitpy); - for k=0 upto (maxx-minx): - draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; - endfor; - for k=0 upto (maxy-miny): - draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; - endfor; - drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); - drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); - % graduation compl\`ete ou pas ? - label.llft(btex \noexpand\footnotesize 0 etex,A); - if #6>0: - for k=minx upto maxx: - if (xpart((k*unitex,0))>xpart(B+(-0.75*unitpx,0))) and (xpart((k*unitex,0))<xpart(C+(0.75*unitpx,0))): - if k<>0: - dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(k*unitex,0)); - fi; - fi; - endfor; - for k=miny upto maxy: - if (ypart((0,k*unitey))>ypart(D+(0,-0.75*unitpy))) and (ypart((0,k*unitey))<ypart(E+(0,0.75*unitpy))): - if k<>0: - dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(k)&"}"),(0,k*unitey)); - fi; - fi; - endfor; - else: - dotlabel.lrt(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(xpart(#7))&"}"),(unitex,0)); - dotlabel.ulft(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ypart(#7))&"}"),(0,unitey)); - fi; - % apparition du nom des points ou pas - m_c:=m_c*3; - marque_p:="croix"; - vardef tata(text t)=%on place les points - if #4>0: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if #4>1: - if p_<>"": - if (k>0) and (l>0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l>0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l=0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l>0): - label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l<0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l<0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l=0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l<0): - label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - pointe((k*unitpx,l*unitpy)); - fi; - fi; - if (#4=1) or (#4=3): - draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; - fi; - fi; - n:=n+1; - endfor; - fi; - if #5=2: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if p_<>"": - if (k mod pasx)<>0: - label.lrt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(k)&"}}{\noexpand\num{"&decimal(pasx)&"}}$"),(k*unitpx,0)); - else: - label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); - fi; - if (l mod pasy)<>0: - label.ulft(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{"&decimal(l)&"}}{\noexpand\num{"&decimal(pasy)&"}}$"),(0,l*unitpy)); - else: - label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); - fi; - pointe((k*unitpx,0),(0,l*unitpy)); - fi; - fi; - n:=n+1; - endfor; - elseif #5=1: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if p_<>"": - label.lrt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(k)&"/"&decimal(pasx)&"}}"),(k*unitpx,0)); - label.ulft(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(l)&"/"&decimal(pasy)&"}}"),(0,l*unitpy)); - pointe((k*unitpx,0),(0,l*unitpy)); - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - tata(#3); - \end{mpost} - \fi -} - -\def\MPPlanTrace#1#2#3#4#5#6#7#8#9{% - \ifluatex - \begin{mplibcode} - maxx:=-4000; - minx=4000; - unitex:=#1*cm; - pasx=#2; - unitpx:=unitex/pasx; - maxy:=-4000; - miny:=4000; - unitey:=#3*cm; - pasy:=#4; - unitpy:=unitey/pasy; - n:=1; - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - if p_>maxx: - maxx:=p_; - fi; - if p_<minx: - minx:=p_; - fi; - fi; - if (n mod 3)=2: - if p_>maxy: - maxy:=p_; - fi; - if p_<miny: - miny:=p_; - fi; - fi; - n:=n+1; - endfor; - maxx:=maxx+1; - minx:=minx-1; - if maxx<(#2+1): - maxx:=#2+1; - fi; - if minx>(-#2-1): - minx:=-#2-1; - fi; - maxy:=maxy+1; - miny:=miny-1; - if maxy<(#4+1): - maxy:=#2+1; - fi; - if miny>(-#4-1): - miny:=-#4-1; - fi; - enddef; - toto(#5); - Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); - pair A,B,C,D,E; - A=(0,0); - B=(minx*unitpx,0); - C=(maxx*unitpx,0); - D=(0,miny*unitpy); - E=(0,maxy*unitpy); - for k=0 upto (maxx-minx): - draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; - endfor; - for k=0 upto (maxy-miny): - draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; - endfor; - drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); - drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); - dotlabel.bot(TEX("\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); - dotlabel.lft(TEX("\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); - label.llft(btex 0 etex,A); - % apparition du nom des points ou pas - m_c:=m_c*3; - marque_p:="croix"; - vardef tata(text t)=%on place les points - if #6>0: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if #6>1: - if (k>0) and (l>0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l>0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l=0): - label.urt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l>0): - label.ulft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l<0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l<0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l=0): - label.llft(TEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l<0): - label.lrt(TEX(p_),(k*unitpx,l*unitpy)); - fi; - pointe((k*unitpx,l*unitpy)); - fi; - if (#6=1) or (#6=3): - draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - vardef Tracage(text t)(text ls)=%on trace les segments - pair A[]; - n:=0;%pour parcourir la liste - m:=0;%pour lister les points par leur nombre - for p_=t: - n:=n+1; - if (n mod 3)=1: - k:=p_; - fi; - if (n mod 3)=2: - l:=p_; - fi; - if (n mod 3)=0: - m:=m+1; - A[m]=(k*unitpx,l*unitpy); - fi; - endfor; - for p_=ls: - draw segment(A[p_ div 10],A[p_ mod 10]); - endfor; - enddef; - tata(#5); - Tracage(#5)(#9); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={input PfCGeometrie;}] - maxx:=-4000; - minx=4000; - unitex:=#1*cm; - pasx=#2; - unitpx:=unitex/pasx; - maxy:=-4000; - miny:=4000; - unitey:=#3*cm; - pasy:=#4; - unitpy:=unitey/pasy; - n:=1; - vardef toto(text t)= - for p_=t: - if (n mod 3)=1: - if p_>maxx: - maxx:=p_; - fi; - if p_<minx: - minx:=p_; - fi; - fi; - if (n mod 3)=2: - if p_>maxy: - maxy:=p_; - fi; - if p_<miny: - miny:=p_; - fi; - fi; - n:=n+1; - endfor; - maxx:=maxx+1; - minx:=minx-1; - if maxx<(#2+1): - maxx:=#2+1; - fi; - if minx>(-#2-1): - minx:=-#2-1; - fi; - maxy:=maxy+1; - miny:=miny-1; - if maxy<(#4+1): - maxy:=#2+1; - fi; - if miny>(-#4-1): - miny:=-#4-1; - fi; - enddef; - toto(#5); - Figure((minx-1)*unitpx,(miny-1)*unitpy,(maxx+1)*unitpx,(maxy+1)*unitpy); - pair A,B,C,D,E; - A=(0,0); - B=(minx*unitpx,0); - C=(maxx*unitpx,0); - D=(0,miny*unitpy); - E=(0,maxy*unitpy); - for k=0 upto (maxx-minx): - draw ((xpart(B),ypart(D)-0.75*unitpy)--(xpart(B),ypart(E)+0.75*unitpy)) shifted (k*unitpx,0) withcolor gris; - endfor; - for k=0 upto (maxy-miny): - draw ((xpart(B)-0.75*unitpx,ypart(D))--(xpart(C)+0.75*unitpx,ypart(D))) shifted (0,k*unitpy) withcolor gris; - endfor; - drawarrow (B+(-0.75*unitpx,0))--(C+(0.75*unitpx,0)); - drawarrow (D+(0,-0.75*unitpy))--(E+(0,0.75*unitpy)); - dotlabel.bot(LATEX("\noexpand\footnotesize\num{"&decimal(#7)&"}"),(unitex,0)); - dotlabel.lft(LATEX("\noexpand\footnotesize\num{"&decimal(#8)&"}"),(0,unitey)); - label.llft(btex 0 etex,A); - % apparition du nom des points ou pas - m_c:=m_c*3; - marque_p:="croix"; - vardef tata(text t)=%on place les points - if #6>0: - n:=1; - k:=0;%pour retenir la coordonn\'ee en x - l:=0;%pour retenir la coordonn\'ee en y - for p_=t: - if (n mod 3)=1: - if numeric p_: - k:=p_; - fi; - fi; - if (n mod 3)=2: - if numeric p_: - l:=p_; - fi; - fi; - if (n mod 3)=0: - if #6>1: - if (k>0) and (l>0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l>0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l=0): - label.urt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l>0): - label.ulft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k=0) and (l<0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l<0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k<0) and (l=0): - label.llft(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - if (k>0) and (l<0): - label.lrt(LATEX(p_),(k*unitpx,l*unitpy)); - fi; - pointe((k*unitpx,l*unitpy)); - fi; - if (#6=1) or (#6=3): - draw (0,l*unitpy)--(k*unitpx,l*unitpy)--(k*unitpx,0) dashed evenly; - fi; - fi; - n:=n+1; - endfor; - fi; - enddef; - vardef Tracage(text t)(text ls)=%on trace les segments - pair A[]; - n:=0;%pour parcourir la liste - m:=0;%pour lister les points par leur nombre - for p_=t: - n:=n+1; - if (n mod 3)=1: - k:=p_; - fi; - if (n mod 3)=2: - l:=p_; - fi; - if (n mod 3)=0: - m:=m+1; - A[m]=(k*unitpx,l*unitpy); - fi; - endfor; - for p_=ls: - draw segment(A[p_ div 10],A[p_ mod 10]); - endfor; - enddef; - tata(#5); - Tracage(#5)(#9); - \end{mpost} - \fi -} - -\def\MPNewDEMIGraduee#1#2{% - % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires - % #2 : liste des noms des points - \ifluatex - \mplibforcehmode - \begin{mplibcode} - maxx:=0; - unitex:=\useKV[ClesReperage]{Unitex}*cm; - pasx:=\useKV[ClesReperage]{Pasx}; - unitp:=unitex/pasx;%unit\'e de d\'eplacement - ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; - ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; - AffichageGrad:=\AffichageGrad; - AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; - AffichageNom:=\AffichageNom; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination de l'abscisse maximale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - endfor; - maxx:=maxx+1; - if maxx<(pasx+1): - maxx:=pasx+1; - fi; - % ----- - pair A,B; - A=(0,0); - B=unitp*(maxx,0); - % On trace la demi-droite - drawarrow A--(B+(0.75*unitp,0)); - % marquage secondaire - marque_s:=marque_s/3; - for k=0 step 2 until (maxx): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - drawoptions(); - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - %% marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - dotlabel.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); - label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A); - if AffichageGrad>0: - for k=2 upto maxx: - dotlabel.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(k)&"}}"),unitex*(k,0)); - endfor; - fi; - %% - vardef tata(text t)= - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - label.top(TEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); - else: - label.top(TEX(p_),unitp*(valeur[n],0)); - fi; - if p_<>"": - pointe(unitp*(valeur[n],0)); - fi; - endfor; - fi; - % On ajoute une paramétrisation possible à chaque point. - if AffichageCoord>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - ACoord:=scantokens(substring(0,1) of p_); - if ACoord=3: - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n]-ValeurOrigine,0)); - elseif ACoord=2: - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - elseif ACoord=1: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - else: - if AffichageCoord=3: - if p_<>"": - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=2: - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=1: - if p_<>"": - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - fi; - fi; - endfor; - fi; - enddef; - %---- - tata(#2); -% clip currentpicture to polygone(u*(-1,-2),((maxx+0.75)*unitp,-2u),((maxx+0.75)*unitp,2u),u*(-1,2)); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom;}] - maxx:=0; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination de l'abscisse maximale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - endfor; - maxx:=maxx+1; - if maxx<(pasx+1): - maxx:=pasx+1; - fi; - % ----- - pair A,B; - A=(0,0); - B=unitp*(maxx,0); - % On trace la demi-droite - drawarrow A--(B+(0.75*unitp,0)); - % marquage secondaire - marque_s:=marque_s/3; - for k=0 step 2 until (maxx): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - drawoptions(); - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - %% marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - dotlabel.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A); - if AffichageGrad>0: - for k=2 upto maxx: - dotlabel.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(k)&"}}"),unitex*(k,0)); - endfor; - fi; - %% - vardef tata(text t)= - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - label.top(LATEX(p_),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - endfor; - fi; - if AffichageCoord=3: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \noexpand\hbox to2em{\noexpand\pointilles[2em]} etex,(unitp*(valeur[n],-1))); - %pointe(unitp*(valeur[n]-ValeurOrigine,0)); - fi; - endfor; - elseif AffichageCoord=2: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine*pasx)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - fi; - endfor; - elseif AffichageCoord=1: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - endfor; - fi; - enddef; - %---- - tata(#2); - clip currentpicture to polygone(u*(-1,-1),((maxx+0.75)*unitp,-u),((maxx+0.75)*unitp,u),u*(-1,1)); - \end{mpost} - \fi -} - -\def\MPNewDROITEGraduee#1#2{% - % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires - % #2 : liste des noms des points - \ifluatex - \mplibforcehmode - \begin{mplibcode} - maxx:=0; - minx:=4000; - unitex:=\useKV[ClesReperage]{Unitex}*cm; - pasx:=\useKV[ClesReperage]{Pasx}; - unitp:=unitex/pasx;%unit\'e de d\'eplacement - ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; - ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; - AffichageGrad:=\AffichageGrad; - AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; - AffichageNom:=\AffichageNom; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination des abscisses maximale et minimale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - if valeur[k]<minx: - minx:=valeur[k]; - fi; - endfor; - maxx:=maxx+(pasx div 2); - minx:=minx-(pasx div 2); - if maxx<(pasx+1): - maxx:=2*pasx-1; - fi; - if minx>(-pasx-1): - minx:=-2*pasx-1; - fi; - if minx<\useKV[ClesReperage]{ValeurMin}: - minx:=\useKV[ClesReperage]{ValeurMin}; - fi; - if maxx>\useKV[ClesReperage]{ValeurMax}: - maxx:=\useKV[ClesReperage]{ValeurMax}; - fi; - % ----- - pair A,B,C; - A=(0,0); - B=unitp*(maxx,0); - C=unitp*(minx,0); - % On trace la demi-droite - drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); - % marquage secondaire - marque_s:=marque_s/3; - labeloffset:=labeloffset*2; - if ((maxx-minx) mod 2)=0: - for k=(minx+1) step 2 until (maxx-1): - draw marquedemidroite(C,B); - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - else: - for k=(minx) step 2 until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - fi; - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-pasx): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - for k=0 step -pasx until (minx+pasx): - draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); - endfor; - % marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - label.bot(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); - label.bot(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A); - if AffichageGrad>0: - for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): - if (k<0) or (k>1): - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% - fi; - endfor; - fi; - vardef tata(text t)=%on place les points - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - label.top(TEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); - else: - label.top(TEX(p_),unitp*(valeur[n],0)); - fi; - if p_<>"": - pointe(unitp*(valeur[n],0)); - fi; - endfor; - fi; - % On ajoute une paramétrisation possible à chaque point. - if AffichageCoord>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - ACoord:=scantokens(substring(0,1) of p_); - if ACoord=3: - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n]-ValeurOrigine,0)); - elseif ACoord=2: - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - elseif ACoord=1: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - else: - if AffichageCoord=3: - if p_<>"": - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \hbox to2em{\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=2: - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=1: - if p_<>"": - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - fi; - fi; - endfor; - fi; - enddef; - %%% - tata(#2); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; pasx:=\useKV[ClesReperage]{Pasx}; unitp:=unitex/pasx; ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; AffichageGrad:=\AffichageGrad; AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; AffichageNom:=\AffichageNom; ValeurMin=\useKV[ClesReperage]{ValeurMin}; ValeurMax=\useKV[ClesReperage]{ValeurMax};}] - maxx:=0; - minx:=4000; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination des abscisses maximale et minimale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - if valeur[k]<minx: - minx:=valeur[k]; - fi; - endfor; - maxx:=maxx+(pasx div 2); - minx:=minx-(pasx div 2); - if maxx<(pasx+1): - maxx:=2*pasx-1; - fi; - if minx>(-pasx-1): - minx:=-2*pasx-1; - fi; - if minx<ValeurMin: - minx:=ValeurMin; - fi; - if maxx>ValeurMax: - maxx:=ValeurMax; - fi; - % ----- - pair A,B,C; - A=(0,0); - B=unitp*(maxx,0); - C=unitp*(minx,0); - % On trace la demi-droite - drawarrow (C+unitp*(-0.75,0))--(B+unitp*(0.75,0)); - % marquage secondaire - marque_s:=marque_s/3; - labeloffset:=labeloffset*2; - if ((maxx-minx) mod 2)=0: - for k=(minx+1) step 2 until (maxx-1): - draw marquedemidroite(C,B); - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - else: - for k=(minx) step 2 until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - fi; - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-pasx): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - for k=0 step -pasx until (minx+pasx): - draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); - endfor; - % marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{"&decimal(ValeurOrigine)&"}"),A); - if AffichageGrad>0: - for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): - if (k<0) or (k>1): - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% - fi; - endfor; - fi; - vardef tata(text t)=%on place les points - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - label.top(LATEX(substring(2,length p_) of p_),unitp*(valeur[n],0)); - else: - label.top(LATEX(p_),unitp*(valeur[n],0)); - fi; - if p_<>"": - pointe(unitp*(valeur[n],0)); - fi; - endfor; - fi; - if AffichageCoord>0: - n:=0; - for p_=t: - n:=n+1; - if substring(1,2) of p_="*": - ACoord:=scantokens(substring(0,1) of p_); - if ACoord=3: - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n]-ValeurOrigine,0)); - elseif ACoord=2: - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - elseif ACoord=1: - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - else: - if AffichageCoord=3: - if p_<>"": - drawarrow (unitp*(valeur[n],-1))--(unitp*(valeur[n],-0.3)); - label.bot(btex \noexpand\hbox to2em{\noexpand\dotfill} etex,(unitp*(valeur[n],-1))); - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=2: - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.bot(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\noexpand\num{"&decimal(pasx)&"}}$"),unitp*(valeur[n],0)); - else: - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - fi; - pointe(unitp*(valeur[n],0)); - fi; - elseif AffichageCoord=1: - if p_<>"": - label.bot(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(valeur[n],0)); - pointe(unitp*(valeur[n],0)); - fi; - fi; - fi; - endfor; - fi; - enddef; - %%% - tata(#2); - \end{mpost} - \fi -}% - -\def\MPThermo#1#2{% - % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires - % #2 : liste des noms des points - \ifluatex - \mplibforcehmode - \begin{mplibcode} - maxx:=0; - minx:=4000; - unitex:=\useKV[ClesReperage]{Unitex}*cm; - pasx:=\useKV[ClesReperage]{Pasx}; - unitp:=unitex/pasx;%unit\'e de d\'eplacement - ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; - ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; - AffichageGrad:=\AffichageGrad; - AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; - AffichageNom:=\AffichageNom; - boolean Kelvin,Farenheit; - Kelvin=\useKV[ClesReperage]{Kelvin}; - Farenheit=\useKV[ClesReperage]{Farenheit}; - color ColMercure; - ColMercure:=\useKV[ClesReperage]{CouleurMercure}; - boolean Mercure; - Mercure=\useKV[ClesReperage]{Mercure}; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination des abscisses maximale et minimale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - if valeur[k]<minx: - minx:=valeur[k]; - fi; - endfor; - maxx:=maxx+(pasx div 2); - minx:=minx-(pasx div 2); - if maxx<(pasx+1): - maxx:=2*pasx-1; - fi; - if minx>(-pasx-1): - minx:=-2*pasx-1; - fi; - if Kelvin: - minx:=0; - fi; - % ----- - pair A,B,C; - A=(0,0); - B=unitp*(0,maxx); - C=unitp*(0,minx); - % On trace la demi-droite - draw ((C+unitp*(0,-0.75))--(B+unitp*(0,0.75))); - % marquage secondaire - marque_s:=marque_s/3; - if pasx<11: - labeloffset:=labeloffset*2; - if ((maxx-minx) mod 2)=0: - for k=(minx+1) step 2 until (maxx-1): - draw marquedemidroite(C,B); - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - else: - for k=(minx) step 2 until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - fi; - fi; - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-pasx): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - for k=0 step -pasx until (minx+pasx): - draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); - endfor; - % marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - if Kelvin: - label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); - label.lft(TEX("\footnotesize\Temp[K]{"&decimal(ValeurOrigine)&"}"),A); - elseif Farenheit: - label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); - label.lft(TEX("\footnotesize\Temp[F]{"&decimal(ValeurOrigine)&"}"),A); - else: - label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurUnitex)&"}"),unitex*(0,1)); - label.lft(TEX("\footnotesize\Temp{"&decimal(ValeurOrigine)&"}"),A); - fi; - if AffichageGrad>0: - for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): - if (k<0) or (k>1): - if Kelvin: - label.lft(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% - elseif Farenheit: - label.lft(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% - else: - label.lft(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(0,k));%%% - fi; - fi; - endfor; - fi; - - vardef Thermo(expr nbt)= - pair Tc[]; - Tc[0]=(5mm,unitp*(minx-1)); - path cc[]; - cc1=cercles(Tc[0],2.5mm); - Tc1=pointarc(cc1,75); - Tc4=pointarc(cc1,105); - Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); - Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); - Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); - Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); - path temp; - temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; - if nbt>0: - fill temp withcolor ColMercure; - trace Tc5--Tc6; - fi; - trace arccercle(Tc4,Tc1,Tc0); - trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; - enddef; - - if Mercure:Thermo(1) else : Thermo(0) fi; - - vardef tata(text t)=%on place les points - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - label.rt(TEX(p_),unitp*(0,valeur[n])); - if p_<>"": - pointe(unitp*(0,valeur[n])); - fi; - endfor; - fi; - if AffichageCoord=3: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); - label.rt(btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); - pointe(unitp*(0,valeur[n]-ValeurOrigine)); - fi; - endfor; - elseif AffichageCoord=2: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.rt(TEX("\footnotesize$\frac{\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); - else: - label.rt(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); - fi; - pointe(unitp*(0,valeur[n]-ValeurOrigine)); - fi; - endfor; - elseif AffichageCoord=1: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - if Kelvin: - label.rt(TEX("\footnotesize\Temp[K]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); - elseif Farenheit: - label.rt(TEX("\footnotesize\Temp[F]{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); - else: - label.rt(TEX("\footnotesize\Temp{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),(5mm,unitp*valeur[n])); - fi; - pointe(unitp*(0,valeur[n])); - draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; - fi; - endfor; - fi; - enddef; - %%% - tata(#2); - \end{mplibcode} - \else - \begin{mpost}[mpsettings={unitex:=\useKV[ClesReperage]{Unitex}*cm; - pasx:=\useKV[ClesReperage]{Pasx}; - unitp:=unitex/pasx;%unit\'e de d\'eplacement - ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; - ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; - AffichageGrad:=\AffichageGrad; - AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; - AffichageNom:=\AffichageNom; - boolean Kelvin,Farenheit; - Kelvin=\useKV[ClesReperage]{Kelvin}; - Farenheit=\useKV[ClesReperage]{Farenheit}; - color ColMercure; - ColMercure:=\useKV[ClesReperage]{CouleurMercure}; - boolean Mercure; - Mercure=\useKV[ClesReperage]{Mercure};}] - maxx:=0; - minx:=4000; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination des abscisses maximale et minimale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - if valeur[k]<minx: - minx:=valeur[k]; - fi; - endfor; - maxx:=maxx+(pasx div 2); - minx:=minx-(pasx div 2); - if maxx<(pasx+1): - maxx:=2*pasx-1; - fi; - if minx>(-pasx-1): - minx:=-2*pasx-1; - fi; - if Kelvin: - minx:=0; - fi; - % ----- - pair A,B,C; - A=(0,0); - B=unitp*(0,maxx); - C=unitp*(0,minx); - % On trace la demi-droite - draw (C+unitp*(0,-0.75))--(B+unitp*(0,0.75)); - % marquage secondaire - marque_s:=marque_s/3; - if pasx<11: - labeloffset:=labeloffset*2; - if ((maxx-minx) mod 2)=0: - for k=(minx+1) step 2 until (maxx-1): - draw marquedemidroite(C,B); - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - else: - for k=(minx) step 2 until (maxx-1): - draw marquesegment((k/maxx)[A,B],((k+1)/maxx)[A,B]); - endfor; - fi; - fi; - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-pasx): - draw marquesegment((k/maxx)[A,B],((k+pasx)/maxx)[A,B]); - endfor; - for k=0 step -pasx until (minx+pasx): - draw marquesegment((k/maxx)[A,B],((k-pasx)/maxx)[A,B]); - endfor; - % marquage des points - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - if Kelvin: - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\kelvin}"),unitex*(0,1)); - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\kelvin}"),A); - elseif Farenheit: - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\farenheit}"),unitex*(0,1)); - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\farenheit}"),A); - else: - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurUnitex)&"}{\celsius}"),unitex*(0,1)); - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{"&decimal(ValeurOrigine)&"}{\celsius}"),A); - fi; - if AffichageGrad>0: - for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): - if (k<0) or (k>1): - if Kelvin: - label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\kelvin}"),unitex*(0,k));%%% - elseif Farenheit: -label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\farenheit}"),unitex*(0,k));%%% - else: -label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}{\celsius}"),unitex*(0,k));%%% - fi; - fi; - endfor; - fi; - - vardef Thermo(expr nbt)= - pair Tc[]; - Tc[0]=(5mm,unitp*(minx-1)); - path cc[]; - cc1=cercles(Tc[0],2.5mm); - Tc1=pointarc(cc1,75); - Tc4=pointarc(cc1,105); - Tc2=(xpart(Tc1),ypart(B+unitp*(0,0.75))); - Tc3=(xpart(Tc4),ypart(B+unitp*(0,0.75))); - Tc5=(xpart(Tc1),ypart(unitp*(0,valeur[1]))); - Tc6=(xpart(Tc4),ypart(unitp*(0,valeur[1]))); - path temp; - temp=Tc1--Tc5--Tc6--Tc4--arccercle(Tc4,Tc1,Tc0)--cycle; - if nbt>0: - fill temp withcolor ColMercure; - trace Tc5--Tc6; - fi; - trace arccercle(Tc4,Tc1,Tc0); - trace Tc1--Tc2--arccercle(Tc2,Tc3,iso(Tc2,Tc3))--Tc4; - enddef; - - if Mercure:Thermo(1) else : Thermo(0) fi; - - vardef tata(text t)=%on place les points - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - label.rt(LATEX(p_),unitp*(0,valeur[n])); - if p_<>"": - pointe(unitp*(0,valeur[n])); - fi; - endfor; - fi; - if AffichageCoord=3: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - drawarrow (unitp*(-1,valeur[n]))--(unitp*(-0.3,valeur[n])); - label.rt(\btex \hbox to2em{\dotfill} etex,(unitp*(-1,valeur[n]))); - pointe(unitp*(0,valeur[n]-ValeurOrigine)); - fi; - endfor; - elseif AffichageCoord=2: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - if ((ValeurUnitex*valeur[n]) mod pasx)<>0: - label.rt(LATEX("\noexpand\footnotesize$\noexpand\frac{\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"}}}{\num{"&decimal(pasx)&"}}$"),unitp*(0,valeur[n])); - else: - label.rt(LATEX("\noexpand\footnotesize\noexpand\num{\noexpand\fpeval{"&decimal(ValeurUnitex)&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}"),unitp*(0,valeur[n])); - fi; - pointe(unitp*(0,valeur[n]-ValeurOrigine)); - fi; - endfor; - elseif AffichageCoord=1: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - if Kelvin: - label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\kelvin}"),(5mm,unitp*valeur[n])); - elseif Farenheit: - label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\farenheit}"),(5mm,unitp*valeur[n])); - else: - label.rt(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-(ValeurOrigine))&"*"&decimal(valeur[n])&"/"&decimal(pasx)&"}}{\celsius}"),(5mm,unitp*valeur[n])); - fi; - pointe(unitp*(0,valeur[n])); - draw (unitp*(0,valeur[n]))--(7.5mm,unitp*valeur[n]) dashed evenly; - fi; - endfor; - fi; - enddef; - %%% - tata(#2); - \end{mpost} - \fi -} - -\def\MPNewDROITEGradueeMulti#1#2{% - % #1 : liste des points \`a placer en pas. pour g\'erer le cas des rep\'erages fractionnaires - % #2 : liste des noms des points - \ifluatex - \mplibforcehmode - \begin{mplibcode} - maxx:=0; - minx:=4000; - unitex:=\useKV[ClesReperage]{Unitex}*cm; - pasx:=\useKV[ClesReperage]{Pasx}; - unitp:=unitex/pasx;%unit\'e de d\'eplacement - ValeurUnitex:=\useKV[ClesReperage]{ValeurUnitex}; - ValeurOrigine:=\useKV[ClesReperage]{ValeurOrigine}; - AffichageGrad:=\AffichageGrad; - AffichageCoord:=\useKV[ClesReperage]{AffichageAbs}; - AffichageNom:=\AffichageNom; - numeric valeur[]; - vardef titi(text t)= - n:=0; - for p_=t: - n:=n+1; - valeur[n]=p_; - endfor; - enddef; - titi(#1); - % Détermination des abscisses maximale et minimale - for k=1 upto n: - if valeur[k]>maxx: - maxx:=valeur[k]; - fi; - if valeur[k]<minx: - minx:=valeur[k]; - fi; - endfor; - maxx:=maxx+(pasx div 2); - minx:=minx-(pasx div 2); - if maxx<(pasx+1): - maxx:=2*pasx-1; - fi; - if minx>(-pasx-1): - minx:=-2*pasx-1; - fi; - if minx<\useKV[ClesReperage]{ValeurMin}: - minx:=\useKV[ClesReperage]{ValeurMin}; - fi; - if maxx>\useKV[ClesReperage]{ValeurMax}: - maxx:=\useKV[ClesReperage]{ValeurMax}; - fi; -% % ----- - pair A[],B[],C[]; - for l=0 upto (\useKV[ClesReperage]{Etages}-1): - A[l]=(0,-l*cm); - B[l]=unitp*(maxx,0)+(0,-l*cm); - C[l]=unitp*(minx,0)+(0,-l*cm); - % On trace la demi-droite - drawarrow (C[l]+unitp*(-0.75,0))--(B[l]+unitp*(0.75,0)); - % marquage secondaire - marque_s:=marque_s/3; - if ((maxx-minx) mod 2)=0: - for k=(minx+1) step 2 until (maxx-1): - draw marquedemidroite(C[l],B[l]); - draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); - endfor; - else: - for k=(minx) step 2 until (maxx-1): - draw marquesegment((k/maxx)[A[l],B[l]],((k+1)/maxx)[A[l],B[l]]); - endfor; - fi; - % marquage primaire - marque_s:=marque_s*3; - for k=0 step pasx until (maxx-pasx): - draw marquesegment((k/maxx)[A[l],B[l]],((k+pasx)/maxx)[A[l],B[l]]); - endfor; - for k=0 step -pasx until (minx+pasx): - draw marquesegment((k/maxx)[A[l],B[l]],((k-pasx)/maxx)[A[l],B[l]]); - endfor; - endfor; - % On trace les zoom - for k=0 upto (\useKV[ClesReperage]{Etages}-2): - lp:=floor(1+uniformdeviate(8)); - draw (lp/10)[A[k],B[k]]--A[k+1] dashed evenly scaled 0.5 withcolor 0.5white; - draw ((lp+1)/10)[A[k],B[k]]--B[k+1] dashed evenly scaled 0.5 withcolor 0.5white; - endfor; - % Labelisation - m_c:=m_c*3; - marque_p:="croix"; - labeloffset:=labeloffset*2; - label.top(TEX("\footnotesize\num{"&decimal(ValeurUnitex)&"}"),unitex*(1,0)); - label.top(TEX("\footnotesize\num{"&decimal(ValeurOrigine)&"}"),A[0]); - if AffichageGrad>0: - for k=((minx+(minx mod pasx)) div pasx) upto (maxx div pasx): - if (k<0) or (k>1): - label.bot(TEX("\footnotesize\num{\fpeval{"&decimal(ValeurOrigine)&"+"&decimal(ValeurUnitex-ValeurOrigine)&"*"&decimal(k)&"}}"),unitex*(k,0));%%% - fi; - endfor; - fi; - labeloffset:=labeloffset/2; - vardef tata(text t)=%on place les points - if AffichageNom>0: - n:=0; - for p_=t: - n:=n+1; - label.top(TEX(p_),unitp*(valeur[n],0)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); - pointe(unitp*(valeur[n],0)); - endfor; - fi; - if AffichageCoord=3: - n:=0; - for p_=t: - n:=n+1; - if p_<>"": - drawarrow (unitp*(valeur[n],-1)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm))--(unitp*(valeur[n],-0.3)+(0,(-\useKV[ClesReperage]{Etages}+1)*cm)); - label.bot(btex \hbox to4em{\dotfill} etex,(unitp*(valeur[n],-1))+(0,(-\useKV[ClesReperage]{Etages}+0.5)*cm)); - %pointe(unitp*(valeur[n],0)); - fi; - endfor; - fi; - enddef; - %%% - tata(#2); - \end{mplibcode} - \fi -} - -% Pour construire les droite/demi-droite gradu\'ee -\def\builddemidroitenew{% - \toklistepointdroite{}% - \toklistenompointdemidroite{}% - \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} - \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} - \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} - \ifboolKV[ClesReperage]{Thermometre}{% - \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% - \xdef\Listedesvaleursaplacersurlademidroite{}% - \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% - % \Listedesvaleursaplacersurlademidroite% - \MPThermo{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% - }{% - \ifboolKV[ClesReperage]{DemiDroite}{% - \xdef\Listedesvaleursaplacersurlademidroite{}% - \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% - \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% - %\Listedesvaleursaplacersurlademidroite% - \MPNewDEMIGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% - }{% - \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% - \xdef\Listedesvaleursaplacersurlademidroite{}% - \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% - %\Listedesvaleursaplacersurlademidroite% - \MPNewDROITEGraduee{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% - }% - }% -}% - -\NewDocumentCommand\Reperage{o m}{% - \useKVdefault[ClesReperage]% - \setKV[ClesReperage]{#1}% - \ifboolKV[ClesReperage]{Espace}{% - \setKV[ClesReperage]{Unitex=2,Unitey=2.5,Unitez=1.5}% - \ifboolKV[ClesReperage]{Sphere}{\setKV[ClesReperage]{EchelleEspace=75}}{}% - \setKV[ClesReperage]{#1}% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListePointEspace{#2}% - \buildespace% - }{\ifboolKV[ClesReperage]{Plan}{% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListePointRepere{#2}% - \buildreperenew% - }{% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListePointDroite{#2}% - \builddemidroitenew% - }% - }% -}% - -\NewDocumentCommand\ReperageMulti{o m}{% - \useKVdefault[ClesReperage]% - \setKV[ClesReperage]{#1}% - \setsepchar[*]{,*/}\ignoreemptyitems% - \readlist*\ListePointDroite{#2}% - \toklistepointdroite{}% - \toklistenompointdemidroite{}% - \xdef\AffichageNom{0}\ifboolKV[ClesReperage]{AffichageNom}{\xdef\AffichageNom{1}}{} - \xdef\AffichageCoord{\useKV[ClesReperage]{AffichageAbs}} - \xdef\AffichageGrad{0}\ifboolKV[ClesReperage]{AffichageGrad}{\xdef\AffichageGrad{1}}{} - \foreachitem\compteur\in\ListePointDroite{\expandafter\Updatetoksdemidroite\compteur\nil}% - \xdef\Listedesvaleursaplacersurlademidroite{}% - \foreachitem\compteur\in\ListePointDroite{\xdef\Listedesvaleursaplacersurlademidroite{\Listedesvaleursaplacersurlademidroite,\ListePointDroite[\compteurcnt,1]}}% - \MPNewDROITEGradueeMulti{\Listedesvaleursaplacersurlademidroite}{\the\toklistenompointdemidroite}% - \setsepchar{,}% -}% +\input{PfCDecDeci} +\input{PfCKakurasu} +\input{PfCMidpoint} +\input{PfCGrades} +\input{PfCSquaro} +\input{PfCGaram} +\input{PfCFutoshiki} +\input{PfCRondeInfernale} +\input{PfCHiddenMessage} +\input{PfCPuzzleSommePyramide} +\input{PfCCalisson} +\input{PfCTectonic} +\input{PfCEnigmeAire} +\input{PfCBarresCalculs} +\input{PfCSolides} +\input{PfCVueCubes} +\input{PfCRLE} +\input{PfCEngrenagesBase} +\input{PfCTortueBase} +\input{PfCCompteBon} +\input{PfCNombreAstral} +\input{PfCMentalo} +\input{PfCCalculsCroises} +\input{PfCShikaku} +\input{PfCKakuro} +\input{PfCKenKen} +\input{PfCPixelArt} +\input{PfCYohaku} +\input{PfCRose} +\input{PfCPuissanceQuatre} +\input{PfCBillard} +\input{PfCRepresenterEntier} +\input{PfCCAN} +\input{PfCFrise} +\input{PfCGeometrie} +\input{PfCEnquete} +\input{PfCModeleBarre} +\input{PfCFicheMemo} +\input{PfCOperationsTrou} +\input{PfCCartographie} +\input{PfCReseauxSociaux} +\input{PfCBonSortie} +\input{PfCEcritureLettres} +\input{PfCDecompFracDeci} +\input{PfCPyramideCalculs} +\input{PfCTablesOperations} +\input{PfCDefiTables} +\input{PfCRangementNombres} +\input{PfCMotsCodes} +\input{PfCLabyrintheJeu} +\input{PfCTriominos} +\input{PfCLabyrintheNombre} +\input{PfCMotsCroises} +\input{PfCMotsEmpiles} +\input{PfCColorilude} +\input{PfCMosaique} +\input{PfCQuiSuisJe} +\input{PfCDessinGradue} +\input{PfCAutonomie} +\input{PfCCalculatrice} +\input{PfCQuestionsFlash} +\input{PfCRapido} +\input{PfCRepresenterFraction} +\input{PfCQuestionsRelier} +\input{PfCEcrireunQCM} +\input{PfCSommeAngles} +\input{PfCPythagore} +\input{PfCDistributivite} +\input{PfCDecomposerNombrePremier} +\input{PfCSimplifierFraction} +\input{PfCThales} +\input{PfCTrigonometrie} +\input{PfCStatistiques} +\input{PfCDiagrammeRadar} +\input{PfCBarreNiveaux} +\input{PfCResoudreEquation} +\input{PfCPropor} +\input{PfCPourcentage} +\input{PfCDessinerRatio} +\input{PfCCartesMentales} +\input{PfCProprietesDroites} +\input{PfCFonctionAffine} +\input{PfCNotionFonction} +\input{PfCRepresentationGraphique} +\input{PfCRappelsFormules} +\input{PfCProbabilites} +\input{PfCReperage} %%% % Puissances @@ -26937,3075 +667,11 @@ label.lft(LATEX("\noexpand\footnotesize\noexpand\SI{\noexpand\fpeval{"&decimal(V }% } -%%% -% Ecritures d'unit\'es -%%% -\setKVdefault[Unites]{m=false,km=false,hm=false,ha=false,dam=false,a=false,dm=false,cm=true,mm=false,um=false,nm=false,g=true,t=false,q=false,kg=false,hg=false,dag=false,dg=false,cg=false,mg=false,ug=false,ng=false,mmin=false,kmh=true,kms=false,ms=false,mh=false,kgm=false,gcm=true,L=true,kL=false,hL=false,daL=false,dL=false,cL=false,mL=false,l=true,kl=false,hl=false,dal=false,dl=false,cl=false,ml=false,Go=true,Mo=false,ko=false,To=false,o=false,kWh=true,C=true,K=false,F=false} - -%D'apres https://tex.stackexchange.com/questions/38905/time-of-the-day-or-time-period-using-the-package-siunitx -\ExplSyntaxOn -\NewDocumentCommand \Temps { o > { \SplitArgument { 5 } { ; } } m } -{% - \group_begin:% - \IfNoValueF{#1} - { \keys_set:nn { siunitx } {#1} } - \siunitx_hms_output:nnn #2 - \group_end: -} -\cs_new_protected:Npn \siunitx_hms_output:nnn #1#2#3#4#5#6 -{% - \IfNoValueF {#1}% - {% - \tl_if_blank:nF {#1}% - {% - \SI{#1}{\annee\xintifboolexpr{#1>1}{s}{}}% - \IfNoValueF {#2}{~}% - }% - }% - \IfNoValueF {#2}% - {% - \tl_if_blank:nF {#2}% - {% - \SI{#2}{\mois}% - \IfNoValueF{#3}{~}% - }% - }% - \IfNoValueF {#3}% - {% - \tl_if_blank:nF {#3}% - {% - \SI{#3}{\jour}% - \IfNoValueF{#4}{~}% - }% - }% - \IfNoValueF {#4}% - {% - \tl_if_blank:nF {#4}% - {% - \SI{#4}{\hour}% - \IfNoValueF{#5}{~}% - }% - }% - \IfNoValueF {#5}% - {% - \tl_if_blank:nF {#5}% - {% - \SI[minimum-integer-digits=2]{#5}{\minute}% - \IfNoValueF{#6}{~}% - }% - }% - \IfNoValueF {#6}% - {% - \tl_if_blank:nF {#6} {\SI{#6}{\second}}}% -}% -\ExplSyntaxOff - -\newcommand\Temp[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{F}{% - \SI{#2}{\fahrenheit}% - }{% - \ifboolKV[Unites]{K}{% - \SI{#2}{\kelvin}% - }{% - \SI{#2}{\celsius}% - }% - }% -}% - -\newcommand\Conso[2][]{% - \SI{#2}{\kWh}% -} - -\newcommand\Prix[2][2]{% - \SI[round-mode=places,round-precision=#1]{#2}{\EuRo}% -} - -\newcommand\Octet[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{o}{% - \SI{#2}{\octet}% - }{% - \ifboolKV[Unites]{ko}{% - \SI{#2}{\kilo\octet}% - }{\ifboolKV[Unites]{Mo}{% - \SI{#2}{\mega\octet}% - }{\ifboolKV[Unites]{To}{% - \SI{#2}{\tera\octet}% - }{% - \SI{#2}{\giga\octet}% - }% - }% - }% - }% -}% - -\NewDocumentCommand\Lg{o m}{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{nm}{% - \SI{#2}{\nm}% - }{\ifboolKV[Unites]{um}{% - \SI{#2}{\um}% - }{\ifboolKV[Unites]{km}{% - \SI{#2}{\km}% - }{\ifboolKV[Unites]{hm}{% - \SI{#2}{\hecto\metre}% - }{\ifboolKV[Unites]{dam}{% - \SI{#2}{\deca\metre}% - }{\ifboolKV[Unites]{dm}{% - \SI{#2}{\dm}% - }{\ifboolKV[Unites]{m}{% - \SI{#2}{\m}% - }{\ifboolKV[Unites]{mm}{% - \SI{#2}{\mm}% - }{\SI{#2}{\cm}% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -\NewDocumentCommand\Masse{o m}{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{ng}{% - \SI{#2}{\ng}% - }{\ifboolKV[Unites]{ug}{% - \SI{#2}{\ug}% - }{\ifboolKV[Unites]{t}{% - \SI{#2}{\tonne}% - }{\ifboolKV[Unites]{q}{% - \SI{#2}{\quintal}% - }{% - \ifboolKV[Unites]{kg}{% - \SI{#2}{\kg}% - }{\ifboolKV[Unites]{hg}{% - \SI{#2}{\hecto\gram}% - }{\ifboolKV[Unites]{dag}{% - \SI{#2}{\deca\gram}% - }{\ifboolKV[Unites]{dg}{% - \SI{#2}{\deci\gram}% - }{\ifboolKV[Unites]{cg}{% - \SI{#2}{\centi\gram}% - }{\ifboolKV[Unites]{mg}{% - \SI{#2}{\milli\gram}% - }{\SI{#2}{\gram}% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -\NewDocumentCommand\Capa{o m}{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{kL}{% - \SI{#2}{\kilo\liter}% - }{\ifboolKV[Unites]{hL}{% - \SI{#2}{\hecto\liter}% - }{\ifboolKV[Unites]{daL}{% - \SI{#2}{\deca\liter}% - }{\ifboolKV[Unites]{dL}{% - \SI{#2}{\deci\liter}% - }{\ifboolKV[Unites]{cL}{% - \SI{#2}{\centi\liter}% - }{\ifboolKV[Unites]{mL}{% - \SI{#2}{\milli\liter}% - }{\SI{#2}{\liter}% - }% - }% - }% - }% - }% - }% -}% - -\newcommand\Aire[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{km}{% - \SI{#2}{\square\km}% - }{\ifboolKV[Unites]{hm}{% - \SI{#2}{\square\hecto\metre}% - }{\ifboolKV[Unites]{ha}{% - \SI{#2}{\hectare}% - }{\ifboolKV[Unites]{dam}{% - \SI{#2}{\square\deca\metre}% - }{\ifboolKV[Unites]{a}{% - \SI{#2}{\are}% - }{\ifboolKV[Unites]{dm}{% - \SI{#2}{\square\dm}% - }{\ifboolKV[Unites]{m}{% - \SI{#2}{\square\metre}% - }{\ifboolKV[Unites]{mm}{% - \SI{#2}{\square\mm}% - }{\SI{#2}{\square\cm}% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -\newcommand\Vol[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{km}{% - \SI{#2}{\cubic\km}% - }{\ifboolKV[Unites]{hm}{% - \SI{#2}{\cubic\hecto\metre}% - }{\ifboolKV[Unites]{dam}{% - \SI{#2}{\cubic\deca\metre}% - }{\ifboolKV[Unites]{dm}{% - \SI{#2}{\cubic\dm}% - }{\ifboolKV[Unites]{m}{% - \SI{#2}{\cubic\metre}% - }{\ifboolKV[Unites]{mm}{% - \SI{#2}{\cubic\mm}% - }{\SI{#2}{\cubic\cm}% - }% - }% - }% - }% - }% - }% -}% - -\newcommand\Vitesse[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{mmin}{% - \SI[per-mode=symbol]{#2}{\meter\per\minute}% - }{% - \ifboolKV[Unites]{mh}{% - \SI[per-mode=symbol]{#2}{\meter\per\hour}% - }{% - \ifboolKV[Unites]{ms}{% - \SI[per-mode=symbol]{#2}{\meter\per\second}% - }{% - \ifboolKV[Unites]{kms}{% - \SI[per-mode=symbol]{#2}{\kilo\meter\per\second}% - }{% - \SI[per-mode=symbol]{#2}{\kilo\meter\per\hour}% - }% - }% - }% - }% -}% - -\newcommand\MasseVol[2][]{% - \useKVdefault[Unites]% - \setKV[Unites]{#1}% - \ifboolKV[Unites]{kgm}{% - \SI[per-mode=symbol]{#2}{\kilo\gram\per\cubic\metre}% - }{% - \SI[per-mode=symbol]{#2}{\gram\per\cubic\centi\metre}% - }% -}% - -%%% -% Tableaux d'unit\'es -%%% -\setKVdefault[ClesTableaux]{Virgule=true,Incline=false,Entiers=false,Decimaux=false,Milliards=false,Millions=false,Micro=false,Nano=false,Partie=false,CouleurG=gray!15,CouleurM=gray!15,Couleurm=gray!15,Couleuru=gray!15,Couleurd=gray!15,Classes=false,Nombres=false,Puissances=false,NbLignes=2,Metre=false,Are=false,Capacite=false,Carre=false,Cube=false,Litre=false,Gramme=false,Fleches=false,FlechesB=false,FlechesH=false,Colonnes=false,Prefixes=false,Escalier=false,Taille=5,Largeur=4.75em,Nom=PfCTableau,CodeAfter={},PuissancesSeules=false,Colonne=-1,Octet=false} - -\newcommand\PfCTBstrut{\rule[-1.2ex]{0pt}{3.8ex}}% Top and Bottom strut -\newcommand\PfCTstrut{\rule{0pt}{3.8ex}}% Top strut -\newcommand\PfCBstrut{\rule[-1.2ex]{0pt}{0ex}}% Bottom strut - -\newlength\PfCTableauPuissances% - -\newcommand\Tableau[2][]{% - \useKVdefault[ClesTableaux]% - \setKV[ClesTableaux]{#1}% - \ifboolKV[ClesTableaux]{Escalier}{% - \ifboolKV[ClesTableaux]{Metre}{% - \xdef\PfCTableauUnite{\meter}% - \xdef\PfCCoefConversion{10}% - }{}% - \ifboolKV[ClesTableaux]{Carre}{% - \xdef\PfCTableauUnite{\square\meter}% - \xdef\PfCCoefConversion{100}% - }{}% - \ifboolKV[ClesTableaux]{Cube}{% - \xdef\PfCTableauUnite{\cubic\meter}% - \xdef\PfCCoefConversion{1000}% - }{}% - \ifboolKV[ClesTableaux]{Gramme}{% - \xdef\PfCTableauUnite{\gram}% - \xdef\PfCCoefConversion{10}% - }{}% - \PfCTableauIncline% - }{% - % - %%% Clé Octet - % - \ifboolKV[ClesTableaux]{Octet}{% - \[\renewcommand{\arraystretch}{1.15}% - \setlength{\tabcolsep}{0.275\tabcolsep}% - \xdef\DecalageLigne{0} - \begin{NiceTabular}{*{5}{wc{15pt}wc{15pt}wc{15pt}}} - \Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}\\ - \hline - \ifboolKV[ClesTableaux]{Classes}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\Block[borders={left,top,right}]{1-3}{téraoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{gigaoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mégaoctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{kilooctet\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{octet\PfCTBstrut}&&\\ - \hline - }{}% - \Block[borders={left,top,right}]{1-3}{To\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{Go\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{Mo\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{ko\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{o\PfCTBstrut}&&\\ - \hline - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&&&&&&&&&&\\ - }% - \Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw (3-|\fpeval{3*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); - }% - \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \tikz\draw[gray!50] (3-|\fpeval{3*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); - \tikz\draw[gray!50] (3-|\fpeval{3*##1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); - }% - }{}% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% - }% - }% - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{4}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2.5+3*(##1-1)}) to node[above, midway]{\small$\times\num{1000}$}(1.5-|\fpeval{2.5+3*##1});% - }% - }{}% - \ifboolKV[ClesTableaux]{Classes}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{4}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*##1}) to node[below,midway]{\small$\div\num{1000}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*(##1-1)});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular} - \]% - }{}% - % - %%% Cl\'e Prefixes - % - \ifboolKV[ClesTableaux]{Prefixes}{% - \xdef\DecalageLigne{0}% - \setlength{\tabcolsep}{0.01\tabcolsep}% - \begin{center}% - % - %%% Definition du tableau - % - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% - \ifboolKV[ClesTableaux]{Nano}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+6}}}{\ifboolKV[ClesTableaux]{Micro}{\xdef\PfCDerniereColonne{\fpeval{\PfCDerniereColonne+3}}}{}} - \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{m{3.25em}}>{\columncolor{gray!15}}{c}*{% - \ifboolKV[ClesTableaux]{Micro}{6}{% - \ifboolKV[ClesTableaux]{Nano}{9}{3}% - }}% - {m{3.25em}}}% - % - %%% Prise en compte de la cl\'e Partie - % - \ifboolKV[ClesTableaux]{Partie}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \Block[]{1-% - \ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - &&&% - }{% - }}% - &&&&& - &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[]{1-% - \ifboolKV[ClesTableaux]{Micro}{6}{% - \ifboolKV[ClesTableaux]{Nano}{9}{3}% - }}{\bfseries Partie d\'ecimale} - &&% - \ifboolKV[ClesTableaux]{Micro}{&&&}{% - \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% - }% - \\ - }{}% - % - %%% Prise en compte de la cl\'e Classes - % - \ifboolKV[ClesTableaux]{Classes}{% - %\hline - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} - \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} - \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% - &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& - &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[draw]{1-% - \ifboolKV[ClesTableaux]{Micro}{6}{% - \ifboolKV[ClesTableaux]{Nano}{9}{3}% - }}{} - &&% - \ifboolKV[ClesTableaux]{Micro}{&&&}{% - \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% - }% - \\ - }{}% - % - %%% Valeurs par d\'efaut - % - \hline% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont giga}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont m\'ega}% - &\Block[borders={right}]{}{}% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% - &\Block[]{}{\fontsize{8}{8}\selectfont m\'ega}% - &% - }{% - }}% - \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont kilo}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont hecto}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont d\'eca}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont unit\'es}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont deci}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont centi}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont milli}% - \ifboolKV[ClesTableaux]{Micro}{&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}\\}{% - \ifboolKV[ClesTableaux]{Nano}{&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont micro}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{8}{8}\selectfont nano}\\}{\\}% - }% - % - %%% Prise en compte de la cl\'e Nombres - % - \ifboolKV[ClesTableaux]{Nombres}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{} - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{} - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% - \ifboolKV[ClesTableaux]{Micro}{% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}% - }{% - \ifboolKV[ClesTableaux]{Nano}{% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0001} ou $\dfrac{\strut1}{\strut\num{10000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00001} ou $\dfrac{\strut1}{\strut\num{100000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000001} ou $\dfrac{\strut1}{\strut\num{1000000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,0000001} ou $\dfrac{\strut1}{\strut\num{10000000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,00000001} ou $\dfrac{\strut1}{\strut\num{100000000}}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,000000001} ou $\dfrac{\strut1}{\strut\num{1000000000}}$}% - }{}% - }{}\\% - }{}% - %%% Prise en compte de la cl\'e Puissances - \ifboolKV[ClesTableaux]{Puissances}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{}&% - \Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &\Block[borders={right}]{}{}% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{}&% - \Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &% - }{% - }}% - \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}% - \ifboolKV[ClesTableaux]{Micro}{&% - \Block[borders={right}]{}{}&% - \Block[borders={right}]{}{}& - \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}}{% - \ifboolKV[ClesTableaux]{Nano}{&% - \Block[borders={right}]{}{}&% - \Block[borders={right}]{}{}&% - \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-6}$}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-9}$}}{}% - }% - \\% - }{}% - % - %%% Lignes vierges - % - \hline% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - &&&% - }{% - }}% - &&&&&&,&&&% - \ifboolKV[ClesTableaux]{Micro}{&&&}{% - \ifboolKV[ClesTableaux]{Nano}{&&&&&&}{}% - }% - \\}% - \CodeAfter% - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% - \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% - }% - %% On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% - \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}% - \setsepchar[*]{,*.}% - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% - }% - \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% - }% - }% - \fi% - \end{NiceTabular}% - \end{center}% - \setlength{\tabcolsep}{100\tabcolsep}% - }{}% - % - %%% Puissances seules - % - \ifboolKV[ClesTableaux]{PuissancesSeules}{% - \setlength{\PfCTableauPuissances}{3em}% - \xdef\DecalageLigne{0}% - \setlength{\tabcolsep}{0.01\tabcolsep}% - \begin{center}% - % - %%% Definition du tableau - % - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% - \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{m{\PfCTableauPuissances}}>{\columncolor{gray!15}}{c}*{3}{m{\PfCTableauPuissances}}}% - \CodeBefore - \xintifboolexpr{\useKV[ClesTableaux]{Colonne}>0}{% - \tikz\fill[gray!15] (1-|\fpeval{\useKV[ClesTableaux]{Colonne}}) rectangle (last-|\fpeval{\useKV[ClesTableaux]{Colonne}+1}); - }{} - \Body - \hline - % - %%% Prise en compte de la cl\'e Partie -% % -% \ifboolKV[ClesTableaux]{Partie}{% -% \Block[]{1-% -% \ifboolKV[ClesTableaux]{Milliards}{12}{% -% \ifboolKV[ClesTableaux]{Millions}{9}{6}% -% }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% -% &&&&&&% -% }{% -% \ifboolKV[ClesTableaux]{Millions}{% -% &&&% -% }{% -% }}% -% &&&&&% -% &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%% -% &\Block[]{1-3}{\bfseries Partie d\'ecimale}% -% &&\\ -% }{}% -% % -% %%% Prise en compte de la cl\'e Classes -% % -% \ifboolKV[ClesTableaux]{Classes}{% -% \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% -% \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% -% \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% -% &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& -% &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% -% &\Block[draw]{1-3}{}&&% -% \\ -% }{}% - % - %%% Valeurs ci-dessous par d\'efaut - % - %Affichage ou pas des noms ? -% \hline -% \ifboolKV[ClesTableaux]{Milliards}{% -% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% -% &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% -% & -% }{}% -% \ifboolKV[ClesTableaux]{Millions}{% -% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% -% &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% -% & -% }{}% -% \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}% -% &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}% -% &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\ -% % - %%% Prise en compte de la cl\'e Nombres - % - \ifboolKV[ClesTableaux]{Nombres}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{}% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% - \\ - }{}% - %%% Prise en compte de la cl\'e Puissances - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{11}$}&% - \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{10}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{9}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}% - &% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{8}$}&% - \Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{7}$}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont $10^{6}$}% - &% - }{% - }}% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont $10^{5}$} - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^{4}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $10^3$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d2}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{d1}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^0$}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-1}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-2}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\num{10}^{-3}$}% - \\% - %%% Lignes vierges - \hline% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - &&&}{}% - &&&&&&\ifboolKV[ClesTableaux]{Virgule}{,}{\phantom{,}}&&&\\}% - \CodeAfter% - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% - \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/}% - \readlist*\ListeNombreAPlacer{#2}% - \setsepchar{,}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+1.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - } - \fi% - \end{NiceTabular}% - \end{center}% - \setlength{\tabcolsep}{100\tabcolsep}% - }{}% - % - %%% Cl\'e Entiers - % - \ifboolKV[ClesTableaux]{Entiers}{% - \xdef\DecalageLigne{0}% - \xdef\TailleFonte{\useKV[ClesTableaux]{Taille}}% - \setlength{\tabcolsep}{0.01\tabcolsep}% - \begin{center}% - % - %%% Definition du tableau - % - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{10}}{\xdef\PfCDerniereColonne{7}}}% - \begin{NiceTabular}{*{% - \ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }% - }{m{\useKV[ClesTableaux]{Largeur}}}}% - \ifboolKV[ClesTableaux]{Classes}{% - \hline - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&% - }{} - \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{} - \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% - &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&&\\}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[]{}{}&\Block[]{}{}&\Block[]{}{}&}{}% - \Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{}\\ - }%ok - \hline - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[draw]{}{\fontsize{\TailleFonte}{\TailleFonte}\selectfont centaines de milliards}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% - & - }{} - \ifboolKV[ClesTableaux]{Millions}{% - \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de millions}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de millions}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% - & - }{} - \Block[draw]{}{\fontsize{5}{5}\selectfont centaines de milliers}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont centaines}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont dizaines}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont unit\'es}\\% - \ifboolKV[ClesTableaux]{Nombres}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}% - &% - }{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000000}}% - &% - }{}% - \Block[draw]{}{\fontsize{5}{5}\selectfont\num{100000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1000}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{100}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{10}}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont\num{1}}% - \\ - }{}% - % - %%% Prise en compte de la cl\'e Puissances - % - \ifboolKV[ClesTableaux]{Puissances}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - &% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% - &% - &% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - &% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &% - }{% - }}% - &% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times10^3$}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% - &\Block[draw]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% - \\% - }{}% - % - %%% Lignes vierges - % - \hline% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - &&&}{}% - &&&&&\\}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[]{}{\tikz[remember picture,overlay]{\coordinate (L1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (K1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (J1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[]{}{\tikz[remember picture,overlay]{\coordinate (I1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (H1);}}&\Block[]{}{\tikz[remember picture,overlay]{\coordinate (G1);}}&}{}% - \Block[]{}{\tikz[remember picture,overlay]{\coordinate (F1);}} - &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (E1);}} - &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (D1);}} - &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (C1);}} - &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (B1);}} - &\Block[]{}{\tikz[remember picture,overlay]{\coordinate (A1);}}\\ - \CodeAfter% - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{\PfCDerniereColonne}}\do{% - \tikz\draw (\fpeval{\DecalageLigne+1}-|##1)--(\fpeval{\DecalageLigne+1+\useKV[ClesTableaux]{NbLignes}+1}-|##1);% - }% - %% On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar{,}% - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% - \StrLen{\ListeNombreAPlacer[##2]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonne-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2]}{##1}{##1}};% - }% - }% - \fi% - % On trace les éventuelles fleches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}%% - \ifboolKV[ClesTableaux]{Classes}{}{% - \ifboolKV[ClesTableaux]{FlechesB}{% - \ifboolKV[ClesTableaux]{Milliards}{% - \xintFor* ##1 in {\xintSeq{1}{11}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% - }% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% - }% - }{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{1.5+##1}) to node[below, midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{0.5+##1});% - }% - }% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \ifboolKV[ClesTableaux]{Milliards}{% - \xintFor* ##1 in {\xintSeq{1}{11}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }% - }% - }{}% - }% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular}% - \end{center}% - \setlength{\tabcolsep}{100\tabcolsep}% - }{}% - % - %%% Cl\'e Decimaux - % - \ifboolKV[ClesTableaux]{Decimaux}{% - \xdef\DecalageLigne{0}% - \setlength{\tabcolsep}{0.01\tabcolsep}% - \begin{center}% - % - %%% Definition du tableau - % - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{16}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{13}}{\xdef\PfCDerniereColonne{10}}}% - \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{m{4.75em}}>{\columncolor{gray!15}}{c}*{3}{m{4.75em}}}% - % - %%% Prise en compte de la cl\'e Partie - % - \ifboolKV[ClesTableaux]{Partie}{% - \Block[]{1-% - \ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{\bfseries Partie enti\`ere}\ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - &&&% - }{% - }}% - &&&&&% - &\Block[fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}\xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}%% - &\Block[]{1-3}{\bfseries Partie d\'ecimale}% - &&\\ - }{}% - % - %%% Prise en compte de la cl\'e Classes - % - \ifboolKV[ClesTableaux]{Classes}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}\ifboolKV[ClesTableaux]{Milliards}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurG}}]{1-3}{Classe des milliards}&&&\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{\Block[draw,fill={\useKV[ClesTableaux]{CouleurM}}]{1-3}{Classe des millions}&&&}{}% - \Block[draw,fill={\useKV[ClesTableaux]{Couleurm}}]{1-3}{Classe des milliers}&&% - &\Block[draw,fill={\useKV[ClesTableaux]{Couleuru}}]{1-3}{Classe des unités}&& - &\Block[draw,fill=gray!15]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[draw]{1-3}{}&&% - \\ - }{}% - % - %%% Valeurs ci-dessous par d\'efaut - % - \hline - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliards}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliards}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliards}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% - &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% - & - }{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de millions}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de millions}% - &\Block[]{}{\fontsize{5}{5}\selectfont unit\'es de millions}% - & - }{}% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont centaines de milliers}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines de milliers}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es de milliers}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centaines}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dizaines}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont unit\'es}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont dixi\`emes}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont centi\`emes}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont milli\`emes}\\ - % - %%% Prise en compte de la cl\'e Nombres - % - \ifboolKV[ClesTableaux]{Nombres}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont\num{100000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{10000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont\num{1000000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{}% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000000}}% - &\Block[borders={}]{}{\fontsize{5}{5}\selectfont \num{1000000}}% - &% - }{}% - \Block[borders={left,right}]{}{\fontsize{5}{5}\selectfont \num{100000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1000}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{100}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{10}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{1}}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,1} ou $\dfrac{\strut1}{\strut10}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,01} ou $\dfrac{\strut1}{\strut100}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont \num{0,001} ou $\dfrac{\strut1}{\strut\num{1000}}$}% - \\ - }{}% - % - %%% Prise en compte de la cl\'e Puissances - % - \ifboolKV[ClesTableaux]{Puissances}{% - \xdef\DecalageLigne{\fpeval{\DecalageLigne+1}}% - \ifboolKV[ClesTableaux]{Milliards}{% - \Block[borders={left,right}]{}{}&% - \Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{9}$}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &\Block[borders={right}]{}{}% - }{% - \ifboolKV[ClesTableaux]{Millions}{% - \Block[borders={left,right}]{}{}&% - \Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^{6}$}% - &% - }{% - }}% - \Block[borders={left,right}]{}{}&\Block[borders={right}]{}{}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times10^3$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^2$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^1$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{1}$}% - &\Block[borders={right}]{}{\ifboolKV[ClesTableaux]{Virgule}{,}{}}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-1}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-2}$}% - &\Block[borders={right}]{}{\fontsize{5}{5}\selectfont $\times\num{10}^{-3}$}% - \\% - }{}% - % - %%% Lignes vierges - % - \hline% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - &&&}{}% - &&&&&&,&&&\\}% - \CodeAfter% - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{\fpeval{\PfCDerniereColonne+1}}}\do{% - \tikz\draw (\fpeval{\DecalageLigne+2}-|##1)--(\fpeval{\DecalageLigne+2+\useKV[ClesTableaux]{NbLignes}}-|##1);% - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% - \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+2}}% - \setsepchar[*]{,*.}% - \ignoreemptyitems% - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% - }% - \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% - \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+1.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% - }% - }% - }% - \fi% - \end{NiceTabular}% - \end{center}% - \setlength{\tabcolsep}{100\tabcolsep}% - }{}% - % Décimal version inclinée - \ifboolKV[ClesTableaux]{Incline}{% - \colorlet{PfCCouleurd}{\useKV[ClesTableaux]{Couleurd}}% - \xdef\DecalageLigne{0}% - \setlength{\tabcolsep}{0.01\tabcolsep}% - \begin{center}% - % - %%% Definition du tableau - % - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonne{17}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonne{14}}{\xdef\PfCDerniereColonne{11}}}% - \begin{NiceTabular}{*{\ifboolKV[ClesTableaux]{Milliards}{12}{% - \ifboolKV[ClesTableaux]{Millions}{9}{6}% - }}{wc{1cm}}*{5}{wc{1cm}}}% - % - \CodeBefore% - \ifboolKV[ClesTableaux]{Milliards}{% - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurG}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!50] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!40] (14|-5)--(15|-1)--(16|-1)--(15|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!30] (15|-5)--(16|-1)--(17|-1)--(16|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!20] (16|-5)--(17|-1)--(18|-1)--(17|-5)--cycle; - }{\ifboolKV[ClesTableaux]{Millions}{% - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{CouleurM}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!50] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!40] (11|-5)--(12|-1)--(13|-1)--(12|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!30] (12|-5)--(13|-1)--(14|-1)--(13|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!20] (13|-5)--(14|-1)--(15|-1)--(14|-5)--cycle; - }{% - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (1|-5)--(2|-1)--(3|-1)--(2|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (2|-5)--(3|-1)--(4|-1)--(3|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleurm}}] (3|-5)--(4|-1)--(5|-1)--(4|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (4|-5)--(5|-1)--(6|-1)--(5|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (5|-5)--(6|-1)--(7|-1)--(6|-5)--cycle; - \tikz\draw[draw=black,fill={\useKV[ClesTableaux]{Couleuru}}] (6|-5)--(7|-1)--(8|-1)--(7|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!50] (7|-5)--(8|-1)--(9|-1)--(8|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!40] (8|-5)--(9|-1)--(10|-1)--(9|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!30] (9|-5)--(10|-1)--(11|-1)--(10|-5)--cycle; - \tikz\draw[draw=black,fill=PfCCouleurd!20] (10|-5)--(11|-1)--(12|-1)--(11|-5)--cycle; - }% - }% - \Body - %% Pour décaler et laisser la place nécessaire - \xintFor* ##1 in {\xintSeq{1}{4}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - &&&}{}% - &&&&&&&&&&\\}% - %%% Lignes vierges - % - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - \ifboolKV[ClesTableaux]{Milliards}{% - &&&&&&}{}% - \ifboolKV[ClesTableaux]{Millions}{% - &&&}{}% - &&&&&&&&&&\\}% - \CodeAfter%% - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{2}{\fpeval{\PfCDerniereColonne-1}}}\do{% - \tikz\draw[dashed] (\fpeval{\DecalageLigne+5}-|##1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|##1);% - }% - \tikz\draw (\fpeval{\DecalageLigne+5}-|1)--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|1);% - \tikz\draw (\fpeval{\DecalageLigne+5}-|\fpeval{\PfCDerniereColonne})--(\fpeval{\DecalageLigne+5+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{\PfCDerniereColonne});% - %% On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \ifboolKV[ClesTableaux]{Milliards}{\xdef\PfCDerniereColonneEntiere{13}}{\ifboolKV[ClesTableaux]{Millions}{\xdef\PfCDerniereColonneEntiere{10}}{\xdef\PfCDerniereColonneEntiere{7}}}% - \xdef\PfCPremiereColonneDecimale{\fpeval{\PfCDerniereColonneEntiere+1}}% - \setsepchar[*]{,*.}% - \ignoreemptyitems% - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{% - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {\TabLongueurNombre}{1}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}};% - }% - \StrLen{\ListeNombreAPlacer[##2,2]}[\TabLongueurNombre]% - \xintifboolexpr{\ListeNombreAPlacer[##2,2]==0}{}{% - %On place la virgule - \tikz\node[xshift=1em] at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCDerniereColonneEntiere-0.5-\TabLongueurNombre+1}) {\PfCTBstrut,};% - %on écrit la partie décimale - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{\DecalageLigne+##2+4.5}-|\fpeval{\PfCPremiereColonneDecimale-1.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,2]}{##1}{##1}};% - }% - }% - }% - \fi% - \ifboolKV[ClesTableaux]{Milliards}{% - \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliards\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliards\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliards\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (15|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (16|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (17|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; - }{\ifboolKV[ClesTableaux]{Millions}{% - \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millions\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (12|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (13|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (14|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; - }{% - \tikz\node[rotate=58] at (2|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (3|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\\de milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (4|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Milliers\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (5|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (6|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dizaines\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (7|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Unités\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (8|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Dixièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (9|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Centièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (10|-3) {\begin{minipage}{1.5cm}\begin{center}\scriptsize Millièmes\end{center}\end{minipage}}; - \tikz\node[rotate=58] at (11|-3) {\begin{minipage}{2cm}\begin{center}\scriptsize Dix-millièmes\end{center}\end{minipage}}; - }% - }% - \end{NiceTabular}% - \end{center}% - \setlength{\tabcolsep}{100\tabcolsep}% - }{}% - % - %%% Prise en compte de la cl\'e Metre - % - \ifboolKV[ClesTableaux]{Metre}{% - \[\renewcommand{\arraystretch}{1.15}% - \begin{NiceTabular}{*{7}{wc{7.5mm}}}% - \Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{}\\ - \Block[draw]{}{km\PfCTBstrut}&\Block[draw]{1-1}{hm\PfCTBstrut}&\Block[draw]{1-1}{dam\PfCTBstrut}&\Block[draw]{1-1}{m\PfCTBstrut}&\Block[draw]{1-1}{dm\PfCTBstrut}&\Block[draw]{1-1}{cm\PfCTBstrut}&\Block[draw]{1-1}{mm\PfCTBstrut}\\ - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&&\\ - }% - \Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - } - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular}% - \]% - }% - {}% - % - %%% Prise en compte de la cl\'e Carre - % - \ifboolKV[ClesTableaux]{Carre}{% - \[\renewcommand{\arraystretch}{1.15}% - \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}}}% - \Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}\\ - \Block[borders={left,top,right}]{1-2}{km$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{hm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{dam$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{m$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{dm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{cm$^2$\PfCTBstrut}&&\Block[borders={top,right}]{1-2}{mm$^2$\PfCTBstrut}&\\ - \ifboolKV[ClesTableaux]{Are}{% - \Block[borders={left,right,bottom}]{1-2}{}&&\Block[draw=gray!50,borders={left,top,bottom}]{}{~}&\Block[borders={top,right,bottom}]{}{\scriptsize ha}&\Block[draw=gray!50,borders={left,top,bottom}]{}{~}&\Block[borders={top,right,bottom}]{}{\scriptsize a}&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&&\Block[borders={left,right,bottom}]{1-2}{}&\\ - }{\hline}% - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&&&&&&&&&\\ - }% - \Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}% - &&\Block[]{1-2}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintifboolexpr{\useKV[ClesTableaux]{Are}}{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (4-|\fpeval{2*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1}); - }% - \xintFor* ##1 in {\xintSeq{1}{7}}\do{% - \tikz\draw[gray!50] (4-|\fpeval{2*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2}); - }% - }{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (3-|\fpeval{2*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+1}); - }% - \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% - \xintFor* ##1 in {\xintSeq{1}{7}}\do{% - \tikz\draw[gray!50] (3-|\fpeval{2*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{2*(##1-1)+2}); - }% - }{}% - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Are}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - } - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{Are}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2*##1}) to node[above, midway]{\small$\times\num{100}$}(1.5-|\fpeval{2*(##1+1)});% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*(##1+1)}) to node[below,midway]{\small$\div\num{100}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2*##1});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular} - \]% - }{}% - % - %%% Prise en compte de la cl\'e Cube - % - \ifboolKV[ClesTableaux]{Cube}{% - \[\renewcommand{\arraystretch}{1.15}% -% \setlength{\tabcolsep}{0.625\tabcolsep}% -% \begin{NiceTabular}{*{7}{wc{3.5mm}wc{3.5mm}wc{3.5mm}}} - \setlength{\tabcolsep}{0.275\tabcolsep}% - \begin{NiceTabular}{*{7}{wc{15pt}wc{15pt}wc{15pt}}} - \Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}\\ - \Block[borders={left,top,right}]{1-3}{km$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{hm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dam$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{m$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{dm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{cm$^3$\PfCTBstrut}&&&\Block[borders={top,right}]{1-3}{mm$^3$\PfCTBstrut}&&\\ - \ifboolKV[ClesTableaux]{Capacite}{% - \Block[borders={left,right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[borders={right,bottom}]{1-3}{}&&&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize hL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize daL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize L}&\Block[draw=gray!50,borders={top,left,bottom}]{}{\scriptsize dL}&\Block[draw=gray!50,borders={top,bottom}]{}{\scriptsize cL}&\Block[draw=gray!50,borders={top,right,bottom}]{}{\scriptsize mL}&\Block[borders={right,bottom}]{1-3}{}&&\\ - }{\hline}% - \xintFor* ##1 in {\xintSeq{1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&&&&&&&&&&&&&&&&\\ - }% - \Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}% - &&&\Block[]{1-3}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintifboolexpr{\useKV[ClesTableaux]{Capacite}}{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (4-|\fpeval{3*(##1-1)+1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); - }% - \xintFor* ##1 in {\xintSeq{1}{7}}\do{% - \tikz\draw[gray!50] (4-|\fpeval{3*(##1-1)+2})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); - \tikz\draw[gray!50] (4-|\fpeval{3*##1})--(\fpeval{4+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); - }% - }{% - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (3-|\fpeval{3*(##1-1)+1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+1}); - }% - \xintifboolexpr{\useKV[ClesTableaux]{Colonnes}}{% - \xintFor* ##1 in {\xintSeq{1}{7}}\do{% - \tikz\draw[gray!50] (3-|\fpeval{3*(##1-1)+2})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*(##1-1)+2}); - \tikz\draw[gray!50] (3-|\fpeval{3*##1})--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|\fpeval{3*##1}); - }% - }{}% - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+\ifboolKV[ClesTableaux]{Capacite}{3.5}{2.5}}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - }% - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{Capacite}{\xdef\PfCTableauDepart{4}}{\xdef\PfCTableauDepart{3}}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{2.5+3*(##1-1)}) to node[above, midway]{\small$\times\num{1000}$}(1.5-|\fpeval{2.5+3*##1});% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*##1}) to node[below,midway]{\small$\div\num{1000}$}(\fpeval{\PfCTableauDepart+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{2.5+3*(##1-1)});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular} - \]% - }{}% - % - %%% Prise en compte de la cl\'e Litre - % - \ifboolKV[ClesTableaux]{Litre}{% - \[\renewcommand{\arraystretch}{1.15}% - \begin{NiceTabular}{*{6}{wc{7.5mm}}}% - \Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{}\\ - \Block[draw]{}{hL\PfCTBstrut}&\Block[draw]{}{daL\PfCTBstrut}&\Block[draw]{}{L\PfCTBstrut}&\Block[draw]{}{dL\PfCTBstrut}&\Block[draw]{}{cL\PfCTBstrut}&\Block[draw]{}{mL\PfCTBstrut}\\ - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&\\ - } - \Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{} - &\Block[]{1-1}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{7}}\do{% - \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - }% - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{5}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular}% - \]% - }{}% - % - %%% Prise en compte de la cl\'e Gramme - % - \ifboolKV[ClesTableaux]{Gramme}{% - \[\renewcommand{\arraystretch}{1.15}% - \begin{NiceTabular}{*{7}{wc{7.5mm}}}% - \Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{}\\ - \Block[draw]{}{kg\PfCTBstrut}&\Block[draw]{1-1}{hg\PfCTBstrut}&\Block[draw]{1-1}{dag\PfCTBstrut}&\Block[draw]{1-1}{g\PfCTBstrut}&\Block[draw]{1-1}{dg\PfCTBstrut}&\Block[draw]{1-1}{cg\PfCTBstrut}&\Block[draw]{1-1}{mg\PfCTBstrut}\\ - \xintFor* ##1 in {\xintSeq {1}{\useKV[ClesTableaux]{NbLignes}}}\do{% - &&&&&&\\ - }% - \Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{} - &\Block[]{}{}\\ - \CodeAfter - % on trace les lignes verticales - \xintFor* ##1 in {\xintSeq{1}{8}}\do{% - \tikz\draw (3-|##1)--(\fpeval{3+\useKV[ClesTableaux]{NbLignes}}-|##1); - }% - % On place le nombre éventuel - \ifx\bla#2\bla% - \else% - \setsepchar[*]{,*/} - \readlist*\ListeNombreAPlacer{#2}% - \xintFor* ##2 in{\xintSeq {1}{\ListeNombreAPlacerlen}}\do{ - \StrLen{\ListeNombreAPlacer[##2,1]}[\TabLongueurNombre]% - \xintFor* ##1 in{\xintSeq {1}{\TabLongueurNombre}}\do{% - \tikz\node at (\fpeval{##2+2.5}-|\fpeval{\ListeNombreAPlacer[##2,2]-0.5+##1}) {\PfCTBstrut\StrMid{\ListeNombreAPlacer[##2,1]}{##1}{##1}}; - }% - } - \fi% - % on trace les flèches - \ifboolKV[ClesTableaux]{Fleches}{\setKV[ClesTableaux]{FlechesH,FlechesB}}{}% - \ifboolKV[ClesTableaux]{FlechesH}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=30,in=150] (1.5-|\fpeval{0.5+##1}) to node[above, midway]{\small$\times\num{10}$}(1.5-|\fpeval{1.5+##1});% - }% - }{}% - \ifboolKV[ClesTableaux]{FlechesB}{% - \xintFor* ##1 in {\xintSeq{1}{6}}\do{% - \tikz\draw[gray,->,>=latex,out=-150,in=-30] (\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{1.5+##1}) to node[below,midway]{\small$\div\num{10}$}(\fpeval{3+\useKV[ClesTableaux]{NbLignes}+0.5}-|\fpeval{0.5+##1});% - }% - }{}% - \useKV[ClesTableaux]{CodeAfter}% - \end{NiceTabular}% - \]% - }{}% -}% -}% - -\newcommand\PfCTableauIncline{% -\begin{NiceTabular}{wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}wc{30pt}} - &&&&&&\\ - \Block[borders={bottom}]{}{\si{\kilo\PfCTableauUnite}}&\\ - &\Block[borders={left}]{}{}&\\ - &\Block[borders={left,bottom}]{}{\si{\hecto\PfCTableauUnite}}&\\ - &&\Block[borders={left}]{}{}&\\ - &&\Block[borders={left,bottom}]{}{\si{\deca\PfCTableauUnite}}&\\ - &&&\Block[borders={left}]{}{}&\\ - &&&\Block[borders={left,bottom}]{}{\si{\PfCTableauUnite}}&\\ - &&&&\Block[borders={left}]{}{}&\\ - &&&&\Block[borders={left,bottom}]{}{\si{\deci\PfCTableauUnite}}&\\ - &&&&&\Block[borders={left}]{}{}&\\ - &&&&&\Block[borders={left,bottom}]{}{\si{\centi\PfCTableauUnite}}&\\ - &&&&&&\Block[borders={left}]{}{}\\ - &&&&&&\Block[borders={left,bottom}]{}{\si{\milli\PfCTableauUnite}}\\ - &&&&&& - \CodeAfter - \tikz\draw[out=35,in=90,-stealth,gray] (2-|1.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(4-|2.5); - \tikz\draw[out=35,in=90,-stealth,gray] (4-|2.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(6-|3.5); - \tikz\draw[out=35,in=90,-stealth,gray] (6-|3.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(8-|4.5); - \tikz\draw[out=35,in=90,-stealth,gray] (8-|4.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(10-|5.5); - \tikz\draw[out=35,in=90,-stealth,gray] (10-|5.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(12-|6.5); - \tikz\draw[out=35,in=90,-stealth,gray] (12-|6.5) to node[midway,right]{\footnotesize$\times\num{\PfCCoefConversion}$}(14-|7.5); - % bas - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (15-|7.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(13-|6.5); - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (13-|6.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(11-|5.5); - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (11-|5.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(9-|4.5); - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (9-|4.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(7-|3.5); - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (7-|3.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(5-|2.5); - \tikz\draw[out=215,in=-90,-stealth,gray,transform canvas={yshift=-2mm}] (5-|2.5) to node[midway,left]{\footnotesize$\div\num{\PfCCoefConversion}$}(3-|1.5); -\end{NiceTabular}% -}% - -%%% -% Cards -%%% -\newtcolorbox{Mybox}[3]{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - overlay unbroken and first={% - \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west);% - \coordinate[yshift=-0.5\hauteurtitre] (B1) at (frame.north east);% - \coordinate[yshift=-\hauteurtitre] (A) at (frame.north west);% - \coordinate[yshift=-\hauteurtitre] (B) at (frame.north east);% - \coordinate[xshift=1.5pt,yshift=8mm] (S1) at (frame.south west);% - \coordinate[xshift=-1.5pt,yshift=8mm] (S2) at (frame.south east);% - \coordinate[xshift=3mm+(\largeurtitre/2)] (A2) at (A1);% - \coordinate[xshift=-3mm-(\largeurtitre/2)] (B2) at (B1);% - \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T1) at (A2){};% - \node[TexteCouleur] (T1a) at (T1){\Large #1};% - \node[yshift=-0.65cm] (T1b) at (T1){\tiny r\'eponse pr\'ec\'edente};% - \node[inner sep=0pt,rounded corners, rectangle, draw=black,minimum height=1cm,text width=\largeurtitre,fill=TrameCouleur] (T2) at (B2){};% - \node[inner sep=0pt,TexteCouleur] (T2a) at (T2){% - \begin{minipage}{\largeurtitre}% - \begin{center}% - #2% - \end{center}% - \end{minipage}% - };% - \node[yshift=-0.65cm] (T2b) at (T2){};% - \ifboolKV[Cards]{Titre}{\node[] at (T2b) {\tiny\useKV[Cards]{NomTitre}};}{}% - \node[rectangle,xshift=5pt,yshift=4.25mm,minimum width=2em,rounded corners,fill=TrameCouleur,draw=black,anchor=west] (R) at (frame.south west) {\color{black}\Large\bfseries #3};% - \draw[dashed] (S1) -- (S2);% - },% - colback=white,% - colbacktitle=TrameCouleur,% -} - -\makeatletter -\newtcolorbox{MyboxJQ}[2]{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - underlay={% - \ifboolKV[Cards]{BackgroundAv}{% - \begin{tcbclipinterior} - \node[anchor=center,opacity=1] - at (interior.center) {% - \includegraphics[% - height=\tcb@height, - width=\tcb@width, - ]{\useKV[Cards]{ImageAv}}};% - \end{tcbclipinterior}% - }{}% - },% - overlay unbroken and first={% - \coordinate[yshift=-0.5\hauteurtitre] (A1) at (frame.north west); - \coordinate[yshift=0\hauteurtitre] (S3) at (frame.center); - \coordinate[yshift=3mm] (C3) at (frame.south); - \coordinate[xshift=\largeurcarte/2] (A3) at (A1); - \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A3){}; - \node[TexteCouleur] (T1a) at (T1){\Large J'ai}; - \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T2) at (S3){}; - \node[TexteCouleur] (T2a) at (T2){\Large Qui a ?}; - \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte1) at ($(A3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}% - \begin{center}% - #1% - \end{center}% - \end{minipage}}; - \node[minimum height=1cm,text width=\largeurcarte-6mm] (PointTexte2) at ($(C3)!0.5!(S3)$) {\begin{minipage}{\largeurcarte-6mm}% - \begin{center}% - #2% - \end{center}% - \end{minipage}}; - }, - colback=white -} -% -\newtcolorbox{MyboxJQAr}{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - underlay={% - \ifboolKV[Cards]{BackgroundAv}{% - \begin{tcbclipinterior} - \node[anchor=center,opacity=1] - at (interior.center) {% - \includegraphics[% - height=\tcb@height, - width=\tcb@width, - ]{\useKV[Cards]{ImageAr}}};% - \end{tcbclipinterior}% - }{}% - },% - colback=white -} -\makeatother - -\makeatletter -%https://tex.stackexchange.com/questions/347434/clip-background-image-inside-tcolorbox -\newtcolorbox{MyboxSimpleAv}[1]{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - colback=white,% - underlay={% - \ifboolKV[Cards]{BackgroundAv}{% - \begin{tcbclipinterior} - \node[anchor=center,opacity=1] - at (interior.center) {% - \includegraphics[% - height=\tcb@height, - width=\tcb@width, - ]{\useKV[Cards]{ImageAv}}};% - \end{tcbclipinterior}% - }{}% - },% - overlay unbroken and first={% - \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);% - \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}% - \begin{center}% - #1% - \end{center}% - \end{minipage}};% - \node[yshift=-0.5em-0.5\hauteurtitre] (B) at (A){};% - \ifboolKV[Cards]{Titre}{\node[fill=white] at (B) {\useKV[Cards]{NomTitre}};}{}% - }% -}% - -\newtcolorbox{MyboxSimpleAr}[1]{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=\hauteurtitre,bottom=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - colback=white,% - underlay={% - \ifboolKV[Cards]{BackgroundAr}{% - \begin{tcbclipinterior} - \node[anchor=center,opacity=1] - at (interior.center) {% - \includegraphics[% - height=\tcb@height, - width=\tcb@width, - ]{\useKV[Cards]{ImageAr}}}; - \end{tcbclipinterior}%,% - }{}% - },% - overlay unbroken and first={% - \coordinate[yshift=-0.5\hauteurtitre] (A) at (frame.north);% - \node[rounded corners, draw=black, rectangle,minimum height=1cm,text width=\largeurcarte-6mm,fill=TrameCouleur] (T1) at (A){\begin{minipage}{\largeurcarte-6mm}% - \begin{center}% - #1% - \end{center}% - \end{minipage}};% - }% -}% -\makeatother - -\newtcolorbox{MyboxTrivial}[1][]{% - enhanced,% - nobeforeafter,% - left=0pt,right=0pt,top=0pt,bottom=0pt,% - text fill,% - width=\largeurcarte,% - height=\hauteurcarte,% - arc=5pt,% - colback=white,% - #1 -} - -\newlength{\largeurcards}% -\newlength{\hauteurcards}% -\newlength{\largeurcarte}% -\newlength{\hauteurcarte}% -\newlength{\hauteurtitre}% -\newlength{\largeurtitre}% - -\newlength{\margeh}% -\newlength{\margev}% - -% \NewEnviron{Trame}{% -\NewDocumentEnvironment{Trame}{+b}{% - \begin{tikzpicture}[remember picture,overlay] - % quadrillages horizontal et vertical - \coordinate[yshift=-\margev] (A) at (current page.north west);% - \coordinate[yshift=-\margev] (B) at (current page.north east);% - \coordinate[yshift=-\hauteurcards] (A1) at (A);% - \coordinate[yshift=-\hauteurcards] (B1) at (B);% - \coordinate[yshift=-\hauteurcards] (A2) at (A1);% - \coordinate[yshift=-\hauteurcards] (B2) at (B1);% - \coordinate[yshift=-\hauteurcards] (A3) at (A2);% - \coordinate[yshift=-\hauteurcards] (B3) at (B2);% - \coordinate[yshift=-\hauteurcards] (A4) at (A3);% - \coordinate[yshift=-\hauteurcards] (B4) at (B3);% - \coordinate[xshift=\margeh] (C) at (current page.north west);% - \coordinate[xshift=\margeh] (D) at (current page.south west);% - \coordinate[xshift=\largeurcards] (C1) at (C);% - \coordinate[xshift=\largeurcards] (D1) at (D);% - \coordinate[xshift=\largeurcards] (C2) at (C1);% - \coordinate[xshift=\largeurcards] (D2) at (D1);% - \coordinate[xshift=\largeurcards] (C3) at (C2);% - \coordinate[xshift=\largeurcards] (D3) at (D2);% - \draw (A)--(B);% - \draw (A1)--(B1);% - \draw (A2)--(B2);% - \draw (A3)--(B3);% - \draw (A4)--(B4);% - \draw (C)--(D);% - \draw (C1)--(D1);% - \draw (C2)--(D2);% - \draw (C3)--(D3);% - % point pour placer les cartes - \coordinate[xshift=\margeh+0.5\largeurcards,yshift=-0.5\hauteurcards] (Carte1) at (A);% - \coordinate[xshift=\largeurcards,yshift=0mm] (Carte2) at (Carte1);% - \coordinate[xshift=2\largeurcards,yshift=0mm] (Carte3) at (Carte1);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte4) at (Carte1);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte5) at (Carte2);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte6) at (Carte3);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte7) at (Carte4);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte8) at (Carte5);% - \coordinate[xshift=0mm,yshift=-\hauteurcards] (Carte9) at (Carte6);% - #1% - \end{tikzpicture}% -}% - -\setKVdefault[Cards]{Largeur=59,Hauteur=89,HauteurTheme=15,Marge=4,Landscape=false,Couleur=Cornsilk,Theme=Th\'eor\`eme\\de - Pythagore,ThemeSol=Solution,Trame=false,Titre=false,NomTitre=Jeu 1,Loop,JaiQuia=false,BackgroundAv=false,BackgroundAr=false,ImageAv=4813762.jpg,ImageAr=4813762.jpg,AffichageSolution=true,SolutionSeule=false,% - % Pour le trivial - Trivial=false,Symboles={\faInfinity,\faSignal,\faProjectDiagram,\faHiking,\faRuler,\faLockOpen} -}% - -\NewDocumentCommand\Cartes{o +m}{%[2][]{% - \useKVdefault[Cards]% - \setKV[Cards]{#1}% - \setsepchar[*]{§*/}% - \readlist*\ListeCards{#2}% - \setsepchar{,}% - \ifboolKV[Cards]{Landscape}{% - \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}% - \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}% - \setlength{\largeurcards}{95mm}% - \setlength{\hauteurcards}{65mm}% - \setlength{\margeh}{(297mm-3\largeurcards)/2}% - \setlength{\margev}{(210mm-3\hauteurcards)/2}% - }{% - \setlength{\hauteurcarte}{\fpeval{\useKV[Cards]{Hauteur}-\useKV[Cards]{Marge}}mm}% - \setlength{\largeurcarte}{\fpeval{\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}}mm}% - \setlength{\largeurcards}{65mm}% - \setlength{\hauteurcards}{95mm}% - \setlength{\margeh}{(210mm-3\largeurcards)/2}% - \setlength{\margev}{(297mm-3\hauteurcards)/2}% - }% - \setlength{\hauteurtitre}{\fpeval{\useKV[Cards]{HauteurTheme}}mm}% - \setlength{\largeurtitre}{\fpeval{(\useKV[Cards]{Largeur}-\useKV[Cards]{Marge}-9)/2}mm}% - \colorlet{TexteCouleur}{black}% - \colorlet{TrameCouleur}{\useKV[Cards]{Couleur}}% - \ifboolKV[Cards]{Trivial}{% - \xdef\PfCListeSymbolTrivial{\useKV[Cards]{Symboles}}% - \setsepchar{,}\readlist*\ListeSymbolesTrivial{\PfCListeSymbolTrivial}% - \setlength{\tabcolsep}{0.25\tabcolsep} - \ifboolKV[Cards]{Trame}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame}% - \multido{\i=1+1}{9}{% - \node[] at (Carte\i) {% - \begin{MyboxTrivial}% - \begin{center} - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[9,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\i,\fpeval{1+2*(##1-1)}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - };% - }% - \end{Trame}% - \ifboolKV[Cards]{AffichageSolution}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame}% - \multido{\i=1+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxTrivial}% - \begin{center}% - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{4-\i},\fpeval{2*##1}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - };% - }% - \multido{\i=4+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxTrivial}% - \begin{center}% - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{10-\i},\fpeval{2*##1}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - };% - }% - \multido{\i=7+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxTrivial}% - \begin{center}% - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[\fpeval{16-\i},\fpeval{2*##1}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - };% - }% - \end{Trame}% - \clearpage% - }{}% - }{% - \begin{MyboxTrivial}% - \begin{center}% - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{1+2*(##1-1)}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - \ifboolKV[Cards]{AffichageSolution}{% - \begin{MyboxTrivial}% - \begin{center}% - \begin{NiceTabular}[width=0.9\largeurcarte]{X[1,m]X[10,m]}[hvlines]% - \xintFor* ##1 in{\xintSeq{1}{6}}\do{% - \rule{0pt}{0.12\hauteurcards}\Block{1-1}{\ListeSymbolesTrivial[##1]}&\ListeCards[1,\fpeval{2*##1}]\\ - }% - \end{NiceTabular}% - \end{center}% - \end{MyboxTrivial}% - }{}% - }% - \setlength{\tabcolsep}{4\tabcolsep}% - }{% - \ifboolKV[Cards]{JaiQuia}{% - \ifboolKV[Cards]{Trame}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame}% - \multido{\i=1+1}{9}{% - \node at (Carte\i) {% - \begin{MyboxJQ}{\ListeCards[\i,1]}{\ListeCards[\i,2]}% - %% - \end{MyboxJQ}% - };% - }% - \end{Trame}% - \clearpage% - \ifboolKV[Cards]{AffichageSolution}{% - \thispagestyle{empty}% - \begin{Trame} - \multido{\i=1+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxJQAr}% - \end{MyboxJQAr}% - };% - }% - \multido{\i=4+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxJQAr}% - \end{MyboxJQAr}% - };% - }% - \multido{\i=7+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxJQAr}% - \end{MyboxJQAr}% - };% - }% - \end{Trame}% - \clearpage% - }{}% - }{% - \begin{MyboxJQAr}% - %% - \end{MyboxJQAr}% - }% - }{% - \ifboolKV[Cards]{Loop}{% - \ifboolKV[Cards]{Trame}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame} - \multido{\i=1+1}{9}{% - \node at (Carte\i) {% - \begin{Mybox}{\ListeCards[\i,1]}{\useKV[Cards]{Theme}}{\ListeCards[\i,2]}% - \ListeCards[\i,3]% - \end{Mybox}% - };% - }% - \end{Trame}% - \clearpage% - }{% - \begin{Mybox}{\ListeCards[1,1]}{\useKV[Cards]{Theme}}{\ListeCards[1,2]}% - \ListeCards[1,3]% - \end{Mybox}% - }% - }{% - \ifboolKV[Cards]{Trame}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame} - \multido{\i=1+1}{9}{% - \node[] at (Carte\i) {% - \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}% - \ListeCards[\i,1]% - \end{MyboxSimpleAv}% - };% - }% - \end{Trame}% - \ifboolKV[Cards]{AffichageSolution}{% - \clearpage% - \thispagestyle{empty}% - \begin{Trame} - \multido{\i=1+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% - \ListeCards[\fpeval{4-\i},2]% - \end{MyboxSimpleAr}% - };% - }% - \multido{\i=4+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% - \ListeCards[\fpeval{10-\i},2]% - \end{MyboxSimpleAr}% - };% - }% - \multido{\i=7+1}{3}{% - \node at (Carte\i) {% - \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% - \ListeCards[\fpeval{16-\i},2]% - \end{MyboxSimpleAr}% - };% - }% - \end{Trame}% - \clearpage% - }{}% - }{% - \ifboolKV[Cards]{SolutionSeule}{}{% - \begin{MyboxSimpleAv}{\useKV[Cards]{Theme}}% - \ListeCards[1,1]% - \end{MyboxSimpleAv}% - }% - \ifboolKV[Cards]{AffichageSolution}{% - \begin{MyboxSimpleAr}{\useKV[Cards]{ThemeSol}}% - \ListeCards[1,2]% - \end{MyboxSimpleAr}% - }{}% - }% - }% - }% - }% -}% - -\newcommand\SolutionCarte[2]{% - \begin{center} - \bfseries#1 - \end{center} - - #2 -}% - -%%% -% Tableur -%%% -\setKVdefault[Tableur]{Colonnes=4,Largeur=30pt,LargeurUn=30pt,Bandeau=true,Formule={},Cellule=A1,Ligne=0,Colonne=0,PasL=1,PasC=1,Selection=false}% -%Idee de P. Nuns -\defKV[Tableur]{Couleur=\setKV[Tableur]{Selection}}% -% - -%Bas\'e sur un code de Christian T\'ell\'ech\'ea. -\newcount\cntlin% -\newcount\cntcol% - -\makeatletter% -\newtoks\t@b% -\long\def\ifremain@lines#1\\#2\@nil{% - \csname @\ifx\@empty#2\@empty second\else first\fi oftwo\endcsname}% -\long\def\subst@eol#1\\#2\@nil{\addtot@b{#1\\}% - \ifremain@lines#2\\\@nil{\addtot@b&\subst@eol#2\@nil}{\addtot@b{#2\CodeAfter\xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{% - \tikz\node at (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}}) {\tiny$\blacksquare$};% - }% - \end{NiceTabular}}}}% -\long\def\collectcp@body#1\end{\subst@eol#1\@nil\end}% - -\newcommand\addtot@b[1]{\t@b\expandafter{\the\t@b#1}}% -\newcommand\edftot@b[1]{\edef\temp@{#1}\expandafter\addtot@b\expandafter{\temp@}}% - -\newlength\PfCLongInter% -\newlength\PfCTableurLargeurUn% -\newlength\PfCTableurLargeur% - -\RequirePackage{printlen} - -\newenvironment{Tableur}[1][]{% - \useKVdefault[Tableur]% - \setKV[Tableur]{#1}% - \setlength{\PfCTableurLargeurUn}{\fpeval{\useKV[Tableur]{LargeurUn}}pt}% - \setlength{\PfCTableurLargeur}{\fpeval{\useKV[Tableur]{Largeur}}pt}% - \ttfamily% - \newcolumntype{Y}{>{\centering\arraybackslash}m{\PfCTableurLargeurUn}}% - \newcolumntype{X}{>{\centering\arraybackslash}m{\PfCTableurLargeur}}% - \setlength{\PfCLongInter}{-40pt+\fpeval{\useKV[Tableur]{LargeurUn}}pt+\fpeval{(\useKV[Tableur]{Colonnes}-2)*\useKV[Tableur]{Largeur}}pt+\fpeval{2*\useKV[Tableur]{Colonnes}-6}\tabcolsep+\fpeval{\useKV[Tableur]{Colonnes}+2}\arrayrulewidth}% - \ifboolKV[Tableur]{Bandeau}{% - \begin{NiceTabular}{p{\PfCTableurLargeur}p{10pt}p{50pt}p{\PfCLongInter}} - \Block[draw,l]{}{\useKV[Tableur]{Cellule}}&\Block[draw]{}{\scriptsize$\blacktriangledown$}&\Block{}{$f_x$\hfill$\sum$~\scriptsize$\blacktriangledown$\hfill$=$}&\Block[draw]{}{\useKV[Tableur]{Formule}\hfill\scriptsize$\blacktriangledown$}\\ - \end{NiceTabular}% - \nopagebreak% - \\% - }{}% - \cntlin\z@% - \t@b{% - \begin{NiceTabular}{% - >{% - \global\cntcol\z@\global\advance\cntlin\@ne% - \centering\arraybackslash% - \ifnum\cntlin>\@ne% - \ifboolKV[Tableur]{Selection}{% - \xintifboolexpr{\cntlin>\useKV[Tableur]{Ligne} && \cntlin<\fpeval{\useKV[Tableur]{Ligne}+\useKV[Tableur]{PasL}+1}}{\textcolor{white}{\number\numexpr\cntlin-1\relax}}{\number\numexpr\cntlin-1\relax}% - }{\number\numexpr\cntlin-1\relax}\fi}% - wc{20pt}Y*{\fpeval{\useKV[Tableur]{Colonnes}-1}}{X}}[hvlines]% - \CodeBefore - % on colorie en gris toute la première ligne - \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (row-2-|last);% - % on colorie en gris toute la première colonne - \tikz\draw[fill=gray!15](row-1-|col-1) rectangle (last-|col-2);% - % - \xintifboolexpr{\useKV[Tableur]{Ligne}==0 || \useKV[Tableur]{Colonne}==0}{}{% - \ifboolKV[Tableur]{Selection}{% - \xdef\PfCTabCouleur{\useKV[Tableur]{Couleur}}% - % on colorie les cellules sans les tracer - \tikz\draw[fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% - % on trace la première cellule qui a servi à sélectionner - \tikz\draw[line width=1.25pt,fill=\PfCTabCouleur!50](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+1});% - % on colorie la zone nécessaire sur la première ligne - \tikz\draw[fill=\PfCTabCouleur](row-1-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-2-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% - % on colorie la zone nécessaire sur la première colonne - \tikz\draw[fill=\PfCTabCouleur](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-1) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-2);% - }{% - \tikz\draw[line width=1.25pt](row-\fpeval{\useKV[Tableur]{Ligne}+1}-|col-\fpeval{\useKV[Tableur]{Colonne}+1}) rectangle (row-\fpeval{\useKV[Tableur]{Ligne}+1+\useKV[Tableur]{PasL}}-|col-\fpeval{\useKV[Tableur]{Colonne}+1+\useKV[Tableur]{PasC}});% - }% - }% - \Body - % - }% - \loop% - \ifnum\cntcol<\useKV[Tableur]{Colonnes}% - \advance\cntcol\@ne% - \addtot@b{&}% - % modif by Pascal Nuns - \ifboolKV[Tableur]{Selection}{% - \ifnum\cntcol>\fpeval{\useKV[Tableur]{Colonne}-1}% - \ifnum\cntcol<\fpeval{\useKV[Tableur]{Colonne}+\useKV[Tableur]{PasC}}% - \edftot@b{{\noexpand\textcolor{white}{\noexpand\bfseries\@Alph{\the\cntcol}}}}% - \else% - \edftot@b{\@Alph{\the\cntcol}}% - \fi% - \else% - \edftot@b{\@Alph{\the\cntcol}}% - \fi% - }{\edftot@b{\@Alph{\the\cntcol}}}% - % fin de modif - \repeat% - \addtot@b{\\&}% - \collectcp@body}{\the\t@b}% -\makeatother - -%%% -% Domino -%%% -\newtcolorbox{MyDominoMini}[1][]{% - enhanced, - nobeforeafter, - left skip=0pt, - right skip=0pt, - left=0pt,right=0pt,top=0pt,bottom=0pt, - width=\textwidth/\ColonneDomino, - height=\textheight/\LigneDomino, - segmentation style={solid, line width=1.5pt}, - colback=\CouleurDomino, - center upper, - valign upper=center, - center lower, - valign lower=center, - arc=2pt, - #1 -} - -\newtcolorbox{MyDominoLogo}[1][]{% - enhanced, - nobeforeafter, - left skip=0pt, - right skip=0pt, - left=0pt,right=0pt,top=0pt,bottom=0pt, - width=\textwidth/\ColonneDomino, - height=\textheight/\LigneDomino, - valign=center, - halign=center, - arc=2pt, - colback=white, - #1 -} - -\NewEnviron{TrameDomino}{% - \setlength{\margev}{1cm} - \setlength{\margeh}{1cm} - \begin{tikzpicture}[remember picture,overlay] - % quadrillages horizontal et vertical - \coordinate[yshift=-\margev] (A0) at (current page.north west); - \coordinate[yshift=-\margev] (B0) at (current page.north east); - \foreach \i in {1,...,\useKV[Domino]{Lignes}}{% - \coordinate[yshift=-\i*\textheight/\LigneDomino] (A\i) at (A0); - \coordinate[yshift=-\i*\textheight/\LigneDomino] (B\i) at (B0); - } - \coordinate[xshift=\margeh] (C0) at (current page.north west); - \coordinate[xshift=\margeh] (D0) at (current page.south west); - \foreach \i in {1,...,\useKV[Domino]{Colonnes}}{ - \coordinate[xshift=\i*\textwidth/\ColonneDomino] (C\i) at (C0); - \coordinate[xshift=\i*\textwidth/\ColonneDomino] (D\i) at (D0); - } - \foreach \i in {0,...,\LigneDomino}{% - \draw (A\i) -- (B\i); - } - \foreach \i in {0,...,\ColonneDomino}{% - \draw (C\i) -- (D\i); - } - \draw[blue, line width=3pt] (A0)--(B0); - \draw[blue, line width=3pt] (A\LigneDomino)--(B\LigneDomino); - \draw[blue, line width=3pt] (C0)--(D0); - \draw[blue, line width=3pt] (C\ColonneDomino)--(D\ColonneDomino); - % point pour placer les cartes - \foreach \i in {0,...,\fpeval{\ColonneDomino-1}}{% - \foreach \j in {0,...,\fpeval{\LigneDomino-1}}{% - \coordinate[xshift=\margeh+(0.5\textwidth/\ColonneDomino)+\i*\textwidth/\ColonneDomino,yshift=-0.5\textheight/\LigneDomino-\j*\textheight/\LigneDomino] - (Domino\fpeval{\i+\ColonneDomino*\j+1}) at (A0); - } - } - \BODY - \end{tikzpicture} -} - -\setKVdefault[Domino]{Couleur=white,Trame,Ratio=0.5,Lignes=7,Colonnes=5,Superieur=false,Logo=false,Image=tiger.pdf} - -\newcommand\Dominos[2][]{% - \useKVdefault[Domino]% - \setKV[Domino]{#1}% - \setsepchar[*]{§*/}% - \readlist*\ListeDominos{#2}% - \xdef\CouleurDomino{\useKV[Domino]{Couleur}}% - \xdef\ratiodomino{\useKV[Domino]{Ratio}}% - \xdef\LigneDomino{\useKV[Domino]{Lignes}}% - \xdef\ColonneDomino{\useKV[Domino]{Colonnes}}% - \ifboolKV[Domino]{Trame}{% - \clearpage - \begin{TrameDomino} - \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{% - \node[] at (Domino\i){% - \ifboolKV[Domino]{Superieur}{% - \begin{MyDominoMini}[space=\ratiodomino]% - \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]% - \end{MyDominoMini}% - }{% - \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]% - \ListeDominos[\i,1]\tcblower\ListeDominos[\i,2]% - \end{MyDominoMini}% - }% - }; - }% - \end{TrameDomino}% - \ifboolKV[Domino]{Logo}{% - \clearpage - \begin{TrameDomino} - \foreach\i in {1,...,\fpeval{\LigneDomino*\ColonneDomino}}{% - \node at (Domino\i){% - \begin{MyDominoLogo}% - \includegraphics[height=\tcbtextheight]{\useKV[Domino]{Image}} - \end{MyDominoLogo}% - }; - }% - \end{TrameDomino}% - }{}% - }{% - \ifboolKV[Domino]{Superieur}{% - \begin{MyDominoMini}[space=\ratiodomino]% - \ListeDominos[1,1]\tcblower\ListeDominos[1,2]% - \end{MyDominoMini}% - }{% - \begin{MyDominoMini}[sidebyside,sidebyside gap=4mm,righthand ratio=\ratiodomino]% - \ListeDominos[1,1]\tcblower% - \ListeDominos[1,2]% - \end{MyDominoMini}% - }% - }% -}% - -%%%% -% Prog de calculs "simples" -%%%% -\setKVdefault[ClesProg]{% - Ecart=2em,% - Direct,% - SansCalcul=false,% - Application=false, - Details=false, - Enonce=false, - Nom={}, - CouleurCadre=black,% - CouleurFond=gray!10,% - Largeur={.95\linewidth},% - Epaisseur=.75pt,% - Pointilles=0, - ThemePerso=false, -} - -\newcounter{NBprog}% -\setcounter{NBprog}{0}% - -\newlength{\PointillesClesProg}% - -\newcommand\ProgCalcul[2][]{% - % #1 : cl\'es - % #2 : \'etapes - \useKVdefault[ClesProg]% - \setKV[ClesProg]{#1}% - \ifboolKV[ClesProg]{ThemePerso}{}{% - \tcbset{ProgCalcul/.style={% - boxsep=1mm, - bottom=.75mm, - middle=2mm, - boxrule={\useKV[ClesProg]{Epaisseur}}, - text width={\useKV[ClesProg]{Largeur}}, - colframe={\useKV[ClesProg]{CouleurCadre}}, - colback={\useKV[ClesProg]{CouleurFond}}, - halign upper=center - }% - }% - }% - \ifboolKV[ClesProg]{Application}{% - % % by Thomas Dehon and cp - \setsepchar[*]{§*,} - % \setsepchar[*]{,* }% - \ignoreemptyitems% - \readlist*\ListeTotale{#2}% - \xdef\PfCPCfoo{\ListeTotale[1]}% - \xdef\PfCPCfaa{\ListeTotale[2]}% - %% - \setsepchar{,}% \ignoreemptyitems% - \readlist*\ListeEtapes{\PfCPCfoo}% - \setsepchar[*]{,* }\ignoreemptyitems% - \readlist*\ListeProg{\PfCPCfaa}% - \begin{tcolorbox}[% - ProgCalcul,% - ] - \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}% - {}% - {% - {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}% - \tcblower - }% - \ifboolKV[ClesProg]{SansCalcul}{% - \begin{enumerate} - \item Choisir un nombre~\pointilles~$\ListeProg[1]$% - \foreachitem\etape\in\ListeEtapes{% - \item \etape~\pointilles~$\ListeProg[3,\etapecnt]$ - }% - \end{enumerate} - }{\begin{enumerate} - \item Choisir un nombre~\pointilles~\xdef\NbDepart{\ListeProg[1]}\num{\NbDepart} - \foreachitem\etape\in\ListeEtapes{% - \item \etape~\pointilles~\edef\Test{\ListeProg[2,\etapecnt]}% - \expandarg% - \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% - \StrSubstitute{\tempa}{**}{^}[\tempab]% - \StrSubstitute{\tempab}{*}{\times}[\tempac]% - \StrSubstitute{\tempac}{/}{\div}[\tempad]% - $\ifboolKV[ClesProg]{Details}{\xintifboolexpr{\NbDepart<0}{(\num{\NbDepart})}{\num{\NbDepart}}\tempad=}{}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\etapecnt]}}\num{\NbDepart}$% - }% - \end{enumerate} - } - \end{tcolorbox} - }{% - \ifboolKV[ClesProg]{Enonce}{% - % by Thomas Dehon - \setsepchar[*]{,* }% - \ignoreemptyitems% - \readlist*\ListeEtapes{#2}% - \begin{tcolorbox}[% - ProgCalcul,% - ] - \ifthenelse{\equal{\useKV[ClesProg]{Nom}}{}}% - {}% - {% - {\color{\useKV[ClesProg]{CouleurCadre}}{\bfseries\useKV[ClesProg]{Nom}}}% - \tcblower - }% - \begin{enumerate} - \foreachitem\etape\in\ListeEtapes{% - \item \etape - \ifthenelse{\equal{\useKV[ClesProg]{Pointilles}}{0}}% - {}% - {% - \setlength{\PointillesClesProg}{\useKV[ClesProg]{Pointilles}} - \hfill \pointilles[\PointillesClesProg]% - }% - } - \end{enumerate} - \end{tcolorbox} - }{% - \setsepchar[*]{,* }\ignoreemptyitems% - \readlist*\ListeProg{#2}% - \stepcounter{NBprog}% - \xdef\NbDepart{\ListeProg[1]}% - \ifboolKV[ClesProg]{SansCalcul}{% - $\NbDepart$\foreachitem\compteur\in\ListeProg[2]{% - \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\hspace{0.2em}$\ListeProg[3,\compteurcnt]$% - }% - \begin{tikzpicture}[remember picture, overlay] - \foreachitem\compteur\in\ListeProg[2]{% - \edef\Test{\ListeProg[2,\compteurcnt]} - \expandarg% - \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% - \StrSubstitute{\tempa}{**}{^}[\tempab]% - \StrSubstitute{\tempab}{*}{\times}[\tempac]% - \StrSubstitute{\tempac}{/}{\div}[\tempad]% - \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) -- - node[above]{\scriptsize$\tempad$}(pic cs:B-\theNBprog-\compteurcnt); - } - \end{tikzpicture} - }{% - \num{\NbDepart}\foreachitem\compteur\in\ListeProg[2]{% - \hspace{0.2em}\tikzmark{A-\theNBprog-\compteurcnt}\hspace{\useKV[ClesProg]{Ecart}}\tikzmark{B-\theNBprog-\compteurcnt}\xdef\NbDepart{\fpeval{(\NbDepart)\ListeProg[2,\compteurcnt]}}\hspace{0.2em}\num{\NbDepart}% - }% - \ifboolKV[ClesProg]{Direct}{% - \begin{tikzpicture}[remember picture, overlay] - \foreachitem\compteur\in\ListeProg[2]{% - \edef\Test{\ListeProg[2,\compteurcnt]} - \expandarg% - \StrSubstitute{\Test}{^}{\empty\dots{}^}[\tempa]% - \StrSubstitute{\tempa}{**}{^}[\tempab]% - \StrSubstitute{\tempab}{*}{\times}[\tempac]% - \StrSubstitute{\tempac}{/}{\div}[\tempad]% - \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:A-\theNBprog-\compteurcnt) -- - node[above]{\scriptsize$\tempad$}(pic - cs:B-\theNBprog-\compteurcnt); - } - \end{tikzpicture} - }{% - \begin{tikzpicture}[remember picture, overlay] - \foreachitem\compteur\in\ListeProg[2]{% - \edef\Test{\ListeProg[2,\compteurcnt]} - \expandarg% - \StrSubstitute{\Test}{^2}{\empty\sqrt{\dots{}}}[\tempa]% - \StrSubstitute{\tempa}{**}{^}[\tempab]% - \StrSubstitute{\tempab}{*}{\div}[\tempac]% - \StrSubstitute{\tempac}{/}{\times}[\tempad]% - \StrSubstitute{\tempad}{-}{+}[\tempae]% - \StrSubstitute{\tempae}{++}{-}[\tempaf]% - \draw[-stealth,transform canvas={yshift=0.25em}] (pic cs:B-\theNBprog-\compteurcnt) -- node[above]{\scriptsize$\tempaf$}(pic cs:A-\theNBprog-\compteurcnt); - } - \end{tikzpicture} - }% - }% - }% - }% -}% - -%%% -% Papiers -%%% -\setKVdefault[Papiers]{Cinq=true,Seyes=false,Isometrique=false,IsometriquePointe=false,Millimetre=false,Triangle=false,Largeur=5,Hauteur=4,Couleur=black,Grille=-1,GrillePointe=-1,PageEntiere=false,ZoneTexte=false,Baseline=false,CodeAfter=false}% -\defKV[Papiers]{Traces=\setKV[Papiers]{CodeAfter}} - -%\def\MPBaseLineSkip#1#2#3{%à retravailler : ne fonctionne pas :( -% % -% \ifluatex -% \mplibforcehmode -% \begin{mplibcode} -% path horizon,verticon; -% horizon=(0,0)--(#1*cm,0); -% %verticon=(0,0)--(0,#2*cm); -% drawoptions(withcolor #3); -% %for k=0 step 0.5 until #1: -% %draw verticon shifted((k*cm,0)); -% %endfor; -% for k=(#2-(\mpdim{1.6ex}/1cm)) step (-\mpdim{\baselineskip}/1cm) until 0: -% draw horizon shifted((0,k*cm)); -% endfor; -% drawoptions(withcolor blue); -% for k=#2 step (-\mpdim{\baselineskip}/1cm) until 0: -% draw horizon shifted((0,k*cm)); -% endfor; -% \end{mplibcode} -% \fi -%} - -\def\MPGrille#1#2#3#4{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step (#4*100) until (#1*100): - draw verticon shifted(((k/100)*cm,0)); - endfor; - for k=0 step (#4*100) until (#2*100): - draw horizon shifted((0,(k/100)*cm)); - endfor; - \end{mplibcode}% - \else% - \begin{mpost}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 0.5 until #1: - draw verticon shifted((k*cm,0)); - endfor; - for k=0 step 0.5 until #2: - draw horizon shifted((0,k*cm)); - endfor; - \end{mpost}% - \fi% -}% - -\def\MPGrillePointe#1#2#3#4{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - drawoptions(withcolor #3); - for k=0 step (#4*100) until (#1*100): - for l=0 step (#4*100) until (#2*100): - fill (cercles((0,0),1pt) shifted(((k/100)*cm,(l/100)*cm))); - endfor; - endfor; - \end{mplibcode}% - \else% - \begin{mpost}% - drawoptions(withcolor #3); - for k=0 step (#4*100) until (#1*100): - for l=0 step (#4*100) until (#2*100): - fill (cercles((0,0),0.5pt) shifted(((k/100)*cm,(l/100)*cm))); - endfor; - endfor; - \end{mpost}% - \fi% -}% - -\def\MPCinq#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 0.5 until #1: - draw verticon shifted((k*cm,0)); - endfor; - for k=0 step 0.5 until #2: - draw horizon shifted((0,k*cm)); - endfor; - if \useKV[Papiers]{CodeAfter}: - \useKV[Papiers]{Traces}; - fi; - \end{mplibcode}% - \else% - \begin{mpost} - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 0.5 until #1: - draw verticon shifted((k*cm,0)); - endfor; - for k=0 step 0.5 until #2: - draw horizon shifted((0,k*cm)); - endfor; - \end{mpost}% - \fi% -}% - -\def\MPSeyes#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 8 until (#1*10): - draw verticon shifted(((k/10)*cm,0)); - endfor; - for k=0 step 2 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 8 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25; - endfor; - \end{mplibcode}% - \else% - \begin{mpost}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 8 until (#1*10): - draw verticon shifted(((k/10)*cm,0)); - endfor; - for k=0 step 2 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 8 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 1.25; - endfor; - \end{mpost} - \fi% -}% - -\def\MPMillimetre#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 1 until (#1*10): - draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2; - endfor; - for k=0 step 5 until (#1*10): - draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 1 until (#1): - draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25; - endfor; - for k=0 step 1 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2; - endfor; - for k=0 step 5 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 1 until (#2): - draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25; - endfor; - \end{mplibcode}% - \else% - \begin{mpost}% - path horizon,verticon; - horizon=(0,0)--(#1*cm,0); - verticon=(0,0)--(0,#2*cm); - drawoptions(withcolor #3); - for k=0 step 1 until (#1*10): - draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.2; - endfor; - for k=0 step 5 until (#1*10): - draw verticon shifted(((k/10)*cm,0)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 1 until (#1): - draw verticon shifted((k*cm,0)) withpen pencircle scaled 1.25; - endfor; - for k=0 step 1 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.2; - endfor; - for k=0 step 5 until (#2*10): - draw horizon shifted((0,(k/10)*cm)) withpen pencircle scaled 0.5; - endfor; - for k=0 step 1 until (#2): - draw horizon shifted((0,k*cm)) withpen pencircle scaled 1.25; - endfor; - \end{mpost}% - \fi% -}% - -\def\MPIsometrique#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path diagon,antidiagon; - diagon=(0,0)--#2*(sqrt(3)*cm,1*cm); - antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm); - drawoptions(withcolor #3); - for k=0 step 1 until (#1): - draw diagon shifted((k*cm,0)); - draw antidiagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)/3) until (#2): - draw diagon shifted((0,k*cm)); - draw antidiagon shifted((#1*cm,k*cm)); - endfor; - clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); - \end{mplibcode}% - \else% - \begin{mpost}% - path diagon,antidiagon; - diagon=(0,0)--#2*(sqrt(3)*cm,1*cm); - antidiagon=(0,0)--#2*(-sqrt(3)*cm,1*cm); - drawoptions(withcolor #3); - for k=0 step 1 until (#1): - draw diagon shifted((k*cm,0)); - draw antidiagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)/3) until (#2): - draw diagon shifted((0,k*cm)); - draw antidiagon shifted((#1*cm,k*cm)); - endfor; - clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); - \end{mpost}% - \fi% -}% - -\def\MPIsometriquePointe#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - pair diagon,antidiagon; - diagon=(1pt,1pt); - antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3)); - drawoptions(withcolor #3); - for k=0 step (sqrt(3)/3) until (#2): - for l=0 step 1 until (#1): - fill (cercles(diagon,1pt) shifted((l*cm,k*cm))); - fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm))); - endfor; - endfor; - clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt)); - \end{mplibcode}% - \else% - \begin{mpost}% - pair diagon,antidiagon; - diagon=(1pt,1pt); - antidiagon=(1pt+0.5cm,1pt+0.5*(sqrt(3)*1cm/3)); - drawoptions(withcolor #3); - for k=0 step (sqrt(3)/3) until (#2): - for l=0 step 1 until (#1): - fill (cercles(diagon,1pt) shifted((l*cm,k*cm))); - fill (cercles(antidiagon,1pt) shifted((l*cm,k*cm))); - endfor; - endfor; - clip currentpicture to polygone((0,0),(#1*cm+2pt,0),(#1*cm+2pt,#2*cm+1pt),(0,#2*cm+1pt)); - \end{mpost}% - \fi% -}% - -\def\MPTriangulaire#1#2#3{% - \ifluatex% - \mplibforcehmode% - \begin{mplibcode}% - path horizon,diagon,antidiagon; - horizon=(0,0)--(#1*cm,0); - diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm); - antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm); - drawoptions(withcolor #3); - for k=0 step 1 until #1: - draw diagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)) until (#2): - draw diagon shifted((0,k*cm)); - endfor; - for k=0 step 1 until (#1): - draw antidiagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)) until (#2): - draw antidiagon shifted((#1*cm,k*cm)); - endfor; - for k=0 step (sqrt(3)/2) until (#2): - draw horizon shifted((0,k*cm)); - endfor; - clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); - \end{mplibcode}% - \else% - \begin{mpost}% - path horizon,diagon,antidiagon; - horizon=(0,0)--(#1*cm,0); - diagon=(0,0)--#2*(sqrt(3)*cm/3,1*cm); - antidiagon=(0,0)--#2*(-sqrt(3)*cm/3,1*cm); - drawoptions(withcolor #3); - for k=0 step 1 until #1: - draw diagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)) until (#2): - draw diagon shifted((0,k*cm)); - endfor; - for k=0 step 1 until (#1): - draw antidiagon shifted((k*cm,0)); - endfor; - for k=0 step (sqrt(3)) until (#2): - draw antidiagon shifted((#1*cm,k*cm)); - endfor; - for k=0 step (sqrt(3)/2) until (#2): - draw horizon shifted((0,k*cm)); - endfor; - clip currentpicture to polygone((0,0),(#1*cm,0),(#1*cm,#2*cm),(0,#2*cm)); - \end{mpost}% - \fi% -}% - -\RequirePackage{ifoddpage} - -\newlength{\PapierLeftCurrent} - -\newcommand\Papiers[1][]{% - \useKVdefault[Papiers]% - \setKV[Papiers]{#1}% - \xdef\PapierLargeur{\useKV[Papiers]{Largeur}}% - \xdef\PapierHauteur{\useKV[Papiers]{Hauteur}}% - \xdef\PapierCouleur{\useKV[Papiers]{Couleur}}% - \xdef\PapierGrille{\useKV[Papiers]{Grille}}% - \xdef\PapierGrillePointe{\useKV[Papiers]{GrillePointe}}% - \ifboolKV[Papiers]{ZoneTexte}{% - \checkoddpage\ifoddpage% - \setlength{\PapierLeftCurrent}{\oddsidemargin}% - \else% - \setlength{\PapierLeftCurrent}{\evensidemargin}% - \fi% - \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% - \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% - \xdef\PapierHauteur{\fpeval{\textheight/1cm}}% - \xdef\PapierLargeur{\fpeval{\textwidth/1cm}}% - \begin{tikzpicture}[remember picture,overlay]% - \node[anchor=south west,inner sep=0pt,transform canvas={xshift=\PapierLeft,yshift=\PapierBottom}] at (current page.south west) {% - \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% - \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% - }{% - \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% - \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% - }{\ifboolKV[Papiers]{Baseline}{% - \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{% - \ifboolKV[Papiers]{IsometriquePointe}{% - \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{% - \ifboolKV[Papiers]{Triangle}{% - \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Millimetre}{% - \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Isometrique}{% - \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Seyes}{% - \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }% - }% - }% - }% - }% - }% - }% - }% - };% - \end{tikzpicture}% - }{% - \ifboolKV[Papiers]{PageEntiere}{% - \checkoddpage\ifoddpage% - \setlength{\PapierLeftCurrent}{\oddsidemargin}% - \else% - \setlength{\PapierLeftCurrent}{\evensidemargin}% - \fi% - \xdef\PapierLeft{\the\dimexpr1in+\PapierLeftCurrent}% - \xdef\PapierBottom{\fpeval{\paperheight-\textheight-\voffset-\headheight-\topmargin-\headsep-1in}}% - \xdef\PapierHauteur{\fpeval{\paperheight/1cm}}% - \xdef\PapierLargeur{\fpeval{\paperwidth/1cm}}% - \begin{tikzpicture}[remember picture,overlay]% - \node[anchor=south west,inner sep=0pt] at (current page.south west) {% - \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% - \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% - }{% - \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% - \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% - }{\ifboolKV[Papiers]{IsometriquePointe}{% - \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Triangle}{% - \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Millimetre}{% - \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Isometrique}{% - \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Seyes}{% - \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }% - }% - }% - }% - }% - }% - }% - };% - \end{tikzpicture}% - }{% - \xintifboolexpr{\useKV[Papiers]{GrillePointe}>0}{% - \MPGrillePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrillePointe}% - }{% - \xintifboolexpr{\useKV[Papiers]{Grille}>0}{% - \MPGrille{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}{\PapierGrille}% - }{\ifboolKV[Papiers]{Baseline}{% - \MPBaseLineSkip{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{% - \ifboolKV[Papiers]{IsometriquePointe}{% - \MPIsometriquePointe{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{% - \ifboolKV[Papiers]{Triangle}{% - \MPTriangulaire{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Millimetre}{% - \MPMillimetre{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Isometrique}{% - \MPIsometrique{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\ifboolKV[Papiers]{Seyes}{% - \MPSeyes{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }{\MPCinq{\PapierLargeur}{\PapierHauteur}{\PapierCouleur}% - }% - }% - }% - }% - }% - }% - }% - }% - }% - }% -}% - -%%%% -% Scratch -%%%% -\newlength{\longbarreheight} -\setlength{\longbarreheight}{2.1ex+3pt} - -\newlength{\longbarredepth} -\setlength{\longbarredepth}{0.9ex+3pt} -\def\longbarre{\vrule height\longbarreheight depth\longbarredepth width0pt}% - -\def\barre{\vrule height2.1ex depth.9ex width0pt}% -\def\demibarre{\vrule height1.4ex depth.6ex width0pt}% - -\setKVdefault[Scratch]{Impression=false,Numerotation=false,Echelle=1,Naturel=false}% - -\ifluatex -\NewDocumentEnvironment{Scratch}{o +b}{% - \useKVdefault[Scratch]% - \setKV[Scratch]{#1}% - \mplibforcehmode% - \ifboolKV[Scratch]{Naturel}{}{\myfontScratch}% - \begin{mplibcode}% - boolean Naturel; - Naturel=\useKV[Scratch]{Naturel}; - if Naturel: input PfCPseudo; print:=true; else: input PfCScratch; print:=\useKV[Scratch]{Impression}; fi; - NumeroteLignes:=\useKV[Scratch]{Numerotation};% - #2% - picture recap;% - recap:=currentpicture scaled \useKV[Scratch]{Echelle};% - currentpicture:=nullpicture;% - draw recap;% - \end{mplibcode}% - }{} -\else% -\NewDocumentEnvironment{Scratch}{o +b}{% - \setKV[Scratch]{#1}% - \begin{mpost}[mpsettings={boolean Naturel;Naturel=\useKV[Scratch]{Naturel};if Naturel: input PfCPseudo; print:=true; else: input PfCScratchpdf; print:=\useKV[Scratch]{Impression}; fi;NumeroteLignes:=\useKV[Scratch]{Numerotation};Echelle:=\useKV[Scratch]{Echelle};}]% - #2% - picture recap;% - recap:=currentpicture scaled Echelle;% - currentpicture:=nullpicture;% - draw recap;% - \end{mpost} -}{}% -\fi% +\input{PfCEcritureUnites} +\input{PfCTableauxUnites} +\input{PfCCartesJeux} +\input{PfCRepresenterTableur} +\input{PfCDomino} +\input{PfCProgrammeCalcul} +\input{PfCPapiers} +\input{PfCScratch}
\ No newline at end of file |