[Résolu] Compiler en boucle

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[Résolu] Compiler en boucle

Messagepar GRSG » Dimanche 23 Mai 2010, 17:46

Bonjour
Dans un répertoire, j'ai une liste de fichiers d'exercices exo1.tex, exo2.tex,... exo45.tex

Dans un autre répertoire, j'ai une autre liste de fichiers d'exercices exo1.tex, exo2.tex,... exo32.tex

Ces fichiers n'ont pas de préambules

Dans un autre fichier synthese_exo.tex je manoeuvre de cette façon là pour compiler

Code: Tout sélectionner
\documentclass{article}
\usepackage{multido}

\multido{\i=1+1}{45}
\input{c:\gabriel\repertoire1\exo\i.tex}


Le problème est que les exercices sont alors reportés sur le même fichier synthese_exo.dvi (ou.pdf) et je dois à chaque fois définir le nombre de boucles suivant le répertoire où je me trouve (45 pour le premier répertoire et 32 pour le second).

Est-ce qu'il existe une syntaxe permettant de répéter l'input tant qu'il y a des fichiers à <<inputer>>.
Est-il possible d'automatiser la compilation des exercices afin de créer dans chaque répertoire la liste séparée de fichiers en dvi (ou pdf) exo1.dvi, exo2.dvi,...

J'espère que ma demande est claire. Je vous remercie d'avance.
Gabriel
Dernière édition par GRSG le Lundi 24 Mai 2010, 22:12, édité 1 fois.
GRSG
Méga-utilisateur
 
Messages: 293
Inscription: Mercredi 08 Octobre 2008, 08:45
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Compiler en boucle

Messagepar pg » Dimanche 23 Mai 2010, 18:29

GRSG a écrit:Est-ce qu'il existe une syntaxe permettant de répéter l'input tant qu'il y a des fichiers à <<inputer>>.

Il y a \IfFileExists qui permet de faire ce genre de choses :

Code: Tout sélectionner
\documentclass{article}
\usepackage{ifthen}
\newboolean{EncoreDesExercices}
\newcounter{currentexercice}
\begin{document}

\setboolean{EncoreDesExercices}{true}
\setcounter{currentexercice}{0}
\whiledo{\boolean{EncoreDesExercices}}{%
  \stepcounter{currentexercice}%
  \IfFileExists{exo\thecurrentexercice}
    {\input{exo\thecurrentexercice}}
    {\setboolean{EncoreDesExercices}{false}}%
}

\end{document}

Il faudra bien sûr rajouter dans le préambule tout ce dont les fichiers exoXXXX ont besoin.

GRSG a écrit:Est-il possible d'automatiser la compilation des exercices afin de créer dans chaque répertoire la liste séparée de fichiers en dvi (ou pdf) exo1.dvi, exo2.dvi,...

On peut lancer (en ligne de commande) la compilation latex de ces fichiers avec quelque chose du genre :

Code: Tout sélectionner
latex -jobname=exo1 "\documentclass{article} \begin{document} \input{exo1.tex} \end{document}"

La façon de lancer cette compilation peut être à chaque étape de la boucle précédente (et alors il faudra lancer latex avec l'option -enable-write18) ou faire un fichier bat ; par exemple, s'il y a 45 documents dans le répertoire, double cliquer sur le fichier compile_exercices.bat contenant le code suivant produira tous les fichiers .dvi voulus :

Code: Tout sélectionner
FOR /L %%i IN (1,1,45) DO latex -jobname=exo%%i "\documentclass{article} \begin{document} \input{exo%%i.tex} \end{document}"
pg
Modérateur
 
Messages: 2596
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Compiler en boucle

Messagepar GRSG » Dimanche 23 Mai 2010, 21:35

Bonsoir,

Merci pour la réponse.

J'arrive à faire marcher le premier programme. J'ai eu quelques difficultés à cause de la commande \input... et j'ai remarqué que pour pouvoir réaliser plusieurs input à la suite, il faut mettre deux lignes vierges sur les fichiers appelés (ou sauter une ligne entre deux input)... ce qui me parait bizarre.

Sur le deuxième programme, j'ai rentré cette commande dans une fichier bat (en tenant compte des racines) ci-dessous
Code: Tout sélectionner
FOR %%i IN (1,1,36) DO latex -jobname=c:/gabriel/prepa/cours/algebre/applicationslineaires/generalites/exo/exo%%i "\documentclass{article}\input{C:/Gabriel/latexbis/enonce_format.tex} \begin{document} \input{c:/gabriel/prepa/cours/algebre/applicationslineaires/generalites/exo/exo%%i.tex} \end{document}"

Le fichier bat s'exécute... mais à la sortie j'ai en fichier dvi le premier fichier exo1.dvi et le dernier exo36.dvi. J'ai cru que c'était le même pb que pour le précédent code (et j'ai donc rajouté deux lignes vierges à tous mes fichiers...) mais à la sortie le problème persiste.

Enfin question subsidiaire. Existe-t-il une commande latex qui permet d'écrire le chemin c:\... et le nom du fichier concerné.

Encore merci

Gabriel

...
GRSG
Méga-utilisateur
 
Messages: 293
Inscription: Mercredi 08 Octobre 2008, 08:45
Statut actuel: Actif et salarié | Enseignant

Re: Compiler en boucle

Messagepar pg » Dimanche 23 Mai 2010, 22:08

GRSG a écrit:J'arrive à faire marcher le premier programme. J'ai eu quelques difficultés à cause de la commande \input... et j'ai remarqué que pour pouvoir réaliser plusieurs input à la suite, il faut mettre deux lignes vierges sur les fichiers appelés (ou sauter une ligne entre deux input)... ce qui me parait bizarre.

La commande \input remplace juste par le contenu du fichier, rien d'autre donc si les exercices ne sont pas codés pour mettre de l'espace avant et après, il n'y en aura pas dans le fichier résultant. Une solution est de mettre un \par après le \input{exo\thecurrentexercice} :

Code: Tout sélectionner
  \IfFileExists{exo\thecurrentexercice}
    {\input{exo\thecurrentexercice}\par}
    {\setboolean{EncoreDesExercices}{false}}%

GRSG a écrit:Le fichier bat s'exécute... mais à la sortie j'ai en fichier dvi le premier fichier exo1.dvi et le dernier exo36.dvi. J'ai cru que c'était le même pb que pour le précédent code (et j'ai donc rajouté deux lignes vierges à tous mes fichiers...) mais à la sortie le problème persiste.

J'ai oublié le "/L" qu'il faut mettre juste après le FOR. C'est corrigé dans mon message précédent. Sans le "/L", %i% valait successivement 1, 1 et 36, au lieu d'aller de 1 à 36 en incrémentant par 1.

GRSG a écrit:Enfin question subsidiaire. Existe-t-il une commande latex qui permet d'écrire le chemin c:\... et le nom du fichier concerné.

Le nom du fichier en train d'être compilé est stocké dans \jobname, mais je ne pense pas que l'on puisse accéder au répertoire courant. Depuis un fichier bat, par contre, le répertoire courant est stocké dans %CD%.
pg
Modérateur
 
Messages: 2596
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Compiler en boucle

Messagepar GRSG » Lundi 24 Mai 2010, 06:45

Bonjour,

Merci pour la réponse.

J'ai corrigé le .bat en intégrant la syntaxe <</L>> et ça marche à la perfection.

Pour le repertoire courant, je posais cette question car j'aurais souhaité sur chaque fichier exoi.tex mettre en première ligne le commentaire:
Code: Tout sélectionner
% repertoire_courant/nom du fichier

Je ne sais pas si cette insertion est facilement programmable en batch.

Gabriel
GRSG
Méga-utilisateur
 
Messages: 293
Inscription: Mercredi 08 Octobre 2008, 08:45
Statut actuel: Actif et salarié | Enseignant

Re: Compiler en boucle

Messagepar pg » Lundi 24 Mai 2010, 10:48

Un moyen pour rajouter "% repertoire_courant/nom du fichier" au début du document est est de faire

Code: Tout sélectionner
ECHO %% %cd%\exo1.tex > exo1-bis.tex
TYPE exo1.tex >> exo1-bis.tex
COPY exo1-bis.tex exo1.tex
DEL exo1-bis.tex

La première ligne crée un fichier exo1-bis.tex avec "% repertoire_courant/nom du fichier" comme première ligne. Ensuite, la seconde lige rajoute le contenu du fichier exo1.tex à exo1-bis.tex. La troisième ligne remplace exo1.tex par le nouveau exo1-bis.tex puis la quatrième efface le fichier auxilliaire exo1-bis.tex. Il faut donc faire attention quand on utilise ce genre de fichier bat : en cas de fausse manœuvre, on pourrait perdre les fichiers d'exercices (il faut donc penser à faire une copie de sauvegarde avant).

On peut mettre ces commandes dans des boucles. Soit une boucle de type "FOR /L %%i IN ..." comme précédemment, soit quelque chose qui ne s'occupe que des fichiers du type "exo*.tex" (ce qui évite d'avoir à donner le nombre de fichiers à faire). Dans ce qui précède, on aurait donc pu utiliser la boucle

Code: Tout sélectionner
FOR %%f IN (exo*.tex) DO latex -jobname=%%~nf "\documentclass{article} \begin{document} \input{%%~nf} \end{document}"

Ici, "%%f" sera "exo1.tex" et" %%~nf" seulement "exo1" (sans l'extension, donc). Pour l'ajout du répertoire courant, cela donnerait

Code: Tout sélectionner
FOR %%f IN (exo*.tex) DO (
  ECHO %% %cd%\%%~nf.tex > %%~nf-bis.tex
  TYPE %%~nf.tex >> %%~nf-bis.tex
  COPY %%~nf-bis.tex %%~nf.tex
  DEL %%~nf-bis.tex
)

On peut bien sûr rajouter des répertoire explicites à toutes les étapes (y compris dans le "(exo*.tex)").
pg
Modérateur
 
Messages: 2596
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Compiler en boucle

Messagepar GRSG » Lundi 24 Mai 2010, 12:02

Merci pour la réponse.

L'avant dernier programme avec %%f fonctionne dès que le fichier .bat est sous le répertoire où sont placés tous les fichiers .tex à traiter. J'ai essayé en plaçant le .bat sous un autre répertoire et en inscrivant le chemin... et là ça ne marche pas. Ceci dit, c'est un problème mineur. Il suffit de faire un copier coller du fichier .bat sous le répertoire où sont placés les fichiers.tex.

Par contre, j'ai eu une petite déception... lorsque l'on compile avec le .bat, il n' a plus de lien entre le dvi et le tex...

Lorsque je compile <<normalement>> le fichier tex il y a un lien entre le dvi et le source .tex. Ainsi, lorsque je clique sur mon .dvi il m'envoie approximativement (à 2 ou 3 lignes près) à la source .tex. Faut-il rajouter une commande sur le fichier .bat ou est-ce que je perds définitivement cette option en compilant avec .bat?

Gabriel
GRSG
Méga-utilisateur
 
Messages: 293
Inscription: Mercredi 08 Octobre 2008, 08:45
Statut actuel: Actif et salarié | Enseignant

Re: Compiler en boucle

Messagepar guiguiche » Lundi 24 Mai 2010, 12:12

C'est une option de compilation je crois (vu sur un autre topic dernièrement, texworks??)
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
guiguiche
Modérateur
 
Messages: 8071
Inscription: Vendredi 06 Janvier 2006, 15:32
Localisation: Le Mans
Statut actuel: Actif et salarié | Enseignant

Re: Compiler en boucle

Messagepar pg » Lundi 24 Mai 2010, 12:33

On a accès à toutes les options de compilation en faisant, dans une console,

Code: Tout sélectionner
latex -help

L'option voulue est "-src-specials". Il faut donc remplacer les
Code: Tout sélectionner
latex -jobname=... "..."
par
Code: Tout sélectionner
latex -src-specials -jobname=... "..."


GRSG a écrit:L'avant dernier programme avec %%f fonctionne dès que le fichier .bat est sous le répertoire où sont placés tous les fichiers .tex à traiter. J'ai essayé en plaçant le .bat sous un autre répertoire et en inscrivant le chemin... et là ça ne marche pas. Ceci dit, c'est un problème mineur. Il suffit de faire un copier coller du fichier .bat sous le répertoire où sont placés les fichiers.tex.

Chez moi ça marche, mais il faut faire attention que %cd% donne le répertoire où est le fichier .bat, pas là où est le fichier "exo*.tex". Par contre, on peut mettre le chemin spécifique à chaque fois (ici, C:\essais\exos). Pour éviter à avoir à le taper plusieurs fois de suite, on peut le stocker dans une variable "fichier" que l'on appelle ensuite par "%fichier%" :

Code: Tout sélectionner
SET fichier=C:\essais\exos
FOR %%f IN (%fichier%\exo*.tex) DO (
  ECHO %% %fichier%\%%~nf.tex > %fichier%\%%~nf-bis.tex
  TYPE %fichier%\%%~nf.tex >> %fichier%\%%~nf-bis.tex
  COPY %fichier%\%%~nf-bis.tex %fichier%\%%~nf.tex
  DEL %fichier%\%%~nf-bis.tex
)
pg
Modérateur
 
Messages: 2596
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Compiler en boucle

Messagepar GRSG » Lundi 24 Mai 2010, 14:05

Les programmes ont l'air de fonctionner; par contre certains fichiers n'ont pu être visualisés; Après vérification, il semblerait que l'erreur vienne de la syntaxe -src-specials qui pose problème dès que le fichier fait plus de 2 ou 3 pages.

Lorsque j'enlève cette syntaxe, pas de problème mais alors je perds le lien avec le source.tex...

Merci pour tous les programmes.

Gabriel
GRSG
Méga-utilisateur
 
Messages: 293
Inscription: Mercredi 08 Octobre 2008, 08:45
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot], Grapeshot [Crawler] et 21 invités