Les maths du yeti


Le yeti explorateur de mathématiques

RandAssign : un script pour générer autant de sujets de devoirs que d'élèves (et avec les correction s'il vous plaît !)

Présentation

RandAssign est un programme permettant de créer des documents latex.

Dans ces documents vous pouvez paramétrer des variables de sorte que votre texte ait une composante aléatoire. Pour ma pratique professionnelle, changer des valeurs pour chaque élèves. RandAssign permet aussi de générer une correction par élève.

Je l'ai testé en Devoir en Templs Libre et en devoir surveillé pour l'instant et cela a bien fonctionné.

 

Installation

Pour commencer voici le lien vers le GitHub du developpeur Vers GitHub

Plusieurs possibilités pour installer le package, elles sont détaillées sur GitHub. Pour ma part j'ai utilisé pip :

Le package PythonTex doit être installé (voir ici pour découvrir ce fabulleux package)

Ensuite la réalisation de votre document se fera en suivant ces étapes :

  • Créer un document students.txt  dans le même dossier que votre fichier tex qui contiendra la liste des élèves.
    Attention, encodez votre fichier en UTF-8 pour ne pas avoir de problèmes avec les accents. J'utilise notepad++ pour le créer.
    Voici le fichier student.tex utilisé dans cet exemple.
  • Ecrire le document LaTeX qui contiendra \usepackage{pythontex} et \input{name.tex} pour intégrer le nom de l'élève destinataire.
    Il est possible d'ajouter \input{attempt.tex}  pour intégrer le numéro de la "tentative" de l'élève.

  • Dans ce document, intégrer les variables générées aléatoirement
    Voir ici la documentation du module random de python
  • Au début d'une session PythonTex il faut les lignes suivantes
    from randassign import RandAssign
    ra = RandAssign()
    

    Dans cette session, les solutions des questions sont ajoutées via ra.addsoln() .
  • Ensuite, il faut compiler le document. Randassign <tex_file> puis Latex <tex_file>.
    J'ai intégré ces commandes dans Texmaker : E:\Python34\Scripts\randassign --texcmd "pdflatex --shell-escape -synctex=1 -interaction=nonstopmode" %.tex
    Commande à adapter à votre installation bien sûr.

Un exemple "simple"

J'ai repris un des exemples présent sur le github de randassign.

Voici ci-dessous un lien vers les sujets en pdf de chaque élève , un lien vers la solution et enfin un lien vers le fichier source.
J'ai "compilé" deux fois pour avoir deux "versions" ou "tentatives" par élèves.

Les sujets La solution La source students.txt

% Simple example for RandAssign
% Geoffrey M. Poore, 2015
% License:  Creative Commons Zero (CC0) license
%           https://creativecommons.org/about/cc0
%
% Manual compile: run LaTeX, then PythonTeX, then LaTeX again
% Generate randomized assignments:  run `randassign example_simple.tex`
% Modifié en version francais par Mikael LE MENTEC (2019)

\documentclass{article}
\usepackage[utf8]{inputenc} %Encodage UTF-8 pour les accents
\usepackage[frenchb]{babel} %Package pour un document avec les règle typo. françaises

\usepackage{nopageno}   % Style de page "vide"
\usepackage{pythontex}  % Obligatoire, à installer avant de compiler
\usepackage{xcolor}     % Package pour de jolies couleurs
\usepackage{tikz}       % Pour éaliser la figure


%%%%%%%%%%%%%%%%%%%%%% LEs commentaires en python commencent par un #
\begin{pycode} 
from randassign import RandAssign   # import du module python
ra = RandAssign()                   # Appel et affectation de l'objet RandAssign qui contiendra les solutions
from math import *                  # import du module maths pour la racine carrée
import random                       # import du module random pour générer des nombres aléatoires
\end{pycode}
%%%%%%%%%%%%%%%%%%%%%%


\title{Énoncé aléatoirisé \\ {\Large Version \# \input{attempt.tex}}}
\author{NOM: \underline{~~~~\input{name.tex}~~~~}}

\begin{document}

\maketitle

\begin{pycode}
a = random.randint(1, 10)
b = random.randint(1, 10)
c = sqrt(a**2 + b**2)

dessin = '''
\\begin
\\draw[style=help lines] (0,0) grid (10,10);
\\filldraw[fill=blue!40!white] (0,0) -- ({a},0) -- ({a},{b}) -- cycle;
\\end
'''.format(a=a, b=b)

ra.addsoln(
''' La longueur de l'hypoténuse est d'environ {c}~cm'''.format(c = round(c, 2))
)
\end{pycode}

Un triangle rectangle possède une base de longueur \py{a}~cm et une hauteur de longueur \py{b}~cm.\\
Déterminer la longueur de l'hypoténuse de ce triangle, arrondir au dixième de~mm.

\begin{center}
\py{dessin}
\end{center}

\end{document}

Remarque : pour imprimer plus facilement les sujets, je regroupe tous les pdf en un seul avec PDFsam Basic

Un exemple avancé : un sujet de brevet d'entrainement.

Mon objectif a été de créer un sujet de DTL (Devoir en Temps Libre) donné pendant les vacances.

Comme de nombreux collègues, je n'aime pas corriger 10 fois la même copie. J'ai donc tenté d'utiliser RandAssign pour générer un sujet par élève.

Dans cet exemple, j'ai généré la correction à la suite du sujet sur une deuxième page. Je n'ai donc pas utilisé ra.soln.append() pour générer les réponses. Mais j'ai intégré ra.soln.append('test') dans mon code car sinon j'avais, il me semble, une erreur.

Voici ci-dessous un lien vers le dossier contenant les sources et les pdf de ce sujet de DTL :

Vers les sources Le sujet pour la classe

 

Le bilan est plutôt positif :

  • La recopie bête et méchante des élèves a disparu. A la place les élèves se sont aidés comme d'habitude mais plus question de repomper les réponses du meilleur élève de la classe vite fait dans le bus.
    Je ne suis pas sûr que le bénéfice est plus grand pour tous les élèves... c'est à étudier plus en détail car les bons ont pu "refiler leurs recettes" pour répondre aux questions.
  • Le retour des élèves est positif, ils ont appréciés le côté "individualisé" de l'énoncé qui leur retire la tentation de la recopie.
  • Au moment de la correction, j'ai été plus concentré sur les réponses des élèves sans avoir à me demander si je n'avais pas vu cette réponse quelque part. Cela "libère" l'esprit je trouve.
    Par contre, il  faut s'oganiser, pour ma part j'ai corrigé devant l'ordinateur avec le pdf des réponses ouvert devant moi, et j'ai commencé par trier les copies par ordre alphabétique pour ne pas chercher les copies ou les réponses.
  • J'ai constaté quelques défauts, le premier est que dans les réponses, les nombres apparaissent avec le point comme séparateur décimal. Je n'ai pas trouvé de solution.
    Dans le sujet j'ai réussi avec ce code :
    \usepackage[output-decimal-marker={,}]{siunitx} % Pour transformer le .  en virgule decimale en mode maths
    \mathcode`\.="013B
  • Il faut bien réfléchir à la méthode de génération des nombres aléatoires pour tomber sur des questions de difficultés trop variables suivant les copies.
  • PythonTex donne parfois des réponses surprenantes, je me rapelle d'une réponse du genre 25,00000009  au lieu de 25.
    J'arrondi mes résultats avec round() pour gérer ses problèmes.
  • Dans la correction, si le code est correct, j'étais plus sûr des réponses produites.
  • Autre avantage pour les devoirs en classe, le fait de pouvoir générer un nouveau sujet (pour un absent) en quelques clics !!!
    Et ça, ça n'a pas de prix !