Issue update_schema | wiki (member only) |
---|---|
DTD and W3C XML Schema | |
DTD and W3C XML Schema need updating to MathML3 |
|
Resolution | None recorded |
A MathML document must be a well-formed XML document using elements in the MathML namespace as defined by this specification, however it is not required that the document refer to any specific Document Type Definition (DTD) or schema that specifies MathML. It is sometimes advantagous not to specify such a language definition as these files are large, often much larger than the MathML expression and unless they have been previously cached by the MathML application, the time taken to fetch the DTD or schema may have an appreciable effect on the processing of the MathML document.
Note also that if no DTD is specified with a DOCTYPE declaration, that entity references (for example to refer to MathML characters by name) may not be used. The document should be encoded in an encoding (for example UTF-8) in which all needed characters may be encoded as character data, or characters may be referenced using numeric character references, for example ∫ rather than ∫
If a MathML fragment is parsed without a DTD, in other words as a well-formed XML fragment, it is the responsibility of the processing application to treat the white space characters occurring outside of token elements as not significant.
However, in many circumstances, especially while producing or editing MathML, it is useful to use a language definition, to constrain the editing process or to check the correctness of generated files. The following section, Section A.2 Using the RelaxNG Schema for MathML3, discusses the RelaxNG Schema for MathML3 [RelaxNG], which forms a normative part of the specification. Following that, Section A.4 Using the MathML XML Schema, and Section A.3 Using the MathML DTD discuss alternative languages definition using the document type definitions (DTD) and the W3C XML schema language, [XMLSchemas], both of which are derived from the normative RelaxNG schema automatically. One should note that the schema definitions of the language is currently stricter than the DTD version. That is, a schema validating processor will declare invalid documents that are declared valid by a (DTD) validating XML parser. This is partly due to the fact that the XML schema language may express additional constraints not expressable in the DTD, and partly due to the fact that for reasons of compatibility with earlier releases, the DTD is intentionally forgiving in some places and does not enforce constraints that are specified in the text of this specification.
MathML documents should be validated using the RelaxNG Schema for MathML, either in the XML encoding (http://www.w3.org/Math/RelaxNG/mathml3/mathml3.rng) or in compact notation (http://www.w3.org/Math/RelaxNG/mathml3/mathml3.rnc) which is also shown below.
In contrast to DTDs there is no in-document method to associate a RelaxNG schema with a document.
We provide five RelaxNG schemata for sub-languages of MathML3:
The grammar for full MathML
The grammar for Presentation MathML without content elements mixed in
The grammar for strict Content MathML3
The grammar for pragmatic Content MathML3 without presentation MathML in token elements
The grammar for the deprecated parts of MathML
we will present them in detail in the next sections below. As the compact notation for RelaxNG grammars is more readable, we will use this format here.
Note that the RelaxNG grammars here are considerably more strict than the MathML2 DTDs (even in strict mode).
The RelaxNG schema for full MathML builds on the schema describing the various arts of teh language which are given in the following sections. It can be found at http://www.w3.org/Math/RelaxNG/mathml3/mathml3.rnc.
# This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3.rnc,v 1.7 2008/11/09 00:24:40 dcarlis Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase default namespace m = "http://www.w3.org/1998/Math/MathML" ## the core, strict Content MathML include "mathml3-strict.rnc" ## Content Expressions now allow pMathML in ci and csymbol include "mathml3-pragmatic.rnc" { } ## Presentation Expressions allow Content Expressions mixed in everywhere include "mathml3-presentation.rnc" ## include the relevant content dictionaries include "mathml3-cds-pragmatic.rnc" ## deprecated constucts include "mathml3-deprecated.rnc" { } ContInPres |= ContExp
# This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3-presentation.rnc,v 1.8 2008/11/09 11:15:50 mkohlhas2 Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase default namespace m = "http://www.w3.org/1998/Math/MathML" math.content |= ContInPres* MathML.Common.attrib |= attribute class {xsd:NMTOKENS}?,attribute style {xsd:string}? Browser-interface.attrib = attribute baseline {xsd:string}?, attribute overflow {"scroll" | "elide" | "truncate" | "scale" | "linebreak"}?, attribute altimg {xsd:anyURI}?, attribute alttext {xsd:string}?, attribute type {xsd:string}?, attribute name {xsd:string}?, attribute height {xsd:string}?, attribute width {xsd:string}? math.attlist |= Browser-interface.attrib,attribute display {"block" | "inline"}?, attribute dir {"ltr" | "rtl"}?, linebreak.attrib simple-size = "small" | "normal" | "big" centering.values = "left" | "center" | "right" named-space = "veryverythinmathspace" | "verythinmathspace" | "thinmathspace" | "mediummathspace" | "thickmathspace" | "verythickmathspace" | "veryverythickmathspace" thickness = "thin" | "medium" | "thick" # number with units used to specified lengths length-with-unit = xsd:string #{pattern="(-?([0-9]+|[0-9]*\.[0-9]+)(em|ex|px|in|cm|mm|pt|pc|%))|0"} length-with-optional-unit = xsd:string #{pattern="-?([0-9]+|[0-9]*\.[0-9]+)(em|ex|px|in|cm|mm|pt|pc|%)?"} # This is just "infinity" that can be used as a length infinity = "infinity" # colors defined as RGB RGB-color = xsd:string {pattern="#(([0-9]|[a-f]){3}|([0-9]|[a-f]){6})"} # The mathematics style attributes. These attributes are valid on all # presentation token elements except "mspace" and "mglyph", and on no # other elements except "mstyle". Token-style.attrib = attribute mathvariant {"normal" | "bold" | "italic" | "bold-italic" | "double-struck" | "bold-fraktur" | "script" | "bold-script" | "fraktur" | "sans-serif" | "bold-sans-serif" | "sans-serif-italic" | "sans-serif-bold-italic" | "monospace" | "initial" | "tailed" | "looped" | "stretched"}?, attribute mathsize {simple-size | length-with-unit}?, attribute mathcolor {xsd:string}?, attribute mathbackground {xsd:string}? truefalse = "true" | "false" Operator.attrib = # this attribute value is normally inferred from the position of # the operator in its "<mrow"> attribute form {"prefix" | "infix" | "postfix"}?, # set by dictionary, else it is "thickmathspace" attribute lspace {length-with-unit | named-space}?, # set by dictionary, else it is "thickmathspace" attribute rspace {length-with-unit | named-space}?, # set by dictionnary, else it is "false" attribute fence {truefalse}?, # set by dictionnary, else it is "false" attribute separator {truefalse}?, # set by dictionnary, else it is "false" attribute stretchy {truefalse}?, # set by dictionnary, else it is "true" attribute symmetric {truefalse}?, # set by dictionnary, else it is "false" attribute movablelimits {truefalse}?, # set by dictionnary, else it is "false" attribute accent {truefalse}?, # set by dictionnary, else it is "false" attribute largeop {truefalse}?, attribute minsize {length-with-unit | named-space}?, attribute maxsize {length-with-unit | named-space | infinity | xsd:float}? mglyph = elementmglyph
{MathML.Common.attrib, attribute alt {xsd:string}?, (attribute src {xsd:anyURI}| attribute fontfamily {xsd:string}), attribute width {xsd:string}?, attribute height {xsd:string}?, attribute baseline {xsd:string}?, attribute index {xsd:positiveInteger}?} linethickness.attrib = attribute linethickness {length-with-optional-unit|thickness} mline = elementmline
{MathML.Common.attrib, linethickness.attrib?, attribute spacing {xsd:string}?, attribute length {length-with-unit | named-space}?} Glyph-alignmark = malignmark|mglyph mi = elementmi
{MathML.Common.attrib,Token-style.attrib,(Glyph-alignmark|text)*} mo = elementmo
{MathML.Common.attrib,Operator.attrib,Token-style.attrib, linebreak.attrib, (text|Glyph-alignmark)*} mn = elementmn
{MathML.Common.attrib,Token-style.attrib,(text|Glyph-alignmark)*} mtext = elementmtext
{MathML.Common.attrib,Token-style.attrib,(text|Glyph-alignmark)*} ms = elementms
{MathML.Common.attrib,Token-style.attrib, attribute lquote {xsd:string}?, attribute rquote {xsd:string}?, (text|Glyph-alignmark)*} # And the group of any token Pres-token = mi | mo | mn | mtext | ms msub = elementmsub
{MathML.Common.attrib, attribute subscriptshift {length-with-unit}?, ContInPres,ContInPres} msup = elementmsup
{MathML.Common.attrib, attribute supscriptshift {length-with-unit}?, ContInPres,ContInPres} msubsup = elementmsubsup
{MathML.Common.attrib, attribute subscriptshift {length-with-unit}?, attribute supscriptshift {length-with-unit}?, ContInPres,ContInPres,ContInPres} munder = elementmunder
{MathML.Common.attrib, attribute accentunder {truefalse}?, ContInPres,ContInPres} mover = elementmover
{MathML.Common.attrib, attribute accent {truefalse}?, ContInPres,ContInPres} munderover = elementmunderover
{MathML.Common.attrib, attribute accentunder {truefalse}?, attribute accent {truefalse}?, ContInPres,ContInPres,ContInPres} PresExp-or-none = ContInPres | none mmultiscripts = elementmmultiscripts
{MathML.Common.attrib, ContInPres, (PresExp-or-none,PresExp-or-none)*, (mprescripts,(PresExp-or-none,PresExp-or-none)*)?} none = elementnone
{empty} mprescripts = elementmprescripts
{empty} Pres-script = msub|msup|msubsup|munder|mover|munderover|mmultiscripts linebreak-values = "auto" | "newline" | "indentingnewline" | "nobreak" | "goodbreak" | "badbreak" mspace = elementmspace
{MathML.Common.attrib, attribute width {length-with-unit | named-space}?, attribute height {length-with-unit}?, attribute depth {length-with-unit}?, attribute spacing {text}?, linebreak.attrib} mrow = elementmrow
{MathML.Common.attrib,ContInPres*} mfrac = elementmfrac
{MathML.Common.attrib, attribute bevelled {truefalse}?, attribute denomalign {centering.values}?, attribute numalign {centering.values}?, linethickness.attrib?, ContInPres,ContInPres} msqrt = elementmsqrt
{MathML.Common.attrib,ContInPres*} mroot = elementmroot
{MathML.Common.attrib,ContInPres,ContInPres} mpadded-space = xsd:string {pattern="(\+|-)?([0-9]+|[0-9]*\.[0-9]+)(((%?)*(width|lspace|height|depth))|(em|ex|px|in|cm|mm|pt|pc))"} mpadded-width-space = xsd:string {pattern="((\+|-)?([0-9]+|[0-9]*\.[0-9]+)(((%?) *(width|lspace|height|depth)?)|(width|lspace|height|depth)|(em|ex|px|in|cm|mm|pt|pc)))|((veryverythin|verythin|thin|medium|thick|verythick|veryverythick)mathspace)|0"} mpadded = elementmpadded
{MathML.Common.attrib, attribute width {mpadded-width-space}?, attribute lspace {mpadded-space}?, attribute height {mpadded-space}?, attribute depth {mpadded-space}?, ContInPres*} mphantom = elementmphantom
{MathML.Common.attrib,ContInPres*} mfenced = elementmfenced
{MathML.Common.attrib, attribute open {xsd:string}?, attribute close {xsd:string}?, attribute separators {xsd:string}?, ContInPres*} notation-values = "actuarial"|"longdiv"|"radical"| "box"|"roundedbox"|"circle"| "left"|"right"|"top"|"bottom"| "updiagonalstrike"|"downdiagonalstrike"| "verticalstrike"|"horizontalstrike" | "madruwb" menclose = elementmenclose
{MathML.Common.attrib, attribute notation {list{notation-values*}}?, ContInPres*} # And the group of everything Pres-layout = mrow|mfrac|msqrt|mroot|mpadded|mphantom|mfenced|menclose Table-alignment.attrib = attribute rowalign {xsd:string {pattern="(top|bottom|center|baseline|axis)(top|bottom|center|baseline|axis)*"}}?, attribute columnalign {xsd:string {pattern="(left|center|right)( (left|center|right))*"}}?, attribute groupalign {xsd:string}? mtr.content = mtd mtr = elementmtr
{Table-alignment.attrib, MathML.Common.attrib,(mtr.content)+} mlabeledtr = elementmlabeledtr
{Table-alignment.attrib,MathML.Common.attrib,(mtr.content)*} mtd = elementmtd
{MathML.Common.attrib, Table-alignment.attrib, attribute columnspan {xsd:positiveInteger}?, attribute rowspan {xsd:positiveInteger}?, ContInPres*} mtable.content = mtr|mlabeledtr mtable = elementmtable
{Table-alignment.attrib, attribute align {xsd:string}?, attribute alignmentscope {xsd:string {pattern="(true|false)( true| false)*"}}?, attribute columnwidth {xsd:string}?, attribute width {xsd:string}?, attribute rowspacing {xsd:string}?, attribute columnspacing {xsd:string}?, attribute rowlines {xsd:string}?, attribute columnlines {xsd:string}?, attribute frame {"none" | "solid" | "dashed"}?, attribute framespacing {xsd:string}?, attribute equalrows {truefalse}?, attribute equalcolumns {truefalse}?, attribute displaystyle {truefalse}?, attribute side {"left"|"right"|"leftoverlap"|"rightoverlap"}?, attribute minlabelspacing {length-with-unit}?, MathML.Common.attrib, (mtable.content)*} maligngroup = elementmaligngroup
{MathML.Common.attrib, attribute groupalign {"left" | "center" | "right" | "decimalpoint"}?} malignmark = elementmalignmark
{MathML.Common.attrib,attribute edge {"left" | "right"}?} Pres-table = mtable|maligngroup|malignmark mcolumn = elementmcolumn
{MathML.Common.attrib, attribute align {"left" | "right"}?,ContInPres*} mstyle = elementmstyle
{MathML.Common.attrib, linebreak.attrib, attribute scriptlevel {xsd:integer}?, attribute displaystyle {truefalse}?, attribute scriptsizemultiplier {xsd:decimal}?, attribute scriptminsize {length-with-unit}?, attribute background {xsd:string}?, attribute veryverythinmathspace {length-with-unit}?, attribute verythinmathspace {length-with-unit}?, attribute thinmathspace {length-with-unit}?, attribute mediummathspace {length-with-unit}?, attribute thickmathspace {length-with-unit}?, attribute verythickmathspace {length-with-unit}?, attribute veryverythickmathspace {length-with-unit}?, linethickness.attrib?, Operator.attrib,Token-style.attrib, ContInPres*} merror = elementmerror
{MathML.Common.attrib,ContInPres*} maction = elementmaction
{MathML.Common.attrib, attribute actiontype {xsd:string}?, attribute selection {xsd:positiveInteger}?, ContInPres*} semantics-pmml = elementsemantics
{semantics.attribs,PresExp, semantics-annotation*} PresExp = Pres-token | Pres-layout | Pres-script | Pres-table | mspace | mline | mcolumn | maction | merror | mstyle | semantics-pmml ContInPres |= PresExp
Issue ednote_rnc_browserinterface_ | wiki (member only) |
---|---|
rnc:browserinterface |
|
Resolution | None recorded |
Issue ednote_rnc_units-patterns_ | wiki (member only) |
---|---|
rnc:units-patterns |
|
Resolution | None recorded |
Issue ednote_rnc_mathvariant_ | wiki (member only) |
---|---|
rnc:mathvariant |
|
Resolution | None recorded |
Issue ednote_mglyph_alt_ | wiki (member only) |
---|---|
mglyph_alt |
|
Resolution | None recorded |
Issue ednote_rnc_leftover-max_ | wiki (member only) |
---|---|
rnc:leftover-max |
|
Resolution | None recorded |
Issue permissive_units | wiki (member only) |
---|---|
more permissive lengths/widths | |
David wrote in an e-mail: However we do claim css compatibility here which may suggest some answers to the
above css allows an optional leading Once we have firm answers to the above it should be easy to drop the regexp back in, and make the text match. I think we should not allow white space except at beginning and end
but allow a leading |
|
Resolution | None recorded |
The grammar for Strict Content MathML3 can be found at http://www.w3.org/Math/RelaxNG/mathml3/mathml3-strict.rnc.
# This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3-strict.rnc,v 1.8 2008/11/09 11:15:50 mkohlhas2 Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase # # This is the RelaxNG schema module for the strict content part of MathML. default namespace m = "http://www.w3.org/1998/Math/MathML" include "mathml3-common.rnc" math.content |= ContExp opel.content = text # we want to extend this in pragmatic CMathML, so we introduce abbrevs here. cn.content = text |(cn,cn) cn.type.vals = "integer"|"real"|"double" cn = elementcn
{attribute base {text}?, attribute type {cn.type.vals}?, Definition.attrib, MathML.Common.attrib, (cn.content)*} ci = elementci
{attribute type {xsd:string}?, attribute nargs {xsd:string}?, attribute occurrence {xsd:string}?, Definition.attrib, MathML.Common.attrib, opel.content, name.attrib?} cdname.attrib = attribute cd {xsd:NCName} csymbol = elementcsymbol
{MathML.Common.attrib, Definition.attrib,cdname.attrib?,cdbase.attrib?, opel.content} # the content of the apply element, leave it empty and extend it later apply = elementapply
{MathML.Common.attrib,cdbase.attrib?,apply.content} apply-head = apply|bind|ci|csymbol|semantics-apply apply.content = apply-head,ContExp* semantics-apply = elementsemantics
{semantics.attribs,apply-head, semantics-annotation*} qualifier = notAllowed # the content of the bind element, leave it empty and extend it later bind = elementbind
{MathML.Common.attrib,cdbase.attrib?,bind.content} bind-head = apply|csymbol|semantics-bind bind.content = bind-head,bvar*,qualifier?,ContExp semantics-bind = elementsemantics
{semantics.attribs,bind-head, semantics-annotation*} bvar = elementbvar
{MathML.Common.attrib,cdbase.attrib?,bvar-head} bvar-head = ci|semantics-bvar semantics-bvar = elementsemantics
{semantics.attribs,bvar-head, semantics-annotation*} share = elementshare
{MathML.Common.attrib,attribute href {xsd:anyURI}} # the content of the cerror element, leave it empty and extend it later cerror = elementcerror
{MathML.Common.attrib,cdbase.attrib?,cerror.content} cerror-head = csymbol|apply|semantics-cerror cerror.content = cerror-head,ContExp* semantics-cerror = elementsemantics
{semantics.attribs,cerror-head, semantics-annotation*} semantics-cmml = elementsemantics
{semantics.attribs,ContExp, semantics-annotation*} ContExp = cn| ci | csymbol | apply | bind | share | cerror | semantics-cmml
Issue ednote_rnc_opel-content_ | wiki (member only) |
---|---|
rnc:opel-content |
|
Resolution | None recorded |
Issue ednote_rnc_cn-content_ | wiki (member only) |
---|---|
rnc:cn-content |
|
Resolution | None recorded |
The grammar for pragmatic MathML3 can be found at http://www.w3.org/Math/RelaxNG/mathml3/mathml3-pragmatic.rnc.
# This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3-pragmatic.rnc,v 1.10 2008/11/09 17:55:28 dcarlis Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase # # This is the RelaxNG schema module for the pragmatic content part of # MathML (but without the presentation in token elements). default namespace m = "http://www.w3.org/1998/Math/MathML" ## the content of "cn" may have <sep> elements in it sep = elementsep
{empty} cn.content |= (sep|text|Glyph-alignmark)* cn.type.vals |= "e-notation"|"rational"|"complex-cartesian"|"complex-polar"|"constant" ## allow degree in bvar degree = elementdegree
{MathML.Common.attrib,ContExp} logbase = elementlogbase
{MathML.Common.attrib,ContExp} momentabout = elementmomentabout
{MathML.Common.attrib,ContExp} bvar-head |= (degree?,ci)|(ci,degree?) ## allow degree to modify <root/> apply.content |= root_arith1_elt,degree,ContExp* apply.content |= moment_s_data1_elt,(degree? & momentabout?),ContInPres* apply.content |= log_transc1_elt,logbase,ContExp* ##allow apply to act as a binder apply.content |= bind.content domainofapplication = elementdomainofapplication
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp} lowlimit = elementlowlimit
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp+} uplimit = elementuplimit
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp+} condition = elementcondition
{Definition.attrib,cdbase.attrib?,ContExp} ## allow the non-strict qualifiers qualifier |= domainofapplication|(uplimit,lowlimit?)|(lowlimit,uplimit?)|degree|condition ## we collect the operator elements by role opel.constant = notAllowed opel.binder = notAllowed opel.application = notAllowed opel.semantic-attribution = notAllowed opel.attribution = notAllowed opel.error = notAllowed opels = opel.constant | opel.binder | opel.application | opel.semantic-attribution | opel.attribution | opel.error container = notAllowed ## the values of the MathML type attributes; MathMLType |= "real" | "complex" | "function" | "algebraic" | "integer" ## we instantiate the strict content model by structure checking apply-binder-head = semantics-apply-binder|opel.binder apply.content |= apply-binder-head,bvar*,qualifier?,ContExp* semantics-apply-binder = elementsemantics
{semantics.attribs,apply-binder-head, semantics-annotation*} apply-head |= opel.application bind-head |= opel.binder cerror-head |= opel.error ## allow all functions, constants, and containers to be content expressions on their own ContExp |= opel.constant|opel.application|container # allow no body bind.content |= bind-head,bvar*,qualifier? # not sure what a sequence of things is supposed to map to in strict/OM # but is definitely allowed in pragmatic # see Content/SequencesAndSeries/product/rec-product3 math.content |= ContExp* opel.content |= PresExp|Glyph-alignmark # This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3-pragmatic.rnc,v 1.10 2008/11/09 17:55:28 dcarlis Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase # # This is the RelaxNG schema module for the pragmatic content part of # MathML (but without the presentation in token elements). default namespace m = "http://www.w3.org/1998/Math/MathML" ## the content of "cn" may have <sep> elements in it sep = elementsep
{empty} cn.content |= (sep|text|Glyph-alignmark)* cn.type.vals |= "e-notation"|"rational"|"complex-cartesian"|"complex-polar"|"constant" ## allow degree in bvar degree = elementdegree
{MathML.Common.attrib,ContExp} logbase = elementlogbase
{MathML.Common.attrib,ContExp} momentabout = elementmomentabout
{MathML.Common.attrib,ContExp} bvar-head |= (degree?,ci)|(ci,degree?) ## allow degree to modify <root/> apply.content |= root_arith1_elt,degree,ContExp* apply.content |= moment_s_data1_elt,(degree? & momentabout?),ContInPres* apply.content |= log_transc1_elt,logbase,ContExp* ##allow apply to act as a binder apply.content |= bind.content domainofapplication = elementdomainofapplication
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp} lowlimit = elementlowlimit
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp+} uplimit = elementuplimit
{Definition.attrib,MathML.Common.attrib,cdbase.attrib?,ContExp+} condition = elementcondition
{Definition.attrib,cdbase.attrib?,ContExp} ## allow the non-strict qualifiers qualifier |= domainofapplication|(uplimit,lowlimit?)|(lowlimit,uplimit?)|degree|condition ## we collect the operator elements by role opel.constant = notAllowed opel.binder = notAllowed opel.application = notAllowed opel.semantic-attribution = notAllowed opel.attribution = notAllowed opel.error = notAllowed opels = opel.constant | opel.binder | opel.application | opel.semantic-attribution | opel.attribution | opel.error container = notAllowed ## the values of the MathML type attributes; MathMLType |= "real" | "complex" | "function" | "algebraic" | "integer" ## we instantiate the strict content model by structure checking apply-binder-head = semantics-apply-binder|opel.binder apply.content |= apply-binder-head,bvar*,qualifier?,ContExp* semantics-apply-binder = elementsemantics
{semantics.attribs,apply-binder-head, semantics-annotation*} apply-head |= opel.application bind-head |= opel.binder cerror-head |= opel.error ## allow all functions, constants, and containers to be content expressions on their own ContExp |= opel.constant|opel.application|container # allow no body bind.content |= bind-head,bvar*,qualifier? # not sure what a sequence of things is supposed to map to in strict/OM # but is definitely allowed in pragmatic # see Content/SequencesAndSeries/product/rec-product3 math.content |= ContExp* opel.content |= PresExp|Glyph-alignmark
This grammar focuses on the pragmatic extensions in , , , , and .
Editorial note: MiKo | |
check this again |
The pragmatic extensions in , , , , , rely on information that is specified in the MathML content dictionaries. This is handled in the schema http://www.w3.org/Math/RelaxNG/mathml3/mathml3-cds-pragmatic.rnc.
Finally, the pragmatic extensions given in are not covered in this schema, but will be left for full MathML in the next section.
The grammar for the deprecated features in MathML3 can be found at http://www.w3.org/Math/RelaxNG/mathml3/mathml3-deprecated.rnc.
# This is the Mathematical Markup Language (MathML) 3.0, an XML # application for describing mathematical notation and capturing # both its structure and content. # # Copyright 1998-2008 W3C (MIT, ERCIM, Keio) # # Use and distribution of this code are permitted under the terms # W3C Software Notice and License # http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 # # # Revision: mathml3-deprecated.rnc,v 1.8 2008/11/09 00:24:40 dcarlis Exp $ # # Update to MathML3 and Relax NG: David Carlisle and Michael Kohlhase default namespace m = "http://www.w3.org/1998/Math/MathML" Token-style.attrib &= attribute fontsize {xsd:string}? , attribute fontstyle {xsd:string}? , attribute fontweight {xsd:string}? , attribute color {xsd:string}? , attribute fontfamily {xsd:string}? , attribute fontweight {xsd:string}? #Deprecated Content Elements dep-content = elementreln
{ContExp*}| elementfn
{ContExp} ContExp |= dep-content apply-head |= dep-content declare = elementdeclare
{attribute type {xsd:string}?, attribute scope {xsd:string}?, attribute nargs {xsd:nonNegativeInteger}?, attribute occurrence {"prefix"|"infix"|"function-model"}?, Definition.attrib,cdbase.attrib?, ContExp+} ContExp |= declare mtr.content |= ContInPres
Normally, a MathML expression does not constitute an entire XML document. MathML is designed to be used as the mathematics fragment of larger markup languages. In particular it is designed to be used as a module in documents marked up with the XHTML family of markup languages. As RelaxNG directly supports modular development, this is usually very easy: an XHTML+MathML schema can be specified as simply as
# A RelaxNG Schema for XHTML+MathML include "xhtml.rnc" math = external "mathml3.rnc" Inline.class |= math Block.class |= math
assuming that we have access to a modular RelaxNG schema for xhtml that uses
Inline.class
and Block.class
to collect the the content models
for inline and block-level elements.
Editorial note: Miko | |
check this and reference an external schema |
Specilizing the MathML3 schema so that we can check the content of
annotation-xml
elements is similarly simple:
# A RelaxNG Schema for MathML with OpenMath3 annotations omobj = external "openmath3.rnc" include "mathml3.rnc" {anotation-xml.model = omobj}
For details about RelaxNG grammars and modularization see [RelaxNG] or [RelaxNGBook].
Editorial note: Miko | |
check this and reference an external schema; I think we can even tie the OpenMath model to the value OpenMath in the encoding attribute.
|