Introduction à Latexmk pour faciliter les compilations

publicité
Introduction à Latexmk pour faciliter les compilations
Extrait du Geekographie Maïeulesque
http://geekographie.maieul.net/79
Introduction à Latexmk pour
faciliter les compilations
- LaTeX - Compilation en série -
Date de mise en ligne : vendredi 13 janvier 2012
Copyright © Geekographie Maïeulesque - Tous droits réservés
Copyright © Geekographie Maïeulesque
Page 1/7
Introduction à Latexmk pour faciliter les compilations
Suites aux remarques sur mon article à propos de
bien plus simple que
makefile,
make,
j'ai me suis penché sur latexmk. C'est effectivement
même s'il y a encore quelques besoins auxquels je n'arrive pas à répondre.
Voici un petit tutoriel sur la manière de l'utiliser, notamment avec XeLaTeX
Principe
Quand on compile un document
biber, puis avec makexindex etc.
.tex
il faut en général procéder à plusieurs compilations : avec
LaTeX,
puis avec
permet d'automatiser ces compilations, en vérifiant à la suite de chaque compilation qu'elle doit être la
prochaine compilation, et en regardant les fichiers auxiliaires (.aux, .bbl etc) pour voir s'ils changent entre les
compilations, et donc s'il est nécessaire de procéder à plusieurs compilations.
Latexmk
Prenons un exemple simple : un fichier
.tex
sans bibliographie et sans index, mais avec un table des matières.
va d'abord compiler avec LaTeX. Puis il va voir qu'un fichier .toc est produit, ainsi qu'un fichier .aux. Il va
alors procéder à une seconde compilation, et regarder si ces fichiers ont changé. Si il y a eu un changement, il va
procéder à une troisième compilation et vérifier si ces fichiers ont changé. etc. Ainsi jusqu'à cinq fois (par défaut). Si
au bout de la cinquième série de compilation les fichiers ont encore changé, il considère qu'il est impossible d'avoir
des fichiers stables [1].
latexmk
Maintenant imaginons que j'ajoute une bibliographie. Latexmk va pouvoir analyser à la première compilation LaTeX,
en fonction des fichiers produits (le fichier bbl notamment) qu'il existe une biblio, qui réclame Biber (ou bibtex). Et il
va automatiquement compiler avec biber (ou bibtex après la première compilation LaTeX, puis il procédera à une
seconde compilation LaTeX etc.
Autrement dit, Latxmk est capable de mettre en oeuvre les séries successives de compilation, et surtout de savoir
quand il est nécessaire de procéder à une nouvelle compilation.
Mise en oeuvre : 1er essai
Latexmk
est installé par défaut avec les différentes distributions LaTeX. Donc rien à installer.
Avec son Terminal, se rendre dans le dossier où se trouvent les fichiers à compiler [2].
Puis frapper latexmk
compilation :
nom_du_fichier_a_compiler. latexmk
Copyright © Geekographie Maïeulesque
se lance et vous indique qu'il tente une première
Page 2/7
Introduction à Latexmk pour faciliter les compilations
Run number 1 of rule 'latex'
Il nous indique donc qu'il essaie de lancer la règle
latex.
Qu'est-ce qu'une règle ? Une règle, c'est une suite d'opération nécessaire à la transformation d'un fichier a, par
exemple un fichier .tex en un fichier b, par exemple un fichier .pdf, ou en l'occurrence un fichier .dvi (Je parles de
ce fichier un peu plus bas.)
En l'occurence, la règle dit qu'il faut lancer le programme
latex.
C'est ce qui se passe. Et là, patatra si vous utilisez XeLaTeX, avec le package fontspec vous obtenez un joli
message The fontspec package requires either XeTeX or LuaTeX to function. et la compilation s'arrête là.
Logique :
latexmk
a essayé de compiler avec
latex
Il va donc falloir modifier le fonctionnement de
dossier que les sources à compiler [3].
alors qu'il faudrait compiler à
latexmk,
grâce à un fichier nommé
Syntaxe de base du fichier
Un tel fichier se compose d'une série de couple
suivante :
xelatex.
latexmkrc
à mettre dans le même
latexmkrc
propriété
/
valeur.
Chaque couple s'écrit une ligne avec la syntaxe
$proprieté = "valeur";
Première propriété : demander un fichier
pdf
Il faut savoir qu'historiquement, LaTeX ne produisait pas de fichier .pdf, mais des fichiers
compilateur pdflatex qu'il a commencé à produire des fichiers .pdf.
La règle
latex
Aujourd'hui, le
cherche à produire des
.pdf
Ce n'est qu'avec le
.dvi.
est plus pertinent que le
Nous allons donc mettre dans le fichier
.dvi.
.dvi.
latexmkrc
une demande de produire des fichiers
.pdf.
Même si vous utilisez XeLaTeX, cette demande est très importante. En effet XeLaTeX ne produit pas des dvi
mais que des pdf. Or si vous laisser les réglages par défaut, latexmk cherche à produire des dvi et n'y arrive pas.
Cette propriété, c'est
pdflatex.
pdf_mode.
Si elle est égale à 1, alors
Copyright © Geekographie Maïeulesque
latexmk
va chercher à générer un
pdf
en utilisant la règle
Page 3/7
Introduction à Latexmk pour faciliter les compilations
Pour changer cette propriété, nous ajoutons donc à notre fichier
latexmkrc
:
$pdf_mode = "1";
Par ailleurs, par défaut cette règle pdflatex utilise le script
cette règle, par la propriété pdflatex.
pdflatex
et non pas
xelatex.
Nous allons donc modifier
Deuxième propriété : utiliser XeLaTeX
La propriété
pdflatex
reçoit le nom de la commande à exécuter. En l'occurrence, pour nous il s'agit de
xelatex.
Nous écrivons donc dans notre fichier :
$pdflatex = "xelatex";
On peut désormais lancer
xelatex.
latexmk
sans avoir d'erreur de compilation, puisque celui-ci va appeler la commande
Par ailleurs, si une bibliographie est ajoutée,
lui-même le bon programme.
latexmk
va lancer automatiquement
biber
ou
biblatex,
en choisissant
Troisième propriété : la génération de l'index
Lorsque latexmk détecte la création d'un fichier
compiler pour obtenir des fichiers formatés.
.idx,
il sait qu'il s'agit d'un fichier d'index « brut », et qu'il faut le
Par défaut, il utilise makeindex. Mais on peut souhaiter utiliser
avoir plusieurs index.
Il faut dire d'utiliser
splitindex
modifier la règle
splitindex
lorsqu'on utilise le package
splitidx
pour
makeindex.
Nous pouvons donc mettre :
$makeindex = "splitindex";
Seulement cela pose un problème.
En effet, si j'ai un fichier
principal.idx, latexmk
Copyright © Geekographie Maïeulesque
s'attend que la règle
makeindex
produise un fichier
principal.ind.
Page 4/7
Introduction à Latexmk pour faciliter les compilations
Or
splitindex
produit des fichiers
principal-xxx.ind,
mais pas de fichier
principal.ind.
La solution consiste à dire que la règle makeindex exécute plusieurs commandes :
cela, il suffit de séparer chaque commande par un point virgule. Ce qui donne
makeindex
puis
splitindex.
Pour
$makeindex = "makeindex;splitindex;";
Problème : dans ce cas la commande makeindex ne vas pas s'exécuter sur le bon fichier. Il est donc nécéssaire de
préciser le fichier sur lequel executer makeindex.
Pour cela, on utilise la notation %S, qui correspond au fichier source. Par exemple, dans le cas de la règle
il s'agit du fichier .idx, mais dans le cas de la règle pdflatex il s'agit du fichier .tex.
makeindex,
Donc cela donne :
$makeindex = "makeindex %S;splitindex %S;";
Et si j'utilise le script de gestion de l'index des
sources primaires
Ce script que j'utilise pour la gestion de l'index des sources primaires [4] nécessite d'être appelé
avant splitindex
Je serais tenté de faire :
$makeindex = "python index.py;makeindex %S;splitindex %S;";
Seulement voilà, cela entraîne latexmk à tourner en rond. Pourquoi ? Si je ne me trompe la raison est la suivante.
Lorsque latexmk applique une règle, il regarde le contenu des fichiers générés par cette règle avant qu'elle soit
appliquée et après son application. Si ces fichiers ont changé, il considère qu'il faudra réappliquer la règle.
Donc dans mon cas cela donne (en sautant les règles
Règle
Règle
Règle
biber)
:
pdflatex,
compilation avec xelatex, création du fichier .idx
modification du fichier .idx, via mon script python.
pdflatex qui modifie à nouveau le fichier .idx.
makeindex,
Le fichier .idx a été transformé à l'issue de la deuxième application de la règle
fichier qui avait subit le script python à un fichier qui ne l'a pas subit.
Donc
latexmk
se dit qu'il faudra réappliquer la règle
Copyright © Geekographie Maïeulesque
pdflatex,
pdflatex,
mais aussi la règle
puisqu'on est passé d'un
makeindex,
puisque celle-ci
Page 5/7
Introduction à Latexmk pour faciliter les compilations
cherche à transformer les fichiers
Et comme la règle
makeindex
.idx.
modifie, si j'y intègre le script python, le fichier
La solution est donc de mettre le script python n'ont pas au début de la règle
pdflatex.
.idx,
on tourne en rond.
makeindex
mais à la fin de la règle
Donc non pas :
$makeindex = "python index.py;makeindex;splitindex;";
mais :
$pdflatex = "xelatex %S;python index.py";
Récapitulatif
Au final, mon fichier
latexmrc
contient les lignes suivantes :
$pdflatex = "xelatex %S;python index.py";
$pdf_mode = "1";
$makeindex = 'makeindex %S;splitindex %S;';
Un plus : les entrées bibliographiques indéfinies et les
références introuvables
À la fin de l'exécution de
et les \label manquants :
latexmk,
celui ci nous indique les entrées bibliographiques absentes de la base de donnée
Latexmk: Citation 'ti' on page 1 undefined
Latexmk: Reference `ti' on page i undefined
En revanche, il ne mentionne pas les
\label
en nombre multiples.
Post-scriptum :
On peut exécuter la commande
Copyright © Geekographie Maïeulesque
Page 6/7
Introduction à Latexmk pour faciliter les compilations
latexmk -c
pour nettoyer les fichiers intermédiaires (.aux,
.ind
etc.)
Malheureusement je n'ai pas encore trouvé comment faire pour que le nettoyage s'applique aussi aux fichiers :
.1,.2 du package ledmac
.idx et .ind produit par splitindex.
[1] Ce genre de cas est normalement rarissime.
[2] Pour apprendre à se servir de son Terminal sur Mac ; et pour Windows, pour les Linuxiens, c'est quasiment comme sur Mac.
[3] Il est possible de mettre ce fichier ailleurs, pour pouvoir appliquer un fonctionnement à l'ensemble des fichiers LaTeX que l'on traite. Voir la
documentation de latexmk.
[4] Et qui vient d'être amélioré.
Copyright © Geekographie Maïeulesque
Page 7/7
Téléchargement