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.
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.
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.
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:
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.
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.
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:
ci
e cn
csymbol
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:
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
. csymbol
.
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. semantics
.
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].
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>
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.
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>⁢</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.
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>⁢</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.
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">⁢</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.
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">⁢</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à.)
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.
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 nella notazione francese equivale a 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].
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
.
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