Vim, LaTeX, rubber et d'autres sont dans un bateau

Le «cahier des charges»

Depuis que j'ai commençé à enseigner, j'utilise LaTeX pour produire les documents destinés aux élèves : cours, exercices, présentation, devoirs, … Ma pratique de LaTeX a évolué au cours du temps, en particulier sur les paquets que j'utilise, mais ce n'est pas l'objet du présent billet. Je vais plutôt chercher à expliciter les à-cotés de ma gestion de fichier et de ma production.

Un des avantages de LaTeX est son format : plaintext, qui permet l'emploi d'un gestionnaire de version comme git et qui me permet de publier mes sources. En revanche, parmi les choses moins évidentes, il y a le nombre compilation de LaTeX ou la gestion des compilations externes, comme ce qu'on peut produire avec PythonTeX. Pour me faciliter la tâche, j'utilise rubber.

Je voulais, pour plein de raisons, séparer la production des fichiers de leurs sources, mais garder accessibles les sources à côté des fichiers eux-même. Une des raisons à ça est la possibiliter de mettre fichiers sources et pdf générés dans un Nextcloud synchronisé avec le boulot. Ainsi, j'ai les fichiers sources générés disponibles rapidement et les sources pour faire une modification rapide si nécessaire. Il fallait donc compiler les fichiers au «bon endroit».

La solution technique

Pendant longtemps, j'ai utilisé directement la possibilité de Vim d'invoquer une commande du terminal avec :!cmd en mettant « à la main » les options. Ainsi, je compilais les documents en tapant presque toute la commande rubber --unsafe -df --into ~/repertoire\ de\ destination/ "%" ce qui est clairement sous optimal.

Je l'ai déjà mentionné, mes documents étant sous git, j'ai un script post-commit dont le rôle est de copier le fichier source dans le répertoire de destination. J'utilise pour ça Unison avec le script suivant

:::bash
#!/bin/bash
unison ~/Documents/Mathématiques/ ~/Documents/JBS/Docs/ \
  -ignore='Name *.*' -ignore='Path .git' -ignore='Name .*' \
  -ignorenot='Name *.tex' -ignorenot='Name *.png' \
  -ignorenot='Name *.inc' \
  -logfile ~/.unison.log \
  -prefer ~/Documents/Mathématiques/ \
  -links false -terse -silent -times -owner

Mes solutions précédentes, à base de rsync ou de git n'étaient pas satisfaisantes. Pour mémoire, en voici tout de même :

:::bash
#!/bin/bash
unset GIT_INDEX_FILE
git --work-tree=/home/users/endymion/Documents/JBS/Docs/ \
  --git-dir=/home/users/endymion/Documents/Mathématiques/.git \
  checkout -f

Celle-ci ne convenait pas, car le mtime de tous les fichiers était modifié à chaque fois.

Ces éléments là sont désormais fixés et je ne pense pas revenir dessus. En revanche, le dernier élément que j'ai amélioré est la phase de compilation depuis vim. En effet, après m'être trop souvent trompé de répertoire de destination, j'ai décidé de trouver une solution plus pérenne, le répertoire de destination se déduisant du répertoire courant.

Les articles suivants et les questions sur {stackexchange,superuser} m'ont permis d'aboutir à la variable suivante :

:::ini
autocmd FileType tex let &makeprg='rubber --unsafe -df --into ' . fnameescape(substitute(expand('%:p:h'),'Mathématiques','JBS/Docs',''))

qui me permet désormais de juste taper :make '%' pour produire mes documents.

Quelques explications sur les différents élements :

Pour les détails de cette dernière commande, on peut la décomposer de la façon suivante :

Enjoy.