The formal SGML syntax declaration follows.
<!-- Snafu DTD for papers, memos and letters. Typical invocations: <!DOCTYPE spaper PUBLIC "-//Houston//DTD snafu5//EN"> <!DOCTYPE smemo PUBLIC "-//Houston//DTD snafu5//EN"> <!DOCTYPE sletter PUBLIC "-//Houston//DTD snafu5//EN"> --> <!ENTITY % em "emph | hp1 | hp2 | hp3 | hp0"-- Predefined phrases. --> <!ENTITY % lists "ul | ol | sl"-- Basic lists (unordered, ordered, simple). --> <!ENTITY % refs "hdref | figref | fnref | liref" -- Most cross references. --> <!ENTITY % u.phrases "user-defined-phrase"> <!ENTITY % phrases "%em | %u.phrases;" -- All phrase elements. --> <!ENTITY % u.notes "user-defined-note"> <!ENTITY % notes "fn | annotate | note | %u.notes;" -- All notes. --> <!ENTITY % u.code "user-defined-code"> <!ENTITY % code "code | %u.code;" -- All code. --> <!ENTITY % u.listing "user-defined-listing"> <!ENTITY % listing "listing | code-lines | %u.listing;" -- All listings. --> <!-- Phrase model. --> <!ENTITY % text "#PCDATA | q | ix | %code; | texeqn | %notes; | %phrases;"> <!-- Content models for architectural forms. --> <!ENTITY % c.phrases "(%text;)+"> <!ENTITY % c.notes "(p)+ -(%notes; | fig)"> <!ENTITY % c.code "(#PCDATA | ix | %notes;)+"> <!ENTITY % c.listing "(#PCDATA | ix | %notes;)+"> <!ELEMENT spaper O O (paperfront, body, index?)> <!ELEMENT smemo O O (memofront, body, closing?, signed?)> <!ELEMENT sletter O O (letterfront, body, closing?, signed?, ps*, enclosure?)> <!ATTLIST (spaper | smemo | sletter) version CDATA #FIXED "5" -- Version Number. --> <!ELEMENT paperfront O O (title & docnum? & date? & author & abstract? & copyrite? & thanks? & toc? & figlist?) -(%notes;)> <!ELEMENT memofront O O (from & to & subject & date? & cc? & through? & docnum? & actionby? & x-header*) -(%notes;)> <!ELEMENT letterfront O O ((sender? & dest? & subject? & cc? & date? & docnum?), opening?) -(%notes;)> <!ELEMENT body O O ((p | h1)+, appendix?)> <!-- Name and address elements. --> <!-- ID and IDREF are used in the spaper DTD to associate multiple authors with a single address. --> <!ELEMENT name O O (%text;)+ -- Name, probably a person. --> <!ATTLIST name address IDREF #IMPLIED> <!ELEMENT address - O (aline)+ -- Full address. --> <!ATTLIST address id ID #IMPLIED> <!ENTITY % address.comp "org | street | city | region | country | postcode| postbox"> <!ELEMENT aline O O (%text; | %address.comp;)+ -- Address line. --> <!ELEMENT (%address.comp;) - - (%text;)+ -- Optional address components. --> <!-- Contact details: phone, fax, email etc. --> <!ELEMENT contact - O (%text;)+> <!ATTLIST contact type CDATA #REQUIRED> <!-- Header elements. --> <!ELEMENT subject - O (%text;)+> <!ELEMENT line O O (%text;)+ -- Line of text. --> <!ELEMENT (docnum|date) - O (#PCDATA)> <!ELEMENT opening - O (%text;)+> <!ELEMENT closing - O (%text;)+> <!ELEMENT ps - O (%text;)+> <!ELEMENT sender - O (address, contact*)> <!ELEMENT dest - O (name+, address?)> <!ELEMENT signed - O (name)+> <!ELEMENT enclosure - O EMPTY> <!ELEMENT from - O (name)+> <!ELEMENT to - O (name)+> <!ELEMENT cc - O (name)+> <!ELEMENT through - O (name)+> <!ELEMENT actionby - O (#PCDATA)> <!ELEMENT x-header - O (x-head-t, (name)+)-- Arbitrary header. --> <!ELEMENT x-head-t O O (#PCDATA)-- Tag of arbitrary header. --> <!ELEMENT author - O (name, address?)+> <!ELEMENT title - O (line)+> <!ELEMENT abstract - O (p)+> <!ELEMENT copyrite - O (p)+ +(noprint)> <!ELEMENT thanks - O (p)+> <!ELEMENT noprint - O (p)+ -- Text to be omitted from hard-copy. --> <!ELEMENT (toc|figlist|index) -- Table of contents, figure list, -- - O EMPTY -- and index have generated content. --> <!ELEMENT ix - O (#PCDATA) -- Index entry. --> <!ATTLIST ix print CDATA #IMPLIED -- Printed in the text. --> <!-- Titled sections. --> <!ELEMENT h1 - O (h1t, (p | h2)+)> <!ELEMENT h2 - O (h2t, (p | h3)+)> <!ELEMENT h3 - O (h3t, (p | h4)+)> <!ELEMENT h4 - O (h4t, (p | h5)+)> <!ELEMENT h5 - O (h5t, p+)> <!ELEMENT (h1t, h2t, h3t, h4t, h5t) O O (%text;)+> <!ATTLIST (h1 | h2 | h3 | h4 | h5) id ID #IMPLIED> <!-- Appendix. --> <!ELEMENT appendix - O (h1)+> <!-- Paragraphs and short quotations. --> <!ELEMENT p O O (%text; | %lists; | tl | %listing; | texeqn-display | ref | %refs; | fig)+> <!ELEMENT q O O (%text;)+> <!-- Program code etc., conforming to the "code" architectural form. --> <!ELEMENT (%code;) - - %c.code;> <!ATTLIST (%code;) sarc NAME #FIXED code> <!-- Programs etc., conforming to the "listing" architectural form. --> <!ELEMENT (%listing;) - - %c.listing;> <!ATTLIST (%listing;) sarc NAME #FIXED listing> <!-- TeX mathematics. --> <!ELEMENT (texeqn | texeqn-display) - - (#PCDATA)> <!ATTLIST (texeqn | texeqn-display) content NOTATION (TeX) TeX> <!-- Lists. --> <!ELEMENT (%lists;) - - (li+)> <!ELEMENT li - O (p)+ -- List item. --> <!ATTLIST li id ID #IMPLIED> <!ELEMENT tl - - (tli)+ -- Tagged list. --> <!ELEMENT tli - O (tlit, tlid)> <!ELEMENT tlit O O (#PCDATA) -- Tagged list item tag. --> <!ELEMENT tlid O O (p)+ -- Tagged list item data. --> <!-- Notes, conforming to the "note" architectural form. --> <!ELEMENT (%notes;) - - %c.notes;> <!ATTLIST (fn | note | %u.notes;) id ID #IMPLIED sarc NAME #FIXED note> <!ATTLIST (annotate) id ID #IMPLIED resp CDATA #IMPLIED sarc NAME #FIXED note> <!-- Phrases, conforming to the "phrase" architectural form. --> <!ELEMENT (%phrases;) - - %c.phrases;> <!ATTLIST (%phrases;) sarc NAME #FIXED phrase> <!-- Figures. --> <!ELEMENT fig - - (figbody&figcap?) -(fig)> <!ATTLIST fig id ID #IMPLIED float (inline, here, top, bottom, page, float) float> <!ELEMENT figbody - O EMPTY -- Figure artwork. --> <!ATTLIST figbody file ENTITY #IMPLIED space NUTOKEN #IMPLIED x-scale NUTOKEN 1.0 y-scale NUTOKEN 1.0 rotation NUTOKEN 0 -- 0 to 360. -- position (left, centre, right) centre> <!ELEMENT figcap - O (p)+ -- Figure caption. --> <!-- Cross references. --> <!ELEMENT ref - O (#PCDATA)> <!ATTLIST ref refid IDREF #CONREF type (count | page) count> <!ELEMENT (%refs;) - O (#PCDATA)> <!ATTLIST (%refs;) refid IDREF #CONREF type (page | nopage) nopage> <!NOTATION ISO646 PUBLIC "+//ISO/IEC 646:1991//NOTATION IRV//EN"> <!-- alternatively, --> <!NOTATION ASCII PUBLIC "+//ISO/IEC 646:1991//NOTATION IRV//EN"> <!NOTATION Latin1 PUBLIC "+//ISO/IEC 8859-1:1987//NOTATION Latin1//EN"> <!-- Plain TeX, described by the TeXbook. --> <!NOTATION TeX PUBLIC "+//ISBN 0-201-13448//NOTATION TeX//EN"> <!-- Encapsulated PostScript. The ISBN refers to the PostScript Language Reference Manual. The requirements for "encapsulated" PostScript files are described in the paper "Encapsulated PostScript Files Specification Version 2.0", 1989 - a copy is included in the xv version 3 source code. --> <!NOTATION EPSF PUBLIC "+//ISBN 0-201-10174//NOTATION PostScript//EN"> <!-- Short references. --> <!-- Short quotations and paragraphs in the body. --> <!ENTITY ptag STARTTAG 'p' > <!ENTITY qtag STARTTAG 'q'> <!ENTITY qendtag ENDTAG 'q'> <!SHORTREF bodymap '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP bodymap body> <!-- Colon ends extension header tag. --> <!ENTITY x-tag ENDTAG 'x-head-t'> <!SHORTREF x-map ':' x-tag> <!USEMAP x-map x-head-t> <!-- End the document header at a blank line. --> <!SHORTREF headmap '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP headmap (paperfront | memofront | letterfront)> <!-- Seperate lines with a semicolon in some places. --> <!ENTITY nametag STARTTAG 'name'> <!SHORTREF namemap ';' nametag '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP namemap name> <!ENTITY linetag STARTTAG 'line'> <!SHORTREF linemap ';' linetag '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP linemap line> <!ENTITY alinetag STARTTAG 'aline'> <!SHORTREF alinemap ';' alinetag '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP alinemap aline> <!-- Blank line ends section title. May contain quotes. --> <!SHORTREF titlemap '"' qtag '&#RS;B&#RE;' ptag '&#RS;&#RE;' ptag> <!USEMAP titlemap (h1t, h2t)> <!SHORTREF qmap '"' qendtag> <!USEMAP qmap q> <!USEMAP #EMPTY (code | code-lines | texeqn | texeqn-display)> <!-- Colon ends item tag in a tagged list. --> <!ENTITY tlittag ENDTAG 'tlit'> <!SHORTREF tlitmap ':' tlittag> <!USEMAP tlitmap tlit> <!-- Supported character entity sets. --> <!ENTITY % ISOnum PUBLIC "ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN"> <!ENTITY % ISOpub PUBLIC "ISO 8879:1986//ENTITIES Publishing//EN"> <!ENTITY % ISOlat1 PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN"> <!ENTITY % ISOlat2 PUBLIC "ISO 8879:1986//ENTITIES Added Latin 2//EN"> <!ENTITY % ISOdia PUBLIC "ISO 8879:1986//ENTITIES Diacritical Marks//EN"> <!ENTITY % ISOtech PUBLIC "ISO 8879:1986//ENTITIES General Technical//EN"> %ISOnum; %ISOpub; %ISOlat1; %ISOlat2; %ISOdia; %ISOtech; <!-- Extra (non-ISO) entities. --> <!ENTITY TeX SDATA "[TeX ]"> <!ENTITY LaTeX SDATA "[LaTeX ]"> <!ENTITY smiley SDATA "[smiley]"> <!ENTITY wsp SDATA "[wsp ]" -- Interword space. -->