[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.