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