David Madore's WebLog: Représentation des maths : TeX et Unicode sont dans un bateau

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entry #2115 [older|newer] / Entrée #2115 [précédente|suivante]:

(mercredi)

Représentation des maths : TeX et Unicode sont dans un bateau

[Cette entrée fait plus ou moins suite — ou complément — à la précédente, même si elle peut être lue indépendamment.]

Quand on change de police dans le mode maths de TeX (avec des commandes comme \it pour les italiques ou \bf pour le gras dans plain TeX, remplacées en LaTeX par \mathit et \mathbf), le système change vraiment de police (enfin, plus exactement, il change de « famille », une famille étant un ensemble de polices pour le mode maths, les indices et exposants et indices et exposants de deuxième niveau). Plus précisément, TeX attribue aux symboles du mode maths un mathcode, qui est constitué de trois parties : un type de symbole (0=ordinaire, 1=grand opérateur, 2=opération binaire, 3=relation, etc., et 7=variable), une famille (par exemple, 0=droit, 1=italiques maths, 2=script et symboles, 6=gras) et un numéro de caractère dans la police (par exemple, pour un ‘x’, ces parties valent 7, 1 et 0x78, tandis que pour un ‘+’ elles valent 2, 0 et 0x2B, et enfin pour un \Gamma ce sont 7, 0 et 0x00) ; le type sert à l'espacement, la famille détermine la police utilisée pour ce symbole, et le numéro indique quoi chercher dans cette police ; mais si le type vaut 7(=variable), alors le numéro de famille stocké comme deuxième partie du mathcode sera overridé par le numéro de famille courante (celle qu'on choisit en tapant une commande de police) si ce numéro ne vaut pas −1 : c'est la raison pour laquelle le ‘x’ est italique par défaut (alors que le \Gamma est droit par défaut) mais que si on ajoute un \bf devant (qui passe la famille à 6), tous les deux deviennent gras — en revanche, le ‘+’ ne le devient pas.

Mais Unicode a prévu des alphabets spécifiques pour les lettres grasses/italiques/etc. dans les formules mathématiques (l'idée étant qu'en mathématiques, et seulement en mathématiques, passer en gras change vraiment la sémantique du caractère : donc il est logique d'en faire un caractère Unicode différent).

Du coup, si on utilise LuaTeX avec le package unicode-math, les choses sont complètement différentes : il n'y a plus qu'une police (numérotée 0) qui sert pour tout, elle est encodée avec des codepoints Unicode. Par exemple, un ‘x’ mathématique italique minuscule est représenté dans Unicode par le codepoint U+1D465 MATHEMATICAL ITALIC SMALL X : le paquet unicode-math va donc lui donner le mathcode (étendu par LuaTeX pour pouvoir dépasser les 3+4+4=15 bits prévus par TeX) dont les trois parties sont : 7, 0 et 0x1D465. Cette fois, quand on veut passer, disons, en sans-sérif, le paquet ne change pas la police, il change les mathcode associés aux lettres (dans un \mathsf, le mathcode du ‘x’ devient (7, 0, 0x1D5D1) pour référencer U+1D5D1 MATHEMATICAL SANS-SERIF SMALL X).

Bon, le principe n'est pas idiot, mais il souffre d'une limitation : et si je veux un ‘Ш’ en gras ou en sans-sérif ? Et si je veux un ‘é’ en gras ou en sans-sérif ? Unicode n'a pas prévu de caractères pour ces choses-là. Et, indépendamment d'Unicode, la police XITS ne les a pas. Ce qui ne veut pas dire que les choses soient impossibles : pour le gras, on peut prendre une version grasse de la police XITS (oui, il y a un alphabet mathématique gras dans la police normale, mais il y a aussi une version grasse de la police) ; pour le sans-sérif, on peut aller chercher une police vaguement semblable ; et pour taper un ‘é’ on peut aussi mettre un ‘´’ sur un ‘e’. Mais quelle est la bonne façon de faire ?

On peut peut-être inventer des nuances sémantiques sibyllines : par exemple, on peut prétendre que si j'écris un x sans-sérif dans une formule mathématique (un 𝖾), c'est un symbole en lui-même, donc il est logique de le représenter par un symbole Unicode spécial qui correspond à un e sans-sérif quelle que soit la police (U+1D5BE MATHEMATICAL SANS-SERIF SMALL E), mais que si je choisis de représenter l'ensemble des dérivations sur un anneau A par Dér(A) et que je m'amuse à écrire le Dér en sans-sérif, alors il faut quand même le représenter par les caractères Unicode normaux (U+0044 LATIN CAPITAL LETTER D / U+00E9 LATIN SMALL LETTER E WITH ACUTE / U+0072 LATIN SMALL LETTER R) et c'est la police qui devra être sans-sérif. Pour aller plus loin dans les distinctions byzantines : dans le deuxième cas, on a un ‘é’ dans une police sans-sérif, alors que si j'invente une notation mathématique représentée par un accent aigu (pourquoi pas, après tout), je pourrai voir un U+1D5BE MATHEMATICAL SANS-SERIF SMALL E surmonté d'un accent aigu, ce qui est différent. C'est en tout cas la meilleure façon que je voie de défendre la choix d'Unicode. Mais il faut dire que c'est sacrément tiré par les cheveux, et un peu pénible à implémenter avec unicode-math. Et ça ne tient même pas complètement debout : parce que si je prétends que les mots ou bouts de mots français qui apparaissent dans les formules mathématiques doivent s'écrire avec les caractères Unicodes « normaux » et pas dans les alphabets mathématiques du plan 1 — ce qui, effectivement, se défend — ça pose problème lorsque je commence à vouloir distinguer le mot Hom écrit en caractères gras (par exemple pour la catégorie des foncteurs entre deux catégories). Bref, on encule les mouches mais on ne sait pas très bien où on va.

↑Entry #2115 [older|newer] / ↑Entrée #2115 [précédente|suivante]

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées