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
A voir également:
- Modifier des champs dans le latex
- Modifier dns - Guide
- Modifier liste déroulante excel - Guide
- Modifier story facebook - Guide
- Modifier extension fichier - Guide
- Modifier le code pin - Guide
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
tu pourrais peut-être écrire une fonction qui fait le travail pour un fichier.
ensuite tu appelleras ta fonction pour chacun des fichiers.
tu pourrais peut-être écrire une fonction qui fait le travail pour un fichier.
ensuite tu appelleras ta fonction pour chacun des fichiers.
chahd
merci je vais essayer cela
Bonjour,
Plusieurs choses avant de répondre :
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'appeler
À tester, mais voici dans l'idée à quoi ça pourrait ressembler :
Bonne chance
EDIT: correction de
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'appeler
subprocess.Popenquand c'est possible, car cela rend le code dépendant de ton système d'exploitation. Pour l'appel à
pdflatexc'est difficilement évitable, mais pour supprimer les fichiers, tu pourrais utiliser
os.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 de
os.remove(filename_wext + ext)en
os.remove(filename_wext + "." + ext), voir message #7.
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
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
Si on reprend mon exemple :
Le
Bonne chance
".", 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"
;
Le
Bonne chance