Le problème
XeTeX propose de définir des classes de caractères (par exemple « signes de ponctuations » « espaces » « guillemets »). Ceci permet d’insérer automatiquement des espaces de tailles déterminées entre certains caractères, selon la classe à laquelle ils appartiennent. Par exemple insérer une espace fine avant les caractères de ponctuation double.
Problème : il existe une classe spéciale, celles correspondant à la limite d’un mot, dont le code était 255 dans les anciennes versions de XeTeX, mais qui dans la version distribuée dans TeXLive2016 est devenue 4095.
Résultat : alors que un mot ; un autre mot mettait une espace fine avant le point-virgule, elle met désormais une espace normale.
La solution
Il suffit simplement de patcher la commande french@punctuation.
Ajoutez donc les lignes suivantes dans votre préambule, après avoir chargé le français :
\makeatletter
\appto\french@punctuation{%
\XeTeXinterchartoks \french@punctguillstart 255 = {\nobreakspace\xpg@nospace}% "« " -> "«~"
\XeTeXinterchartoks 255 \french@punctguillend = {\xpg@unskip\nobreakspace}% " »" -> "~»"
\XeTeXinterchartoks \french@punctguillstart 4095 = {\nobreakspace\xpg@nospace}% "« " -> "«~"
\XeTeXinterchartoks 4095 \french@punctguillend = {\xpg@unskip\nobreakspace}% " »" -> "~»"
\XeTeXinterchartoks 4095 \french@punctthin = {\xpg@unskip\nobreak\thinspace}%
\XeTeXinterchartoks 4095 \french@punctthick = {\xpg@unskip\nobreakspace}%
}
\makeatotherOn retrouve le \makeatletter, \makeatother pour manipuler les commandes contenant des @ dans leur nom. Nous ajouter à la fin de la commande \french@punctuation la déclaration des « tokens » (éléments TeX de base) à ajouter entre les caractéres, en utilisant le bon code de classe.
Ceci inclut la correction pour le bug sur les guillemets signalée il y a peu.