Correction automatisée de formulaires QCM
Installez texlive en ligne (voir ci-dessous) ou avec un DVD (https://www.xm1math.net/doculatex/install_texlive_ubuntu.html.
wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz tar -xzf install-tl-unx.tar.gz cd install-tl-20xxxx sudo ./install-tl
Note | |
---|---|
Remplacez xxxx par les chiffres ou appuyez sur la touche TABULATION. |
Installez TeXLive en suivant le point 6 de cette documentation. (https://www.xm1math.net/doculatex/install_texlive_ubuntu.html.
Note | |
---|---|
Par défaut, tout est installé. Si vous ne voulez pas tous les paquets, appuyez sur C puis sélectionnez vos paquets puis R puis I. |
sudo apt install equivs --no-install-recommends mkdir -p /tmp/tl-equivs && cd /tmp/tl-equivs equivs-control texlive-local
Ouvrez le lien et notez le numéro de version :
https://www.tug.org/texlive/files/debian-equivs-20xx-ex.txt.
wget -O texlive-local http://www.tug.org/texlive/files/debian-equivs-20xx-ex.txt equivs-build texlive-local sudo dpkg -i texlive-local_20xx-x_all.deb sudo apt install -f
Installez AMC.
sudo add-apt-repository ppa:alexis.bienvenue/stable && sudo apt-get update sudo apt-get install auto-multiple-choice && sudo apt-get install msmtp
Créez un lien symbolique et mettez à jour TeXLive.
sudo ln -s /usr/share/texmf/tex/latex/AMC /usr/local/texlive/texmf-local/tex/latex/AMC sudo mktexlsr sudo tlmgr update --self --all
Vous pouvez imprimer le fichier DOC-sujet.pdf
en 2 pages
sur 1 feuille avec n'importe quel lecteur pdf mais AMC ne pourra pas traiter le fichier
numérisé, vous devez le « découper ».
Convertissez le fichier pdf en images.
pdfimages votrefichierreponses.pdf unnomdefichier
« Coupez » chaque image en deux.
mogrify -rotate -90 -crop 50%x100% *.pbm
Note | |
---|---|
Inutile de faire après la commande précédente : mogrify -rotate +90 -crop 50%x100% *.pbm toutes les pages seront traitées et renommer automatiquement par ImageMagick. Si les cases ne sont pas assez foncées ou mal détéctées, vous pouvez choisir un seuil pour lequel ImageMagick convertira les cases en noires (ici 80%). mogrify -rotate -90 -crop 50%x100% -threshold 80% *.pbm
|
Lancez le traitement en sélectionnant les fichiers pbm
.
Issu de https://project.auto-multiple-choice.net/attachments/450/Wiki_AMC_et_PythonTex.pdf et https://project.auto-multiple-choice.net/projects/auto-multiple-choice/wiki/Calcul_formel_avec_Python_dans_AMC
Il faut ajouter un script nommé prePythonTex4AMC et le rendre exécutable.
#! /bin/sh SRC=$1 echo "***** JOBNAME=$AMC_JOBNAME" echo "***** CMD=$AMC_CMD" rm -rf ./pythontex-files-* rm -f $AMC_JOBNAME.pytxcode $AMC_CMD echo "***** PYTHON" python /chemin/vers/fichier/pythontex.py $AMC_JOBNAME.pytxcode echo "***** END FILTER"
Note | |
---|---|
python3 fonctionne aussi. python3 /chemin/vers/fichier/pythontex3.py |
Il faut ajouter au début du fichier LaTex les trois lignes suivantes.
%%AMC:preprocess_command=/chemin/vers/fichier/prePythonTex4AMC %%AMC:jobspecific=1 %%AMC:latex_engine=pdflatex --shell-escape
Avertissement | |
---|---|
Certains modules python doivent être installés (sympy, pygments) |
%%AMC:preprocess_command=/chemin/vers/fichier/prePythonTex4AMC %%AMC:jobspecific=1 %%AMC:latex_engine=pdflatex --shell-escape \documentclass[a4paper]{article} \usepackage[T1]{fontenc} \usepackage[francais,bloc,completemulti]{automultiplechoice} \usepackage{fancyhdr,amssymb,amsmath} % ---------- Utilisation de codes Python ----- \usepackage{pythontex} %---------------------------------------------- \begin{pycode} import numpy as np from sympy import * np.random.seed(12345) # IMPORTANT : Graine pour la fonction random def polyv2(b,p,d,q) : x=Symbol('x') myp = expand((x-b)**p*(x-d)**q) return latex(myp) def dp1x(a,b,c) : x=Symbol('x') y=Symbol('y') f=(a*y-1)/(b*x-1)**c g=diff(f,x,1) g2=g/b g3=g*(-1) g4=g2*(-1) gl = latex(g) g2l = latex(g2) g3l = latex(g3) g4l = latex(g4) return np.array([gl,g2l,g3l,g4l]) \end{pycode} \begin{document} \element{Questions}{% \begin{question}{QA}La valeur de $\pi$ est \begin{reponses} \bonne{\py{np.pi}} \mauvaise{\py{100+200}} \mauvaise{\py{np.random.randint(10)+3.15}} \end{reponses} \end{question} \begin{question}{QB} \pyc{a=np.random.randint(10)} \pyc{b=np.random.randint(10)} \pyc{z=np.complex(a,b)} Soit le nombre complexe $\underline{Z}=\py{a}+i.\py{b}$, quelle est la valeur de $\underline{Z}^2$~? \begin{reponses} \bonne{\py{z**2}} \mauvaise{\py{np.conj(z**2)}} \mauvaise{\py{1/z}} \end{reponses} \end{question} }% \exemplaire{5}{ %%% debut de l'en-tête des copies : \noindent{\bf QCM \hfill TEST} \vspace*{.5cm} \begin{minipage}{.4\linewidth} \centering\large\bf Devoir surveillé\\ Mathématiques \end{minipage} \champnom{\fbox{ \begin{minipage}{.5\linewidth} Nom et prénom : \vspace*{.5cm}\dotfill \vspace*{1mm} \end{minipage} }} \vspace*{3mm} {\setlength{\parindent}{0pt}\AMCcodeGridInt{etu}{3}\hspace*{\fill} \begin{minipage}[b]{12.8cm} %12cm %---------------------------------------- \hfill\champnom{\fbox{ \begin{minipage}{0.96\linewidth} \vspace*{3mm} %3mm $\leftarrow$ {\footnotesize Codez votre QCM-Number.\hspace{1.6ex}} || NOM : {\footnotesize ( centaines, dizaines et unités )\hspace{2.19ex}} || Prénom : {\footnotesize Complétez le cadre ci-contre} $\rightarrow$ \hspace{0.2ex} || Groupe : \vspace*{3mm} \end{minipage} } } \hfill %------------------------------------- \begin{center}\em Les questions faisant apparaître le symbole \multiSymbole{} présentent plusieurs bonnes réponses. Les autres ont une unique bonne réponse. L'indiquer sur cette feuille en noircissant la case correspondante au stylo à bille noir. Aucune justification n'est demandée. Les réponses fausses retirent la moitié des points. Une absence de réponse n'enlève pas de points. Pour rectifier une erreur, utilisez un correcteur "blanc" pour faire disparaître complètement la case noircie par erreur. Calculatrice autorisée. \end{center} \end{minipage}\hspace*{\fill} } \vspace{5ex} %%% fin de l'en-tête \begin{question}{deriv-px-1} \pyc{a=np.random.randint(2,7)} % \pyc{b=np.random.randint(2,5)} % \pyc{c=np.random.randint(2,5)} % \pyc{drvx=dp1x(a,b,c)} On donne la fonction suivante : $f(x,y)= \dfrac{\py{a} y-1}{(\py{b} x-1)^{\py{c}}}$ Quelle est la dérivée partielle $ \dfrac{\partial f(x,y)}{\partial x}$ ? \begin{reponseshoriz} \bonne{$\py{drvx[0]}$} \mauvaise{$\py{drvx[1]}$} \mauvaise{$\py{drvx[2]}$} \mauvaise{$\py{drvx[3]}$} \end{reponseshoriz} \end{question} %--------------- % POLYNOME %-------------- \begin{question}{polynome-v2} \pyc{b=np.random.randint(2,7)} % racine r = b \pyc{p=np.random.randint(2,4)} % p : ordre de mult de b \pyc{d=np.random.randint(2,5)} % racine r = d \pyc{q=np.random.randint(2,3)} % q : ordre de mult de d \pyc{mypoly=polyv2(b,p,d,q)} % construction de mypolyv2 On donne le polynôme suivant : $\py{mypoly}$ Quel est l'ordre de multiplicité de la racine $r = \py{b}$ ? \begin{reponseshoriz} \bonne{$\py{p}$} \mauvaise{$\py{p+1}$} \mauvaise{$\py{p-1}$} \mauvaise{$\py{p+2}$} \end{reponseshoriz} \end{question} \restituegroupe{Questions} } \end{document}
Connectez-vous sur votre compte GMAIL puis activez l'option : autoriser les applications non sécurisées.
Tapez dans un terminal :
sudo apt-get install msmtp
sudo gedit /etc/msmtprc
et copiez le texte suivant puis enregistrez le fichier.
account gmail host smtp.gmail.com tls on tls_certcheck off port 587 auth login from votre adresse mail du compte gmail user votre adresse mail du compte gmail password votre mot de passe du compte gmail
Dans les préférences de AMC :
→ → → , choisir et mettre le chemin :/usr/bin/msmtp
Tapez dans un terminal :
sudo port install msmtp
sudo pico ~/.msmtprc
et copiez le texte suivant puis enregistrez le fichier.
account default host smtp.gmail.com tls on tls_certcheck off port 587 auth login from votre adresse mail du compte gmail user votre adresse mail du compte gmail password votre mot de passe du compte gmail
Modifiez les droits d'accès :
sudo chown nom_utilisateur:nom_utilisateur/Users/nom_utilisateur/.msmtprc chmod 0600 /Users/nom_utilisateur/.msmtprc
Dans les préférences de AMC :
→ → → , choisir et mettre le chemin :/opt/local/bin/msmtp
Si vous utilisez Texmaker, vous pouvez ajouter les raccourcis des
environnements question et réponses en allant dans le Menu \begin{question}{}
puis cliquez
sur ajouter. Faites de même avec reponses et
reponseshoriz.
La documentation du paquet fp n'est pas très détaillée et compréhensible pour un grand débutant au langage latex. Voici les commandes expliquées par un exemple.
La commande \FPprint{\x}
permet d'afficher la
valeur de x. Cependant, la commande \num{...}
du paquet
siunitx
est préférable car elle affiche une virgule
pour les nombres décimaux au lieu d'un point et groupe par trois les
chiffres.
\usepackage{siunitx} \sisetup{locale = FR,detect-all,quotient-mode=fraction, input-product=*, list-final-separator = { \translate{et} }, list-pair-separator = { \translate{et} },range-phrase = { \translate{à} }, separate-uncertainty = true,group-minimum-digits=3}
La fonction \FPrandom{\x}
calcul un nombre
aléatoire.
La fonction \FPseed=12345
permet de modifier le
système de génération de nombre aléatoire (choisir un entier fixé à
sa convenance).
La fonction \FPeval{\x}{...}
permet de faire des
calculs et d’affecter le résultat à la variable
\x
.
La fonction \FPtrunc{\y}{\x}{a}
transfère le
nombre \x avec a chiffres après la virgule à la variable
\y
.
Note | |
---|---|
On peut cumuler les fonctions \FPeval{\x}{trunc(a+random*b,c)} |
La fonction \FPround{\y}{\x}{a}
transfère le
nombre \x
avec a chiffres après la virgule à la
variable \y et arrondi.
La fonction \FPclip{\y}{\x}
transfère le nombre
\x
, sans les zéros après la virgule, à la variable
\y
.
Les fonctions \FPadd{\x}{a}{b}
,
\FPdiv{\x}{a}{b}
, \FPmul{\x}{a}{b}
,
\FPsub{\x}{a}{b}
attribue à la variable \x
la somme a+b
, le quotient a/b
, le produit
a*b
, et la différence a-b
La fonction \FPset{\x}{\y}
attribue à la variable
\x
(macro ou chaîne) la valeur \y
\FPabs{\x}{a}
renvoie la valeur absolue de
a
, \FPneg{\y}{a} renvoie l'opposé de
a
La commande \FPiflt{\x}{\y} {instruction 1} \else
{instruction 2} \fi
vérifie si \x
est inférieur
à \y
dans ce cas l'instruction 1 est lancée sinon c'est
l'instruction 2.
Même principe les fonctions \FPifeq{\x}{\y}
,
\FPifgt{\x}{\y}
, \FPifneg{\x}
,
\FPifpos{\x}
, \FPifzero{\x}
,
\FPifint{\x}
qui sont respctivement des tests
d'égalité, de supériorité, de négativité, de positivité, de nullité
ou d'entier.
La commande \FPlsolve{\x}{a}{b}
cherche la valeur
réelle \x
pour résoudre l'équation
a*x+b=0.
La commande \FPqsolve{\x}{\y}{a}{b}{c}
cherche
les valeurs réelles \x
et \y
pour résoudre
l'équation
a*x^2+b*x+c=0
La commande \FPcsolve{\x}{\y}{\z}{a}{b}{c}{d}
cherche les valeurs réelles \x
, \y
et
\z
pour résoudre l'équation
a*x^3+b*x^2+c*x+d=0
La commande
\FPqqsolve{\w}{\x}{\y}{\z}{a}{b}{c}{d}{e}
cherche les
valeurs réelles \w
, \x
, \y
et
\z
pour résoudre l'équation
a*x^4+b*x^3+c*x^2+d*x+e=0
La commande \FPe
renvoie la valeur de
e=2.71828182845904523, la commande \FPpi
renvoie la
valeur de pi.
La commande \FPexp{\x}{a}
attribue à la variable
\x
la valeur e^a, la commande \FPln{\x}{a}
attribue à la variable \x
la valeur ln(a)
La commande \FPpow{\x}{a}{b}
attribue à la
variable \x
la valeur a^b
La commande
\FProot{\x}{a}{b}
attribue à la variable
\x
la valeur a^(1/b).
On peut écrire \FPeval{\x}{root(b,a)}
La commande \FPpascal{\x}{a}
attribe à
\x
la ligne a du triangle de pascal.
La commande \FPsin{\x}{a}
attribue à
\x
la valeur du sinus de a qui est exprimé en radians
(il existe une commande identique pour le cosinus
(cos
), la tangente (tan
), la cotangente
(cot
), l'arcsinus (arcsin
), l'arccosinus
(arccos
), l'arctangente (arctan
),
l'arccotangente (arccot
)).
\FPeval{\x}{sin(30*\FPpi/180)}\FPprint{\x}
La commande \FPsincos{\x}{\y}{a}
attribue à
\x
la valeur du sinus de a
qui est exprimé
en radians et \y
la valeur du cosinus de a
qui est exprimé en radians.
La commande \FPtancot{\x}{\y}{a}
attribue à
\x
la valeur de la tangente de a
qui est
exprimé en radians et \y
la valeur de la cotangente de
a
.
La commande \FParcsincos{\x}{\y}{a}
attribue à
\x
la valeur de l’arc sinus(a), \x
sera
exprimé en radians, à \y
la valeur de l’arc cosinus(a),
\y
sera exprimé en radians.
La commande \FParctancot{\x}{\y}{a}
attribue à
\x
la valeur de l’arc tangente(a), \x
sera
exprimé en radians, à \y
la valeur de l’arc
cotangente(a), \y
sera exprimé en radians.