Un intérêt évident de la reconnaissance de la définition de commande (et d’environnement) est la possibilité de traduire les fichiers source LATEX qui en contiennent. Un autre intérêt, et non des moindres, réside dans la possibilité pour l’utilisateur de paramétrer les traductions ou d’étendre la fonctionnalité d’HEVEA.
HEVEA reconnaît finalement assez peu de commandes de façon directe, la majorité des commandes de base de LATEX sont définies dans un fichier de configuration hevea.sty qui est chargé avant de commencer la traduction. Les appels de ces commandes seront ensuite traités par le mécanisme général de l’appel de commande. Par exemple, voici la définition pour HEVEA de quelques commandes et environnements disponibles par défaut en LATEX :
%% Special caracters \newcommand{\%}{\@print{%}} \newcommand{\$}{\@print{$}} \newcommand{\#}{\@print{#}} .... %% Some environnments \newenvironment{center}{\@open{DIV}{ALIGN=center}}{\@close{DIV}} \newenvironment{quote}{\@open{BLOCKQUOTE}{}}{\@close{BLOCKQUOTE}} ...
HEVEA pouvant traiter les boites, les compteurs LATEX et les macros
conditionnelles de TEX, on dispose de fait d’un petit langage de
programmation suffisant pour écrire en LATEX des définitions
relativements complexes. Voici par exemple
la définition de l’environnement figure
extraite de
hevea.sty.
%% Box for caption \newsavebox{\@caption} \newcommand{\caption}[1]{\sbox{\@caption}{#1}} %% Figure \newenvironment{figure}[1][]{% \caption{}\refstepcounter{figure}% \@open{BLOCKQUOTE}{}\@print{<HR>}% }{% \par\begin{center}% Figure \thefigure\iffrench~\fi: \usebox{\@caption}% \end{center}% \@print{<HR>}\@close{BLOCKQUOTE}}
La définition en LATEX de la majorité des constructions reconnues
permet de simplifier l’analyseur principal.
En outre, et c’est peut-être le plus important, l’utilisateur peut
redéfiner ces constructions.
Supposons par exemple que l’on souhaite mettre en italiques toutes les
citations d’un texte. Il suffira alors de redéfinir l’environnemnt
quote
:
\renewenvironment{quote} {\@open{BLOCKQUOTE}{}\itshape} {\close{BLOCKQUOTE}
Cette possibilité de changer les définitions par défaut d’HEVEA
s’applique à l’ensemble des constructions qui ne sont pas reconnues
directement par l’analyseur principal.
Un cas particulier intéressant est celui des constructions
non-reconnues par HEVEA.
Par exemple, le symbole “\mapsto
”
(“↦”) n’est pas reconnu car il n’existe pas dans la police
symbole utilisable par les browsers.
Si l’utilisateur fait le choix de rendre ce symbole
par une flèche rouge, il écrira :
\newcommand{\mapsto}{{\red\rightarrow}}
(La commande “\red
” est définie comme “\@color{red}
” dans
le fichier de configuration hevea.sty.)
Nous sommes maintenant en mesure de comprendre le mécanisme complet des
changements de style et de leur paramétrage par l’utilisateur.
Les appels au gestionnaire de sortie sont réalisés
par les commandes internes à un argument
\@style
, \@fontcolor
et \@fontsize
,
dont la reconnaissance provoque un appel à Html.open_mod
.
Par exemple, “\@style{I}
” entraîne un appel
“open_mod (Style "I")
”,
“\@fontcolor{blue}
” un appel “open_mod (Color "blue")
”,
etc.
Reprenons l’exemple des changements de forme (cf. la table 1). Les déclarations en vieux style LATEX sont réalisée par des appels à ces commandes internes :
italique | \newcommand{\it}{\@style{I}} |
penchée | \newcommand{\sf}{\@style{I}\@color{maroon}} |
petite capitales | \newcommand{\sc}{\@color{blue}}
|
Les déclarations LATEX2e doivent annuler tous les autres changements de forme avant de procéder à leur changement. En effet, les formes de polices sont mutuellement exclusives. On aura donc:
italique | \newcommand{\itshape}{\@anti{\sc\sf}\it} |
penchée | \newcommand{\sfshape}{\@anti{\it\sc}\sf} |
petite capitales | \newcommand{\scshape}{\@anti{\it\sf}\sc} |
droite | \newcommand{\upshape}{\@anti{\sc\sf\it}} |
Où la commande interne \@anti
annule les changements de style
données en argument.
Lorsqu’il a reconnu la commande interne \@anti
et lu son
argument dans une chaîne “arg
”,
l’analyseur principal procède en deux étapes :
arg
”, mais le gestionnaire de sortie est au
préalable modifié pour rendre la liste des styles actifs
à la fin de l’analyse au lieu de générer une sortie.
Ainsi, dans le cas de la déclaration “\upshape
”, la liste
“[Color "blue" ; Style "I" ;
…]
” sera retournée.
Html.erase_mods
avec en argument la liste des
styles rendus à l’étape précédente.
Un utilisateur qui souhaiterait modifier les déclarations de changement de forme pour par exemple rendre la forme penchée en gras se contentera donc d’écrire :
\renewcommand{\sf}{\@style{B}}
ou même, s’il ne craint pas une redéfinition de “\bf
” :
\renewcommand{\sf}{\bf}
Ainsi la déclaration “\sfshape
” finira par ouvrir un élément de
niveau texte “B
” et un appel à toute autre déclaration de
changement de
forme à l’intérieur de l’élément “B
” le fermera.