RandAssign


Le yeti explorateur de mathématique et d'informatique. yeti

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 développeur  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 fabuleux 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.txt utilisé dans cet exemple.
  • Écrire le document LaTeX qui contiendra \usepackage{pythontex} et \input{name.tex} pour intégrer le nom de l'élève destinataire. (le fichier name.tex sera généré automatiquement par randassing)
    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 pour la documentation
    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 : D:\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
% Adapté en français par Mikael LE MENTEC 2021
% 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`

\documentclass{article}

\usepackage{nopageno}
\usepackage{pythontex}
\usepackage{xcolor}
\usepackage{tikz}

\begin{pycode}
from randassign import RandAssign
ra = RandAssign()
from math import *
import random
\end{pycode}

\title{Exemple simple pour RandAssign \\ {\Large Attempt: \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)
ra.addsoln(round(c, 2))
\end{pycode}

Un triangle rectangle a une base de \py{a}~cm et une hauteur de \py{b}~cm. Déterminez la longueur de l'hypoténuse.



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

\end{document}

Remarques :

  • pour imprimer plus facilement les sujets, je regroupe tous les pdf en un seul avec  PDFsam Basic
  • j'ai découvert récemment comment intégrer proprement du code tikz avec l'environnement pysub (voir ci-dessus)
    grâce au lien suivant : Vers des techniques avancées

Un exemple avancé : un DTL.

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.

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

Vers les sources Les sujets Le corrigé

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'organiser, 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 rappelle d'une réponse du genre 25,00000009  au lieu de 25.
    J'arrondis 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 !