Caractères spéciaux

LaTeX réserve exactement dix caractères spéciaux — # $ % & ~ _ ^ \ { } — et cette liste n’a été choisie par personne. TeX attribue à chaque caractère un code de catégorie ; les caractères ordinaires sont « lettre » (11) ou « autre » (12). Exactement dix caractères ASCII imprimables portent un autre numéro, et ce sont eux les caractères réservés. La réponse à « pourquoi ces dix-là ? » ne relève donc ni de l’histoire ni du goût : elle tient dans la table de configuration du processeur d’entrée de TeX. Cette page explique comment imprimer chacun d’eux littéralement, comment poser des accents, et comment saisir du texte non ASCII maintenant qu’UTF-8 est la valeur par défaut de LaTeX.

Les dix caractères réservés et leurs codes de catégorie

Un caractère réservé est un caractère que LaTeX utilise dans sa propre syntaxe : le taper ne l’imprime pas, cela déclenche un comportement. Tapez % et le reste de la ligne disparaît ; tapez $ et vous passez en mode mathématique ; tapez & et une colonne de tableau est séparée. Traduit en codes de catégorie : \ vaut 0 (début de commande), { vaut 1 et } vaut 2 (ouverture et fermeture de groupe), $ vaut 3 (bascule mathématique), & vaut 4 (tabulation d’alignement), # vaut 6 (numéro de paramètre), ^ vaut 7 (exposant), _ vaut 8 (indice), ~ vaut 13 (caractère actif) et % vaut 14 (commentaire). a vaut 11, 1 ou + valent 12 — des caractères qui ne font rien d’autre que s’imprimer.

Ce qui se produit quand on les tape tels quels varie d’un caractère à l’autre. Le plus dangereux, de loin, est % : il ne provoque aucune erreur et avale silencieusement la fin de la ligne. & donne ! Misplaced alignment tab character &. ; _ et ^ dans le texte donnent ! Missing $ inserted. ; } donne ! Too many }'s. ; et \ lit ce qui suit comme un nom de commande, d’où ! Undefined control sequence. Seul # a un message inhabituel : il commence par ! You can't use et se poursuit par macro parameter character #' in horizontal mode. ~ est le seul à ne déclencher ni erreur ni avertissement : il se compose discrètement en espace insécable.

CaractèreCode de catégorieRôleTapé tel quel
\0Début d’une commande! Undefined control sequence.
{1Ouvre un groupe ou un argumentNon fermée, elle provoque une erreur en fin de fichier
}2Ferme un groupe ou un argument! Too many }'s.
$3Ouvre et ferme le mode mathématiqueNon appariés, ils donnent ! Missing $ inserted.
&4Séparateur de colonnes des tableaux et alignements! Misplaced alignment tab character &.
#6Numéro d’argument dans une définition de macro (#1, #2, …)! You can't usein horizontal mode.
^7Exposant en mode mathématiqueDans le texte, il donne ! Missing $ inserted.
_8Indice en mode mathématiqueDans le texte, il donne ! Missing $ inserted.
~13Caractère actif ; espace insécableAucune erreur ; il devient discrètement une espace insécable
%14Commentaire ; la fin de la ligne est ignoréeAucune erreur ; la fin de la ligne disparaît en silence

Les imprimer littéralement : sept demandent une simple échappement

Sept des dix sont faciles : il suffit d’une contre-oblique devant — \#, \$, \%, \&, \_, \{, \}. Écrivez \$1.23 et vous obtenez $1.23. La contre-oblique signale : « le caractère suivant est lui-même, et non le début d’une commande ». La mécanique est simple elle aussi : dans le noyau, \%, \& et \# sont écrits comme des \chardef — une définition qui dit seulement « imprime le caractère de cette position ». Seuls \$, \{ et \} vérifient s’ils se trouvent en mode mathématique et s’adaptent, ce qui explique que la même écriture vaille aussi à l’intérieur d’une formule.

Vous tapezVous obtenezRemarque
\##Une seule contre-oblique devant
\$$Fonctionne aussi en mode mathématique
\%%Pour les pourcentages, comme 50\%
\&&Pour l’esperluette des noms d’entreprises et de titres
\__Dans l’encodage par défaut, il est tracé par un filet, non par un glyphe
\{{Fonctionne aussi en mode mathématique
\}}Fonctionne aussi en mode mathématique
\textasciitilde~\~{} fait la même chose ; un \~ seul est une commande d’accent
\textasciicircum^\^{} fait la même chose ; un \^ seul est une commande d’accent
\textbackslash\\\ est la commande de saut de ligne et n’imprime rien

Les trois récalcitrants : tilde, accent circonflexe et contre-oblique

Seuls ~, ^ et \ demandent plus qu’un échappement, et la raison est simple : la forme échappée signifie déjà autre chose. \~ et \^ sont des commandes d’accent qui posent un tilde ou un chapeau sur la lettre suivante — \~n donne ñ, \^o donne ô. Pour obtenir le signe seul, on donne à l’accent un argument vide, de sorte qu’il n’ait rien sur quoi se poser : \~{} et \^{}. De fait, les définitions par défaut du noyau pour \textasciitilde et \textasciicircum sont exactement celles-là. Les formes nommées rendent l’intention plus lisible : dans un manuscrit, préférez \textasciitilde{} et \textasciicircum{}.

Pour la contre-oblique elle-même, on emploie \textbackslash. N’utilisez pas \\ : ce ne sont pas deux contre-obliques mais la commande de saut de ligne, et elle n’imprime rien. Le plus curieux est que la police de texte par défaut ne contient aucune contre-oblique. Le noyau déclare que \textbackslash doit être prise dans l’encodage des symboles mathématiques, et de fait un PDF d’une page dont le seul contenu est \textbackslash incorpore CMSY10, la police des symboles mathématiques. Pour la même raison, le \_ par défaut n’est pas un caractère mais un filet fin tracé à la main : une page ne contenant que \_ n’incorpore aucune police. Ajoutez \usepackage[T1]{fontenc} et les deux deviennent de vrais glyphes de la police de texte. Au passage : <, > et | ne sont pas des caractères réservés et sortent pourtant en ¡ ¿ — dans l’encodage par défaut. fontenc corrige cela aussi.

latex
\usepackage[T1]{fontenc}   % real glyphs for \, _, < > |

100\% \& \$5 cost \#1

A Windows path: C:\textbackslash Users\textbackslash doc

Standalone marks: \textasciitilde{} and \textasciicircum{}

Poser des accents

Le TeX des débuts ne lisait que de l’ASCII 7 bits. Pour obtenir é, il fallait lui ordonner de poser un accent aigu sur un e, et ces ordres subsistent aujourd’hui. Le schéma est commande d’accent plus lettre : \'e donne é, \"o donne ö, \^e donne ê, \~n donne ñ, \c{c} donne ç, \v{s} donne š, \r{a} donne å. Un piège mérite d’être signalé : pour accentuer un i ou un j, le point gêne ; on emploie donc les versions sans point \i et \j et l’on écrit \'{\i}.

CommandeExempleNom
\'éAccent aigu
\`èAccent grave
\^êAccent circonflexe
\"öTréma
\~ñTilde
\=ōMacron
\.żPoint suscrit
\uğBrève
\všCaron (háček)
\HőDouble accent aigu
\cçCédille
\råRond en chef
\dPoint souscrit
\bBarre souscrite
\to͡oLigature suscrite sur deux lettres

Certaines lettres ne se construisent pas à partir d’un accent. L’eszett allemand \ss (ß), les nordiques \aa (å) et \o (ø), le polonais \l (ł) et les ligatures \ae (æ) et \oe (œ) sont des lettres à part entière et disposent de commandes propres. Les capitales s’obtiennent en mettant le nom en majuscules : \AA, \O, \L, \AE, \OE. Tout cela relève du LaTeX standard et ne demande aucun package supplémentaire.

Saisir directement en UTF-8

Dans le LaTeX actuel, café, Grüße et naïve se tapent tels quels. Depuis la version d’avril 2018 — LaTeX News 28 comporte la section « UTF-8: the new default input encoding » —, UTF-8 est l’encodage d’entrée par défaut du noyau, si bien que \usepackage[utf8]{inputenc} n’est plus nécessaire (il ne nuit pas, et les anciens documents compilent toujours). \usepackage[T1]{fontenc} reste toutefois utile : il bascule le côté sortie vers un encodage de fonte 8 bits, de sorte que les mots accentués se coupent correctement et que le texte copié depuis le PDF revient intact. Avec XeLaTeX et LuaLaTeX, c’est plus simple encore : une police OpenType choisie via fontspec, et l’entrée comme la sortie sont en Unicode dès le départ.

latex
% pdfLaTeX: UTF-8 input is the default; T1 fixes output and hyphenation
\usepackage[T1]{fontenc}

café, Gr\"u\ss e, na\"{\i}ve, \AA ngstr\"om, \oe uvre, a\~no

% XeLaTeX / LuaLaTeX: Unicode all the way through
% \usepackage{fontspec}
% \setmainfont{TeX Gyre Pagella}

Quand les caractères spéciaux abondent : \verb et \url

Échapper un fragment truffé de symboles caractère par caractère est fastidieux, et le risque d’en oublier un grimpe vite. C’est là qu’intervient le mécanisme verbatim. En ligne, on écrit \verb|...|, en clôturant le texte par n’importe quel caractère absent de son contenu (ici |) ; à l’intérieur de la clôture, tous les caractères réservés perdent leur sens spécial et le texte est composé en chasse fixe. Pour plusieurs lignes, on emploie l’environnement verbatim. Une restriction : \verb ne peut figurer dans un argument — \section{... \verb|x| ...} donne ! LaTeX Error: \verb illegal in argument. Pour les chaînes qui contiennent volontiers ~, #, % ou _ — les URL au premier chef —, la meilleure réponse est \url{...} du package url ou hyperref : il traite automatiquement les caractères réservés qu’elle renferme, la compose en chasse fixe et coupe les adresses longues à des endroits sensés.

latex
\usepackage{hyperref}   % provides \url as well

Use \verb|a_b^c & d%| to show specials literally.

\begin{verbatim}
foo_bar = 100% & #1   % every character printed as-is
\end{verbatim}

See \url{https://example.com/path?id=1#sec_2~ok}

Quand des données collées cassent un tableau

Dans un vrai manuscrit, les caractères spéciaux n’arrivent presque jamais parce qu’on les a tapés : ils arrivent collés — d’un fichier CSV, d’une page web, d’un courriel, d’un PDF. C’est dans les tableaux que cela fait le plus mal. Comme & sépare les colonnes, une seule esperluette nue dans un nom d’entreprise ou un titre d’article fausse le compte des colonnes et produit ! Misplaced alignment tab character &., ou avale silencieusement la seconde moitié de la rangée. La parade la plus rapide consiste à trier la matière entrante en trois catégories avant de la coller : du texte à lire comme de la prose, du code à montrer tel quel, des URL à traiter comme des liens. Le tri fait, la stratégie d’échappement se choisit d’elle-même.

latex
% before pasting into a table, search the pasted region for & % _ #
\begin{tabular}{ll}
  Smith \& Wesson & company name \\
  95\%            & reported rate \\
\end{tabular}

% do not escape URLs by hand; hand them to \url
\url{https://example.com/report?id=95#table_1}

En résumé, la décision se prend en trois temps. Un ou deux symboles au fil de la prose : les échapper comme l’indique le tableau. Un bloc de code ou une sortie de terminal : le confier à \verb ou à verbatim. Une URL : la laisser à \url{}. Ensuite, dès que les symptômes apparaissent — un tableau décalé d’une colonne, la seconde moitié d’une rangée envolée, un soudain ! Missing $ inserted. —, ne cherchez que dans la zone collée et classez chaque &, %, _ et # en « prose » ou « syntaxe LaTeX ». C’est là que se tient la cause, presque à coup sûr.