# A Parsing MathML

Overview: Mathematical Markup Language (MathML) Version 2.0
Previous: 8 Document Object Model for MathML
Next: B Content Markup Validation Grammar
A Parsing MathML
A.1 DOCTYPE Declaration for MathML
A.2 MathML as a DTD Module
A.3 Namespace prefix declarations
A.4 Use of MathML without a DTD
A.5 SGML
A.6 The MathML DTD

## A.1 DOCTYPE Declaration for MathML

MathML documents should be validated using the XML DTD for MathML, which is also shown below in Section A.6 [The MathML DTD].

Documents using this DTD should contain a doctype declaration of the form:

    <!DOCTYPE math
        PUBLIC "-//W3C//DTD MathML 2.0//EN"
               "http://www.w3.org/TR/MathML2/dtd/mathml2.dtd"
    >

The URI may be changed to that of a local copy of the DTD if required.

If a namespace prefix is being used, so that for example the document element is:

    <mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML">
    ...
    </mml:math>

then the prefix must be declared in the local subset of the DTD, as follows:

    <!DOCTYPE mml:math
        PUBLIC "-//W3C//DTD MathML 2.0//EN"
               "http://www.w3.org/TR/MathML2/dtd/mathml2.dtd" [
        <!ENTITY % MATHML.prefixed "INCLUDE">
        <!ENTITY % MATHML.prefix "mml">
    ]>

This use of parameter entities to control namespace prefixes follows the conventions specified in [Modularization].

## A.2 MathML as a DTD Module

Normally, however, 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 defined in [Modularization]. As a convenience, a version of the XHTML DTD, extended with this MathML module, is also provided as a concrete example. This version includes all the necessary declarations included into one file (in contrast to the standalone version of the MathML DTD which references several files for entity declarations etc.). To use this DTD, a document should contain the doctype declaration

    <!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
               "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd"
    >

as above, the URI may be altered to that of a local copy of the DTD, and the namespace prefixes used for XHTML and MathML may be controlled by the use of parameter entities.

## A.3 Namespace prefix declarations

As mentioned above, it is sometimes necessary, or convenient, to use the mechanisms described in [Modularization] which provide a namespace prefix on MathML element names. The DTD below is designed to allow this usage. If the parameter entity `MATHML.prefixed` is declared to be INCLUDE, using a declaration such as

    <!ENTITY % MATHML.prefixed "INCLUDE" >

either in the local subset of the DOCTYPE declaration, or in the DTD file that is including the MathML DTD, then all MathML elements should be used with a prefix, for example `<m:mrow>`, `<m:apply>`, etc. The prefix defaults to `m:` but another prefix may be declared by declaring in addition the parameter entity `MathML.prefix`. For example,

    <!ENTITY % MATHML.prefix   "math" >

would set the prefix for the MathML namespace to `math:`.

Note that while the [Namespaces] Recommendation provides mechanisms to change the prefix at arbitrary points in the document, this flexibility is not provided in this DTD (and is probably not possible to specify in any DTD).

## A.4 Use of MathML without a DTD

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.

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.

## A.5 SGML

If required, one may validate MathML documents using an SGML parser such as `nsgmls`, rather than a validating XML parser. In this case an SGML declaration defining the constraints of XML applicable to an SGML parser must be used. See the note on SGML and XML.

Some older SGML systems may not be able to process files referring to plane 1 characters (those with Unicode values above hex FFFF).

## A.6 The MathML DTD

The entity declarations for characters are referenced at the end of the DTD. These are linked to the character tables in Chapter 6 [Characters, Entities and Fonts] for each entity set.

Lists of the combined MathML set of character names, ordered by name or by Unicode value are also available.

In order to accommodate XML namespace prefixes, the DTD does not directly refer to an element name such as `mrow` but instead always refers to the name via a parameter entity such as `%mrow.qname;`. The definitions of these parameter entities are in the file but are not shown here. They are simply declarations such as the following, one for each MathML element.

    <!ENTITY % mrow.qname           "%MATHML.pfx;mrow" >

Here we give the main body of the DTD. The full DTD, as well as the XHTML-Math DTD, is available as a zip archive.

    <!-- MathML 2.0 DTD  ....................................................... -->
    <!-- file: mathml2.dtd
    -->

    <!-- MathML 2.0 DTD

         This is the Mathematical Markup Language (MathML) 2.0, an XML
         application for describing mathematical notation and capturing
         both its structure and content.

         Copyright 1998-2000 World Wide Web Consortium
            (Massachusetts Institute of Technology, Institut National de
             Recherche en Informatique et en Automatique, Keio University).
             All Rights Reserved.

         Permission to use, copy, modify and distribute the XHTML 1.1 DTD and
         its accompanying documentation for any purpose and without fee is
         hereby granted in perpetuity, provided that the above copyright notice
         and this paragraph appear in all copies.  The copyright holders make
         no representation about the suitability of the DTD for any purpose.

         It is provided "as is" without expressed or implied warranty.

            Revision:   $Id: parsing.xml,v 1.34 2000/12/14 13:08:43 davidc Exp $

         This entity may be identified by the PUBLIC and SYSTEM identifiers:

           PUBLIC "-//W3C//DTD MathML 2.0//EN"
           SYSTEM "mathml2.dtd"

         Revisions: editor and revision history at EOF
    -->

    <!-- MathML Qualified Names module ............................... -->
    <!ENTITY % mathml-qname.module "INCLUDE" >
    <![%mathml-qname.module;[
    <!ENTITY % mathml-qname.mod
         PUBLIC "-//W3C//ENTITIES MathML 2.0 Qualified Names 1.0//EN"
                "mathml2-qname-1.mod" >
    %mathml-qname.mod;]]>

    <!-- if %NS.prefixed; is INCLUDE, include all NS attributes,
         otherwise just those associated with MathML
    -->
    <![%NS.prefixed;[
    <!ENTITY % MATHML.NamespaceDecl.attrib
         "%NamespaceDecl.attrib;"
    >
    ]]>
    <!ENTITY % MATHML.NamespaceDecl.attrib
         "%MATHML.xmlns.attrib;"
    >

    <!-- Attributes shared by all elements  .......................... -->

    <!ENTITY % MATHML.Common.attrib
         "%MATHML.NamespaceDecl.attrib;
          xlink:href   CDATA                    #IMPLIED
          class        CDATA                    #IMPLIED
          style        CDATA                    #IMPLIED
          id           ID                       #IMPLIED
          xref         IDREF                    #IMPLIED
          other        CDATA                    #IMPLIED"
    >

    <!-- Presentation element set  ................................... -->

    <!-- Attribute definitions -->

    <!ENTITY % att-fontsize
         "fontsize     CDATA                    #IMPLIED" >
    <!ENTITY % att-fontweight
         "fontweight   ( normal | bold )        #IMPLIED" >
    <!ENTITY % att-fontstyle
         "fontstyle    ( normal | italic )      #IMPLIED" >
    <!ENTITY % att-fontfamily
         "fontfamily   CDATA                    #IMPLIED" >
    <!ENTITY % att-color
         "color        CDATA                    #IMPLIED" >

    <!-- MathML2 typographically-distinguished symbol attributes -->

    <!ENTITY % att-mathvariant
         "mathvariant     CDATA                    #IMPLIED" >
    <!ENTITY % att-mathsize
         "mathsize     CDATA                    #IMPLIED" >
    <!ENTITY % att-mathcolor
         "mathcolor     CDATA                    #IMPLIED" >
    <!ENTITY % att-mathbackground
         "mathbackground     CDATA                    #IMPLIED" >

    <!ENTITY % att-fontinfo
         "%att-fontsize;
          %att-fontweight;
          %att-fontstyle;
          %att-fontfamily;
          %att-color;
          %att-mathvariant;
          %att-mathsize;
          %att-mathcolor;
          %att-mathbackground;"
    >

    <!ENTITY % att-form
         "form         ( prefix | infix | postfix )  #IMPLIED" >
    <!ENTITY % att-fence
         "fence        ( true | false )         #IMPLIED" >
    <!ENTITY % att-separator
         "separator    ( true | false )         #IMPLIED" >
    <!ENTITY % att-lspace
         "lspace       CDATA                    #IMPLIED" >
    <!ENTITY % att-rspace
         "rspace       CDATA                    #IMPLIED" >
    <!ENTITY % att-stretchy
         "stretchy     ( true | false )         #IMPLIED" >
    <!ENTITY % att-symmetric
         "symmetric    ( true | false )         #IMPLIED" >
    <!ENTITY % att-maxsize
         "maxsize      CDATA                    #IMPLIED" >
    <!ENTITY % att-minsize
         "minsize      CDATA                    #IMPLIED" >
    <!ENTITY % att-largeop
         "largeop      ( true | false)          #IMPLIED" >
    <!ENTITY % att-movablelimits
         "movablelimits ( true | false )        #IMPLIED" >
    <!ENTITY % att-accent
         "accent       ( true | false )         #IMPLIED" >

    <!ENTITY % att-opinfo
         "%att-form;
          %att-fence;
          %att-separator;
          %att-lspace;
          %att-rspace;
          %att-stretchy;
          %att-symmetric;
          %att-maxsize;
          %att-minsize;
          %att-largeop;
          %att-movablelimits;
          %att-accent;"
    >
    <!ENTITY % att-width
         "width        CDATA                    #IMPLIED" >
    <!ENTITY % att-height
         "height       CDATA                    #IMPLIED" >
    <!ENTITY % att-depth
         "depth        CDATA                    #IMPLIED" >
    <!ENTITY % att-linebreak
         "linebreak    CDATA                    #IMPLIED" >
    <!ENTITY % att-sizeinfo
         "%att-width;
          %att-height;
          %att-depth;"
    >
    <!ENTITY % att-lquote
         "lquote       CDATA                    #IMPLIED" >
    <!ENTITY % att-rquote
         "rquote       CDATA                    #IMPLIED" >
    <!ENTITY % att-linethickness
         "linethickness CDATA                   #IMPLIED" >
    <!ENTITY % att-scriptlevel
         "scriptlevel  CDATA                    #IMPLIED" >
    <!ENTITY % att-displaystyle
         "displaystyle ( true | false )         #IMPLIED" >
    <!ENTITY % att-scriptsizemultiplier
         "scriptsizemultiplier CDATA            #IMPLIED" >
    <!ENTITY % att-scriptminsize
         "scriptminsize CDATA                   #IMPLIED" >
    <!ENTITY % att-background
         "background   CDATA                    #IMPLIED" >
    <!ENTITY % att-veryverythinmathspace
         "veryverythinmathspace   CDATA         #IMPLIED" >
    <!ENTITY % att-verythinmathspace
         "verythinmathspace   CDATA             #IMPLIED" >
    <!ENTITY % att-thinmathspace
         "thinmathspace   CDATA                 #IMPLIED" >
    <!ENTITY % att-mediummathspace
         "mediummathspace   CDATA               #IMPLIED" >
    <!ENTITY % att-thickmathspace
         "thickmathspace   CDATA                #IMPLIED" >
    <!ENTITY % att-verythickmathspace
         "verythickmathspace   CDATA            #IMPLIED" >
    <!ENTITY % att-veryverythickmathspace
         "veryverythickmathspace   CDATA        #IMPLIED" >
    <!ENTITY % att-open
         "open         CDATA                    #IMPLIED" >
    <!ENTITY % att-close
         "close        CDATA                    #IMPLIED" >
    <!ENTITY % att-separators
         "separators   CDATA                    #IMPLIED" >
    <!ENTITY % att-subscriptshift
         "subscriptshift CDATA                  #IMPLIED" >
    <!ENTITY % att-superscriptshift
         "superscriptshift CDATA                #IMPLIED" >
    <!ENTITY % att-accentunder
         "accentunder  ( true | false )         #IMPLIED" >
    <!ENTITY % att-align
         "align        CDATA                    #IMPLIED" >
    <!ENTITY % att-rowalign
         "rowalign     CDATA                    #IMPLIED" >
    <!ENTITY % att-columnalign
         "columnalign  CDATA                    #IMPLIED" >
    <!ENTITY % att-columnwidth
         "columnwidth  CDATA                    #IMPLIED" >
    <!ENTITY % att-groupalign
         "groupalign   CDATA                    #IMPLIED" >
    <!ENTITY % att-alignmentscope
         "alignmentscope CDATA                  #IMPLIED" >
    <!ENTITY % att-rowspacing
         "rowspacing   CDATA                    #IMPLIED" >
    <!ENTITY % att-columnspacing
         "columnspacing CDATA                   #IMPLIED" >
    <!ENTITY % att-rowlines
         "rowlines     CDATA                    #IMPLIED" >
    <!ENTITY % att-columnlines
         "columnlines  CDATA                    #IMPLIED" >
    <!ENTITY % att-frame
         "frame       ( none | solid | dashed ) #IMPLIED" >
    <!ENTITY % att-framespacing
         "framespacing CDATA                    #IMPLIED" >
    <!ENTITY % att-equalrows
         "equalrows    CDATA                    #IMPLIED" >
    <!ENTITY % att-equalcolumns
         "equalcolumns CDATA                    #IMPLIED" >

    <!ENTITY % att-tableinfo
         "%att-align;
          %att-rowalign;
          %att-columnalign;
          %att-columnwidth;
          %att-groupalign;
          %att-alignmentscope;
          %att-rowspacing;
          %att-columnspacing;
          %att-rowlines;
          %att-columnlines;
          %att-frame;
          %att-framespacing;
          %att-equalrows;
          %att-equalcolumns;
          %att-displaystyle;"
    >

    <!ENTITY % att-rowspan
         "rowspan      CDATA                    #IMPLIED" >
    <!ENTITY % att-columnspan
         "columnspan   CDATA                    #IMPLIED" >
    <!ENTITY % att-edge
         "edge         ( left | right )         #IMPLIED" >
    <!ENTITY % att-actiontype
         "actiontype   CDATA                    #IMPLIED" >
    <!ENTITY % att-selection
         "selection    CDATA                    #IMPLIED" >

    <!ENTITY % att-name
         "name         CDATA                    #IMPLIED" >
    <!ENTITY % att-alt
         "alt          CDATA                    #IMPLIED" >
    <!ENTITY % att-index
         "index        CDATA                    #IMPLIED" >

    <!ENTITY % att-bevelled
         "bevelled      CDATA                    #IMPLIED" >

    <!-- Presentation schemata with content -->

    <!ENTITY % ptoken
         "%mi.qname; | %mn.qname; | %mo.qname;
          | %mtext.qname; | %ms.qname;" >

    <!ATTLIST %mi.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
    >

    <!ATTLIST %mn.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
    >

    <!ATTLIST %mo.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
          %att-opinfo;
    >

    <!ATTLIST %mtext.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
    >

    <!ATTLIST %ms.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
          %att-lquote;
          %att-rquote;
    >

    <!-- Empty presentation schemata -->

    <!ENTITY % petoken
         "%mspace.qname;" >
    <!ELEMENT %mspace.qname;  EMPTY >

    <!ATTLIST %mspace.qname;
          %att-sizeinfo;
          %att-linebreak;
          %MATHML.Common.attrib;
    >

    <!-- Presentation: general layout schemata -->

    <!ENTITY % pgenschema
         "%mrow.qname; | %mfrac.qname; | %msqrt.qname; | %mroot.qname;
          | %menclose.qname; | %mstyle.qname; | %merror.qname;
          | %mpadded.qname; | %mphantom.qname; | %mfenced.qname;" >

    <!ATTLIST %mrow.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %mfrac.qname;
          %MATHML.Common.attrib;
          %att-bevelled;
          %att-linethickness;
    >

    <!ATTLIST %msqrt.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %menclose.qname;
          %MATHML.Common.attrib;
          notation CDATA 'longdiv' >

    <!ATTLIST %mroot.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %mstyle.qname;
          %MATHML.Common.attrib;
          %att-fontinfo;
          %att-opinfo;
          %att-lquote;
          %att-rquote;
          %att-linethickness;
          %att-scriptlevel;
          %att-scriptsizemultiplier;
          %att-scriptminsize;
          %att-background;
          %att-veryverythinmathspace;
          %att-verythinmathspace;
          %att-thinmathspace;
          %att-mediummathspace;
          %att-thickmathspace;
          %att-verythickmathspace;
          %att-veryverythickmathspace;
          %att-open;
          %att-close;
          %att-separators;
          %att-subscriptshift;
          %att-superscriptshift;
          %att-accentunder;
          %att-tableinfo;
          %att-rowspan;
          %att-columnspan;
          %att-edge;
          %att-actiontype;
          %att-selection;
    >

    <!ATTLIST %merror.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %mpadded.qname;
          %MATHML.Common.attrib;
          %att-sizeinfo;
          %att-lspace;
    >

    <!ATTLIST %mphantom.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %mfenced.qname;
          %MATHML.Common.attrib;
          %att-open;
          %att-close;
          %att-separators;
    >

    <!-- Presentation layout schemata: scripts and limits -->

    <!ENTITY % pscrschema
         "%msub.qname; | %msup.qname; | %msubsup.qname; | %munder.qname;
          | %mover.qname; | %munderover.qname; | %mmultiscripts.qname;" >

    <!ATTLIST %msub.qname;
          %MATHML.Common.attrib;
          %att-subscriptshift;
    >

    <!ATTLIST %msup.qname;
          %MATHML.Common.attrib;
          %att-superscriptshift;
    >

    <!ATTLIST %msubsup.qname;
          %MATHML.Common.attrib;
          %att-subscriptshift;
          %att-superscriptshift;
    >

    <!ATTLIST %munder.qname;
          %MATHML.Common.attrib;
          %att-accentunder;
    >

    <!ATTLIST %mover.qname;
          %MATHML.Common.attrib;
          %att-accent;
    >

    <!ATTLIST %munderover.qname;
          %MATHML.Common.attrib;
          %att-accent;
          %att-accentunder;
    >

    <!ATTLIST %mmultiscripts.qname;
          %MATHML.Common.attrib;
          %att-subscriptshift;
          %att-superscriptshift;
    >

    <!-- Presentation layout schemata: empty elements for scripts -->

    <!ENTITY % pscreschema
         "%mprescripts.qname; | %none.qname;" >

    <!ELEMENT %mprescripts.qname;  EMPTY >
    <!ATTLIST %mprescripts.qname;
          %MATHML.xmlns.attrib; >

    <!ELEMENT %none.qname;  EMPTY >
    <!ATTLIST %none.qname;
          %MATHML.xmlns.attrib; >

    <!-- Presentation layout schemata: tables -->

    <!ENTITY % ptabschema
         "%mtable.qname; | %mtr.qname; | %mlabeledtr.qname; | %mtd.qname;" >

    <!ATTLIST %mtable.qname;
          %MATHML.Common.attrib;
          %att-tableinfo;
    >

    <!ATTLIST %mtr.qname;
          %MATHML.Common.attrib;
          %att-rowalign;
          %att-columnalign;
          %att-groupalign;
    >

    <!ATTLIST %mlabeledtr.qname;
          %MATHML.Common.attrib;
          %att-rowalign;
          %att-columnalign;
          %att-groupalign;
    >

    <!ATTLIST %mtd.qname;
          %MATHML.Common.attrib;
          %att-rowalign;
          %att-columnalign;
          %att-groupalign;
          %att-rowspan;
          %att-columnspan;
    >

    <!ENTITY % plschema
         "%pgenschema; | %pscrschema; | %ptabschema;" >

    <!-- Empty presentation layout schemata -->

    <!ENTITY % peschema
         "%maligngroup.qname; | %malignmark.qname;" >

    <!ELEMENT %malignmark.qname;  EMPTY >

    <!ATTLIST %malignmark.qname;
          %att-edge; >

    <!ELEMENT %maligngroup.qname;  EMPTY >
    <!ATTLIST %maligngroup.qname;
          %MATHML.Common.attrib;
          %att-groupalign;
    >

    <!ELEMENT %mglyph.qname;  EMPTY >
    <!ATTLIST %mglyph.qname;
          %att-alt;
          %att-fontfamily;
          %att-index; >

    <!-- Presentation action schemata -->

    <!ENTITY % pactions
         "%maction.qname;" >
    <!ATTLIST %maction.qname;
          %MATHML.Common.attrib;
          %att-actiontype;
          %att-selection;
    >

    <!-- The following entity for substitution into
         content constructs excludes elements that
         are not valid as expressions.
    -->

    <!ENTITY % PresInCont
         "%ptoken; | %petoken; |
          %plschema; | %peschema; | %pactions;" >

    <!-- Presentation entity: all presentation constructs -->

    <!ENTITY % Presentation
         "%ptoken; | %petoken; | %pscreschema; |
          %plschema; | %peschema; | %pactions;">

    <!-- Content element set  ........................................ -->

    <!-- Attribute definitions -->

    <!ENTITY % att-base
         "base         CDATA                    '10'" >
    <!ENTITY % att-closure
         "closure      CDATA                    'closed'" >
    <!ENTITY % att-definition
         "definitionURL CDATA                   ''" >
    <!ENTITY % att-encoding
         "encoding     CDATA                    ''" >
    <!ENTITY % att-nargs
         "nargs        CDATA                    '1'" >
    <!ENTITY % att-occurrence
         "occurrence   CDATA                    'function-model'" >
    <!ENTITY % att-order
         "order        CDATA                    'numeric'" >
    <!ENTITY % att-scope
         "scope        CDATA                    'local'" >
    <!ENTITY % att-type
         "type         CDATA                    #IMPLIED" >

    <!-- Content elements: leaf nodes -->

    <!ENTITY % ctoken
         "%csymbol.qname; | %ci.qname; | %cn.qname;" >

    <!ATTLIST %ci.qname;
          %MATHML.Common.attrib;
          %att-type;
          %att-definition;
          %att-encoding;
    >

    <!ATTLIST %csymbol.qname;
          %MATHML.Common.attrib;
          %att-encoding;
          %att-type;
          %att-definition;
    >

    <!ATTLIST %cn.qname;
          %MATHML.Common.attrib;
          %att-type;
          %att-base;
          %att-definition;
          %att-encoding;
    >

    <!-- Content elements: specials -->

    <!ENTITY % cspecial
         "%apply.qname; | %reln.qname; |
          %lambda.qname;" >

    <!ATTLIST %apply.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %reln.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %lambda.qname;
          %MATHML.Common.attrib;
    >

    <!-- Content elements: others -->

    <!ENTITY % cother
         "%condition.qname; | %declare.qname; | %sep.qname;" >

    <!ATTLIST %condition.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %declare.qname;
          %MATHML.Common.attrib;
          %att-type;
          %att-scope;
          %att-nargs;
          %att-occurrence;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %sep.qname;  EMPTY >
    <!ATTLIST %sep.qname;
          %MATHML.xmlns.attrib; >

    <!-- Content elements: semantic mapping -->

    <!ENTITY % csemantics
         "%semantics.qname; | %annotation.qname; |
          %annotation-xml.qname;" >

    <!ATTLIST %semantics.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ATTLIST %annotation.qname;
          %MATHML.Common.attrib;
          %att-encoding;
    >

    <!ATTLIST %annotation-xml.qname;
          %MATHML.Common.attrib;
          %att-encoding;
    >

    <!-- Content elements: constructors -->

    <!ENTITY % cconstructor
         "%interval.qname; | %list.qname; | %matrix.qname;
          | %matrixrow.qname; | %set.qname; | %vector.qname;
          | %piecewise.qname; " >

    <!ATTLIST %interval.qname;
          %MATHML.Common.attrib;
          %att-closure;
    >

    <!ATTLIST %set.qname;
          %MATHML.Common.attrib;
          %att-type;
    >

    <!ATTLIST %list.qname;
          %MATHML.Common.attrib;
          %att-order;
    >

    <!ATTLIST %vector.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %matrix.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %matrixrow.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %piecewise.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %piece.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %otherwise.qname;
          %MATHML.Common.attrib;
    >

    <!-- Content elements: symbols -->

    <!ENTITY % c0ary
        "%integers.qname; |
         %reals.qname; |
         %rationals.qname; |
         %naturalnumbers.qname; |
         %complexes.qname; |
         %primes.qname; |
         %exponentiale.qname; |
         %imaginaryi.qname; |
         %notanumber.qname; |
         %true.qname; |
         %false.qname; |
         %emptyset.qname; |
         %pi.qname; |
         %eulergamma.qname; |
         %infinity.qname;" >

    <!ELEMENT %integers.qname;  EMPTY >
    <!ATTLIST %integers.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %reals.qname;  EMPTY >
    <!ATTLIST %reals.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %rationals.qname;  EMPTY >
    <!ATTLIST %rationals.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %naturalnumbers.qname;  EMPTY >
    <!ATTLIST %naturalnumbers.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %complexes.qname;  EMPTY >
    <!ATTLIST %complexes.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %primes.qname;  EMPTY >
    <!ATTLIST %primes.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %exponentiale.qname;  EMPTY >
    <!ATTLIST %exponentiale.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %imaginaryi.qname;  EMPTY >
    <!ATTLIST %imaginaryi.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %notanumber.qname;  EMPTY >
    <!ATTLIST %notanumber.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %true.qname;  EMPTY >
    <!ATTLIST %true.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %false.qname;  EMPTY >
    <!ATTLIST %false.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %emptyset.qname;  EMPTY >
    <!ATTLIST %emptyset.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %pi.qname;  EMPTY >
    <!ATTLIST %pi.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %eulergamma.qname;  EMPTY >
    <!ATTLIST %eulergamma.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %infinity.qname;  EMPTY >
    <!ATTLIST %infinity.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!-- Content elements: operators -->

    <!ENTITY % cfuncop1ary
         "%inverse.qname; | %ident.qname;|
          %domain.qname; |  %codomain.qname; |
          %image.qname;  " >

    <!ELEMENT %inverse.qname;  EMPTY >
    <!ATTLIST %inverse.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %domain.qname;  EMPTY >
    <!ATTLIST %domain.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %codomain.qname;  EMPTY >
    <!ATTLIST %codomain.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %image.qname;  EMPTY >
    <!ATTLIST %image.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cfuncopnary
         "%fn.qname; | %compose.qname;" >

    <!ATTLIST %fn.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %ident.qname;  EMPTY >
    <!ATTLIST %ident.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %compose.qname;  EMPTY >
    <!ATTLIST %compose.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % carithop1ary
         "%abs.qname; | %conjugate.qname; | %exp.qname; | %factorial.qname; |
          %arg.qname; | %real.qname; | %imaginary.qname; |
          %floor.qname; | %ceiling.qname;" >

    <!ELEMENT %exp.qname;  EMPTY >
    <!ATTLIST %exp.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %abs.qname;  EMPTY >
    <!ATTLIST %abs.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arg.qname;  EMPTY >
    <!ATTLIST %arg.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %real.qname;  EMPTY >
    <!ATTLIST %real.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %imaginary.qname;  EMPTY >
    <!ATTLIST %imaginary.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %conjugate.qname;  EMPTY >
    <!ATTLIST %conjugate.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %factorial.qname;  EMPTY >
    <!ATTLIST %factorial.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %floor.qname;  EMPTY >
    <!ATTLIST %floor.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %ceiling.qname;  EMPTY >
    <!ATTLIST %ceiling.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >
    <!ENTITY % carithop1or2ary
         "%minus.qname;" >

    <!ELEMENT %minus.qname;  EMPTY >
    <!ATTLIST %minus.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % carithop2ary
         "%quotient.qname; | %divide.qname; | %power.qname; | %rem.qname;" >

    <!ELEMENT %quotient.qname;  EMPTY >
    <!ATTLIST %quotient.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %divide.qname;  EMPTY >
    <!ATTLIST %divide.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %power.qname;  EMPTY >
    <!ATTLIST %power.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %rem.qname;  EMPTY >
    <!ATTLIST %rem.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % carithopnary
         "%plus.qname; | %times.qname; | %max.qname;
          | %min.qname; | %gcd.qname; | %lcm.qname;" >

    <!ELEMENT %plus.qname;  EMPTY >
    <!ATTLIST %plus.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %max.qname;  EMPTY >
    <!ATTLIST %max.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %min.qname;  EMPTY >
    <!ATTLIST %min.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %times.qname;  EMPTY >
    <!ATTLIST %times.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %gcd.qname;  EMPTY >
    <!ATTLIST %gcd.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %lcm.qname;  EMPTY >
    <!ATTLIST %lcm.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % carithoproot
         "%root.qname;" >

    <!ELEMENT %root.qname;  EMPTY >
    <!ATTLIST %root.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clogicopquant
         "%exists.qname; | %forall.qname;" >

    <!ELEMENT %exists.qname;  EMPTY >
    <!ATTLIST %exists.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %forall.qname;  EMPTY >
    <!ATTLIST %forall.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clogicopnary
         "%and.qname; | %or.qname; | %xor.qname;" >

    <!ELEMENT %and.qname;  EMPTY >
    <!ATTLIST %and.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %or.qname;  EMPTY >
    <!ATTLIST %or.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %xor.qname;  EMPTY >
    <!ATTLIST %xor.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clogicop1ary
         "%not.qname;" >

    <!ELEMENT %not.qname;  EMPTY >
    <!ATTLIST %not.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clogicop2ary
         "%implies.qname;" >

    <!ELEMENT %implies.qname;  EMPTY >
    <!ATTLIST %implies.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % ccalcop
         "%log.qname; | %int.qname; | %diff.qname; | %partialdiff.qname; |
          %divergence.qname; | %grad.qname; | %curl.qname; | %laplacian.qname;" >

    <!ELEMENT %divergence.qname;  EMPTY >
    <!ATTLIST %divergence.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %grad.qname;  EMPTY >
    <!ATTLIST %grad.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %curl.qname;  EMPTY >
    <!ATTLIST %curl.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %laplacian.qname;  EMPTY >
    <!ATTLIST %laplacian.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %log.qname;  EMPTY >
    <!ATTLIST %log.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %int.qname;  EMPTY >
    <!ATTLIST %int.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %diff.qname;  EMPTY >
    <!ATTLIST %diff.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %partialdiff.qname;  EMPTY >
    <!ATTLIST %partialdiff.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % ccalcop1ary
         "%ln.qname;" >

    <!ELEMENT %ln.qname;  EMPTY >
    <!ATTLIST %ln.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % csetop1ary
         "%card.qname;" >

    <!ELEMENT %card.qname;  EMPTY >
    <!ATTLIST %card.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % csetop2ary
         "%setdiff.qname;" >

    <!ELEMENT %setdiff.qname;  EMPTY >
    <!ATTLIST %setdiff.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % csetopnary
         "%union.qname; | %intersect.qname; | %cartesianproduct.qname; " >

    <!ELEMENT %union.qname;  EMPTY >
    <!ATTLIST %union.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %intersect.qname;  EMPTY >
    <!ATTLIST %intersect.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %cartesianproduct.qname;  EMPTY >
    <!ATTLIST %cartesianproduct.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cseqop
         "%sum.qname; | %product.qname; | %limit.qname;" >

    <!ELEMENT %sum.qname;  EMPTY >
    <!ATTLIST %sum.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %product.qname;  EMPTY >
    <!ATTLIST %product.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %limit.qname;  EMPTY >
    <!ATTLIST %limit.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % ctrigop
         "%sin.qname; | %cos.qname; | %tan.qname;
          | %sec.qname; | %csc.qname; | %cot.qname;
          | %sinh.qname; | %cosh.qname; | %tanh.qname;
          | %sech.qname; | %csch.qname; | %coth.qname;
          | %arcsin.qname; | %arccos.qname; | %arctan.qname;
          | %arccosh.qname; | %arccot.qname; | %arccoth.qname;
          | %arccsc.qname; | %arccsch.qname; | %arcsec.qname;
          | %arcsech.qname; | %arcsinh.qname; | %arctanh.qname;
          " >

    <!ELEMENT %sin.qname;  EMPTY >
    <!ATTLIST %sin.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %cos.qname;  EMPTY >
    <!ATTLIST %cos.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %tan.qname;  EMPTY >
    <!ATTLIST %tan.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %sec.qname;  EMPTY >
    <!ATTLIST %sec.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %csc.qname;  EMPTY >
    <!ATTLIST %csc.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %cot.qname;  EMPTY >
    <!ATTLIST %cot.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %sinh.qname;  EMPTY >
    <!ATTLIST %sinh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %cosh.qname;  EMPTY >
    <!ATTLIST %cosh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %tanh.qname;  EMPTY >
    <!ATTLIST %tanh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %sech.qname;  EMPTY >
    <!ATTLIST %sech.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %csch.qname;  EMPTY >
    <!ATTLIST %csch.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %coth.qname;  EMPTY >
    <!ATTLIST %coth.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arcsin.qname;  EMPTY >
    <!ATTLIST %arcsin.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccos.qname;  EMPTY >
    <!ATTLIST %arccos.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arctan.qname;  EMPTY >
    <!ATTLIST %arctan.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccosh.qname;  EMPTY >
    <!ATTLIST %arccosh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccot.qname;  EMPTY >
    <!ATTLIST %arccot.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccoth.qname;  EMPTY >
    <!ATTLIST %arccoth.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccsc.qname;  EMPTY >
    <!ATTLIST %arccsc.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arccsch.qname;  EMPTY >
    <!ATTLIST %arccsch.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arcsec.qname;  EMPTY >
    <!ATTLIST %arcsec.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arcsech.qname;  EMPTY >
    <!ATTLIST %arcsech.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arcsinh.qname;  EMPTY >
    <!ATTLIST %arcsinh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %arctanh.qname;  EMPTY >
    <!ATTLIST %arctanh.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cstatopnary
         "%mean.qname; | %sdev.qname; |
          %variance.qname; | %median.qname; |
          %mode.qname;" >

    <!ELEMENT %mean.qname;  EMPTY >
    <!ATTLIST %mean.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %sdev.qname;  EMPTY >
    <!ATTLIST %sdev.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %variance.qname;  EMPTY >
    <!ATTLIST %variance.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %median.qname;  EMPTY >
    <!ATTLIST %median.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %mode.qname;  EMPTY >
    <!ATTLIST %mode.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cstatopmoment
         "%moment.qname;" >

    <!ELEMENT %moment.qname;  EMPTY >
    <!ATTLIST %moment.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clalgop1ary
         "%determinant.qname; |
          %transpose.qname;" >

    <!ELEMENT %determinant.qname;  EMPTY >
    <!ATTLIST %determinant.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %transpose.qname;  EMPTY >
    <!ATTLIST %transpose.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clalgop2ary
         "%vectorproduct.qname;
          | %scalarproduct.qname;
          | %outerproduct.qname;" >

    <!ELEMENT %vectorproduct.qname;  EMPTY >
    <!ATTLIST %vectorproduct.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %scalarproduct.qname;  EMPTY >
    <!ATTLIST %scalarproduct.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %outerproduct.qname;  EMPTY >
    <!ATTLIST %outerproduct.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % clalgopnary
         "%selector.qname;" >

    <!ELEMENT %selector.qname;  EMPTY >
    <!ATTLIST %selector.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!-- Content elements: relations -->

    <!ENTITY % cgenrel2ary
         "%neq.qname; | %factorof.qname;" >

    <!ELEMENT %neq.qname;  EMPTY >
    <!ATTLIST %neq.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %factorof.qname;  EMPTY >
    <!ATTLIST %factorof.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cgenrelnary
         "%eq.qname; | %leq.qname; | %lt.qname; | %geq.qname;
          | %gt.qname;| %equivalent.qname; | %approx.qname;" >

    <!ELEMENT %eq.qname;  EMPTY >
    <!ATTLIST %eq.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %equivalent.qname;  EMPTY >
    <!ATTLIST %equivalent.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %approx.qname;  EMPTY >
    <!ATTLIST %approx.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %gt.qname;  EMPTY >
    <!ATTLIST %gt.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %lt.qname;  EMPTY >
    <!ATTLIST %lt.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %geq.qname;  EMPTY >
    <!ATTLIST %geq.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %leq.qname;  EMPTY >
    <!ATTLIST %leq.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % csetrel2ary
         "%in.qname; | %notin.qname; | %notsubset.qname; | %notprsubset.qname;" >

    <!ELEMENT %in.qname;  EMPTY >
    <!ATTLIST %in.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %notin.qname;  EMPTY >
    <!ATTLIST %notin.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %notsubset.qname;  EMPTY >
    <!ATTLIST %notsubset.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %notprsubset.qname;  EMPTY >
    <!ATTLIST %notprsubset.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % csetrelnary
         "%subset.qname; | %prsubset.qname;" >

    <!ELEMENT %subset.qname;  EMPTY >
    <!ATTLIST %subset.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ELEMENT %prsubset.qname;  EMPTY >
    <!ATTLIST %prsubset.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
    >

    <!ENTITY % cseqrel2ary
         "%tendsto.qname;" >

    <!ELEMENT %tendsto.qname;  EMPTY >
    <!ATTLIST %tendsto.qname;
          %MATHML.Common.attrib;
          %att-definition;
          %att-encoding;
          %att-type;
    >

    <!-- Content elements: quantifiers -->

    <!ENTITY % cquantifier
         "%lowlimit.qname; | %uplimit.qname; | %bvar.qname;
          | %degree.qname; | %logbase.qname;
          | %momentabout.qname; | %domainofapplication.qname; " >

    <!ATTLIST %lowlimit.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %uplimit.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %bvar.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %degree.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %logbase.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %momentabout.qname;
          %MATHML.Common.attrib;
    >

    <!ATTLIST %domainofapplication.qname;
          %MATHML.Common.attrib;
    >

    <!-- Operator groups -->

    <!ENTITY % cop1ary
         "%cfuncop1ary; | %carithop1ary; | %clogicop1ary; |
          %ccalcop1ary; | %ctrigop; | %clalgop1ary; |
          %csetop1ary;" >

    <!ENTITY % cop2ary
         "%carithop2ary; | %clogicop2ary;| %clalgop2ary; | %csetop2ary;" >

    <!ENTITY % copnary
         "%cfuncopnary; | %carithopnary; | %clogicopnary; |
          %csetopnary; | %cstatopnary; | %clalgopnary;" >

    <!ENTITY % copmisc
         "%carithoproot; | %carithop1or2ary; | %ccalcop; |
          %cseqop; | %cstatopmoment; | %clogicopquant;" >

    <!-- Relation groups -->

    <!ENTITY % crel2ary
         "%cgenrel2ary; | %csetrel2ary; | %cseqrel2ary;" >

    <!ENTITY % crelnary
         "%cgenrelnary; | %csetrelnary;" >

    <!-- Content constructs: all -->

    <!ENTITY % Content
         "%ctoken; | %cspecial; | %cother; | %csemantics; | %c0ary;
          | %cconstructor; | %cquantifier; | %cop1ary; | %cop2ary;
          | %copnary; |%copmisc; | %crel2ary; | %crelnary;" >

    <!-- Content constructs for substitution in presentation structures -->

    <!ENTITY % ContInPres
         "%ci.qname; |%csymbol.qname;| %cn.qname; | %c0ary; |
          %apply.qname; | %fn.qname; |
          %lambda.qname; | %reln.qname; |
          %cconstructor; |
          %semantics.qname; |%declare.qname;" >

    <!-- ............................................................. -->
    <!-- Recursive definition for content of expressions. Include
         presentation constructs at lowest level so presentation
         layout schemata hold presentation or content elements.
         Include content constructs at lowest level so content
         elements hold PCDATA or presentation elements at leaf
         level (for permitted substitutable elements in context)
    -->

    <!ENTITY % ContentExpression
         "(%Content; | %PresInCont;)*" >
    <!ENTITY % PresExpression
         "(%Presentation; | %ContInPres;)*" >
    <!ENTITY % MathExpression
         "(%PresInCont; | %ContInPres;)*" >

    <!-- PCDATA or MathML character elements -->
    <!ENTITY % MathMLCharacters
         "#PCDATA | %mglyph.qname; " >

    <!-- Content elements: tokens                       -->
    <!-- (may contain embedded presentation constructs) -->

    <!ELEMENT %ci.qname;                 (%MathMLCharacters; | %PresInCont;)* >
    <!ELEMENT %csymbol.qname;            (%MathMLCharacters; | %PresInCont;)* >
    <!ELEMENT %cn.qname;                 (%MathMLCharacters; | %sep.qname; | %PresInCont;)* >

    <!-- Content elements: special -->

    <!ELEMENT %apply.qname;              (%ContentExpression;) >
    <!ELEMENT %reln.qname;               (%ContentExpression;) >
    <!ELEMENT %lambda.qname;             (%ContentExpression;) >

    <!-- Content elements: other -->

    <!ELEMENT %condition.qname;          (%ContentExpression;) >
    <!ELEMENT %declare.qname;            (%ContentExpression;) >

    <!-- Content elements: semantics -->

    <!ELEMENT %semantics.qname;          (%ContentExpression;) >
    <!ENTITY % Annotation.content  "( #PCDATA )" >
    <!ELEMENT %annotation.qname;         %Annotation.content; >

    <!ENTITY % Annotation-xml.content "ANY" >
    <!ELEMENT %annotation-xml.qname;     %Annotation-xml.content; >

    <!-- Content elements: constructors -->

    <!ELEMENT %interval.qname;           (%ContentExpression;) >
    <!ELEMENT %set.qname;                (%ContentExpression;) >
    <!ELEMENT %list.qname;               (%ContentExpression;) >
    <!ELEMENT %vector.qname;             (%ContentExpression;) >
    <!ELEMENT %matrix.qname;             (%ContentExpression;) >
    <!ELEMENT %matrixrow.qname;          (%ContentExpression;) >

    <!ELEMENT %piecewise.qname;          ((%piece.qname;)*, (%otherwise.qname;)? ) >
    <!ELEMENT %piece.qname;              (%ContentExpression;) >
    <!ELEMENT %otherwise.qname;          (%ContentExpression;) >

    <!-- Content elements: operator (user-defined) -->

    <!ELEMENT %fn.qname;                 (%ContentExpression;) >

    <!-- Content elements: quantifiers -->

    <!ELEMENT %lowlimit.qname;           (%ContentExpression;) >
    <!ELEMENT %uplimit.qname;            (%ContentExpression;) >
    <!ELEMENT %bvar.qname;               (%ContentExpression;) >
    <!ELEMENT %degree.qname;             (%ContentExpression;) >
    <!ELEMENT %logbase.qname;            (%ContentExpression;) >
    <!ELEMENT %momentabout.qname;        (%ContentExpression;) >
    <!ELEMENT %domainofapplication.qname; (%ContentExpression;) >

    <!-- ............................................................. -->
    <!-- Presentation layout schemata contain tokens,
         layout and content schemata.
    -->

    <!ELEMENT %mstyle.qname;             (%PresExpression;) >
    <!ELEMENT %merror.qname;             (%PresExpression;) >
    <!ELEMENT %mphantom.qname;           (%PresExpression;) >
    <!ELEMENT %mrow.qname;               (%PresExpression;) >
    <!ELEMENT %mfrac.qname;              (%PresExpression;) >
    <!ELEMENT %msqrt.qname;              (%PresExpression;) >
    <!ELEMENT %menclose.qname;           (%PresExpression;) >
    <!ELEMENT %mroot.qname;              (%PresExpression;) >
    <!ELEMENT %msub.qname;               (%PresExpression;) >
    <!ELEMENT %msup.qname;               (%PresExpression;) >
    <!ELEMENT %msubsup.qname;            (%PresExpression;) >
    <!ELEMENT %mmultiscripts.qname;      (%PresExpression;) >
    <!ELEMENT %munder.qname;             (%PresExpression;) >
    <!ELEMENT %mover.qname;              (%PresExpression;) >
    <!ELEMENT %munderover.qname;         (%PresExpression;) >
    <!ELEMENT %mtable.qname;             (%PresExpression;) >
    <!ELEMENT %mtr.qname;                (%PresExpression;) >
    <!ELEMENT %mlabeledtr.qname;         (%PresExpression;) >
    <!ELEMENT %mtd.qname;                (%PresExpression;) >
    <!ELEMENT %maction.qname;            (%PresExpression;) >
    <!ELEMENT %mfenced.qname;            (%PresExpression;) >
    <!ELEMENT %mpadded.qname;            (%PresExpression;) >

    <!-- Presentation elements contain PCDATA or malignmark constructs. -->

    <!ELEMENT %mi.qname;                 (%MathMLCharacters; |
          %malignmark.qname;)* >
    <!ELEMENT %mn.qname;                 (%MathMLCharacters; |
          %malignmark.qname;)* >
    <!ELEMENT %mo.qname;                 (%MathMLCharacters; |
          %malignmark.qname;)* >
    <!ELEMENT %mtext.qname;              (%MathMLCharacters; |
          %malignmark.qname;)* >
    <!ELEMENT %ms.qname;                 (%MathMLCharacters; |
          %malignmark.qname;)* >

    <!-- Browser interface definition  ............................... -->

    <!-- Attributes for top-level element "math" -->

    <!ENTITY % att-macros
         "macros       CDATA                    #IMPLIED" >
    <!ENTITY % att-mode
         "mode         CDATA                    #IMPLIED" >
    <!ENTITY % att-display
         "display      CDATA                    #IMPLIED" >

    <!ENTITY % att-topinfo
         "%MATHML.Common.attrib;
          %att-macros;
          %att-mode;
          %att-display;" >

    <!-- Attributes for browser interface element -->

    <!ENTITY % att-baseline
         "baseline     CDATA                    #IMPLIED" >
    <!ENTITY % att-overflow
         "overflow  ( scroll | elide | truncate | scale ) 'scroll'" >
    <!ENTITY % att-altimg
         "altimg       CDATA                    #IMPLIED" >
    <!ENTITY % att-alttext
         "alttext      CDATA                    #IMPLIED" >

    <!ENTITY % att-browif
         "%att-type;
          %att-name;
          %att-height;
          %att-width;
          %att-baseline;
          %att-overflow;
          %att-altimg;
          %att-alttext;" >

    <!-- ............................................................. -->
    <!-- The top-level element "math" contains MathML encoded
         mathematics. The "math" element has the browser info
         attributes iff it is also the browser interface element.
    -->

    <!ELEMENT %math.qname;               (%MathExpression;) >

    <!ATTLIST %math.qname;
          %att-topinfo;
          %att-browif; >

    <!-- MathML Character Entities .............................................. -->
    <!ENTITY % mathml-charent.module "INCLUDE" >
    <![%mathml-charent.module;[
    <!-- Entity sets from ISO Technical Report 9573-13 ..... -->

    <!ENTITY % ent-isoamsa
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Arrow Relations for MathML 2.0//EN"
                 "isoamsa.ent" >
    %ent-isoamsa;

    <!ENTITY % ent-isoamsb
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Binary Operators for MathML 2.0//EN"
                 "isoamsb.ent" >
    %ent-isoamsb;

    <!ENTITY % ent-isoamsc
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Delimiters for MathML 2.0//EN"
                 "isoamsc.ent" >
    %ent-isoamsc;

    <!ENTITY % ent-isoamsn
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Negated Relations for MathML 2.0//EN"
                 "isoamsn.ent" >
    %ent-isoamsn;

    <!ENTITY % ent-isoamso
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Ordinary for MathML 2.0//EN"
                 "isoamso.ent" >
    %ent-isoamso;

    <!ENTITY % ent-isoamsr
          PUBLIC "-//W3C//ENTITIES Added Math Symbols: Relations for MathML 2.0//EN"
                 "isoamsr.ent" >
    %ent-isoamsr;

    <!ENTITY % ent-isogrk3
          PUBLIC "-//W3C//ENTITIES Greek Symbols for MathML 2.0//EN"
                 "isogrk3.ent" >
    %ent-isogrk3;

    <!ENTITY % ent-isomfrk
          PUBLIC "-//W3C//ENTITIES Math Alphabets: Fraktur for MathML 2.0//EN"
                 "isomfrk.ent" >
    %ent-isomfrk;

    <!ENTITY % ent-isomopf
          PUBLIC "-//W3C//ENTITIES Math Alphabets: Open Face for MathML 2.0//EN"
                 "isomopf.ent" >
    %ent-isomopf;

    <!ENTITY % ent-isomscr
          PUBLIC "-//W3C//ENTITIES Math Alphabets: Script for MathML 2.0//EN"
                 "isomscr.ent" >
    %ent-isomscr;

    <!ENTITY % ent-isotech
          PUBLIC "-//W3C//ENTITIES General Technical for MathML 2.0//EN"
                 "isotech.ent" >
    %ent-isotech;

    <!-- Entity sets from informative annex to ISO 8879:1986 (SGML) ....... -->

    <!ENTITY % ent-isobox
          PUBLIC "-//W3C//ENTITIES Box and Line Drawing for MathML 2.0//EN"
                 "isobox.ent" >
    %ent-isobox;

    <!ENTITY % ent-isocyr1
          PUBLIC "-//W3C//ENTITIES Russian Cyrillic for MathML 2.0//EN"
                 "isocyr1.ent" >
    %ent-isocyr1;

    <!ENTITY % ent-isocyr2
          PUBLIC "-//W3C//ENTITIES Non-Russian Cyrillic for MathML 2.0//EN"
                 "isocyr2.ent" >
    %ent-isocyr2;

    <!ENTITY % ent-isodia
          PUBLIC "-//W3C//ENTITIES Diacritical Marks for MathML 2.0//EN"
                 "isodia.ent" >
    %ent-isodia;

    <!ENTITY % ent-isolat1
          PUBLIC "-//W3C//ENTITIES Added Latin 1 for MathML 2.0//EN"
                 "isolat1.ent" >
    %ent-isolat1;

    <!ENTITY % ent-isolat2
          PUBLIC "-//W3C//ENTITIES Added Latin 2 for MathML 2.0//EN"
                 "isolat2.ent" >
    %ent-isolat2;

    <!ENTITY % ent-isonum
          PUBLIC "-//W3C//ENTITIES Numeric and Special Graphic for MathML 2.0//EN"
                 "isonum.ent" >
    %ent-isonum;

    <!ENTITY % ent-isopub
          PUBLIC "-//W3C//ENTITIES Publishing for MathML 2.0//EN"
                 "isopub.ent" >
    %ent-isopub;

    <!-- New characters defined by MathML ............................ -->

    <!ENTITY % ent-mmlextra
          PUBLIC "-//W3C//ENTITIES Extra for MathML 2.0//EN"
                 "mmlextra.ent" >
    %ent-mmlextra;

    <!-- MathML aliases for characters defined above ................. -->

    <!ENTITY % ent-mmlalias
          PUBLIC "-//W3C//ENTITIES Aiases for MathML 2.0//EN"
                 "mmlalias.ent" >
    %ent-mmlalias;

    <!-- end of MathML Character Entity section -->]]>

    <!-- Revision History:

           Initial draft (syntax = XML) 1997-05-09
              Stephen Buswell
           Revised 1997-05-14
              Robert Miner
           Revised 1997-06-29 and 1997-07-02
              Stephen Buswell
           Revised 1997-12-15
              Stephen Buswell
           Revised 1998-02-08
              Stephen Buswell
           Revised 1998-04-04
              Stephen Buswell
           Entities and small revisions 1999-02-21
              David Carlisle
           Added attribute definitionURL to ci and cn 1999-10-11
              Nico Poppelier
           Additions for MathML 2  1999-12-16
              David Carlisle
           Namespace support 2000-01-14
              David Carlisle
           XHTML Compatibility 2000-02-23
              Murray Altheim
           New content elements 2000-03-26
              David Carlisle
           Further revisions for MathML2 CR draft 2000-07-11
              David Carlisle
           Further revisions for MathML2 CR draft 2000-10-31
              David Carlisle

    -->

    <!-- end of MathML 2.0 DTD  ................................................ -->
    <!-- ....................................................................... -->

Overview: Mathematical Markup Language (MathML) Version 2.0
Previous: 8 Document Object Model for MathML
Next: B Content Markup Validation Grammar