5 Combinare marcatura di presentazione e di contenuto

Descrizione sommaria: Linguaggio di Marcatura Matematica (MathML) Versione 2.0
Precedente: 4 Marcatura di contenuto
Successivo: 6 Caratteri, entità e font
 
5 Combinare marcatura di presentazione e di contenuto
5.1 Perché due tipi diversi di marcatura?
5.2 Marcatura mista
   5.2.1 Ragioni per mescolare la marcatura
   5.2.2 Combinazioni proibite
   5.2.3 Marcatura di presentazione nella marcatura di contenuto
   5.2.4 Marcatura di contenuto nella marcatura di presentazione
5.3 Marcatura parallela
   5.3.1 Marcatura parallela di livello principale
   5.3.2 Marcatura parallela raffinata
   5.3.3 Marcatura parallela tramite riferimenti incrociati: id e xref
   5.3.4 Riferimenti incrociati di annotazione con XLink: id e href
5.4 Strumenti, fogli di stile e macro per la marcatura combinata
   5.4.1 Fogli di stile notazionali
   5.4.2 Trasformazioni fedeli al contenuto
   5.4.3 Fogli di stile per estensioni

La marcatura di presentazione e quella di contenuto possono essere combinate in due modi. La prima maniera è di mischiare elementi di contenuto e di presentazione in quello che è essenzialmente un singolo albero. Questa è detta marcatura mista. Il secondo modo è fornire sia una presentazione esplicita che un contenuto esplicito in due alberi, Questa è detta marcatura parallela. Questo capitolo descrive sia la marcatura mista che quella parallela, e come possono essere usate in congiunzione con i fogli di stile ed altri strumenti.

5.1 Perché due tipi diversi di marcatura?

I capitoli 3 e 4 descrivono due tipi di marcatura per codificare materiale matematico nei documenti.

La marcatura di presentazione cattura la struttura notazionale. Essa codifica la struttura notazionale di un'espressione in un modo sufficientemente astratto per facilitare la presentazione ai vari mezzi. Perciò la stessa marcatura di presentazione può essere riprodotta con relativa facilità su schermo in finestre ampie o strette, in ASCII o con la grafica, in stampa, o può essere enunciata in modo sensato a parole. Questo viene fatto fornendo informazioni come il raggruppamento strutturato di parti dell'espressione, la classificazione di simboli, ecc.

La marcatura di presentazione non si preoccupa direttamente della struttura matematica o del significato di un'espressione. In molte situazioni la struttura notazionale e la struttura matematica sono strettamente collegate, così un'applicazione di elaborazione raffinata può inferire euristicamente il significato matematico dalla struttura notazionale, ammesso che il contesto sia sufficientemente noto. Comunque, in pratica, l'inferenza del significato matematico dalla notazione matematica deve spesso essere lasciato al lettore.

Impiegare soltanto tag di presentazione può limitare l'abilità di riutilizzare un oggetto MathML in un altro contesto, particolarmente la valutazione da applicazioni esterne.

La marcatura di contenuto cattura la struttura matematica. Essa codifica la struttura matematica in un modo sufficientemente regolare per agevolare l'assegnamento del significato matematico ad un'espressione da parte dei programmi applicativi. Nonostante i dettagli della mappatura dalla struttura di un'espressione matematica al significato matematico possano essere estremamente complessi, in pratica, c'è un ampio accordo sul significato convenzionale di molti costrutti matematici fondamentali. Di conseguenza, gran parte del significato di un'espressione di contenuto è facilmente accessibile ad un'applicazione di elaborazione, indipendentemente da dove o come è visualizzata al lettore. In molti casi la marcatura di contenuto può essere tagliata da un browser Web e incollata in uno strumento software matematico confidando che saranno calcolati valori ragionevoli.

Poiché la marcatura di contenuto non si preoccupa direttamente di come viene visualizzata un'espressione, un riproduttore può inferire come un'espressione deve essere presentatata al lettore. Sebbene un riproduttore abbastanza sofisticato e il meccanismo dei fogli di stile possano in principio permettere ad un utente di leggere documenti matematici usando preferenze notazionali personalizzate, in pratica, presentare le espressioni di contenuto con sfumature notazionali può ancora richiedere un intervento di qualche tipo.

Impiegare soltanto i tag di contenuto può limitare la possibilità dell'autore di controllare in modo preciso come è presentata un'espressione.

Sia i tag di contenuto che quelli di presentazione sono necessari per fornire la piena capacità espressiva che ci si aspetta in un linguaggio di marcatura matematica. Spesso la stessa notazione matematica è usata per rappresentare vari concetti completamente diversi. Per esempio, la notazione xi può essere intesa (nell'algebra polinomiale) come la potenza i-esima della variabile x, o come la componente i-esima di un vettore x (nel calcolo tensoriale). In altri casi, lo stesso concetto matematico può essere visualizzato in varie notazioni. Per esempio, il fattoriale di un numero può essere espresso con un punto esclamativo, con una funzione Gamma o con un simbolo di Pochhammer.

Perciò la stessa notazione può rappresentare varie idee matematiche, e, viceversa, la stessa idea matematica spesso ha varie notazioni. Per fornire agli autori la possibilità di controllare in modo preciso la notazione e contemporaneamente di codificare i significati in un modo leggibile da una macchina sono necessarie sia la marcatura di contenuto che quella di presentazione.

In generale, se è importante controllare esattamente come è presentata un'espressione sarà più soddisfacente la marcatura di presentazione. Se è importante che il significato di un'espressione sia interpretato in modo affidabile ed automatico, allora sarà più soddisfacente la marcatura di contenuto.

5.2 Marcatura mista

Il MathML offre agli autori elementi per la marcatura sia di contenuto che di presentazione. Se usare l'una o l'altra, o una combinazione di entrambe, dipende da quali aspetti della presentazione e dell'interpretazione un autore desidera controllare, e da quali tipi di riutilizzo desidera facilitare.

5.2.1 Ragioni per mescolare la marcatura

In molte situazioni comuni un autore o uno strumento di creazione può scegliere di generare esclusivamente marcatura di presentazione o di contenuto. Per esempio, un programma per tradurre documenti esistenti molto probabilmente genererà marcatura di presentazione pura. In modo simile, un pacchetto di software educativo genererà molto probabilmente solo marcatura di contenuto per la valutazione in un sistema di computer algebra. Comunque, in molte altre situazioni, ci sono vantaggi a mescolare marcatura di presentazione e di contenuto in una singola espressione.

Se un autore è orientato principalmente alla presentazione, mischiando un po' di marcatura di contenuto produrrà spesso risultati più accessibili e più facili da riutilizzare. Per esempio, un autore che scrive di algebra lineare potrebbe scrivere:

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

dove v è un vettore e l'apice denota una componente vettoriale, e x è una variabile reale. Nel contesto dell'algebra lineare, un lettore visivamente svantaggiato può avere istruito il suo software di sintesi vocale per presentare gli apici come componenti vettoriali. Codificando esplicitamente la potenza, la marcatura di contenuto restituisce una presentazione vocale molto migliore di quella che probabilmente si avrebbe come predefinita.

Se un autore è principalmente orientato al contenuto, ci sono due ragioni per mischiare la marcatura di presentazione. Primo, usare la marcatura di presentazione fornisce un modo per modificare o raffinare come è presentata un'espressione di contenuto. Per esempio, si può scrivere:

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

In questo caso, l'uso della marcatura di presentazione incorporata permette all'autore di specificare che v deve essere presentato in grassetto. Allo stesso modo, a volte è il caso che si desidera una notazione completamente diversa per un'espressione di contenuto. Per esempio, qui esprimiamo un fatto sui fattoriali, n = n!/(n-1)!, usando la notazione dei fattoriali a crescere:

<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><mchar name="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><mchar name="OverBar"/></mo>
              </mover>
           </msup>
        </annotation-xml>
     </semantics>
   </apply>
</apply>

Questa espressione di contenuto verrebbe presentata con la notazione data come: \frac{1^{\bar{n}}}{1^{\frac{}{n-1}}}

Una seconda ragione per usare la presentazione nella marcatura di contenuto è che c'è un elenco continuamente in crescita di aree della conversazione che non hanno elementi di contenuto predefiniti per codificare i loro oggetti e i loro operatori. Come conseguenza, ogni sistema di marcatura di contenuto ha inevitabilmente bisogno di un meccanismo di estensione che combina la notazione con la semantica in qualche modo. La marcatura di contenuto del MathML specifica vari modi di allegare definizioni di semantica esterne ad oggetti di contenuto. E' necessario, comunque, usare la marcatura di presentazione del MathML per specificare come dovrebbero essere presentate tali estensioni semantiche definite dall'utente.

Per esempio, l'operatore `rango' dell'algebra lineare non è incluso come elemento di contenuto MathML predefinito. Perciò, per esprimere la frase rank(uTv)=1 usiamo un elemento semantics per associare una definizione semantica al simbolo rank.

<apply>
  <eq/>
  <apply>
    <fn>
      <semantics>
        <mi>rank</mi>
        <annotation-xml encoding="OpenMath">
          <OMS cd="linalg3" name="rank"/>
        </annotation-xml>
      </semantics>
    </fn>
    <apply> 
      <times/> 
      <apply> <transpose/> <ci>u</ci> </apply> 
      <ci>v</ci> 
    </apply>
  </apply>
  <cn>1</cn>
</apply>

In questo esempio la semantica di rank è stata data usando un simbolo di un dizionario di contenuto (CD) OpenMath.

5.2.2 Combinazioni proibite

La considerazione principale quando la marcatura di presentazione e quella di contenuto sono mescolate insieme in una singola espressione è che il risultato deve ancora avere senso. Quando entrambi i tipi di marcatura sono contenuti in un'espressione di presentazione vuol dire che dovrebbe essere possibile presentare l'espressione mista risultante in modo semplice e sensato. Viceversa, quando la marcatura mista appare in un'espressione di contenuto dovrebbe essere possibile assegnare in modo semplice e sensato un'interpretazione semantica all'espressione nell'insieme. Queste richieste pongono alcuni vincoli naturali a come la marcatura di presentazione e di contenuto possono essere mescolate in una singola espressione, per evitare espressioni ambigue o altrimenti problematiche.

Due esempi illustrano i tipi di problemi che devono essere evitati nella marcatura mista. Consideriamo:

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

In questo esempio l'elemento di contenuto bvar è stato incorporato indiscriminatamente in un'espressione di presentazione. Poiché bvar richiede di essere incluso in un contesto per avere significato, questa espressione non è chiara.

In modo simile, consideriamo:

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

Qui l'elemento mo è problematico. Un riproduttore dovrebbe inferire che si intende il normale operatore aritmetico, e agire come se fosse stato usato l'elemento prefisso di contenuto plus? O dovrebbe essere letteralmente interpretato come l'operatore x applicato a due argomenti, <mo>+</mo> e <mi>y</mi> ? Anche se decidessimo che <mo>+</mo> è l'operatore, allora quale dovrebbe essere il suo significato? Queste domande non hanno risposte particolarmente convincenti, così questo tipo di misto di marcatura di contenuto e di presentazione è ugualmente proibito.

5.2.3 Marcatura di presentazione nella marcatura di contenuto

L'uso della marcatura di presentazione nella marcatura di contenuto è limitato a situazioni che non hanno effetto sulla possibilità della marcatura di contenuto di codificare in modo non ambiguo il significato matematico. Specificamente, la marcatura di presentazione può apparire nella marcatura di contenuto soltanto in tre modi:

  1. all'interno degli elementi token ci e cn
  2. all'interno dell'elemento csymbol
  3. all'interno dell'elemento semantics

Qualunque altra marcatura di presentazione che occorre all'interno di marcatura di contenuto è un errore MathML. Segue una discussione più dettagliata di questi tre casi:

Marcatura di presentazione all'interno di elementi token.
Gli elementi token ci e cn possono contenere qualunque sequenza di caratteri MathML (definiti nel Capitolo 6 [Caratteri, entità e font]), elementi di presentazione ed elementi sep vuoti. Blocchi contigui di caratteri MathML negli elementi ci e cn sono riprodotti come se fossero inclusi rispettivamente in elementi mi e mn. Se un elemento token contiene sia caratteri MathML che elementi di presentazione, blocchi contigui di caratteri MathML (se ce ne sono) sono trattati come se inclusi in elementi mi o mn come appropriato, e la collezione di elementi di presentazione risultante è presentata come se inclusa in un elemento mrow.
Marcatura di presentazione all'interno dell'elemento csymbol.
L'elemento csymbol può contenere o caratteri MathML mischiati con marcatura di presentazione o elementi di contenuto di tipo contenitore. E' un errore MathML che un elemento csymbol contenga elementi sia di presentazione che di contenuto. Quando l'elemento csymbol contiene sia dati che marcatura di presentazione si dovrebbero usare le stesse regole di riproduzione che si applicano ad elementi di contenuto del tipo token.
Marcatura di presentazione all'interno dell'elemento semantics.
Uno degli obiettivi principali dell'elemento semantics è di fornire un meccanismo per incorporare espressioni MathML arbitrarie in marcatura di contenuto in modo semanticamente significativo. In particolare, ogni espressione di presentazione valida può essere incorporata in un'espressione di contenuto ponendola come primo figlio di un elemento semantics. Il significato di questa espressione dovrebbe essere indicato da uno o più elementi di annotazione contenuti a loro volta nell'elemento semantics. La presentazione consigliata per un elemento semantics è discussa nella Sezione 4.2.6 [Sintassi e semantica].

5.2.4 Marcatura di contenuto nella marcatura di presentazione

Il principio guida per incorporare la marcatura di contenuto all'interno di espressioni di presentazione è che l'espressione risultante abbia ancora una presentazione non ambigua. In generale, questo vuol dire che le espressioni di contenuto incorporate devono essere semanticamente significative, poiché la presentazione della marcatura di contenuto dipende dal suo significato.

Certi elementi di contenuto derivano parte del loro significato semantico dal contesto che li circonda, come ad esempio se un elemento bvar qualifica un integrale, un quantificatore logico o un'espressione lambda. Un altro esempio sarebbe se un elemento degree occorre in un elemento root o in un elemento partialdiff. Perciò, in un contesto di presentazione, simili elementi non hanno un significato chiaramente definito, e quindi non c'è una scelta ovvia per una presentazione. Di conseguenza non sono permessi.

Usando la terminologia della Sezione 4.2.1 [Descrizione sommaria della sintassi e dell'uso], vediamo che gli elementi operatore, relazione, contenitore, costante e simbolo hanno senso di per sé, mentre elementi del tipo qualificatore e condizione no. (Si noti che interval può essere usato o come contenitore generico o come qualificatore.)

Al di fuori di queste categorie, certi elementi meritano commenti specifici: gli elementi declare, sep, annotation e annotation-xml possono apparire soltanto in contesti molto specifici e di conseguenza non sono permessi come sottoespressioni dirette di ogni elemento di presentazione. Infine l'elemento semantics porta con sé informazioni sufficienti per essere permesso nella presentazione.

L'elenco completo degli elementi di contenuto che non possono apparire come figli in un elemento di presentazione è: annotation, annotation-xml, sep, declare, bvar, condition, degree, logbase, lowlimit, uplimit.

Si noti che all'interno della marcatura di presentazione, le espressioni di contenuto possono apparire soltanto in posti dove è permesso che appaia qualunque espressione MathML. In particolare, le espressioni di contenuto non possono apparire all'interno di elementi token di presentazione. Riguardo a ciò mescolare presentazione e contenuto sono casi asimmetrici.

Si noti che incorporare la marcatura di contenuto nella presentazione spesso richiederà che le applicazioni presentino gli operatori fuori da un contesto apply. Es., può essere necessario presentare abs, plus, root o sin fuori da un'applicazione. Mescolare contenuto e presentazione non introduce nuove richieste, comunque, poiché gli operatori non applicati sono già permessi in espressioni di contenuto, ad esempio:

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

5.3 Marcatura parallela

Alcune applicazioni riescone a fare uso di entrambe le informazioni di presentazione e di contenuto. Per queste applicazioni è desiderabile fornire entrambe le forme di marcatura per la stessa espressione matematica. Questa è detta marcatura parallela.

La marcatura parallela si ottiene con l'elemento semantics. La marcatura parallela per un'espressione può essere usata da sola, o può essere incorporata come parte di un albero di contenuto o di presentazione più grande.

5.3.1 Marcatura parallela di livello principale

In molti casi ciò che si vuole è fornire marcatura di presentazione e marcatura di contenuto per un'espressione matematica nel complesso. Per fare ciò si usa un singolo elemento semantics accoppiando due alberi di marcatura, dove il primo ramo è la marcatura di presentazione MathML e il secondo ramo è la marcatura di contenuto MathML.

Il seguente esempio codifica l'espressione aritmetica booleana (a+b)(c+d) in questo modo.

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

Questo esempio è non banale nel senso che la marcatura di contenuto non potrebbe essere derivata facilmente soltanto dalla marcatura di presentazione.

5.3.2 Marcatura parallela raffinata

L'accoppiamento a livello principale di marcatura di presentazione e di contenuto indipendenti è sufficiente per molte situazioni, ma non per tutte. Le applicazioni che permettono il trattamento di sottoespressioni di oggetti matematici richiedono la capacità di associare presentazione, contenuto o informazioni con le parti di un oggetto con marcatura matematica. L'accoppiamento ad alto livello con un elemento semantics è insufficiente in questo tipo di situazioni; l'identificazione di una sottoespressione in un ramo dell'elemento semantics non dà indicazioni sulle parti corrispondenti negli altri rami.

La capacità di identificare le sottoespressioni corrispondenti è richiesta in applicazioni come i programmi di scrittura di espressioni matematiche. In questa situazione, scegliere una sottoespressione su un display visuale può identificare una particolare porzione dell'albero della marcatura di presentazione. L'applicazione ha poi bisogno di determinare le annotazioni corrispondenti delle sottoespressioni; in particolare l'applicazione ha bisogno delle sottoespressioni dell'albero annotation-xml nella notazione di contenuto MathML.

E' possibile in linea di principio fornire annotazioni per ogni nodo di presentazione incorporando ricorsivamente elementi 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>

Per essere completo questo esempio dovrebbe essere molto più prolisso, avvolgendo ciascuna delle foglie mi, mo e mn in altri sette elementi semantics.

Questo approccio è molto generico e funziona per tutti i tipi di annotazioni (comprese le annotazioni non MathML e le annotazioni multiple). Porta, comunque, a un aumento di O(n2) nella dimensione del documento. Questo non è perciò un approccio adatto per la marcatura parallela raffinata di grandi oggetti.

5.3.3 Marcatura parallela tramite riferimenti incrociati: id e xref

Per accontentare meglio le applicazioni che devono trattare con sottoespressioni di grandi oggetti il MathML usa i riferimenti incrociati tra i rami di un elemento semantics per identificare le sottostrutture corrispondenti.

I riferimenti incrociati si ottengono usando gli attributi id e xref all'interno dei rami di un elemento semantics che li contiene. Questi attributi possono essere posti opzionalmente su elementi MathML di qualunque tipo.

L'esempio seguente mostra l'uso dei riferimenti incrociati per l'espressione aritmetica booleana (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 attributo id e un corrispondente xref che appaiono nello stesso elemento semantics creano una corrispondenza tra sottoespressioni.

Creando queste corrispondenze con i riferimenti incrociati, tutti gli attributi id a cui fa riferimento un qualche xref devono essere nello stesso ramo di un elemento semantics che li racchiude. Questo vincolo garantisce che queste corrispondenze non creino involontariamente cicli. (Si noti che questa restrizione non esclude l'uso di attributi id negli altri rami dell'elemento semantics di chiusura. Esclude, comunque, riferimenti ad altri attributi id che hanno origine nello stesso elemento semantics.)

Non ci sono restrizioni su quale ramo dell'elemento semantics può contenere gli attributi id di destinazione. Spetta all'applicazione determinare quale ramo usare.

In generale, non ci sarà una corrispondenza univoca tra nodi nei rami paralleli. Per esempio, un albero di presentazione può contenere elementi, come parentesi, che non hanno un corrispondente nell'albero di contenuto. E' perciò spesso utile mettere gli attributi id nel ramo con la struttura dei nodi più raffinata. Tutti gli altri rami avranno poi attributi xref che punteranno a un qualche sottoinsieme degli attributi id.

In assenza di altri criteri, il primo ramo dell'elemento semantics è una scelta ragionevole per contenere gli attributi id. Le applicazioni che aggiungono o rimuovono le annotazioni non dovranno allora riassegnare gli attributi agli alberi semantics.

In generale l'uso degli attributi id e xref permette che nel testo sia data una corrispondenza completa tra sottoespressioni al più maggiore dell'originale di un fattore costante. La direzione dei riferimenti non deve essere scelta in modo da implicare che la selezione di una sottoespressione si intenda permessa solo su un figlio dell'elemento semantics. E' altrettanto possibile scegliere un sottoalbero in un ramo qualunque e risalire ai sottoalberi corrispondenti negli altri rami.

5.3.4 Riferimenti incrociati di annotazione con XLink: id e href

E' possibile dare riferimenti incrociati tra un'espressione MathML e un'annotazione XML non MathML usando il protocollo XLink [XLink]. Come esempio, l'espressione booleana della sezione precedente può essere annotata con OpenMath e collegata come segue:

<semantics>
  <mrow id="E">
    <mrow id="E.1" xlink: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">
    <OMA xlink:href="id('E')" xmlns="www.openmath.org/OpenMath">
      <OMS cd="logic1" name="and" xlink:href="id('E')"/>
      <OMA xlink:href="id('E.1')">
        <OMS cd="logic1" name="xor" xlink:href="id('E.1.3')"/>
        <OMV name="a" xlink:href="id('E.1.2')"/>
        <OMV name="b" xlink:href="id('E.1.4')"/>
      </OMA>
      <OMA xlink:href="id('E.3')">
        <OMS cd="logic1" name="xor" xlink:href="id('E.3.3')"/>
        <OMV name="c" xlink:href="id('E.3.2')"/>
        <OMV name="d" xlink:href="id('E.3.4')"/>
      </OMA>
    </OMA>
  </annotation-xml>
</semantics>

Qui OMA, OMS e OMV sono elementi definiti nello standard OpenMath per rappresentare rispettivamente un'applicazione, un simbolo e una variabile.

(Si noti che l'applicazione può o meno avere un meccanismo per estendere le DTD. Sarà perciò il caso che qualche applicazione darà XML ben formato ma non "valido" all'interno degli elementi annotation-xml. Di conseguenza alcune applicazioni MathML che usano annotation-xml non saranno convalidate. L'uso degli Schemi XML offre maggiore flessibilità.)

5.4 Strumenti, fogli di stile e macro per la marcatura combinata

L'interazione della marcatura di contenuto con quella di presentazione può essere ampiamente estesa con l'uso di vari strumenti. Sebbene l'insieme degli strumenti e degli standard per lavorare con applicazioni XML sia attualmente in rapida evoluzione, possiamo già delineare alcune tecniche specifiche.

In generale l'interazione di contenuto e presentazione è gestita tramite regole di trasformazione sugli alberi MathML. Queste regole di trasformazione sono a volte chiamate `macro'. In linea di principio, tali regole possono essere espresse usando uno qualunque dei vari meccanismi, compresi i DSSSL, i programmi Java che operano su un DOM, ecc. Anticipiamo, comunque, che il meccanismo principale per queste trasformazioni nella maggior parte delle applicazioni sarà l'XSLT.

In questa sezione discutiamo regole di trasformazione per due fini specifici: per i fogli di stile notazionali e per semplificare la marcatura parallela.

5.4.1 Fogli di stile notazionali

Gli autori che fanno uso della marcatura di contenuto possono dover esporre i loro documenti in ambienti con convenzioni notazionali diverse dalla riproduzione predefinita del contenuto. Ci si aspetta perciò che siano usati strumenti di trasformazione per determinare notazioni per gli elementi di contenuto nelle diverse impostazioni. Certi elementi, es. lambda, mean e transpose, hanno notazioni comuni che variano ampiamente e spesso richiederanno una selezione notazionale. Alcuni esempi di variazioni notazionali sono dati in seguito.

Per altri elementi, per esempio plus e sin, sarà meno probabile che siano richieste queste caratteristiche.

Si osserva che la selezione dello stile notazionale a volte è necessaria per la corretta comprensione dei documenti a seconda dell'ambiente. Per esempio, il coefficiente binomiale C^n_m nella notazione francese equivale a C^m_n nella notazione russa.

Un modo naturale per un'applicazione MathML per associare una notazione particolare all'insieme dei tag di contenuto è con un foglio di stile XSLT [XSLT]. Gli esempi di questa sezione assumeranno che sia questo il meccanismo per esprimere le scelte di stile. (Altre scelte sono ugualmente possibili, ad esempio un programma applicativo può fornire menu che offrono un numero di scelte di presentazione per tutti i tag di contenuto.

Quando si scrivono fogli di stile XSLT per la notazione matematica, alcune regole di trasformazione possono essere puramente locali, mentre altre richiederanno un contesto a più nodi per determinare la corretta notazione per l'uscita. L'esempio seguente dà una regola di trasformazione locale che potrebbe essere inclusa in un foglio di stile notazionale che visualizza gli intervalli aperti come ]a,b[ piuttosto che come (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>
  </mrow>
</xsl:template>

Qui con m si intende lo spazio di nomi MathML.

Un esempio di regola che richiede informazioni sul contesto è:

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

Altri esempi di trasformazioni dipendenti dal contesto potrebbero essere per esempio l'applicazione (apply) di un'addizione (plus) da presentare a-b+c, piuttosto che a+ -b+c, o l'applicazione (apply) di una potenza (power) da presentare sin2x, piuttosto che sin x2.

Le variazioni notazionali occorreranno sia per gli elementi di contenuto predefiniti che per le estensioni. Lo stile notazionale per le estensioni può essere gestito nel modo sopra descritto, con regole che hanno lo stesso nome dei tag delle estensioni, e con la gestione del contenuto (in un foglio di stile fedele al contenuto) come descritto nella Sezione 5.4.3 [Fogli di stile per estensioni].

5.4.2 Trasformazioni fedeli al contenuto

Si può essere tentati di vedere i fogli di stile notazionali come una trasformazione della marcatura di contenuto in marcatura di presentazione equivalente. Questo punto di vista è esplicitamente scoraggiato, poiché l'informazione andrebbe persa e applicazioni orientate al contenuto potrebbero non funzionare correttamente.

Definiamo una trasformazione `fedele al contenuto' come una trasformazione che conserva il contenuto originale nella marcatura parallela (Sezione 5.3 [Marcatura parallela]).

Gli strumenti che supportano il MathML devono essere `fedeli al contenuto', e non convertire gratuitamente gli elementi di contenuto in elementi di presentazione nella loro elaborazione. I fogli di stile notazionali devono essere fedeli al contenuto quando potrebbero essere usati in applicazioni interattive.

E' possibile scrivere fogli di stile fedeli al contenuto in vari modi. La marcatura parallela di livello principale può essere ottenuta incorporando le seguenti regole in un foglio di stile XSLT:

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

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

La notazione sarà generata da regole aggiuntive per produrre la presentazione dal contenuto, come quelle nella Sezione 5.4.1 [Fogli di stile notazionali]. La marcatura parallela raffinata si può ottenere con regole aggiuntive per trattare gli attributi id.

5.4.3 Fogli di stile per estensioni

I tag di presentazione del MathML formano un vocabolario chiuso di strutture notazionali, ma sono piuttosto ricchi e possono essere usati per esprimere la presentazione della maggior parte delle notazioni matematiche. Notazioni complesse possono essere ottenute componendo gli elementi fondamentali forniti per la marcatura di presentazione. In questo senso l'abilità di presentazione del MathML è espandibile. E' spesso utile, comunque, dare un nome ai nuovi schemi notazionali se saranno usati spesso. Per esempio, possiamo abbreviare e rendere più chiaro l'esempio del fattoriale a crescere della Sezione 5.2.1 [Ragioni per mescolare la marcatura], con una regola che sostituisce

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

con

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

Allora l'esempio verrebbe scritto più chiaramente come:

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

In modo simile, i tag di contenuto formano un vocabolario di concetti fisso che copre i tipi della matematica incontrati nelle applicazioni più comuni. Non è ragionevole aspettarsi che gli utenti compongano i tag di contenuto MathML esistenti per costruire nuovi concetti di contenuto. (Questo approccio presenta molte difficoltà tecniche anche per matematici professionisti.) Invece, è anticipato che le applicazioni i cui concetti di contenuto matematico si estendono oltre ciò che è offerto dal MathML useranno annotazioni all'interno di elementi semantics, e che queste annotazioni useranno linguaggi per la descrizione del contenuto esterni al MathML.

Spesso il dare un nome ad una notazione e l'identificazione di un nuovo concetto semantico sono correlati. Questo permette che una singola regola di trasformazione catturi sia la marcatura di presentazione che di contenuto per un'espressione. Questa è una delle parti del MathML che trae maggior beneficio dall'uso dell'elaborazione delle macro.

<mx:rank/>

e

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

sono trasformati rispettivamente in

<semantics>
   <ci><mo>rank</mo></ci>
   <annotation-xml encoding="OpenMath">
      <OMS cd="linalg1" name="rank"/>
   </annotation-xml>
</semantics>

e

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

Il lungo esempio di codifica di rank(uTv)=1, dalla Sezione 5.2.1 [Ragioni per mescolare la marcatura] potrebbe allora essere condensato in

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

Da questo esempio vediamo come la combinazione di marcatura di presentazione e di contenuto potrebbe diventare molto più semplice ed efficace da generare man mano che le librerie standard per i fogli di stile diverranno disponibili.

Descrizione sommaria: Linguaggio di Marcatura Matematica (MathML) Versione 2.0
Precedente: 4 Marcatura di contenuto
Successivo: 6 Caratteri, entità e font