feuille exercices aleatoires python latex

Générer des exercices aléatoires en LaTeX avec Python

  • Dernière modification de la publication :2 octobre 2020
  • Temps de lecture :8 min de lecture
  • Commentaires de la publication :15 commentaires

Loading

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 :

générer exercices aléatoires latex python

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 abc et d et qui affiche l’opération (axb)(cxd) 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 :

générer exercices aléatoires latex python

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 :

Opérations aléatoires (pythontex)

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
15 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Riadh

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) ?

Stéphane Pasquet

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.

nicolas talabardon

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.

Nath

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}

Guido

Magnifique !
Merci ça m’a donne envie d’apprendre python text

Cédric

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 ?

corbin patrice

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.

patrice

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.

Gonçalves

Extraordinaire et très utile.
Ceci me permet de faire des contrôles d’automatismes aléatoires pour mes élèves. Merci beaucoup.

Gonçalves

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.