Cadres produits par l'outil typographique |
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.
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 :
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é.
Il faut gérer trois sortes de chemins :
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.
Pour remplir son rôle d'«éditeur
structuré
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.