Accueil > LaTeX > Typographie > Normalisation des caractères unicode et typographie

Normalisation des caractères unicode et typographie

lundi 29 avril 2013, par Maïeul

La norme unicode permet d’encoder la quasi totalité des caractères existants sur Terre [1]. Elle possède certaines subtilités, qui peuvent être problématique avec certaines polices. Parmi ces subtilités, le fait qu’un même caractère puisse se noter de plusieurs manières... mais que les polices peuvent ne pas comprendre qu’il s’agit du même caractère.

Pour éviter ces problèmes, une solution est de normaliser les caractères. Voici un script permettant de le faire.

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 :

  1. avec le caractère "GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI", dont le code unicode est U+1FB3, ce qui donne .
  2. 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 est U+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.

Deux manières d’encoder un alpha avec iota souscrit ... deux affichages différents
Deux manières d’encoder un alpha avec iota souscrit ... deux affichages différents

Résolution du problème

La norme unicode prévoit des formes normalisées. Les plus courantes sont :

  1. NFC, qui compose les caractères. Ainsi, si on applique cette normalisation, U+03B1 U+0345 devient U+1FB3.
  2. NFD, qui décompose les caractères. Ainsi, si on applique cette normalisation, U+1FB3 devient U+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 :

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}
Deux manières d’encoder un alpha avec iota souscrit ... deux affichages identiques
Deux manières d’encoder un alpha avec iota souscrit ... deux affichages identiques

[1Il reste même en théorie de la place pour les caractère extra-terrestres.

[2En effet, les auteurs de polices de caractères commencent généralement par prévoir les formes unitaire plutôt que composés.

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)