From c2d667ee2f8bc111b37aeb9631ef39fcdbcc2072 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Thu, 20 Aug 2020 15:35:33 +0200 Subject: [PATCH] Feat: import snippets and create first tests --- snippets/Geometrie/fig/parcours.pdf | Bin 0 -> 6652 bytes snippets/Geometrie/tpl_Pythagore_thales.tex | 121 ++++++++++++++++++ snippets/tpl_fonctions.tex | 96 ++++++++++++++ snippets/tpl_fraction.tex | 133 ++++++++++++++++++++ snippets/tpl_suite.tex | 87 +++++++++++++ test_no_compile.py | 16 +++ 6 files changed, 453 insertions(+) create mode 100644 snippets/Geometrie/fig/parcours.pdf create mode 100644 snippets/Geometrie/tpl_Pythagore_thales.tex create mode 100644 snippets/tpl_fonctions.tex create mode 100644 snippets/tpl_fraction.tex create mode 100644 snippets/tpl_suite.tex create mode 100644 test_no_compile.py diff --git a/snippets/Geometrie/fig/parcours.pdf b/snippets/Geometrie/fig/parcours.pdf new file mode 100644 index 0000000000000000000000000000000000000000..51edb4688a67bf104240baa772f8fe7d09b4e6e5 GIT binary patch literal 6652 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 100 + %- set unit = "m" +%- else + %- set unit = "km" +%- endif + + +Une commune souhaite aménager des parcours de santé sur son territoire. On fait deux propositions au conseil municipale, schématisés ci-dessous: +\begin{itemize} + \item Le parcours ACDA + \item Le parcours AEFA +\end{itemize} +Ils souhaitent faire un parcours dont la longueur s'approche le plus possible de \Var{objectif}\Var{unit}. + +Peux-tu les aider à choisir le parcours? Justifie + +\textbf{Attention: La figure proposée au conseil municipale n'est pas à l'échelle, mais les codages et les dimension données sont correctes.} + +\begin{minipage}{0.6\textwidth} + \includegraphics[scale = 0.4]{./fig/parcours} +\end{minipage} +\begin{minipage}{0.4\textwidth} + \begin{itemize} + \item $AC = \Var{AC}\Var{unit}$ + \item $CD = \Var{DC}\Var{unit}$ + \item $AE' = \Var{AE1}\Var{unit}$ + \item $AE = \Var{AE}\Var{unit}$ + \item $AF = \Var{AF}\Var{unit}$ + \item $E'F' = \Var{EF1}\Var{unit}$ + \item $(E'F') // (EF)$ + \item L'angle $\widehat{EAF}$ vaut $30^o$ + \end{itemize} +\end{minipage} +\begin{solution} + \begin{itemize} + \item Parcours ACDA: + + D'après la figure, on voit que le triangle $ACD$ est rectangle en $C$ donc d'après le théorème de Pythagore, on a + \begin{align*} + AD^2 &= AC^2 + DC^2 \\ + AD^2 &= \Var{AC}^2 + \Var{DC}^2 \\ + AD^2 &= \Var{AC**2} + \Var{DC**2} \\ + AD^2 &= \Var{AC**2 + DC**2} \\ + AD &= \sqrt{\Var{AC**2 + DC**2}} = \Var{AD}\Var{unit} + \end{align*} + Donc le parcours ACDA mesure + \begin{align*} + AD + AC + CD = \Var{AD} + \Var{AC} + \Var{DC} = \Var{tourACDA}\Var{unit} + \end{align*} + + \item Parcours AEFA: + + D'après les données, on sait que $(EF) // (E'F')$. On voit aussi que $A$, $E'$ et $E$ sont alignés. Il en est de même pour les points $A$, $F'$ et $F$. Donc d'après le théorème de Thalès + + \begin{tabular}{|c|c|c|c|} + \hline + Triangle AEF & AE = \Var{AE} & AF = \Var{AF} & EF \\ + \hline + Triangle AE'F' & AE' = \Var{AE1} & AF' & E'F' = \Var{EF1} \\ + \hline + \end{tabular} + est un tableau de proportionnalité. Donc on peut faire un produit en croix pour calcul $EF$. + \begin{align*} + EF = \frac{E'F' \times AE}{AE'} = \frac{\Var{EF1} \times \Var{AE}}{\Var{AE1}} = \Var{EF} \Var{unit} + \end{align*} + + Donc le parcours AEFA mesure + \begin{align*} + AF + AE + EF = \Var{AF} + \Var{AE} + \Var{EF} = \Var{tourAEFA}\Var{unit} + \end{align*} + + \item Choix du parcours: + + %- if abs(tourACDA - objectif) < abs(tourAEFA - objectif) + Il faudra choisir le tour $ACDA$ car sa longueur est plus proche de \Var{objectif}\Var{unit}. + %- else + Il faudra choisir le tour $AFEA$ car sa longueur est plus proche de \Var{objectif}\Var{unit}. + %- endif + \end{itemize} +\end{solution} + +\end{document} diff --git a/snippets/tpl_fonctions.tex b/snippets/tpl_fonctions.tex new file mode 100644 index 0000000..ea3fac8 --- /dev/null +++ b/snippets/tpl_fonctions.tex @@ -0,0 +1,96 @@ +% vim:ft=tex: +% +\documentclass[12pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[francais]{babel} +\usepackage[T1]{fontenc} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} + + +\title{ + Snippets pour Opytex \\ + Fonctions +} +\author{ + Benjamin Bertrand +} + + +\begin{document} +\maketitle + +\section{Calculer des images} +\begin{enumerate} + %-set f = Expression.random("{a}*x^2 + {b}*x + {c}") + \item $\forall x \in \mathbb{R} \qquad f(x) = \Var{f}$ + + Solution: + \begin{align*} + f(0) &= \Var{f(0).explain() | join('=')} \\ + f(1) &= \Var{f(1).explain() | join('=')} \\ + f(2) &= \Var{f(2).explain() | join('=')} \\ + f({10}) &= \Var{f(10).explain() | join('=')} \\ + f({100}) &= \Var{f(100).explain() | join('=')} + \end{align*} +\end{enumerate} + +\section{Résolution d'équation du 2nd degré} +%- macro solveEquation(P) + + On commence par calculer le discriminant de $P(x) = \Var{P}$. + \begin{eqnarray*} + \Delta & = & b^2-4ac \\ + \Var{P.delta.explain()|calculus(name="\\Delta")} + \end{eqnarray*} + + \Block{if P.delta > 0} + comme $\Delta = \Var{P.delta} > 0$ donc $P$ a deux racines + + \begin{eqnarray*} + x_1 & = & \frac{-b - \sqrt{\Delta}}{2a} = \frac{\Var{-P.b} - \sqrt{\Var{P.delta}}}{2 \times \Var{P.a}} = \Var{P.roots[0] } \\ + x_2 & = & \frac{-b + \sqrt{\Delta}}{2a} = \frac{\Var{-P.b} + \sqrt{\Var{P.delta}}}{2 \times \Var{P.a}} = \Var{P.roots[1] } + \end{eqnarray*} + + Les solutions de l'équation $\Var{P} = 0$ sont donc $\mathcal{S} = \left\{ \Var{P.roots[0]}; \Var{P.roots[1]} \right\}$ + + \Block{elif P.delta == 0} + Comme $\Delta = 0$ donc $P$ a une racine + + \begin{eqnarray*} + x_1 = \frac{-b}{2a} = \frac{-\Var{P.b}}{2\times \Var{P.a}} = \Var{P.roots[0]} \\ + \end{eqnarray*} + + La solution de $\Var{P} = 0$ est donc $\mathcal{S} = \left\{ \Var{P.roots[0]}\right\}$ + + \Block{else} + Alors $\Delta = \Var{P.delta} < 0$ donc $P$ n'a pas de racine donc l'équation $\Var{P} = 0$ n'a pas de solution. + + \Block{endif} +%- endmacro + +\begin{enumerate} + %-set P = Expression.random("{a}*x^2 + {b}*x + {c}", ["b**2-4*a*c>0"]) + \item Étude du polynôme $P$, $\forall x \in \mathbb{R} \quad P(x) = \Var{P}$ + + Solution: + + \Var{solveEquation(P)} + + %-set P = Expression.random("{a}*x^2 + {b}*x + {c}", ["b**2-4*a*c==0"]) + \item Étude du polynôme $P$, $\forall x \in \mathbb{R} \quad P(x) = \Var{P}$ + + Solution: + + \Var{solveEquation(P)} + + %-set P = Expression.random("{a}*x^2 + {b}*x + {c}", ["b**2-4*a*c<0"]) + \item Étude du polynôme $P$, $\forall x \in \mathbb{R} \quad P(x) = \Var{P}$ + + Solution: + + \Var{solveEquation(P)} + +\end{enumerate} +\end{document} diff --git a/snippets/tpl_fraction.tex b/snippets/tpl_fraction.tex new file mode 100644 index 0000000..da4d9d1 --- /dev/null +++ b/snippets/tpl_fraction.tex @@ -0,0 +1,133 @@ +% vim:ft=tex: +% +\documentclass[12pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[francais]{babel} +\usepackage[T1]{fontenc} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} + + +\title{ + Snippets pour Opytex \\ + Fractions +} +\author{ + Benjamin Bertrand +} + +\begin{document} +\maketitle + +\section{Simplifications de fractions} +\begin{itemize} + \item Trouver le numérateur quand le dénominateur augmente + \Block{set a,b,ans,c = random_str("{a},{b},{a*c},{b*c}", conditions = ["{a} != {b}"], val_min = 2, val_max = 10).split(',')}% + \begin{align*} + \dfrac{\Var{a}}{\Var{b}} = \dfrac{\ldots}{\Var{c}} + \end{align*} + Solution + \begin{align*} + \dfrac{\Var{a}}{\Var{b}} = \dfrac{\Var{ans}}{\Var{c}} + \end{align*} + + \item Trouver le numérateur quand le dénominateur diminue + \Block{set a,b,ans,c = random_str("{a*c},{b*c},{a},{b}", conditions = ["{a} != {b}"], val_min = 2, val_max = 10).split(',')}% + \begin{align*} + \dfrac{\Var{a}}{\Var{b}} = \dfrac{\cdots}{\Var{c}} + \end{align*} + Solution + \begin{align*} + \dfrac{\Var{a}}{\Var{b}} = \dfrac{\Var{ans}}{\Var{c}} + \end{align*} + Explications + \Block{set f = Expression(a + "/" +b)} + \begin{align*} + \Var{f.simplify().explain()|join('=')} + \end{align*} + +\end{itemize} + + +\section{Ajouts de fractions} + +\begin{itemize} + \item Fraction avec le même dénominateur + \Block{set e = Expression.random("{a} / {b} + {c} / {b}", ["{b} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + + \item Fraction avec un denominateur multiple de l'autre + \Block{set e = Expression.random("{a} / {b} + {c} / {b*d}", ["{b} > 1","{d} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + + \item Fraction avec des dénominateurs premiers entre eux + \Block{set e = Expression.random("{a} / {b} + {c} / {d}", ["{b} > 1","{d} > 1", "gcd({b},{d}) == 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + + \item Une fraction et un entier + \Block{set e = Expression.random("{a} / {b} + {c}", ["{b} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + + \item Une fraction et un entier + \Block{set e = Expression.random("{c} + {a} / {b}", ["{b} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} +\end{itemize} + + +\section{Multiplications de fractions} +\begin{itemize} + \item Une fraction et un entier + \Block{set e = Expression.random("{c} * {a} / {b}", ["{b} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + + \item Fraction avec des dénominateurs quelconques + \Block{set e = Expression.random("{a} / {b} * {c} / {d}", ["{b} > 1","{d} > 1"], val_min = 1)} + \begin{align*} + A = \Var{e} + \end{align*} + Solution + \begin{align*} + \Var{e.simplify().explain() | join('=')} + \end{align*} + +\end{itemize} + + +\end{document} diff --git a/snippets/tpl_suite.tex b/snippets/tpl_suite.tex new file mode 100644 index 0000000..24ed5e1 --- /dev/null +++ b/snippets/tpl_suite.tex @@ -0,0 +1,87 @@ +% vim:ft=tex: +% +\documentclass[12pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[francais]{babel} +\usepackage[T1]{fontenc} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} + + +\title{ + Snippets pour Opytex \\ + Suites +} +\author{ + Benjamin Bertrand +} + +\begin{document} +\maketitle + +\section{Calculs de termes} +\begin{enumerate} + \item Calculer les termes $u_0$, $u_1$, $u_2$, $u_{10}$ et $u_{100}$ pour les suites suivantes + \begin{enumerate} + %-set u = Expression.random("{a}*n+{b}") + \item $\forall n \in \mathbb{N} \qquad u_n = \Var{u}$ + + Solution: + \begin{align*} + u_0 &= \Var{u(0).explain() | join('=')} \\ + u_1 &= \Var{u(1).explain() | join('=')} \\ + u_2 &= \Var{u(2).explain() | join('=')} \\ + u_{10} &= \Var{u(10).explain() | join('=')} \\ + u_{100} &= \Var{u(100).explain() | join('=')} + \end{align*} + + %-set v = Expression.random("({a}*n+{b})/{c}", ["c>1"]) + \item $\forall n \in \mathbb{N} \qquad v_n = \Var{v|replace("frac","dfrac")}$ + + Solution: + \begin{align*} + v_0 &= \Var{v(0).explain() | join('=')} \\ + v_1 &= \Var{v(1).explain() | join('=')} \\ + v_2 &= \Var{v(2).explain() | join('=')} \\ + v_{10} &= \Var{v(10).explain() | join('=')} \\ + v_{100} &= \Var{v(100).explain() | join('=')} + \end{align*} + + %-set v = Expression.random("({a}*n+{b})/{c}", ["c>1"]) + \item $\forall n \in \mathbb{N} \qquad v_n = \Var{v}$ + + Solution: + \begin{align*} + %- for j in [0, 1, 2, 10, 100] + v_{\Var{j}} &= \Var{v(j).explain() | join('=')} \\ + %- endfor + \end{align*} + + %-set f = Expression.random("{a}*x") + %-set v0 = randint(0, 10) + \item $\forall n \in \mathbb{N} \qquad v_{n+1} = \Var{f("v_n")} \mbox{ et } v_0 = \Var{v0}$ + + Solution: + \begin{align*} + v_0 &= \Var{v0} \\ + %-set v = f(v0) + v_1 &= \Var{v.explain() | join('=')} \\ + %-set v = f(v) + v_2 &= \Var{v.explain() | join('=')} \\ + \end{align*} + Pour le terme 10, il faut calculer tous les autres avant! + \begin{align*} + %#- Trick to move around scoping rules + %#- https://stackoverflow.com/a/49699589 + %- set v = namespace(val = v) + %- for i in range(8) + %- set v.val = f(v.val) + v_{\Var{i+3}} &= \Var{v.val.explain() | join('=')} \\ + %- endfor + \end{align*} + + \end{enumerate} + +\end{enumerate} +\end{document} diff --git a/test_no_compile.py b/test_no_compile.py new file mode 100644 index 0000000..3054e38 --- /dev/null +++ b/test_no_compile.py @@ -0,0 +1,16 @@ +from pathlib import Path +import os +import shutil + +SNIPPETS_DIR = "./snippets" +OUTPUT = "./output" + +if __name__ == "__main__": + output = Path(OUTPUT) + shutil.rmtree(output) + output.mkdir() + snippets_dir = Path(SNIPPETS_DIR) + for snippet in snippets_dir.rglob("tpl_*.tex"): + print(snippet) + assert os.system(f"bopytex -n {snippet}") == 0 +