Architecture générale de TeXmacs

1.Introduction

Le programme TeXmacs a été écrit en C++. Vous devez utiliser g++ et l'utilitaire makefile pour compiler TeXmacs. À l'heure actuelle, le source (situé dans le répertoire src) de TeXmacs est ventilé en plusieurs parties dans différents répertoires :

Toutes ces parties utilisent les structures de données définies dans Basic. La boîte à outils graphiques dépend de Resource en ce qui concerne les polices TeX. Le langage d'extension est indépendant de Resource et de Window. La partie typographique s'appuie sur toutes les autres parties, sauf Prg. L'éditeur et le serveur TeXmacs utilisent toutes les autres parties.

Les données de TeXmacs sont contenues dans le répertoire edit qui correspond à la distribution TeXmacs sans code source. En gros, on a les types de données suivantes :

Le répertoire misc contient diverses données, telle l'icône d'édition (misc/pixmaps/edit.xpm).

2.Représentation interne des textes

TeXmacs représente tous les textes par des arbres (pour un texte donnée, l'arbre correspondant est appelé arbre d'édition). Les noeuds d'un tel arbre sont étiquetés par des opérateurs standards dont la liste figure dans les fichiers Basic/Data/tree.hpp et Basic/Data/tree.cpp. Les étiquettes des feuilles des arbres sont des chaînes, qui sont visibles (le texte réel) ou invisibles (telles les longueurs ou les définitions de macros).

Le sens du texte et la manière dont il est typographié dépendent essentiellement de l'environnement actif. L'environnement consiste principalement en une table de hachage de type rel_hashmap<string,tree>, c'est-à-dire une table de correspondance entre les variables d'environnement et leur valeur dans l'arbre. Le langage actif et la police courante sont des exemples de variables d'environnement ; de nouvelles variables peuvent être définies par l'utilisateur.

2.1.Texte

Dans TeXmacs, toutes les chaînes de texte sont constituées de suites de symboles universels ou spéciaux. Un symbole spécial est un caractère, différent de '\0', '<' ou '>'. Son sens peut varier en fonction de la police avec laquelle il est utilisé. Un symbole universel est une chaîne commençant par '<', suivi d'une suite arbitraire de caractères différent de '\0', '<' ou '>', et se terminant par '>'. Le sens des caractères universels ne dépend pas de la police avec laquelle ils sont utilisés, mais des polices différentes peuvent les rendre de façon différente.

2.2.langage

Le langage d'un texte est capable de fournir une analyse sémantique détaillée d'une phrase du texte. Il peut, au minimum, découper la phrase en mots (qui sont de plus petites phrases) et donner à l'outil typographique des informations sur les espaces désirées entre les mots et sur les césures à appliquer. Plus tard, il se peut qu'on ajoute d'autres sémantiques aux langages. Par exemple, on pourrait implémenter des correcteurs orthographiques pour les langages naturels et des analyseurs syntaxiques pour les formules mathématiques et les langages de programmation.

3.Composition des textes

En gros, l'outil typographique de TeXmacs prend un arbre en entrée et renvoie un cadre en accédant et en modifiant l'environnement typographique. La classe box est multifonctionnelle. Sa méthode principale est utilisée pour afficher le cadre sur un périphérique PostScript (soit l'écran, soit une imprimante). Mais elle contient aussi de nombreuses données de composition, tels les cadres logiques et les cadres d'encre, la position des scripts, etc...

Les cadres servent aussi à passer d'un curseur physique (position sur l'écran) à un curseur logique (chemin dans l'arbre d'édition). En fait, les cadres sont, eux aussi, organisés sous forme d'arbre, ce qui facilite la conversion. Néanmoins, les routines de conversion peuvent être très complexes du fait de l'expansion des macros et des sauts de ligne et de page. Notez également qu'en plus d'une position horizontale et verticale le curseur physique possède aussi une position horizontale infinitésimale. En gros, cette coordonnée infinitésimale est utilisée dans certains cadres (par exemple pour les changements de couleur) pour ajouter une largeur infinitésimale.

4.Modification du texte

Vous trouverez dans le répertoire Edit/Modify différentes routines de modification de l'arbre d'édition. Les modifications se déroulent en plusieurs étapes :

  1. Un événement en entrée déclenche une action, comme par exemple make_fraction, qui tente de modifier l'arbre d'édition.
  2. Toutes les modifications que make_fraction ou ses sous-routines appliquent à l'arbre d'édition sont, en fait, décomposées en sept routines de modification élémentaires : assign, insert, remove, split, join, ins_unary et rem_unary.
  3. Avant d'exécuter la modification demandée, la routine de modification élémentaire envoie à toutes les vues du texte une notification concernant la modification.
  4. Lors de la notification, chaque vue met à jour plusieurs éléments, comme la position du curseur. Une notification est aussi envoyée à l'outil de composition du texte, car il maintient une liste des paragraphes déjà composés.
  5. Lorsque toutes les vues ont reçu notification de la modification, elle est alors réellement exécutée.
  6. Chaque action utilisateur, tels la frappe sur une touche ou un clic de souris, est responsable de l'insertion de points d'annulation entre les suites de modifications élémentaires. Lorsqu'une modification est annulée, l'édition revient au point d'annulation précédent.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".