Modifier des champs dans le latex

Résolu
chahd -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

2 réponses

  1. 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.
    0
    1. chahd
       
      merci je vais essayer cela
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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
    1. chahd
       
      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
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940 > chahd
         
        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
      2. chahd > mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
      3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940 > chahd
         
        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