{"id":10961,"date":"2025-06-10T18:59:00","date_gmt":"2025-06-10T16:59:00","guid":{"rendered":"https:\/\/www.mathweb.fr\/euclide\/?p=10961"},"modified":"2025-06-10T18:59:09","modified_gmt":"2025-06-10T16:59:09","slug":"un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement","status":"publish","type":"post","link":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/","title":{"rendered":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cr\u00e9er un QCM et les corriger automatiquement, c&rsquo;est une chose que l&rsquo;on peut faire avec <a href=\"https:\/\/www.auto-multiple-choice.net\/fr\/install\/\">https:\/\/www.auto-multiple-choice.net\/fr\/install\/<\/a>, mais ceci n&rsquo;est installable facilement que sur Linux ou MacOS. L&rsquo;installer sous windows n\u00e9cessite d&rsquo;installer un \u00e9mulateur Linux.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;envisage donc de me lancer dans un projet, mais je ne sais pas trop o\u00f9 je vais aller&#8230;<\/p>\n\n\n\n<!--more-->\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Au menu sur cette page...<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#Creer_un_QCM_et_les_corriger_automatiquement_lidee_generale\" >Cr\u00e9er un QCM et les corriger automatiquement: l&rsquo;id\u00e9e g\u00e9n\u00e9rale<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#Creer_un_QCM_et_les_corriger_automatiquement_le_traitement_en_Python\" >Cr\u00e9er un QCM et les corriger automatiquement: le traitement en Python<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#Construction_du_QCM_en_LaTeX\" >Construction du QCM en \\(\\LaTeX\\)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#Traitement_du_PDF_complete_en_Python\" >Traitement du PDF compl\u00e9t\u00e9 en Python<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#Et_la_suite%E2%80%A6\" >Et la suite&#8230;<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creer_un_QCM_et_les_corriger_automatiquement_lidee_generale\"><\/span>Cr\u00e9er un QCM et les corriger automatiquement: l&rsquo;id\u00e9e g\u00e9n\u00e9rale<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans <a href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/09\/06\/creer-un-qcm-avec-python-et-latex-a-partir-dun-fichier-texte\/\">cet article<\/a>, je vous expliquais comment cr\u00e9er un QCM en \\(\\LaTeX\\) \u00e0 l&rsquo;aide de Python, mais ce dernier n&rsquo;\u00e9tait pas interactif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e0, le projet est de cr\u00e9er des QCM interactifs (donc, sur lesquels ont peut choisir une r\u00e9ponse ou ins\u00e9rer un texte) qui pourraient \u00eatre corriger automatiquement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;id\u00e9e est de ne pas s&#8217;emb\u00eater, donc de partir d&rsquo;un fichier texte classique avec une structure de la forme:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>title=QCM sur n'importe quoi\n\nstyle=text\nSaisir un chiffre impair\n1,3,5,7,9\n\nstyle=qcm\nLe triangle de dimensions 3 cm, 4 cm et 5 cm est-il rectangle ?\nOui,Non\nOui<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque question est d\u00e9termin\u00e9e par la ligne : \u00ab\u00a0<em>style=&#8230;<\/em>\u00ab\u00a0. On aurait le choix entre:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00ab\u00a0text\u00a0\u00bb si la r\u00e9ponse attendue est \u00e0 saisir au clavier<\/li>\n\n\n\n<li>\u00ab\u00a0qcm\u00a0\u00bb si la question est \u00e0 choix multiple<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Creer_un_QCM_et_les_corriger_automatiquement_le_traitement_en_Python\"><\/span>Cr\u00e9er un QCM et les corriger automatiquement: le traitement en Python<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assumons le fait que le fichier pr\u00e9c\u00e9dent soit nomm\u00e9 <em>questionnaire.txt<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le premier script Python serait charg\u00e9 de lire ce fichier, de construire un fichier \\(\\LaTeX\\) et de le compiler.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensuite, il faut un second script Python pour lire  le PDF compl\u00e9t\u00e9 et v\u00e9rifier si les r\u00e9ponses sont correctes ou non.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les deux scripts, il me faut une fonction commune, celle qui permet de lire le fichier texte (<em>questionnaire.txt<\/em> pour notre exemple), qui en extrait les donn\u00e9es essentielles et les renvoie sous forme de dictionnaire. Ce sera la fonction suivante, que je vais mettre dans le fichier <em><strong>funcaux.py<\/strong><\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def parse_questionnaire(file_path):\n    with open(file_path, 'r') as file:\n        lines = file.readlines()\n\n    data = {}\n    current_style = None\n    question = None\n    options = None\n\n    for line in lines:\n        line = line.strip()\n        if not line:\n            continue\n\n        if line.startswith('title='):\n            data['title'] = line.split('=', 1)[1].strip()\n        elif line.startswith('style='):\n            current_style = line.split('=', 1)[1].strip()\n        else:\n            if current_style == 'text':\n                if question is None:\n                    question = line\n                else:\n                    data[question] = {'type': current_style, 'answers': line}\n                    question = None\n            elif current_style == 'qcm':\n                if question is None:\n                    question = line\n                elif options is None:\n                    options = line.split(',')\n                else:\n                    if question not in data:\n                        data[question] = {'type': current_style, 'options': options, 'correct_answer': line}\n                    question = None\n                    options = None\n\n    return data<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Construction_du_QCM_en_LaTeX\"><\/span>Construction du QCM en \\(\\LaTeX\\)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le premier script Python sera mis dans le fichier <em>create_qcm.py<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import os\nfrom funcaux import parse_questionnaire\n\n\n\"\"\"\nFonction qui cr\u00e9\u00e9 le fichier tex\n\"\"\"\n\ndef tex(dic, answer = False):\n    title = False\n    tex = r\"\"\"\\documentclass{article}\n\\usepackage[T1]{fontenc}\n\\usepackage{fourier}\n\\usepackage{hyperref}\n\\usepackage{tabularx}\n\\usepackage{cellspace}\n    \\setlength{\\cellspacetoplimit}{3mm}\n    \\setlength{\\cellspacebottomlimit}{1mm}\n\\usepackage[hmargin=1cm, vmargin=2cm]{geometry}\n\\newcounter{questions}\n\\setcounter{questions}{0}\n\\newcommand{\\question}{\\stepcounter{questions}\\arabic{questions}}\n\n\\setlength{\\parindent}{0pt}\n\\begin{document}\n\"\"\"\n    \n    if 'title' in questionnaire_data.keys():\n        tex += \"\\\\title{\"+dic['title']+\"}\\n\\\\date{}\\\\maketitle\\n\\begin{Form}\\n\"\n        del dic['title']\n        \n    elif answer == True:\n        tex += \"\\\\title{Correction}\\n\\\\date{}\\\\maketitle\\n\"\n    \n    tex += r\"\"\"\\begin{tabularx}{\\linewidth}{|Sc|X|Sl|}\n\\hline\"\"\"\n    \n    for key, value in dic.items():\n        if value['type'] == 'text':\n            if answer == False:\n                tex += \"\\\\question &amp; \" + key +  \" &amp; \\\\TextField[name=q\\\\arabic{questions},align=1, height=0.4em]{} \\\\\\\\\\n\\hline\\n\"\n            else:\n                tex += \"\\\\question &amp; \" + key +  \" &amp; \"+value['answers']+\" \\\\\\\\\\n\\hline\\n\"\n        elif value['type'] == 'qcm':\n            tex += \"\\\\question &amp; \" + key + \" &amp; \\\\begin{minipage}{30mm}\\n\"\n            if answer == False:\n                tex += \"\\\\ChoiceMenu[combo,name=q\\\\arabic{questions}, width=1em]{}{\"\n                for v in value['options']:\n                    tex += v + \",\"\n                \n                tex = tex[:-1] # pour supprimer la derni\u00e8re virgule\n                tex += \"}\\n\"\n            else:\n                tex += value['correct_answer'] + \"\\n\"\n            tex += \"\\\\end{minipage}\\\\\\\\\\n\"\n    \n    tex += r\"\"\"\\hline\n\\end{tabularx}\"\"\"\n    \n    if answer == False:\n        tex += \"\\end{Form}\\n\"\n        \n    tex += \"\\end{document}\"\n    \n    return tex\n\nif __name__ == '__main__':\n    file_path = 'questionnaire.txt'\n    questionnaire_data = parse_questionnaire(file_path)\n    doc_tex = tex(questionnaire_data)\n    \n    with open('questionnaire.tex', 'w', encoding='utf-8') as file:\n        file.write(doc_tex)\n        \n    # compilation PdfLaTeX dans le r\u00e9pertoire courant\n    cmd = 'echo Compilation du fichier '+doc_tex\n    cmd = \"pdflatex -shell-escape -synctex=1 -interaction=nonstopmode questionnaire.tex\"\n    os.system(cmd)\n    \n    # Pour le QCM corrig\u00e9\n    doc_tex_corr = tex(questionnaire_data,answer=True)\n    \n    with open('questionnaire_corr.tex', 'w', encoding='utf-8') as file:\n        file.write(doc_tex_corr)\n        \n    # compilation PdfLaTeX dans le r\u00e9pertoire courant\n    cmd = 'echo Compilation du fichier '+doc_tex\n    cmd = \"pdflatex -shell-escape -synctex=1 -interaction=nonstopmode questionnaire_corr.tex\"\n    os.system(cmd)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le script g\u00e9n\u00e8re via pdfLaTeX le PDF. Avec le fichier texte pr\u00e9c\u00e9dent, cela donne:<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file aligncenter\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire.pdf\" type=\"application\/pdf\" style=\"width:100%;height:600px\" aria-label=\"Contenu embarqu\u00e9 questionnaire.\"><\/object><a id=\"wp-block-file--media-cc1e9a59-2307-4e9f-b00e-2aca5a0c96ff\"  href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire.pdf\" data-fancybox data-type=\"iframe\" data-width=\"90%\" data-height=\"100%\" data-preload=\"false\">questionnaire<\/a><a  href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-cc1e9a59-2307-4e9f-b00e-2aca5a0c96ff\" data-fancybox data-type=\"iframe\" data-width=\"90%\" data-height=\"100%\" data-preload=\"false\">T\u00e9l\u00e9charger<\/a><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Si on choisit de le sauvegarder sous le nom de <em>questionnaire_complete.pdf<\/em>, on aura ceci:<\/p>\n\n\n\n<div data-wp-interactive=\"core\/file\" class=\"wp-block-file aligncenter\"><object data-wp-bind--hidden=\"!state.hasPdfPreview\" hidden class=\"wp-block-file__embed\" data=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire_complete.pdf\" type=\"application\/pdf\" style=\"width:100%;height:600px\" aria-label=\"Contenu embarqu\u00e9 questionnaire_complete.\"><\/object><a id=\"wp-block-file--media-85074ff9-289d-4ee2-8eec-b3d9249eb829\"  href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire_complete.pdf\" data-fancybox data-type=\"iframe\" data-width=\"90%\" data-height=\"100%\" data-preload=\"false\">questionnaire_complete<\/a><a  href=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/questionnaire_complete.pdf\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-85074ff9-289d-4ee2-8eec-b3d9249eb829\" data-fancybox data-type=\"iframe\" data-width=\"90%\" data-height=\"100%\" data-preload=\"false\">T\u00e9l\u00e9charger<\/a><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Traitement_du_PDF_complete_en_Python\"><\/span>Traitement du PDF compl\u00e9t\u00e9 en Python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Le second script est pis dans le fichier <em>correction.py<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import pypdf\nimport re\nfrom funcaux import parse_questionnaire\n\ndef clean_value(value):\n    # Supprimer les caract\u00e8res de contr\u00f4le et les s\u00e9quences d'\u00e9chappement\n    if isinstance(value, str):\n        # Utiliser une expression r\u00e9guli\u00e8re pour supprimer les caract\u00e8res non alphab\u00e9tiques\n        value = re.sub(r'[^a-zA-Z]', '', value)\n    return value\n\ndef format_pdf_fields(fields):\n    formatted_output = {}\n    for key, value in fields.items():\n        if value.get('\/FT') == '\/Tx':  # Champ de texte\n            formatted_output[key] = value.get('\/V', '')\n        elif value.get('\/FT') == '\/Ch':  # Champ de choix (combo ou liste)\n            if '\/V' in value:\n                formatted_output[key] = value['\/V']\n    return formatted_output\n\ndef correction(file_path):\n    # R\u00e9cup\u00e9ration du formulaire du PDF rendu\n    rendu = 'questionnaire_complete.pdf'\n    reader = pypdf.PdfReader(rendu)\n    output = reader.get_fields()\n\n    # Formatage de la sortie\n    formatted_output = format_pdf_fields(output)\n\n    #print( formatted_output )\n\n    # Lecture du fichier texte\n    questionnaire_data = parse_questionnaire(file_path)\n\n    #print(questionnaire_data)\n\n    # Analyse des r\u00e9ponses\n    dico_correction = {}\n    question = 0\n\n    for key, value in questionnaire_data.items():\n        if key != 'title':\n            question += 1\n            key_output = f\"q{question}\"\n            \n            if value['type'] == 'text':\n                possible_answers = [x for x in value['answers'].split(',')]\n                if formatted_output[key_output] in possible_answers:\n                    dico_correction[key_output] = True\n                else:\n                    dico_correction[key_output] = False\n                    \n            if value['type'] == 'qcm':\n                if formatted_output[key_output] == value['correct_answer']:\n                    dico_correction[key_output] = True\n                else:\n                    dico_correction[key_output] = False\n                \n    return dico_correction\n\nif __name__ == '__main__':\n    print( correction( 'questionnaire.txt' ) )\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce dernier affiche:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{'q1': True, 'q2': True}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Et_la_suite%E2%80%A6\"><\/span>Et la suite&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ce n&rsquo;est qu&rsquo;une base et si cela int\u00e9resse beaucoup de personnes, alors je pourrais faire \u00e9voluer ce projet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On peut imaginer par exemple que chaque \u00e9l\u00e8ve sauvegarde sont PDF avec le nom et le pr\u00e9nom, et l&rsquo;envoie \u00e0 l&rsquo;enseignant(e). L&rsquo;enseignant peut alors mettre les QCM dans un r\u00e9pertoire et faire tourner un script charg\u00e9 de tout corriger.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cr\u00e9er un QCM et les corriger automatiquement, c&rsquo;est une chose que l&rsquo;on peut faire avec https:\/\/www.auto-multiple-choice.net\/fr\/install\/, mais ceci n&rsquo;est installable facilement que sur Linux ou MacOS. L&rsquo;installer sous windows n\u00e9cessite d&rsquo;installer un \u00e9mulateur Linux. J&rsquo;envisage donc de me lancer dans un projet, mais je ne sais pas trop o\u00f9 je [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":10964,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,5],"tags":[],"class_list":["post-10961","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-latex","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr<\/title>\n<meta name=\"description\" content=\"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c&#039;est le projet dans lequel je me suis lanc\u00e9, \u00e0 l&#039;aide de Python et LaTeX.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr\" \/>\n<meta property=\"og:description\" content=\"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c&#039;est le projet dans lequel je me suis lanc\u00e9, \u00e0 l&#039;aide de Python et LaTeX.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/\" \/>\n<meta property=\"og:site_name\" content=\"Mathweb.fr\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-10T16:59:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-10T16:59:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"740\" \/>\n\t<meta property=\"og:image:height\" content=\"198\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"St\u00e9phane Pasquet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"St\u00e9phane Pasquet\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/\"},\"author\":{\"name\":\"St\u00e9phane Pasquet\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"headline\":\"Un projet pour cr\u00e9er des QCM et les corriger automatiquement\",\"datePublished\":\"2025-06-10T16:59:00+00:00\",\"dateModified\":\"2025-06-10T16:59:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/\"},\"wordCount\":467,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/head-articles-latex-python-qcm.webp\",\"articleSection\":[\"LaTeX\",\"Python\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/\",\"name\":\"Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/head-articles-latex-python-qcm.webp\",\"datePublished\":\"2025-06-10T16:59:00+00:00\",\"dateModified\":\"2025-06-10T16:59:09+00:00\",\"description\":\"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c'est le projet dans lequel je me suis lanc\u00e9, \u00e0 l'aide de Python et LaTeX.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/head-articles-latex-python-qcm.webp\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/head-articles-latex-python-qcm.webp\",\"width\":740,\"height\":198,\"caption\":\"qcm interactif corriger automatiquement\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2025\\\/06\\\/10\\\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Un projet pour cr\u00e9er des QCM et les corriger automatiquement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\",\"name\":\"Mathweb.fr\",\"description\":\"Math\u00e9matiques, LaTeX et Python\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\",\"name\":\"St\u00e9phane Pasquet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"width\":74,\"height\":77,\"caption\":\"St\u00e9phane Pasquet\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr","description":"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c'est le projet dans lequel je me suis lanc\u00e9, \u00e0 l'aide de Python et LaTeX.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/","og_locale":"fr_FR","og_type":"article","og_title":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr","og_description":"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c'est le projet dans lequel je me suis lanc\u00e9, \u00e0 l'aide de Python et LaTeX.","og_url":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/","og_site_name":"Mathweb.fr","article_published_time":"2025-06-10T16:59:00+00:00","article_modified_time":"2025-06-10T16:59:09+00:00","og_image":[{"width":740,"height":198,"url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp","type":"image\/webp"}],"author":"St\u00e9phane Pasquet","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"St\u00e9phane Pasquet","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#article","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/"},"author":{"name":"St\u00e9phane Pasquet","@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"headline":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement","datePublished":"2025-06-10T16:59:00+00:00","dateModified":"2025-06-10T16:59:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/"},"wordCount":467,"commentCount":2,"publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp","articleSection":["LaTeX","Python"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/","url":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/","name":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement - Mathweb.fr","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#primaryimage"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp","datePublished":"2025-06-10T16:59:00+00:00","dateModified":"2025-06-10T16:59:09+00:00","description":"Cr\u00e9er un QCM et le corriger automatiquement sous Windows, c'est le projet dans lequel je me suis lanc\u00e9, \u00e0 l'aide de Python et LaTeX.","breadcrumb":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#primaryimage","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/head-articles-latex-python-qcm.webp","width":740,"height":198,"caption":"qcm interactif corriger automatiquement"},{"@type":"BreadcrumbList","@id":"https:\/\/www.mathweb.fr\/euclide\/2025\/06\/10\/un-projet-pour-creer-des-qcm-et-les-corriger-automatiquement\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mathweb.fr\/euclide\/"},{"@type":"ListItem","position":2,"name":"Un projet pour cr\u00e9er des QCM et les corriger automatiquement"}]},{"@type":"WebSite","@id":"https:\/\/www.mathweb.fr\/euclide\/#website","url":"https:\/\/www.mathweb.fr\/euclide\/","name":"Mathweb.fr","description":"Math\u00e9matiques, LaTeX et Python","publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mathweb.fr\/euclide\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69","name":"St\u00e9phane Pasquet","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","width":74,"height":77,"caption":"St\u00e9phane Pasquet"},"logo":{"@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp"}}]}},"_links":{"self":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/10961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/comments?post=10961"}],"version-history":[{"count":1,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/10961\/revisions"}],"predecessor-version":[{"id":10965,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/10961\/revisions\/10965"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media\/10964"}],"wp:attachment":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media?parent=10961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/categories?post=10961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/tags?post=10961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}