Générer une feuille d’exercices aléatoires avec Python en LaTeX : combien de fois ai-je voulu générer automatiquement des exercices similaires (par exemple, de développement) ? Vous ne le savez pas, mais moi, je le sais : beaucoup trop !
Encore aujourd’hui, j’ai voulu générer une série de multiplications pour faire réviser ses tables une de mes élèves.
Comme je me suis mis à Python il n’y a pas longtemps, et comme dans la foulée je me suis aussi mis à PythonTeX, j’ai forcément pensé à tout ça pour faire ma feuille d’exercices (plutôt que d’inventer et de taper plus de 90 opérations).
Nous allons voir comment.
Générer des exercices aléatoires en LaTeX: du côté de Python
Dans un premier temps, il faut un code Python qui fonctionne. Je lance donc IDLE (la console Python) et tape le code suivant :
import random for n in range(10): a = random.randint(2,9) b = random.randint(2,9) c = a*b if (n%3 == 0): print('... x ',b,' = ',c) else: if (n%3 == 1): print(a,' x ... = ',c) else: print(a,' x ',b,' = ...')
Ce code me sert juste à valider la syntaxe : tout va bien ! Cela me sort 10 opérations à trous comme l’illustre la copie d’écran suivante :
Maintenant, il faut que je passe aux choses sérieuse : créer la feuille d’exercices \(\LaTeX\).
Générer des exercices aléatoires en LaTeX: du côté de \(\LaTeX\)
J’utilise le code suivant :
\documentclass[12pt,a4paper]{article} \usepackage[utf8]{inputenc} \usepackage[french]{babel} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{amsmath} \usepackage{multicol} \usepackage{pythontex} \usepackage{nopageno} \setlength{\parindent}{0pt} \setlength{\columnseprule}{0.4pt} \begin{document} \begin{multicols}{4} \begin{pycode} import random for n in range(91): a = random.randint(2,9) b = random.randint(2,9) c = a*b if (n%3 == 0): print('$\\ldots\\times',b,' = ',c,'$\\\\[1em]') else: if (n%3 == 1): print('$',a,'\\times\\ldots = ',c,'$\\\\[1em]') else: print('$',a,'\\times',b,' = \\ldots$\\\\[1em]') \end{pycode} \end{multicols} \end{documents}
Remarquez que j’ai dû ajouter des symboles “$” (pour écrire les opérations en mode mathématique en ligne) et que j’ai dû doubler les antislashs (c’est un problème récurrent quand on passe par un programme externe, comme Xcas). J’ai aussi remplacé les “x” par des vraies crois Saint-André (“\times”), ça fait plus pro !
Là, j’obtiens la feuille suivante :
Opérations aléatoires (pythontex)
Générer des exercices aléatoires en LaTeX: allons plus loin avec de l’algèbre
Générer des exercices aléatoires en LaTeX: installation de sympy
Pour faire de l’algèbre avec Python, on a besoin du module sympy. Il faut donc aller dans le terminal, et taper :
python -m pip install sympy
Le code Python
Je souhaite un code qui choisisse aléatoirement 4 nombres entiers a, b, c et d et qui affiche l’opération (ax + b)(cx + d) ainsi que son développement.
import random from sympy import Symbol from sympy import expand x=Symbol('x') for n in range(11): a = random.choice([1, -1]) * random.randint(2, 9) b = random.choice([1, -1]) * random.randint(2, 9) c = random.choice([1, -1]) * random.randint(2, 9) d = random.choice([1, -1]) * random.randint(2, 9) e = (a*x+b)*(c*x+d) print(expr,'=',expand(e))
Le code \(\LaTeX\)
\documentclass[12pt,a4paper]{article} \usepackage[utf8]{inputenc} \usepackage[french]{babel} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{amsmath} \usepackage{pythontex} \usepackage{nopageno} \usepackage{xstring} \setlength{\parindent}{0pt} \begin{document} \begin{pycode} import random from sympy import Symbol from sympy import expand x=Symbol('x') print('\\begin{align*}') for n in range(10): a = random.choice([1, -1]) * random.randint(2, 9) b = random.choice([1, -1]) * random.randint(2, 9) c = random.choice([1, -1]) * random.randint(2, 9) d = random.choice([1, -1]) * random.randint(2, 9) e = (a*x+b)*(c*x+d) print('\\StrSubstitute{',e,'}{*}{}',' & = \\StrSubstitute{',expand(e),'}{**}{^}[\\result]\\StrSubstitute{\\result}{*}{}\\\\') print('\\end{align*}') \end{pycode} \end{document}
Cela donne :
Pour passer du code Python au code \(\LaTeX\), il m’a fallu utiliser une petite astuce pour remplacer les étoiles (affichées par Python). J’ai donc fait appel au package xstring.
Par défaut, Python affiche : “(-4*x+4)*(5*x+9)=-20*x**2-16*x+36”; il faut donc :
- remplacer d’abord les “**” par des “^”, d’où la commande : \StrSubstitute{<ma chaîne>}{**}{^}[\result]. Cette commande définit la macro \result comme étant la chaîne dans laquelle on a fait le remplacement.
- remplacer les “*” par rien dans \result : \StrSubstitute{\result}{*}{}. On obtient alors le résultat final souhaité.
Remarquez que j’ai dû ajouter des symboles “$” (pour écrire les opérations en mode mathématique en ligne) et que j’ai dû doubler les antislashs (c’est un problème récurrent quand on passe par un programme externe, comme Xcas). J’ai aussi remplacé les “x” par des vraies crois Saint-André (“\times”), ça fait plus pro !
Là, j’obtiens la feuille suivante :
Merci !
Mais il y a déjà le logiciel pyromaths qui fait déjà ça très bien.
Vous pourrez peut-être l’enrichir avec vos exercices (et votre maîtrise de latex + python) ?
En effet, Pyromath existe, mais l’objectif de cet article, comme beaucoup qui parlent de LaTeX ou Python, est de voir comment programmer, car Pyromath, c’est bien, mais ça ne fait pas tout. Donc si on veut faire quelque chose que Pyromath ne fait pas, si on ne comprend pas le fonctionnement des choses, on ne peut rien faire de plus.
Ici, je parle de choses rudimentaires pour faire passer certaines notions, mais c’est pour mieux comprendre le lien entre LaTeX et Python dans le cas où l’on souhaite programmer en Python pour afficher les résultats en LaTeX. Avec Pyromath, on n’a pas le choix sur le style des exercices. Et je ne suis pas un mouton, donc je déteste qu’on me dise comment je dois construire mes exercices 🙂 Je préfère donc comprendre les choses pour faire exactement ce que je veux. Je suis donc contre le principe de Pyromath (pour moi uniquement), même si je reconnais son utilité dans certains cas pour certain.e.s enseignant.e.s. Par exemple, voyez-vous sur Pyromath la feuille où il y a des opérations ? Moi, j’avais besoin de ça, et pas d’autre chose. Donc ici, Pyromath ne me servait à rien.
Bonjour… M’intéressant à l’utilisation de pythontex, je passe par hasard sur votre site. Je sens que j’y repasserai. Merci pour le partage de votre travail.
Par contre, il semble qu’une confusion se soit glissée dans les instructions d’installation de vos outils : c’est bien la librairie de calcul formel sympy qu’il faut installer et non simpy.
Bonne journée à vous.
En effet, il y a avait une confusion d’orthographe. J’ai donc changé partout : il s’agit bien du module sympy. Merci !
Bonjour,
merci pour ces précieuses informations ! Je suis moi-même en train de partir à la découverte de PythonTex, dans le but de l’utiliser dans AMC notamment.
Je me permets d’apporter ma petite pierre à l’édifice : on peut en effet réduire les “conversions” d’étoiles en ^^, en utilisant print(r’…’). Voici ce que cela donne pour le premier exemple :
\begin{pycode}
import random
for n in range(10):
a=random.randint(2,9)
b=random.randint(2,9)
c=a*b
if (n%3==0):
print(‘$\ldots’+r’\times$’,b,r’$=$’,c, ‘\n’)
else:
if (n%3==1):
print(a,r’$\times\ldots=$’,c,’\n’)
else:
print(a,’x’,b,r’$=\ldots$’,’\n’)
\end{pycode}
En ce qui concerne le deuxième exemple, il y a moyen aussi de simplifier le code avec sympycode, latex() et r’_____. Ainsi j’obtiens :
\begin{sympycode}
import random
x=symbols(‘x’)
print(r’\begin{align*}’)
for n in range(10):
a=random.choice([1,-1])*random.randint(2,9)
b=random.choice([1,-1])*random.randint(2,9)
c=random.choice([1,-1])*random.randint(2,9)
d=random.choice([1,-1])*random.randint(2,9)
gauche=(a*x+b)*(c*x+d)
droite=expand(gauche)
print(latex(gauche),’&=’,latex(droite),r’\\’)
print(r’\end{align*}’)
\end{sympycode}
Magnifique !
Merci ça m’a donne envie d’apprendre python text
Bonjour, tout d’abord merci pour cet article très intéressant qui m’a donné envie d’essayer moi même !
Par contre je rencontre le soucis suivant : en utilisant exactement le même code que vous je me retrouve avec une erreur au moment ou je souhaite visualiser le pdf. Il me dit fichier non trouvé
Savez d’où cela peu bien venir ?
Bonjour.
Il faut adapter les lignes de commandes à votre environnement et notamment au chemin vers le lecteur PDF.
Bonjour et pour le partage.
J’ai lancé votre code, je n’ai pas d’erreur mais le fichier pdf est vierge.
Pourriez-vous m’aider s’il vous plaît?
Merci.
Bien à vous,
Patrice.
Sans savoir comment vous procédez, difficile à dire. Je ne peux qu’émettre des hypothèses:
1/ La chaîne de compilation n’est pas respectée
2/ Python n’est pas trouvé (suivant l’OS utilisé, il faut spécifier dans le PATH le chemin d’accès).
Il faut vérifier que PythonTeX fonctionne. Voir éventuellement la page https://www.mathweb.fr/euclide/pythontex/.
Bonsoir,
je suis sur ubuntu20, j’ai la distribution texlive, python3 et j’ai comme éditeur de texte gedit.
Je pense effectivement que j’ai un souci de de chemin d’accès.
Voici une partie de ma commande pour la compilation (sans la visualisation qui ne pose pas de problème):
pdflatex -synctex=1 -shell-escape -src -interaction=nonstopmode %.tex | python3 /usr/share/texlive/texmf-dist/scripts/pythontex/pythontex3.py %.tex | pdflatex -synctex=1 -shell-escape -src -interaction=nonstopmode %.tex
Merci de votre aide.
Bien à vous,
Patrice.
Je ne travaille pas sous Ubuntu et ne connais plus grand-chose à cet OS. Cela dit, normalement, Python devrait être reconnu de base. Dans la console (le terminal), tapez:
python3 -V
pour voir si Python est bien installé. Si vous êtes sûr qu’il l’est, alors il faut s’orienter ailleurs, mais je ne sais pas où.
Peut-être est-ce aussi dû à un des modules Python utilisé dans le code.
Il faudrait avant tout tester le code Python directement dans un programme Python afin de voir s’il fonctionne. Si tel n’est pas le cas, c’est que le module importé n’est pas installé peut-être.
Extraordinaire et très utile.
Ceci me permet de faire des contrôles d’automatismes aléatoires pour mes élèves. Merci beaucoup.
Par contre, sauriez-vous s’il existe un moyen à partir de python de créer des exercices interactifs directement sur internet (en html ou autre langage, je ne sais pas bien) comme sur les sites kwyk de manière à ce que je crée mes propres exercices tirés tout droit de mes entrainements, ce qui permettrait à mes élèves de s’entrainer davantage encore.
Merci d’avance.
Lier HTML et Python, ça me fait penser à Django, dont je ne suis pas du tout expert.
Il existe peut-être d’autres méthodes, mais je ne me suis jamais penché sur le sujet donc je ne peux pas en dire plus.