Quelques principes de TeX et de LaTeX

Dans ce chapitre, nous allons nous attarder un peu sur le fonctionnement de TeX et sur quelques principes qui nous seront utiles pour la suite.

Les tokens

Ici, nous allons voir comment TeX comprend en gros un fichier qu’on lui demande de compiler. En fait, un fichier en entrée est transformé en séquence de caractères et cette séquence de caractères est transformée en tokens, chaque token étant un caractère ou une séquence de contrôle (qui commence par \).

Les séquences de contrôles sont alors transformées en primitives (qui sont aussi des tokens). Les opérations correspondant à ces primitives sont alors effectuées ce qui nous permet d’obtenir une liste de pages qui est transformée dans le format demandé.

Bien sûr, ce que nous venons de décrire ne correspond que grossièrement au fonctionnement de TeX, mais cette description légère nous suffit.

Lorsque le fichier en entrée est lu, TeX a besoin de savoir à quoi chaque caractère correspond (pour savoir s’il s’agit d’une séquence de contrôle ou pas, etc.). Le code de catégorie (ou catcode) d’un caractère détermine le rôle de ce caractère. TeX attribue un code à chaque caractère qu’il lit. Il y a un code pour les lettres, un autre pour les espaces, etc. Cela permet par exemple de distinguer les caractères spéciaux.

Nous pouvons alors comprendre grossièrement de quelle manière TeX fonctionne. Voici comment le livre « TeX pour l’impatient » le présente en utilisant une métaphore très imagée.

Vous pouvez imaginer TeX comme une sorte d’organisation avec des « yeux », une « bouche », un « œsophage », un « estomac » et un « intestin ». Chaque partie de l’organisation transforme son entrée d’une certaine façon et passe l’entrée transformée à la prochaine étape. Les yeux transforment un fichier d’entrée en séquence de caractères. La bouche transforme la séquence de caractères en séquence de tokens, où chaque token est un caractère simple ou une séquence de contrôle. L’œsophage développe les tokens séquence de commandes primitives, qui sont également des tokens. L’estomac effectue les opérations indiquées par les commandes primitives, produisant une séquence de pages. Finalement, l’intestin transforme chaque page dans la forme requise pour le fichier PDF et l’y envoie.

La vraie composition est réalisée dans l’estomac. Les commandes demandent à TeX de composer tel caractère dans telle police, d’insérer de l’espace entre les mots, de finir un paragraphe et ainsi de suite. En commençant par des caractères composés individuellement et d’autres éléments typographiques simples, TeX construit une page comme un ensemble de boîtes de boîtes de boîtes. Chaque caractère composé occupe une boîte, et l’ensemble fait une page entière. Une boîte peut contenir des boîtes plus petites mais aussi des ressorts et autres diverses choses. Les ressorts produisent de l’espace entre les cases les plus petites. Une propriété importante des ressorts est qu’ils peuvent s’étendre et se rétrécir ; ainsi TeX peut rendre une boîte plus grande ou plus petite en étirant ou en rétrécissant les ressorts.

En général, une ligne est une boîte contenant une suite de boîtes de caractères, et une page est une boîte contenant une suite de boîtes de lignes. Il y a des ressorts entre les mots d’une ligne et entre les lignes d’une page. TeX étire ou rétrécit les ressorts sur chaque ligne afin de justifier une marge droite sur la page et les ressorts de chaque page afin de faire des marges inférieures des différentes pages égales. D’autres genres d’éléments typographiques peuvent également apparaître dans une ligne ou sur une page, mais nous ne les traiterons pas ici.

En tant que processus d’assemblage de pages, TeX à besoin de couper des paragraphes en lignes et des lignes en pages. En effet, l’estomac voit d’abord un paragraphe comme une longue ligne. Il insère des coupures de ligne afin de transformer le paragraphe en séquence de lignes de la bonne longueur, exécutant une analyse plutôt raffinée afin de choisir l’ensemble de coupures qui semble la meilleure pour le paragraphe. L’estomac suit un processus semblable mais plus simple afin de transformer une séquence de lignes en page. Essentiellement l’estomac accumule des lignes jusqu’à ce que plus aucune ligne ne puisse rentrer dans la page. Il choisit alors un endroit simple pour couper la page, en mettant les lignes avant la coupure sur la page courante et en sauvant les lignes après la coupure pour la page suivante.

TeX pour l’impatient par Paul W. Abrahams, Kathryn A. Hargreaves et Karl Berry, traduction par Marc Chaudemanche sous licence GFDL.

Pour plus d’informations à ce sujet, nous pouvons consulter un livre sur Tex. La référence, en anglais, est « The TeXbook » de Donald Knuth, mais nous pouvons également regarder « Apprendre à programmer en TeX » de Christian Tellechea ou « Tex pour l’impatient » en français.

Les groupes

Profitons de cette partie pour parler de quelques principes de TeX. Nous allons parler des groupes. Un groupe est une zone délimitée par des tokens spéciaux où les modifications, les assignations et les définitions sont locales (sauf si l’on indique qu’elles sont globales). Pour mieux comprendre comment ils agissent, considérons la commande \em qui permet de passer en « mode emphase ».

\begin{document}
   On est dans le document. \em On a utilisé la commande pour mettre cette phrase en emphase.
   
   On est dans un nouveau paragraphe.
\end{document}  

On remarque que tout ce qui suit \em est mis en emphase. Ça peut être un peu embêtant et pour limiter l’effet de la commande \em à une partie du document, nous allons la placer dans un groupe. La modification (le passage à l’emphase) sera alors locale et ne se fera que dans le groupe. Essayons alors le code qui suit.

\begin{document}
   On est dans le document. {\em On a utilisé la commande pour mettre cette phrase en emphase.}
   
   On est dans un nouveau paragraphe.
\end{document}

Ici, nous avons placé la phrase dans un groupe simple en l’entourant d’accolades. Les accolades sont donc les tokens pour les groupes simples. Nous pouvons aussi utiliser les tokens \bgroup et \egroup qui sont respectivement équivalentes à { et } à quelques détails près.

D’un autre côté, nous avons les groupes semi-simples, délimités par les tokens \begingroup et \endgroup. Nous ne verrons pas la différence entre les deux, mais il faut savoir que nous ne pouvons pas fermer un groupe semi-simple avec le token d’un groupe simple ni fermer un groupe simple avec le token d’un groupe semi-simple. Ainsi le code qui suit ne compile pas.

On ouvre un groupe simple {\begingroup et un groupe semi-simple} dans ce document. \endgroup

Ce code provoquera l’erreur « Extra }, or forgotten \endgroup ».

La commande \em est une commande dite « à bascule » (on parle également de déclaration), car son effet s’applique dans tout le document à partir de son utilisation (en fait, jusqu’à ce qu’on utilise une commande qui permet de supprimer son effet), le groupe permettant de limiter son effet à une zone. Ici, nous avons utilisé la commande \em à titre d’exemple. Cependant, son usage n’est pas recommandé et nous verrons dans le chapitre suivant par quoi la remplacer.

Les environnements

Définition d’un environnement

Pour continuer ce chapitre, parlons un peu des environnements.

Pour commencer, qu’est-ce qu’un environnement ?

Un environnement est un groupe semi-simple. Dans ce groupe, une macro est exécutée au début du groupe et une autre macro est exécutée à sa fin. Puisque la localité existe dans les groupes, les environnements permettent de délimiter une partie du document dans laquelle d’autres règles (de mise en page par exemple) s’appliquent. Un environnement s’ouvre avec la commande \begin{nom} et se ferme avec la commande \end{nom}.

À chaque \begin doit correspondre un \end, ou nous obtiendrons une erreur. Il ne faut donc pas oublier de fermer chaque environnement que l’on ouvre. De plus, nous ne pouvons pas faire deux environnements se chevaucher. Ils peuvent être imbriqués l’un dans l’autre, mais ne peuvent pas se chevaucher.

Tout comme les commandes normales, les environnements peuvent avoir des options et des arguments. En fait, certains environnements ont même des variantes étoilées. Il ne faut donc pas nous étonner si un jour nous voyons ceci.

\begin{environnement*}[options]

\end{environnement*}

Dans la suite de ce chapitre, nous verrons plusieurs environnements qui permettent de donner une sémantique à notre texte.

Que font vraiment les commandes \begin et \end ?

Sans rentrer dans les détails, nous pouvons voir ce que font les commandes \begin et \end. En gros, la commande \begin{nom} fait ceci :

  • elle vérifie que la commande \nom existe (si ce n’est pas le cas, on obtient une erreur) ;
  • elle garde en mémoire nom ;
  • elle ouvre un groupe semi-simple ;
  • elle exécute la commande \nom.

La commande \end{nom} fait cela :

  • elle exécute la commande \endnom si elle existe et ne fait rien sinon ;
  • elle vérifie que le nom correspond au dernier nom gardé en mémoire par \begin et si ce n’est pas le cas, on obtient une erreur (c’est pour cela qu’on ne peut pas faire deux environnements se chevaucher) ;
  • elle ferme le groupe.

En gros, la commande \begin place juste une commande dans un groupe semi-simple.

\begin{nom}
   Dans un environnement.
\end{nom}

Ce code n’est que la manière en LaTeX d’écrire le code TeX qui suit.

\begingroup \nom
   Dans un environnement.
\endnom \endgroup

Notons alors que nous pouvons utiliser n’importe quel nom de commande avec \begin. Par exemple, pour mettre une partie du texte en emphase, nous pouvons utiliser ce code.

\begin{em}
   Tout ce qui est là est en dans un groupe semi-simple dans lequel on a utilisé la commande em.
\end{em}

Ce chapitre était plutôt court, et pourtant nous y avons vu les environnements qui sont une notion importante en LaTeX. Notons bien qu’une compréhension fine des tokens et des catcodes n’est pas essentielle pour la suite.