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 MAIN définie le nom du fichier de sortie.
  • La liste de fichiers PNG permet de constuire la liste des futurs fichiers EPS
  • Les listes TEX et SRC contiennent les fichiers *.tex* et ceux contenus dans le répertoire src.
  • Une règle (rule) permet de définir la conversion png vers eps
  • La règle associée au fichier DVI dépend des listes de fichiers TEX, SRC et EPS. 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 fichier dvi)
  • La règle MAIN (qui est la règle par défaut) dépend du fichier dvi et assure la conversion en pdf
  • La tâche final assure une conversion en haute qualité du fichier dvi
  • La tâche init crée les deux répertoire src et fig
  • La règle clean est 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 init va créer les répertoires fig et src
  • rake va lancer la compilation du fichier Latex (si nécessaire) et créer le fichier pdf
  • rake final va lancer la compilation du fichier Latex avec un conversion en pdf en haute résolution
  • rake clean effacera tous les fichiers temporaires

Outils utilisés pour déboguer le script

  • La commande touch permet de modifier la date d'un fichier, très utile pour vérifier les règles de dépendances
  • Dans le Rakefile on 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