Cadres produits par l'outil typographique

1.Introduction

L'outil de composition de TeXmacs traduit un document représenté par un arbre en un cadre graphique, qui peut être affiché sur l'écran ou imprimé. Contrairement à LaTeX, le cadre graphique contient beaucoup plus d'informations qu'il n'est nécessaire pour un rendu graphique. En gros, ces informations peuvent être rangées dans les catégories suivantes :

Le cadre logique est utilisée par le composeur pour positionner le cadre par rapport aux autres. D'autres informations, telle l'inclinaison du cadre, sont aussi sauvegardées pour que le composeur puisse en faire usage. Le cadre physique contient la représentation graphique du cadre. Cette information sert à redessiner partiellement un cadre de manière efficiente.

Pour positionner le curseur ou pour faire une sélection, il faut avoir une correspondance entre les positions logiques dans l'arbre source et les positions physiques dans les cadres composés. En fait, les cadres et leurs sous-cadres sont organisés logiquement comme des arbres. Les cadres fournissent des routines de traduction entre les chemins dans l'arbre du cadre et l'arbre source, et pour trouver le chemin associé à un point graphique.

2.Correspondance entre un cadre et son source

2.1.Problèmes à résoudre

Pour implémenter la correspondance entre les chemins dans l'arbre source et l'arbre du cadre, il faut surmonter plusieurs types de difficultés en même temps :

  1. La correspondance peut ne pas être directe à cause des sauts de lignes, des notes en base de page et de l'expansion des macros.
  2. La correspondance doit être relativement efficiente du point de vue de l'espace et du temps.
  3. Certains cadres, tels les en-têtes et les pieds de page ou le résultat de certains expansions de macros, peuvent ne pas être «accessibles». Bien qu'on puisse trouver une position du curseur pour cliquer dessus, le contenu d'un tel cadre n'est pas directement éditable.
  4. La correspondance doit être relativement complète (voir section suivante).

La première difficulté nous oblige à stocker dans l'arbre d'édition un chemin pour tout cadre. Pour gagner de la place, ce chemin est stocké en ordre inverse de façon à ce que les sommets communs puissent être partagés. Ce partage des sommets communs est aussi nécessaire pour changer rapidement les emplacements du source quand on modifie l'arbre source, par exemple lorsqu'on insère un nouveau paragraphe.

Pour surmonter la troisième difficulté, le chemin inverse peut débuter par un nombre négatif qui indique que le cadre ne peut être édité directement (on dit alors que le cadre est une décoration). Dans ce cas, la fin du chemin inverse correspond à l'emplacement, dans l'arbre source, où le curseur est positionné lorsque l'on clique sur le cadre. Le nombre négatif a une influence sur la façon dont ceci est réalisé.

2.2.Trois sortes de chemins

Il faut gérer trois sortes de chemins :

Chemins d'arbres
Ces chemins correspondent aux chemins dans l'arbre source. En fait, le chemin amputé de son dernier élément pointer sur un sous-arbre de l'arbre source. Le dernier élément donne la position dans ce sous-arbre : si le sous-arbre est une feuille, c'est-à-dire une chaîne, c'est la position dans cette chaîne. Autrement, un 0 indique une position avant le sous-arbre, un 1 une position après le sous-arbre.
Chemins inverses
Ce sont les chemins construits en inversant les chemins d'arbres (avec une fin de chemin commune) ; ils peuvent avec une en-tête négative. Une en-tête négative indique que le chemin d'arbre n'est pas accessible, c'est-à-dire que le sous-arbre correspondant ne représente pas un contenu éditable. Si les valeurs négatives sont - 2, - 3 ou - 4, alors il faut mettre un 0 ou un 1 derrière le chemin d'arbre suivant la valeur et la position du curseur.
Chemins de cadres
Ces chemins correspondent aux chemins logiques dans l'arbre de cadre. Le chemin amputé de son dernier élément pointe vers un sous-cadre du cadre principal. Le dernier élément donne la position dans le sous-arbre : si le sous-cadre correspond à un cadre de texte, c'est la position dans ce texte. Sinon, un 0 indique une position avant le sous-cadre et un 1 une position après le sous-cadre. Dans le cas de cadres auxiliaires, un 2 ou un 3 peuvent aussi indiquer la position après un indice ou exposant à gauche, ou bien avant un indice ou exposant à droite.

2.3.Routines de conversion

Pour implémenter la conversion entre les trois sortes de chemins, chaque cadre possède un chemin inverse de référence ip dans l'arbre source. Les cadres composites possèdent en plus un chemin de référence gauche lip et droit rip, qui correspondent aux chemins accessibles juste à leur gauche ou juste à leur droite dans leurs sous-cadres (s'il existe de tels sous-cadres).

La routine :

    virtual path box_rep::find_tree_path (path bp)

transforme un chemin de cadre en un chemin d'arbre. Cette routine (qui n'utilise que ip) est rapide et possède une complexité en temps linéaire fonction de la longueur des chemins. La routine :

    virtual path box_rep::find_box_path (path p)

effectue la conversion inverse. Malheureusement, dans le pire des cas, il peut être nécessaire de rechercher le chemin d'arbre dans tous les sous-cadres. Néanmoins, dans le meilleur des cas, un algorithme dichotomique (qui utilise lip et rip) trouve la branche à parcourir dans un temps logarithmique. Cet algorithme possède aussi une complexité quadratique du temps fonction de la longueur des chemins, car il faut souvent inverser les chemins.

3.Curseur et sélection

Pour remplir son rôle d'«éditeur structuré», TeXmacs doit fournir une correspondance (relativement) complète entre les chemins d'arbres logiques et les positions physiques du curseur. Ceci conduit à des difficultés supplémentaires dans le cas de «changement d'environnement», tel un changement de police ou de couleur. En effet, quand on se trouve à la frontière d'un tel changement, on ne sait pas, a priori, de façon précise dans quel environnement on se trouve.

C'est pourquoi, dans TeXmacs, la position du curseur contient des coordonnées x et y, ainsi qu'une abscisse infinitésimale supplémentaire, appelée δ. Par suite, un changement d'environnement est représenté par un cadre de largeur infinitésimale. Bien que la position δ du curseur soit toujours 0 quand on utilise la souris pour effectuer une sélection, elle peut ne pas être nulle quand on se déplace à l'aide des flèches directionnelles. La routine en temps linéaire :

    virtual path box_rep::find_box_path (SI x, SI y, SI delta)

fonction de la longueur du chemin recherche le chemin du cadre qui correspond à la position du curseur. Inversement, la routine :

    virtual cursor box_rep::find_cursor (box bp)

mène à une représentation graphique du curseur pour un chemin de cadre donné. Le curseur est défini par ses coordonnées x, y et δ et un segment de ligne relatif à cette origine, défini par ses extrémités (x1,y1) et (x2,y2).

De même, la routine :

    virtual selection box_rep::find_selection (box lbp, box rbp)

calcule la sélection entre deux chemins de cadres donnés. Cette sélection comprend deux chemins d'arbre délimitant la sélection et une représentation graphique sous la forme d'une liste de rectangles.

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".