Lisez-moi S.V.P. 

2 Les principes fondamentaux de MathML

Table des matières : Le langage de balisage mathématique (MathML) version 2.0
Chapitre précédent : 1 Introduction
Chapitre suivant : 3 Le balisage de présentation

2.1 Vue d'ensemble de MathML

Ce chapitre introduit les concepts de base de MathML. La première section décrit la conception générale de MathML. La deuxième section présente quelques exemples pratiques, auxquels le lecteur pourra se référer concrètement au cours des chapitres suivants de la spécification MathML. La dernière section décrit les caractéristiques de base de la syntaxe et de la grammaire MathML, qui s'appliquent à toutes les balises MathML. En particulier, il faudrait lire la section 2.4 La syntaxe et la grammaire MathML avant les chapitres 3 Le balisage de présentation, 4 Le balisage de contenu et 5 La combinaison des balisages de présentation et de contenu.

Le défi fondamental de la définition d'un langage de balisage pour les mathématiques sur le Web est de concilier les besoins de codage de la présentation d'une notation mathématique et le contenu de l'idée, ou de l'objet mathématique, qu'elle représente.

Les relations entre la notation mathématique et l'idée mathématique sont subtiles et profondes. Sur un plan formel, les résultats de la logique mathématique soulèvent des questions troublantes à propos de la correspondance entre des systèmes de la logique symbolique et les phénomènes que ceux-ci modélisent. Sur un plan plus intuitif, toute personne qui utilise une notation mathématique connaît la différence appréciable apportée par une notation bien choisie ; la structure symbolique de la notation suggère la structure logique. Par exemple, la notation de Leibniz pour les dérivées suggère l'enchaînement des règles au travers de l'annulation symbolique des fractions : \frac{d f}{d x}\frac{d x}{d t}=\frac{d f}{d t}.

Les mathématiciens et les enseignants comprennent cela très bien par intuition ; une partie de leur compétence tient dans leur choix d'une notation qui met en valeur les aspects clés d'un problème, tout en cachant ou en atténuant les aspects superflus. Il est courant en mathématiques et en science d'écrire une certaine chose alors que, d'un point de vue strictement technique, on veut dire autre chose, parce qu'une longue expérience montre qu'on transmet l'idée beaucoup mieux, en réalité, à un niveau supérieur qu'en détails rigoureux.

Dans beaucoup d'autres mises en œuvre, au contraire, on utilise une notation mathématique pour coder le sens entier et précis d'un objet mathématique. La notation mathématique est capable d'une prodigieuse rigueur et, quand on l'emploie avec précaution, elle peut être virtuellement dépourvue d'ambiguïté. De plus, c'est précisément cette absence d'ambiguïté qui rend possible la description des objets mathématiques, qui peut donc être mise à profit par les applications logicielles, tels que les systèmes de calcul algébrique et les synthétiseurs de parole. Dans les situations où une telle communication interapplications est cruciale, les nuances d'une présentation visuelle tiennent en général un rôle mineur.

MathML permet aux auteurs de coder à la fois la notation représentant un objet mathématique et la structure mathématique de l'objet en question. En outre, les auteurs peuvent mêler les deux types de codage afin de définir à la fois la présentation et le contenu d'une idée mathématique. Le reste de cette section offre une vue d'ensemble de l'utilisation de MathML dans chacune de ces façons.

2.1.1 La taxonomie des éléments MathML

Tous les éléments MathML se rangent dans l'une de trois catégories suivantes : les éléments de présentation, les éléments de contenu et les éléments d'interface. Chaque catégorie est décrite en détails dans les chapitres respectifs 3 Le balisage de présentation, 4 Le balisage de contenu et 7 L'interface MathML.

Les éléments de présentation décrivent la structure bidimentionnelle à orientation visuelle de la notation mathématique. Comme exemples typiques, on trouve l'élément mrow, servant habituellement à indiquer une rangée horizontale de morceaux d'expressions, et l'élément msup, servant à baliser une expression de base avec l'exposant associé. En règle générale, chaque élément de présentation correspond à un seul type de schéma de notation, tels qu'une rangée, un exposant, un indice, une écriture en lettres inférieures, et ainsi de suite. Toute formule se construit en accolant des parties dont l'analyse peut se poursuivre jusqu'aux éléments les plus simples comme les chiffres, les lettres ou autres caractères de symboles.

Quoique le paragraphe précédent concernait l'aspect visuel des objets mathématiques, et donc le balisage de présentation, la même observation à propos de la décomposition s'applique aussi bien aux objets mathématiques abstraits, et donc au balisage de contenu. Par exemple, dans un contexte de balisage de contenu, une écriture en lettres supérieures se dénoterait par une opération d'exponentiation nécessitant deux opérandes : une base et un exposant. Ce n'est pas une coïncidence, car, en règle générale, la disposition de la notation mathématique suit de près la structure logique des objets mathématiques sous-jacents.

La nature récursive des objets et de la notation mathématiques est fortement reflétée par le balisage MathML. À l'usage, la plupart des éléments de présentation ou de contenu contient un certain nombre d'autres éléments MathML correspondant aux parties constitutives d'après lesquelles on construit récursivement l'objet original. Le schéma original est communément appelé schéma parent et les pièces constitutives schémas enfant. Plus généralement, on peut assimiler les expressions MathML à des arbres dont chaque nœud correspond à un élément MathML, les branches sous un nœud parent correspondent à ses enfants et les nœuds terminaux de l'arbre correspondent à une notation atomique ou à des unités de contenu, tels que des nombres, des caractères, etc.

Pour la plupart, les nœuds terminaux dans l'arbre d'une expression MathML se composent soit d'éléments canoniques vides sans corps, soit d'éléments atomiques. Les éléments canoniques vides représentent les symboles, directement en MathML, par exemple, l'élément de contenu <plus/> a cette caractéristique. Les éléments atomiques MathML sont les seuls éléments MathML pouvant contenir des données textuelles MathML. Les données textuelles MathML sont constituées de caractères Unicode auxquels s'ajoutent, rarement, des caractères de construction spéciaux fabriqués à partir d'un élément mglyph. Un troisième type de nœud terminal admis dans MathML est l'élément annotation, qui sert à contenir des données dans un autre format non-MathML.

Les éléments atomiques de présentation les plus importants sont mi, mn et mo, respectivement pour la représentation des identificateurs, des nombres et des opérateurs. Un moteur de rendu emploiera typiquement des styles différents de composition pour chacun de ces types de données textuelles : les nombres apparaissent habituellement dans une fonte droite, les identificateurs en italique et les opérateurs ont un espacement supplémentaire autour d'eux. Le balisage de contenu ne dispose que des trois atomes ci, cn et csymbol, respectivement pour les identificateurs, les nombres et les nouveaux symboles introduits dans le document en question. Dans le balisage de contenu, on fournit des éléments séparés pour les fonctions et les opérateurs d'usage courant. L'élément apply est proposé afin que l'utilisateur puisse définir des extensions au jeu de base.

En termes de balisage, les éléments MathML sont indiqués, pour la plupart, avec une balise ouvrante et une balise fermante, lesquelles englobent à leur tour le balisage qui forme leur contenu. Dans le cas des atomes, il s'agit d'un contenu de données textuelles et, dans la plupart des autres cas, le contenu est formé par le balisage des éléments enfants. Les éléments de la troisième catégorie, appelés éléments canoniques vides, ne sont pas tenus d'avoir un contenu et ils sont indiqués par une seule balise de la forme <nom/>. Un exemple de ce troisième type de balisage est constitué par l'élément <plus/> dans un balisage de contenu.

Prenons l'exemple très simple de l'expression (a + b)2 et voyons maintenant comment les principes abordés précédemment sont mis en pratique. Le balisage de présentation de cet exemple a la forme suivante :

 <mrow>
   <msup>
     <mfenced>
       <mrow>
         <mi>a</mi>
         <mo>+</mo>
         <mi>b</mi>
       </mrow>
     </mfenced>
     <mn>2</mn>
   </msup>
 </mrow>

L'exemple illustre l'utilisation de plusieurs éléments de présentation. Le premier élément, l'un des plus utilisés, est l'élément mrow. Il sert à indiquer une ligne de texte alignée horizontalement. Le texte contenu entre les balises <mrow> et </mrow> est réputée constituer un argument de l'élément mrow. Ici, l'expression entière est donc contenue dans un élément mrow. Comme indiqué précédemment, presque toutes les expressions mathématiques se décomposent en sous-expressions. Ces sous-expressions peuvent être contenues, à leur tour, dans un élément mrow. Dans l'exemple, l'expression a + b se trouve également dans un élément mrow.

L'élément mfenced sert à fournir les délimitations (accolades, crochets et parenthèses) autour de la matière d'une formule. À défaut, ce seront des parenthèses.

Remarquer l'utilisation de l'élément mi pour afficher les variables a et b, et de l'élément mo pour marquer l'opérateur +.

L'élément msup sert avec les expressions comportant une écriture en exposant, et il reçoit deux arguments, dans l'ordre, l'expression de base (ici (a+b)) et l'exposant (ici 2).

Le balisage de contenu du même exemple est le suivant :

 <mrow>
   <apply>
     <power/>
     <apply>
       <plus/>
       <ci>a</ci>
       <ci>b</ci>
     </apply>
     <cn>2</cn>
   </apply>
 </mrow>

Ici, l'élément de contenu apply applique une opération à une expression. Dans cet exemple, l'élément power (pour l'exponentiation), qui ne nécessite pas de corps, et l'élément de type similaire plus (pour l'addition) sont tous les deux appliqués. Observons que les deux opérateurs prennent deux arguments, et l'ordre est significatif dans le cas particulier de l'opérateur power. Quoiqu'il en soit, l'ordre des enfants est crucial pour l'utilisation de l'élément apply, car le premier enfant (qui est l'opérateur) prend comme liste d'arguments les enfants restants.

Remarquez l'utilisation de l'élément ci pour baliser les variables a et b, et de l'élément cn pour baliser le nombre 2.

2.1.2 Le balisage de présentation

Le balisage de présentation MathML se compose d'une trentaine d'éléments acceptant plus de 50 attributs. Pour la plupart, les éléments correspondent à des schémas de disposition qui contiennent d'autres éléments de présentation. Chaque schéma de disposition correspond à un appareil de notation bidimentionnel, telles que l'écriture en lettres supérieures ou en lettres inférieures, les fractions ou les tableaux. S'y ajoutent les éléments de présentation atomiques mi, mo et mn introduits précédemment, ainsi que plusieurs autres éléments atomiques moins courants. Les quelques éléments de présentation restants sont des éléments vides qui servent pour la plupart à l'alignement.

Les schémas de disposition se classent en plusieurs catégories. Un groupe d'éléments concerne l'écriture, avec des éléments comme msub, munder et mmultiscripts. Un autre groupe traite de la disposition plus généralement, avec les éléments mrow, mstyle et mfrac. Un troisième groupe traite des tableaux. L'élément maction, qui forme une catégorie en soi, permet de coder divers types d'actions sur la notation, comme celle qui advient dans une expression oscillant entre deux morceaux de notation.

Une caractéristique importante de beaucoup de schémas de disposition est l'ordre significatif des schémas enfants. Par exemple, le premier enfant d'un élément mfrac est le numérateur et le second le dénominateur. Puisque la définition DTD de MathML ne fait pas valoir l'ordre des schémas enfants au niveau XML, l'information ajoutée dans l'ordonnancement sera uniquement exploitable par un processeur MathML, par opposition à un processeur XML générique. Lorsqu'on voudra préciser qu'un élément MathML, tel que mfrac, n'admet des enfants que dans un ordre spécifique, on les désignera comme étant des arguments et on assimilera l'élément mfrac à un constructeur de notation.

2.1.3 Le balisage de contenu

Le balisage de contenu se compose d'environ 120 éléments acceptant une douzaine d'attributs. Pour la plupart, ce sont des éléments vides qui correspondent à des opérateurs, des relations et des fonctions nommées très divers. Comme exemples de ce type, les éléments partialdiff, leq et tan. D'autres éléments, tels que matrix et set, servent à coder des types de données mathématiques diverses, et une troisième catégorie importante d'éléments de contenu, tel que apply, sert à appliquer des opérations sur les expressions et également à fabriquer des objets mathématiques nouveaux à partir d'autres objets.

L'élément apply est peut-être le seul élément de contenu essentiel. On s'en sert pour appliquer une fonction ou une opération à une collection d'arguments. Les positions des schémas enfants sont encore une fois significatives, car le premier enfant indique la fonction à appliquer et les autres indiquent, dans l'ordre, les arguments de la fonction. Remarquez que la construction apply utilise toujours une notation en préfixe, comme dans le langage de programmation LISP. En particulier, même les opérations binaires sont balisées en préfixant les deux arguments par l'opérateur, ici l'opérateur de soustraction. Par exemple, l'expression a - b s'écrirait de la façon suivante :

<mrow>
<apply>
   <minus/>
   <ci>a</ci>
   <ci>b</ci>
</apply>
</mrow>

Quelques fonctions et opérations nécessitent un ou plusieurs quantificateurs pour une définition correcte. Par exemple, outre la fonction à intégrer, une intégrale définie doit préciser les limites de l'intégration et la variable de borne. Pour ces raisons, il existe plusieurs schémas qualificatifs, tels que bvar et lowlimit. Ils servent avec des opérateurs tels que diff et int.

La construction declare est particulièrement importante pour un balisage de contenu susceptible d'alimenter un système de calcul algébrique. L'élément declare fournit un mécanisme d'assignation de base, qui permet de déclarer une variable avec un certain type et une certaine valeur.

Dans les exemples de balisage de présentation comme de contenu, les expressions mathématiques sont décomposées récursivement en éléments MathML imbriqués plus simples en indiquant chaque étape de la décomposition. Les exemples des sections suivantes en sont l'illustration avec des expressions plus complexes.

2.1.4 Le mélange de la présentation et du contenu

Les balisages seront appropriés aux différents types de tâche. Les documents écrits avant que le World Wide Web ne devienne important étaient le plus souvent destinés à une communication visuelle de l'information, et ces données anciennes se traduiront donc probablement mieux avec seulement un balisage de présentation, dans la mesure où l'information sémantique voulue par l'auteur ne peut se deviner que par des moyens heuristiques. À l'opposé, certaines applications mathématiques et certains outils d'édition mathématiques à orientation pédagogique seront probablement axés entièrement sur le contenu. La majorité des applications se range quelque part entre ces deux extrêmes. Pour cette majorité, le balisage le plus approprié consiste en un mélange des deux balisages de présentation et de contenu.

Les règles de mélange des balisages de présentation et de contenu dérivent du principal général selon lequel on ne devrait autoriser un contenu mixte que là où c'est logique. Pour un balisage de contenu imbriqué dans un balisage de présentation, cela veut simplement dire que les fragments de contenu devraient être sémantiquement signifiant et ne devraient pas nécessiter d'autres arguments ou quantificateurs pour leur définition complète. Pour un balisage de présentation imbriqué dans un balisage de contenu, cela signifie habituellement que le balisage de présentation doive être contenu dans un élément de contenu atomique, de sorte qu'il sera traité comme une unité de notation indivisible servant de variable ou de nom de fonction.

Une autre option consiste à utiliser l'élément semantics. L'élément semantics sert à associer des expressions MathML à divers types d'annotation. Un auteur peut ainsi définir une notation non standard à employer pour l'affichage d'une expression de contenu particulier. Un autre emploi de l'élément semantics consiste à associer un autre type de définition sémantique, telle qu'une expression OpenMath, à une expression MathML. On peut utiliser l'élément semantics de cette façon pour étendre la portée du balisage de contenu MathML.

2.2 MathML dans un document

La discussion précédente portait sur des formules fragmentaires hors du contexte d'un document. Voyons plus particulièrement à quoi correspondrait un exemple de type Hello World! des langages de programmation. Nous fournirons le code plus complet d'un document XHTML 1.0, contenant le carré de la somme de deux variables tel que mentionné précédemment. Voici ce que cela donnerait :


<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
 
<head>
<title>Bonjour le carré de MathML</title>
</head>

<body>

<p> Voici un magnifique carré :</p>

<math xmlns="http://www.w3.org/1998/Math/MathML">
 <mrow>
   <msup>
     <mfenced>
       <mrow>
         <mi>a</mi>
         <mo>+</mo>
         <mi>b</mi>
       </mrow>
     </mfenced>
     <mn>2</mn>
   </msup>
 </mrow> 
</math>

</body>
</html>

Nous avons ici la structure habituelle d'un document XHTML. Il commence par la balise ouvrante <html> embellie d'une déclaration d'espace de nommage XML et d'assertions de langue. Un élément head contient un titre comme c'est l'usage. Puis une balise <body> ouvrante ayant aussi une déclaration d'espace de nommage d'un préfixe abrégé dans la lettre m à utiliser avec l'espace de nommage MathML standard. Suit un paragraphe simple. Enfin, on a l'élément math qui déclare également une association d'espace de nommage. Le balisage MathML, presque familier, se trouve dans l'élément math. On explique les raisons pour lesquelles la déclaration d'espace de nommage devrait être plus complexe dans le chapitre 7 L'interface MathML ; elles tiennent aux limitations actuelles de certaines gestions XML que l'on espère voir disparaître.

Pour la suite des détails techniques à propos de thèmes comme la déclaration de <!DOCTYPE> et autres, cf. la discussion dans le chapitre 7 L'interface MathML.

2.3 Quelques exemples avec MathML

Nous continuerons dorénavant de présenter les exemples sous forme de fragments de balisage MathML tels qu'ils apparaîtraient dans les éléments math de documents réels. Pour éclairer l'exposé des principes, les exemples dans les chapitres 3, 4, 5 et 6 conserveront cette forme en fragments MathML.

2.3.1 Exemples de présentation

Notation : x2 + 4x + 4 = 0.

Balisage :

<mrow>
  <mrow>
    <msup>
      <mi>x</mi>
      <mn>2</mn>
    </msup>
    <mo>+</mo>
    <mrow>
      <mn>4</mn>
      <mo>&InvisibleTimes;</mo>
      <mi>x</mi>
    </mrow>
    <mo>+</mo>
    <mn>4</mn>
  </mrow>
  <mo>=</mo>
  <mn>0</mn>
</mrow>

Remarquez l'emploi d'éléments mrow imbriqués pour marquer les termes, par exemple, la partie gauche de l'équation fonctionnant comme un opérande de =. Le balisage des termes facilite grandement l'aération du rendu visuel, du rendu sonore et des sauts de ligne. L'entité de caractère MathML InvisibleTimes sert ici pour indiquer au moteur de rendu que des règles spéciales d'espacement existent entre le 4 et le x, à savoir que le 4 et le x ne devraient pas se répartir sur des lignes séparées. En fait, cet emploi d'une entité introduite dans MathML 1.0 n'est plus celui recommandé. Toutes les données textuelles ordinaires auront en définitive leur contrepartie en valeurs Unicode. Toutefois, quoiqu'un caractère représentant l'entité &InvisibleTimes; soit prévu pour Unicode 3.2 et qu'un amendement Unicode étudie par ailleurs un point de code suggéré, aucun caractère Unicode 3.0 n'est actuellement utilisable. On pourrait employer la référence de caractère numérique &#2062; prévue, mais par souci de clarté nous continuerons d'utiliser des appels d'entité dans les exemples. La situation est abordée explicitement dans la section 3.2 Les éléments atomiques et le chapitre 6 Les caractères, les entités et les fontes.

Notation : x = \frac{-b\pm\sqrt{b^2 - 4ac}}{2a}.

Balisage :

<mrow>
  <mi>x</mi>
  <mo>=</mo>
  <mfrac>
    <mrow>
      <mrow>
        <mo>-</mo>
        <mi>b</mi>
      </mrow>
      <mo>&PlusMinus;</mo>
      <msqrt>
        <mrow>
          <msup>
            <mi>b</mi>
            <mn>2</mn>
          </msup>
          <mo>-</mo>
          <mrow>
            <mn>4</mn>
            <mo>&InvisibleTimes;</mo>
            <mi>a</mi>
            <mo>&InvisibleTimes;</mo>
            <mi>c</mi>
          </mrow>
        </mrow>
      </msqrt>
    </mrow>
    <mrow>
      <mn>2</mn>
      <mo>&InvisibleTimes;</mo>
      <mi>a</mi>
    </mrow>
  </mfrac>
</mrow>

Les éléments mfrac et msqrt servent à générer, respectivement, des fractions et des racines carrées.

Remarquez que le signe plus ou moins est donné par un nom d'entité spécial &PlusMinus;, quoiqu'il existe déjà un caractère Unicode &#00B1; pour ce cas. MathML fournit une liste très complète de noms de caractère pour les symboles mathématiques. En plus des symboles mathématiques nécessaires pour un rendu à l'écran ou pour une impression, MathML fournit des symboles facilitant le rendu sonore. Pour un rendu sonore, il importe de pouvoir déterminer automatiquement d'après le code suivant :

<mrow>
  <mi>z</mi>
  <mfenced>
    <mrow>
      <mi>x</mi>
      <mo>+</mo>
      <mi>y</mi>
    </mrow>
  </mfenced>
</mrow>

Si on devrait lire cette expression z fois la quantité x plus y ou bien z de x plus y. Les caractères &InvisibleTimes; (U+2062) et &ApplyFunction; (U+2061) permettent aux auteurs de coder directement cette distinction pour les moteurs de rendu sonores. Par exemple, pour la première possibilité, il faudrait insérer le caractère &InvisibleTimes; (U+2062) après la ligne contenant le z. MathML introduit également des entités comme &dd; (U+2146), représentant un d différentiel, qui, à l'impression, est rendu avec un espacement légèrement différent et qui, à l'écoute, peut se dire d ou par rapport à. À moins d'utiliser des balises de contenu ou un autre mécanisme pour lever l'ambiguïté, les auteurs devraient toujours employer ces caractères, indiqués ici par des entités, pour rendre leurs documents plus accessibles.

Notation : A=\left[\begin{array}{cc} x & y \\ z & w \end{array}\right].

Balisage :

<mrow>
  <mi>A</mi>
  <mo>=</mo>
  <mfenced open="[" close="]">
    <mtable>
      <mtr>
         <mtd><mi>x</mi></mtd>
         <mtd><mi>y</mi></mtd>
      </mtr>
      <mtr>
         <mtd><mi>z</mi></mtd>
         <mtd><mi>w</mi></mtd>
      </mtr>
    </mtable>
  </mfenced>
</mrow>

L'élément mtable marque une table MathML à créer. L'élément mtr définit une rangée de la table et l'élément mtd contient les données d'un élément de rangée. La plupart des éléments possède des attributs qui contrôlent leur rendu détaillé à l'écran ou à l'impression. Par exemple, plusieurs attributs de l'élément mfenced déterminent quels délimiteurs utiliser au début et à la fin de l'expression groupée précédente. Les attributs des éléments opérateurs, fournis au moyen de l'élément <mo>, prennent leur valeur par défaut déterminée par un dictionnaire. Pour le dictionnaire suggéré des opérateurs MathML, cf. l'Annexe F Le dictionnaire d'opérateurs.

2.3.2 Exemples de contenu

Notation : x2 + 4x + 4 = 0.

Balisage :

<mrow>
<apply>
  <eq/>
  <apply>
    <plus/>
    <apply>
      <power/>
      <ci>x</ci>
      <cn>2</cn>
    </apply>
    <apply>
      <times/>
      <cn>4</cn>
      <ci>x</ci>
    </apply>
    <cn>4</cn>
  </apply>
  <cn>0</cn>
</apply>
</mrow>

Remarquez qu'on utilise l'élément apply pour les relations, les opérateurs et les fonctions.

Notation : x = \frac{-b\pm\sqrt{b^2 - 4ac}}{2a}.

Balisage :

<mrow>
<apply>
  <eq/>
  <ci>x</ci>
  <apply>
    <divide/>
    <apply>
      <mo>&PlusMinus;</mo>
      <apply>
        <minus/>
        <ci>b</ci>
      </apply>
      <apply>
        <root/>
        <apply>
          <minus/>
          <apply>
            <power/>
            <ci>b</ci>
            <cn>2</cn>
          </apply>
          <apply>
            <times/>
            <cn>4</cn>
            <ci>a</ci>
            <ci>c</ci>
          </apply>
        </apply>
        <cn>2</cn>
      </apply>
    </apply>
    <apply>
      <times/>
      <cn>2</cn>
      <ci>a</ci>
    </apply>
  </apply>
</apply>
</mrow>

Le balisage de contenu MathML ne possède aucun élément codant directement l'opération plus ou moins. On utilise donc l'élément mo afin de déclarer que le balisage de présentation de cet opérateur agit comme un opérateur de contenu. Cet exemple simple montre comment on peut mélanger balisage de présentation et balisage de contenu afin d'étendre le balisage de contenu.

Notation : A=\left(\begin{array}{cc} x & y \\ z & w \end{array}\right).

Balisage :

<mrow>
<apply>
  <eq/>
  <ci>A</ci>
  <matrix>
    <matrixrow>
      <ci>x</ci>
      <ci>y</ci>
    </matrixrow>
    <matrixrow>
      <ci>z</ci>
      <ci>w</ci>
    </matrixrow>
  </matrix>
</apply>
</mrow>

Ici nous avons utilisé l'élément matrix et l'élément matrixrow pour envelopper les entrées dans une rangée de la matrice. Remarquez que le rendu de l'élément de contenu matrix inclut implicitement les parenthèses englobantes, et leur codage direct est donc inutile. Par contre, l'élément mtable peut se rapporter à une matrice et, le cas échéant, un codage explicite des parenthèses sera donc nécessaire.

2.3.3 Exemples de balisage mixte

Notation : \displaystyle \int_1^t \frac{\diffd x}{x}.

Balisage :

<mrow>
<semantics>
  <mrow>
    <msubsup>
      <mo>&int;</mo>
      <mn>1</mn>
      <mi>t</mi>
    </msubsup>
    <mfrac>
      <mrow>
        <mo>&dd;</mo>
        <mi>x</mi>
      </mrow>
      <mi>x</mi>
    </mfrac>
  </mrow>
  <annotation-xml encoding="MathML-Content">
    <apply>
      <int/>
      <bvar><ci>x</ci></bvar>
      <lowlimit><cn>1</cn></lowlimit>
      <uplimit><ci>t</ci></uplimit>
      <apply>
        <divide/>
        <cn>1</cn>
        <ci>x</ci>
      </apply>
    </apply>
  </annotation-xml>
</semantics>
</mrow>

Dans cet exemple, nous utilisons l'élément semantics pour fournir une expression de contenu MathML servant d'annotation sémantique d'une expression de présentation. Dans le balisage d'affichage, nous avons utilisé l'élément msubsup pour accrocher une écriture inférieure et une écriture supérieure à une expression, dans ce cas le signe de l'intégrale. Nous avons aussi utilisé des entités &int; et &dd; pour indiquer les symboles d'intégrale et de différentiel.

L'élément semantics a pour premier enfant l'expression annotée en question, et les enfants suivants en sont les annotations. Il n'y a aucune restriction sur le type d'annotation qu'on peut accrocher avec un élément semantics. Par exemple, on pourrait fournir en annotation un codage TEX ou une entrée de calcul algébrique. Le type de l'annotation est indiqué par l'attribut encoding et les éléments annotation et annotation-xml.

Un autre cas d'utilisation courante de l'élément semantics se présente lorsqu'on veut utiliser un codage de contenu et faire une suggestion pour sa présentation. Dans ce cas, appliqué à la formule précédente, nous aurions le balisage suivant :

<semantics>
  <apply>
    <int/>
    <bvar><ci>x</ci></bvar>
    <lowlimit><cn>1</cn></lowlimit>
    <uplimit><ci>t</ci></uplimit>
    <apply>
      <divide/>
      <cn>1</cn>
      <ci>x</ci>
    </apply>
  </apply>
  <annotation-xml encoding="MathML-Presentation">
    <mrow>
      <msubsup>
        <mo>&int;</mo>
        <mn>1</mn>
        <mi>t</mi>
      </msubsup>
      <mfrac>
        <mrow>
          <mo>&dd;</mo>
          <mi>x</mi>
        </mrow>
        <mi>x</mi>
      </mfrac>
    </mrow>
  </annotation-xml>
</semantics>

Ce type d'annotation est utile lorsqu'on souhaite un autre rendu du codage de contenu que celle par défaut. Par exemple, certains moteurs de rendu peuvent disposer par défaut la fonction à intégrer de la façon suivante (1/x) dx. Comme illustré, on peut obtenir que la fonction à intégrer soit rendue, à la place et de préférence, par dx/x à l'aide d'une annotation de présentation MathML. Toutefois, sachez que les moteurs de rendu ne sont pas obligés de tenir compte des informations contenues dans les annotations, et l'emploi qui en serait fait dépendra du moteur de rendu.

2.4 La syntaxe et la grammaire de MathML

2.4.1 La syntaxe et la grammaire MathML

MathML est une application du langage de balisage extensible [XML] et, de ce fait, les règles de XML régissent sa syntaxe et une définition de type de document (DTD) fonde en partie sa grammaire. En d'autres termes, le détail de l'utilisation des balises, des attributs, des références d'entité, et ainsi de suite, est défini dans la spécification XML et le détail des éléments et noms d'attribut MathML, ces éléments pouvant s'imbriquer les uns dans les autres, et ainsi de suite, est défini dans la définition DTD de MathML. Cf. l'Annexe A L'interprétation MathML.

Dans sa quête afin d'accroître la flexibilité de XML pour le Web et afin d'encourager la modularisation des applications bâties avec XML, le W3C s'est rendu compte que la forme de base de la définition DTD n'était pas assez souple. Un groupe de travail du W3C a donc été mis en place avec mission de développer une spécification pour les schémas XML [XMLSchemas], c.à.d. des documents de définition qui remplaceront peut-être les définitions DTD. MathML 2.0 est volontairement conçu de sorte que les mathématiques puissent tirer avantage des dernières avancées de la technologie Web. Il y aura donc un schéma pour MathML. Pour plus d'informations à propos d'un schéma MathML, cf. l'Annexe A L'interprétation MathML] et la page d'accueil de MathML.

Toutefois, MathML définit également quelques règles de syntaxe et de grammaire en plus des règles générales héritées en tant qu'application XML. Ces règles MathML permettent donc de coder beaucoup plus d'informations qu'il ne serait ordinairement possible uniquement en XML, et sans introduire beaucoup plus d'éléments ni recourir à une définition DTD ou à un schéma beaucoup plus complexes. On donne une grammaire des expressions de balisage de contenu dans l'Annexe B La grammaire de validation du balisage de contenu. L'utilisation de règles spécifiques à MathML présente bien sûr l'inconvénient de les rendre invisibles aux processeurs et aux validateurs XML génériques.

Il existe essentiellement deux types de règles de grammaire et de syntaxe MathML. Le premier type concerne l'imposition de critères supplémentaires aux valeurs d'attributs. Par exemple, on ne peut pas, uniquement en XML, imposer une valeur entière positive à un attribut. Le second type établit des restrictions plus précises sur les éléments enfants (par exemple, leur ordonnancement) que celles données dans la définition DTD, ou même dans un schéma. Par exemple, on ne peut pas, en XML, indiquer que le premier enfant soit interprété d'une certaine façon et le deuxième d'une autre.

Les sections suivantes expliquent les caractéristiques de la syntaxe et de la grammaire de XML en général et de MathML en particulier. Dans la suite de la spécification MathML, nous distinguerons habituellement l'utilisation imposée par la syntaxe XML et la définition DTD (ou le schéma) de MathML de l'utilisation imposée par les règles spécifiques de MathML. Par contre, nous ferons fréquemment allusion à des erreurs MathML sans identifier quelle partie de la spécification aura été transgressée.

2.4.2 Une introduction à la syntaxe XML

Puisque MathML est une application de XML, la spécification MathML emploie une terminologie XML pour sa description. En bref, les données XML se composent de caractères Unicode (y compris les caractères ASCII ordinaires), de références d'entité (appelées de façon informelle entités), tel &lt;, représentant habituellement des caractères étendus, et d'éléments tel que <mi fontstyle="normal"> x </mi>.

Un élément englobe très souvent d'autres données XML, désignées collectivement par son contenu ou corps, entre une balise ouvrante (appelée parfois balise de début) et une balise fermante, un peu comme dans HTML. Il y a aussi des éléments vides, tel que <plus/>, dont la balise ouvrante s'achève par /> pour indiquer que l'élément n'a pas de contenu ni de balise fermante. La balise ouvrante peut contenir des paramètres nommés, appelés attributs, tel que fontstyle="normal" dans l'exemple précédent. Pour d'autres précisions au sujet de XML, consultez la spécification XML [XML].

Puisque XML est sensible à la casse, les noms des éléments et attributs MathML le sont aussi. Pour une question de lisibilité, la spécification MathML les définit presque tous en bas de casse.

Dans les discussions formelles sur le balisage XML, on fait la distinction entre un élément, tel que l'élément mrow, et les balises <mrow> et </mrow> qui le constituent. Ce qui se trouve entre la balise ouvrante <mrow> et la balise fermante </mrow> est le contenu, ou corps, de l'élément mrow. Un élément vide, tel que l'élément none, est défini comme n'ayant pas de corps et n'ayant donc qu'une seule balise de la forme <none/>. En général, la distinction entre éléments et balises ne sera pas si tranchée dans cette spécification. Par exemple, on se réfèrera parfois aux éléments <mrow> et <none/>, en désignant en réalité les éléments dont ce sont les balises, afin de distinguer visiblement les éléments des attributs. Par contre, les mots élément et balise en eux-mêmes seront strictement employés selon la terminologie XML.

2.4.3 Les enfants par opposition aux arguments

Beaucoup d'éléments MathML nécessitent un nombre spécifique d'éléments enfants, ou donnent des significations supplémentaires aux enfants à certaines positions. Comme remarqué précédemment, ces types de contraintes sont spécifiques de MathML et elles ne peuvent pas entièrement se déterminer en utilisant la syntaxe et la grammaire XML. Lorsque les enfants d'un élément MathML donné sont soumis à ces autres types de contraintes, nous les désignerons souvent par des arguments et non simplement par des enfants, afin de mettre en exergue leur usage spécifique dans MathML. Remarquez, notamment dans le chapitre 3 Le balisage de présentation, que le terme argument est utilisé habituellement dans ce sens technique et se rapporte donc à un élément enfant, sauf indication contraire.

Dans les explications détaillées sur la syntaxe des éléments, fournies tout au long de la spécification MathML, le nombre des arguments nécessaires et leur ordre sont indiqués implicitement en donnant des noms aux arguments aux positions diverses. Ces informations apparaissent aussi pour les éléments de présentation dans le tableau des contraintes des arguments dans la section 3.1.3 Les arguments obligatoires et pour les éléments de contenu dans l'Annexe B La grammaire de validation du balisage de contenu.

Quelques éléments ont d'autres contraintes concernant le nombre ou le type des arguments. Ces contraintes supplémentaires sont décrites en même temps que les éléments individuels.

2.4.4 Les valeurs des attributs MathML

Selon la spécification du langage XML, les attributs donnés aux éléments doivent avoir l'une des formes suivantes :

nom-attribut = "valeur"

ou

nom-attribut = 'valeur'

où les blancs autour du caractère = sont optionnels.

Les noms d'attribut apparaissent généralement dans une police non proportionnelle dans le texte descriptif de cette spécification, comme c'est le cas pour les exemples.

La valeur d'un attribut, qui peut être généralement une chaîne de caractères arbitraires dans MathML, doit être entourée par une paire de guillemets doubles (« " ») ou bien de guillemets simples (« ' »). Le type de guillemet non employé pour entourer la valeur peut y être inclus.

MathML utilise une syntaxe plus compliquée pour les valeurs d'attribut que la syntaxe XML imposée par la définition DTD de MathML. Ces règles supplémentaires sont destinées aux applications MathML, et il y a condition d'erreur pour MathML quand elles sont transgressées, même si un traitement XML ne peut pas les respecter. La syntaxe MathML de chaque valeur d'attribut est définie dans le tableau d'attributs fournit avec la description de chaque élément, en recourant à une notation décrite ensuite. Lorsque les applications MathML traitent les valeurs d'attribut, les blancs sont ignorés sauf ceux qui séparent les séquences de lettres en mots, ou de chiffres en nombres. Les valeurs d'attribut peuvent contenir tous les caractères MathML listés dans la section 6.2 Les caractères MathML et permis par les restrictions syntaxiques d'un attribut. On peut inscrire directement les données textuelles dans les valeurs d'attribut, ou se servir de références d'entités comme décrit dans la section 6.2.1 Les données textuelles Unicode.

En particulier, on peut inclure les caractères « " », « ' », « & » et « < » dans les valeurs d'attribut MathML (à condition que la syntaxe de la valeur de l'attribut le permette) en utilisant, respectivement, les références d'entité « &quot; », « &apos; », « &amp; » et « &lt; ».

La définition de type de document (DTD) de MathML fournie dans l'Annexe A L'interprétation MathML déclare la plupart des valeurs d'attribut comme chaînes de type CDATA. Cela permet une meilleure interopérabilité avec les logiciels SGML et XML existants et l'extension des listes de valeurs prédéfinies. Des commentaires analogues s'appliquent aux schémas XML.

2.4.4.1 Les notations syntaxiques employées dans la spécification MathML

Afin de décrire la syntaxe MathML spécifique des valeurs d'attribut admissibles, on emploie les conventions et notations suivantes pour la plupart des attributs dans le présent document.

Notation Correspondance
number un entier décimal ou un nombre rationnel (une chaîne de chiffres avec un point décimal), commençant en option par un caractère « - »
unsigned-number un entier décimal ou un nombre réel, sans signe
integer un entier décimal, commençant en option par un caractère « - »
positive-integer un entier décimal, non signé et non nul
string une chaîne de caractères arbitraitres (toujours la valeur d'attribut en entier)
character un caractère seul, ni un blanc ni une référence d'entité MathML ; la séparation par des blancs est optionnelle
#rrggbb une valeur de couleur RGB ; par exemple, les trois paires de chiffres hexadécimaux dans #5599dd définissent des proportions de rouge, de vert et de bleu sur une échelle de x00 à xFF, ce qui correspond à un bleu ciel soutenu.
h-unit une unité de longueur horizontale (les unités admissibles sont listées après)
v-unit une unité de longueur verticale (les unités admissibles sont listées après)
css-fontfamily expliqué après dans la sous-section à propos de CSS
css-color-name expliqué après dans la sous-section à propos de CSS
autres mots en italiques expliqué dans le texte de chaque attribut
forme + une ou plusieurs instances de forme
forme * zéro à plusieurs instances de forme
f1 f2 ... fn une instance de chaque forme, en séquence, séparées éventuellement par des blancs
f1 | f2 | ... | fn l'une des formes indiquées
[ forme ] une instance optionnelle de forme
( forme ) pareil que forme
mot en texte brut ce mot tel qu'il apparaît littéralement dans la valeur de l'attribut (sauf s'il fait évidemment partie d'une phrase explicative)
symbole entre guillemets ce symbole tel qu'il apparaît littéralement dans la valeur de l'attribut (par exemple, "+" ou '+')

L'ordre de priorité des opérateurs de la syntaxe de notation (du plus au moins prioritaire) est le suivant :

Une chaîne peut contenir des caractères arbitraires qui peuvent être définis dans les valeurs d'attribut de type CDATA de XML. Cf. le chapitre 6 Les caractères, les entités et les fontes pour une explication et une liste complète des caractères MathML. Aucune règle de syntaxe MathML n'inclut de chaîne seulement comme une partie de la valeur d'un attribut, toujours comme la valeur en entier.

Les mots-clés et les nombres adjacents doivent être séparés par des blancs dans les valeurs réelles des attributs, à l'exception des identificateurs d'unité (indiqués par les symboles syntaxiques h-unit ou v-unit) qui suivent les nombres. Les caractères ne sont pas obligatoires sinon, mais il sont admis entre les atomes listés précédemment, sauf (pour compatibilité avec CSS) immédiatement avant les identificateurs d'unité, entre le signe - et les chiffres des nombres négatifs, et entre le caractère « # » et la forme rrggbb, ou rgb, d'une valeur de couleur.

Les valeurs d'attribut numériques des dimensions dépendant de la police courante peuvent être fournies en unités relatives aux polices ou en unités absolues nommées (décrites après dans une sous-section distincte). Les dimensions horizontales sont données conventionnellement en unité em et les verticales en unité ex, l'unité em ou ex suivant immédiatement le nombre. Par exemple, l'espacement horizontal entourant un opérateur, tel que +, s'exprime conventionnellement en em, quoiqu'on puisse utiliser d'autres unités. En général, il est préférable d'utiliser des unités relatives aux polices au lieu d'unités absolues, car les rendus divers pourront croître ou rétrécir en fonction du corps de la policte courante.

Pour la plupart des attributs numériques, seules sont significatives les valeurs d'un sous-ensemble de l'ensemble des valeurs exprimables ; les valeurs hors de ce sous-ensemble ne constituent pas des conditions d'erreur, sauf indication contraire, mais sont plutôt arrondies à la valeur supérieure ou inférieure la plus proche parmi les valeurs admissibles (au gré du moteur de rendu). L'ensemble des valeurs admissibles peut dépendre du moteur de rendu et il n'est pas défini par MathML.

Si une valeur numérique dans la description de la syntaxe d'une valeur d'attribut est déclarée comme admettant un signe moins -, par exemple, pour une valeur de type number ou integer, la présence d'un signe ne constituera pas une erreur de syntaxe si la valeur négative n'est pas significative. La valeur devrait plutôt être prise en charge par l'application traitante comme décrit dans le paragraphe précédent. Un signe plus + explicite n'est pas permis comme partie d'une valeur numérique, sauf quand il est listé spécifiquement dans la syntaxe (par un caractère entre guillemets '+' ou "+") et que sa présence peut changer la signification de la valeur de l'attribut (comme documenté pour chaque attribut où c'est permis).

Les symboles h-unit, v-unit, css-fontfamily et css-color-name sont expliqués dans les sous-sections suivantes.

2.4.4.2 Les attributs avec des unités

Certains attributs acceptent des longueurs horizontales ou verticales comme nombre suivi par un identificateur d'unité (souvent appelé juste unité). Les symboles de syntaxe h-unit et v-unit se rapportent, respectivement, à une unité de longueur horizontale et verticale. Les unités possibles et les longueurs auxquelles elles se rapportent apparaissent dans le tableau ci-dessous ; ce sont les mêmes pour les longueurs horizontales et verticales, mais on distingue les symboles de syntaxe dans les syntaxes des attributs afin de rappeler dans quelle direction chacun sert.

Les identificateurs d'unité et leur signification proviennent de CSS. Par contre, la syntaxe des nombres suivis d'un identificateur d'unité en MathML n'est pas identique à celle des valeurs de longueur avec unité des feuilles de style CSS, car les nombres CSS ne peuvent pas finir par un point décimal ni commencer par un signe +.

Les unités horizontales et verticales possibles en MathML sont les suivantes :

Identificateur d'unité Description de l'unité
em em (unité relative à la police, utilisée traditionnellement pour les longueurs horizontales)
ex ex (unité relative à la police, utilisée traditionnellement pour les longueurs verticales)
px pixels ou dimension en pixels de l'affichage courant
in pouce (1 pouce = 2.54 centimètres)
cm centimètre
mm millimètre
pt point (1 point = 1/72 pouce)
pc pica (1 pica = 12 points)
% pourcentage d'une valeur par défaut

Les unités de composition em et ex sont définies dans l'Annexe H Glossaire et expliquées plus en détails après dans les Autres remarques à propos des unités.

Un caractère % représente une unité relative ; lorsqu'on donne comme valeur d'attribut n% (pour toute valeur numérique n), la valeur indiquée correspond à la valeur par défaut définie pour la propriété à contrôler multipliée par n et divisée par 100. La valeur par défaut (ou la façon de l'obtenir lorsqu'elle n'est pas constante) est listée dans le tableau d'attributs de chaque élément, et sa signification est décrite dans la documentation suivante de l'attribut en question. (Le caractère % revêt une signification particulière dans la syntaxe de l'élément mpadded, qui ne l'admet pas comme identificateur d'unité).

Pour cohérence avec CSS, les unités de longueur en MathML sont rarement optionnelles. Quand c'est le cas, le symbole d'unité est englobé entre crochets dans la syntaxe de l'attribut, en suivant le nombre auquel il s'applique, par exemple, number [ h-unit ]. La signification d'une absence d'unité est fournie dans la documentation de chaque attribut ; en général, c'est parce que le nombre en question est un multiplicateur de la valeur par défaut de l'attribut. (Dans ces cas, un nombre nnn indiqué sans unité équivaut à indiquer le nombre nnn multiplié par 100 suivi par %. Par exemple, les définitions <mo maxsize="2"> ( </mo> et <mo maxsize="200%"> ( </mo> sont équivalentes).

Comme cas particulier (également pour cohérence avec CSS), une valeur numérique égale à 0 n'a pas besoin d'être suivie par un identificateur d'unité, même si la syntaxe définie ici l'exige. Dans ces cas, l'identificateur d'unité (ou son absence) n'importerait pas, puisque 0 fois n'importe quelle unité fait 0.

Pour la plupart des attributs dans cette spécification, on choisit pour unité de la valeur par défaut de l'attribut en question l'unité qui serait typiquement employée pour les décrire dans la composition ; lorsqu'on ne donne pas de valeur par défaut spécifique, l'unité typique sera habituellement indiquée dans le tableau de syntaxe ou dans la documentation de l'attribut. Les unités les plus communes sont le em et le ex. Toutefois, on peut utiliser n'importe quelle unité, sauf indication contraire avec un attribut particulier.

Autres remarques à propos des unités

Remarquez que certains attributs, par exemple, framespacing sur un élément <mtable>, peuvent contenir plusieurs valeurs numériques, chacune ayant sa propre unité.

Par convention, on utilise principalement l'unité relative à la police ex pour les longueurs verticales et l'unité em pour les longueurs horizontales, mais ce n'est pas obligatoire. Ces unités sont relatives à la police et au corps de la police qui servirait à rendre l'élément pour lequel la valeur d'attribut est indiquée, ce qui veut dire qu'on devrait interpréter l'élément après que des attributs comme fontfamily et fontsize auront été traités, lorsqu'ils apparaissent sur le même élément, car un changement de la police ou du corps de la police peut changer la longueur de l'une de ces unités.

La définition de la longueur de chaque unité, pas la syntaxe MathML des valeurs de longueur, est celle trouvée dans CSS, sauf si une police fournissait des valeurs spécifiques pour les unités em ou ex, différentes des valeurs définies par CSS (respectivement, le corps de la police et la hauteur-x), car les valeurs fournies seraient utilisées.

2.4.4.3 Les attributs compatibles avec CSS

Plusieurs attributs MathML, listés ensuite, correspondent de près aux propriétés de rendu textuel définies à l'origine dans [CSS1]. Dans MathML 1.01, les noms et valeurs de ces attributs s'alignaient sur la recommandation CSS là où c'était possible. Cela avait été fait pour que les moteurs de rendu en environnements CSS puissent y rechercher la propriété correspondante pour déterminer les valeurs par défaut des attributs.

La possibilité de fixer les propriétés de style à la fois via des attributs MathML et des feuilles de style CSS présente des inconvénients. Au mieux, c'est une source de confusion et, au pire, cela peut conduit à modifier involontairement la signification des équations à cause de l'application d'une feuille de style sur tout le document. Par conséquent, ces attributs sont à éviter. À leur place, MathML 2.0 introduit quatre nouveaux attributs de style mathématiques. Ces attributs utilisent des valeurs logiques pour mieux rendre compte des catégories abstraites des symboles pareils à des lettres employés par les mathématiques, et pour séparer plus nettement MathML et CSS. Cf. la section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques pour plus de précisions.

Pour référence, voici un tableau montrant la correspondance des attributs de style MathML 1.01 à éviter et leur contrepartie CSS :

Attribut MathML Propriété CSS Symbole de syntaxe Éléments MathML Consulter
fontsize font-size - atomes de présentation ; mstyle section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques
fontweight font-weight - atomes de présentation ; mstyle section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques
fontstyle font-style - atomes de présentation ; mstyle section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques
fontfamily font-family css-fontfamily atomes de présentation ; mstyle section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques
color color css-color-name atomes de présentation ; mstyle section 3.3.4 Le changement de style (mstyle)
background background css-color-name mstyle section 3.3.4 Le changement de style (mstyle)

Cf. également après la section 2.4.5 Les attributs communs à tous les éléments MathML pour une discussion à propos des attributs class, style et id à utiliser avec les feuilles de style.

L'ordre des attributs de traitement par opposition aux feuilles de style

Les feuilles de style CSS ou analogues peuvent définir des changements sur les propriétés de rendu des éléments MathML sélectionnés. Puisque les propriétés de rendu peuvent également être changées par les attributs d'un élément, ou changées automatiquement par le moteur de rendu, il est nécessaire de définir l'ordre dans lequel adviennent les changements induits par des sources diverses. Le traitement de l'attribut fontsize constitue un exemple d'ajustement automatique, comme expliqué dans la discussion sur scriptlevel dans la section 3.3.4 Le changement de style (mstyle). En cas de changements absolus, c'est-à-dire, fixer une nouvelle valeur de propriété indépendante de la valeur précédente (à opposer aux changements relatifs, tels qu'incrémentation ou multiplication par un facteur), seul le dernier changement absolu s'appliquera, et on devrait donc traiter les sources de changements en dernier.

Dans le cas de CSS, l'ordre de traitement des changements induits par les diverses sources qui affectent les propriétés de rendu d'un seul élément MathML devrait être le suivant :

(Les premiers changements sont les moins prioritaires)

(Les derniers changements sont les plus prioritaires)

Remarquez que l'ordre des changements dérivé des feuilles de style CSS est définit par la spécification CSS même (c'est l'ordre défini par CSS2). La justification suivante est seulement liée à la question de savoir où on devrait insérer, dans cet ordre préexistant, les changements causés par les réglages explicites des attributs MathML.

Justification : Les attributs de rendu MathML sont analogues aux attributs de rendu HTML, tel que align, et la section de la spécification CSS à propos de l'ordre de cascade les définit comme ayant la même priorité. En outre, ce choix des priorités permet aux lecteurs, en déclarant certains styles CSS importants, de décider lesquelles de leurs préférences de style primeront sur les réglages explicites des attributs MathML. Puisque les expressions MathML, qu'elles se composent d'éléments de présentation ou de contenu, sont d'abord prévues pour véhiculer une signification, dans laquelle le rôle de la graphie (le cas échéant) est majeur mais non essentiel, il est probable que les lecteurs invoqueront souvent la primauté de leurs préférences de style ; l'exception principale est celle d'un attribut de rendu devant altérer la signification véhiculée par une expression, ce qui n'est pas encouragé dans les attributs de présentation de MathML.

2.4.4.4 Les valeurs par défaut des attributs

Les valeurs par défaut des attributs MathML sont généralement indiquées dans le texte avec les descriptions détaillées des éléments spécifiques. Les valeurs par défaut sont littérales lorsqu'elles apparaissent avec une écriture normale dans les tableaux d'attributs des éléments (sauf si leur nature explicative est évidente) mais, lorsqu'elles sont en italiques, ce sont des descriptions sur la façon de les calculer.

Les valeurs par défaut décrites comme héritées se déduisent de l'environnement de rendu, comme décrit dans l'élément mstyle, ou parfois (cas décrits individuellement), des valeurs d'autres attributs des éléments environnants ou de parties de ces valeurs. La valeur utilisée sera toujours celle qui aurait pu être définie explicitement si elle avait été connue ; elle ne dépendra jamais du contenu ou des attributs de l'élément en question, seulement de son environnement (quoique, dans la pratique, la valeur utilisée puisse dépendre des attribut ou du contenu).

Les valeurs par défaut décrites comme automatiques devraient être calculées par le moteur de rendu de façon à produire un rendu de haute qualité ; la spécification MathML n'indique en général pas comment le faire. La valeur calculée sera toujours celle qui aurait pu être définie explicitement si elle avait été connue, mais cela dépendra généralement du contenu de l'élément et éventuellement de l'environnement de rendu.

Les autres descriptions de valeurs par défaut en italiques dans les tableaux d'attributs sont expliquées individuellement pour chaque attribut.

Les guillemets simples ou doubles, obligatoires autour des valeurs d'attribut dans une balise ouvrante XML, ne sont pas présents dans les tableaux de syntaxe des valeurs d'attribut de chaque élément, mais ils le sont avec les valeurs d'attribut des exemples dans le texte.

Remarquez, en général, qu'on ne pourra pas donner à un attribut MathML, hérité ou automatique, de valeur explicite qui simule l'effet de ne pas le définir du tout. Fournir explicitement les termes "inherited" ou "automatic" ne fonctionnera pas et n'est pas admis en général. En outre, même pour les attributs de présentation dont la valeur par défaut spécifique est documentée ici, on peut employer l'élément mstyle (cf. la section 3.3.4 Le changement de style (mstyle)) afin de changer la valeur par défaut des éléments qu'il contient. La définition DTD de MathML déclare donc la plupart des valeurs par défaut des attributs de présentation comme étant #IMPLIED, ce qui interdit aux préprocesseurs XML de leur rajouter une quelconque valeur par défaut spécifique. Ce point de vue est celui adopté dans le schéma MathML.

2.4.4.5 Les valeurs des attributs dans la définition DTD de MathML

Dans une définition DTD XML, on peut déclarer les valeurs d'attribut admises comme des chaînes générales ou on peut les contraindre de diverses façons, soit en énumérant les valeurs possibles, soit en les déclarant de types de données spéciaux. Le choix d'un type d'attribut XML détermine dans quelle mesure on peut effectuer des vérifications de validité avec une définition DTD.

La définition de type de document (DTD) de MathML définit des types d'attribut XML formels pour tous les attributs MathML, y compris parfois des énumérations de valeurs légitimes. Par contre, en général, la définition DTD de MathML est relativement permissive, en déclarant souvent les valeurs des attributs comme des chaînes, cela afin de fournir une interopérabilité avec les analyseurs SGML tout en permettant à plusieurs attributs d'un seul élément MathML d'accepter les mêmes valeurs (telles que "true" et "false") et afin aussi de permettre l'extension des listes de valeurs prédéfinies.

Dans le même temps, quoiqu'on puisse déclarer une valeur d'attribut en tant que chaîne dans la définition DTD, seules certaines valeurs sont légitimes en MathML, comme décrit précédemment et dans la suite de cette spécification. Par exemple, beaucoup d'attributs attendent des valeurs numériques. Dans les sections suivantes, on décrit les valeurs d'attribut permises pour chaque élément. Pour déterminer quand la définition DTD de MathML impose réellement ces contraintes, consultez l'Annexe A L'interprétation MathML. Toutefois, l'absence d'une contrainte dans la définition DTD n'implique pas que la contrainte est absente du langage MathML même, ou qu'elle ne sera pas appliquée par un moteur de rendu MathML particulier. (Cf. la section 7.2.2 La gestion des erreurs qui décrit comment les moteurs de rendu MathML devraient répondre aux erreurs MathML).

En outre, la définition DTD de MathML est fournie pour commodité ; bien que la définition soit conçue pour une entière compatibilité avec le texte de cette spécification, ce dernier fait autorité en cas de litiges. (Toute contradiction susceptible d'exister entre les divers chapitres de ce document devrait se résoudre à la faveur de la lecture, d'abord, du chapitre 6 Les caractères, les entités et les fontes puis des chapitres 3 Le balisage de présentation et 4 Le balisage de contenu, ensuite de la section 2.4 La grammaire et la syntaxe de MathML et enfin des autres parties du document). Pour le schéma MathML, c'est la même chose : la recommandation publiée prime. Bien que ce soit prévu ainsi, il reste une difficulté pratique. Si le système de traitement MathML se sert d'un analyseur validant, que la validation se fonde sur une définition DTD ou sur un schéma, le traitement s'interrompra probablement net en rencontrant une syntaxe considérée inexacte, tandis qu'un autre traitement MathML en harmonie totale avec la spécification interprétera correctement ou non cette partie.

2.4.5 Les attributs communs à tous les éléments MathML

Afin de faciliter une utilisation avec les mécanismes de feuille de style, tels que [XSLT] et [CSS2], tous les éléments MathML acceptent les attributs class, style et id en plus des attributs spécifiques décrits pour chaque élément. Les moteurs de rendu MathML sans gestion CSS peuvent ignorer ces attributs. MathML définit les valeurs de ces attributs comme étant des chaînes générales, quoique les syntaxes des mécanismes de feuille de style soient plus restrictives pour elles. C'est-à-dire que toutes les valeurs de ces attributs sont valides en MathML.

Afin de faciliter la compatibilité avec les mécanismes de liens, tous les éléments MathML acceptent l'attribut xlink:href.

Tous les éléments MathML acceptent également l'attribut xref à utiliser en balisage parallèle (cf. la section 5.3 Le balisage parallèle). L'attribut id sert aussi dans ce contexte.

Chaque élément MathML, du fait de l'héritage MathML 1.0, accepte également l'attribut à éviter other (cf. la section 7.2.3 Les attributs de données non définies), prévu pour passer des attributs non standards sans transgresser la définition DTD de MathML. Les moteurs de rendu MathML ne sont obligés de traiter cet attribut que s'ils répondent à des attributs MathML non standards. Toutefois, l'utilisation de l'attribut other est fortement déconseillée lorsque d'autres moyens existent déjà dans MathML pour passer des informations spécifiques.

Cf. également la section 3.2.2 Les attributs de style mathématiques communs aux éléments atomiques pour la liste des attributs MathML pouvant servir avec la plupart des éléments de présentation atomiques.

2.4.6 La rétractation des blancs en entrée

MathML ignore les blancs qui apparaissent en-dehors des éléments atomiques. Hormis les blancs, aucun caractère n'y est autorisé. Les blancs apparaissant dans le contenu des éléments atomiques sont rognés aux extrêmités, c'est-à-dire que tous les blancs au début et à la fin du contenu sont supprimés. Les blancs internes au contenu des éléments MathML se rétractent canoniquement, c'est-à-dire que chaque séquence composée d'un ou de plusieurs blancs est remplacée par un seul caractère espace (appelé parfois caractère blanc).

Dans MathML, comme dans XML, un blanc désigne une espace, une tabulation, un saut de ligne ou un retour chariot, c.à.d., les caractères avec les codes hexadécimaux Unicode respectifs U+0020, U+0009, U+000A ou U+000D.

Par exemple, les expression <mo> ( </mo> et <mo>(</mo> sont équivalentes, et :

<mtext>
  Théorème
  1 :
</mtext>

Équivaut à : <mtext>Théorème 1 :</mtext>.

Les auteurs souhaitant coder des blancs au début ou à la fin du contenu d'un atome, ou en séquence autre qu'une seule espace, sans qu'ils soient ignorés, doivent se servir de l'entité &nbsp; ou d'autres entités non écrites blanches, comme décrit dans la section 6.2.4 Les caractères invisibles. Par exemple, comparons les deux versions suivantes :

<mtext>
 Théorème
  1 :
</mtext>

avec

<mtext>
&nbsp;Théorème&nbsp;1 : 
</mtext> 

Pour le rendu du premier exemple : aucun blanc avant Théorème, une espace entre Théorème et 1 : et aucun blanc après 1 :. Dans le second exemple : une seule espace rendue avant Théorème, deux espaces avant 1 : et aucun blanc après.

Remarquez que l'attribut xml:space ne s'applique pas dans cette situation, puisque les processeurs XML passent les blancs dans les atomes aux processeurs MathML ; ce sont les règles de traitement MathML qui définissent le rognage et la rétractation des blancs.

On devrait utiliser l'élément mspace pour les blancs présents hors du contenu des éléments atomiques mi, mn, mo, ms, mtext, ci, cn et annotation, par opposition à l'élément mtext qui ne contient que des entités de blancs.

Table des matières : Le langage de balisage mathématique (MathML) version 2.0
Chapitre précédent : 1 Introduction
Chapitre suivant : 3 Le balisage de présentation