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

#!/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 :

#!/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 :

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 :

  • autocmd FileType tex la commande n’est exécutée que pour les fichiers *.tex
  • let &makeprg= permet de fixer une variable dans vim
  • 'rubber --unsafe -df --into ' le début de la commande
  • . concatène avec le reste
  • fnameescape(substitute(expand('%:p:h'),'Mathématiques','JBS/Docs','')) détaillons

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

  • fnameescape() produit une string échappée au sens du $SHELL
  • substitute(<string>,<motif>,<remplacement>,<opts>) est l’équivalent de :'<,'>s/motif/remplaement/opts pris comme fonction vim
  • expand() développe les variables %
  • :p travaille avec le chemin complet
  • :h ne prend que la partie du chemin jusqu’au nom de fichier exclu

Enjoy.

Tagcloud
Ubuntu automontage kernel authentification orgcamp NetworkManager Internet identification PSL Science-Fiction JDLL postfix Opinions Gentoo Éducation Iptables OSM rubber sympa GNU-Linux Educ Libre PlanetUbuntuFr PlanetUbuntu nfs UbuntuFr Mathématiques auto hébergement Python compilation dovecot Mozilla Mandriva Emacs Perso eCryptfs April Drupal beamer automatisation shell DNS Voile Mutt orgmode Société LDAP Réflexions SNCF configuration Épinay redmine sqlite php CAPES Spam OpenVPN CPL dotclear ISN vélo mail installation OpenSSL GCC X.org sudo ArchLinux fail vserver IPv6 Debian Coups de gueule LaTeX Admin Sys Free Parinux RaspberryPi Vie numérique Essai sieve gpg vim fun Randonnée SPF OpenStack Informatique Coup de gueule Lectures Paris Web imap RATP Technique CLI code KDE roundcube Munin