% proflycee-tools-analyse.tex % Copyright 2023-2025 Cédric Pierquet % Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt %===trad fr/en ok %===correction d'un bug sur la raacine carrée... le cas où ça fait 1 ! %%------SimplFrac nouvelle version latex3 \ExplSyntaxOn \NewDocumentCommand\ConversionFraction{ s O{} m }{ % * = moins sur le numérateur % #2 = argument optionnel [d/t/n/dec=...] % #3 = argument mandataire {calcul ou fraction} % Calcul et transformation en A/B \tl_set:Ne \l_tmpa_tl { \xintPRaw { \xintIrr { \xinteval{#3} } } } % Test si le symbole / apparaît (fraction ou entier) \tl_if_in:NnTF \l_tmpa_tl { / } { % C'est une fraction % Extraction du numérateur et dénominateur \seq_set_split:NnV \l_tmpa_seq { / } \l_tmpa_tl \tl_set:Ne \l_numerateur_tl { \seq_item:Nn \l_tmpa_seq { 1 } } \tl_set:Ne \l_denominateur_tl { \seq_item:Nn \l_tmpa_seq { 2 } } % Traitement selon l'argument optionnel \tl_if_empty:nTF {#2} { % Pas d'argument optionnel : \frac par défaut \IfBooleanTF{#1} { \ensuremath{ \frac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } { \fp_compare:nNnTF { \l_numerateur_tl } < { 0 } { \ensuremath{ -\frac{\num{\fpeval{abs(\l_numerateur_tl)}}}{\num{\l_denominateur_tl}} } } { \ensuremath{ \frac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } } } { % Argument optionnel présent \str_case:nnF {#2} { {d} { % \dfrac \IfBooleanTF{#1} { \ensuremath{ \dfrac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } { \fp_compare:nNnTF { \l_numerateur_tl } < { 0 } { \ensuremath{ -\dfrac{\num{\fpeval{abs(\l_numerateur_tl)}}}{\num{\l_denominateur_tl}} } } { \ensuremath{ \dfrac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } } } {t} { % \tfrac \IfBooleanTF{#1} { \ensuremath{ \tfrac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } { \fp_compare:nNnTF { \l_numerateur_tl } < { 0 } { \ensuremath{ -\tfrac{\num{\fpeval{abs(\l_numerateur_tl)}}}{\num{\l_denominateur_tl}} } } { \ensuremath{ \tfrac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } } } {n} { % \nicefrac \ensuremath{ \nicefrac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } } { % Cas par défaut : vérifier si "dec" est présent \tl_if_in:nnTF {#2} { dec } { % Forme décimale \tl_if_in:nnTF {#2} { = } { % Précision spécifiée \tl_set:Nn \l_tmpb_tl {#2} \seq_set_split:NnV \l_tmpb_seq { = } \l_tmpb_tl \tl_set:Ne \l_precdecimal_tl { \seq_item:Nn \l_tmpb_seq { 2 } } \ensuremath{ \num{ \xintfloateval{ round(#3,\l_precdecimal_tl) } } } } { % Pas de précision \ensuremath{ \num{ \xintfloateval{#3} } } } } { % Argument optionnel non reconnu : comportement par défaut \IfBooleanTF{#1} { \ensuremath{ \frac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } { \fp_compare:nNnTF { \l_numerateur_tl } < { 0 } { \ensuremath{ -\frac{\num{\fpeval{abs(\l_numerateur_tl)}}}{\num{\l_denominateur_tl}} } } { \ensuremath{ \frac{\num{\l_numerateur_tl}}{\num{\l_denominateur_tl}} } } } } } } } { % C'est un entier \num{\l_tmpa_tl} } } \ExplSyntaxOff %%------AideTds \defKV[aidetds]{% Code=\def\tdsparam{#1},code=\def\tdsparam{#1},% Couleur=\def\tdscouleur{#1},color=\def\tdscouleur{#1},% Racines=\def\tdsracine{#1},roots=\def\tdsracine{#1},% Largeur=\def\tdslarg{#1},width=\def\tdslarg{#1},% Hauteur=\def\tdshaut{#1},height=\def\tdshaut{#1} } \setKVdefault[aidetds]{% Code=da+,code=da+, Couleur=red,color=red,% Largeur=2,width=2,% Hauteur=1,height=1,% Cadre=true,border=true,% Racines=2,roots=2 } \NewDocumentCommand\schematdsaff{ s m m m m }{%pour les droites (interne) % * = étoilée -> a négatif % #2 = couleur % #3 = largeur % #4 = hauteur % #5 = racine \IfBooleanTF{#1}%si étoile := droite qui descend {% \def\possgnavant{above right}\def\possgnapres{below left}\def\sgnavant{\strut+}\def\sgnapres{\strut-}% \draw[thick,#2] ({-0.5*#3},{0.5*#4})--({0.5*#3},{-0.5*#4}); } {% \def\possgnavant{below right}\def\possgnapres{above left}\def\sgnavant{\strut-}\def\sgnapres{\strut+}% \draw[thick,#2] ({-0.5*#3},{-0.5*#4})--({0.5*#3},{0.5*#4}); } \draw[#2] ({-0.5*#3},0) node[inner sep=0pt,\possgnavant=1pt,font=\scriptsize] {\textcircled{$\sgnavant$}}; \draw[#2] ({0.5*#3},0) node[inner sep=0pt,\possgnapres=1pt,font=\scriptsize] {\textcircled{$\sgnapres$}}; \draw[#2] (0,0) node[inner sep=0pt,above=3pt,font=\scriptsize] {$\strut#5$} ; \filldraw[#2] (0,0) circle[radius=2pt] ; } \NewDocumentCommand\schematdsexpo{ s m m m }{%pour les expos (interne) % * = étoilée -> a négatif % #2 = couleur % #3 = largeur % #4 = hauteur \IfBooleanTF{#1}%si étoile := expo 'décroissante' {% \draw[thick,#2] ({-0.45*#3},{0.5*#4}) to[out=-75,in=179] ({0.5*#3},{-0.325*#4}); } {%sinon := expo 'croissante' \draw[thick,#2] ({-0.5*#3},{-0.325*#4}) to[out=1,in=-105] ({0.5*#3},{0.5*#4}); } \draw[#2] ({0},{0}) node[inner sep=0pt,above=0pt,font=\scriptsize] {\textcircled{$+$}};. } \NewDocumentCommand\schematdsexposol{ s m m m o }{%pour les expos avec solution (interne) % * = étoilée -> a négatif % #2 = couleur % #3 = largeur % #4 = hauteur % #5 = racine \IfBooleanTF{#1}%si étoile := expo 'décroissante' {% \draw[thick,#2] ({-0.35*#3},{0.5*#4}) to[out=-75,in=179] ($({0.5*#3},{-0.325*#4})+(2mm,0)$) ; \filldraw[#2] ({-0.1925*#3},0) circle[radius=2pt] ; \draw[#2] ({0.5*#3},{-0.1625*#4}) node[inner sep=0pt,left=2pt,font=\scriptsize] {\textcircled{$-$}} ; \draw[#2] ({-0.5*#3},{0.25*#4}) node[inner sep=0pt,right=1pt,font=\scriptsize] {\textcircled{$+$}} ; \draw[#2] ({-0.1925*#3},0) node[inner sep=0pt,below left=1pt,font=\scriptsize] {$\strut#5$} ; } {%sinon := expo 'croissante' \draw[thick,#2] ({-0.5*#3},{-0.325*#4}) to[out=1,in=-105] ({0.35*#3},{0.5*#4}); \filldraw[#2] ({0.1925*#3},0) circle[radius=2pt] ; \draw[#2] ({0.5*#3},{0.25*#4}) node[inner sep=0pt,left=1pt,font=\scriptsize] {\textcircled{$+$}} ; \draw[#2] ({-0.5*#3},{-0.1625*#4}) node[inner sep=0pt,right=2pt,font=\scriptsize] {\textcircled{$-$}} ; \draw[#2] ({0.1925*#3},0) node[inner sep=0pt,above left=1pt,font=\scriptsize] {$\strut#5$} ; } } \NewDocumentCommand\schematdslnsol{ s m m m o }{%pour les ln avec solution (interne) % * = étoilée -> a négatif % #2 = couleur % #3 = largeur % #4 = hauteur % #5 = racine \IfBooleanTF{#1}%si étoile := ln 'décroissante' {% %\draw[thick,#2] ({-0.35*#3},{0.5*#4}) to[out=75,in=179] ($({0.5*#3},{0.325*#4})+(2mm,0)$) ; %\filldraw[#2] ({-0.1925*#3},0) circle[radius=2pt] ; %\draw[#2] ({-0.5*#3},{-0.25*#4}) node[inner sep=0pt,right=1pt,font=\scriptsize] {\textcircled{$-$}} ; %\draw[#2] ({0.5*#3},{0.5*0.325*#4}) node[inner sep=0pt,left=1pt,font=\scriptsize] {\textcircled{$+$}} ; %\draw[thick,#2] ({-0.35*#3},{0.5*#4}) to[out=-75,in=179] ($({0.5*#3},{-0.325*#4})+(2mm,0)$) ; %\filldraw[#2] ({-0.1925*#3},0) circle[radius=2pt] ; %\draw[#2] ({0.5*#3},{-0.1625*#4}) node[inner sep=0pt,left=2pt,font=\scriptsize] {\textcircled{$-$}} ; %\draw[#2] ({-0.5*#3},{0.25*#4}) node[inner sep=0pt,right=1pt,font=\scriptsize] {\textcircled{$+$}} ; } {%sinon := ln 'croissante' \draw[thick,#2] ({-0.35*#3},{-0.5*#4}) to[out=75,in=-175] ($({0.5*#3},{0.45*#4})+(2mm,0)$) ; \filldraw[#2] ({-0.1975*#3},0) circle[radius=2pt] ; \draw[#2] ({-0.5*#3},{-0.25*#4}) node[inner sep=0pt,right=1pt,font=\scriptsize] {\textcircled{$-$}} ; \draw[#2] ({0.5*#3},{0.5*0.425*#4}) node[inner sep=0pt,left=1pt,font=\scriptsize] {\textcircled{$+$}} ; \draw[#2] ({-0.1925*#3},0) node[inner sep=0pt,above left=1pt,font=\scriptsize] {$\strut#5$} ; } } \NewDocumentCommand\schematdsparab{ m m m m m o }{%pour les paraboles (interne) % #1 = signe de a (1 ou -1) ? % #2 = couleur % #3 = largeur % #4 = hauteur % #5 = nb racine % #6 = liste racines (option) \xintifboolexpr{ #1 > 0 'and' #5 == 2 } %a>0 et delta>0 {% \pflcutandsplit[mac]{#6}{/}{\xun}{\xdeux}%[mac] non utile ? %\saveexpandmode\expandarg %\StrCut{#6}{/}{\xun}{\xdeux} %\restoreexpandmode \draw[thick,#2] ({-0.375*#3},{0.5*#4}) parabola bend (0,{-0.5*#4}) ({0.375*#3},{0.5*#4}) ; \draw[#2] ({-0.5*#3},0) node[above right=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut+$}}; \draw[#2] ({0.5*#3},0) node[above left=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut+$}}; \draw[#2] (0,0) node[below=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut-$}}; \filldraw[#2] ({0.2625*#3},0) circle[radius=2pt] node[below right=1pt,inner sep=0pt,font=\scriptsize] {$\strut\xdeux$}; \filldraw[#2] ({-0.2625*#3},0) circle[radius=2pt] node[below left=1pt,inner sep=0pt,font=\scriptsize] {$\strut\xun$};% } {} \xintifboolexpr{ #1 < 0 'and' #5 == 2 } %a<0 et delta>0 {% \pflcutandsplit[mac]{#6}{/}{\xun}{\xdeux}%[mac] non utile ? % \saveexpandmode\expandarg % \StrCut{#6}{/}{\xun}{\xdeux} % \restoreexpandmode \draw[thick,#2] ({-0.375*#3},{-0.5*#4}) parabola bend (0,{0.5*#4}) ({0.375*#3},{-0.5*#4}) ; \draw[#2] ({-0.5*#3},0) node[below right=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut-$}}; \draw[#2] ({0.5*#3},0) node[below left=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut-$}}; \draw[#2] (0,0) node[above=1pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut+$}}; \filldraw[#2] ({0.2625*#3},0) circle[radius=2pt] node[above right=1pt,inner sep=0pt,font=\scriptsize] {$\strut\xdeux$}; \filldraw[#2] ({-0.2625*#3},0) circle[radius=2pt] node[above left=1pt,inner sep=0pt,font=\scriptsize] {$\strut\xun$};% } {} \xintifboolexpr{ #1 > 0 'and' #5 == 1 } %a>0 et delta=0 {% \draw[thick,#2] ({-0.375*#3},{0.5*#4}) parabola bend (0,0) ({0.375*#3},{0.5*#4}) ; \filldraw[#2] (0,0) circle[radius=2pt] node[below=3pt,inner sep=1pt,font=\scriptsize] {$#6$}; \draw[#2] (0,0) node[above=3pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut+$}}; } {} \xintifboolexpr{ #1 < 0 'and' #5 == 1 } %a>0 et delta=0 {% \draw[thick,#2] ({-0.375*#3},{-0.5*#4}) parabola bend (0,0) ({0.375*#3},{-0.5*#4}) ; \filldraw[#2] (0,0) circle[radius=2pt] node[above=3pt,inner sep=0pt,font=\scriptsize] {$#6$}; \draw[#2] (0,0) node[below=3pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut-$}}; } {} \xintifboolexpr{ #1 > 0 'and' #5 == 0 } %a>0 et delta<0 {% \draw[thick,#2] ({-0.375*#3},{0.5*#4}) parabola bend (0,{0.075*#4}) ({0.375*#3},{0.5*#4}) ; \draw[#2] (0,{0.075*#4}) node[above=2pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut+$}}; } {} \xintifboolexpr{ #1 < 0 'and' #5 == 0 } %a>0 et delta<0 {% \draw[thick,#2] ({-0.375*#3},{-0.5*#4}) parabola bend (0,{-0.075*#4}) ({0.375*#3},{-0.5*#4}) ; \draw[#2] (0,{-0.075*#4}) node[below=2pt,inner sep=0pt,font=\scriptsize] {\textcircled{$\strut-$}}; } {} } \NewDocumentCommand\MiniSchemaSignes{ s O{} D<>{} }{% \useKVdefault[aidetds]% \setKV[aidetds]{#2}% %en/fr \setKVbooltruedefaultmulti[aidetds]{border}{Cadre}% %simplification des codes \IfEq{\tdsparam}{da+}{\def\xcode{1}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{da-}{\def\xcode{-1}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa+d+}{\def\xcode{12}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa-d+}{\def\xcode{-12}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa+d0}{\def\xcode{11}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa-d0}{\def\xcode{-11}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa+d-}{\def\xcode{10}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{pa-d-}{\def\xcode{-10}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{expo+}{\def\xcode{20}\def\xcodehautaxe{-0.35}}{}% \IfEq{\tdsparam}{expo-}{\def\xcode{-20}\def\xcodehautaxe{-0.35}}{}% \IfEq{\tdsparam}{exposol+}{\def\xcode{30}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{exposol-}{\def\xcode{-30}\def\xcodehautaxe{0}}{}% \IfEq{\tdsparam}{lnsol+}{\def\xcode{40}\def\xcodehautaxe{0}}{}% %\IfEq{\tdsparam}{lnsol-}{\def\xcode{-40}\def\xcodehautaxe{0}}{} %si commande étoilée := commande autonome \IfBooleanTF{#1}% {\begin{tikzpicture}[#3,>=latex]}{}% %cadre si booléen true \ifboolKV[aidetds]{Cadre}% {\draw[lightgray] ({-0.5*\tdslarg},{-0.5*\tdshaut}) rectangle ({0.55*\tdslarg},{0.5*\tdshaut}) ;}% {}% %restriction de la petite fenêtre \clip ({-0.5*\tdslarg},{-0.5*\tdshaut}) rectangle ({0.55*\tdslarg},{0.5*\tdshaut}) ; %axe (Ox) \draw[semithick,->,>=latex] ({-0.5*\tdslarg},{\xcodehautaxe*(\tdshaut)})--({0.55*\tdslarg},{\xcodehautaxe*(\tdshaut)}); %1er degré a+ code = 1 \ifnum\xcode=1 \schematdsaff{\tdscouleur}{\tdslarg}{\tdshaut}{\tdsracine} \fi %1er degré a- code = -1 \ifnum\xcode=-1 \schematdsaff*{\tdscouleur}{\tdslarg}{\tdshaut}{\tdsracine} \fi %2d degré a+delta+ code = 12 \ifnum\xcode=12 \schematdsparab{1}{\tdscouleur}{\tdslarg}{\tdshaut}{2}[\tdsracine] \fi %2d degré a-delta+ code = -12 \ifnum\xcode=-12 \schematdsparab{-1}{\tdscouleur}{\tdslarg}{\tdshaut}{2}[\tdsracine] \fi %2d degré a+delta0 code = 11 \ifnum\xcode=11 \schematdsparab{1}{\tdscouleur}{\tdslarg}{\tdshaut}{1}[\tdsracine] \fi %2d degré a-delta0 code = -11 \ifnum\xcode=-11 \schematdsparab{-1}{\tdscouleur}{\tdslarg}{\tdshaut}{1}[\tdsracine] \fi %2d degré a+delta- code = 10 \ifnum\xcode=10 \schematdsparab{1}{\tdscouleur}{\tdslarg}{\tdshaut}{0} \fi %2d degré a-delta- code = -10 \ifnum\xcode=-10 \schematdsparab{-1}{\tdscouleur}{\tdslarg}{\tdshaut}{0} \fi %expo croissante code = 20 \ifnum\xcode=20 \schematdsexpo{\tdscouleur}{\tdslarg}{\tdshaut} \fi %expo décroissante code = -20 \ifnum\xcode=-20 \schematdsexpo*{\tdscouleur}{\tdslarg}{\tdshaut} \fi %expo avec solution (croissante) code = 30 \ifnum\xcode=30 \schematdsexposol{\tdscouleur}{\tdslarg}{\tdshaut}[\tdsracine] \fi %expo avec solution (décroissante) code = -30 \ifnum\xcode=-30 \schematdsexposol*{\tdscouleur}{\tdslarg}{\tdshaut}[\tdsracine] \fi %ln avec solution (croissante) code = 40 \ifnum\xcode=40 \schematdslnsol{\tdscouleur}{\tdslarg}{\tdshaut}[\tdsracine] \fi %ln avec solution (décroissante) code = -40 %\ifnum\xcode=-40 % \schematdslnsol*{\tdscouleur}{\tdslarg}{\tdshaut}[\tdsracine] %\fi \IfBooleanTF{#1}% {\end{tikzpicture}}{}% } \NewCommandCopy\pflschemasignes\MiniSchemaSignes \NewCommandCopy\pflminisignplot\MiniSchemaSignes %pour l'interaction avec tkz-tab \defKV[aidetdstkz]{% Echelle=\def\tdstkzscale{#1},scale=\def\tdstkzscale{#1},% Decal=\def\tdstkzoffset{#1},offset=\def\tdstkzoffset{#1},% } \setKVdefault[aidetdstkz]{% Echelle=1,scale=1,% Decal=1.25,offset=1.25 } \NewDocumentCommand\MiniSchemaSignesTkzTab{ o m O{0.85} O{1.5} }{% %#1 = codeaidetikz %#2 = numligne %#3 = échelle %#4 = décalage %\shorthandoff{:}\shorthandoff{!} %bizzzzzzzzare %\NoAutoSpacing \coordinate (ZZZ) at ($(T2#2)!.5!(T2\the\numexpr#2+1\relax)$) ; %\shorthandon{:}\shorthandon{!} \path (ZZZ.east) + (#4,0) pic[right,scale=#3,every node/.style={scale=#3}] {code={\MiniSchemaSignes[#1]}} ; } \NewCommandCopy\pflschemasignestkztab\MiniSchemaSignesTkzTab \NewCommandCopy\pflminisignplottkztab\MiniSchemaSignesTkzTab %%------TVISOLUTION \defKV[dichoto]{% NomFct=\def\DHTnomfct{#1},fct name=\def\DHTnomfct{#1},% va=\def\DHTva{#1},% vb=\def\DHTvb{#1},% Precision=\def\DHTprec{#1},prec=\def\DHTprec{#1},% NomSol=\def\DHTnomsol{#1},sol name=\def\DHTnomsol{#1},% Stretch=\def\DHTstretch{#1},stretch=\def\DHTstretch{#1} } \setKVdefault[dichoto]{% NomFct=f,fct name=f,% Precision=2,prec=2,% NomSol=\alpha,sol name=\alpha,% Stretch=1.15,stretch=1.15,% Balayage=false,sweep=false,% Calculatrice=false,calculator=false,% Majuscule=true,capital=true } \makeatletter \newcommand\SolutionTVI[3][]{% \useKVdefault[dichoto]% \setKV[dichoto]{#1}% %en/fr \setKVboolfalsedefaultmulti[dichoto]{sweep}{Balayage}% \setKVboolfalsedefaultmulti[dichoto]{calculator}{Calculatrice}% \setKVbooltruedefaultmulti[dichoto]{capital}{Majuscule}% %multilng \if@pfllngfr \def\labelsolutionseuilbalayage{ar balayage, on obtient~} \def\labelsolutionseuilbalayagemaj{P} \def\labelsolutionseuilbalayagemin{p} % \def\labelsolutionseuilcalc{ar calculatrice, on obtient~} \def\labelsolutionseuilcalcmaj{P} \def\labelsolutionseuilcalcmin{p} % \def\labelsolutionseuilet{~et~} \fi \if@pfllngen \def\labelsolutionseuilbalayage{y sweeping, we obtain~} \def\labelsolutionseuilbalayagemaj{B} \def\labelsolutionseuilbalayagemin{b} % \def\labelsolutionseuilcalc{ith a calculator, we get~} \def\labelsolutionseuilcalcmaj{W} \def\labelsolutionseuilcalcmin{w} % \def\labelsolutionseuilet{~and~} \fi \if@pfllngde \def\labelsolutionseuilbalayage{it einer Sweep-Methode ergibt sich~} \def\labelsolutionseuilbalayagemaj{M} \def\labelsolutionseuilbalayagemin{m} % \def\labelsolutionseuilcalc{it dem Taschenrechner erhält man~} \def\labelsolutionseuilcalcmaj{M} \def\labelsolutionseuilcalcmin{m} % \def\labelsolutionseuilet{~und~} \fi \if@pfllnges \def\labelsolutionseuilbalayage{ediante un barrido, se obtiene~} \def\labelsolutionseuilbalayagemaj{M} \def\labelsolutionseuilbalayagemin{m} % \def\labelsolutionseuilcalc{on la calculadora, se obtiene~} \def\labelsolutionseuilcalcmaj{C} \def\labelsolutionseuilcalcmin{c} % \def\labelsolutionseuilet{~y~} \fi %next \xintdeffloatfunc varfct(x) := #2 ;% \ifboolKV[dichoto]{Balayage}{\ifboolKV[dichoto]{Majuscule}{\labelsolutionseuilbalayagemaj}{\labelsolutionseuilbalayagemin}\labelsolutionseuilbalayage}{}% \ifboolKV[dichoto]{Calculatrice}{\ifboolKV[dichoto]{Majuscule}{\labelsolutionseuilcalcmaj}{\labelsolutionseuilcalcmin}\labelsolutionseuilcalc}{}% \ensuremath{% \left\lbrace \begin{tblr}{stretch=\DHTstretch,colsep=1pt,colspec={rll}}% {\DHTnomfct}{\left( \num{\DHTva} \right)} &\approx \num[minimum-decimal-digits=\DHTprec]{\xintFloatToDecimal{\xintfloateval{round(varfct(\DHTva),\DHTprec)}}} & \xintifGt{\xintfloateval{varfct(\DHTva)-#3}}{0}{> \num{#3}}{< \num{#3}} \: \\ % {\DHTnomfct}{\left( \num{\DHTvb} \right)} &\approx \num[minimum-decimal-digits=\DHTprec]{\xintFloatToDecimal{\xintfloateval{round(varfct(\DHTvb),\DHTprec)}}} & \xintifGt{\xintfloateval{varfct(\DHTvb)-#3}}{0}{> \num{#3}}{< \num{#3}} \:% \end{tblr}% \right|% \Rightarrow% \num{\DHTva} < \DHTnomsol < \num{\DHTvb}% }% } \makeatother \NewCommandCopy\pflsoltvi\SolutionTVI \NewCommandCopy\pflivtsol\SolutionTVI %%------SIMPLIFRACINES \DeclareDocumentCommand\SimplificationRacine{ m }{% argument mandataire {calcul ou fraction} \xdef\calculargument{\xintIrr{\xinteval{#1}}}% \xintifboolexpr{\calculargument == 1}% {% \ensuremath{1}% }% {% \IfEndWith{\calculargument}{/1}% {%si c'est un entier ! \xdef\calculargument{\xintiieval{#1}}% \xdef\ExtractRacStop{\xintiFloor{\xintfloateval{sqrt(\calculargument)}}}% \xintFor* ##1 in {\xintSeq{1}{\ExtractRacStop}}\do{% \xintifboolexpr{ \xintiiRem{\calculargument}{\xintiieval{##1*##1}} == 0}%si le carré divise {\xdef\ExtractRacID{##1}}% {}% }% \xdef\ExtracReste{\xintiieval{\calculargument/(\ExtractRacID*\ExtractRacID)}}% \ensuremath{\xintifboolexpr{\ExtractRacID == 1 && \ExtracReste == 1}% {1}% { \xintifboolexpr{\ExtractRacID == 1}{}{\num{\xintiieval{\ExtractRacID}}}% \xintifboolexpr{\ExtracReste == 1}{}{\sqrt{\num{\ExtracReste}}} }}% % }% }% {%on va mettre sous forme a\sqrt(d)/b := buggue avec des millièmes... \StrBefore{\calculargument}{/}[\numerateur]%on extrait le numérateur \StrBehind{\calculargument}{/}[\denominateur]%on extrait le dénominateur \xdef\ExtractRacNNum{\xintiieval{\numerateur*\denominateur}}% \xdef\ExtractRacStop{\xintiFloor{\xintfloateval{sqrt(\ExtractRacNNum)}}}% \xintFor* ##1 in {\xintSeq{1}{\ExtractRacStop}}\do{% \xintifboolexpr{ \xintiiRem{\ExtractRacNNum}{\xintiieval{##1*##1}} == 0}%si le carré divise {\xdef\ExtractRacID{##1}}% {} }% \xdef\ExtractRacGCD{\xintiiGCD{\ExtractRacID}{\denominateur}}% \xdef\RacNumSimpl{\xintiieval{\ExtractRacID/\ExtractRacGCD}}%simpl num \xdef\RacDenomSimpl{\xintiieval{\denominateur/\ExtractRacGCD}}% \xdef\RacRacSimpl{\xintiieval{\ExtractRacNNum/(\ExtractRacID*\ExtractRacID)}}% \ensuremath{\frac{% \xintifboolexpr{\RacNumSimpl == 1 && \RacRacSimpl == 1}% {1}% { \xintifboolexpr{\RacNumSimpl == 1}{}{\RacNumSimpl} \xintifboolexpr{\RacRacSimpl == 1}{}{\sqrt{\num{\RacRacSimpl}}} }% }% { \RacDenomSimpl }}% }% }% } %%------DICHOTOMIE \defKV[SolDichoto]{% Precision=\def\DICHOTOstep{#1},prec=\def\DICHOTOstep{#1},% Intervalle=\def\DICHOTOinterv{#1},interval=\def\DICHOTOinterv{#1},% Variable=\def\DICHOTOvar{#1},var=\def\DICHOTOvar{#1} } \setKVdefault[SolDichoto]{% Precision=2,prec=2,% Variable=x,var=x,% Intervalle={0:10},interval={0:10} } \NewDocumentCommand\ResolutionApprochee{ O{} m O{masolution} }{%1=options,2=equation,3=macro \useKVdefault[SolDichoto]% %extraction fonction + valeur \setKV[SolDichoto]{#1}% \IfSubStr{#2}{=}%on coupe mmb gauche / mmb droit {\StrCut{#2}{=}{\SolDiFCT}{\SolDiVal}}% {\xdef\SolDiFCT{#2}\xdef\SolDiVal{0}}% %création des variables temporaires \xintdeffloatfunc dichotovarfct(\DICHOTOvar) := \SolDiFCT ;% \StrCut{\DICHOTOinterv}{:}{\varvala}{\varvalb}% \xdef\varstep{\fpeval{10**(-\DICHOTOstep-1)}}%un chiffre en plus :-) %boucles \whiledo{\xintGt{\xintfloateval{\varvalb-\varvala-\varstep}}{0} = 1}% {% \xdef\varvalm{\xintfloateval{(\varvala+\varvalb)*0.5}}% \xintifboolexpr{\xintGt{\xintfloateval{(dichotovarfct(\varvala)-\SolDiVal)*(dichotovarfct(\varvalm)-\SolDiVal)}}{0}==1}% {\xdef\varvala{\fpeval{\varvalm}}}% {\xdef\varvalb{\fpeval{\varvalm}}}% }% \xdef\varvalm{\xintfloateval{(\varvala+\varvalb)*0.5}}% \xdef\vartmpmd{\fpeval{floor(\varvalm,\DICHOTOstep)}}% \xdef\vartmpme{\fpeval{\vartmpmd+10**(-\DICHOTOstep)}}% %les variables créées \expandafter\def\csname#3d\endcsname{\fpeval{\vartmpmd}}% \expandafter\def\csname#3e\endcsname{\fpeval{\vartmpme}}% %valeur approchée \expandafter\def\csname#3a\endcsname{\fpeval{round(\varvalm,\DICHOTOstep)}}% } \NewCommandCopy\pflresolapproch\ResolutionApprochee \NewCommandCopy\pflapproxsol\ResolutionApprochee %==taux acroissement== \defKV[tauxaccroiss]{% Precision=\def\TauxAccroisPrec{#1},prec=\def\TauxAccroisPrec{#1},% Signe=\def\TauxAccroisEqual{#1},sign=\def\TauxAccroisEqual{#1},% NomFct=\def\TauxAccroisFct{#1},fct name=\def\TauxAccroisFct{#1} } \setKVdefault[tauxaccroiss]{% Precision=3,prec=3,% AffFormule=false,disp formula=false,% Displaystyle=true,ds=true,% ResultatBrut=false,raw result=false,% Signe={\approx},sign={\approx},% NomFct=f,fct name=f } \NewDocumentCommand\TauxAccroissement{ O{} m m m }{%opts+fct+pt+h \useKVdefault[tauxaccroiss]% \setKV[tauxaccroiss]{#1}% %en/fr \setKVboolfalsedefaultmulti[tauxaccroiss]{raw result}{ResultatBrut}% \setKVboolfalsedefaultmulti[tauxaccroiss]{disp formula}{AffFormule}% \setKVbooltruedefaultmulti[tauxaccroiss]{ds}{Displaystyle}% %next \xintdeffloatfunc varfct(x) := #2 ;% \def\TmpRes{\xintfloateval{(varfct(#3+#4)-varfct(#3))/(#4)}}% \ifboolKV[methodeintegr]{ResultatBrut}% {\TmpRes}% {% \ifboolKV[tauxaccroiss]{AffFormule}% {% \ifboolKV[tauxaccroiss]{Displaystyle}{\displaystyle}{}% \frac{\TauxAccroisFct(\num{\xinteval{#3+#4}})-\TauxAccroisFct(\num{#3})}{\num{#4}} \TauxAccroisEqual}% {}% \num{\xintfloateval{round(\TmpRes,\TauxAccroisPrec)}}% }% } \NewCommandCopy\pfltxaccroiss\TauxAccroissement \NewCommandCopy\pflgrowthrate\TauxAccroissement %==approx intégrale== \defKV[methodeintegr]{% Precision=\def\MethIntegrPrec{#1},prec=\def\MethIntegrPrec{#1},% NbSubDiv=\def\MethIntegrNb{#1},nb subdiv=\def\MethIntegrNb{#1},% Methode=\def\MethIntegrType{#1},method=\def\MethIntegrType{#1},% Signe=\def\MethIntegrEqual{#1},sign=\def\MethIntegrEqual{#1},% Expr=\def\MethIntegrFct{#1},expr=\def\MethIntegrFct{#1},% Variable=\def\MethIntegrVar{#1},var=\def\MethIntegrVar{#1} } \setKVdefault[methodeintegr]{% Precision=3,prec=3,% NbSubDiv=10,,nb subdiv=10,% Methode=Simpson,method=Simpson,% ResultatBrut=false,raw result=false,% AffFormule=false,disp formula=false,% Signe={\approx},sign={\approx},% Expr=f(x),expr=f(x),% Variable=x,var=x } \NewDocumentCommand\IntegraleApprochee{ O{} m m m }{%opts+fct+a+b \useKVdefault[methodeintegr]% \setKV[methodeintegr]{#1}% %en/fr \setKVboolfalsedefaultmulti[methodeintegr]{raw result}{ResultatBrut}% \setKVboolfalsedefaultmulti[methodeintegr]{disp formula}{AffFormule}% %next \xintdeffloatfunc varfct(x) := #2 ;% \def\TmpNmU{\xinteval{\MethIntegrNb-1}}% \IfSubStr{,RectanglesGauche,lrect,}{,\MethIntegrType,}% %\IfEq{\MethIntegrType}{RectanglesGauche}% {% \def\TmpRes{\xintfloateval{(#4-#3)/\MethIntegrNb*add(varfct(#3+i*(#4-(#3))/\MethIntegrNb), i=0..\TmpNmU)}}% }% {}% \IfSubStr{,RectanglesMilieu,mrect,}{,\MethIntegrType,}% %\IfEq{\MethIntegrType}{RectanglesMilieu}% {% \def\TmpRes{\xintfloateval{(#4-#3)/\MethIntegrNb*add(varfct(#3+(i+0.5)*(#4-(#3))/\MethIntegrNb), i=0..\TmpNmU)}}% }% {}% \IfSubStr{,RectanglesDroite,rrect,}{,\MethIntegrType,}% %\IfEq{\MethIntegrType}{RectanglesDroite}% {% \def\TmpRes{\xintfloateval{(#4-#3)/\MethIntegrNb*add(varfct(#3+i*(#4-(#3))/\MethIntegrNb), i=1..\MethIntegrNb)}}% }% {}% \IfSubStr{,Trapezes,trapez,}{,\MethIntegrType,}% %\IfEq{\MethIntegrType}{Trapezes}% {% \def\TmpRes{\xintfloateval{(#4-#3)/\MethIntegrNb*add(0.5*varfct(#3+i*(#4-(#3))/\MethIntegrNb)+0.5*varfct(#3+(i+1)*(#4-(#3))/\MethIntegrNb), i=0..\TmpNmU)}}% }% {}% \IfSubStr{,Simpson,simpson,}{,\MethIntegrType,}% %\IfEq{\MethIntegrType}{Simpson}% {% \def\TmpRes{\xintfloateval{(#4-#3)/(6*\MethIntegrNb)*(2*add(varfct(#3+i*(#4-(#3))/\MethIntegrNb), i=1..\TmpNmU)+varfct(#3)+varfct(#4)+4*add(varfct(#3+(i+0.5)*(#4-(#3))/\MethIntegrNb), i=0..\TmpNmU))}}% }% {}% \ifboolKV[methodeintegr]{ResultatBrut}% {\TmpRes}% {% \ifboolKV[methodeintegr]{AffFormule}% {% \int_{#3}^{#4} \MethIntegrFct\,\text{d}\MethIntegrVar\MethIntegrEqual% }% {}% \num{\xintfloateval{round(\TmpRes,\MethIntegrPrec)}} }% } \NewCommandCopy\pflintegrapproch\IntegraleApprochee \NewCommandCopy\pflapproxintegral\IntegraleApprochee %===intégrale 'brute' \NewDocumentCommand\CalcIntegrale{ s O{} D<>{50} m m m }{% \xintdeffloatfunc varfct(x) := #4 ;% \def\TmpNmU{\xinteval{(#3)-1}}% \def\TmpRes{\xintfloateval{((#6)-(#5))/(6*(#3))*(2*add(varfct((#5)+i*((#6)-(#5))/(#3)),i=1..\TmpNmU)+varfct(#5)+varfct(#6)+4*add(varfct((#5)+(i+0.5)*((#6)-(#5))/(#3)), i=0..\TmpNmU))}}% \IfStrEq{#2}{}% {% \IfBooleanTF{#1}{\num{\TmpRes}}{\TmpRes}% }% {% \IfBooleanTF{#1}{\num{\xintfloateval{round(\TmpRes,#2)}}}{\xintfloateval{round(\TmpRes,#2)}}% }% \relax } \NewCommandCopy\pflvalintegr\CalcIntegrale \NewCommandCopy\pflcalcintegral\CalcIntegrale %===val moy 'brute' \NewDocumentCommand\ValeurMoyenneIntg{ s O{} D<>{50} m m m }{% \xintdeffloatfunc varfct(x) := #4 ;% \def\TmpNmU{\xinteval{(#3)-1}}% \def\TmpRes{\xintfloateval{(1)/(6*(#3))*(2*add(varfct(#5+i*(#6-(#5))/(#3)),i=1..\TmpNmU)+varfct(#5)+varfct(#6)+4*add(varfct(#5+(i+0.5)*(#6-(#5))/(#3)), i=0..\TmpNmU))}}% \IfStrEq{#2}{}% {% \IfBooleanTF{#1}{\num{\TmpRes}}{\TmpRes}% }% {% \IfBooleanTF{#1}{\num{\xintfloateval{round(\TmpRes,#2)}}}{\xintfloateval{round(\TmpRes,#2)}}% }% \relax } \NewCommandCopy\pflvalmoyintegr\ValeurMoyenneIntg \NewCommandCopy\pflaveragevalintegral\ValeurMoyenneIntg %==intégrale tikz== \defKV[methodeintegrtkz]{% Couleur=\def\MethIntegrTkzCol{#1},color=\def\MethIntegrTkzCol{#1},%% CouleurRemplissage=\def\MethIntegrTkzColOpak{#1},fill color=\def\MethIntegrTkzColOpak{#1},% NbSubDiv=\def\MethIntegrTkzNb{#1},nb sudiv=\def\MethIntegrTkzNb{#1},%% Methode=\def\MethIntegrTkzType{#1},method=\def\MethIntegrTkzType{#1},% Opacite=\def\MethIntegrTkzOpak{#1},opacity=\def\MethIntegrTkzOpak{#1},%% Epaisseur=\def\MethIntegrTkzThick{#1},thickness=\def\MethIntegrTkzThick{#1} } \setKVdefault[methodeintegrtkz]{% Couleur=red,color=red,% NbSubDiv=10,nb subdiv=10,% Methode=RectanglesGauche,method=lrect,% Remplir=true,fill=true,% CouleurRemplissage={\MethIntegrTkzCol!25},fill color={\MethIntegrTkzCol!25},% Opacite=0.25,opacity=0.25,% Epaisseur=semithick,thickness=semithick } \tikzset{figureintegr/.style={\MethIntegrTkzThick,\MethIntegrTkzCol,fill=\MethIntegrTkzColOpak,fill opacity=\MethIntegrTkzOpak}}% \NewDocumentCommand\IntegraleApprocheeTikz{ O{} m m m }{%opts+nom_fct+a+b \useKVdefault[methodeintegrtkz]% \setKV[methodeintegrtkz]{#1}% \def\TmpH{(#4-#3)/\MethIntegrTkzNb}% %en/fr \setKVbooltruedefaultmulti[methodeintegrtkz]{fill}{Remplir}% %next %rectangles gauches \IfSubStr{,RectanglesGauche,lrect,}{,\MethIntegrTkzType,}% %\IfEq{\MethIntegrTkzType}{RectanglesGauche}% {% \foreach \i in {0,...,\inteval{\MethIntegrTkzNb-1}}% \draw[figureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{#2(#3+\i*\TmpH)}) ; }% {}% \IfSubStr{,RectanglesDroite,rrect,}{,\MethIntegrTkzType,}% %\IfEq{\MethIntegrTkzType}{RectanglesDroite}% {% \foreach \i in {0,...,\inteval{\MethIntegrTkzNb-1}}% \draw[figureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{#2(#3+(\i+1)*\TmpH)}) ; }% {}% \IfSubStr{,RectanglesMilieu,mrect,}{,\MethIntegrTkzType,}% %\IfEq{\MethIntegrTkzType}{RectanglesMilieu}% {% \foreach \i in {0,...,\inteval{\MethIntegrTkzNb-1}}% \draw[figureintegr] ({#3+\i*\TmpH},{0}) rectangle++ ({\TmpH},{#2(#3+(\i+0.5)*\TmpH)}) ; }% {}% \IfSubStr{,Trapezes,trapez,}{,\MethIntegrTkzType,}% %\IfEq{\MethIntegrTkzType}{Trapezes}% {% \foreach \i in {0,...,\inteval{\MethIntegrTkzNb-1}}% \draw[figureintegr] ({#3+\i*\TmpH},{0}) -- ({#3+\i*\TmpH},{#2(#3+\i*\TmpH)}) -- ({#3+(\i+1)*\TmpH},{#2(#3+(\i+1)*\TmpH)}) -- ({#3+(\i+1)*\TmpH},{0}) -- cycle ; }% {}% } \NewCommandCopy\pflintegrapprochtikz\IntegraleApprocheeTikz \NewCommandCopy\pflapproxintegraltikz\CalcIntegrale %==fonction affine== \NewDocumentCommand\AffCoeffFAm{ O{d} m }{% \xintifboolexpr{#2 == 0}{}{}% \xintifboolexpr{#2 == 1}{x}{}% \xintifboolexpr{#2 == -1}{-x}{}% \xintifboolexpr{#2 != 0 'and' #2 !=1 'and' #2 != -1}{\ConversionFraction[#1]{#2} x}{}% } \NewDocumentCommand\AffCoeffFAp{ O{d} m }{% \xintifboolexpr{#2 == 0}% {}% {% \xintifboolexpr{#2 > 0}{+\ConversionFraction[#1]{#2}}{\ConversionFraction[#1]{#2}}% }% } \NewDocumentCommand\AffCoeffFloatPa{ O{d} m }{% \IfDecimal{#2}% {% \xintifboolexpr{#2 < 0}% {\left(\num{#2}\right)}% {\num{#2}}% }% {% \xintifboolexpr{#2 < 0}% {\left(\ConversionFraction[#1]{#2}\right)}% {\ConversionFraction[#1]{#2}}% }% } \NewDocumentCommand\AffCoeffFloat{ O{d} m }{% \IfDecimal{#2}% {% {\num{#2}}% }% {% {\ConversionFraction[#1]{#2}}% }% } \NewDocumentCommand\AffCoeffPa{ O{d} m }{% \xintifboolexpr{#2 < 0}% {\left(\ConversionFraction[#1]{#2}\right)}% {\ConversionFraction[#1]{#2}}% } \makeatletter \NewDocumentCommand\EquationReduite{ O{d} m}{% \setsepchar[*]{,*/}% \readlist*\ListePoints{#2}% %Les cas particuliers \xintifboolexpr{\ListePoints[2,2] == \ListePoints[1,2] 'and' \ListePoints[2,3] == \ListePoints[1,3] }% {% \if@pfllngfr Les deux points donnés sont identiques, donc pas de droite\ldots\fi% \if@pfllngen The two given points are identical, so no line exists\ldots\fi% \if@pfllngde Die beiden gegebenen Punkte sind identisch, also gibt es keine Gerade\ldots\fi% \if@pfllnges Los dos puntos dados son idénticos, por lo tanto no hay recta\ldots\fi% }% {}% \xintifboolexpr{\ListePoints[2,2] == \ListePoints[1,2] 'and' \ListePoints[2,3] != \ListePoints[1,3] }% {% \if@pfllngfr Étant donné que $x_{\ListePoints[1,1]} = x_{\ListePoints[2,1]}$, la droite $(\ListePoints[1,1]\ListePoints[2,1])$ est verticale, dont une équation est $x=\ConversionFraction[#1]{\ListePoints[1,2]}$.\fi% \if@pfllngen Since $x_{\ListePoints[1,1]} = x_{\ListePoints[2,1]}$, the line $(\ListePoints[1,1]\ListePoints[2,1])$ is vertical, with equation $x=\ConversionFraction[#1]{\ListePoints[1,2]}$.\fi% \if@pfllngde Da $x_{\ListePoints[1,1]} = x_{\ListePoints[2,1]}$, ist die Gerade $(\ListePoints[1,1]\ListePoints[2,1])$ vertikal, mit Gleichung $x=\ConversionFraction[#1]{\ListePoints[1,2]}$.\fi% \if@pfllnges Dado que $x_{\ListePoints[1,1]} = x_{\ListePoints[2,1]}$, la recta $(\ListePoints[1,1]\ListePoints[2,1])$ es vertical, con ecuación $x=\ConversionFraction[#1]{\ListePoints[1,2]}$.\fi% }% {}% \xintifboolexpr{\ListePoints[2,2] != \ListePoints[1,2] 'and' \ListePoints[2,3] == \ListePoints[1,3] }% {% \if@pfllngfr Étant donné que $y_{\ListePoints[1,1]} = y_{\ListePoints[2,1]}$, la droite $(\ListePoints[1,1]\ListePoints[2,1])$ est horizontale, dont une équation est $y=\ConversionFraction[#1]{\ListePoints[1,3]}$.\fi% \if@pfllngen Since $y_{\ListePoints[1,1]} = y_{\ListePoints[2,1]}$, the line $(\ListePoints[1,1]\ListePoints[2,1])$ is horizontal, with equation $y=\ConversionFraction[#1]{\ListePoints[1,3]}$.\fi% \if@pfllngde Da $y_{\ListePoints[1,1]} = y_{\ListePoints[2,1]}$, ist die Gerade $(\ListePoints[1,1]\ListePoints[2,1])$ horizontal, mit Gleichung $y=\ConversionFraction[#1]{\ListePoints[1,3]}$.\fi% \if@pfllnges Dado que $y_{\ListePoints[1,1]} = y_{\ListePoints[2,1]}$, la recta $(\ListePoints[1,1]\ListePoints[2,1])$ es horizontal, con ecuación $y=\ConversionFraction[#1]{\ListePoints[1,3]}$.\fi% }% {}% \xintifboolexpr{\ListePoints[2,2] != \ListePoints[1,2] 'and' \ListePoints[2,3] != \ListePoints[1,3] }% {% \itemtomacro\ListePoints[1,1]\NomA% \itemtomacro\ListePoints[2,1]\NomB% \itemtomacro\ListePoints[1,2]\xA% \itemtomacro\ListePoints[1,3]\yA% \itemtomacro\ListePoints[2,2]\xB% \itemtomacro\ListePoints[2,3]\yB% \xdef\CoeffDirBrut{\xinteval{(\yB-(\yA))/(\xB-(\xA))}}% \xdef\OrdoOrigBrut{\xinteval{\yB-(\CoeffDirBrut*(\xB))}}% \xdef\CoeffDirConv{\ConversionFraction{(\yB-(\yA))/(\xB-(\xA))}}% \xdef\OrdoOrigConv{\ConversionFraction{\yB-(\CoeffDirBrut*(\xB))}}% \if@pfllngfr Afin de déterminer l'équation réduite d'une droite passant par les points $\NomA$ et $\NomB$, on doit d'abord déterminer le coefficient directeur $m$ :\fi% \if@pfllngen To determine the slope-intercept form of a line passing through points $\NomA$ and $\NomB$, we must first determine the slope $m$:\fi% \if@pfllngde Um die Gleichung einer Geraden durch die Punkte $\NomA$ und $\NomB$ zu bestimmen, müssen wir zuerst die Steigung $m$ bestimmen:\fi% \if@pfllnges Para determinar la ecuación reducida de una recta que pasa por los puntos $\NomA$ y $\NomB$, primero debemos determinar la pendiente $m$:\fi% \[m=\frac{y_\NomB-y_\NomA}{x_\NomB-x_\NomA}= \frac{\AffCoeffFloat[]{\yB}-\AffCoeffFloatPa[]{\yA}}{\AffCoeffFloat[]{\xB}-\AffCoeffFloatPa[]{\xA}}= \frac{\ConversionFraction{\xinteval{\yB-(\yA)}}}{\ConversionFraction{\xinteval{\xB-(\xA)}}}= \ConversionFraction{\CoeffDirBrut}\]% % \if@pfllngfr L'équation réduite de la droite est donc de la forme $(\NomA\NomB)$ : $y=\AffCoeffFAm[#1]{\CoeffDirBrut}+p$.\par\fi% \if@pfllngen The equation of the line is therefore of the form $(\NomA\NomB)$: $y=\AffCoeffFAm[#1]{\CoeffDirBrut}+p$.\par\fi% \if@pfllngde Die Gleichung der Geraden hat also die Form $(\NomA\NomB)$: $y=\AffCoeffFAm[#1]{\CoeffDirBrut}+p$.\par\fi% \if@pfllnges La ecuación de la recta es entonces de la forma $(\NomA\NomB)$: $y=\AffCoeffFAm[#1]{\CoeffDirBrut}+p$.\par\fi% % \if@pfllngfr Il faut enfin déterminer l'ordonnée à l'origine $p$.\par\fi% \if@pfllngen We must finally determine the y-intercept $p$.\par\fi% \if@pfllngde Schließlich müssen wir den y-Achsenabschnitt $p$ bestimmen.\par\fi% \if@pfllnges Finalmente debemos determinar la ordenada al origen $p$.\par\fi% % \if@pfllngfr On sait que la droite passe par le point $\NomA$, donc les coordonnées $\NomA\left(\AffCoeffFloat[]{\xA};\AffCoeffFloat[]{\yA}\right)$ vérifient l'équation. On a alors :\fi% \if@pfllngen We know that the line passes through point $\NomA$, so the coordinates $\NomA\left(\AffCoeffFloat[]{\xA};\AffCoeffFloat[]{\yA}\right)$ satisfy the equation. We then have:\fi% \if@pfllngde Wir wissen, dass die Gerade durch den Punkt $\NomA$ geht, also erfüllen die Koordinaten $\NomA\left(\AffCoeffFloat[]{\xA};\AffCoeffFloat[]{\yA}\right)$ die Gleichung. Wir haben dann:\fi% \if@pfllnges Sabemos que la recta pasa por el punto $\NomA$, por lo tanto las coordenadas $\NomA\left(\AffCoeffFloat[]{\xA};\AffCoeffFloat[]{\yA}\right)$ verifican la ecuación. Tenemos entonces:\fi% % \[y_\NomA=\ConversionFraction{\CoeffDirBrut} \times x_\NomA+p \implies \AffCoeffFloat[#1]{\yA} = \ConversionFraction{\CoeffDirBrut} \times \AffCoeffFloatPa[#1]{\xA} + p \implies p = \AffCoeffFloat[#1]{\yA} - \left(\ConversionFraction{\CoeffDirBrut} \times \AffCoeffFloatPa{\xA}\right) \implies p = \OrdoOrigConv\] % \if@pfllngfr Donc l'équation réduite de $(\NomA\NomB)$ est $y=\AffCoeffFAm[#1]{\CoeffDirBrut} \AffCoeffFAp[#1]{\OrdoOrigBrut}$.\fi% \if@pfllngen Therefore the equation of $(\NomA\NomB)$ is $y=\AffCoeffFAm[#1]{\CoeffDirBrut} \AffCoeffFAp[#1]{\OrdoOrigBrut}$.\fi% \if@pfllngde Also lautet die Gleichung von $(\NomA\NomB)$ $y=\AffCoeffFAm[#1]{\CoeffDirBrut} \AffCoeffFAp[#1]{\OrdoOrigBrut}$.\fi% \if@pfllnges Por lo tanto la ecuación de $(\NomA\NomB)$ es $y=\AffCoeffFAm[#1]{\CoeffDirBrut} \AffCoeffFAp[#1]{\OrdoOrigBrut}$.\fi% }% {}% } \makeatother \NewCommandCopy\pfleqreduite\EquationReduite \NewCommandCopy\pflreducedequation\EquationReduite %====FRACTION PÉRIODIQUE \defKV[FracPeriod]{% Inconnue=\def\FracPerVar{#1},unknown=\def\FracPerVar{#1} } \setKVdefault[FracPeriod]{% Enonce=true,statement=true,% d=true,% Inconnue=x,unknown=x,% Solution=false,sol=false,% Brut=true,raw=true,% Simple=false,simple=false } \makeatletter \NewDocumentCommand\FractionPeriode{ O{} m m }{% %clés \restoreKV[FracPeriod]% revenir au valeurs par défaut \setKV[FracPeriod]{#1}% lit les arguments optionnels %en/fr \setKVbooltruedefaultmulti[FracPeriod]{raw}{Brut}% \setKVbooltruedefaultmulti[FracPeriod]{statement}{Enonce}% \setKVboolfalsedefaultmulti[FracPeriod]{sol}{Solution}% \setKVboolfalsedefaultmulti[FracPeriod]{simple}{Simple}% %next %vmode ? \ifvmode\leavevmode\fi% %les variables utiles \pflifendwith{#2}{.}% {% \plfbeforechar{#2}{.}{\tmp@avt}% \xdef\tmp@apr{0}% \xdef\tmp@len@apr{0}% }% {% \pflcutandsplit{#2}{.}{\tmp@avt}{\tmp@apr}% \pfllenstr{\tmp@apr}[\tmp@len@apr]% }% \pfllenstr{#3}[\tmp@len@per]% %raccourcis \pflifendwith{#2}{.}% {% \xdef\tmp@enonce{\num{\tmp@avt}{\labelsepdec}\overline{#3}}% }% {% \xdef\tmp@enonce{\num{#2}\overline{#3}}% }% %calculs \xdef\tmp@num@brut{\xintieval{10**(\tmp@len@per+\tmp@len@apr)*\tmp@avt+10**(\tmp@len@per)*\tmp@apr-10**(\tmp@len@apr)*\tmp@avt+(#3)-\tmp@apr}}% \xdef\tmp@denom@brut{\xintieval{10**(\tmp@len@per+\tmp@len@apr)-10**(\tmp@len@apr)}}% \xdef\tmp@pgcd{\xinteval{gcd(\tmp@num@brut,\tmp@denom@brut)}}% %résolution OK \ifboolKV[FracPeriod]{Solution}% {% %phrase d'accroche \xintifboolexpr{\tmp@len@apr == 0}% {% \noindent \if@pfllngfr On note $\FracPerVar=\tmp@enonce$.\par \noindent La première égalité est donc \[\boxed{\FracPerVar=\tmp@enonce} \quad (1)\]\fi% \if@pfllngen We set $\FracPerVar=\tmp@enonce$.\par \noindent The first equality is therefore \[\boxed{\FracPerVar=\tmp@enonce} \quad (1)\]\fi% \if@pfllngde Wir setzen $\FracPerVar=\tmp@enonce$.\par \noindent Die erste Gleichung lautet also \[\boxed{\FracPerVar=\tmp@enonce} \quad (1)\]\fi% \if@pfllnges Ponemos $\FracPerVar=\tmp@enonce$.\par \noindent La primera igualdad es entonces \[\boxed{\FracPerVar=\tmp@enonce} \quad (1)\]\fi% }% {% \noindent \if@pfllngfr On note $\FracPerVar=\tmp@enonce$.\par\fi% \if@pfllngen We set $\FracPerVar=\tmp@enonce$.\par\fi% \if@pfllngde Wir setzen $\FracPerVar=\tmp@enonce$.\par\fi% \if@pfllnges Ponemos $\FracPerVar=\tmp@enonce$.\par\fi% }% \xintifboolexpr{\tmp@len@apr == 0}% {}% {% \noindent \if@pfllngfr On \textit{ramène} la période près de la virgule en multipliant par $10^{\tmp@len@apr}$ :\fi% \if@pfllngen We \textit{shift} the period close to the decimal point by multiplying by $10^{\tmp@len@apr}$:\fi% \if@pfllngde Wir \textit{verschieben} die Periode nahe dem Komma, indem wir mit $10^{\tmp@len@apr}$ multiplizieren:\fi% \if@pfllnges \textit{Desplazamos} el período cerca de la coma multiplicando por $10^{\tmp@len@apr}$:\fi% \[\boxed{10^{\tmp@len@apr}\times\FracPerVar=\num{\xinteval{\tmp@avt*10**(\tmp@len@apr)+\tmp@apr}}{\labelsepdec}\overline{#3}} \quad (1)\] }% \noindent \if@pfllngfr On \textit{décale} la période avant la virgule, en multipliant l'égalité (1) par $10^{\tmp@len@per}$ :\fi% \if@pfllngen We \textit{shift} the period before the decimal point by multiplying equality (1) by $10^{\tmp@len@per}$:\fi% \if@pfllngde Wir \textit{verschieben} die Periode vor das Komma, indem wir Gleichung (1) mit $10^{\tmp@len@per}$ multiplizieren:\fi% \if@pfllnges \textit{Desplazamos} el período antes de la coma multiplicando la igualdad (1) por $10^{\tmp@len@per}$:\fi% \[10^{\tmp@len@per}\xintifboolexpr{\tmp@len@apr == 0}{}{\times10^{\tmp@len@apr}}\times\FracPerVar=10^{\tmp@len@per}\times\num{\xinteval{\tmp@avt*10**(\tmp@len@apr)+\tmp@apr}}{\labelsepdec}\overline{#3} \Rightarrow \boxed{10^{\xinteval{\tmp@len@per+\tmp@len@apr}}\times\FracPerVar = \num{\xintieval{10**(\tmp@len@per)*(\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)+#3}}{\labelsepdec}\overline{#3}} \quad (2)\] %soustraction \if@pfllngfr On soustrait les deux égalités, $(2)-(1)$, ce qui permet d'\textit{enlever} la partie décimale :\fi% \if@pfllngen We subtract the two equalities, $(2)-(1)$, which allows us to \textit{remove} the decimal part:\fi% \if@pfllngde Wir subtrahieren die beiden Gleichungen, $(2)-(1)$, wodurch wir den Dezimalteil \textit{entfernen} können:\fi% \if@pfllnges Restamos las dos igualdades, $(2)-(1)$, lo que nos permite \textit{eliminar} la parte decimal:\fi% \begin{align*} 10^{\xinteval{\tmp@len@per+\tmp@len@apr}}\times\FracPerVar-\xintifboolexpr{\tmp@len@apr == 0}{}{10^{\tmp@len@apr}\times}\FracPerVar = \num{\xintieval{10**(\tmp@len@per)*(\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)+#3}}{\labelsepdec}\overline{#3} -\num{\xinteval{\tmp@avt*10**(\tmp@len@apr)+\tmp@apr}}{\labelsepdec}\overline{#3} &\Rightarrow \big(10^{\xinteval{\tmp@len@per+\tmp@len@apr}}-\xintifboolexpr{\tmp@len@apr == 0}{1}{10^{\tmp@len@apr}}\big)\times\FracPerVar = \num{\xintieval{10**(\tmp@len@per)*(\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)+#3}} - \num{\xintieval{\tmp@avt*10**(\tmp@len@apr)+\tmp@apr}} \\ \phantom{10^{\xinteval{\tmp@len@per+\tmp@len@apr}}\times\FracPerVar-10^{\tmp@len@apr}\times\FracPerVar = \num{\xintieval{10**(\tmp@len@per)*(\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)+#3}}{\labelsepdec}\overline{#3} -\num{\xinteval{\tmp@avt*10**(\tmp@len@apr)+\tmp@apr}}{\labelsepdec}\overline{#3}} &\Rightarrow \num{\xinteval{10**(\tmp@len@per+\tmp@len@apr)-10**(\tmp@len@apr)}}\times\FracPerVar=\num{\xintieval{10**(\tmp@len@per)*(\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)+#3- (\tmp@avt*10**(\tmp@len@apr)+\tmp@apr)}} \\ &\Rightarrow\FracPerVar = \ifboolKV[FracPeriod]{d}{\displaystyle}{}\frac{\num{\tmp@num@brut}}{\num{\tmp@denom@brut}} \end{align*} %affichage(s) OK \noindent \if@pfllngfr Ainsi on a \fi% \if@pfllngen Thus we have \fi% \if@pfllngde Also haben wir \fi% \if@pfllnges Así tenemos \fi% \ensuremath{\tmp@enonce = \ifboolKV[FracPeriod]{d}{\displaystyle}{}\frac{\num{\tmp@num@brut}}{\num{\tmp@denom@brut}} \xintifboolexpr{\tmp@pgcd == 1}{}{=\ifboolKV[FracPeriod]{d}{\displaystyle}{}\frac{\num{\xintieval{\tmp@num@brut/\tmp@pgcd}}}{\num{\xintieval{\tmp@denom@brut/\tmp@pgcd}}}} \xintifboolexpr{\tmp@denom@brut/\tmp@pgcd == 1}{=\num{\xintieval{\tmp@num@brut/\tmp@pgcd}}}{}% }.\par% }% {}% \ifboolKV[FracPeriod]{Brut}% {% \xdef\FracPerNum{\tmp@num@brut}% \xdef\FracPerDenom{\tmp@denom@brut}% \xdef\FracPerNumSimpl{\xintieval{(\tmp@num@brut)/gcd(\tmp@num@brut,\tmp@denom@brut)}}% \xdef\FracPerDenomSimpl{\xintieval{(\tmp@denom@brut)/gcd(\tmp@num@brut,\tmp@denom@brut)}}% }% {}% \ifboolKV[FracPeriod]{Simple}% {% %affichage(s) OK \noindent\ensuremath{% \ifboolKV[FracPeriod]{Enonce}% {% \tmp@enonce = }% {}% \ifboolKV[FracPeriod]{d}{\displaystyle}{}\frac{\num{\tmp@num@brut}}{\num{\tmp@denom@brut}} \xintifboolexpr{\tmp@pgcd == 1}{}{=\ifboolKV[FracPeriod]{d}{\displaystyle}{}\frac{\num{\xintieval{\tmp@num@brut/\tmp@pgcd}}}{\num{\xintieval{\tmp@denom@brut/\tmp@pgcd}}}}% }\par% }% {}% } \makeatletter \NewCommandCopy\pflfracperiod\FractionPeriode \NewCommandCopy\pflperiodfraction\FractionPeriode %====tkz ligne convexité \makeatletter \NewDocumentCommand\tkzTabLineConvex{ s m m }{% %étoilé := mode texte %1 := ligne %2 := liste des cases ( ccv / cvx / t / d / i / i* ) %multilng \if@pfllngfr \def\labelconvexinflex{point\\d'inflexion} \def\labelconvexccv{concave} \def\labelconvexcvx{convexe} \fi \if@pfllngen \def\labelconvexinflex{inflection\\point} \def\labelconvexccv{concave} \def\labelconvexcvx{convex} \fi \if@pfllngde \def\labelconvexinflex{Wende-\\punkt} \def\labelconvexccv{konkav} \def\labelconvexcvx{konvex} \fi \if@pfllnges \def\labelconvexinflex{punto de\\inflexión} \def\labelconvexccv{cóncava} \def\labelconvexcvx{convexa} \fi %calculs intermédiaires \xdef\j{#2}% \xdef\k{\inteval{#2+1}}% %récup hauteur ligne \pgfpointdiff{\pgfpointanchor{T0\j}{center}}{\pgfpointanchor{T0\k}{center}}% \pgf@xa=\pgf@x \pgf@ya=\pgf@y \pgfmathparse{veclen(\pgf@xa,\pgf@ya)/28.45274}% \global\let\tmphautligne\pgfmathresult% %suite \setsepchar{,}% \readlist*\lsttabconvex{#3}% \foreach \i in {1,...,\lsttabconvexlen}{% \itemtomacro\lsttabconvex[\i]{\paramcvxitem}% \IfStrEqCase{\paramcvxitem}{% {d}%double barre {% \xdef\nodedouble{\inteval{(\i+1)/2}}% \draw[double style] (N\nodedouble\j)--(N\nodedouble\k) ;% }% {i*}%inflexion {% \xdef\nodedouble{\inteval{(\i+1)/2}}% \draw[line width=\cmdTAB@tbs@lw] (N\nodedouble\j)--([xshift=-12pt]N\nodedouble\k) ;% \draw[line width=\cmdTAB@tbs@lw] (N\nodedouble\j)--([xshift=12pt]N\nodedouble\k) ;% \draw (N\nodedouble\k) node[font=\tiny,text width=1.5cm,align=center] {\labelconvexinflex} ; }% {i}%inflexion sans texte {% \xdef\nodedouble{\inteval{(\i+1)/2}}% \draw[line width=\cmdTAB@tbs@lw] (N\nodedouble\j)--([xshift=-12pt]N\nodedouble\k) ;% \draw[line width=\cmdTAB@tbs@lw] (N\nodedouble\j)--([xshift=12pt]N\nodedouble\k) ;% }% {t}%trait {% \xdef\nodedouble{\inteval{(\i+1)/2}}% \draw[line width=\cmdTAB@tbs@lw,t style] (N\nodedouble\j)--(N\nodedouble\k) ; }% {ccv}%concave {% \xdef\nodedouble{\inteval{(\i)/2}}% \IfBooleanTF{#1}% {% \draw ($(M\nodedouble\j)!0.5!(M\nodedouble\k)$) node {\labelconvexccv} ;% }% {% \draw[line width={1.5*\cmdTAB@tbs@lw}] ($(M\nodedouble\j)!0.5!(M\nodedouble\k)+({-0.275*\cmdTAB@tbs@espcl},{-0.25*\tmphautligne})$) parabola bend ++({0.275*\cmdTAB@tbs@espcl},{0.5*\tmphautligne}) ($(M\nodedouble\j)!0.5!(M\nodedouble\k)+({0.275*\cmdTAB@tbs@espcl},{-0.25*\tmphautligne})$) ; }% }% {cvx}%convexe {% \xdef\nodedouble{\inteval{(\i)/2}}% \IfBooleanTF{#1}% {% \draw ($(M\nodedouble\j)!0.5!(M\nodedouble\k)$) node {\labelconvexcvx} ;% }% {% \draw[line width={1.5*\cmdTAB@tbs@lw}] ($(M\nodedouble\j)!0.5!(M\nodedouble\k)+({-0.275*\cmdTAB@tbs@espcl},{0.25*\tmphautligne})$) parabola bend ++({0.275*\cmdTAB@tbs@espcl},{-0.5*\tmphautligne}) ($(M\nodedouble\j)!0.5!(M\nodedouble\k)+({0.275*\cmdTAB@tbs@espcl},{0.25*\tmphautligne})$) ; }% }% }% }% } \makeatother \NewCommandCopy\pfltkztabcvx\tkzTabLineConvex %===F.CANONIQUE & F.HOMOGRAPHIQUE \NewDocumentCommand\FormeCanonique{ s O{d} m m m }{% \def\tmpcoeffalpha{-(#4)/(2*(#3))}% \def\tmpcoeffbeta{(#3)*(-(#4)/(2*(#3)))^2+(#4)*(-(#4)/(2*(#3)))+(#5)}% \def\coeffaconv{\ConversionFraction[#2]{#3}}% \def\coeffalpha{\ConversionFraction[#2]{-(#4)/(2*(#3))}}% \def\coeffalphamoins{\ConversionFraction[#2]{(#4)/(2*(#3))}}% \def\coeffbeta{\ConversionFraction[#2]{(#3)*(-(#4)/(2*(#3)))^2+(#4)*(-(#4)/(2*(#3)))+(#5)}}% \ensuremath{% %on affiche a, sauf s'il vaut 1 ou -1 \xintifboolexpr{#3 == 1}{}{}% \xintifboolexpr{#3 == -1}{-}{}% \xintifboolexpr{#3 != -1 'and' #3 != 1}{\coeffaconv}{}% \xintifboolexpr{\tmpcoeffalpha == 0}% {% x^2% }% {% \IfBooleanTF{#1}% {% \xintifboolexpr{\tmpcoeffalpha < 0}% {% {\left(x\xintifboolexpr{\tmpcoeffalpha < 0}{-}{+}{\left(\coeffalpha\right)}\right)}^2% }% {% {\left(x\xintifboolexpr{\tmpcoeffalpha > 0}{}{+}\coeffalphamoins\right)}^2% }% }% {% {\left(x\xintifboolexpr{\tmpcoeffalpha > 0}{}{+}\coeffalphamoins\right)}^2% }% }% \xintifboolexpr{\tmpcoeffbeta == 0}% {}% {% \xintifboolexpr{\tmpcoeffbeta > 0}{+}{}\coeffbeta% }% }% } \NewCommandCopy\pflformcanoniq\FormeCanonique \NewCommandCopy\pflcanonicform\FormeCanonique \NewDocumentCommand\FonctionHomographique{ s O{t} m m m m }{% \xintifboolexpr{#3 != 0}% {% \def\tmpcoeffSeul{(#3)/(#5)}% \def\tmpcoeffNum{((#4)*(#5)-(#3)*(#6))/((#5)*(#5))}% \def\tmpcoeffDenom{(#6)/(#5)}% \ensuremath{% \ConversionFraction[d]{\tmpcoeffSeul}% +\dfrac% {\ConversionFraction[#2]{\tmpcoeffNum}}% {x% \xintifboolexpr{#6 == 0}{}{% \IfBooleanTF{#1}% {% \xintifboolexpr{\tmpcoeffDenom > 0}{-\left(\ConversionFraction[#2]{-(\tmpcoeffDenom)}\right)}{\ConversionFraction[#2]{\tmpcoeffDenom}}% }% {% \xintifboolexpr{\tmpcoeffDenom > 0}{+}{}\ConversionFraction[#2]{\tmpcoeffDenom}% }% }% }% }% }% {% \def\tmpcoeffNum{(#4)/(#5)}% \def\tmpcoeffDenom{(#6)/(#5)}% \ensuremath{% \dfrac% {\ConversionFraction[#2]{\tmpcoeffNum}}% {x% \xintifboolexpr{#6 == 0}{}{% \IfBooleanTF{#1}% {% \xintifboolexpr{\tmpcoeffDenom > 0}{-}{}\left(\ConversionFraction[#2]{-(\tmpcoeffDenom)}\right)% }% {% \xintifboolexpr{\tmpcoeffDenom > 0}{+}{}\ConversionFraction[#2]{\tmpcoeffDenom}% }% }% }% }% }% } \NewCommandCopy\pflfcthomogr\FonctionHomographique \NewCommandCopy\pflhomogfct\FonctionHomographique %----max/min \NewDocumentCommand\DetermineMax{ O{0.01} m m m O{\tmpmax} O{\tmpmaxvalx} }{% \xdef#5{\xintfloateval{max(seq(#2,x=#3..[#1]..#4,#4))}}% \xdef#6{\xintfloateval{first(seq((#2 == #5)?{x}{},x=#3..[#1]..#4,#4))}}% } \NewCommandCopy\pfldetmax\DetermineMax \NewCommandCopy\pflfindmax\DetermineMax \NewDocumentCommand\DetermineMin{ O{0.01} m m m O{\tmpmin} O{\tmpminvalx} }{% \xdef#5{\xintfloateval{min(seq(#2,x=#3..[#1]..#4,#4))}}% \xdef#6{\xintfloateval{first(seq((#2 == #5)?{x}{},x=#3..[#1]..#4,#4))}}% } \NewCommandCopy\pfldetmin\DetermineMin \NewCommandCopy\pflfindmin\DetermineMin \endinput