Règles de syntaxe

Tapez \LaTeX is great et vous obtenez « LaTeXis great ». Une espace a disparu, et pas une seule ligne d'erreur n'a été émise. Ce n'est pas un bogue : TeX a jeté cette espace délibérément. Toutes les règles de syntaxe de LaTeX — où s'arrête le nom d'une commande, comment les espaces et les retours à la ligne sont repliés, ce qu'un commentaire % efface réellement — découlent d'une seule chose : la façon dont TeX lit le fichier source, une ligne à la fois. Cette page suit ce processus de lecture et désamorce les trois mines sur lesquelles marche tout débutant — l'espace qui disparaît, l'espace qui apparaît et le changement de police qui ne s'arrête plus — par le mécanisme et non par le symptôme.

Où se termine une commande : mots de contrôle et symboles de contrôle

Le nom d'une commande se termine au premier caractère qui n'est pas une lettre. L'essentiel d'un fichier source est du texte courant composé tel quel, mais dès qu'apparaît une barre oblique inverse \ (elle peut s'afficher comme un signe yen ¥ dans certaines configurations japonaises), TeX change de mode de lecture et commence à lire un nom. Ce nom ne peut se former que de deux façons. Un mot de contrôle est \ suivi uniquement de lettres (A–Z, a–z) ; un symbole de contrôle est \ suivi d'un seul caractère non alphabétique. \section, \LaTeX et \newpage relèvent du premier cas, \$, \%, \& et \ (barre inverse-espace) du second.

La distinction n'est pas un jeu de mots : elle change le symptôme en cas d'erreur. Le nom d'un mot de contrôle continue de croître tant que des lettres suivent ; \LaTeXlogo n'est donc pas lu comme \LaTeX suivi de logo mais comme un seul nom, \LaTeXlogo, qui n'existe pas, et la compilation s'arrête sur ! Undefined control sequence. Pour faire suivre le logo de lettres, il faut couper le nom avec quelque chose qui n'est pas une lettre : une espace, un symbole ou {}. Un symbole de contrôle, lui, est fixé après un caractère et ne peut pas croître : \$5 se lit simplement comme un signe dollar suivi de 5. C'est précisément cette nature à un seul caractère qui rend \$ et \% sûrs lorsqu'un chiffre ou un symbole suit immédiatement.

latex
% A control word is letters only; its name stops at the first non-letter.
\LaTeX        % the logo
\LaTeXlogo    % ! Undefined control sequence. -- read as ONE name

% A control symbol is exactly one non-letter after the backslash.
\$ \% \& \_   % the literal characters $ % & _
\,            % a thin space

Pourquoi \LaTeX is imprime « LaTeXis »

Tout blanc situé immédiatement après un mot de contrôle est ignoré, quel que soit son nombre. Il est consommé comme signal de fin du nom et il n'en subsiste rien dans la sortie. Voilà pourquoi \LaTeX is great donne « LaTeXis great ». Ce que l'on oublie souvent, c'est que les espaces ne sont pas les seules victimes : les tabulations subissent le même sort, et le retour à la ligne aussi. Replier la source après \LaTeX et écrire is great à la ligne suivante ne change rien. L'endroit où « j'ai pourtant tapé une espace » compte le moins est précisément juste après une commande.

Il existe trois corrections classiques, et toutes donnent le même « LaTeX is great ». (1) Accolades vides, \LaTeX{} is : {} n'est pas une lettre, le nom s'arrête là et l'espace qui suit survit comme espace intermot ordinaire. (2) L'espace de contrôle, \LaTeX\ is : \ (barre inverse plus espace) est la commande signifiant « place ici une espace intermot ». (3) Encadrer la commande d'accolades, {\LaTeX} is. En pratique, (1) est le choix sûr : il se comporte de la même façon qu'une espace ou un symbole suive, et il ne casse pas lorsqu'on remanie la phrase plus tard. Comme cette espace évanouie frappe surtout dans les commandes que l'on définit soi-même, l'ensemble tools fournit le package xspace (de David Carlisle et d'autres). Placé en fin de définition, \xspace ajoute l'espace uniquement lorsque le caractère suivant n'est pas une ponctuation.

latex
\LaTeX is great        % -> LaTeXis great   (the space is eaten)

\LaTeX{} is great      % -> LaTeX is great
\LaTeX\ is great       % -> LaTeX is great
{\LaTeX} is great      % -> LaTeX is great

% In your own macros, let xspace decide:
\usepackage{xspace}
\newcommand{\myTeX}{\LaTeX\xspace}
\myTeX is great, and \myTeX, and \myTeX.  % space added, then not, then not

À l'inverse, un symbole de contrôle n'avale pas l'espace qui le suit : écrivez \$ 5 et une espace intermot subsiste entre le signe dollar et le 5. Cela révèle l'autre fonction de \ . LaTeX ajoute par défaut un peu d'espace après un point de fin de phrase, si bien qu'un point marquant simplement une abréviationProf. Smith, et al. (1993) — est étiré de la même façon. Écrire Prof.\ Smith et et al.\ (1993) indique à LaTeX « ce n'est pas une fin de phrase » et maintient un espacement régulier. Pour le besoin inverse — « ne pas couper la ligne ici » — on emploie le lien ~. Le ~ de Fig.~1, Chapter~12 ou Donald~E. Knuth a la largeur d'une espace intermot normale, mais aucune coupure de ligne ne peut s'y produire. Pour l'ajustement fin, il y a \, (espace fine) : \thinmuskip, soit 3 mu ou un sixième de cadratin, en mode mathématique, et 0,16667 em dans le texte — la même largeur dans les deux cas.

Les deux rôles des accolades : passer des arguments et clôturer une portée

Les accolades { } encadrent un argument obligatoire, les crochets [ ] un argument facultatif. L'ordre est en général \command[options]{required} : dans \section{Introduction}, {Introduction} est le texte de titre requis ; dans \documentclass[12pt]{article}, [12pt] est facultatif et {article} le nom de classe obligatoire. Il existe des endroits où un argument d'un seul caractère peut se passer d'accolades, mais les garder est plus sûr. Dès qu'on ajoute un mot par la suite, un argument sans accolades casse de l'une de deux façons : il avale le caractère voisin, ou se fait avaler par lui.

Les accolades ont un second rôle : elles ouvrent un groupe. Les commandes déclaratives qui changent la police ou la taille — \bfseries (gras), \itshape (italique), \large (plus grand) — ne prennent aucun argument et modifient simplement « tout ce qui suit ». C'est pourquoi, laissée sans surveillance, une telle commande met le reste du document en gras. Entourée d'accolades, son effet reste enclos dans ce seul groupe ; dès que l'accolade fermante est franchie, le réglage précédent revient. {\bfseries bold here} back to normal et la forme à argument \textbf{bold here} back to normal donnent le même résultat, mais la première délimite une zone, ce qui la rend précieuse lorsque plusieurs déclarations doivent agir ensemble.

latex
\section{Introduction}             % {...} = mandatory argument
\documentclass[12pt]{article}     % [...] = optional, {...} = mandatory

{\bfseries bold here} back to normal   % braces fence the declaration in
\textbf{bold here} back to normal      % the argument form does the same

{\large\bfseries several at once} back to normal

Cette idée de clôture est exactement ce sur quoi repose un environnement \begin{...}\end{...}. Un environnement ouvre un groupe à son début et le referme à sa fin, si bien qu'un changement de police fait à l'intérieur ne s'échappe jamais. Accolades et environnements sont le même outil à des échelles différentes ; la page des environnements prend le relais.

Comment espaces, retours à la ligne et lignes vides sont repliés

Toute suite de blancs consécutifs se réduit à une seule espace intermot, et un unique retour à la ligne dans la source devient lui aussi une espace intermot. Une espace entre deux mots ou dix, ou un repli sur la ligne suivante : la sortie est identique. Loin d'être une gêne, c'est la charnière de la conception : c'est parce que LaTeX décide seul des coupures de ligne que justification et césure sont possibles. Pour la source, cela signifie qu'on peut la replier à la largeur de son choix et garder des différences de version lisibles, à raison d'une phrase par ligne.

Comment change-t-on alors de paragraphe ? Avec une ligne vide. Laissez une ligne vide et c'est la rupture de paragraphe ; deux lignes vides ou plus à la suite ne comptent toujours que pour une. Une subtilité passe ici facilement inaperçue : une ligne ne contenant que des espaces compte aussi comme ligne vide. TeX supprime les blancs de fin de chaque ligne d'entrée avant de la lire, si bien qu'une ligne remplie d'espaces devient une ligne vide. Lorsqu'un paragraphe se coupe là où il ne devrait pas, ou refuse de se couper là où il le devrait, soupçonnez précisément cette ligne, que l'éditeur affiche exactement comme une ligne vide. Le traitement du paragraphe lui-même (\par, \parindent) relève de la page consacrée aux sauts de ligne et de paragraphe.

latex
These     extra   spaces    collapse into one,
and this newline becomes a single space too.

A blank line -- and only a blank line -- starts a new paragraph.


Two blank lines do exactly what one does.

% supprime la fin de la ligne — et le retour à la ligne avec elle

De % jusqu'à la fin de la ligne, tout est commentaire et totalement ignoré à la composition — et ce qui disparaît n'est pas seulement le reste de la ligne, mais le retour à la ligne lui-même. Laisser des notes et désactiver temporairement une commande sont les usages évidents, mais c'est ce retour avalé qui a créé l'autre grand emploi de %. Comme l'a montré la section précédente, un retour à la ligne dans la source devient une espace. Dès lors, si l'on veut simplement replier un mot ou une commande trop longue sur plusieurs lignes de source, le repli injecte une espace non désirée. Terminez la ligne par % et cette espace n'apparaît pas : la ligne suivante se raccorde à ras. Mieux encore, la ligne qui commence après un % voit aussi ses blancs de début ignorés, si bien que la ligne de continuation peut être indentée autant qu'on veut. La source reste lisible et la sortie reste un seul mot.

latex
Visible text % from here to the end of the line is dropped, newline included

Anti%
        disestablishmentarianism   % -> one word: the indent is dropped too

\newcommand{\courseTitle}{%
  Advanced Topics in \LaTeX%
}                                  % no stray space at either seam

The rate was 100\% last year.      % a literal percent sign is \%

Une mise en garde : % est lui-même un caractère spécial, donc pour imprimer un signe pour cent littéral, on écrit \%. Si on l'oublie, tout le reste de la ligne disparaît — sans erreur ni avertissement, une demi-phrase manque simplement dans le PDF, ce qui en fait l'un des symptômes les plus retors. Symbole de contrôle, \% n'avale pas l'espace qui le suit. La façon d'échapper les autres caractères spéciaux (#, $, &, _, {, }, ~, ^, \) est réunie sur la page des caractères spéciaux.

Pour désactiver plusieurs lignes d'un coup, il existe deux solutions autres que préfixer chacune par %. On encadre le bloc dans l'environnement comment fourni par le paquet verbatim (ou par le paquet comment), \begin{comment} … \end{comment}, ou bien dans \iffalse … \fi, qui utilise une condition TeX. Cette dernière ne demande aucun paquet et va vite, mais TeX lit tout de même le contenu : un \if non apparié dans le texte mis de côté cassera là. Pour remiser un brouillon entier, l'environnement comment est le choix le plus prévisible.

latex
\usepackage{verbatim}   % in the preamble

\begin{comment}
This whole block is ignored.
\end{comment}

\iffalse
Draft text, parked with no package needed.
\fi

Que vérifier quand une espace disparaît ou apparaît

Coupez d'abord le problème en deux : le symptôme s'accompagnait-il d'une erreur ? Une compilation qui s'arrête sur ! Undefined control sequence. désigne l'endroit où un nom de commande s'est terminé ; une sortie simplement fausse, sans erreur ni avertissement, désigne les espaces et les commentaires. Tel est l'ordre. Le second cas ne fournit aucun numéro de ligne utile : il ne reste qu'à restreindre par catégorie. En partant un peu avant la ligne signalée, vérifiez si un nom de commande a avalé les lettres suivantes et si {...} et [...] sont équilibrés ; vérifiez ensuite si un % de fin de ligne a supprimé une espace nécessaire, ou si un pourcentage littéral a été écrit sans son \%.

Ce qui est écritSymptômeCorrection
\LaTeXlogos'arrête sur ! Undefined control sequence.Terminer le nom par un non-lettre, comme \LaTeX{}logo
\LaTeX isles mots se collent en « LaTeXis »\LaTeX{} is ou \LaTeX\ is ; dans vos macros, \xspace
\bfseriestout ce qui suit reste en grasEnclore en {\bfseries ...} ou utiliser \textbf{...}
100%le reste de la ligne disparaît en silenceUn pourcentage littéral s'écrit 100\%
(a line of spaces)un paragraphe se coupe là où ce n'était pas vouluUne ligne d'espaces est une ligne vide ; afficher les caractères invisibles dans l'éditeur

Enfin, se fixer des habitudes qui ne cassent pas vaut mieux que mémoriser les règles. Couper un nom de commande par {} quand des lettres suivent. Enclore les unités de sens dans {...}. Replier les longues définitions avec un % en fin de ligne au lieu de tout tasser sur une seule. Et ne pas laisser s'accumuler dans le .tex d'anciens brouillons commentés : confiez les versions à comparer à un outil d'historique comme Git et ne gardez que ce que vous voulez composer, afin que les numéros de ligne des erreurs correspondent au vrai manuscrit et que le débogage aille plus vite. Ces quatre habitudes écartent la plupart des faux pas du début.