Explication et exemple
La norme Unicode, comme tous les jeux de caractères, affecte un numéro à chaque caractère. Cependant il existe des caractères dit « composés » qui peuvent soit avoir un numéro unique, soit s’encoder comme une suite de caractère.
Prenons par exemple le caractère grec « Alpha avec iota souscrit ». Il y a de manière de le noter en unicode :
- avec le caractère « GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI », dont le code unicode est
U+1FB3
, ce qui donneᾳ
. - avec le caractère « GREEK SMALL LETTER ALPHA », dont le code unicode est
U+03B1
, suivi du caractère « COMBINING GREEK YPOGEGRAMMENI », dont le code unicode estU+0345
, ce qui donneᾳ
.
Typiquement, si avec votre clavier vous frappez le iota souscrit avant le alpha, vous utilisez la première solution, et si vous le frappez après le alpha, vous utilisez la seconde solution.
En théorie, les polices sont censées rendre la même chose... cependant cela ne fonctionne pas toujours très bien.
Ainsi prenons la police Linux Libertine.
Voici ce qu’elle affiche, pour le moment, selon les deux manières d’encoder.
Résolution du problème
La norme unicode prévoit des formes normalisées. Les plus courantes sont :
-
NFC
, qui compose les caractères. Ainsi, si on applique cette normalisation,U+03B1 U+0345
devientU+1FB3
. -
NFD
, qui décompose les caractères. Ainsi, si on applique cette normalisation,U+1FB3
devientU+03B1 U+0345
.
En général, pour avoir le meilleur rendu typographique, il faut préférer la forme NFC
[2].
On peut le faire à deux niveaux :
- soit au niveau du fichier même, en appliquant un script qui normalise les formes, par exemple celui que j’ai déposé sur github. Cependant, cela implique de penser à exécuter le script avant la compilation, ce qui n’est guère pratique.
- soit au niveau de XeTeX, en utilisant la commande
\XeTeXinputnormalization
, suivi d’un numéro :-
1
pour appliquerNFC
-
2
pour appliquerNFD
.
-
Si on met en place cette commande, le fichier n’est pas modifié, mais XeTeX fera dynamiquement les modifications.
Ainsi, dans le cas présent, nous pouvons mettre :
\documentclass{article}
\usepackage{fontspec,polyglossia,xunicode}
\setmainfont{Linux Libertine O}
\usepackage[margin=0.1cm,a4paper]{geometry} % juste pour l'exemple, histoire de ne pas couper la ligne
\XeTeXinputnormalization 1
\begin{document}
ᾳ GREEK SMALL LETTER ALPHA (U+03B1) + COMBINING GREEK YPOGEGRAMMENI (U+0345)
ᾳ GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI (U+1FB3)
\end{document}