Que se passe-t-il sous le capot quand vous changez de fonte avec \textbf ou \sffamily ? Cette page décrit la mécanique derrière les commandes de fonte. LaTeX désigne une fonte par cinq attributs indépendants (NFSS) et compose au moyen d’un encodage qui associe les caractères saisis à de vrais glyphes. La liste des commandes a sa propre page ; ici nous approfondissons les sélecteurs de bas niveau validés par \selectfont, les différences entre OT1 / T1 / TU, et la raison d’écrire \usepackage[T1]{fontenc} avec pdfLaTeX.
NFSS : une fonte, cinq attributs
La sélection des fontes dans LaTeX2e repose sur le NFSS (New Font Selection Scheme). Son idée centrale est que toute fonte de texte est entièrement déterminée par cinq attributs. Le fntguide (guide de sélection des fontes de LaTeX2e) les nomme ainsi : encoding, family, series, shape et size.
- Encodage — l’ordre des caractères dans la fonte, c’est-à-dire la correspondance entre caractère saisi et emplacement de glyphe. Pour le texte, les courants sont
OT1(TeX text) etT1(TeX extended text, dit Cork). Détails dans la section suivante. - Famille — un ensemble de fontes partageant un dessin de lettres. Les codes sont
cmrpour Computer Modern Roman,cmsspour son sans,cmttpour son typewriter ; pour les polices commerciales,ptm(Times),phv(Helvetica),pcr(Courier). - Série — un axe qui combine graisse et chasse :
m(medium = défaut),b(bold),bx(bold extended),c(condensed),sb(semi-bold), etc. - Forme — la forme des lettres :
n(droit/romain),it(italique),sl(penché/oblique),sc(capitales et petites capitales). Plus rare :ui, une italique artificiellement redressée. - Taille — la taille de dessin, une dimension comme
10pt; sans unité,ptest supposé.
La subtilité importante est que la série est un axe qui fusionne graisse et largeur. Dans le schéma standard, les graisses vont de ul à ub (ultra light à ultra bold) et les largeurs de uc à ux (ultra condensed à ultra expanded). Les deux sont concaténées en une seule valeur, sauf que m est omis, à moins que la graisse et la largeur soient toutes deux medium, auquel cas un seul m reste. Ainsi “gras, largeur normale” est b, “gras étendu” est bx, et “graisse normale, condensé” est c.
Ces cinq attributs, écrits encoding/family/series/shape/size, forment le nom formel d’une fonte dans LaTeX. Par exemple, OT1/cmr/m/n/10 signifie “Computer Modern Roman en encodage OT1, graisse medium, droit, 10 points”. La chaîne \OT1/cmr/m/n/10 vue dans un avertissement overfull box correspond exactement à ces cinq attributs. Les commandes de haut niveau que vous utilisez d’ordinaire, comme \textbf, ne font que réécrire l’un de ces cinq éléments.
Sélecteurs de bas niveau et \selectfont
Sous les commandes de haut niveau se trouvent des sélecteurs de bas niveau qui définissent un attribut à la fois : \fontencoding{T1}, \fontfamily{ptm}, \fontseries{b}, \fontshape{it}, \fontsize{12}{14}. Mais une règle est cruciale : les définir ne change rien tant que \selectfont n’est pas appelé. Le fntguide avertit qu’un \selectfont doit suivre immédiatement tout réglage de paramètres de fonte, avant le texte qui suit.
% 正しい:設定 → \selectfont → テキスト / Correct: set, then \selectfont, then text
\fontfamily{ptm}\fontseries{b}\selectfont Some text.
% 誤り:設定とテキストの間に文字を挟んではいけない / Wrong: no text between a setting and \selectfont
\fontfamily{ptm} Some \fontseries{b}\selectfont text.Le raccourci qui fixe ces attributs d’un coup est \usefont{encoding}{family}{series}{shape}. Il équivaut aux commandes \font... correspondantes suivies de \selectfont, avec la taille reprise de la valeur courante. Il est pratique pour appeler ponctuellement une fonte nommée précise. Changer \fontencoding exige également un \selectfont suivant pour prendre effet.
Vous écrivez rarement ces attributs directement : \textbf appelle \fontseries pour vous, \sffamily appelle \fontfamily, etc. La liste des commandes et le choix entre forme commande et forme déclaration se trouvent sur la page “Font style commands”. On descend au bas niveau seulement pour nommer une fonte précise ou intégrer une nouvelle fonte dans une classe ou un paquet.
Macros par défaut : \rmdefault et compagnie
La famille choisie par \textrm ou \rmfamily n’est pas codée en dur : elle est stockée dans une macro. Il y en a trois : \rmdefault (romain), \sfdefault (sans), \ttdefault (typewriter), dont les valeurs par défaut dans la classe article sont cmr, cmss, cmtt. Ainsi, pour mettre le corps en Times, Helvetica et Courier, on remplace ces macros plutôt que de réécrire les commandes.
% 文書全体の3ファミリを差し替える / Re-point the three families for the whole document
\renewcommand{\rmdefault}{ptm} % roman → Times
\renewcommand{\sfdefault}{phv} % sans → Helvetica
\renewcommand{\ttdefault}{pcr} % mono → CourierLa fonte du corps elle-même est définie par \encodingdefault / \familydefault / \seriesdefault / \shapedefault, avec les valeurs par défaut OT1, \rmdefault, m, n. Comme \familydefault pointe vers \rmdefault, modifier \rmdefault modifie la fonte du corps. La graisse du gras est portée par \bfdefault (par défaut bx) ; avec des polices qui n’ont pas de gras bx, comme beaucoup de PostScript, il peut falloir la ramener à b.
Encodages de fonte : de l’entrée au glyphe
Un encodage de fonte est l’ordre des glyphes dans une fonte, c’est-à-dire la convention qui dit à quel emplacement (glyphe) correspond chaque caractère saisi. C’est le premier des cinq attributs, mais aussi le seul sans commande d’auteur comme \textbf. Comme le note le fntguide, le changement d’encodage est fourni par un paquet tel que fontenc.
Pour le texte, l’essentiel est ceci. OT1 est l’encodage “TeX text” original sur 7 bits de Knuth (par défaut). Avec seulement 128 caractères, les lettres accentuées comme é ou ñ sont construites par composition d’une lettre de base et d’un accent (\accent). Cette composition pose problème : les mots accentués ne sont pas coupés, et la copie depuis le PDF se dégrade. T1 (“TeX extended text”, issu de la conférence TUG de 1990 à Cork, d’où encodage Cork) est un encodage 8 bits de 256 glyphes qui contient chaque lettre accentuée comme un glyphe unique. Les langues d’Europe occidentale, et certaines d’Europe orientale, peuvent alors être correctement coupées et copiées proprement.
TU (TeX Unicode) permet d’utiliser directement les polices OpenType installées sur le système par point de code Unicode, et c’est le défaut de XeLaTeX et LuaLaTeX. Comme fontspec le configure automatiquement, on écrit rarement TU à la main avec un moteur Unicode. Il existe aussi des encodages spécialisés : T2A (cyrillique), LGR (grec, l’encodage principal actuellement utilisé pour la langue) et TS1 (l’encodage Text Companion, ensemble de glyphes de symboles de texte comme copyright et monnaies, géré par textcomp). Pour les maths, les encodages OML (italique mathématique), OMS (symboles mathématiques) et OMX (grands symboles mathématiques) sont attribués.
| Encodage | Ce qu’il couvre | Largeur / notes |
|---|---|---|
OT1 | “TeX text” original de Knuth (défaut) | 7 bits ; accents composés → pas de césure |
T1 | TeX extended text (Cork) ; langues occidentales | 8 bits, 256 glyphes ; accents uniques → césure possible |
TU | TeX Unicode ; polices OpenType directes | Défaut de Xe/LuaLaTeX ; configuré par fontspec |
T2A | Cyrillique | 8 bits (aussi T2B / T2C) |
LGR | Grec | Encodage de 256 glyphes maintenant standard pour le grec |
TS1 | Text Companion (symboles de texte) | Copyright, monnaies, etc. ; géré par textcomp |
Encodage d’entrée et encodage de fonte
Séparons deux notions faciles à confondre. L’encodage d’entrée détermine comment les octets du fichier source .tex sont lus comme caractères (UTF-8, etc.) ; historiquement, c’était le rôle du paquet inputenc. L’encodage de fonte détermine dans quel glyphe de la fonte de sortie ces caractères sont envoyés, et relève de fontenc. C’est le rapport entre l’entrée (inputenc) et la sortie (fontenc).
Dans le pdfLaTeX moderne, le source est lu en UTF-8 par défaut, donc il n’est presque jamais nécessaire de charger explicitement inputenc. L’encodage de fonte, en revanche, vaut toujours la peine d’être défini. fontenc est un paquet pour pdfLaTeX ; avec XeLaTeX ou LuaLaTeX, on utilise plutôt fontspec (et comme TU y est le défaut, le problème se pose largement moins).
Avec pdfLaTeX, charger T1
Si vous composez avec pdfLaTeX, l’usage est de mettre \usepackage[T1]{fontenc} dans le préambule. Cela bascule l’encodage de fonte du document vers T1 et élimine les défauts du OT1 par défaut : mots accentués non césurés et texte dégradé lors de la copie depuis le PDF. La documentation de fontenc le dit aussi : elle prend en charge des langues occidentales courantes comme le français, l’allemand, l’italien et le polonais, et les mots accentués peuvent être césurés par LaTeX puis copiés-collés depuis la sortie.
Si plusieurs encodages sont listés comme options de fontenc, le dernier indiqué devient le défaut (\encodingdefault est réglé dessus). Par exemple, pour un document qui mélange du grec, on écrit \usepackage[LGR,T1]{fontenc} : le corps reste par défaut en T1 et l’on bascule vers LGR lorsque nécessaire.
\documentclass{article}
\usepackage[T1]{fontenc} % フォントエンコーディングを T1 に / font encoding -> T1
% pdfLaTeX では入力は UTF-8 が既定(inputenc は通常不要)
% Input is UTF-8 by default on pdfLaTeX (inputenc usually unneeded)
\begin{document}
% T1 ならアクセント付きの語も正しくハイフネーションされる
% With T1, accented words hyphenate correctly
Na\"ive r\"esum\"e, \"uberfl\"ussig, Stra\ss{}e.
\end{document}Sélecteurs de bas niveau en pratique
Enfin, un document unique vérifie l’usage des sélecteurs de bas niveau et de \usefont. \usefont fournit quatre des cinq attributs à la fois (encoding, family, series, shape) et valide sur place ; \fontfamily plus \selectfont définit les attributs individuellement puis valide. En entourant l’un ou l’autre d’un groupe { }, on limite l’effet à cette portée.
\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
% \usefont で 4 属性を一括指定 / \usefont sets four attributes at once
{\usefont{T1}{ptm}{b}{it} Bold italic Times}
% 低水準セレクタを個別に設定し \selectfont で確定
% Set selectors individually, then commit with \selectfont
{\fontfamily{phv}\fontseries{b}\selectfont Bold Helvetica}
% サイズだけ変える(baselineskip は現在値を流用)
% Change only the size (reuse the current baselineskip)
{\fontsize{14}{\f@baselineskip}\selectfont Fourteen point}
\end{document}Ici, {\usefont{T1}{ptm}{b}{it} ...} choisit “Times en encodage T1, gras italique” ; en quittant le groupe, la fonte précédente revient. Passer la macro interne \f@baselineskip comme second argument de \fontsize est l’idiome pour changer seulement la taille des caractères sans toucher à l’interligne (il ne faut pas réécrire directement les macros internes, mais les lire pour les transmettre est acceptable).