Commandes de style de police

Écrivez {\bf\it x} en LaTeX et vous n'obtenez pas de l'italique gras : vous obtenez de l'italique. Inversez l'ordre en {\it\bf x} et c'est l'italique qui disparaît, laissant un gras droit. Les vieilles commandes à deux lettres refusent tout simplement de s'additionner, et la raison tient en un mot, ligne 493 d'article.cls. Lisez cette ligne et vous comprenez d'un seul coup pourquoi le LaTeX moderne livre chaque changement de police en deux formes. Cette page montre comment ces commandes se répartissent sur trois axes indépendants — famille, graisse et forme, quand recourir au \textbf{...} à argument plutôt qu'à la déclaration \bfseries limitée par un groupe, et ce que dit le journal lorsqu'on demande des petites capitales grasses et qu'un gras ordinaire sort à la place. Avec des mesures tout du long.

La différence entre \textbf{...} et \bfseries

Chaque changement existe sous deux formes. La forme commande, commençant par \text…, prend un argument et n'agit que sur ce qui est entre ses accolades. La forme déclaration, terminée par …family / …series / …shape, ne prend pas d'argument et reste en vigueur de ce point jusqu'à la fin du groupe ou de l'environnement englobant. Le choix suit la longueur de la portée : quelques mots appellent \textbf{juste ceci}, un paragraphe entier ou un environnement appelle {\bfseries …} ou \begin{quote}\itshape …\end{quote}. Oubliez le groupe autour d'une déclaration et elle court jusqu'à la fin du document : vérifiez l'appariement de { et }. Le code des classes et des packages préfère lui aussi les déclarations, parce qu'elles n'ajoutent rien en propre et laissent la gestion de la portée à l'appelant.

latex
% command form: for a short span
This is \textbf{bold} and this is \textit{italic}.

% declaration form: a group limits the scope
Normal here. {\bfseries Bold from here on.} Back to normal.

% declaration applied to a whole environment
\begin{quote}
  \itshape The whole quotation is set in italic.
\end{quote}

Au-delà de la portée, les deux formes diffèrent sur un point pratique : la forme commande insère la correction d'italique à votre place, la forme déclaration non. Un glyphe penché déborde vers le haut et la droite, mais sa largeur de composition n'inclut pas ce débord, si bien qu'une lettre droite qui suit le heurte. À la mesure, \textit{f}h fait 10,74167 pt et {\itshape f}h 8,62222 pt : les 2,11945 pt d'écart sont exactement l'espace manquant. Avec une déclaration, c'est à vous d'écrire le \/ final — {\itshape f\/}h mesure 10,74167 pt, soit très exactement la forme commande. Ce que fait cette correction, la page sur l'accentuation le détaille.

Famille, graisse, forme : les trois axes qui choisissent une police

Une police en LaTeX2e est la combinaison de trois attributs mutuellement indépendants : la famille est la forme de lettre sous-jacente, la graisse (series) réunit épaisseur et chasse, la forme (shape) désigne l'inclinaison ou le dessin. Changez un axe et les deux autres restent intacts : cette orthogonalité est le cœur du dispositif, et c'est pourquoi « gras tout en restant sans empattement » ou « italique tout en restant gras » s'écrivent sans détour. Le schéma est apparu sous le nom de NFSS (New Font Selection Scheme) en 1989, a atteint sa deuxième version en 1993 et est devenu standard avec LaTeX2e en 1994 ; le LaTeX 2.09 antérieur ignorait entièrement la notion d'attribut de police. Retenez que la graisse est un axe unique couvrant à la fois l'épaisseur et la chasse. C'est pour cela que le gras de Computer Modern s'écrit bx — bold extended, gras et large.

  • Famille — romain, c'est-à-dire à empattements, \textrm / \rmfamily ; sans empattement \textsf / \sffamily ; machine à écrire, donc à chasse fixe, \texttt / \ttfamily.
  • Graisse (series) — moyenne, la valeur par défaut, \textmd / \mdseries ; grasse \textbf / \bfseries. La valeur de l'attribut est une chaîne d'au plus deux lettres réunissant épaisseur et chasse : m (medium), b (bold), bx (bold extended), c (condensed), etc.
  • Forme (shape) — droite, la valeur par défaut, \textup / \upshape ; italique \textit / \itshape ; inclinée \textsl / \slshape ; petites capitales \textsc / \scshape. Les valeurs sont respectivement n, it, sl et sc.
  • Italique et incliné ne sont pas la même chose. \itshape appelle un caractère dessiné à part — cmti10 en Computer Modern —, tandis que \slshape appelle le romain mécaniquement penché (cmsl10). Les dessins de lettres diffèrent : le a italique, par exemple, est à un seul étage.
CléAxe et effetForme commande (portée courte)Forme déclaration (limitée par un groupe)
romanFamille : romain (à empattements)\textrm{...}{\rmfamily ...}
sansFamille : sans empattement\textsf{...}{\sffamily ...}
typewriterFamille : machine à écrire (chasse fixe)\texttt{...}{\ttfamily ...}
boldGraisse : grasse (valeur bx et apparentées)\textbf{...}{\bfseries ...}
mediumGraisse : moyenne (par défaut, valeur m)\textmd{...}{\mdseries ...}
italicForme : italique (valeur it)\textit{...}{\itshape ...}
slantedForme : inclinée (valeur sl)\textsl{...}{\slshape ...}
small capsForme : petites capitales (valeur sc)\textsc{...}{\scshape ...}
uprightForme : retour au droit (valeur n)\textup{...}{\upshape ...}
reset allRéinitialiser les trois axes aux valeurs du document\textnormal{...}{\normalfont ...}

Appliquer gras et italique en même temps

Écrivez \textbf{\textit{...}} et vous obtenez de l'italique gras. L'ordre est indifférent, et avec des déclarations il suffit de les énumérer : {\bfseries\itshape ...}. Les axes étant indépendants, le second changement n'efface jamais le premier. À la mesure, à l'intérieur de \textbf{\textit{Y}} la graisse reste bx et seule la forme devient it, si bien que l'italique grasse de Computer Modern, cmbxti10, est chargée. Avec les trois axes, \textsf{\textbf{\textit{...}}} donne une italique grasse sans empattement. Mais pouvoir écrire une combinaison n'est pas la même chose que la police la possède : quand le caractère demandé n'existe pas, LaTeX en substitue un proche — c'est le sujet de la section suivante.

latex
% nest the command forms
\textsf{\textbf{\textit{Bold sans-serif italic}}}

% or list the declarations in one group (equivalent)
{\sffamily\bfseries\itshape Bold sans-serif italic\/}

% one word back to the document default inside a sans-serif run
{\sffamily A heading-like line with one \textnormal{normal} word}

Pour réinitialiser les trois axes d'un coup aux valeurs du document, on emploie \textnormal{...} (forme commande) ou \normalfont (forme déclaration) — commode lorsqu'un titre sans empattement doit contenir un mot dans la police de texte ordinaire. Pour un seul axe, appelez la commande qui en nomme la valeur par défaut : \rmfamily, \mdseries, \upshape. À savoir au passage : les lignes 11158 à 11170 de latex.ltx sont une suite d'appels à \DeclareTextFontCommand, de sorte que chaque \text… cité ici est fabriqué mécaniquement à partir de la déclaration correspondante. La même suite définit aussi \textulc (retour aux bas-de-casse et capitales) et \textsw (anglaise ornée), mais très peu de polices possèdent réellement ces formes.

Pourquoi \bf et \it refusent de se combiner

Parce que la définition de \bf contient un \normalfont. Les lignes 490 à 496 d'article.cls énumèrent ainsi les anciennes commandes à deux lettres : \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}, \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}, et de même pour \rm, \sf, \tt, \sl et \sc. \bf ne signifie donc pas « mets ceci en gras » mais « remets les trois axes à leur valeur par défaut, puis mets en gras ». Composez {\bf\it x} et le \normalfont caché dans \it jette purement et simplement le \bfseries qui précédait : à la mesure, la graisse retombe de bx à m et seule la forme it survit. Dans l'ordre inverse, {\it\bf x}, la forme revient à n et seule la graisse bx survit. Mêler l'ancien au nouveau donne la même chose : \textbf{\tt x} finit avec la famille cmtt mais la graisse revenue à m, le \textbf étant abandonné en silence.

latex
% the old two-letter commands do not stack
{\bf\it x}          % italic only  -- the bold is thrown away
{\it\bf x}          % upright bold -- the italic is thrown away
\textbf{\tt x}      % typewriter, medium weight -- \textbf silently lost

% the modern commands do stack
{\bfseries\itshape x}
\textbf{\ttfamily x}

Cette non-orthogonalité n'est pas un défaut mais la conservation fidèle du modèle de polices de LaTeX 2.09, d'avant 1994 : « la police courante » y était un nom unique et non un jeu d'attributs, de sorte que tout changement était un remplacement intégral. LaTeX2e a introduit en 1994 les commandes empilables par axe et a conservé les anciennes via \DeclareOldFontCommand, comme couche de compatibilité pour que les documents existants compilent encore. Elles fonctionnent toujours sans erreur — et c'est précisément le problème : qui écrit {\bf\it important} veut de l'italique grasse et ne s'apercevra du contraire qu'à la lecture du PDF. Notons aussi que le troisième argument de \DeclareOldFontCommand est le sens en mode mathématique : \bf se comporte comme \mathbf dans une formule. Une commande qui signifie autre chose en texte qu'en mathématiques est une raison de plus de l'éviter. Dans du code neuf, employez toujours la famille \textbf / \bfseries.

Quand le journal affiche Font shape ... undefined

Ce n'est pas un signalement de faute de frappe : le message dit que la police ne possède pas le caractère correspondant à la combinaison demandée. Le cas classique est celui des petites capitales grasses : Computer Modern, dans le codage OT1 par défaut, n'a aucun caractère à la fois bx et sc. Composez \textsc{\textbf{...}} et le journal affiche le couple de lignes reproduit ci-dessous — une ligne Font shape et une ligne using ... instead. LaTeX ne s'arrête pas sur une erreur : il abandonne les petites capitales et poursuit en gras ordinaire. On ne l'apprend donc qu'en constatant l'absence des petites capitales dans le PDF. Pour la même raison, \textsw{...} avertit que OT1/cmr/m/sw est indéfini.

log
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font)              using `OT1/cmr/bx/n' instead on input line 8.

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

Pour cet avertissement précis, la solution tient en une ligne : ajoutez \usepackage[T1]{fontenc}. Le Computer Modern codé en T1 (les fontes EC) possède bel et bien des petites capitales grasses, si bien que le même \textsc{\textbf{...}} compile sans avertissement ; en rechargeant avec [T1]{fontenc}, l'avertissement de police a totalement disparu du journal. T1 améliore en outre le traitement des lettres accentuées et de la césure, c'est donc une ligne que ce type de document finit de toute façon par réclamer. Si l'avertissement désigne une autre combinaison, lisez le nom en quatre parties du journal — OT1/cmr/bx/sc, soit codage / famille / graisse / forme — et repérez l'axe manquant. Décidez alors : passer à une police qui le possède, simplifier la demande d'un cran, ou accepter la substitution — et consignez la décision.

latex
% OT1 Computer Modern has no bold small caps -> warning + silent fallback
% T1 (the EC fonts) does have it
\usepackage[T1]{fontenc}

\textsc{\textbf{Bold Small Capitals}}

% low-level NFSS: name the four attributes, then commit with \selectfont
{\fontfamily{cmr}\fontseries{bx}\fontshape{sc}\selectfont Explicit}

Comme le montrent ces deux dernières lignes, une commande de haut niveau telle que \textbf se développe en interne en commandes NFSS de bas niveau. \fontfamily{...}, \fontseries{...} et \fontshape{...} réécrivent les attributs, et \selectfont choisit effectivement une police à partir de ce que contiennent les quatre attributs à cet instant. Fixer les attributs seuls ne produit rien : la police ne change qu'à l'appel de \selectfont. On touche rarement à cette couche directement, mais c'est vers elle qu'on se tourne pour convoquer nommément un caractère précis, ou pour vérifier à quoi renvoie le nom en quatre parties d'un avertissement. Ce que signifie le codage et comment charger de vrais fichiers de police relèvent de la page sur le système de polices.

Changer de caractère japonais : mincho et gothique

En pLaTeX et upLaTeX, le texte japonais possède ses propres axes, et l'axe famille compte deux membres : mincho \textmc / \mcfamily et gothique \textgt / \gtfamily. Ils sont définis à partir de la ligne 1471 de plcore.ltx et commutent \kanjifamily, un attribut propre au côté japonais. Le comportement sous \bfseries est le plus instructif. À la mesure, la famille japonaise reste mc (mincho) et seule la graisse devient bx. La ligne 25 de jy1mc.fd porte alors \DeclareFontShape{JY1}{mc}{bx}{n}{<->ssub*gt/m/n}{} : une demande de « mincho gras » est définie pour être servie par le gothique en graisse normale. « Je l'ai mis en gras et c'est sorti en gothique » n'est donc ni un hasard ni un pis-aller : c'est une substitution inscrite noir sur blanc dans le fichier de définition de police, reflet de la tradition qui marque l'accentuation japonaise par un changement de caractère plutôt que de graisse.

Une règle de travail pour les manuscrits

Limitez les commandes de police écrites directement dans le corps à celles qui portent un sens. Dans une thèse ou un document technique, plus on disperse de changements de police comme autant de retouches visuelles, plus le manuscrit devient difficile à entretenir. Des règles comme « les titres sont gras », « les légendes sont plus petites », « les termes définis sont systématiquement sans empattement » ont leur place dans la classe, dans un package ou dans une macro sémantique à vous, non dans un \textbf retapé à chaque fois. Intercalez une couche — \newcommand{\term}[1]{\textsf{#1}} — et un changement de politique devient une modification d'une ligne. À l'inverse, pour ce dont l'apparence est le sens, comme le nom d'un bouton d'interface ou d'une touche du clavier, employer \textsf ou \texttt en ligne ne pose aucun problème. Le critère : l'apparence est-elle le but, ou tient-elle lieu de sens ?

  • Laisser l'accentuation à \emph. Inscrire un choix visuel dans le corps, c'est renoncer à pouvoir changer plus tard l'aspect de l'accentuation.
  • Employer les déclarations pour les longues portées. Pour une citation entière ou une note marginale, déclarez \itshape au début de l'environnement et laissez l'environnement fermer le groupe.
  • Essayer les combinaisons dans un fichier minimal. Composez \textsf{\textbf{...}} ou \textsc{...} une fois dans un court document et vérifiez l'absence d'avertissement de police dans le journal avant de les disséminer dans le manuscrit.
  • Ne pas laisser filer les substitutions. À ignorer les avertissements, un même balisage peut prendre un aspect différent d'un chapitre à l'autre. Changez de police ou simplifiez la demande.
  • Ne pas mêler les anciennes commandes à deux lettres. En trouvant \bf ou \it dans un manuscrit collaboratif, remplacez-les par \bfseries / \itshape ou \textbf / \textit. Elles semblent fonctionner, mais ne se combinent pas.