C'est Babel !

J'ai toujours été fasciné par la calligraphie. Pas seulement celle que j'ai pratiqué (je m'y remets bientôt, promis), mais toutes les calligraphies, latines ou non. Les pleins et les déliés (cela ne signifie pas forcément grand chose en-dehors de la calligraphie latine) des langues étrangères ne sont pas dénués de beauté ni de mystère. Mais quand il faut retranscrire ça dans un document, ça devient moins plaisant, surtout si ce document est en partie produit automatiquement.

Mais, avec les bons outils et une bonne procédure, on peut facilement s'en sortir. À preuve : le document sur lequel je travaille contient des passages en arabe, bengali, birman, chinois, coréen, hébreu, hindi, japonais, khmer, laotien, russe et thai. XeLaTeX, avec polyglossia et ucharclasses, gèrent ça comme des chefs[1]

La plus grande difficulté a été de déterminer « dans quel script cette séquence de caractères est-elle écrite ? » Je reconnais sans difficulté l'arabe, le chinois, le japonais, l'hébreu, le russe et le coréen. J'avais déjà les éléments de configuration pour le thaï et l'hindi. Pour définir les règles de changement de polices de caractères adéquates, il me fallait déterminer la langue (écrite, d'où le terme de « script » que j'ai utilisé) des autres séquences non-latines.

Google, en tant que moteur de recherche, n'a pas été très utile. Il m'a évidemment trouvé des montagnes de sites contenant les suites de caractères que je recherchais, mais sans me permettre facilement de déterminer quelle en était la langue écrite. Google Translate, par contre, indique automatiquement la langue qu'il a identifiée[2]. Ma petite procédure itérative est la suivante :

  1. compiler le document avec XeLaTeX
  2. rechercher dans le journal de compilation les lignes contenant « missing char », qui indiquent un glyphe absent de la police active à ce moment
  3. s'il s'agit d'un émoticône, chercher sa représentation sur https://unicode-table.com/fr/search, ajouter la règle de substitution automatique, et passer au glyphe absent suivant
  4. s'il s'agit d'un caractère d'une graphie non encore identifiée, utiliser Google Translate pour déterminer cette graphie
  5. ajouter une police de caractères associée à cette graphie au document
  6. ajouter les règles de changement de police à la détection de ces blocs Unicode
  7. recompiler, et recommencer pour les glyphes suivants.

Mon en-tête de document contient maintenant le bloc suivant :

  \usepackage{polyglossia}
  
  \setmainlanguage{french}

  \setmainfont{Noto Serif Regular}
  \newfontfamily\myregularfont{Noto Serif Regular}
  \setsansfont{Noto Sans Regular}

  \newfontfamily\arabicfont{Noto Kufi Arabic}
  \newfontfamily\bengalifont{Noto Sans Bengali}
  \newfontfamily\birmanfont{Noto Sans Myanmar}
  \newfontfamily\cyrillicfont{Noto Sans}
  \newfontfamily\hebrewfont{Noto Sans Hebrew}
  \newfontfamily\hindifont{Noto Sans Devanagari}
  \newfontfamily\khmerfont{Noto Sans Khmer}
  \newfontfamily\laofont{Noto Sans Lao}
  \newfontfamily\mychinesefont{Noto Sans Mono CJK TC}
  \newfontfamily\thaifont{Noto Sans Thai}
  
  \usepackage[Arabics, Bengali, CJK, Cyrillics, Devanagari, Hebrew, Khmer, Lao, Myanmar, Thai]{ucharclasses}
  \setTransitionsForCJK{\mychinesefont}{\myregularfont}
  \setTransitionsForCyrillics{\cyrillicfont}{\myregularfont}

  \setTransitionTo{Arabics}{\arabicfont}
  \setTransitionFrom{Arabics}{\myregularfont}

  \setTransitionTo{Bengali}{\bengalifont}
  \setTransitionFrom{Bengali}{\myregularfont}

  \setTransitionTo{Devanagari}{\hindifont}
  \setTransitionFrom{Devanagari}{\myregularfont}
  
  \setTransitionTo{Khmer}{\khmerfont}
  \setTransitionFrom{Khmer}{\myregularfont}
  
  \setTransitionTo{Lao}{\laofont}
  \setTransitionFrom{Lao}{\myregularfont}

  \setTransitionTo{Thai}{\thaifont}
  \setTransitionFrom{Thai}{\myregularfont}
  
  \setTransitionTo{Hebrew}{\hebrewfont}
  \setTransitionFrom{Hebrew}{\myregularfont}

  \setTransitionTo{Myanmar}{\birmanfont}
  \setTransitionFrom{Myanmar}{\myregularfont}

Et ça roule !

Jusqu'à la prochaine séquence utilisant une graphie non encore rencontrée, évidemment.

Notes

[1] Les toqués de Word, amusez-vous avec ça !

[2] Sous réserve que cette langue lui soit connue, évidemment.