Lisez-moi S.V.P. 

5 La combinaison des balisages de présentation et de contenu

Table des matières : Le langage de balisage mathématique (MathML) version 2.0
Chapitre précédent : 4 Le balisage de contenu
Chapitre suivant : 6 Les caractères, les entités et les fontes

On peut combiner le balisage de présentation et le balisage de contenu de deux façons. La première consiste à éparpiller les éléments de contenu et de présentation dans ce qui est essentiellement un seul arbre. On l'appelle le balisage mélangé. La seconde consiste à fournir en même temps une présentation explicite et un contenu explicite dans une paire d'arbres. On l'appelle le balisage parallèle. Ce chapitre décrit les deux balisages mélangé et parallèle et comment les utiliser en conjonction avec des feuilles de style et d'autres outils.

5.1 La justification de deux types différents de balisage

Les chapitres 3 et 4 décrivent deux types de balisage pour le codage des mathématiques dans les documents.

Le balisage de présentation saisit la structure de la notation. Il code la structure de notation d'une expression de façon suffisamment abstraite pour permettre un rendu sur des médias divers. Ainsi, on peut rendre le même balisage de présentation avec relativement de facilité à l'écran, dans des fenêtres larges ou bien étroites, en code ASCII ou en image, à l'impression ou on peut l'énoncer verbalement avec des nuances. Ce balisage y parvient en fournissant des informations, tels que le regroupement structuré des parties d'expressions, la classification des symboles, etc.

Le balisage de présentation n'intervient pas directement dans la structure ou la signification mathématiques d'une expression. Dans beaucoup de situations, la structure de notation et la structure mathématique sont proches, de sorte qu'une application de traitement sophistiquée est capable d'inférer par des moyens heuristiques la signification mathématique d'après la structure de notation, pourvu qu'un contexte suffisant soit établi. Toutefois, en pratique, le lecteur devra souvent inférer la signification mathématique d'après la notation mathématique.

L'emploi des seules balises de présentation peut limiter la possibilité de réutiliser les objets MathML dans un autre contexte, notamment dans une évaluation par des applications externes.

Le balisage de contenu saisit la structure mathématique. Il code la structure mathématique avec assez de régularité pour permettre l'assignation d'une signification mathématique à une expression par les programmes d'application. Bien que le détail de la correspondance entre la structure de l'expression mathématique et la signification mathématique puisse être extrêmement complexe, il existe en fait un large consensus à propos de la signification conventionnelle de beaucoup de constructions mathématiques de base. Par conséquent, la majeure partie de la signification d'une expression de contenu est aisément accessible à une application de traitement, indépendamment du lieu et de la façon dont elle est présentée au lecteur. Dans beaucoup de cas, on pourrait effectuer un copier-coller du balisage de contenu depuis un navigateur Web vers un logiciel mathématique en toute confiance de la prise en compte des valeurs significatives dans les calculs.

Puisque le balisage de contenu n'intervient pas directement sur l'affichage d'une expression, le moteur de rendu doit inférer comment l'expression devrait être présentée au lecteur. Bien qu'un moteur de rendu et un mécanisme de feuilles de style suffisamment sophistiqués permettraient en principes à l'utilisateur de lire des documents mathématiques, en utilisant des préférences de notation personnalisées, le rendu des expressions de contenu avec des nuances de notation peut dans la pratique toujours demander une certaine forme d'intervention.

L'emploi des seules balises de contenu peut limiter la possibilité pour l'auteur de contrôler le rendu précis d'une expression.

Les balisages de contenu et de présentation sont tous deux nécessaires pour réaliser la capacité d'expression complète attendue d'un langage de balisage des mathématiques. On utilise souvent la même notation mathématique pour représenter plusieurs concepts complètement différents. Par exemple, la notation xi peut vouloir dire (en algèbre polynomiale) la ième puissance de la variable x, ou (en calcul tensoriel) le ième composant d'un vecteur x. Par ailleurs, le même concept mathématique peut s'afficher dans une notation parmi d'autres. Par exemple, le factoriel d'un nombre peut s'exprimer par un point d'interrogation, une fonction gamma ou un symbole Pochhammer.

La même notation peut donc représenter plusieurs idées mathématiques et, inversement, la même idée mathématique peut avoir plusieurs notations. Afin que les auteurs puissent contrôler précisément la notation et, dans le même temps, coder des significations qui soient lisibles par une machine, les balisages de contenu et de présentation sont tous deux nécessaires.

En résumé, s'il importe de contrôler exactement le rendu d'une expression, alors le balisage de présentation sera généralement plus satisfaisant. S'il importe d'interpréter la signification d'une expression avec certitude et de manière automatique, alors le balisage de contenu conviendra généralement mieux.

5.2 Le balisage mélangé

MathML propose aux auteurs des éléments pour le balisage de contenu et le balisage de présentation. L'utilisation de l'un ou l'autre, ou d'une combinaison des deux, par l'auteur dépend des aspects du rendu et de l'interprétation à contrôler et de la réutilisation à favoriser.

5.2.1 Les raisons pour mélanger le balisage

Dans beaucoup de situations courantes, un auteur (ou un outil d'édition) peut choisir de générer un balisage exclusivement de présentation ou bien de contenu. Par exemple, un programme de traduction de documents d'archives générera très vraisemblablement un balisage de présentation pur. De façon similaire, un progiciel éducatif générera seulement un balisage de contenu pour une évaluation dans un système de calcul algébrique. Toutefois, dans beaucoup d'autres cas, les deux balisages de présentation et de contenu se mélangeront avantageusement au sein d'une seule expression.

Si l'auteur se préoccupe d'abord de la présentation, le parsemage de quelques balises de contenu produira souvent des résultats plus accessibles et réutilisables. Par exemple, un auteur traitant d'algèbre linéaire pourrait écrire :

<mrow>
  <apply>
    <power/>
    <ci>x</ci>
    <cn>2</cn>
  </apply>
  <mo>+</mo>
  <msup>
    <mi>v</mi>
    <mn>2</mn>
  </msup>
</mrow>

v est un vecteur et l'exposant indique un composant de vecteur, et où x est une variable réelle. Dans un contexte d'algèbre linéaire, un lecteur avec une déficience visuelle aura peut-être paramétré son programme de synthèse vocale pour rendre les exposants comme des composants de vecteur. En codant explicitement une puissance, le balisage de contenu induira un rendu sonore nettement meilleur que celui qui aurait été vraisemblablement produit par défaut.

Si l'auteur se préoccupe d'abord du contenu, deux raisons peuvent justifier d'intercaler du balisage de présentation. Premièrement, l'utilisation d'un balisage de présentation permet de modifier ou d'affiner le rendu d'une expression. Par exemple, on pourrait écrire :

<apply>
  <in/>
  <ci><mi mathvariant="bold">v</mi></ci>
  <ci>S</ci>
</apply>

Auquel cas, l'utilisation du balisage de présentation incorporé permet à l'auteur d'indiquer que v est à rendre en caractère gras. De la même façon, on souhaite parfois une notation complètement différente pour une expression de contenu. Par exemple, il s'agit ici d'exprimer des factorielles n = n!/(n-1)! en employant une notation de factorielle croissante :

<apply>
  <equivalent/>
  <ci>n</ci>
  <apply>
     <divide/>
     <semantics>
        <apply>
           <factorial/>
           <ci>n</ci>
        </apply>
        <annotation-xml encoding="MathML-Presentation">
           <msup>
              <mn>1</mn>
              <mover accent="true">
                 <mi>n</mi>
                 <mo>&OverBar;</mo>
              </mover>
           </msup>
        </annotation-xml>
     </semantics>
     <semantics>
        <apply>
           <factorial/>
           <apply><minus/><ci>n</ci><cn>1</cn></apply>
        </apply>
        <annotation-xml encoding="MathML-Presentation">
           <msup>
              <mn>1</mn>
              <mover accent="true">
                 <mrow><mi>n</mi><mo>-</mo><mn>1</mn></mrow>
                 <mo>&OverBar;</mo>
              </mover>
           </msup>
        </annotation-xml>
     </semantics>
   </apply>
</apply>

Cette expression de contenu serait rendue selon la notation donnée par : \frac{1^{\bar{n}}}{1^{\frac{}{n-1}}}

Une deuxième raison à l'utilisation d'un balisage de présentation dans un balisage de contenu tient à la liste continuellement croissante des domaines de discours n'ayant pas d'éléments de contenu prédéfinis pour coder leurs objets et opérateurs. En conséquence, tout système de balisage de contenu requiert inévitablement un mécanisme d'extension qui combine la notation et la sémantique d'une certaine façon. Le balisage de contenu MathML définit plusieurs méthodes permettant d'associer des définitions sémantiques externes à des objets de contenu. Il reste toutefois nécessaire d'utiliser le balisage de présentation MathML pour indiquer comment rendre ces extensions sémantiques définies par l'utilisateur.

Par exemple, l'opérateur rank trouvé en algèbre linéaire n'est pas compris dans les éléments de contenu MathML prédéfinis. Par conséquent, on exprime la déclaration rank(uTv)=1 en utilisant un élément semantics afin de lier une définition sémantique au symbole rank :

<apply>
  <eq/>
  <apply>
    <semantics>
      <mi>rank</mi>
      <annotation-xml encoding="OpenMath">
        <OMS name="rank" cd="linalg3" xmlns="http://www.openmath.org/OpenMath"/>
      </annotation-xml>
    </semantics>
    <apply> 
      <times/> 
      <apply> <transpose/> <ci>u</ci> </apply> 
      <ci>v</ci> 
    </apply>
  </apply>
  <cn>1</cn>
</apply>

La sémantique de rank est fournie ici par un symbole issu d'un dictionnaire de contenu (CD) OpenMath.

5.2.2 Les combinaisons interdites

La contre-partie principale du mélange des balisages de présentation et de contenu au sein d'une seule expression, c'est que le résultat devrait toujours avoir un sens. Lorsque les deux types de balisages sont contenus dans une expression de présentation, cela signifie que le rendu de l'expression mixte résultante devrait pouvoir se faire simplement et raisonnablement. Inversement, lorsqu'un balisage mélangé apparaît dans une expression de contenu, on devrait pouvoir assigner, simplement et raisonnablement, une interprétation sémantique à l'expression dans son ensemble. Ces conditions exercent quelques contraintes naturelles sur la façon dont on peut mélanger les balisages de présentation et de contenu au sein d'une seule expression pour éviter des expressions ambiguës ou sinon problématiques.

Deux exemples illustrent les types de problèmes qu'on doit éviter dans un balisage mélangé. Prenons :

<mrow>
  <bvar> x </bvar> <mo> + </mo> <bvar> y </bvar>
</mrow>

Dans cet exemple, on a incorporé l'élément de contenu bvar sans discernement à une expression de présentation. Dans la mesure où l'élément bvar nécessite un contexte englobant pour sa signification, cette expression n'est pas claire.

De même, prenons :

<apply>
  <ci> x </ci> <mo> + </mo> <ci> y </ci>
</apply>

L'élément mo pose ici un problème. Est-ce que le moteur de rendu devrait inférer l'opérateur arithmétique habituel et agir comme si on avait utilisé l'élément de contenu préfixe plus ? Ou bien est-ce qu'on ne devrait pas interpréter cela littéralement comme un opérateur x appliqué aux deux arguments <mo>+</mo> et <mi>y</mi> ? Même si on décidait que <mo>+</mo> était l'opérateur, que devrait être alors sa signification ? Les réponses à ces questions n'étant pas irrésistibles, ce type de mélange des balisages de présentation et de contenu est donc également prohibé.

5.2.3 Le balisage de présentation dans un balisage de contenu

L'utilisation du balisage de présentation dans un balisage de contenu se réduit aux situations qui ne réalisent pas la capacité du balisage de contenu à coder sans ambiguïté une signification mathématique. En particulier, le balisage de présentation ne peut apparaître dans un balisage de contenu que de trois façons :

  1. Dans les éléments atomiques ci et cn ;
  2. Dans l'élément csymbol ;
  3. Dans l'élément semantics.

Tout autre balisage de présentation survenant dans un balisage de contenu constitue une condition d'erreur MathML. Voici les explications détaillées pour ces trois cas :

Le balisage de présentation dans les éléments atomiques.
Les éléments atomiques ci et cn peuvent contenir une séquence quelconque de caractères MathML (défini dans le chapitre 6 Les caractères, les entités et les fontes), des éléments de présentation et des éléments vides sep. Les blocs contigus de caractères MathML dans les éléments ci et cn sont rendus respectivement comme s'ils étaient enveloppés dans des éléments mi et mn. Si un élément atomique contient à la fois des caractères MathML et des éléments de présentation, les blocs contigus de caractères (s'il y en a) sont traités comme s'ils étaient enveloppés, c'est selon, dans des éléments mi ou mn, et l'ensemble résultant des éléments de présentation est rendu comme s'il était enveloppé dans un élément mrow.
Le balisage de présentation dans l'élément csymbol.
L'élément csymbol peut contenir soit des caractères MathML intercalant un balisage de présentation, soit des éléments de contenu du type conteneur. Un élément csymbol contenant à la fois des éléments de présentation et de continu constitue une condition d'erreur MathML. Lorsque l'élément csymbol contient à la fois des données brutes et un balisage de présentation, les mêmes règles de rendu applicables aux éléments de contenu du type atomique devraient être utilisées.
Le balisage de présentation dans l'élément semantics.
Une des utilisations principales de l'élément semantics est de fournir un mécanisme permettant d'incorporer des expressions MathML arbitraires dans un balisage de contenu avec une sémantique significative. En particulier, on peut incorporer n'importe quelle expression de présentation valide dans une expression de contenu en la plaçant en premier sous-élément de semantics. La signification de cette expression enveloppée devrait être indiquée par un ou plusieurs éléments d'annotation, également contenus dans l'élément semantics. Le rendu suggéré de l'élément semantics est traité dans la section 4.2.6 La syntaxe et la sémantique.

5.2.4 Le balisage de contenu dans un balisage de présentation

Le principe directeur de l'incorporation d'un balisage de contenu dans des expressions de présentation est que le rendu de l'expression finale devrait toujours être sans ambiguïté. En général, cela signifie que les expressions de contenu incorporées doivent avoir une sémantique significative, puisque le rendu d'un balisage de contenu dépend de sa signification.

Certains éléments de contenu tirent une partie de leur signification sémantique du contexte alentour, comme de savoir si l'élément bvar qualifie une intégrale, un quantificateur logique ou bien une expression lambda. Un autre exemple serait celui d'un élément degree apparaissant dans un élément root ou bien dans un élément partialdiff. Dans un contexte de présentation, ces éléments n'ont pas une signification bien définie et leur rendu n'est donc pas évident. Par conséquent, ils ne sont pas autorisés.

D'après la terminologie de la section 4.2.1 Vue d'ensemble de la syntaxe et de l'utilisation, nous constatons que les éléments opérateurs, de relation, conteneurs, de constantes et de symboles ont un sens par eux-mêmes, tandis que les éléments des types qualificatifs et conditionels en sont dépourvus. (Remarquez que l'élément interval peut s'utiliser soit comme conteneur général, soit comme qualificatif).

Hormis ces catégories, certains éléments méritent des commentaires particuliers : les éléments declare, sep, annotation et annotation-xml ne peuvent apparaître que dans des contextes très particuliers et, par conséquent, ils ne sont pas admis comme sous-expressions directes d'un élément de présentation. Enfin, l'élément semantics emporte suffisamment d'informations pour être admis dans une présentation.

La liste complète des éléments de contenu qui ne peuvent pas apparaître comme sous-éléments d'un élément de présentation est la suivante : annotation, annotation-xml, sep, declare, bvar, condition, degree, logbase, lowlimit, uplimit.

Remarquez que, au sein du balisage de présentation, les expressions de contenu peuvent seulement apparaître là où une expression MathML peut légalement apparaître. Notamment, les expressions de contenu ne peuvent pas apparaître dans les éléments atomiques de présentation. De ce point de vue, le mélange de la présentation et du contenu est assymétrique.

Remarquez que l'incorporation d'un balisage de contenu dans une présentation obligera souvent les applications à un rendu des opérateurs hors du contexte d'un élément apply. Par exemple, le rendu des éléments opérateurs abs, plus, root ou sin devra peut-être avoir lieu en dehors d'une application. Toutefois, le mélange contenu/présentation n'introduit pas de nouvelles contraintes puisque les opérateurs non appliqués sont déjà admis dans les expressions de contenu, par exemple :

<apply>
   <compose/>
   <sin/>
   <apply>
      <inverse/>
      <root/>
   </apply>
</apply>

5.3 Le balisage parallèle

Certaines applications peuvent utiliser à la fois des informations de présentation et de contenu. Pour ces applications, il est souhaitable de fournir les deux formes de balisage pour la même expression mathématique. C'est ce qu'on appelle le balisage parallèle.

On réalise un balisage parallèle en utilisant l'élément semantics. On peut utiliser le balisage parallèle d'une expression en lui-même ou on peut l'incorporer comme partie d'un arbre de contenu ou de présentation plus grand.

5.3.1 Le balisage parallèle au premier niveau

Dans beaucoup de cas, on souhaite fournir un balisage de présentation et un balisage de contenu d'une expression mathématique dans son ensemble. Pour y parvenir, on utilise un seul élément semantics couplant deux arbres de balisage, la première branche étant le balisage de présentation MathML et la seconde le balisage de contenu MathML.

L'example suivant code de cette façon l'expression arithmétique booléenne (a+b)(c+d) :

<semantics>
  <mrow>
    <mrow><mo>(</mo><mi>a</mi> <mo>+</mo> <mi>b</mi><mo>)</mo></mrow>
    <mo>&InvisibleTimes;</mo>
    <mrow><mo>(</mo><mi>c</mi> <mo>+</mo> <mi>d</mi><mo>)</mo></mrow>
  </mrow>
  <annotation-xml encoding="MathML-Content">
    <apply><and/>
      <apply><xor/><ci>a</ci> <ci>b</ci></apply>
      <apply><xor/><ci>c</ci> <ci>d</ci></apply>
    </apply>
  </annotation-xml>
</semantics>

Cet exemple n'est pas trivial dans la mesure où on ne pouvait pas déduire facilement le balisage de contenu du seul balisage de présentation.

5.3.2 Le balisage parallèle fin

Le couplage au niveau supérieur d'un balisage de présentation et d'un balisage de contenu indépendants suffit la plupart du temps mais pas dans tous les cas. Les applications permettant le traitement des sous-expressions d'objets mathématiques imposent de pouvoir associer une présentation, un contenu ou des informations aux parties d'un objet ayant un balisage mathématique. Le couplage au niveau supérieur avec un élément semantics ne suffit pas dans ce type de situation : l'identification d'une sous-expression dans l'une des branches de l'élément semantics ne donne aucune indication sur les parties correspondantes des autres branches.

Cette possibilité d'identifier des sous-expressions correspondantes est nécessaire dans les applications tels que les éditeurs d'expressions mathématiques. Dans cette situation, la sélection d'une sous-expression dans un affichage visuel peut identifier un morceau particulier de l'arbre du balisage de présentation. Les applications ont besoin de déterminer ensuite les annotations correspondantes des sous-expressions ; en particulier, elles ont besoin des sous-expressions de l'arbre de l'élément annotation-xml dans la notation de contenu MathML.

En principes, il est possible de fournir des annotations pour chaque nœud de présentation en incorporant récursivement des éléments semantics.

<semantics>
  <mrow>
    <semantics>
      <mrow><mo>(</mo><mi>a</mi> <mo>+</mo> <mi>b</mi><mo>)</mo></mrow>
      <annotation-xml encoding="MathML-Content">
        <apply><plus/><ci>a</ci> <ci>b</ci></apply>
      </annotation-xml>
    </semantics>
    <mo>&InvisibleTimes;</mo>
    <semantics>
      <mrow><mo>(</mo><mi>c</mi> <mo>+</mo> <mi>d</mi><mo>)</mo></mrow>
      <annotation-xml encoding="MathML-Content">
        <apply><plus/><ci>c</ci> <ci>d</ci></apply>
      </annotation-xml>
    </semantics>
  </mrow>

  <annotation-xml encoding="MathML-Content">
    <apply><times/>
      <apply><plus/><ci>a</ci> <ci>b</ci></apply>
      <apply><plus/><ci>c</ci> <ci>d</ci></apply>
    </apply>
  </annotation-xml>
</semantics>

Pour être complet, cet exemple pourrait être beaucoup plus verbeux en enveloppant chacun des nœuds terminaux mi, mo et mn dans sept autres éléments semantics.

Cette approche est très générale et fonctionne pour tous types d'annotations (y compris les annotations non-MathML et les annotations multiples). Par contre, elle conduit à un accroissement du poid du document de O(n2) n log n. Cette approche ne convient donc pas au balisage parallèle fin des grands objets.

5.3.3 Le balisage parallèle avec renvois : id et xref

Pour mieux tenir compte des applications devant traiter les sous-expressions de grands objets, MathML utilise des renvois entre les branches d'un élément semantics afin d'identifier les sous-structures correspondantes.

On réalise le renvoi en utilisant des attributs id et xref dans les branches de l'élément semantics conteneur. Ces attributs peuvent se placer en option sur tous types d'éléments MathML.

L'exemple suivant illustre un renvoi pour l'expression arithmétique booléenne (a+b)(c+d) :

<semantics>
  <mrow id="E">
    <mrow id="E.1">
      <mo id="E.1.1">(</mo>
      <mi id="E.1.2">a</mi>
      <mo id="E.1.3">+</mo>
      <mi id="E.1.4">b</mi>
      <mo id="E.1.5">)</mo>
    </mrow>
    <mo id="E.2">&InvisibleTimes;</mo>
    <mrow id="E.3">
      <mo id="E.3.1">(</mo>
      <mi id="E.3.2">c</mi>
      <mo id="E.3.3">+</mo>
      <mi id="E.3.4">d</mi>
      <mo id="E.3.5">)</mo>
    </mrow>
  </mrow>

  <annotation-xml encoding="MathML-Content">
    <apply xref="E">
      <and xref="E.2"/>
      <apply xref="E.1">
        <xor xref="E.1.3"/><ci xref="E.1.2">a</ci><ci xref="E.1.4">b</ci>
      </apply>
      <apply xref="E.3">
        <xor xref="E.3.3"/><ci xref="E.3.2">c</ci><ci xref="E.3.4">d</ci>
      </apply>
    </apply>
  </annotation-xml>
</semantics>

Un attribut id et un attribut xref correspondant, qui apparaissent dans le même élément semantics, créent une correspondance entre des sous-expressions.

Pour créer ces correspondances par renvois, tous les attributs id appelés par un attribut xref doivent se trouver dans la même branche de l'élément semantics englobant. Cette contrainte garantit que ces correspondances ne créeront pas de boucles involontaires. (Remarquez que cette restriction n'exclut pas l'utilisation d'attributs id dans les autres branches de l'élément semantics englobant. Par contre, elle exclut les appels des autres attributs id issus du même élément semantics).

Il n'y a aucune restriction concernant la branche de l'élément semantics pouvant contenir les attributs id de destination. Il revient à l'application de déterminer quelle branche utiliser.

En général, il n'y aura pas de correspondance injective entre nœuds dans des branches parallèles. Par exemple, un arbre de présentation peut contenir des éléments, telles que des parenthèses, qui n'ont pas de vis-à-vis dans l'arbre de contenu. Il est donc souvent utile de placer les attibuts id sur la branche ayant la structure de nœud la plus fine. Et toutes les autres branches auront des attributs xref vers un certain sous-ensemble des attributs id.

En l'absence d'autres critères, la première branche de l'élément semantics constitue un réceptacle raisonnable des attributs id. Les applications, qui ajoutent ou retirent des annotations, n'auront ainsi pas à réassigner d'attributs aux arbres de l'élément semantics.

En général, l'utilisation des attributs id et xref permet une correspondance complète entre les sous-expressions à donner dans un texte dont le facteur constant est supérieur à l'original. On ne devrait pas supposer que la direction des appels implique une sélection des sous-expressions qui ne serait admise que sur un seul sous-élément de semantics. Il est tout autant faisable de sélectionner un sous-arbre dans n'importe quelle branche que de récupérer les sous-arbres correspondants des autres branches.

5.3.4 Les renvois des annotations avec XLink : id et href

Il est possible d'établir des renvois entre une expression MathML et une annotation XML non-MathML au moyen du protocole XLink [XLink]. Comme exemple, on peut annoter l'expression booléenne de la section précédente avec OpenMath et définir des renvois ainsi :

<semantics>
  <mrow id="E">
    <mrow id="E.1">
      <mo id="E.1.1">(</mo>
      <mi id="E.1.2">a</mi>
      <mo id="E.1.3">+</mo>
      <mi id="E.1.4">b</mi>
      <mo id="E.1.5">)</mo>
    </mrow>
    <mo id="E.2">&InvisibleTimes;</mo>
    <mrow id="E.3">
      <mo id="E.3.1">(</mo>
      <mi id="E.3.2">c</mi>
      <mo id="E.3.3">+</mo>
      <mi id="E.3.4">d</mi>
      <mo id="E.3.5">)</mo>
    </mrow>
  </mrow>

  <annotation-xml encoding="MathML-Content">
    <apply xref="E">
      <and xref="E.2"/>
      <apply xref="E.1">
        <xor xref="E.1.3"/><ci xref="E.1.2">a</ci><ci xref="E.1.4">b</ci>
      </apply>
      <apply xref="E.3">
        <xor xref="E.3.3"/><ci xref="E.3.2">c</ci><ci xref="E.3.4">d</ci>
      </apply>
    </apply>
  </annotation-xml>

  <annotation-xml encoding="OpenMath" 
                  xmlns:om="http://www.openmath.org/OpenMath"
                  xmlns:xlink="http://www.w3.org/1999/xlink">

    <om:OMA xlink:href="#xpointer(id('E'))" xlink:type="simple">
      <om:OMS name="and" cd="logic1" 
              xlink:href="#xpointer(id('E'))" xlink:type="simple"/>

      <om:OMA xlink:href="#xpointer(id('E.1'))" xlink:type="simple">
        <om:OMS name="xor" cd="logic1" 
                xlink:href="#xpointer(id('E.1.3'))" xlink:type="simple"/>
        <om:OMV name="a" 
                xlink:href="#xpointer(id('E.1.2'))" xlink:type="simple"/>
        <om:OMV name="b" 
                xlink:href="#xpointer(id('E.1.4'))" xlink:type="simple"/>
      </om:OMA>

      <om:OMA xlink:href="#xpointer(id('E.3'))" xlink:type="simple">
        <om:OMS name="xor" cd="logic1" 
                xlink:href="#xpointer(id('E.3.3'))" xlink:type="simple"/>
        <om:OMV name="c" 
                xlink:href="#xpointer(id('E.3.2'))" xlink:type="simple"/>
        <om:OMV name="d" 
                xlink:href="#xpointer(id('E.3.4'))" xlink:type="simple"/>
      </om:OMA>
    </om:OMA>
  </annotation-xml>
</semantics>

Les éléments OMA, OMS et OMV sont définis ici selon la norme OpenMath pour représenter respectivement une application, un symbole et une variable. Les références issues de l'annotation OpenMath sont données par les attributs xlink:href, qui utilisent dans ce cas des pointeurs XPointer [XPointer] pour appeler des attributs id au sein du document courant.

Remarquez que l'application peut disposer, ou non, d'un mécanisme pour étendre les définitions DTD. Des applications sont ainsi susceptibles de fournir du code XML bien formé mais non valide dans les éléments annotation-xml. Par conséquent, certaines applications traitant l'élément annotation-xml ne seront pas validées. L'utilisation de schémas XML offre une plus grande souplesse.

5.4 Les outils, les feuilles de style et les macro-commandes du balisage combiné

On peut grandement améliorer l'interaction du balisage de présentation avec celui de contenu par le biais d'outils divers. Quoique le jeu d'outils et de normes pour travailler avec les applications XML évolue rapidement à l'heure actuelle, on peut d'ores et déjà souligner quelques techniques spécifiques.

En général, l'interaction du contenu et de la présentation est dictée via des règles de transformation des arbres MathML. Ces règles de transformation sont parfois appelées des macro-commandes. En principes, on peut les exprimer en utilisant un mécanisme parmi beaucoup d'autres, dont le langage DSSSL, les programmes Java opérant sur un modèle objet de document (DOM), etc. Toutefois, nous prévoyons que le mécanisme principal de ces transformations sera XSLT.

Dans cette section, nous abordons les règles de transformation pour deux buts spécifiques : les feuilles de style de notation et la simplification du balisage parallèle.

5.4.1 Les feuilles de style de notation

Les auteurs utilisant un balisage de contenu peuvent être obligés de déployer leurs documents dans des lieux où les conventions de notation diffèrent du rendu de contenu par défaut. Des outils de transformation sont donc attendus pour déterminer les notations des éléments de contenu selon des paramètres divers. Certains éléments, par exemple les éléments lambda, mean et transpose, ont des notations courantes variant énormément, qui imposeront souvent de sélectionner une notation. Voici quelques exemples de variantes de notation :

D'autres éléments, par exemple plus et sin, sont moins susceptibles de variations.

La sélection d'un style de notation est parfois nécessaire pour une bonne compréhension des documents selon des paramètres de lieu. Par exemple, le coefficient binomial C^n_m en notation française équivaut à C^m_n en notation russe.

Pour une application MathML, un moyen naturel pour lier une notation particulière à l'ensemble des balises de contenu est celui d'une feuille de style XSLT [XSLT]. Les exemples dans cette section supposeront ce mécanisme pour exprimer le choix d'un style. (D'autres choix sont également possibles, par exemple, une application peut fournir des menus proposant un choix de rendus pour toutes les balises de contenu).

Lorsqu'on écrit des feuilles de style XSLT pour une notation mathématique, certaines règles de transformation peuvent être purement locales tandis que d'autres exigeront un contexte de plusieurs nœuds pour déterminer la notation de sortie exacte. L'exemple suivant donne une règle de transformation locale, qui pourrait être incluse dans une feuille de style de notation affichant les intervalles ouverts par ]a,b[ au lieu de (a,b) :

<xsl:template match="m:interval">
  <m:mrow>
    <xsl:choose>
      <xsl:when test="@closure='closed'">
        <m:mfenced open="[" close="]" separators=",">
          <xsl:apply-templates/>
        </m:mfenced>
      </xsl:when>
      <xsl:when test="@closure='open'">
        <m:mfenced open="]" close="[" separators=",">
          <xsl:apply-templates/>
        </m:mfenced>
      </xsl:when>
      <xsl:when test="@closure='open-closed'">
        <m:mfenced open="]" close="]" separators=",">
          <xsl:apply-templates/>
        </m:mfenced>
      </xsl:when>
      <xsl:when test="@closure='closed-open'">
        <m:mfenced open="[" close="[" separators=",">
          <xsl:apply-templates/>
        </m:mfenced>
      </xsl:when>
      <xsl:otherwise>
        <m:mfenced open="[" close="]" separators=",">
          <xsl:apply-templates/>
        </m:mfenced>
      </xsl:otherwise>
    </xsl:choose>
  </m:mrow>
</xsl:template>

On a établit ici m comme espace de nommage MathML.

Voici un exemple de règle exigeant des informations de contexte :

<xsl:template match="m:apply[m:factorial]">
  <m:mrow>
    <xsl:choose>
      <xsl:when test="not(*[2]=m:ci) and not(*[2]=m:cn)">
        <m:mrow>
          <m:mo>(</m:mo>
          <xsl:apply-templates select="*[2]" />
          <m:mo>)</m:mo>
        </m:mrow>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="*[2]" />
      </xsl:otherwise>
    </xsl:choose>
    <m:mo>!</m:mo>
  </m:mrow>
</xsl:template>

D'autres exemples de transformations dépendant du contexte seraient, par exemple, le rendu d'une structure apply avec un élément plus par a-b+c plutôt que a+ -b+c, ou d'une structure apply avec un élément power par sin2x plutôt que sin x2.

La variation de notation se produira pour les éléments de contenu intégrés ainsi que pour les extensions. Le style de notation des extensions peut être pris en charge comme décrit précédemment, les règles correspondant aux noms des balises d'extensions et la manipulation du contenu (dans une feuille de style fidèle au contenu) se déroulant comme décrit dans la section 5.4.3 Les feuilles de style des extensions.

5.4.2 Les transformations fidèles au contenu

On peut être tenté de voir les feuilles de styles de notation comme des transformations d'un balisage de contenu en un balisage de présentation équivalent. On décourage fortement cette vision car elle entraîne une perte d'informations, et les applications privilégiant le contenu ne fonctionneront plus correctement.

On définit une transformation fidèle au contenu comme une transformation retenant le contenu original d'un balisage parallèle (cf. la section 5.3 Le balisage parallèle).

Les outils compatibles MathML devraient être fidèles au contenu et ne pas convertir gratuitement les éléments de contenu en éléments de présentation au cours de leur fonctionnement. Les feuilles de style de notation devraient être fidèles au contenu dès lors qu'elles servent dans des applications interactives.

Il est possible d'écrire des feuilles de style fidèles au contenu de plusieurs façons. On peut obtenir un balisage parallèle au premier niveau en incorporant les règles suivantes dans une feuille de style XSLT :

<xsl:template match="m:math">
   <m:semantics>
      <xsl:apply-templates/>

      <m:annotation-xml m:encoding="MathML-Content">
         <xsl:copy-of select="."/>
      </m:annotation-xml>
   </m:semantics>
</xsl:template>

La notation serait générée par des règles supplémentaires afin de produire une présentation d'après le contenu, telles les règles de la section 5.4.1 Les feuilles de style de notation. On peut obtenir un balisage parallèle fin avec des règles supplémentaires pour traiter les attributs id (cf. un exemple détaillé dans [RodWatt2000]).

5.4.3 Les feuilles de style des extensions

Les balises de présentation de MathML forment un vocabulaire fermé, mais très riche, de structures de notation qui peut servir à exprimer un rendu de la plupart des notations mathématiques. On peut composer des notations complexes à partir des élémens de base fournis pour le balisage de présentation. Dans ce sens, la capacité de présentation de MathML est ouverte. Toutefois, il est souvent utile de nommer les nouveaux schémas de notation s'ils doivent être réutilisés. Par exemple, on peut raccourcir et éclairer l'exemple des factorielles croissantes de la section 5.2.1 Les raisons du balisage mélangé avec une règle qui remplace la sous-expression :

<mx:a-factorial>X</mx:a-factorial>

Par celle-ci :

<semantics>
   <apply> <factorial/> <mi>X</mi> </apply>
   <annotation-xml encoding="MathML-Presentation">
      <msup>
         <mn>1</mn>
         <mover accent="true">
            <mi>X</mi>
            <mo>&OverBar;</mo>
         </mover>
      </msup>
   </annotation-xml>
</semantics>

L'exemple s'écrirait alors plus clairement :

<apply>
  <equivalent/>
  <ci>n</ci>
  <apply>
     <divide/>
     <mx:a-factorial><ci>n</ci></mx:a-factorial>
     <mx:a-factorial>
        <apply><minus/><ci>n</ci><cn>1</cn></apply>
     </mx:a-factorial>
   </apply>
</apply>

De même, les balises de contenu forment un vocabulaire fixe de concepts couvrant les types mathématiques observés dans la plupart des applications courantes. Il n'est pas raisonnable d'attendre des utilisateurs qu'ils composent les balises de contenu MathML existantes pour construire de nouveaux concepts de contenu. (Cette approche est lourde de difficultés techniques même pour les mathématiciens professionnels). À la place, on prévoit que les applications, dont les concepts des contenus mathématiques dépassent l'offre de MathML, utiliseront des annotations et des attributs dans des éléments semantics et csymbol, ces annotations utilisant des langages de description de contenu hors de MathML.

Le nommage d'une notation et l'identification d'un nouveau concept sémantique sont souvent liés. Cela permet la saisie en même temps du balisage de présentation et du balisage de contenu d'une expression par une simple règle de transformation. Ce domaine de MathML est l'un qui profite le plus fortement de l'emploi de macro-commandes de traitement.

<mx:rank/>

Et :

<mx:tr>X</mx:tr>

Puis les transformer respectivement en :

<semantics>
   <ci><mo>rank</mo></ci>
   <annotation-xml encoding="OpenMath">
      <OMS name="rank" cd="linalg3" xmlns="http://www.openmath.org/OpenMath"/>
   </annotation-xml>
</semantics>

Et :

<apply>
 <transpose/>
 <ci>X</ci>
</apply>

L'exemple long du codage de l'expression rank(uTv)=1 de la section 5.2.1 Les raisons du balisage mélangé pourrait alors se réduire à :

<apply>
  <eq/>
  <apply>
    <mx:rank/>
    <apply> <times/> <mx:tr>u</mx:tr> <ci>v</ci> </apply>
   </apply>
  <cn>1</cn>
</apply>

D'après cet exemple, nous voyons comment la combinaison des balisages de présentation et de contenu pourrait devenir bien plus simple et efficace à générer avec l'apparition de bibliothèques de feuilles de style normalisées.

Table des matières : Le langage de balisage mathématique (MathML) version 2.0
Chapitre précédent : 4 Le balisage de contenu
Chapitre suivant : 6 Les caractères, les entités et les fontes