Créer un fichier LaTeX avec Python. Dans un article précédent, je vous expliquais comment, dans un fichier \(\LaTeX\), on pouvait se servir de Python grâce à l’extension Pythontex.
Maintenant, je vais vous expliquer comment faire l’inverse, à savoir comment créer et compiler un fichier \(\LaTeX\) avec un programme Python.
L’objectif va être le même que dans l’article précédent (cas d’école) : créer 20 développements (avec double distributivité) aléatoires.
Créer un fichier LaTeX avec Python: importation des modules nécessaires
import os.path import random from sympy import Symbol from sympy import expand x=Symbol('x')
J’importe le module os car il va me servir à exécuter des commandes en lignes.
Ensuite, j’importe le module random car il est nécessaire dans notre contexte (dès lors qu’il y a choix aléatoire…).
J’utilise ensuite sympy pour les manipulations algébriques (c’est spécifique ici à ce que je souhaite faire). Je définis alors “x” comme le symbole désignant l’inconnue.
Créer un fichier LaTeX avec Python: construction du fichier
Le contenu du fichier va être défini par une succession de texte.
Créer un fichier LaTeX avec Python: définir le préambule
def preambule(*packages): p = "" for i in packages: p = p+"\\usepackage{"+i+"}\n" return p
Cette fonction a pour but d’appeler tous les packages nécessaires.
start = "\\documentclass[12pt,a4paper,french]{article}\n\\usepackage[utf8]{inputenc}\n" start = start+preambule('amsmath','lmodern','babel') start = start+"\\begin{document}\n\\begin{align*}\n" end = "\\end{align*}\n\\end{document}"
On commence par définir la classe utilisée (avec les options souhaitées) ainsi que l’encodage. Puis, on appelle tous les packages souhaités. Enfin, on commence le document.
Génération des égalités
body = "" for n in range(21): a = random.choice([1, -1]) * random.randint(2, 9) b = random.choice([1, -1]) * random.randint(2, 9) c = random.choice([1, -1]) * random.randint(2, 9) d = random.choice([1, -1]) * random.randint(2, 9) e = (a*x+b)*(c*x+d) eresultchain = str(expand(e)) # on convertit le résultat en chaîne de caractères eresultchain = eresultchain.replace('**','^') # on met au format TeX les exposants eresultchain = eresultchain.replace('*','') # on élimine les symboles '*' echain = str(e) echain = echain.replace('*','') body = body+echain+" & = "+eresultchain+"\\\\\n"
Il est ici nécessaire d’anticiper sur la syntaxe \(\LaTeX\) pour remplacer certains caractères…
Écriture du fichier
container = start+body+end file = "monfichier.tex" if os.path.exists(file): os.remove(file) fichier = open("monfichier.tex","x") # "x" pour la création et l'écriture fichier.write(container) fichier.close()
Compilation
Une fois le fichier créé, il est pratique de le compiler directement puis de l’afficher.
instructions = "pdflatex "+file#" os.system(instructions) readpdf = "START "+file[:-4]+".pdf" os.system(readpdf)
Et voilà ! Une feuille d’exercices créée en à peine 2 secondes…
Le code complet
Le code complet ci-dessous:
Bonjour, bien qu’abonné (et semble-t-il identifié) je ne parviens jamais à accéder aux “contenus réservés”. Comment se fait-ce ?
Une réponse vous a été envoyée par mail.
Voir https://www.mathweb.fr/euclide/informations/