Bonsoir,

Tout juste inscrit donc, pour commencer, bonjour à tous !

Ainsi que renseigné dans ma description, je suis professeur de mathématiques en lycée et utilisateur de LaTeX depuis de nombreuses années, bien qu'encore néophyte sur certains de ses aspects.

L'an dernier, accompagné par un collègue de maths, Jean-Marc Duquesnoy, je me suis mis à pythontex. D'une part, c'est cohérent avec l'enseignement de l'algorithmique et son implémentation en python du programme de BTS SIO 1re année, d'autre part cela permet de générer des sujets avec des éléments aléatoires ; un des bénéfices étant de limiter la "fraude de voisinage".

J'ai une solution fonctionnelle mais qui me paraît "lourde" et je me demande si vous auriez des idées de procédures autres, voire moins "lourdes".

Ma solution actuelle est constituée de deux fichiers :

  1. Un source LaTeX contenant du code python, nécessitant donc une triples compilation (1)LaTeX/(2)pythontex/(3)LaTeX
  2. Un script bash avec une variable d'environnement récupérée par le source LaTeX à la compilation, plus précisément aux compilations (1) et (3)

Ci-dessous, un ECM. Merci de vos éventuelles suggestions. Cordialement,

Fichier 1 : ECM_variable.tex


\documentclass{article}

%%% Accès aux variables d'environnement.
% Référence :
% https://tex.stackexchange.com/questions/62010/can-i-access-system-environment-variables-from-latex-for-instance-home
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\getenv}{om}
 {
  \sys_get_shell:nnN { kpsewhich ~ --var-value ~ #2 } { } \l_tmpa_tl
  \tl_trim_spaces:N \l_tmpa_tl
  \IfNoValueTF { #1 }
   {
    \tl_use:N \l_tmpa_tl
   }
   {
    \tl_set_eq:NN #1 \l_tmpa_tl
   }
 }
\ExplSyntaxOff

%%% Interaction avec python.
% Triple compilation nécessaire : LaTeX -> pythontex -> LaTeX
\usepackage{pythontex}

\begin{document}

\begin{pycode}
from random import randint

a,b = randint(1,5),randint(6,10)
\end{pycode}

\getenv[\NUM]{NUMERO}
Sujet \NUM

Calculer $\py{a}+\py{b}$

\end{document}

Fichier 2 : Plusieurs.sh


#!/bin/bash
nb=2
# Boucle pour le nombre de sujets demandés.
for i in `seq 1 $nb`; do
    # Variable d'environnement utilisée par le source LaTeX pour numéroter le sujet
    export NUMERO=$i
    # On copie le source LaTeX puis on effectue les trois compilations
    # nécessaires pour obtenir le PDF contenant sujet et corrigé.
    cp ECM_variable.tex exemplaire$i.tex
    pdflatex exemplaire$i.tex
    pythontex exemplaire$i.tex
    pdflatex exemplaire$i.tex
done

Utilisation : placer les deux fichiers dans le même répertoire, rendre exécutable le script bash et l'exécuter :-)

Posée 23 Sep, 20:43

mumblee's gravatar image

mumblee
314
Taux d'acceptation : 0%

Modifiée 23 Sep, 21:00

J'ai un souci avec mon bloc de code correspondant au script bash. Je suppose que le moteur du forum n'apprécie pas la première ligne. J'essaie de trouver une solution...

(23 Sep, 20:46) mumblee mumblee's gravatar image

Avec les bonnes balises, c'est plus lisible :-)

(23 Sep, 20:58) mumblee mumblee's gravatar image

@mumblee : bienvenue sur TeXnique !

(23 Sep, 21:14) Pathe ♦♦ Pathe's gravatar image

Pouvez-vous préciser en quoi votre solution est lourde ?

(23 Sep, 21:37) denis ♦♦ denis's gravatar image
1

Bonjour Denis,

Derrière mumblee c'est Fabrice Eudes :-)

L'appréciation "lourde" vient des triples compilations répétées. Lorsque je génère 38 sujets, cela prend donc un certain temps. Mais je ne sais pas si, avec la contrainte des valeurs aléatoires, on pourrait faire plus court...

(24 Sep, 12:00) mumblee mumblee's gravatar image

Je ne sais pas si ça vous convient ou pas, mais vous pouvez inverser la logique: 38 sujet dans un seul fichier .tex (et donc .pdf). C'est pratique pour impression.

(24 Sep, 20:40) touhami touhami's gravatar image

Bonjour Fabrice :) La suggestion de touhami me semble tout à fait pertinente. J'ajouterais que, pour créer des sujets avec éléments aléatoires, une autre solution consiste à utiliser Auto Multiple Choice (même si j'ai bien compris l'intérêt de recourir à pythontex) ; au cas où ça t'intéresse, son auteur a donné un exposé à son sujet dans le cadre des exposés mensuels de l'association GUTenberg.

(24 Sep, 21:42) denis ♦♦ denis's gravatar image

Merci pour cette piste. Je vais aller regarder cet exposé.

PS : je n'avais pas vu les réponses et commentaires plus tôt car les mails envoyé par TeXnique sont systématiquement classés en indésirables par gmail. On va me dire d'utiliser une autre adresse mail :-) mais si quelqu'un a la solution pour éviter cela... (je vais regarder les entêtes pour tenter de comprendre ce classement en indésirable)

(27 Sep, 12:15) mumblee mumblee's gravatar image

Les mails ne passent pas l'authentification DMARC. Extrait de l'entếte :

SPF : PASS avec IP 158.120.84.217 En savoir plus DKIM : 'PASS' avec le domaine smtpservice.net En savoir plus DMARC : 'FAIL' En savoir plus

(27 Sep, 12:21) mumblee mumblee's gravatar image

La variable NUMERO ne sert à rien.

Il me semble qu'il existe un paquetage pour générer des nombres aléatoires en Latex, donc Python est inutile.

Lancer 1 + 3 x 38 processus, et charger les paquetages à chaque fois, oui c'est lourd. On peut générer un seul document PDF que l'on découpe en parties après si besoin. C'est plus simple et plus rapide.

(28 Sep, 00:07) polymorphisme polymorphisme's gravatar image

La variable NUMERO sert à modifier le titre du document lors des compilations successives lancées via le script. Mon utilisation de pythontex ne se résume pas à générer un nombre aléatoire. J'ai indiqué que c'était un ECM. Je précise que, pour mes documents "réels", j'ai besoin de pythontex.

(28 Sep, 19:27) mumblee mumblee's gravatar image

Ok, c'est plus clair pour moi, merci.

(29 Sep, 00:21) polymorphisme polymorphisme's gravatar image

Je suggère de jeter un coup d'œil à pyluatex: il n'y a besoin que d'une seule compilation LaTeX et aucun fichier extérieur n'est généré. Bien sûr, je recommande aussi mon extension piton pour le formatage du code, beaucoup plus rapide que le passage par Pygments comme le fait minted...

(03 Oct, 17:51) fpantigny fpantigny's gravatar image
Affichage de 5 parmi 13 Afficher 8 commentaire(s) en plus

Voici une solution: une section a été ajoutée pour le code python commun entre les sujets, ce qui peut être pratique pour réduire le temps de compilation.

Fichier principal sujetsmaker.tex:

\documentclass{article}
\usepackage{tikz}

\ExplSyntaxOn
\clist_new:N \l_mumblee_clist
\clist_set:Nn \l_mumblee_clist {section,subsection,exo,page}% compteurs à initialiser
\newtheorem{exo}{Exercice}% pour l'exemple
\newcounter{sujetcnt}% pour l'exemple
\NewDocumentEnvironment{sujet}{ }
{
\newpage
\clist_map_inline:Nn \l_mumblee_clist {\setcounter{##1}{0}}
\stepcounter{sujetcnt}\stepcounter{page}
\section*{Sujet~no~\thesujetcnt}
}{}
\cs_new_eq:NN \mumbleerepeat \prg_replicate:nn
\ExplSyntaxOff
\usepackage{pythontex}

% code python commun
\begin{pycode}
from random import randint
\end{pycode}

\begin{document}
\mumbleerepeat{5}{\input{txtsujet}}
\end{document}

Fichier avec le contenu de sujet txtsujet.tex

\begin{sujet}
\begin{exo}
\begin{pycode}
a,b = randint(1,5),randint(6,10)
\end{pycode}

Calculer $\py{a}+\py{b}$
\end{exo}
\end{sujet}

Pour la compilation

latex sujetsmaker
pythontex sujetsmaker
latex sujetsmaker

Lien permanent

Publiée 29 Sep, 14:46

touhami's gravatar image

touhami
10.3k410
Taux d'acceptation : 52%

Modifiée 01 Oct, 21:00

Bonsoir,

Merci. Il faut que j'épluche et que je comprenne ce code mais ça m'a tout à fait l'air de faire l'affaire !

Je teste et je reviens valider la solution.

PS : il semble que je vais devoir me mettre à LaTeX3...

(29 Sep, 19:54) mumblee mumblee's gravatar image

Bonjour,

C'est parfait, merci beaucoup !

Tout à fait ce que je souhaitais : des sujets avec une partie aléatoire, identifiables à l'aide d'une numéro et dont la production de l'ensemble ne nécessite qu'une seule triple compilation.

Remarque : les lignes 28 et 29 de "sujetsmaker.tex", après le premier "end{document}" sont inutiles non ?

(01 Oct, 14:29) mumblee mumblee's gravatar image

Oui, en effet, tout ce qui est après \end{document} est ignoré par LaTeX.

(01 Oct, 21:02) touhami touhami's gravatar image

Bonsoir, Après une utilisation "en situation" de cette solution, j'ai un petit souci. Non sur le fonctionnement général mais sur un potentiel effet de bord sur la mise en page. En effet, j'ai vérifié avec le package 'layout' que mes paramètres du paquet geometry étaient bien pris en compte (marges gauche, droite, haut et bas égales à 1cm par exemple), cependant l'environnement 'sujet' semble générer un décalage vers la droite. Peut-on s'en débarrasser ? Désolé de déterrer le sujet. Je peux poser une nouvelle question si nécessaire.

(13 Oct, 20:45) mumblee mumblee's gravatar image

Oui, vous pouvez remplacer l'environnement sujet par une autre solution. Toutefois, je ne vois pas du problème de décalage. Il est donc préférable de poser une nouvelle question avec un exemple minimal qui montre le problème.

(13 Oct, 22:18) touhami touhami's gravatar image

Bonsoir, Le décalage provenait de l'indentation de paragraphe qui s'applique à l'ensemble du résultat produit par la commande input. Avec un simple setlength{parindent}{0mm} tout est rentré dans l'ordre. Une nouvelle question ne sera pas nécessaire :-) Désolé du dérangement.

(14 Oct, 20:09) mumblee mumblee's gravatar image
Affichage de 5 parmi 6 Afficher 1 commentaire(s) en plus
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.