Modifier des champs dans le latex

Résolu/Fermé
chahd - Modifié le 24 mars 2022 à 14:48
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 25 mars 2022 à 13:38
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
vat
contient 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:

2 réponses

yg_be Messages postés 22773 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 mai 2024 1 481
24 mars 2022 à 15:13
bonjour,
tu pourrais peut-être écrire une fonction qui fait le travail pour un fichier.
ensuite tu appelleras ta fonction pour chacun des fichiers.
0
merci je vais essayer cela
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 25 mars 2022 à 13:41
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'appeler
subprocess.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 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.
0
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
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > chahd
Modifié le 25 mars 2022 à 12:46
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
0
chahd > mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024
25 mars 2022 à 13:02
je vous remercie infiniment pour ton aide .
Oui, j'ai essayé votre programme, il fonctionne parfaitement, sauf pour la partie de suppression des fichiers ça na pas marché , mais ce n'est pas grave puisque mon objectifs c'est que de changer les champs .
merci
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752 > chahd
Modifié le 25 mars 2022 à 13:39
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"
    ;


Le
print
que j'ai ajouté te permettra de contrôler que tout va bien (tu peux ensuite le supprimer).

Bonne chance
1