Principe
Quand on compile un document .tex
il faut en général procéder à plusieurs compilations : avec LaTeX
, puis avec biber
, puis avec makexindex
etc.
Latexmk
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.
Prenons un exemple simple : un fichier .tex
sans bibliographie et sans index, mais avec un table des matières.
latexmk
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].
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 œuvre les séries successives de compilation, et surtout de savoir quand il est nécessaire de procéder à une nouvelle compilation.
Mise en œuvre : 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 nom_du_fichier_a_compiler
. latexmk
se lance et vous indique qu’il tente une première compilation :
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
alors qu’il faudrait compiler à xelatex
.
Il va donc falloir modifier le fonctionnement de latexmk
, grâce à un fichier nommé latexmkrc
à mettre dans le même dossier que les sources à compiler [3].
Syntaxe de base du fichier latexmkrc
Un tel fichier se compose d’une série de couple propriété
/ valeur
. Chaque couple s’écrit une ligne avec la syntaxe suivante :
$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 .dvi
. Ce n’est qu’avec le compilateur pdflatex
qu’il a commencé à produire des fichiers .pdf
.
La règle latex
cherche à produire des .dvi
.
Aujourd’hui, le .pdf
est plus pertinent que le .dvi
.
Nous allons donc mettre dans le fichier 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 pdf_mode
. Si elle est égale à 1
, alors latexmk
va chercher à générer un pdf
en utilisant la règle pdflatex
.
Pour changer cette propriété, nous ajoutons donc à notre fichier latexmkrc
:
Par ailleurs, par défaut cette règle pdflatex
utilise le script pdflatex
et non pas xelatex
. Nous allons donc modifier cette règle, par la propriété pdflatex
.
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 :
On peut désormais lancer latexmk
sans avoir d’erreur de compilation, puisque celui-ci va appeler la commande xelatex
.
Par ailleurs, si une bibliographie est ajoutée, latexmk
va lancer automatiquement biber
ou biblatex
, en choisissant lui-même le bon programme.
Troisième propriété : la génération de l’index
Lorsque latexmk
détecte la création d’un fichier .idx
, il sait qu’il s’agit d’un fichier d’index « brut », et qu’il faut le compiler pour obtenir des fichiers formatés
.
Par défaut, il utilise makeindex
. Mais on peut souhaiter utiliser splitindex
lorsqu’on utilise le package splitidx
pour avoir plusieurs index.
Il faut dire d’utiliser splitindex
modifier la règle makeindex
.
Nous pouvons donc mettre :
Seulement cela pose un problème.
En effet, si j’ai un fichier principal.idx
, latexmk
s’attend que la règle makeindex
produise un fichier principal.ind
. 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 : makeindex
puis splitindex
. Pour cela, il suffit de séparer chaque commande par un point virgule. Ce qui donne
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 makeindex
, il s’agit du fichier .idx
, mais dans le cas de la règle pdflatex
il s’agit du fichier .tex
.
Donc cela donne :
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 :
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 biber
) :
- Règle
pdflatex
, compilation avecxelatex
, création du fichier.idx
- Règle
makeindex
, modification du fichier.idx
, via mon script python. - Règle
pdflatex
qui modifie à nouveau le fichier.idx
.
Le fichier .idx
a été transformé à l’issue de la deuxième application de la règle pdflatex
, puisqu’on est passé d’un 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 pdflatex
, mais aussi la règle makeindex
, puisque celle-ci cherche à transformer les fichiers .idx
.
Et comme la règle makeindex
modifie, si j’y intègre le script python, le fichier .idx
, on tourne en rond.
La solution est donc de mettre le script python n’ont pas au début de la règle makeindex
mais à la fin de la règle pdflatex
.
Donc non pas :
mais :
Récapitulatif
Au final, mon fichier latexmrc
contient les lignes suivantes :
Un plus : les entrées bibliographiques indéfinies et les références introuvables
À la fin de l’exécution de latexmk
, celui ci nous indique les entrées bibliographiques absentes de la base de donnée et les \label
manquants :
En revanche, il ne mentionne pas les \label
en nombre multiples.
Vos commentaires
# Le 13 janvier 2012 à 19:21, par Pietro Giuffrida En réponse à : Introduction à
Latexmk
pour faciliter les compilationsIl y a aussi latexmk.py ! http://pypi.python.org/pypi/latexmk.py/0.1 Salut
# Le 13 janvier 2012 à 19:26, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsIntéressant, mais pourquoi multiplié les projets ? Quelles seraient les différences ?
# Le 10 septembre 2012 à 22:29, par Comète En réponse à : Introduction à
Latexmk
pour faciliter les compilationsbonjour,
je viens de télécharger votre livre « LATEX appliqué aux sciences humaines » et commence l’initiation ;) Je viens de remarquer une petite erreur à la page 235 paragraphe D.2 :
« Pour configurer le script, il vous faut créer un fichier latexmrc... » en fait c’est un fichier nommé « .latexmkrc » je pense.
Voilà merci pour ce bel ouvrage en tout cas !
# Le 10 septembre 2012 à 22:46, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsOui et non. Si vous lisez la documentation de latexmk, vous voyiez que seul les fichiers de configuration par utilisateurs ou par ordinateur doivent s’appeler
.latexmkr
Le fichier propre a un projet peut ne pas prendre le point. Or
j’ai choisi une solution de facilité : dire qu’on crée un fichier par projet. Etant donné la nature du fichier, ce type de duplication est mineure.
# Le 14 mars 2013 à 19:37, par Joel En réponse à : Introduction à
Latexmk
pour faciliter les compilationsLe problème dans le livre ne tient pas tant au point qu’à l’oubli de la lettre ’k’ : latexmrc / latexmkrc :)
# Le 14 mars 2013 à 19:53, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsmerci, corrigé ;-)
faudrait vraiement que je fasse un article corrigendum.
# Le 25 octobre 2013 à 18:15, par Gaspar En réponse à : Introduction à
Latexmk
pour faciliter les compilationsBonjour,
Que faire si la première étape ne fonctionne pas ?
J’ai pourtant MikTex 2.9 et j’ai installé le package latexmk
Cependant lorsque j’écris latexmk dans une invite de commande j’obtiens un gros message me disant que l’ordinateur n’arrive pas à trouver les objets « chargeables » du module IO : Can’t locate loadable object for module IO in @INC.
Avez vous une idée de ce que je peux faire pour ne plus avoir ce type d’erreur ?
Merci
# Le 25 octobre 2013 à 18:23, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsDésolé aucune idée ... je n’ai jamais utilisé miktex, je n’en sais strictement rien.
Vous pouvez toujours aller sur les forums d’aide de miktex, ou les forums généralistes LaTeX.
# Le 14 mars 2015 à 18:40, par joseph-tux En réponse à : Introduction à
Latexmk
pour faciliter les compilationsBonjour,
d"abord merci pour ces tutoriels et autres articles.
Après avoir un peu peiné (ce qui m’a conduit de cette page web), j’ai trouvé la syntaxe efficace pour étendre les types de fichiers effacés avec les options c, C etc.. de latexmk : ici j’ai recopié l’exemple du man et ajouté ’nav’ et ’snm’ (produits par beamer, je crois.)
Ce que le man ne précisait pas clairement : Le signe d’affectation du tableau « = » La quotation simple : « ’ » et non « " » Pas de signe « [ .. ] » Le retour à la ligne est possible (comme sous Perl et comme sous LaTeX)
# Le 14 mars 2015 à 18:42, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationseffectivmenent, mais je ne nettoie jamais avec latexmk, mais uniquement avec git clean ;-) raison pour laquelle je n’avais pas mentionné cela.
# Le 1er août 2015 à 13:37, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsBonjour, Je ne parviens pas à obtenir un résultat. Le log m’indique (à la fin) : No file Denis.gls. [1] (./Denis.aux) ) Output written on Denis.dvi (1 page, 240 bytes). Transcript written on Denis.log. Latexmk : Missing input file : ’Denis.gls’ from line ’No file Denis.gls.’ Latexmk : Log file says output to ’Denis.dvi’ Latexmk : All targets (Denis.dvi) are up-to-date
Latexmk : Could not find file [latexmk].
Si je force le processus (-f), le résultat est le même.
Merci de votre aide.
Frédéric
# Le 1er août 2015 à 13:41, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsil me faudrait un peu de précision sur ce que vous tentez de faire. J’ai l’impression que vous n’utiliser pas le fichier de conf que je décris dans l’article. Ou outre vous semblez utiliser une fonction de glossaire que je ne connais pas.
Donc bref comme d’habitude quand on demande l’aide, merci d’être plus précis. Ici je suis dans le brouillard.
# Le 1er août 2015 à 22:25, par Fred En réponse à : Introduction à
Latexmk
pour faciliter les compilationsBonsoir Maïeul,
Merci pour cette réponse. Euh... oui, c’est un peu vague, c’est vrai. J’essaie de fabriquer un glossaire sans texte d’appel des mots ou expressions : un lexique, donc (d’où la présence de \glsaddall). Voici plus bas le contenu du fichier .tex qui me sert de base. Avec TeXmaker, j’ai créé une commande personnelle qui me permet de compiler (composer) le fichier (latex-makeglossaries-latex-latex) : si j’obtiens bien des fichiers auxiliaires tels que .gls, .glo, .xdy, etc., la page .pdf reste désespérement blanche (non : il y a le numéro de la page).
Merci beaucoup, Frédéric
# Le 2 août 2015 à 14:48, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationssi je comprend bien votre problème est
1) avec texmaker 2) avec glossaries
Ce qui n’a strictement rien à voir avec latexmk. Ma question est simple : pourquoi poser la question ici ?
Bon, cela étant pour revenir à votre problème, le processus est normalement le suivant : 1) compilation pdflatex ou xelatex (transforme .tex en .pdf) 2) compilation makeglossaries (transforme .glo en .gls) 3) compilation pdflatex ou xelatex (transforme .tex en .pdf)
Tant que 2) n’est pas fait, vous ne pouvez obtenir que des pages vides (cf le message No file XXX.gls.)
Le pb est que je n’arrive pas à faire fonctionner makeglossaries, parce que j’ai un pb d’install de xindy (je ne sais pas pourquoi).
Du reste je n’ai jamais utiliser makeglossary, car je n’ai jamais compris l’interêt de cet outils plutôt que de faire une bête liste de définition.
Donc je ne suis pas la personne qui pourra vous aider sur ce point. Je vous conseille de demander de l’aide sur les listes tex.
# Le 2 août 2015 à 15:02, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsj’ai mal compris votre message, j’avais cru que « latex-makeglossaries-latex-latex » était le fichier que vous compiliez.
Je vous invite à regarder le contenu du fichier .glo. Je suppose qu’il est vide. Je vous invite à essayer d’executer makeglossaries directement avec le terminal, et me donner le message d’erreur. J’imagine que c’est le même que le mien.
# Le 3 août 2015 à 11:59, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsj’ai refait des tests, après avoir fait une réinstall de texlive.
Dans l’exemple que vous fournissez, il faut remplacer
R0"
parr0
.Ensuite a) pdflatex fichier.tex b) makeglossaries fichier c) pdflatex fichier.tex
et après j’ai bien une page remplie.
Pour faire fonction cela automatiquement avec latexmk, mettre dans le fichier de conf .latexmkrc
ce qui rajoute une dépendance.
Mais attention, il semble qu’il y ait un bug avec la toute dernière version de xindy, qui peut expliquer votre page blanche. Essayez en restaurant l’ancienne version.
# Le 3 août 2015 à 14:05, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsBonjour Maïeul, Merci pour toutes ces réponses. Je regarde à tout cela dans la journée. À tout à l’heure, Frédéric
# Le 3 août 2015 à 17:23, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsPour faire suite à l’un des messages d’hier, voici le contenu du fichier .glo :
Il n’est donc pas vide.
J’ai modifié le fichier .latexmkrc selon vos indications, et constaté que xindy est bien le fautif : je l’ai supprimé purement et simplement. Compilations faites, j’obtiens bien un glossaire. J’aurais effectivement pu le faire sans passer par glossaries, mais je perdais la classification alphabétique, etc. Compte tenu de la masse de mots envisagée, glossaries va me rendre des services très précieux.
Merci beaucoup pour cette nouvelle aide !
À bientôt, Frédéric
# Le 3 août 2015 à 17:26, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsoui, j’ai confondu avec .gls.
Cela étant, xindy vous sera très utile, notamment si vous avez des mots accentuées.
Du coup il faudrait voir si ce n’est pas le même bug que moi. Quelle distribution utilisez vous ? si 2015, avec vous mis à jour texlive depuis l’installation ?
# Le 3 août 2015 à 17:38, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsJ’utilise TexMaker avec une TeXlive 2015 (Ubuntu). Mais les accents sont bien gérés : bizarre...
Merci encore ! Frédéric PS. J’ai envoyé un mot sur la liste Gutenberg pour information
# Le 3 août 2015 à 17:40, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsil se peut que glossary ait un outils pour cela. Mais ma question était : est-ce que xindy fonctionne chez vous... apparement non, si j’en crois votre message.
# Le 3 août 2015 à 17:55, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsNon, non : xindy bloquait le processus de création de la page pdf. Je l’ai enlevé comme option donnée à glossaries, et tout fonctionne.
Frédéric
# Le 3 août 2015 à 18:02, par Maïeul En réponse à : Introduction à
Latexmk
pour faciliter les compilationsoui, mais si xindy bloquait cela, c’est parque la transformation du fichier .glo en .gls ne fonctionnait pas avec xindy... donc ma question est « quel est le message d’erreur indiqué lorsque vous lancez makeglossaries lorsque vous utilisez xindiy ? »
# Le 4 août 2015 à 13:38, par Frédéric Stévenot En réponse à : Introduction à
Latexmk
pour faciliter les compilationsC’est à n’y rien comprendre... Là, tout fonctionne alors que [xindy] est mis en option du paquet glossaries. Bon. Tant mieux : un souci de moins, et on profite des fonctionnalités de xindy.
Merci de m’avoir relancé, Frédéric