Modifier des champs dans le latex
Résolu
Bonjour,
J'ai besoin de votre aide : mon objectif est de développer un programme qui va changer des champs déjà définis dans un fichier LaTeX à partir d'un tableau .
Le tableau
Par exemple, dans mon template, j'ai défini un champs
Dans un premier temps j'ai fait ce code pour pouvoir remplacer les champs manuellement.
Maintenant, je veux faire tourner ce programme sur plusieurs fichiers. Je sais pas comment faire ?
Merci d'avance
J'ai besoin de votre aide : mon objectif est de développer un programme qui va changer des champs déjà définis dans un fichier LaTeX à partir d'un tableau .
Le tableau
vatcontient les informations personnelles de clients. Ces informations doivent être récupérées pour remplir un template déjà rédigé en LaTeX .
Par exemple, dans mon template, j'ai défini un champs
\def\nom{.......}. Mon programme doit prendre l'information depuis le tableau et la mettre dans ce champ.
Dans un premier temps j'ai fait ce code pour pouvoir remplacer les champs manuellement.
import subprocess
import re
# Open template.tex
with open('template.tex', 'r') as f:
filedata = f.read()
# Find occurrences of {{item}}
occurrences = re.findall("\{{(.*?)\}}", filedata)
set = set(occurrences)
occurrences = list(set)
# Replacing fields
for occurrence in occurrences:
replaceby = input("Replace " + occurrence + " by: " )
filedata = filedata.replace("{{" + occurrence + "}}", replaceby)
# Write results
with open("result.tex", 'w') as f:
f.write(filedata)
# Convert result.tex to result.pdf
proc = subprocess.Popen(['pdflatex', '-interaction=nonstopmode', 'result.tex'])
proc.communicate()
# Remove unnecessary files
proc = subprocess.Popen(['rm', 'result.tex'])
proc = subprocess.Popen(['rm', 'result.aux'])
proc = subprocess.Popen(['rm', 'result.log'])
proc.communicate()
Maintenant, je veux faire tourner ce programme sur plusieurs fichiers. Je sais pas comment faire ?
Merci d'avance
2 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonjour,
tu pourrais peut-être écrire une fonction qui fait le travail pour un fichier.
ensuite tu appelleras ta fonction pour chacun des fichiers. -
Bonjour,
Plusieurs choses avant de répondre :- Merci de soigner l'orthographe et de te relire.
- Merci d'utiliser les balises de code afin que le code apparaisse indenté et soit testable.
- Merci de mettre un exemple reproductible. Sans
template.tex
on ne peut pas tester ton programme.
Ensuite pour revenir à ton problème, si tu veux automatiser tes remplacements sur plusieurs fichiers, il suffit de mettre le code existant dans une fonction et de faire une boucle qui va itérer sur les fichiers à traiter (les différents templates si j'ai bien compris ?). Une autre question est si ces substitutions sont communes entre les différents fichiers ou indépendantes (car si ce sont les mêmes inutile de les demander plusieurs fois). Je vais supposer ci-dessous que tu es dans ce cas.
Ensuite quelques remarques. Il faut éviter d'appelersubprocess.Popen
quand c'est possible, car cela rend le code dépendant de ton système d'exploitation. Pour l'appel àpdflatex
c'est difficilement évitable, mais pour supprimer les fichiers, tu pourrais utiliseros.remove
.
À tester, mais voici dans l'idée à quoi ça pourrait ressembler :
import os, subprocess, re def find_occurrences(template_tex): # Open template.tex with open(template_tex, "r") as f: filedata = f.read() # Find occurrences of {{item}} return set(re.findall("\{{(.*?)\}}", filedata)) def prompt_replacements(occurrences): replacements = dict() # Replacing fields for occurrence in occurrences: replaceby = input("Replace " + occurrence + " by: " ) replacements[occurrence] = replaceby return replacements def clean_latex_temporary_files(result_tex): filename_wext = result_tex[:result_tex.rfind(".")] for ext in ["tex", "aux", "log"]: os.remove(filename_wext + "." + ext) def compile_latex(result_tex): # Convert result.tex to result.pdf proc = subprocess.Popen(["pdflatex", "-interaction=nonstopmode", result_tex]) proc.communicate() clean_temporary_files(result_tex) def make_replaced_latex(template_tex, result_tex, replacements): # Write results with open(template_tex, "r") as f: filedata = f.read() for (occurrence, replaceby) in replacements.items(): filedata = filedata.replace("{{" + occurrence + "}}", replaceby) with open(result_tex, "w") as f: f.write(filedata) def main(): map_template_result = { "template1.tex" : "result1.tex", "template2.tex" : "result2.tex", "template3.tex" : "result3.tex", } occurrences = set() for template_tex in map_template_result.keys(): occurrences |= find_occurrences(template_tex) replacements = prompt_replacements(occurrences) for (template_tex, result_tex) in map_template_result.items(): make_replaced_latex(template_tex, result_tex, replacements) compile_latex(result_tex) clean_temporary_files(result_tex) main()
Bonne chance
EDIT: correction deos.remove(filename_wext + ext)
enos.remove(filename_wext + "." + ext)
, voir message #7.-
merci beaucoup pour votre réponse et je suis navré pour l'orthographe mais c'est paracerque je ne suis pas une française j'ai vraiment du mal à exprimer .
aussi c'est ma première fois ici je ne sais pas comment utiliser les balises de code .
je vous remercie une autre fois pour ton aide- Bonjour,
Pour les fautes de français ça n'est pas gravissime mais si tu as des difficultés, tu peux essayer d'écrire ton message dans ta langue natale et le traduire en français avec deepl. Concernant les balises de code je t'invite à lire ce lien (que je t'ai déjà donné dans mon message précédent).
As-tu testé le code que je t'ai donné ? Répond-il à tes besoins ? Et sinon, peux-tu partager quelques exemples minimaux pour que je puisse le tester ?
Bonne chance - Ah oui il manque un
"."
, voici comment corriger la fonction :
def clean_latex_temporary_files(result_tex): filename_wext = result_tex[:result_tex.rfind(".")] for ext in ["tex", "aux", "log"]: print("rm", filename_wext + "." + ext) # DEBUG os.remove(filename_wext + "." + ext)
Si on reprend mon exemple :-
result_tex
successivement"result1.tex"
,"result2.tex"
,"result3.tex"
; -
result_wext
successivement"result1"
,"result2"
,"result"
;
Leprint
que j'ai ajouté te permettra de contrôler que tout va bien (tu peux ensuite le supprimer).
Bonne chance -