<!--
# vim: sw=4 sta et
-->

<!ENTITY % section.class        "SH|SS">
<!ENTITY % block.class          "para|TP|comment|indent|verbatim|br|sp|table">
<!ENTITY % font.class           "b|i|tt">
<!ENTITY % inline.class         "#PCDATA|%font.class;">

<!-- This is the root element containing any number of manpages. -->
<!ELEMENT manpageset    (manpage)*>

<!ELEMENT manpage
    (comment*,(SH,refnameline),(%section.class;|%block.class;)*)>
<!ATTLIST manpage
    title               CDATA                   #REQUIRED
    sect                CDATA                   #REQUIRED
    h1                  CDATA                   #REQUIRED
    h2                  CDATA                   #REQUIRED
    h3                  CDATA                   #IMPLIED
    h4                  CDATA                   #IMPLIED
    h5                  CDATA                   #IMPLIED
    preprocessors       CDATA                   #IMPLIED
>

<!-- NAME section of the man page -->
<!ELEMENT refnameline   (refname+,refpurpose)>
<!ELEMENT refname       (%inline.class;)*>
<!ELEMENT refpurpose    (%inline.class;)*>

<!-- Section headings -->
<!ELEMENT SS            (%inline.class;)*>
<!ELEMENT SH            (%inline.class;)*>

<!-- Paragraph -->
<!ELEMENT para          (%inline.class;|%block.class;|leftindent)*>
<!ATTLIST para
    align               (l|r|c|b)               #IMPLIED
>

<!-- Paragraph with hanging tags -->
<!ELEMENT TP            (TPtag+,TPitem)>
<!ELEMENT TPtag         (%inline.class;)*>
<!ELEMENT TPitem        (%block.class;)*>
<!ATTLIST TP
    indent              CDATA                   #IMPLIED
>


<!-- Comment to be embedded in output -->
<!ELEMENT comment       (#PCDATA)>

<!-- Indent -->
<!ELEMENT indent        (%block.class;)*>
<!ATTLIST indent
    indent              CDATA                   #IMPLIED
>

<!-- Left indent for the following lines.  
     Not an actual macro, but it helps format man pages pretty. 
     FIXME: Better comment here -->
<!ELEMENT leftindent    (%inline.class;)*>
<!ATTLIST leftindent
    limit               CDATA                   #IMPLIED
>

<!-- Verbatim (turn off filling and adjusting) -->
<!ELEMENT verbatim      (%inline.class;)*>

<!-- Line spacing -->
<!ELEMENT sp            EMPTY>
<!ATTLIST sp
    length              CDATA                   #REQUIRED
>
<!ELEMENT br            EMPTY>

<!-- Bold, italic, monospace -->
<!ELEMENT b             (%inline.class;)*>
<!ELEMENT i             (%inline.class;)*>
<!ELEMENT tt            (%inline.class;)*>

<!-- Tables -->

<!ELEMENT table         (tgroup*)>
<!ELEMENT tgroup        (colspec*,spanspec*,thead?,tbody,tfoot?)>
<!ATTLIST tgroup
    cols                CDATA                   #REQUIRED
    rowsep              CDATA                   #IMPLIED
    colsep              CDATA                   #IMPLIED
    align               (left|right|center)     #IMPLIED
>

<!ELEMENT colspec       EMPTY>
<!ATTLIST colspec
    colname             NMTOKEN                 #IMPLIED
    colnum              CDATA                   #IMPLIED
    colsep              CDATA                   #IMPLIED
    rowsep              CDATA                   #IMPLIED
    align               (left|right|center)     #IMPLIED
    colwidth            CDATA                   #IMPLIED
>

<!ELEMENT spanspec      EMPTY>
<!ATTLIST spanspec
    spanname            NMTOKEN                 #REQUIRED
    namest              NMTOKEN                 #REQUIRED
    nameend             NMTOKEN                 #REQUIRED
    align               (left|right|center)     #IMPLIED
    colsep              CDATA                   #IMPLIED
    rowsep              CDATA                   #IMPLIED
>

<!ELEMENT tbody         (row*)>
<!ELEMENT thead         (colspec*,row*)>
<!ELEMENT tfoot         (colspec*,row*)>

<!ELEMENT row           ((entry|simentry)+)>
<!ATTLIST row
    rowsep              CDATA                   #IMPLIED
>

<!-- This is a "simple" entry in the table,
     meaning that we do not enter the entry as @T{} text block.
     This means that the text is NOT flowed, which is usually
     not what you want.  -->
<!ELEMENT simentry       (%inline.class;)*>
<!ATTLIST simentry
    colname             NMTOKEN                 #IMPLIED
    spanname            NMTOKEN                 #IMPLIED
    namest              NMTOKEN                 #IMPLIED
    nameend             NMTOKEN                 #IMPLIED
    align               (left|right|center)     #IMPLIED
    colsep              CDATA                   #IMPLIED
    rowsep              CDATA                   #IMPLIED
    morerows            CDATA                   #IMPLIED
>

<!-- Although XML does not allow us to enforce exclusions,
     we will never allow a table to appear as a descendant
     of entry (since nested tables are not supported
     by tbl). -->
<!ELEMENT entry         (%inline.class;|%block.class;)*>
<!ATTLIST entry
    colname             NMTOKEN                 #IMPLIED
    spanname            NMTOKEN                 #IMPLIED
    namest              NMTOKEN                 #IMPLIED
    nameend             NMTOKEN                 #IMPLIED
    align               (left|right|center)     #IMPLIED
    colsep              CDATA                   #IMPLIED
    rowsep              CDATA                   #IMPLIED
    morerows            CDATA                   #IMPLIED
>

