URL: https://linuxfr.org/news/tex-et-traitement-de-donnees-par-flot-e01-lire-du-tex Title: TeX et traitement de données par flot e01 : lire du TeX Authors: Lucas ZeroHeure et Benoît Sibaud Date: 2015年11月08日T14:15:55+01:00 License: CC By-SA Tags: parser, traitement_par_flot, toolxit, donald_knuth, tex et scala Score: 66 Depuis quelques temps je travaille de manière sporadique sur une bibliothèque pour manipuler des documents TeX en Scala nommée [ToolXiT](https://github.com/satabin/toolxit-ng). Cette bibliothèque est loin d'être finie et bouge encore beaucoup, mais elle me permet aussi de faire des essais. Ce faisant, j'ai pu faire face à quelques défis intéressants, qui méritent au moins une série de dépêches sur LinuxFr.org, que ce soit sur TeX lui même ou le traitement par flot de données. Je vais essayer de faire une série aussi intéressante que celle de [rewind](https://linuxfr.org/users/rewind/) sur la [création de jeu vidéo](https://linuxfr.org/tags/gamedev/public), nous verrons bien comment elle évoluera. Prêts ? Allons y ! ---- [ToolXiT](https://github.com/satabin/toolxit-ng) [TUG](https://tug.org/) [TeX primitives](https://www.tug.org/utilities/plain/cseq.html) [Journaux de l'auteur sur \BlueLaTeX, un autre projet](http://linuxfr.org/users/george/journaux/des-nouvelles-de-bluelatex-release-candidate-et-systemes-a-entites) ---- # TeX ## Qu'est-ce que c'est ? Le premier constat que j'ai pu faire en m'attaquant à TeX, c'est que globalement il existe une grosse incompréhension sur ce que c'est. Revenons donc sur les termes et définissons les précisément. Ne souhaitant pas me lancer à l'aveugle et dans l'à-peu-près, je me suis procuré une copie papier de l'excellent [TeXbook](http://www.amazon.com/The-TeXbook-Donald-E-Knuth/dp/0201134489) de Donald Knuth, auteur de TeX. Mon travail est entre autres le résultat de la lecture de ce livre de référence. TeX est donc un logiciel de composition de documents. Son but est de prendre une entrée textuelle composée de caractères et de sortir un document formaté. TeX est aussi un langage, utilisé pour composer lesdits documents. Même s'il est [Turing-complet](https://fr.wikipedia.org/wiki/Turing-complet), je m'avancerai ici à dire que TeX est en fait un [langage dédié](https://fr.wikipedia.org/wiki/Langage_d%C3%A9di%C3%A9) (_DSL_), et a été spécifiquement créé pour mettre en forme des documents. Le premier défi rencontré tient à la nature du langage. TeX est un langage à macros qui sont développées au fur et à mesure du traitement de l'entrée. Il n'est pas _parsable_ (analysable syntaxiquement) au sens classique des autres langages ; il est impossible de construire un arbre syntaxique d'une entrée. L'entrée peut modifier le comportement futur de TeX, notamment la manière dont le reste de l'entrée est analysé et interprété, ce qui rend impossible la construction d'un arbre syntaxique. Pour un exposé du problème et un traitement d'un sous problème, je conseille vivement la lecture de [cet article](http://www.mathematik.uni-marburg.de/~seba/publications/sle10.pdf)(pdf). Qu'entends-je ? Il est impossible d'analyser du TeX ? Ce n'est pas bien grave car ce langage permet simplement d'écrire une séquence de commandes à interpréter dans l'ordre pour produire un joli document. Une fois qu'une commande a été traitée, TeX continue avec le reste, jetant ce qui a déjà été pris en compte. Nous voyons donc déjà venir le côté de traitement par flot. Pour ce faire, TeX reconnait environ 300 commandes primitives de natures diverses : - les commandes liées aux macros et à leur développement (définition, conditions, ...) ; - les commandes représentant des variables utilisées pour la composition du document (tailles, polices, ...) ; - les commandes de composition de document ; - d'autres types de commandes encore pour gérer des interactions, les logs, etc. Outre leur description dans le livre de Knuth, vous pourrez trouver une excellente et complète référence en ligne de [toutes les primitives de TeX](https://www.tug.org/utilities/plain/cseq.html), agrémentée de plein d'exemples. Les commandes de composition sont des instructions à l'ordinateur afin de lui indiquer comment représenter le document. C'est une séquence, sans structure, un peu comme des instructions de dessin. Pour faire simple, TeX crée des boites, qui peuvent contenir d'autres boites, des caractères ou des lignes, et l'ensemble de ces boites compose des pages, des paragraphes, des lignes et des caractères. Beaucoup de calculs ont lieu, tous plus intéressants les uns que les autres afin que le résultat soit agréable et respecte certaines règles typographiques. Par exemple, l'[algorithme de calcul des césures](http://www.tug.org/docs/liang/) utilisé par TeX pour savoir quand couper un mot en fin de ligne pour que le résultat soit correct dans la langue du document pourrait faire l'objet d'un futur article dédié. Et ce n'est qu'un exemple parmi d'autres. À noter qu'il n'y a aucune notion de structure de document (titre, chapitre, section, ...) dans TeX. Le gros problème de TeX est qu'il est pour le moins rugueux à appréhender, et ne contient pas de notions de très haut niveau pour définir les éléments structurels d'un document. Fort heureusement, le langage de macros permet de définir des commandes de plus au niveau, qui seront rapidement ramenées aux primitives par TeX, mais qui permettent à l'utilisateur de manipuler des concepts de documents plus facilement. Dans le vocabulaire consacré, un ensemble de macros utilisé pour un document est appelé un _format_. Dans son livre, Knuth définit le format _plain TeX_ qu'il utilise lui même pour composer son livre. Entre autres, ce format définit des macros permettant de déclarer des théorèmes numérotés, de créer des sections ou encore de composer des documents avec des caractères accentués non présents sur le clavier. C'est mieux, mais encore compliqué et assez bas niveau. ## LaTeX ? ConTeXt ? TeX n'est réellement devenu populaire dans certains milieux que par d'autres formats, très (trop) complets, comme [LaTeX](https://www.latex-project.org/) ou [ConTeXt](http://wiki.contextgarden.net/Main_Page). Ces deux projets consistent en un énorme ensemble de macros TeX entassées les unes sur les autres avec des concepts plus haut niveau comme les tables de matière et de figures ou le placement automatique de figures. Ils ont aussi une structure modulaire permettant de charger des paquets adaptés à des usages précis (dessin, tableau, ...). Ces formats simplifient grandement l'usage de TeX, mais ont à mes yeux de gros problèmes : - ils sont composés d'un empilement démentiel de macros, développées lors du traitement du document rendant le diagnostic quelque peu ardu en cas d'erreur se produisant au fin fond d'un développement ; - ils donnent une fausse impression de langage de documents structurés alors que tout est toujours à plat. Les éditeurs qui prennent les commandes comme `\chapter` et autres `\section` comme des primitives sont très peu stables face au cas général d'une entrée TeX, et il est très facile de les faire se prendre les pieds dans le tapis et casser tout leur intérêt (outline, ...) avec quelques `\def` bien placés ; - ils confondent trop contenu et mise en forme sémantique (mise en exergue, en gras, ...) et mise en forme du document final (page format A4, format pdf, ...). Cependant ces outils restent dans le top de l'existant pour moi et surpassent n'importe quel traitement de texte WYSIWYG, tant en terme d'utilisabilité que de résultat (phrase subjective détectée). Vous remarquerez que dans cette section, à aucun moment je n'ai parlé de formules mathématiques. Il est en effet souvent admis que TeX et ses dérivés sont principalement utiles pour écrire des maths. Je dirais : non. Tout simplement, la composition de formules mathématiques consiste en un sous ensemble non trivial de la composition de document en général et TeX la prend en charge de manière native sans s'y restreindre. Ainsi, même sans avoir besoin de formater des symboles grecs ou des équations, TeX peut avoir des avantages, que ce soit pour mettre en forme des [hiéroglyphes](http://eple.hib.no/felles/EGypto.pdf) ou des [partitions de musique](http://icking-music-archive.org/software/musixtex/musixdoc.pdf) ; on peut même estimer qu'avoir ses documents (spécifications, lettres, factures, ...) sous format texte est plus fiable pour les stocker pendant des années que n'importe quel format de traitement de texte et utiliser TeX à ces fins. Tout est histoire de goût et de préférence bien sûr, et je m'éloigne du sujet initial. Tout ça pour dire : TeX n'est pas synonyme de maths. ## Périmètre de la bibliothèque Maintenant que nous savons de quoi nous parlons, je souhaite recentrer la dépêche sur ce qui a vocation à être pris en charge dans la bibliothèque que je développe. Le but est de savoir interpréter une entrée TeX composée de caractères et de macros et de sortir une suite de commandes primitives pouvant être ensuite interprétées pour mettre en forme le document. Le but premier est donc d'implémenter la définition et le développement des macros. Et ce problème n'est déjà pas forcément trivial. # Lire du TeX Avant de parler du traitement des macros, il est important de définir comment Knuth a envisagé la lecture d'une entrée par TeX. Tout le reste dépend fortement de ses choix. Dans son livre, il explique que l'entrée est avant tout une suite de caractères, qui sont ensuite transformés en _tokens_ qui peuvent correspondre à un caractère ou une séquence de contrôle de la forme `\name`. Ces tokens sont ensuite développés via le développement de macros, jusqu'à ce que des commandes primitives soient rencontrées. Quand de telles commandes apparaissent, elles sont interprétées. Nous voyons ici se découper un traitement de l'entrée par couches successives qui la transforment petit à petit pour mettre en forme le document. Ce qu'il est important de noter est que le développement des macros se fait au niveau des tokens, donc après une première couche d'analyse pour transformer les caractères. De plus, les macros et primitives pouvant modifier la manière de transformer les caractères en tokens, nous comprenons aussi que l'entrée doit être traitées au fur et à mesure et ne peut pas être lue entièrement avant d'être traitée. Dans son livre, Knuth utilise un vocabulaire biologique assez parlant pour décrire les différentes phases de traitement de TeX : - TeX lit les caractères avec ses _yeux_ et les transforme en tokens ; - les tokens passent ensuite par la _bouche_ de TeX qui les _mâche_ pour en faire des primitives ; - ces primitives sont ensuite passées au _système digestif_ qui les digère et un document formaté en sort. Le vocabulaire usuel voudrait que les yeux soient une sorte de _lexer_ et que la bouche soit le _parser_. # Le système de macros de TeX Donc TeX est un langage de macros. C'est bien mais il existe plusieurs [types de systèmes de macros](http://ojs.statsbiblioteket.dk/index.php/brics/article/viewFile/20151/17772) (section 2 pour un résumé) qui sont très différents les uns des autres. Sans faire durer le suspens plus longtemps, entrons directement en matière : TeX possède des macros de type lexical, c'est-à-dire qu'il manipule des éléments lexicaux (les tokens) et qu'une fois développée, une macro est remplacée par une suite de tokens ne formant pas forcément une structure syntaxique correcte. Il s'agit tout simplement de remplacer une suite de tokens formant un appel à une macro par une nouvelle suite de tokens, qui sont à leur tour développés si nécessaire, et ainsi de suite. Les macros agissent sur les tokens et non sur les caractères de l'entrée. Globalement il existe en première approximation deux types de tokens seulement : - les caractères comme `c` - les séquence de contrôle comme `\a`. Si vous souhaitez plus de détails sur les règles qui transforment les caractères en tokens, je vous renvoie aux chapitres 7 et 8 du _TeXbook_. Notamment vous pourrez y trouver la raison pour laquelle des espaces semblent disparaitre dans vos documents, comme avalés par TeX. Les macros peuvent prendre des paramètres (jusqu'à neuf dans l'implémentation de Knuth), avec ou sans délimiteur, elles peuvent être développées au moment de leur déclaration ou à leur utilisation, être globales ou locales, etc. Les règles qui régissent leur utilisation et leur définition sont assez nombreuses et font l'objet d'un chapitre entier dans le _TeXbook_ (chapitre 20). Je n'aborderai pas toutes les subtilités ici, mais traiterai d'un exemple simple. ```tex \def\double#1{#1#1} ``` Cette commande `\def` déclare une nouvelle macro `\double` qui prend un argument `#1` en entrée et le double. Ainsi, l'appel ```tex \double{to} ``` est développé en ```tex toto ``` Pour procéder au développement de macros dans une entrée TeX, il faut simplement être capable de lire autant de tokens que nécessaire pour avoir tous les paramètres de la macro, et de les remplacer par le texte de remplacement donné lors de la définition, et de lire la nouvelle entrée. TeX possède aussi des primitives qui entrent en jeu dans le développement de macros, comme les conditionnelles. D'autres primitives inhibent temporairement le développement de macros, comme `\noexpand`. Tout cela est composé de règles simples individuellement, mais dont la combinaison résulte en un système assez complexe. # Reprise sur erreur Un autre aspect que je souhaitais mentionner ici est la reprise sur erreur de TeX. En cas d'erreur lors du développement de macros ou du traitement d'une primitive, le système de reprise sur erreur de TeX se met en marche. Il permet soit de relire l'entrée pour corriger l'erreur, soit de sauter les tokens jusqu'à trouver une séquence de tokens correcte. Ce mécanisme est d'intérêt dans le traitement de données par flot et nous y reviendrons sûrement dans la suite. # Conclusion Nous avons donc vu ce qu'est TeX et comment il se lit à un haut niveau. Armés de ces concepts et définitions, dans les prochains épisodes, nous aborderons le design de la bibliothèque ToolXiT, le traitement de données par flot en général et dans notre cas ainsi que les solutions mises en place pour que tout se passe bien. ToolXiT est en développement constant, cette série de dépêche devrait me permettre de le faire évoluer en même temps, et j'espère qu'il en sortira quelque chose de bon. N'hésitez pas à faire des retours sur ces articles ou sur l'implémentation, ils sont les bienvenus.

AltStyle によって変換されたページ (->オリジナル) /