Compilation automatisée de fichier Latex
Par jb le mardi 14 août 2007, 14:17 - Des pingouins et des hommes - Lien permanent
La compilation de document écrit avec Latex devient vite compliquée si différents types de fichiers entrent en jeu. Un script ou un Makefile permet de simplifier cette tâche.
Besoin
Mes documents (écrit ou présentation réalisées avec beamer) sont produits par Latex. Pour chaque document, j'ai un répertoire qui contient le ou les fichiers Latex et des sous-répertoires.
Les différents sous-répertoires
Un répertoire fig/ contient des fichiers png qui sont convertit en fichiers eps à l'aide de l'utilitaire convert présent dans le paquet imagemagick.
Un répertoire src/ qui peut contenir toutes sortes de fichiers (C, SQL, Java, ...) qui sont inclus dans le document Latex à l'aide du package listings
Outil actuel
Un Makefile présent dans le répertoire de travail assurait la compilation Latex alors qu'un autre Makefile placé dans le répertoire fig prenait en charge la conversion des images ; make ne permet pas de travailler dans un autre répertoire.
A chaque nouveau document, je créais mes répertoire et copiais les deux Makefile. Une simple commande make me permettait de lancer la compilation (si nécessaire) ainsi que la conversion des images.
Développement d'un nouvel outil
Ce système de copie de fichier finissait par être assez pénible à l'usage. J'ai profité d'un peu de temps libre pour développer un outil pour automatiser toutes ces tâches (création des répertoires et compilation du fichier Latex) et rajouter des fonctionnalités.
Choix du système
Ces derniers temps je bidouille avec Ruby, j'ai donc choisi rake pour gérer ce projet. rake utilise par défaut un fichier nommé Rakefile lors de son appel.
Le fichier obtenu
require 'rake/clean'
CLEAN.include('*.ps','*.dvi','*.log','*.out','*.aux')
# Main file
MAIN = "truc.pdf"
PNG = FileList["fig/*.png"]
EPS = PNG.ext('.eps')
TEX = FileList["*.tex"]
SRC = FileList["src/*.*"]
DVI = MAIN.ext('.dvi')
desc "The default task : preview version"
task :default => MAIN
file MAIN => DVI
file DVI => SRC
file DVI => EPS
file DVI => TEX
# Convert image files
rule '.eps' => '.png' do |t|
sh "convert #{t.source} #{t.name}"
sh "rm #{t.source}"
end
file DVI do
main_tex = MAIN.ext('.tex');
sh "latex #{main_tex}"
sh "latex #{main_tex}"
end
desc "Screen resolution compilation"
file MAIN => DVI do
#puts "Main task... : \n #{t.investigation}"
main_dvi = MAIN.ext('.dvi');
main_ps = MAIN.ext('.ps');
sh "dvips #{main_dvi}"
sh "ps2pdf #{main_ps}"
end
desc "High resolution conversion"
task :final => DVI do
main_dvi = MAIN.ext('.dvi');
main_ps = MAIN.ext('.ps');
sh "dvips -D600 -Z #{main_dvi}"
sh "ps2pdf -dPDFSETTINGS=/prepress #{main_ps}"
sh "acroread #{MAIN} &"
end
desc "Create directories"
task :init do
Dir.mkdir("fig")
Dir.mkdir("src")
end
Quelques explications
- La variable
MAINdéfinie le nom du fichier de sortie. - La liste de fichiers
PNGpermet de constuire la liste des futurs fichiersEPS - Les listes
TEXetSRCcontiennent les fichiers*.tex*et ceux contenus dans le répertoiresrc. - Une règle (
rule) permet de définir la conversionpngverseps - La règle associée au fichier
DVIdépend des listes de fichiersTEX,SRCetEPS. Elle lance la compilation du fichier Latex si un des fichiers présent dans ces trois liste est plus récent que la cible (ici le fichierdvi) - La règle
MAIN(qui est la règle par défaut) dépend du fichierdviet assure la conversion enpdf - La tâche
finalassure une conversion en haute qualité du fichierdvi - La tâche
initcrée les deux répertoiresrcetfig - La règle
cleanest crée par défaut, on ajout seulement la liste de fichier à supprimer :*.ps','*.dvi','*.log','*.out','*.aux'
Utilisation
Selon les arguments passés à la commande rake, différentes tâches sont réalisée :
rake initva créer les répertoiresfigetsrcrakeva lancer la compilation du fichier Latex (si nécessaire) et créer le fichierpdfrake finalva lancer la compilation du fichier Latex avec un conversion enpdfen haute résolutionrake cleaneffacera tous les fichiers temporaires
Outils utilisés pour déboguer le script
- La commande
touchpermet de modifier la date d'un fichier, très utile pour vérifier les règles de dépendances - Dans le
Rakefileon peut ajouter les lignes ci-dessous pour déboguer les règles qui ne sont pas définies :
rule '' do |t|
puts "Undefined task... : \n #{t.investigation}"
end
Commentaires
Hi, Guys! Many friends of mine talk about your blog anytime, and now I am here. After read a couple of your post, I must say that it?s really great! I really appreciate your work!
It does not follow that because we do not subsidize smoking, we should not regulate unhealthy activities. Costs and savings are not the only variable. The fact that obesity creates costs is merely an additional reason to regulate it, not the only one. The main reason is its danger to an individual. You are dismissive of subsidizing smoking precisely because of this moral intuition.
This article tell the reality of very important organization and clearly gives the reasons that what they are doing. Very information article and actions should be taken against such organizations
I've had a great time stumbling upon your site! The information you provide is very useful and I'm sure others will appreciate it, too!