<!DOCTYPE TEI.2 PUBLIC "-//C. M. Sperberg-McQueen//DTD
          TEI Lite 1.0 plus SWeb//EN"
          [
<!ENTITY english.wsd system 'teien.wsd' NDATA WSD>
<!ENTITY date.last.touched '7 July 1999'>
<!ENTITY subsetof 'is a subset of' >
<!ENTITY Sigma    'Sigma' >
]>
<tei.2>
<teiHeader>
<fileDesc>
<titleStmt><title>
Constructing an XML Version of the TEI DTD
</title>
<author>
C. M. Sperberg-McQueen
</author>
</titleStmt>
<publicationStmt><p>
An unpublished document.
</p></publicationStmt>
<sourceDesc><p>
No source:  this electronic form is the original form.
</p></sourceDesc>
</fileDesc>
<profileDesc>
  <langUsage>
    <language id=eng wsd=english.wsd usage='100'></language>
  </langUsage>
</profileDesc>
<revisionDesc>
<list type=bullets>
<item>1999-07-07 : CMSMcQ : stop suppressing att, gi, tag, val.
They aren't in the main GI and they aren't given replacement
declarations.</item>
<item>1999-07-07 : CMSMcQ : wrap declaration of set element
in a marked section for TEI.drama</item>
<item>1999-07-06 : CMSMcQ : fix problem with PCDATA elements:
their enclosure in marked sections was incomplete, and they
lacked attlist declarations.
</item>
<item>1999-06-17 : CMSMcQ : test other tag sets, break up long
scraps</item>
<item>1999-06-03 : CMSMcQ : finish testing TEI.prose</item>
<item>1999-05-31 : CMSMcQ : finish alignment with Lou's list of
changes to TEI P3, and now try to get all the scraps into the
right driver scraps, and actually generate the extension files.
</item>
<item>1999-05-14 : CMSMcQ : try to get all the scraps into the
right driver scraps, and actually generate the extension files.
(This didn't happen, because I got caught aligning with the
revised TEI P3 DTD.)
</item>
<item>1999-05-07 : CMSMcQ : finish manual-changes section.  Now ready
to generate the actual extension files.   Discussion with Lou about
sequencing the work and how to finish.</item>
<item>1999-05-04 : CMSMcQ : what is this again?  huh?  I'm supposed
to finish this, but that requires understanding it again.  Rats.</item>
<item>1999-02-23 : CMSMcQ : driving toward home.  One by one, the
tag sets in the manual-changes section fall to the advancing
cursor.  Terminology is going to have to be rethought and rewritten, 
almost as fully as the dictionary chapter.</item>
<item>1999-02-23 : CMSMcQ : working through the manual-changes
section.</item>
<item>1999-02-22 : CMSMcQ : further work, in Oxford while waiting for LB
to deal with other business.  Mostly blocking out the
manual-changes section</item>
<item>1999-01-12 : CMSMcQ : broaden scope to include general
discussion of TEI DTD and XML (London, after EC meeting)</item>
<item>1998-01-10 : CMSMcQ : clean up some more (Chicago)</item>
<item>1998-01-08 : CMSMcQ : tag, clean up (still in Cambridge)</item>
<item>1998-01-08 : CMSMcQ : sketch imf, mf, m functions, put some
notes into electronic form</item>
<item>1998-01-04 : CMSMcQ : began work (on paper) in Cambridge,
Wisconsin</item>
</list>
</revisionDesc>
</teiHeader>
<text>
<front>
<titlePage>
<docTitle>
<titlePart>
Construction of an XML Version of the TEI DTD
</titlePart>
</docTitle>
<docAuthor>
C. M. Sperberg-McQueen
</docAuthor>
<docDate>
&date.last.touched;
</docDate>
<titlePart>
This unpublished document is distributed privately for comment by
friends and colleagues; it is not now a formal publication and should
not be quoted in published material.
</titlePart>
<titlePart>This document has not yet been reviewed by both editors
of the TEI; what it says about the beliefs of the editors should be
taken as a proposal by the author for the approval of his co-editor.
</titlePart>
</titlePage>
<divGen type='toc'>
<div1 type='Abstract'><head>Abstract</head>

<p>This document describes issues involved in creating an XML
version of the SGML document type definition (DTD) created by the Text
Encoding Initiative, and proposes solutions.  It defines a TEI
extensions file which incorporates those solutions, in order to allow
experimentation.</p>
<p>The discussion of inclusion exceptions defines a method of rewriting
SGML content models so as to achieve effects similar to those
provided by inclusion exceptions.
To make an SGML document type definition compatible with XML, inclusion
exceptions must be eliminated.  The simplest method of ensuring that
this change does not invalidate existing documents is to modify the
content model of every element which can occur as a descendant of any
element with inclusion exceptions in its content model, in the manner
described here.  That will ensure that elements named in inclusion
exceptions remain legal in all the locations where they are currently
legal.</p>

<p>The methods of changing content models described in this paper are
believed to preserve determinism (what ISO 8879 calls lack of
<term>ambiguity</term>) and to simulate the effects of inclusion
exceptions properly.  At this point, however, no proof of either
conjecture is offered.</p>

</div1>
</front>

<body>

<div1 type='section'><head>Introduction</head>
<div2 type='section'><head>XML and DTDs</head>
<p>The Extensible Markup Language (XML) defines a syntax for document
type definitions similar to that provided by the Standard
Generalized Markup Language (SGML), but more restrictive.  In
particular, XML allows neither inclusion nor exclusion exceptions, and
prohibits the ampersand connector.</p>
<p>Modifying an existing SGML document type definition (DTD), 
such as the TEI DTD, to conform to XML
thus involves:
<list type=bullets>
<item>removing tag omissibility information</item>
<item>normalizing references to parameter entities by ensuring
that they always end with a semicolon</item>
<item>removing <kw>&amp;</kw> connectors</item>
<item>normalizing mixed-content models to the canonical form
prescribed by XML (<kw>#PCDATA</kw> must come first, the list of
sub-elements must be flat, and the occurrence indicator must be a star)
</item>
<item>removing exclusion exceptions</item>
<item>removing inclusion exceptions</item>
</list>
</p>
</div2>
<div2>
<head>Modifying the TEI DTD for XML</head>
<p>This document describes in detail the changes necessary to  perform
these modifications on the TEI DTD.  The changes take the form of TEI
modifications files suitable for use as the entities
<ident>TEI.extensions.ent</ident> and
<ident>TEI.extensions.dtd</ident> files.</p>

<p>The modifications have different degrees of difficulty.   Some
affect the technical content of the TEI DTD in serious ways, and
therefore require review by the TEI's Technical Review Committee
before being formally integrated into TEI P3, while others do not
affect the technical content of the TEI at all, or affect it only in
minor ways. Changes of this latter type may be regarded as corrections
of obvious simple errors, and may be performed by the editors under
their authority to correct corrigible errors in the text of the
Guidelines. (The concept of corrigible error is defined in document
TEI ED W46 (?); in brief, a corrigible error is one which both editors
agree is an error, which has an obvious fix, and the fix for which
will not affect any existing data.)  Each change proposed in this
paper is identified as either a correction to a corrigible error,
which the editors expect to fix in the course of preparing a revised
and corrected reprint of TEI P3, or else a substantive change
requiring review by the Technical Review Committee.
</p>
</div2>

<div2>
<head>Overview of changes to the TEI DTD</head>
<p>Not all of the changes to the DTD are handled by this document.
<note place='foot'>In particular, this document does not suppress the
tag-omissibility indicators in the TEI DTD; that job is left to
special-purpose software.  In its current form, this document also
does not completely normalize all mixed content models to the form
required by XML.  I started to make it do so, and have just realized
that <ident>carthage</ident> may already do what is necessary.  I need
to find out for sure whether <ident>carthage</ident> does the job, and
either complete or remove the partial sets of changes described for
the mass redeclaration of all <ident>phrase.seq</ident> and
<ident>paraContent</ident> elements.</note>
Those that are, are summarized in the following overviews of
the extensions files.
<scrap name="teixml.ent" file="teixml.ent">
<<!>!--* teixml.ent:  XML version of TEI (1999-07-07)           *-->
<<!>!--* This is the TEI.extensions.ent file of an experimental
    * version of the TEI P3 DTD, adapted to be XML conformant.
    * N.B. using this extensions file with the standard TEI DTD
    * will not make the DTD completely XML compliant.  Some
    * post-processing is needed.  Use the pizza chef at
    * http://www.uic.edu/orgs/tei/pizza.html or
    * http://firth.natcorp.ox.ac.uk/TEI/nupizza.html
    *
    * This version:  1999-07-07b
    *
    * Send comments to tei-l@listserv.uic.edu or to 
    * teitech@listserv.uic.edu
    * Thank you for beta testing! 
    *-->
<ref target='tagsets'>Provide default tagset declarations</ref>
<ref target='kw'>Define TEI keywords</ref>

<ref target='ppfix'>Fix placePart class</ref>
<ref target="reproclass">Reproduce class declarations for phrases</ref>
<ref target='reproincl'>Reproduce inclusion classes</ref>
<ref target="reprospec">Reproduce classes used by specPara</ref>
<ref target='tagsetents'>Embed ent files for tag sets</ref>
<ref target="newincl">Element class m.Incl</ref>
<ref target="newspecPara">New specialPara</ref>
<ref target="newphrase">New declaration for phrase and phrase.seq</ref>
<!--* arget="newxcommon">New declaration for x.common</ref> *-->
<ref target="newpara">New declaration for paraContent</ref>
<ref target="newcomp">New declaration for component and component.seq</ref>

<ref target="xamp">Suppress definitions of elements with ampersand</ref>
<ref target="xxxexcl">Suppress element declarations with exclusions</ref>
<ref target="xxxpcdata">Suppress some mixed content elements</ref>
<ref target="xphrseq">Suppress users of phrase.seq</ref>
<ref target="xempty">Suppress standard definitions of PCDATA elements</ref>
<!--*
<ref target="xxxPhraseSeq">Suppress elements with phrase.seq</ref>
<ref target="xxxParaContent">Suppress elements with paraContent</ref>
*-->

<ref target="xco">Suppress definitions in core tag set</ref>
<ref target="xst">Suppress definitions in text-structure tag set</ref>
<ref target="xfr">Suppress definitions in front-matter tag set</ref>
<ref target="xhd">Suppress definitions in header tag set</ref>
<ref target="xve">Suppress definitions in verse tag set</ref>
<ref target="xdr">Suppress definitions in drama tag set</ref>
<ref target="xts">Suppress definitions in spoken-text tag set</ref>
<ref target="xte">Suppress definitions in terminology tag set</ref>
<ref target="xsa">Suppress definitions in segmentation and alignment tag set</ref>
<ref target="xai">Suppress definitions in analysis tag set</ref>
<ref target="xfs">Suppress definitions in feature-structures tag set</ref>
<ref target="xtc">Suppress definitions in text-criticism tag set</ref>
<ref target="xgd">Suppress definitions in graphs tag set</ref>
<ref target="xtf">Suppress definitions in tables tag set</ref>
</scrap>

<scrap name="teixml.dtd" file="teixml.dtd">
<<!>!--* teixml.dtd:  XML version of TEI (1999-07-07)           *-->
<<!>!--* This is the TEI.extensions.dtd file of an experimental
    * version of the TEI P3 DTD, adapted to be XML conformant.
    * N.B. using this extensions file with the standard TEI DTD
    * will not make the DTD completely XML compliant.  Some
    * post-processing is needed.  Use the pizza chef at
    * http://www.uic.edu/orgs/tei/pizza.html or
    * http://firth.natcorp.ox.ac.uk/TEI/nupizza.html
    *
    * This version:  1999-07-07b
    *
    * Send comments to tei-l@listserv.uic.edu or to 
    * teitech@listserv.uic.edu
    * Thank you for beta testing! 
    *-->
<ref target='newamp'>New definitions of elements with ampersand</ref>
<ref target='newpcdata'>Redeclare elements with mixed content models</ref>
<ref target='newphrseq'>New declarations for users of phrase.seq</ref>
<ref target='newexcl'>New declarations for exclusion exceptions</ref>
<ref target='newempty'>New declarations for PCDATA elements</ref>
<!--* <ref target='newPhraseSeq'>Redeclare elements with phrase.seq</ref>
      <ref target='newParaContent'>Redeclare elements with paraContent</ref>
*-->
<<!>!--* handle specialPara *-->
<ref target="newset">New declaration of set element</ref>

<ref target="newco">New definitions for core tag set</ref>
<ref target="newst">New definitions for text-structure tag set</ref>
<ref target="newfr">New definitions for front-matter tag set</ref>
<ref target="newhd">New definitions for header tag set</ref>
<ref target="newve">New definitions for verse tag set</ref>
<ref target="newdr">New definitions for drama tag set</ref>
<ref target="newts">New definitions for spoken-text tag set</ref>
<ref target="newte">New definitions for terminology tag set</ref>
<ref target="newtef">New definitions for flat terminology tag set</ref>
<ref target="newsa">New definitions for segmentation and alignment tag set</ref>
<ref target="newai">New definitions for analysis tag set</ref>
<ref target="newfs">New definitions for feature-structures tag set</ref>
<ref target="newtc">New definitions for text-criticism tag set</ref>
<ref target="newgd">New definitions for graphs tag set</ref>
<ref target="newtf">New definitions for tables tag set</ref>
</scrap></p>
</div2>
<div2>
<head>Intended use of this document</head>
<p>The immediate goal of this document is to allow experimentation
with the TEI DTD and XML processors, by providing the extensions files
needed to make the full TEI P3 DTD work with XML processors. To use
the extensions files created by this document with other extensions
files (e.g. those of TEI Lite), manual merger of the extensions files
is required.  The editors plan to automate this merger as soon as
possible; the following stages of development are anticipated:
<list>
<item>produce extensions files from this document</item>
<item>modify these extensions files to allow suppression or modification
of
individual elements, using the naming convention <mentioned>xml.</mentioned>
+ GI (e.g. <ident>xml.num</ident>, <ident>xml.recordingStmt</ident>,
etc.)</item>
<item>modify <ident>carthage</ident> and the Pizza Chef web site
to automate the merger of the extensions files.  The following
calculations will be needed:<list>
<item>if the user's <ident>TEI.extensions.ent</ident> file suppresses
an element type <ident>e</ident>, generate an entity declaration
of the form <code>&lt;!ENTITY % xml.e 'IGNORE'></code> so as to
suppress the XML version of that element.  (Strictly speaking, this
is unnecessary for elements not declared here, but working out whether
such a declaration is needed looks like more work than we want to 
put into a short-term system.)</item>
</list>
</item>
</list>
</p>
<p>A list of open questions is included at the end of the document.</p>
</div2>
</div1>

<div1><head>Tag omissibility information</head>

<p>Removing tag omissibility information is a trivial task which can be
accomplished by a DTD pretty printer, or even a simple editor script.
The strings <code>- -</code>, <code>- O</code>, <code>O -</code>, and
<code>O O</code> are legal in a DTD only as tag omissibility
information, within comments, or within literals.  In the TEI DTDs, they
do not occur within literals or comments, so a global change in an
editor would handle the problem.</p>

<p>To enable the necessary changes to be made with a minimum of manual
intervention, however, it is probably better to add a run-time option
to a DTD pretty printer, to make it suppress this information, or
replace it with a reference to one of the parameter entities
<ident>om.RR</ident>,
<ident>om.RO</ident>,
<ident>om.OR</ident>, or
<ident>om.OO</ident>.
If the run-time flag is set, the following entities will be added to the
beginning of the DTD:
<eg><![CDATA[
<!ENTITY % om.RR '- -'>
<!ENTITY % om.RO '- O'>
<!ENTITY % om.OR 'O -'>
<!ENTITY % om.OO 'O O'>
]]></eg>
The program <ident>carthago</ident> has accordingly been outfitted
with two run-time options to suppress the omissibility markers, or
to replace them with entity references.
</p>
</div1>

<div1><head>Normalizing parameter-entity references</head>

<p>In the short term, we will normalize parameter-entity references
using the pretty printer mentioned above (or else eliminate them
entirely, by running the test DTD through a pre-processor like Carthage,
which expands all parameter-entity references).</p>

<p>In the long run, we will systematically normalize all content models
in the tagdocs of TEI P3 by adding semicolons to parameter-entity
references which currently do not have them.  <emph>N.B. the editors
regard this as a correction of a corrigible error, and this
normalization will be performed in the text of TEI P3 as soon as
possible.</emph>
</p>

</div1>

<div1><head>Ampersand connectors</head>

<p>Removing ampersand connectors involves either rewriting the
content model as a set of alternative sequence groups (thus retaining
strict equivalence with the existing model) or revising the content
model entirely.  In the case of the TEI, the editors both agree
that most uses of <kw>&amp;</kw> have proven to be design errors, so we
propose simply to revise the content models.</p>

<p>The following content models use ampersand connectors in TEI P3:

<list type=bullets>
<item><gi>cit</gi> (part of the core)</item>
<item><gi>respStmt</gi> (part of the core)</item>
<item><gi>publicationStmt</gi> (part of the header)</item>
<item><gi>graph</gi> (part of the additional tag set for
networks and graphs)</item>
</list>
<p>In this section, we provide alternate declarations for each of them.
In the entity extensions file we must first suppress all of them:
<scrap id="xamp" 
  name="Suppress definitions of elements with ampersand">
<<!>!ENTITY % cit             'IGNORE' >
<<!>!ENTITY % respStmt        'IGNORE' >
<<!>!ENTITY % publicationStmt 'IGNORE' >
<<!>!ENTITY % graph           'IGNORE' >
</scrap>
And in thd DTD extensions file we must redefine them all:
<scrap id="newamp" 
  name="New definitions of elements with ampersand">
<ref target="newcit">New cit declaration</ref>
<ref target="newrespStmt">New respStmt declaration</ref>
<ref target="newpubstmt">New publicationStmt declaration</ref>
<ref target="newgraph">New graph declaration</ref>
</scrap>
</p>

<p><emph>N.B.  All the ampersand-eliminating content-model changes in
this section are regarded by the editors as corrections of
<term>corrigible errors</term>, and will be integrated into the text of
TEI P3 as soon as possible.</emph></p>

<div2 type='section'><head>The <gi>cit</gi> element</head>

<p>The standard declaration for <gi>cit</gi> is as follows:
<eg><![CDATA[
<!ELEMENT %n.cit;       - -  ((%n.q; | %n.quote;) & (%m.bibl; |
                             %m.loc;))                          >
]]></eg>
We will redefine it with a slightly more general content model
(well, almost -- see below):
<scrap id="newcit" name="New cit declaration">
<<!>!ENTITY % XML.cit "INCLUDE" >
<<!>![%XML.cit;[
<<!>!ELEMENT %n.cit;       - -  ((%n.q; | %n.quote; | %m.bibl; |
                             %m.loc; | %m.Incl;)+)              >
<<!>!ATTLIST %n.cit;            %a.global;
          TEIform            CDATA               'cit'          >
]<!>]>
</scrap>
(The <ident>Incl</ident> class included here has to do with inclusion
exceptions; see below.)
If we wished to replicate precisely the original content model, without
the ampersand, we could define <gi>cit</gi> thus:
<eg><![CDATA[
<!ELEMENT %n.cit;       - -  (((%n.q; | %n.quote;),
                               (%m.bibl; | %m.loc;))
                             | ((%m.bibl; | %m.loc;),
                               (%n.q; | %n.quote;)))            >
]]></eg>
</p>
<p>As it turns out, however the declaration proposed above is
ambiguous, since <gi>link</gi> is a member of both the
<ident>loc</ident> and <ident>Incl</ident> classes.  We'll
have to unroll one or the other of these two classes; a coin
toss decides that we should unroll <ident>loc</ident>.
<scrap id="altnewcit" name="New cit declaration (alternate)">
<<!>!ENTITY % XML.cit "INCLUDE" >
<<!>![%XML.cit;[
<<!>!ELEMENT %n.cit;       - -  ((%n.q; | %n.quote; | %m.bibl; 
                             | %n.ptr; | %n.ref; 
                             | %n.xptr; | %n.xref;
                             | %m.Incl;)+)                      >
<<!>!ATTLIST %n.cit;            %a.global;
          TEIform            CDATA               'cit'          >
]<!>]>
</scrap>
</p>
<p>After further investigation (i.e. further attempts to use the DTD
produced by a draft of this paper), however, it becomes clear that
<ident>loc</ident> is a subclass of <ident>phrase</ident>, so that
every content model which uses both the <ident>phrase</ident> class
and the <ident>Incl</ident> class is going to have troubles.
So instead of unrolling each case individually, we take a harsher
approach, and remove <gi>link</gi> from the <ident>loc</ident>
class.
<scrap id="new.m.loc" name="New loc class">
<<!>!--* remove link from loc class to avoid ambiguity          *-->
<<!>!ENTITY % x.loc ''                                             >
<<!>!ENTITY % m.loc '%x.loc; %n.ptr; | %n.ref; |
           %n.xptr; | %n.xref;'                                 >
</scrap>
This should not cause problems for any existing data, since <gi>link</gi>
is still a member of the class <ident>Incl</ident>, which is (after
all) allowed virtually everywhere.
</p>
</div2>

<div2><head>The <gi>respStmt</gi> element</head>

<p>Similarly, we could replicate the original definition of
<gi>respStmt</gi> if we wished, but it's probably better regarded as a
design error to be fixed:
<eg><![CDATA[
<!ELEMENT %n.respStmt;  - O  ((%n.resp; & %n.name;), (%n.resp;
                             | %n.name;)*)                      >
]]></eg>
We give it a simpler and looser declaration instead:
<scrap id="newrespStmt" name="Define new respStmt">
<<!>!ENTITY % XML.respStmt "INCLUDE" >
<<!>![%XML.respStmt;[
<<!>!ELEMENT %n.respStmt;  - O  (%n.resp; | %n.name;
                             | %m.Incl;)+                       >
<<!>!ATTLIST %n.respStmt;       %a.global;
          TEIform            CDATA               'respStmt'     >
]<!>]>
</scrap>
The prose should make clear that in principle, a <gi>respStmt</gi>
should have at least one <gi>resp</gi> and at least one <gi>name</gi>.
Enforcing that with the content model may be more pedantic than we
want to be, though.
<eg><![CDATA[
<!ELEMENT %n.respStmt;  - O  (((%n.resp;)+,
                             (%n.name;, (%n.resp; | %n.name;)*))
                             | ((%n.name;)+,
                             (%n.resp;, (%n.resp; | %n.name;)*)))
]]></eg>
</p>
</div2>

<div2><head>The <gi>publicationStmt</gi> element</head>

<p>The content model for <gi>publicationStmt</gi> includes an editorial
error I am glad to have the occasion to fix.  (In normal
bibliographic practice, when place and publisher are both given,
the place is given first.  I don't know what got into me that
morning.)
<eg><![CDATA[
<!ELEMENT %n.publicationStmt;
                        - O  ((%n.p;)+ | ( (%n.publisher; |
                             %n.distributor; | %n.authority;) &
                             ((%n.pubPlace)?, (%n.address)?,
                             (%n.idno)*, (%n.availability)?,
                             (%n.date)?)+ )+ )                  >
]]></eg>
Rather than simply replace
the current content model with an equivalent ampersand-less expression,
we'll change it.  For compatibility with existing data, we'll make the
new expression loose rather than tight.
<scrap id='newpubstmt' name='New publicationStmt'>
<<!>!ENTITY % XML.publicationStmt "INCLUDE" >
<<!>![%XML.publicationStmt;[
<<!>!ELEMENT %n.publicationStmt;
                        - O  ( (%n.p;, (%m.Incl;)*)+
                             | ((%n.publisher; | %n.distributor;
                             | %n.authority; | %n.pubPlace;
                             | %n.address; | %n.idno;
                             | %n.availability; | %n.date;),
                               (%m.Incl;)*)+ )                  >
<<!>!ATTLIST %n.publicationStmt; %a.global;
          TEIform            CDATA               'publicationStmt'
                                                                >
]<!>]>
</scrap>
</p>
</div2>

<div2><head>The <gi>graph</gi> element</head>

<p>The <gi>graph</gi> element uses the content model to require that
graphs be encoded nodes-first or arcs-first, but not mixed
hugger-mugger.  We'll retain that characteristic.
The old declaration is this:
<eg><![CDATA[
<!ELEMENT %n.graph;     - -  ((%n.node;)+ & (%n.arc;)*)         >
]]></eg>
We could require arbitrarily that all nodes come first; it's not clear
whether any legacy data using <gi>graph</gi> actually exists.  But
in the interests of backward compatibility, the new content model
might as well allow precisely what the old one did, even if that now
seems like a design error:
<!--* xx === (%m.Incl;)* *-->
<!--* zz === %m.Incl;    *-->
<!--* yy === (%m.Incl;)* (chosen to reduce hamming distance from zz) *-->
<scrap id='newgraph' name='New graph element'>
<<!>![%TEI.nets;[
<<!>!ENTITY % XML.graph "INCLUDE" >
<<!>![%XML.graph;[
<<!>!ELEMENT %n.graph;     - -  (((%n.node;, (%m.Incl;)*)+,
                               (%n.arc;, (%m.Incl;)*)*)
                             | ((%n.arc;, (%m.Incl;)*)+,
                               (%n.node;, (%m.Incl;)*)+))       >
<<!>!ATTLIST %n.graph;          %a.global;
          type               CDATA               #IMPLIED
          label              CDATA               #IMPLIED
          order              NUMBER              #IMPLIED
          size               NUMBER              #IMPLIED
          TEIform            CDATA               'graph'        >
]<!>]>
]<!>]>
</scrap>
</p>
</div2>
</div1>

<div1><head>Normalizing mixed-content models</head>

<div2><head>Individual elements</head>

<p>The following elements use the keyword <kw>#PCDATA</kw> in ways that
must be changed to be legal in XML:
<list type=bullets>
<item><gi>sense</gi> (dictionaries)</item>
<item><gi>re</gi> (dictionaries)</item>
<item><gi>persName</gi> (names and dates)</item>
<item><gi>placeName</gi> (names and dates)</item>
<item><gi>geogName</gi> (names and dates)</item>
<item><gi>dateStruct</gi> (names and dates)</item>
<item><gi>timeStruct</gi> (names and dates)</item>
<item><gi>dateline</gi> (default text structure)</item>
</list>
In most of these cases, the <kw>#PCDATA</kw> keyword is given last, not
first, in the content model; in one or two, it's neither first nor last.
For example:
<eg><![CDATA[
<!ELEMENT %n.sense;     - -  (%n.sense; | %m.dictionaryTopLevel
                             | %m.phrase | #PCDATA)*            >
]]></eg>
In one or two cases, the group also has a plus operator instead of a
star operator.
<eg><![CDATA[
<!ELEMENT %n.timeStruct;
                        - -  ((%m.temporalExpr; | #PCDATA)+)    >
]]></eg>
</p>
<p>We must redeclare each of them, which means first of all that we
must suppress their standard declarations:
<scrap id='xxxpcdata' name='Suppress some mixed content elements'>
<<!>!ENTITY % sense 'IGNORE' >
<<!>!ENTITY % re 'IGNORE' >
<<!>!ENTITY % persName 'IGNORE' >
<<!>!ENTITY % placeName 'IGNORE' >
<<!>!ENTITY % geogName 'IGNORE' >
<<!>!ENTITY % dateStruct 'IGNORE' >
<<!>!ENTITY % timeStruct 'IGNORE' >
<<!>!ENTITY % dateline 'IGNORE' >
</scrap>
and separately we must redefine them:
<scrap id='newpcdata' name='Redeclare elements with mixed content elements'>
<<!>![%TEI.dictionaries;[
<ref target="newpcddict">New mixed-content declarations for dictionaries</ref>
]<!>]>
<<!>![%TEI.names.dates;[
<ref target="newpcdnd">New mixed-content declarations for names and dates</ref>
]<!>]>
<ref target="newpcdstr">New mixed-content declarations for structure</ref>
</scrap>
</p>
<p>Since the normalization is purely mechanical, there seems to be no
need to reproduce the original declarations here.  The new declarations
are given below.</p>

<p><emph>N.B.  All the mixed-content normalization changes in this
section are regarded by the editors as corrections of <term>corrigible
errors</term>, and will be integrated into the text of TEI P3 as soon as
possible.</emph></p>

<p>Two elements in this group are from the dictionary tag set:
<scrap id="newpcddict"
       name="New mixed content elements for dictionaries">
<<!>!ENTITY % XML.sense "INCLUDE" >
<<!>![%XML.sense;[
<<!>!ELEMENT %n.sense;     - -  (#PCDATA | %n.sense;
                             | %m.dictionaryTopLevel;
                             | %m.phrase; | %m.Incl;)*          >
<<!>!ATTLIST %n.sense;          %a.global;
                             %a.dictionaries;
          level              NUMBER              #IMPLIED
          TEIform            CDATA               'sense'        >
]<!>]>
</scrap><scrap prev="newpcddict">
<<!>!ENTITY % XML.re "INCLUDE" >
<<!>![%XML.re;[
<<!>!ELEMENT %n.re;        - O  (#PCDATA | %n.sense;
                             | %m.dictionaryTopLevel;
                             | %m.phrase; | %m.Incl;)*          >
<<!>!ATTLIST %n.re;             %a.global;
                             %a.dictionaries;
          type               CDATA               #IMPLIED
          TEIform            CDATA               're'           >
]<!>]>
</scrap>
Note that the standard declaration for <gi>re</gi> also has an exclusion
exception which has been dropped silently here.  N.B. Elimination of
exclusion exceptions is not a corrigible error; the version of this
declaration which will go into TEI P3 without review is this:
<eg><![CDATA[
<!ELEMENT %n.re;        - O  (#PCDATA | %n.sense;
                             | %m.dictionaryTopLevel;
                             | %m.phrase;)*      -(%n.re;)      >
]]></eg>
</p>

<p>The other elements in this group are from the tag set for names and
dates.
<scrap id="newpcdnd"
       name="New mixed content elements for names and dates">

<<!>!ENTITY % XML.persName "INCLUDE" >
<<!>![%XML.persName;[
<<!>!ELEMENT %n.persName;  - -  (#PCDATA | %m.personPart;
                             | %m.phrase; | %m.Incl;)*          >
<<!>!ATTLIST %n.persName;       %a.global;
                             %a.names;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'persName'     >
]<!>]>
</scrap><scrap prev="newpcdnd">
<<!>!ENTITY % XML.placeName "INCLUDE" >
<<!>![%XML.placeName;[
<<!>!ELEMENT %n.placeName; - -  (#PCDATA | %m.placePart;
                             | %m.phrase; | %m.Incl;)*          >
<<!>!ATTLIST %n.placeName;      %a.global;
          type               CDATA               #IMPLIED
          full               (yes | abb | init)  yes
                             %a.names;
          TEIform            CDATA               'placeName'    >
]<!>]>
</scrap><scrap prev="newpcdnd">
<<!>!ENTITY % XML.geogName "INCLUDE" >
<<!>![%XML.geogName;[
<<!>!ELEMENT %n.geogName;  - -  (#PCDATA | %n.geog; | %n.name;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.geogName;       %a.global;
                             %a.placePart;
          TEIform            CDATA               'geogName'     >
]<!>]>
</scrap><scrap prev="newpcdnd">
<<!>!ENTITY % XML.dateStruct "INCLUDE" >
<<!>![%XML.dateStruct;[
<<!>!ELEMENT %n.dateStruct;
                        - -  (#PCDATA | %m.temporalExpr;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.dateStruct;     %a.global;
                             %a.temporalExpr;
          calendar           CDATA               #IMPLIED
          exact              CDATA               #IMPLIED
          TEIform            CDATA               'dateStruct'   >
]<!>]>
</scrap><scrap prev="newpcdnd">
<<!>!ENTITY % XML.timeStruct "INCLUDE" >
<<!>![%XML.timeStruct;[
<<!>!ELEMENT %n.timeStruct;
                        - -  (#PCDATA | %m.temporalExpr;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.timeStruct;     %a.global;
                             %a.temporalExpr;
          zone               CDATA               #IMPLIED
          TEIform            CDATA               'timeStruct'   >
]<!>]>
</scrap>
</p>

<p>The <gi>dateline</gi> element (from the default text-structure tag
set) is the last one needing a mixed-content fix:
<scrap id="newpcdstr" name="New mixed content elements for structure">
<<!>!ENTITY % XML.dateline "INCLUDE" >
<<!>![%XML.dateline;[
<<!>!ELEMENT %n.dateline;  - O  (#PCDATA | %n.date; | %n.time;
                             | %n.name; | %n.address;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.dateline;       %a.global;
          TEIform            CDATA               'dateline'     >
]<!>]>
</scrap>
</p>
</div2>

<div2><head>
The entities <ident>phrase</ident> and <ident>phrase.seq</ident>
</head>

<p>The XML rules for mixed-content models also require that the
declarations for <ident>phrase</ident> and <ident>phrase.seq</ident> be
changed slightly.  The current defintions are:
<eg><![CDATA[
<!ENTITY % phrase '(#PCDATA | %m.phrase)'                       >
<!ENTITY % phrase.seq '(%phrase;)*'                             >
]]></eg>
These give us one level too many of parentheses; we need to remove
the parentheses from the entity <ident>phrase</ident>:
<scrap id='psphrase'
       name='New declaration for phrase and phrase.seq'>
<<!>!ENTITY % phrase '#PCDATA | %m.phrase;'                        >
<<!>!ENTITY % phrase.seq '(%phrase;)*'                             >
</scrap>
</p>

<p><emph>N.B.  This change to the declaration of <ident>phrase</ident>
is regarded by the editors as the correction of a <term>corrigible
error</term>, and will be integrated into the text of TEI P3 as soon as
possible.</emph></p>

<p>Unfortunately, integrating this particular fix into the XML
modifications file for testing will require that we either hard-code the
effective value of <ident>m.phrase</ident>, or that we recreate the
entire sequence of class declarations for <ident>phrase</ident> in the
modifications file.  (Sigh.)
While we are here, we will introduce some fixes to the declarations
of some classes:<list>
<item>add <gi>geogName</gi>,
<gi>persName</gi>,
<gi>placeName</gi> to <ident>data</ident> class
</item>
<item>remove <gi>anchor</gi> from <ident>seg</ident> class</item>
<item>add new class <ident>editIncl</ident></item>
<item>(this one's not done yet)
add <ident>editIncl</ident> class and <gi>anchor</gi> element
to <ident>globIncl</ident> class</item>
<item>remove members of <ident>editIncl</ident> from <ident>edit</ident>,
in order to avoid non-determinism in the content models</item>
<item>remove <gi>anchor</gi> from <ident>seg</ident> class,
in order to avoid non-determinism (it's already in <ident>Incl</ident>)</item>
<item>remove <gi>link</gi> from <ident>loc</ident> class,
in order to avoid non-determinism (it's already in <ident>Incl</ident>)</item>
</list>
<scrap id='reproclass' name='Reproduce class declarations for phrases'>
<ref target='newgis'>Declare new GIs</ref>
<<!>!ENTITY % x.hqphrase ''                                        >
<<!>!ENTITY % m.hqphrase '%x.hqphrase; %n.distinct; | %n.emph; |
           %n.foreign; | %n.gloss; | %n.hi; | %n.mentioned; |
           %n.soCalled; | %n.term; | %n.title;'                 >
<<!>!ENTITY % x.data ''                                            >
<<!>!ENTITY % m.data '%x.data; %n.abbr; | %n.address; | %n.date; 
           | %n.dateRange; | %n.dateStruct; | %n.expan; 
           | %n.geogName; 
           | %n.lang; | %n.measure; | %n.name; | %n.num;
           | %n.orgName; | %n.persName; | %n.placeName; 
           | %n.rs; | %n.time; | %n.timeRange; 
           | %n.timeStruct;'                                    >
<<!>!ENTITY % x.edit ''                                            >
<<!>!ENTITY % m.edit '%x.edit; %n.add; | %n.app; |
           %n.corr; | %n.damage; | %n.del; | 
           %n.orig; | %n.reg; | %n.restore; | %n.sic;
           | %n.space; | %n.supplied; | %n.unclear;'            >
<<!>!ENTITY % x.editIncl ''                                        >
<<!>!ENTITY % m.editIncl '%x.editIncl; %n.addSpan; | %n.delSpan; | 
           %n.gap;'                                             >

<ref target='new.m.loc'>New loc class</ref>
<<!>!ENTITY % x.seg ''                                             >
<<!>!ENTITY % m.seg '%x.seg; %n.c; | %n.cl; | %n.m; |
           %n.phr; | %n.s; | %n.seg; | %n.w;'                   >
<<!>!ENTITY % x.sgmlKeywords ''                                    >
<<!>!ENTITY % m.sgmlKeywords '%x.sgmlKeywords; %n.att; | %n.gi; |
           %n.tag; | %n.val;'                                   >
<<!>!ENTITY % x.phrase.verse ''                                    >
<<!>!ENTITY % m.phrase.verse '%x.phrase.verse; %n.caesura;'        >
<<!>!ENTITY % x.formPointers ''                                    >
<<!>!ENTITY % m.formPointers '%x.formPointers; %n.oRef; | %n.oVar; 
           | %n.pRef; | %n.pVar;'                               >
<<!>!ENTITY % x.phrase ''                                          >
<<!>!ENTITY % m.phrase '%x.phrase; %m.data; | %m.edit; |
           %m.formPointers; | %m.hqphrase; | %m.loc; |
           %m.phrase.verse; | %m.seg; | %m.sgmlKeywords; |
           %n.dictAnomaly; |
           %n.formula; | %n.fw; | %n.handShift;'                >

<<!>!ENTITY % x.fmchunk ''                                         > 
<<!>!ENTITY % m.fmchunk '%x.fmchunk; %n.argument; | %n.byline; | 
           %n.docAuthor; | %n.docDate; | %n.docEdition; | 
           %n.docImprint; | %n.docTitle; | %n.epigraph; | 
           %n.head; | %n.titlePart;'                            >
</scrap>
</p>
<p>The element <gi>dictAnomaly</gi> is new; for a description, see
below, section <ref target='probdic'>The problem of the dictionary
chapter</ref>.
</p>
<p>We need to declare the name of <gi>dictAnomaly</gi>.
<scrap id='newgis' name='Declare new GIs'>
<<!>!ENTITY % n.dictAnomaly 'dictAnomaly'                          >
</scrap>
</p>
</div2>

<div2><head>Elements using <ident>phrase.seq</ident> and
<ident>paraContent</ident></head>

<p>Note that neither <ident>phrase.seq</ident> nor
<ident>paraContent</ident> may be combined with other elements in a
content model, in XML, because of the XML requirement that mixed content
models not have nested groups.  This affects the declarations for
<list type=bullets>
<item><gi>castItem</gi> (in drama)</item>
<item><gi>docImprint</gi> (in front matter)</item>
<item><gi>catDesc</gi> (in the header)</item>
<item><gi>byline</gi> (in default text structure)</item>
<item><gi>opener</gi> (in default text structure)</item>
<item><gi>closer</gi> (in default text structure)</item>
<item><gi>form</gi> (in dictionaries)</item>
<item><gi>gramGrp</gi> (in dictionaries)</item>
<item><gi>trans</gi> (in dictionaries)</item>
<item><gi>etym</gi> (in dictionaries)</item>
<item><gi>xr</gi> (in dictionaries)</item>
</list>
</p>

<p>These must be suppressed, in order to be redeclared:
<scrap id='xphrseq' name='Suppress users of phrase.seq'>
<<!>!ENTITY % castItem 'IGNORE' >
<<!>!ENTITY % docImprint 'IGNORE' >
<<!>!ENTITY % catDesc 'IGNORE' >
<<!>!ENTITY % byline 'IGNORE' >
<<!>!ENTITY % opener 'IGNORE' >
<<!>!ENTITY % closer 'IGNORE' >
<<!>!ENTITY % form 'IGNORE' >
<<!>!ENTITY % gramGrp 'IGNORE' >
<<!>!ENTITY % trans 'IGNORE' >
<<!>!ENTITY % etym 'IGNORE' >
<<!>!ENTITY % xr 'IGNORE' >
</scrap>
</p>
<p>And they need to be redefined, tag set by tag set.  (We put elements
from each tag set into separate scraps to simplify production of
specialized modification files.)
<scrap id='newphrseq' name='New declarations for users of phrase.seq'>
<ref target="newcastItem">New castItem</ref>
<ref target="newdocImprint">New docImprint</ref>
<ref target="newcatDesc">New catDesc</ref>
<ref target="newopener">New opener and closer</ref>
<ref target="newpsdic">New phrase.seq elements for dictionaries</ref>
</scrap></p>
<p>First, the base tag set for drama:
<scrap id='newcastitem' name='New castItem'>
<<!>![%TEI.drama;[
<<!>!ENTITY % XML.castItem "INCLUDE" >
<<!>![%XML.castItem;[
<<!>!ELEMENT %n.castItem;  - O  (#PCDATA | %n.role; | %n.roleDesc;
                             | %n.actor; | %m.phrase;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.castItem;       %a.global;
          type               (role | list)       role
          TEIform            CDATA               'castItem'     >
]<!>]>
]<!>]>
</scrap>
</p>
<p>Next the tag set for front matter:
<scrap id='newdocimprint' name='New docImprint'>
<<!>!ENTITY % XML.docImprint "INCLUDE" >
<<!>![%XML.docImprint;[
<<!>!ELEMENT %n.docImprint;
                        - O  (#PCDATA | %m.phrase; | %n.pubPlace;
                             | %n.docDate; | %n.publisher;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.docImprint;     %a.global;
          TEIform            CDATA               'docImprint'   >
]<!>]>
</scrap>
Then, the header:
<scrap id='newcatdesc' name='New catDesc'>
<<!>!ENTITY % XML.catDesc "INCLUDE" >
<<!>![%XML.catDesc;[
<<!>!ELEMENT %n.catDesc;   - O  (#PCDATA | %m.phrase;
                             | %n.textDesc;)*                   >
<<!>!ATTLIST %n.catDesc;        %a.global;
          TEIform            CDATA               'catDesc'      >
]<!>]>
</scrap>
And the default text-structure tag set:
<scrap id='newopener' name='New opener and closer'>
<<!>!ENTITY % XML.byline "INCLUDE" >
<<!>![%XML.byline;[
<<!>!ELEMENT %n.byline;    - O  (#PCDATA | %m.phrase;
                             | %n.docAuthor; | %m.Incl;)*       >
<<!>!ATTLIST %n.byline;         %a.global;
          TEIform            CDATA               'byline'       >
]<!>]>
</scrap><scrap prev='newopener'>
<<!>!ENTITY % XML.opener "INCLUDE" >
<<!>![%XML.opener;[
<<!>!ELEMENT %n.opener;    - O  (#PCDATA | %m.phrase;
                             | %n.argument; | %n.byline;
                             | %n.epigraph;
                             | %n.signed; | %n.dateline;
                             | %n.salute; | %m.Incl;)*          >
<<!>!ATTLIST %n.opener;         %a.global;
          TEIform            CDATA               'opener'       >
]<!>]>
</scrap><scrap prev='newopener'>
<<!>!ENTITY % XML.closer "INCLUDE" >
<<!>![%XML.closer;[
<<!>!ELEMENT %n.closer;    - O  (#PCDATA | %m.phrase;
                             | %n.signed; | %n.dateline;
                             | %n.salute; | %m.Incl;)*          >
<<!>!ATTLIST %n.closer;         %a.global;
          TEIform            CDATA               'closer'       >
]<!>]>
</scrap>
</p>

<p>And finally the base tag set for dictionaries; unlike the preceding
elements, these all use <ident>paraContent</ident>, not
<ident>phrase.seq</ident>.  N.B. these content models will require
further changes before publication.  See below, <ref
target='probdic'>The problem of the dictionary chapter</ref>.
<scrap id='newpsdic' name='New phrase.seq elements for dictionaries'>
<<!>![%TEI.dictionaries;[
<<!>!ENTITY % XML.form "INCLUDE" >
<<!>![%XML.form;[
<<!>!ELEMENT %n.form;      - -  (#PCDATA | %m.phrase; | %m.inter;
                             | %m.formInfo; | %m.Incl;)*        >
<<!>!ATTLIST %n.form;           %a.global;
                             %a.dictionaries;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'form'         >
]<!>]>
</scrap><scrap prev='newpsdic'>
<<!>!ENTITY % XML.gramGrp "INCLUDE" >
<<!>![%XML.gramGrp;[
<<!>!ELEMENT %n.gramGrp;   - -  (#PCDATA | %m.phrase; | %m.inter;
                             | %m.gramInfo; | %m.Incl;)*        >
<<!>!ATTLIST %n.gramGrp;        %a.global;
                             %a.dictionaries;
          TEIform            CDATA               'gramGrp'      >
]<!>]>
</scrap><scrap prev='newpsdic'>
<<!>!ENTITY % XML.trans "INCLUDE" >
<<!>![%XML.trans;[
<<!>!ELEMENT %n.trans;     - O  (#PCDATA | %m.phrase; | %m.inter;
                             | %m.dictionaryParts; | %m.Incl;)* >
<<!>!ATTLIST %n.trans;          %a.global;
                             %a.dictionaries;
          TEIform            CDATA               'trans'        >
]<!>]>
</scrap><scrap prev='newpsdic'>
<<!>!ENTITY % XML.etym "INCLUDE" >
<<!>![%XML.etym;[
<<!>!ELEMENT %n.etym;      - O  (#PCDATA | %m.phrase; | %m.inter;
                             | %n.usg; | %n.lbl; | %n.def;
                             | %n.trans; | %n.tr;
                             | %m.morphInfo; | %n.eg;
                             | %n.xr; | %m.Incl;)*              >
<<!>!ATTLIST %n.etym;           %a.global;
                             %a.dictionaries;
          TEIform            CDATA               'etym'         >
]<!>]>
</scrap><scrap prev='newpsdic'>
<<!>!ENTITY % XML.xr "INCLUDE" >
<<!>![%XML.xr;[
<<!>!ELEMENT %n.xr;        - O  (#PCDATA | %m.phrase; | %m.inter;
                             | %n.usg; | %n.lbl; | %m.Incl;)*   >
<<!>!ATTLIST %n.xr;             %a.global;
                             %a.dictionaries;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'xr'           >
]<!>]>
]<!>]>
</scrap>

<p>Since <ident>paraContent</ident> also occurs in the
definition of <ident>specialPara</ident>, in a form not legal in XML,
the <ident>specialPara</ident> entity must also be redefined; see
below, <ref target='specialpara'>The problem of
<ident>specialPara</ident> elements</ref>.
</p>
</div1>

<div1><head>Exceptions</head>
<p>Removing inclusion and exclusion exceptions typically involves
changing the set of documents accepted by the DTD.<note place='foot'>If
the set of inclusions and the set of exclusions on the exception stack
are always the same
for every possible occurrence of every element type in the DTD, then an
exception-free DTD can be created which accepts exactly the same set of
documents as the original DTD.  A DTD which had exceptions
only on the root element type, for example, could be replicated without
changing the language it accepts.  I am not aware of any production DTDs
which fall into this class.</note>  In
the discussion which follows, I assume that our goal is to ensure that
every document legal in the original DTD remains legal in the modified
DTD.  The changes will cause the modified DTD to accept some other
documents which are not valid instances of the original DTD.  That is,
if the original DTD is taken as an absolutely correct definition of a
language, the revised DTD will overgenerate.<note place='foot'>One could
take the converse goal of ensuring that the revised DTD be at
least as selective as the original DTD, i.e. that it undergenerate with
respect to the original language.  This would be interesting as an
exercise, but if applied to the TEI DTD it would invalidate existing TEI
data, which makes it unacceptable as an approach to creating
an XML-conformant version of the TEI DTD.</note>
We will wish to keep the overgeneration to a minimum, but in general
we cannot eliminate it entirely, since inclusion and exclusion
exceptions do extend the expressive power of the DTD notation.<note
place='foot'>This is clearly established by Wood and Kilpel&auml;inen,
though they inexplicably claim to have proven the opposite.</note>
</p>
</div1>

<div1><head>Exclusions</head>

<p>Rewriting declarations without exclusion exceptions involves simply
removing the exception, and adding an application-specific constraint to
be checked outside the SGML parser, that says the excluded element types
must not occur within the element type which excluded them.  Thus, for
example, the TEI <gi>s</gi> element (for end-to-end segmentation on the
level of the orthographic sentence) is currently declared thus:
<eg>
<![CDATA[
<!ELEMENT s  - -  (%phrase.seq)  -(s) >
]]>
</eg>
An XML-compatible TEI DTD would replace this with:
<eg>
<![CDATA[
<!ELEMENT s %phrase.seq;  >

<!--* CONSTRAINT:  <s> must not occur within
    * an <s>, i.e. Ancestor(1,s) = NIL
    *-->
]]>
</eg>
The important change here, for present purposes, is the removal of the
exclusion exception.  In addition, we have removed the tag
omissibility indicators and the parentheses around
<ident>phrase.seq</ident>, for reasons that should be clear from
other portions of this document.
</p>
<p>
It would be possible to simulate the effect of exclusion
exceptions by modifying the content models of possible descendants of
<gi>s</gi>, so as to remove <gi>s</gi> from their content model;
for elements which can occur both as parents and as descendants of
<gi>s</gi>, however, this change would render some existing documents
illegal; it is thus not pursued further here.
</p>
<p>The following elements have exclusion exceptions in TEI P3:
<list type=bullets>
<item><gi>s</gi> (excludes <gi>s</gi>)</item>
<item><gi>speaker</gi> (excludes <gi>speaker</gi>)</item>
<item><gi>stage</gi> (excludes <gi>stage</gi>)</item>
<item><gi>hom</gi> (excludes <gi>entry</gi>)</item>
<item><gi>re</gi> (excludes <gi>re</gi>)</item>
</list></p>
<p>The new declarations are precisely the same as the old declarations,
only without the exclusions:
<scrap id="newexcl" name="New declarations for exclusion exceptions">
<<!>![ %TEI.analysis; [
<<!>!ENTITY % XML.s "INCLUDE" >
<<!>![%XML.s;[
<<!>!ELEMENT %n.s;         - -  %phrase.seq;                       >
<<!>!ATTLIST %n.s;              %a.global;
                             %a.seg;
          TEIform            CDATA               's'            >
]<!>]>
]<!>]>
</scrap><scrap prev='newexcl'>
<<!>!ENTITY % XML.speaker "INCLUDE" >
<<!>![%XML.speaker;[
<<!>!ELEMENT %n.speaker;   - O  %phrase.seq;                       >
<<!>!ATTLIST %n.speaker;        %a.global;
          TEIform            CDATA               'speaker'      >
]<!>]>
</scrap><scrap prev='newexcl'>
<<!>!ENTITY % XML.stage "INCLUDE" >
<<!>![%XML.stage;[
<<!>!ELEMENT %n.stage;     - -  %specialPara;                      >
<<!>!ATTLIST %n.stage;          %a.global;
          type               CDATA               mix
          TEIform            CDATA               'stage'        >
]<!>]>
</scrap></p>
<p>And they have to be excluded from the base DTD:
<scrap id='xxxexcl' name='Suppress element declarations with exclusions'>
<<!>!ENTITY % s       'IGNORE' >
<<!>!ENTITY % speaker 'IGNORE' >
<<!>!ENTITY % stage   'IGNORE' >
</scrap>
</p>

<!--*
Questions:  what combinations of exception-bearing elements are
possible?

Need:  ancestor relationship map (parent+)
*-->

<p>A new definition of <gi>re</gi> has already been given above,
in the context of normalizing mixed-content models.  The new definition
of <gi>hom</gi> would be as follows:
<eg><![CDATA[
<!ELEMENT %n.hom;       - O  (%n.sense; |
                             %m.dictionaryTopLevel)*            >
]]></eg>
The actualy form to be used for <gi>hom</gi> in an XML DTD, however,
varies from this, as described below in <ref target="probdic">The
problem of the dictionary chapter</ref>.
</p>
</div1>

<div1><head>Inclusions</head>
<p>Removing inclusion exceptions requires simulating their effect in the
content model of each element type which can occur as a descendant of
the element type bearing the inclusions.  This section discusses
<list type=bullets>
<item>the effect of inclusions on the language accepted by a
content model</item>
<item>gaining that effect by modifying a finite-state automaton</item>
<item>gaining that effect by modifying a content-model group</item>
<item>examples</item>
</list>
A brief note on the notation used is given in an appendix.
</p>

<div2 type='section'><head>The Effect of Inclusions</head>

<p>Inclusions make included elements legal at any location in a content
model, without however changing the requirements of the basic content
model, which must still be fulfilled.  (For now, I make the simplifying
assumption that the set of included elements and the set of elements
named in the content model are disjoint.  When they are not, special
considerations will apply, because of SGML's requirement that content
models be deterministic.)
</p>

<p>
We can summarize the effect of inclusions very simply if we think of an
FSA recognizing a content model:  included elements do not change the
state of the FSA.  So to change an FSA without inclusions to an FSA that
accepts the same language, except that it also allows the inclusion of
any element <ident>i</ident> in the set of inclusions <ident>I</ident>,
<eg>
    for each state s in the FSA {
       for each element i in I {
          add a transition from s to s, on i
       }
    }
</eg>
</p>
</div2>

<div2><head>The Function <ident>imf()</ident></head>
<p>
We can characterize the language recognized using inclusion exceptions
this way.  Let us construct a function <ident>imf(E,I)</ident> which
maps from a regular expression <ident>E</ident> and a set of inclusions
<ident>I</ident> to a new regular expression <ident>E'</ident>.  Ideally
we want the following to be true:

<list>
<item><ident>E'</ident> is deterministic if <ident>E</ident> is
deterministic.</item>
<item><ident>L(E)</ident> &subsetof; <ident>L(E')</ident></item>
</list>
</p>

<p>
In general, for sequences of terminals <ident>x</ident>,
<ident>y</ident> in <ident>&Sigma;</ident>*:
<list>
<item>If <ident>x</ident> is in <ident>L(E)</ident> then
<ident>x</ident> is in <ident>L(E')</ident>.</item>
<item>If <ident>xy</ident> is in <ident>L(E)</ident> and
<ident>i</ident> is in <ident>I</ident> then <ident>xiy</ident> is in
<ident>L(E')</ident>.</item>
</list>
</p>

<p>
My best cut so far at defining such a function relies in some places on
a couple of auxiliary functions.  So let us define functions
<ident>imf(E)</ident>, <ident>mf(E)</ident>, and <ident>m(E)</ident>
(where <mentioned>i</mentioned> is for <gloss>initial</gloss>,
<mentioned>m</mentioned> for <gloss>medial</gloss>,
<mentioned>f</mentioned> for <gloss>final</gloss>).<note place='foot'>
Strictly speaking, these ought perhaps to be
<ident>imf(E,I)</ident>,
<ident>mf(E,I)</ident>, and
<ident>m(E,I)</ident>,
but for purposes of this paper we will never need different sets of
inclusions <ident>I</ident>.  So if it matters, we can define
<ident>imf(E)</ident> formally as <ident>imf(E,I)</ident>, etc.</note>
<ident>imf(E)</ident> makes the claim about <ident>xiy</ident> true for
all <ident>x</ident>, <ident>y</ident> in <ident>&Sigma;</ident>*.
<ident>mf(E)</ident> makes it true for <ident>x</ident> in
<ident>&Sigma;</ident>+ and <ident>y</ident> in <ident>&Sigma;</ident>*.
<ident>m(E)</ident> makes it true for <ident>x</ident>, <ident>y</ident>
in <ident>&Sigma;</ident>+.  Equivalently, we can say that any element
<ident>i</ident> in <ident>I</ident> can appear initially, medially, or
finally in <ident>imf(E)</ident>, medially or finally (but not
initially) in <ident>mf(E)</ident>, and medially (but not initially or
finally) in <ident>m(E)</ident>.
</p>

<p>
The care we have to take with initial and final positions results from
the SGML rules about determinism, but also helps keep the resulting
expressions simpler than they'd be if we just slapped <code>(I*)</code>
in everywhere in the content model.
</p>
<p>
Here is a first cut at defining the functions.  In a number of
circumstances, they are undefined; it might perhaps be useful,
therefore, to define a simple normalization on (ampersand-free) content
models, which would ensure that the functions are always defined.
</p>
<p>
If <ident>E</ident> is the empty set, then the content model in question
cannot be satisfied; this would be the case if a DTD which lacked any
element called <gi>nonesuch</gi> nevertheless included an element which
required it as a subelement:
<eg><![CDATA[
<!ELEMENT impossible - - (nonesuch) >
]]></eg>
Given that we want
<ident>L(E)</ident> &subsetof; <ident>L(E')</ident>
we must define <ident>imf</ident> etc. thus for this case:
<list>
<item><ident>imf(E)</ident> = the empty set</item>
<item><ident>mf(E)</ident> = the empty set</item>
<item><ident>m(E)</ident> = the empty set</item>
</list>
</p>
<p>
An element may accept the empty string as its content in either
of two ways.  First, the element may be declared <kw>EMPTY</kw>: in this
case, inclusions are not legal inside the element.
<list>
<item><ident>imf(E)</ident> = the empty string</item>
<item><ident>mf(E)</ident> = the empty string</item>
<item><ident>m(E)</ident> = the empty string</item>
</list>
Second, the element's content model may accept the empty string, either
because all subelements are optional or because the content model may be
satisfied by <kw>#PCDATA</kw>: in this case, inclusions are legal within
the element.
<list>
<item><ident>imf(E)</ident> = <code>I*</code></item>
<item><ident>mf(E)</ident> is undefined</item>
<item><ident>m(E)</ident> is undefined</item>
</list>
</p>
<p>
If <ident>E</ident> is an atomic symbol, e.g. <ident>a</ident>, then
<list>
<item><ident>m(E)</ident> = <code>E</code>
<![IGNORE[ <lb>= <code>a</code> ]]>
</item>
<item><ident>mf(E)</ident> = <code>(m(E), I*)</code>
<![IGNORE[ <lb>= <code>(a, I*)</code> ]]>
</item>
<item><ident>imf(E)</ident> = <code>(I*, mf(E))</code>
<![IGNORE[ <lb>= <code>(I*, a, I*)</code>]]>
</item>
</list>
</p>
<p>
If <ident>E</ident> has the form <ident>F</ident>?, and
<ident>F</ident> is not nullable (does not accept the empty string),
then
<list>
<item><ident>m(E)</ident> = <code>m(F)?</code></item>
<item><ident>mf(E)</ident> = <code>(m(F), I*)?</code></item>
<item><ident>imf(E)</ident> = <code>I*, mf(E)</code>
= <code>I*, (m(F), I*)?</code></item>
</list>
Note that we require <ident>F</ident> to be non-nullable in order to
preserve determinism.
</p>
<p>
If <ident>E</ident> has the form <ident>F</ident>?, and
<ident>F</ident> is nullable, then
<list>
<item><ident>m(E)</ident> = <code>m(F)</code></item>
<item><ident>mf(E)</ident> = <code>mf(F)</code></item>
<item><ident>imf(E)</ident> = <code>imf(E)</code>
</item>
</list>
In other words, if <ident>F</ident> is nullable, the <code>?</code> is
redundant and may be stripped without loss of information.
</p>
<p>
If <ident>E</ident> has the form <code>F+</code>,
and <ident>F</ident> is not nullable,
then
<list>
<item><ident>m(E)</ident> = <code>(m(F), (I*, m(F))*)</code></item>
<item><ident>mf(E)</ident> = <code>(m(F), I*)+</code></item>
<item><ident>imf(E)</ident> = <code>I*, mf(E)</code>
= <code>I*, (m(F), I*)+</code></item>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>F+</code>,
and <ident>F</ident> is nullable,
then
<list>
<item><ident>m(E)</ident> = <code>m(F*)</code></item>
<item><ident>mf(E)</ident> = <code>mf(F*)</code></item>
<item><ident>imf(E)</ident> = <code>imf(F*)</code>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>F*</code>,
and <ident>F</ident> is not nullable,
then
<list>
<item><ident>m(E)</ident> = <code>(m(F), (I*, m(F))*)?</code></item>
<item><ident>mf(E)</ident> = <code>(m(F), I*)*</code></item>
<item><ident>mf(E)</ident> = <code>(mf(F))*</code></item>
<item><ident>imf(E)</ident> = <code>(m(F) | I)*</code></item>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>F*</code>,
and <ident>F</ident> is nullable,
then
<list>
<item><ident>m(E)</ident> is undefined</item>
<item><ident>mf(E)</ident> is undefined</item>
<item><ident>imf(E)</ident> = <code>(m(F) | I)*</code></item>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>(F,G)</code>, then
<list>
<item><ident>m(E)</ident> = <code>mf(F), m(G)</code>,
if and only if <ident>G</ident> is not nullable,
else undefined
</item>
<item><ident>mf(E)</ident> = <code>mf(F), mf(G)</code></item>
<item><ident>imf(E)</ident> = <code>imf(F), mf(G)</code></item>
<item><ident>imf(E)</ident> = <code>I*, mf(E)</code>
= <code>I*, mf(F), mf(G)</code></item>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>(F|G)</code>, then
<list>
<item><ident>m(E)</ident> = <code>(m(F)|m(G))</code></item>
<item><ident>mf(E)</ident> = <code>(m(F)|m(G)), I*</code></item>
<item><ident>mf(E)</ident> = <code>(mf(F)|mf(G))</code></item>
<item><ident>imf(E)</ident> = <code>I*, mf(E)</code> = <code>I*,
(m(F)|m(G)), I*</code>
or <code>(I*, (mf(F)|mf(G)))</code></item>
</list>
</p>
<p>
If <ident>E</ident> has the form <code>(F&amp;G)</code>, then
<list>
<item><ident>m(E)</ident> = <code>m(F,G)|m(G,F)</code></item>
<item><ident>mf(E)</ident> = <code>m(F&amp;G), I*</code></item>
<item><ident>imf(E)</ident> = <code>I*, m(F&amp;G), I*</code></item>
</list>
</p>
</div2>

<div2><head>Examples</head>
<p>
Let's do some simple examples, abstracted from the TEI.
</p>

<div3 type='section'><head>Simple Examples</head>
<p>
<list>
<item><code>(a,b)</code> ==> <code>(I*, a, I*, b, I*)</code>
(<gi>TEI.2</gi> has this structure.)</item>
<item><code>(a,b+)</code> ==> <code>(I*, a, I*, (b, I*)+)</code>
(<gi>teiCorpus.2</gi> has this structure.)</item>
<item><code>(a*)</code> ==> <code>(a | I)*</code>
(<gi>spanGrp</gi> and many other elements have this structure.)</item>
<item><code>(#PCDATA | a | b | c | d)*</code> (%paraContent et al.)
<lb>==><code>(m(#PCDATA | a | b | c | d) | I)*</code>
<lb>==><code>((m(#PCDATA) | m(a) | m(b) | m(c) | m(d)) | I)*</code>
<lb>==><code>((#PCDATA | a | b | c | d) | I)*</code>
<lb>==><code>(#PCDATA | a | b | c | d | I)*</code>
</item>
<item><code>a+</code> ==> <code>(I*, (a, I*)+)</code></item>
<item><code>(a|b)+</code> ==> <code>(I*, ((a|b), I*)+)</code></item>
</list>

</p>
</div3>

<div3><head>A Complex Example:  <ident>back</ident></head>
<p>The element <gi>back</gi> is defined thus:
<eg><![CDATA[
<!ELEMENT %n.back;      - O
  ( (%m.front)*,
    ( ( (%m.divtop),
        (%m.divtop | %n.titlePage;)*
      )
    | ( (%n.div;),
        (%n.div; | (%m.front))*
      )
    | ( (%n.div1;),
        (%n.div1; | (%m.front))*
      )
    )?
  )     >
]]>
</eg>
</p>
<p>Removing the parameter entities and using single-letter identifiers,
we can rewrite the content model this way to show its structure a little
more clearly:
<eg>
( (a | b | c)*,
  ( ( (d | e | f),
      (d | e | f | g)*
    )
  | ( (h),
      (h | (a | b | c))*
    )
  | ( (i),
      (i | (a | b | c))*
    )
  )?
)
</eg>
Or more compactly:
<eg>
( (a | b | c)*,
  ( ( (d | e | f), (d | e | f | g)* )
  | ( h, (h | a | b | c)* )
  | ( i, (i | a | b | c)* )
  )?
)
</eg>
i.e. <ident>E</ident> has the form <code>F,G</code> where
<ident>F</ident>=<code>(a|b|c)*</code> and
<ident>G</ident>=<code>(((d|e|f) ... (i|a|b|c)*))?</code>.  So
<ident>imf(E)</ident> = <code>imf(F), mf(G)</code>.
</p>
<p>Now, <ident>F</ident> is simple:
<ident>imf(a|b|c)</ident>* = <code>(a | b | c | I)*</code>
</p>
<p>But
<ident>mf(G)</ident> requires more work.
</p>
<p>
<ident>G</ident> = <code>H?</code> where
<ident>H</ident> =
<eg>
     ( ( (d | e | f), (d | e | f | g)* )
     | ( h, (h | a | b | c)* )
     | ( i, (i | a | b | c)* )
     )
</eg>
So <ident>mf(G)</ident> = <code>(m(H), I*)?</code>
</p>
<p>
<ident>H</ident> in turn is an alternation of three sequences, each of
the form <code>(x, (y|z)*)</code>.
This leads to a problem, because the final term in each sequence is
nullable; we will have a determinism conflict with the trailing
<code>I*</code>.
</p>
<p>
So we add a new definition of
<ident>mf(E)</ident> where <ident>E</ident> = <code>F?</code>.
<ident>mf(F?)</ident> = <code>mf(F)?</code>
</p>
<p>Applied to <ident>G</ident>, we have:
<ident>mf(G)</ident> = <code>(mf(H))?</code>, with
<ident>H</ident> = <code>(J | K | L)</code>.</p>
<p>So
<ident>mf(H)</ident> = <code>((m(J) | m(K) | m(L)), I*)</code>
</p>
<p>
But <ident>J</ident>, <ident>K</ident>, and <ident>L</ident> don't have
<ident>m()</ident> forms, since their final term is nullable.  So we
use the alternate definition:
</p>
<p>
<ident>mf(H)</ident> = <code>(mf(J) | mf(K) | mf(L))</code>
</p>
<p>We have the following:
<list>
<item><ident>J</ident> = <code>( (d | e | f),     (d | e | f | g)* )</code></item>
<item><ident>mf(J)</ident> = <code>( (d | e | f), I*, (d | e | f | g | I)*)</code></item>
<item><ident>K</ident> = <code>( h,     (h | a | b | c)* )</code>
<item><ident>mf(K)</ident> = <code>( h, I*, (h | a | b | c | I)* )</code></item>
<item><ident>L</ident> = <code>( i,     (i | a | b | c)* )</code></item>
<item><ident>mf(L)</ident> = <code>( i, I*, (i | a | b | c | I)* )</code></item>
</list>
</p>
<p>So <ident>mf(H)</ident> =
<eg>
        ( ( (d | e | f), I*, (d | e | f | g | I)*)
        | ( h, I*, (h | a | b | c | I)* )
        | ( i, I*, (i | a | b | c | I)* )
        )
</eg>
</p>
<p>Recall that
<ident>mf(G)</ident> = <code>(mf(H))?</code>.</p>
<p>So
<ident>mf(G)</ident> =
<eg>
        ( ( (d | e | f), I*, (d | e | f | g | I)*)
        | ( h, I*, (h | a | b | c | I)* )
        | ( i, I*, (i | a | b | c | I)* )
        )?
</eg>
and
<ident>imf(E)</ident> = <code>imf(F), mf(G)</code> =
<eg>
         ( (a | b | c | I)*,
           ( ( (d | e | f), I*, (d | e | f | g | I)*)
           | ( h, I*, (h | a | b | c | I)* )
           | ( i, I*, (i | a | b | c | I)* )
           )?
         )
</eg>
</p>
<p>Or, in content model terms (using the usual TEI conventions for names
of element classes):
<eg><![CDATA[
<!ELEMENT %n.back;      - O
  ( (%m.front; | %m.I;)*,
    ( ( (%m.divtop;),
        (%Istar;),
        (%m.divtop; | %n.titlePage; | %m.I;)*
      )
    | ( (%n.div;),
        (%Istar;),
        (%n.div; | %m.front; | %m.I;)*
      )
    | ( (%n.div1;),
        (%Istar;),
        (%n.div1; | %m.front; | %m.I;)*
      )
    )?
  )     >
]]></eg>
</p>
<p>
I think we've got a system we can use manually, though I don't
know for sure how to make it a program, given the problems we have
defining some of the functions.
</p>
</div3>
</div2>
<div2><head>Removing inclusions in TEI P3</head>

<p>The following elements have inclusion exceptions in TEI P3 (as of
September 1994):
<list>
<item><gi>entry</gi> (includes <gi>anchor</gi>)</item>
<item><gi>entryFree</gi> (includes <code>%m.dictionaryParts; | %m.phrase;
| %m.inter;</code>)</item>
<item><gi>eg</gi> (includes <code>%m.dictionaryParts; |
%m.formPointers;</code>)</item>
<item><gi>orgName</gi> (includes <gi>orgtitle</gi>, <gi>orgtype</gi>,
and <gi>orgdivn</gi>)</item>
<item><gi>text</gi> (includes <code>%m.globincl;</code>, i.e.
<gi>alt</gi>,
<gi>altGrp</gi>,
<gi>cb</gi>,
<gi>certainty</gi>,
<gi>fLib</gi>,
<gi>fs</gi>,
<gi>fsLib</gi>,
<gi>fvLib</gi>,
<gi>index</gi>,
<gi>interp</gi>,
<gi>interpGrp</gi>,
<gi>join</gi>,
<gi>joinGrp</gi>,
<gi>lb</gi>,
<gi>link</gi>,
<gi>linkGrp</gi>,
<gi>milestone</gi>,
<gi>pb</gi>,
<gi>respons</gi>,
<gi>span</gi>,
<gi>spanGrp</gi>, and
<gi>timeline</gi>)</item>
<item><gi>lem</gi> (includes <code>%m.fragmentary;</code>, i.e.
<gi>lacunaEnd</gi>,
<gi>lacunaStart</gi>,
<gi>witEnd</gi>, and
<gi>witStart</gi>)</item>
<item><gi>rdg</gi> (includes <code>%m.fragmentary;</code>)</item>
<item><gi>termEntry</gi> (the version in the nested DTD includes
<code>%m.terminologyInclusions;</code>, i.e.
<gi>date</gi>,
<gi>dateStruct</gi>,
<gi>note</gi>,
<gi>ptr</gi>,
<gi>ref</gi>,
<gi>xptr</gi>, and
<gi>xref</gi>)</item>
</list>
</p>
<p>The inclusions on <gi>entry</gi>, <gi>entryFree</gi>, and <gi>eg</gi>
will
be taken care of separately, in the section on the dictionary chapter.
</p>
<p>The inclusions on <gi>orgName</gi> were dropped in October 1994
(though this change has not been propagated to any public version of the
DTD), and so we will ignore them.</p>
<p>The inclusions on <gi>text</gi> must be propagated to all
potential descendants of <gi>text</gi>.</p>
<p>The inclusions on <gi>lem</gi> and <gi>rdg</gi> must be propagated to
all potential descendants; it might be possible to do without
these, but it's probably not worth the effort.</p>
<p>Note that in the case of <ident>terminologyInclusions</ident>, the
set of inclusions is not disjoint from the set of children named
directly in content models.
</p>

<p>Study of the full TEI DTD shows that the sets of possible descendants
of <gi>text</gi>, <gi>lem</gi>, <gi>rdg</gi>, and
<gi>termEntry</gi> are all identical.  This is not surprising given
that <gi>text</gi> is recursive.
</p>

<p>The 263 elements in this set fall into the following groups:
<list type=bullets>
<item>52 elements declared <kw>EMPTY</kw>:
addSpan,
alt,
anchor,
any,
arc,
caesura,
cb,
certainty,
delSpan,
dft,
divGen,
eLeaf,
event,
gap,
handShift,
index,
iNode,
interp,
join,
kinesic,
lacunaEnd,
lacunaStart,
lb,
leaf,
link,
milestone,
minus,
move,
msr,
nbr,
node,
none,
null,
oRef,
pause,
pb,
plus,
pRef,
ptr,
rate,
respons,
root,
shift,
space,
span,
sym,
uncertain,
vocal,
when,
witEnd,
witStart, and
xptr
</item>
<item>16 elements declared with <code>(#PCDATA)</code>:
att,
day,
gi,
hour,
idno,
minute,
month,
offset,
postBox,
postCode,
second,
str,
tag,
val,
week, and
year.
(Of these, note that <gi>att</gi>,
<gi>gi</gi>,
<gi>tag</gi>, and
<gi>val</gi> aren't actually in the main DTD, so they won't
be handled here.  Perhaps all these lists need to be checked
once more in a calm moment.)
</item>
<item>57 elements declared with <code>(%phrase.seq;)</code>:
abbr,
actor,
addrLine,
author,
authority,
biblScope,
cl,
date,
dateRange,
del,
distance,
distinct,
distributor,
docAuthor,
docDate,
edition,
editor,
expan,
extent,
funder,
fw,
gloss,
headItem,
headLabel,
label,
measure,
mentioned,
name,
num,
occasion,
orgDivn,
orgName,
orgTitle,
orgType,
orig,
phr,
principal,
publisher,
pubplace,
reg,
resp,
restore,
role,
roleDesc,
rs,
s,
salute,
signed,
soCalled,
speaker,
sponsor,
street,
term,
time,
timeRange,
trailer, and
wit
[Supernumerary in ND: surname, forename, genName, nameLink, addName,
roleName, settlement, bloc.]
[Supernumerary in Corpus:  channel, constitution, derivation,
domain, factuality, interaction, preparedness, purpose, birth,
firstLang, langKnown, residence, education, affiliation, occupation,
socecstatus, locale, activity.]
[Supernumerary in Header:  symbol, creation, language, classCode]
<note place='foot'>
<emph>What is wrong with these lists, and why are they not complete?</emph>
The Names and Dates tag set may not have been selected, or the DTD
I used may -- almost surely did -- have the bug that makes much of
that tag set unreachable.  The Corpus tags are for the header, and
may in fact not be descendants of <gi>text</gi>.
</note>
</item>
<item>one element declared with <code>(%component.seq;)</code>:
epigraph
</item>
<item>35 elements declared with <code>(%paraContent;)</code>:
 admin,
 camera,
 caption,
cell,
country,
 damage,
 descrip,
 docEdition,
 emph,
figDesc,
 foreign,
 gram,
 head,
 hi,
 imprimatur,
 l,
lang,
x lem,
 meeting,
 otherForm,
 p,
x rdg,
 ref,
region,
seg,
 sound,
 supplied,
 tech,
 title,
 titlePart,
 unclear,
 witDetail,
 witness,
  writing, and
xref.
N.B. this list does not include elements from the dictionary tag set, 
the feature system
declaration, or the tag set declaration.<note place="foot">
The dictionary tag set includes orth, pron, hyph, syll, stress, gram,
gen, number, case, per, tns, mood, itype, pos, subc, colloc, def, tr,
lang, usg, lbl.
</note>
The dictionary tag set
presents problems of its own, and the others are not part of the
main TEI DTD.
</item>
<item>nine elements declared with <code>(%specialPara;)</code>:
add,
corr,
item,
note,
q,
quote,
sic,
stage, and
view
</item>
<item>95 elements with non-standard content models requiring manual
changes:
address,
altgrp,
analytic,
app,
argument,
availability,
back,
bibl,
biblfull,
biblstruct,
body,
broadcast,
byline,
c,
castgroup,
castitem,
castlist,
cit,
closer,
dateline,
datestruct,
div,
div0,
div1,
div2,
div3,
div4,
div5,
div6,
div7,
docimprint,
doctitle,
editionStmt,
epilogue,
equipment,
etree,
f,
falt,
figure,
flib,
formula,
front,
fs,
fslib,
fvlib,
graph,
group,
imprint,
interpgrp,
joingrp,
lg,
lg1,
lg2,
lg3,
lg4,
lg5,
linkgrp,
list,
listbibl,
m,
monogr,
notesStmt,
ofig,
opener,
ovar,
performance,
prologue,
publicationStmt,
pvar,
rdggrp,
recording,
recordingStmt,
respStmt,
row,
scriptStmt,
series,
seriesStmt,
set,
sourcedesc,
sp,
spangrp,
table,
termentry,
text,
tig,
timeline,
timestruct,
titlepage,
titleStmt,
tree,
triangle,
u,
valt,
w, and
witlist
</item>
</list>
Note that this list excludes most element types from the dictionary tag
set, since they need special treatment anyway.  (It does not exclude all
of them, though, which puzzles me.)
</p>

<p>Empty elements need no changes.</p>

<p>The other groups of elements do require changes to the DTD,
which are described in the following sections.</p>

<div3><head>The <ident>m.Incl</ident> element class</head>

<p>In order to simplify the process of adding inclusions to the content
models of the DTD, we define a new class for use in content models,
namely <ident>m.Incl</ident>.  This consists of:
<list type=bullets>
<item><ident>globincl</ident> (included by <gi>text</gi>)</item>
<item><ident>fragmentary</ident>, if the additional tag set for
text-critical apparatus is selected (included by <gi>lem</gi> and
<gi>rdg</gi>)</item>
</list>
For now, we ignore the problems posed by the <gi>termEntry</gi> element.
In the long run, they mean the terminology tag set is going to need
to be rewritten.  (Of course, it needs rewriting anyway, to align
it with more recent ISO work.)
<scrap id='newincl' name='Element class m.Incl'>
<<!>!ENTITY % x.Incl ''>
<<!>![%TEI.textcrit;[
<<!>!--* If text criticism tag set is selected, include m.fragmentary
    * in the class m.Incl.
    *-->
<<!>!ENTITY % m.Incl '%x.Incl; %m.globincl; | %m.editIncl; 
    | %m.fragmentary; | %n.anchor;'                             >
]<!>]>
<<!>!--* Otherwise, don't.                                      *-->
<<!>!ENTITY % m.Incl '%x.Incl; %m.globincl; | %m.editIncl;
    | %n.anchor;'                                               >
</scrap>
</p>
<p>We have to reproduce the standard declarations for the inclusion
classes:
<scrap id='reproincl' name='Reproduce inclusion classes'>
<<!>!ENTITY % x.metadata ''                                        >
<<!>!ENTITY % m.metadata '%x.metadata; %n.alt; | %n.altGrp; | 
           %n.certainty; | %n.fLib; | %n.fs; | %n.fsLib; | 
           %n.fvLib; | %n.index; | %n.interp; | %n.interpGrp; | 
           %n.join; | %n.joinGrp; | %n.link; | %n.linkGrp; | 
           %n.respons; | %n.span; | %n.spanGrp; | %n.timeline;' >
<<!>!ENTITY % x.refsys ''                                          >
<<!>!ENTITY % m.refsys '%x.refsys; %n.cb; | %n.lb; | %n.milestone; 
           | %n.pb;'                                            >
<<!>!ENTITY % x.globincl ''                                        >
<<!>!ENTITY % m.globincl '%x.globincl; %m.metadata; | %m.refsys;'  >
</scrap>
</p>

</div3>

<div3><head>Changing <kw>#PCDATA</kw> elements</head>
<p>Each element which now has a content model of <kw>#PCDATA</kw>
should, for compatibility, be revised to have a content model
of <code>(#PCDATA | %m.Incl;)*</code>.
</p>

<p>In some cases, it might be preferable to leave the content model
alone:  it's not clear that it's really useful to allow index entries,
feature structure libraries, and joins to occur within attribute names,
generic identifiers, and the components of structured times and dates.
Even within generic identifiers and so on, there might be line
breaks, page breaks, or other milestones, but perhaps we should
define at least some of these elements as <code>(#PCDATA |
%m.refsys;)*</code>.
</p>

<p>For now, for purposes of the experimental XML DTD, I propose to use
the first form given.</p>

<![IGNORE[
<p>(Scraps with suppression and redefinition of att, day, gi, hour,
idno, minute, month, offset, postBox, postCode, second, str, tag, val,
week, and year to be supplied here.)</p>
]]>

<p>First, we suppress all of these elements:
<scrap id="xempty"
       name="Suppress standard definitions of PCDATA elements">
<<!>!ENTITY % day             'IGNORE' >
<<!>!ENTITY % hour            'IGNORE' >
<<!>!ENTITY % minute          'IGNORE' >
<<!>!ENTITY % month           'IGNORE' >
<<!>!ENTITY % offset          'IGNORE' >
<<!>!ENTITY % second          'IGNORE' >
<<!>!ENTITY % week            'IGNORE' >
<<!>!ENTITY % year            'IGNORE' >
<<!>!ENTITY % idno            'IGNORE' >
<<!>!ENTITY % postBox         'IGNORE' >
<<!>!ENTITY % postCode        'IGNORE' >
<<!>!ENTITY % str             'IGNORE' >
</scrap>
<!--* don't suppress att, gi, tag, or val.  They aren't in the main DTD 
    *-->
</p>
<p>Then we supply the new declarations:
<scrap id="newempty"
       name="New definitions for PCDATA elements">
<<!>![%TEI.names.dates;[
<<!>!ENTITY % XML.day "INCLUDE" >
<<!>![%XML.day;[
<<!>!ELEMENT %n.day;         - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.day;            %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'day'          >
]<!>]>
<<!>!ENTITY % XML.hour "INCLUDE" >
<<!>![%XML.hour;[
<<!>!ELEMENT %n.hour;        - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.hour;           %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'hour'         >
]<!>]>
<<!>!ENTITY % XML.minute "INCLUDE" >
<<!>![%XML.minute;[
<<!>!ELEMENT %n.minute;      - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.minute;         %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'minute'       >
]<!>]>
<<!>!ENTITY % XML.month "INCLUDE" >
<<!>![%XML.month;[
<<!>!ELEMENT %n.month;       - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.month;          %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'month'        >
]<!>]>
<<!>!ENTITY % XML.offset "INCLUDE" >
<<!>![%XML.offset;[
<<!>!ELEMENT %n.offset;      - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.offset;         %a.global;
          value              CDATA               #IMPLIED
                             %a.placePart;
          TEIform            CDATA               'offset'       >
]<!>]>
<<!>!ENTITY % XML.second "INCLUDE" >
<<!>![%XML.second;[
<<!>!ELEMENT %n.second;      - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.second;         %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'second'       >
]<!>]>
<<!>!ENTITY % XML.week "INCLUDE" >
<<!>![%XML.week;[
<<!>!ELEMENT %n.week;        - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.week;           %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'week'         >
]<!>]>
<<!>!ENTITY % XML.year "INCLUDE" >
<<!>![%XML.year;[
<<!>!ELEMENT %n.year;        - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.year;           %a.global;
                             %a.temporalExpr;
          TEIform            CDATA               'year'         >
]<!>]>
]<!>]>
<<!>!ENTITY % XML.idno "INCLUDE" >
<<!>![%XML.idno;[
<<!>!ELEMENT %n.idno;        - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.idno;           %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'idno'         >
]<!>]>
<<!>!ENTITY % XML.postBox "INCLUDE" >
<<!>![%XML.postBox;[
<<!>!ELEMENT %n.postBox;     - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.postBox;        %a.global;
          TEIform            CDATA               'postBox'      >
]<!>]>
<<!>!ENTITY % XML.postCode "INCLUDE" >
<<!>![%XML.postCode;[
<<!>!ELEMENT %n.postCode;    - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.postCode;       %a.global;
          TEIform            CDATA               'postCode'     >
]<!>]>
<<!>![%TEI.fs;[
<<!>!ENTITY % XML.str "INCLUDE" >
<<!>![%XML.str;[
<<!>!ELEMENT %n.str;         - -  (#PCDATA | %m.Incl;)*  >
<<!>!ATTLIST %n.str;            %a.global;
          rel                (eq | ne | sb | ns | lt | le | gt 
                             | ge)               eq
          TEIform            CDATA               'str'          >
]<!>]>
]<!>]>
</scrap>
</p>

</div3>

<div3><head>Changing <ident>phrase.seq</ident></head>
<p>The parameter entity <ident>phrase.seq</ident> should be redefined as
follows:
<scrap id='newphrase'
       name='New declaration for phrase and phrase.seq'>
<<!>!ENTITY % phrase '#PCDATA | %m.phrase; | %m.Incl;'             >
<<!>!ENTITY % phrase.seq '(%phrase;)*'                             >
</scrap>
(This supersedes the redefinition given earlier.  Adding the inclusions
to the class <ident>phrase</ident> (i.e. to the entity
<ident>m.phrase</ident>) might enable some of the redefinitions
already given above to stand unchanged, but for now, at least, I
propose to keep the inclusions logically separate from the original
element classes.)
Note that the entity <ident>phrase</ident> is used only once, in the
definition of <gi>u</gi>.
</p>

<p>No changes to the actual content models are needed.  (Ah, the
joys of indirection.)</p>

<p>(Note, 14 May 1999.) No, wait, actually, that's not true.  Many of these
declarations read 
<eg><![CDATA[
<!ELEMENT %n.foo;       - O  (%phrase.seq;)                     >
]]></eg>
which, expanded, would be
<eg><![CDATA[
<!ELEMENT %n.foo;       - O  ((#PCDATA | %m.phrase; | %m.Incl;)*)>
]]></eg>
which is illegal. The content models do need to be changed, to
<eg><![CDATA[
<!ELEMENT %n.foo;       %phrase.seq;                            >
]]></eg>
This is only required if we wish to allow the extensions file to
work with the current (1994-09) production DTDs. Since those are
what I currently have on this laptop, I do wish.  But since we will
shortly be releasing corrected versions, we want to make this
part of the extensions file optional.  We'll do so using a
conditional inclusion on the parameter entity <ident>base9409</ident>,
which by default will be defined <code>IGNORE</code>.</p>
<p>
The same logic applies to <ident>paraContent</ident> and
(for now) <ident>specialPara</ident>.</p>
<p>(Note, 30 May 1999.)  No, no, wait.  Doesn't <ident>carthage</ident>
already normalize these correctly by omitting extra parentheses?
I've already spent several hours making the scraps below, and now
realize we may not need them after all.  (17 June 1999.) 
I've removed them,
since <ident>carthage</ident> actually does produce legal XML.</p>

</div3>

<div3><head>Changing <ident>component.seq</ident></head>
<p>The entity <ident>component.seq</ident> must be redefined to allow
inclusions between any two components.  In the long run,
the changes should be made directly within the various declarations
which go into <ident>component.seq</ident>, but those declarations are
among the most complicated of the entire TEI DTD, since there are
variant versions for each of the two hundred or so possible
combinations of base tag sets.</p>

<p>The quick and dirty approach most suitable for use in the
experimental XML DTD is to include the <ident>Incl</ident> class as a
subclass of <ident>common</ident>, thus:
<scrap id='newxcommon' name='New declaration for x.common'>
<<!>!ENTITY % x.common '%m.Incl; |'>
</scrap>
If this proves to introduce ambiguity in the content model, we'll have
to find a slower, cleaner way to do it.
</p>
<p>Experiment shows that it does indeed introduce ambiguity in 
content models, notably those for <gi>body</gi> and text
divisions.  Rather than hack at those content models, I am going
to take the longer and slower approach.
<scrap id='newcomp' name='New declaration for component and component.seq'>
<<!>!ENTITY % x.common ''                                          >
<<!>!ENTITY % m.common '%x.common %m.bibl; | %m.chunk; | 
           %m.hqinter; | %m.lists; | %m.notes; | %n.stage;'     >
<ref target='reprocomp'>Reproduce standard component declarations</ref>
<<!>!-- The entity component.seq is always a starred sequence    -->
<<!>!-- of component elements. Its definition does not vary      -->
<<!>!-- with the base (unless we are using the general base, in  -->
<<!>!-- which case it has already been defined above), but the   -->
<<!>!-- meaning of the definition does.                          -->
<<!>!ENTITY % component.seq '((%component;), (%m.Incl;)*)*'        >
</scrap>
</p>
<p>
<scrap id='reprocomp' name='Reproduce standard component declarations'>
<<!>!ENTITY % mix.verse ''                                         >
<<!>!ENTITY % mix.drama ''                                         >
<<!>!ENTITY % mix.spoken ''                                        >
<<!>!ENTITY % mix.dictionaries ''                                  >
<<!>!ENTITY % mix.terminology ''                                   >

<<!>![ %TEI.mixed; [
<<!>!ENTITY % TEI.singleBase 'IGNORE'                              >
<<!>!ENTITY % component '(%m.common; %mix.verse; %mix.drama; 
  %mix.spoken; %mix.dictionaries; %mix.terminology;)'              >
]<!>]>

<<!>![ %TEI.general; [
<<!>!ENTITY % TEI.singleBase 'IGNORE'                              >
<<!>!ENTITY % component '(%m.common; %mix.verse; %mix.drama; 
  %mix.spoken; %mix.dictionaries; %mix.terminology;)'              >

<<!>![ %TEI.verse; [
<<!>!ENTITY % gen.verse '((%m.comp.verse;), (%m.common; | 
%m.comp.verse; | %m.Incl;)*) |'                                 >
]<!>]>
<<!>![ %TEI.drama; [
<<!>!ENTITY % gen.drama '((%m.comp.drama;), (%m.common; | 
%m.comp.drama; | %m.Incl;)*) |'                                 >
]<!>]>
<<!>![ %TEI.spoken; [
<<!>!ENTITY % gen.spoken '((%m.comp.spoken;), (%m.common; | 
%m.comp.spoken; | %m.Incl;)*) |'                                >
]<!>]>
<<!>![ %TEI.dictionaries; [
<<!>!ENTITY % gen.dictionaries '((%m.comp.dictionaries;), 
(%m.common; | %m.comp.dictionaries; | %m.Incl;)*) |'            >
]<!>]>
<<!>![ %TEI.terminology; [
<<!>!ENTITY % gen.terminology '((%m.comp.terminology;), (%m.common; 
| %m.comp.terminology; | %m.Incl;)*) |'                         >
]<!>]>
<<!>!-- Default declarations for all the entities gen.verse,     -->
<<!>!-- etc.                                                     -->
<<!>!ENTITY % gen.verse ''                                         >
<<!>!ENTITY % gen.drama ''                                         >
<<!>!ENTITY % gen.spoken ''                                        >
<<!>!ENTITY % gen.dictionaries ''                                  >
<<!>!ENTITY % gen.terminology ''                                   >
<<!>!ENTITY % component.seq '((%m.common;), (%m.Incl;)*)*, 
  (%gen.verse; %gen.drama; %gen.spoken; %gen.dictionaries; 
  %gen.terminology; TEI...end)?'   >
<<!>!ENTITY % component.plus '(%gen.verse; %gen.drama; %gen.spoken; 
  %gen.dictionaries; %gen.terminology; TEI...end)
  |
  ( ((%m.common;), (%m.Incl;)*)+, 
    (%gen.verse; %gen.drama; %gen.spoken; 
    %gen.dictionaries; %gen.terminology; TEI...end)?'           >
<<!>!-- (End of marked section for general base.)                -->
]<!>]>

<<!>![ %TEI.prose; [
<<!>!ENTITY % component '(%m.common;)'                             >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>![ %TEI.verse; [
<<!>!ENTITY % component '(%m.common; | %m.comp.verse;)'            >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>![ %TEI.drama; [
<<!>!ENTITY % component '(%m.common; | %m.comp.drama;)'            >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>![ %TEI.spoken; [
<<!>!ENTITY % component '(%m.common; | %m.comp.spoken;)'           >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>![ %TEI.dictionaries; [
<<!>!ENTITY % component '(%m.common; | %m.comp.dictionaries;)'     >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>![ %TEI.terminology; [
<<!>!ENTITY % component '(%m.common; | %m.comp.terminology;)'      >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
]<!>]>

<<!>!-- Default declaration.                                     -->
<<!>!ENTITY % component '(%m.common;)'                             >
<<!>!ENTITY % TEI.singleBase 'INCLUDE'                             >
</scrap></p>

</div3>

<div3><head>Changing <ident>paraContent</ident></head>
<p>The parameter entity <ident>paraContent</ident> must be changed as
follows:
<scrap id='newpara' name='New declaration for paraContent'>
<<!>!ENTITY % paraContent '(#PCDATA | %m.phrase; | %m.inter;
| %m.Incl;)*'                                                   >
</scrap>
</p>
<p>No change to actual content models is needed.</p>
<p>(Note, 14 May 1999.) No, wait, actually, that's not true.  Many of these
declarations read 
<eg><![CDATA[
<!ELEMENT %n.p;         - O  (%paraContent;)                    >
]]></eg>
which, expanded, would be
<eg><![CDATA[
<!ELEMENT %n.p;         - O  ((#PCDATA | %m.phrase; | %m.inter;
                             | %m.Incl;)*)                      >
]]></eg>
which is illegal. The content models do need to be changed, to
<eg><![CDATA[
<!ELEMENT %n.p;         - O  %paraContent;                      >
]]></eg>
</p>
<p>For now, though, we can rely on carthage to do the job, so
I've deleted the long boring scraps that used to be here.
</p>
</div3>

<div3 id='specialPara'>
<head>The problem of <ident>specialPara</ident> elements</head>

<p>In TEI P3, the entity <ident>specialPara</ident> is defined thus:
<eg><![CDATA[
<!ENTITY % specialPara '(((%m.chunk), (%component.seq)) |
(%paraContent))'                                                >
]]></eg>
It allows an element to contain either a series of chunks or the same
content as a paragraph.  It is intended
for elements like notes and list items:  the normal case, in which the
item consists of a single paragraph, can be tagged simply
(<code>&lt;item> ... &lt;/item></code>)
and the multi-paragraph case can be accommodated using nested paragraphs
or other chunk-level elements
(<code>&lt;item>&lt;p> ... &lt;/p>&lt;p> ... &lt;/p>&lt;/item></code>).
In practice, the multi-paragraph form has proven very disconcerting to
users, since it is not intuitively obvious that no white space may
appear between the paragraphs.<note place='foot'>This is a classic
example of what is known in DTD design circles as the Mixed-Content
Gotcha; the problems associated with it led the XML design group to
restrict the form of mixed-content models in order to forbid content
models which are subject to the problem.  This restriction, in turn,
makes it essential to revise <ident>specialPara</ident> in an XML
version of the TEI DTD.</note>  The current definition and use of
<ident>specialPara</ident> are thus acknowledged by the editors to be an
error.  Since there is no obvious solution, however, it is not a
<term>corrigible error</term>.
</p>
<p>In changing <ident>specialPara</ident> to meet the requirements of
XML, there are three obvious possible solutions.  We can overgenerate,
so as to allow all existing data to remain valid:
<eg><![CDATA[
<!ENTITY % specialPara '(#PCDATA | %m.phrase; | %m.inter;
| %m.chunk;)*' >
]]></eg>
This has the drawback of allowing paragraphs and other chunk-level
elements to float within character data, thus violating one of the few
consistently followed rules of the TEI DTD.
</p>
<p>Alternatively, we can bite the bullet and require that list items and
notes which consist of a single paragraph be marked as such:
<eg><![CDATA[
<!ENTITY % specialPara '%component.seq;' >
]]></eg>
This has the advantage of being relatively clean, but it has the
major disadvantage of requiring retagging for almost all current
list items and notes.  What is
now tagged
<code>&lt;item> ... &lt;/item></code>
would have to be retagged
<code>&lt;item>&lt;p> ... &lt;/p>&lt;/item></code>.
The best that can be said is that such retagging could in principle be
automated.
</p>
<p>A third approach would be to have distinct element types for
simple list items and notes, and compound ones.  The simple form
could be defined as containing <ident>paraContent</ident>, and the
compound ones as containing <ident>component.seq</ident>.  This
would also require retagging (of all compound list items and notes), but
not as much as the previous approach.
</p>

<p>For purposes of the experimental XML DTD, we take the first approach.
</p>

<p>The following element types are defined as containing
<ident>specialPara</ident>:
<list type=bullets>
<item><gi>q</gi> (in the core)</item>
<item><gi>quote</gi> (in the core)</item>
<item><gi>sic</gi> (in the core)</item>
<item><gi>corr</gi> (in the core)</item>
<item><gi>add</gi> (in the core) -- but not <gi>del</gi>!</item>
<item><gi>item</gi> (in the core)</item>
<item><gi>note</gi> (in the core)</item>
<item><gi>stage</gi> (in the core)</item>
<item><gi>set</gi> (in drama -- needs manual fix)</item>
<item><gi>view</gi> (in drama)</item>
<item><gi>equiv</gi> (in tag set documentation)</item>
</list>
</p>
<p>All but one of these can be fixed simply by redefining
<ident>specialPara</ident> thus:
<scrap id='newspecPara' name='New specialPara'>
<<!>!ENTITY % specialPara '(#PCDATA | %m.phrase; | %m.inter;
| %m.chunk; | %m.Incl;)*' >
</scrap>
In order to redefine <ident>specialPara</ident>, we must first reproduce
a number of class declarations from
<ident>teiclas2.ent</ident>:
<scrap id="reprospec" name="Reproduce classes used by specPara">
<<!>!ENTITY % x.hqinter ''                                         >
<<!>!ENTITY % m.hqinter '%x.hqinter; %n.cit; | %n.q; | %n.quote;'  >
<<!>!ENTITY % x.bibl ''                                            >
<<!>!ENTITY % m.bibl '%x.bibl; %n.bibl; | %n.biblFull; |
           %n.biblStruct;'                                      >
<<!>!ENTITY % x.lists ''                                           >
<<!>!ENTITY % m.lists '%x.lists; %n.label; | %n.list; |
           %n.listBibl;'                                        >
<<!>!ENTITY % x.notes ''                                           >
<<!>!ENTITY % m.notes '%x.notes; %n.note; | %n.witDetail;'         >
<<!>!ENTITY % x.stageDirection ''                                  >
<<!>!ENTITY % m.stageDirection '%x.stageDirection; %n.camera; |
           %n.caption; | %n.move; | %n.sound; | %n.tech; |
           %n.view;'                                            >

<<!>!ENTITY % x.inter ''                                           >
<<!>!ENTITY % m.inter '%x.inter; %m.bibl; | %m.hqinter; | %m.lists;
           | %m.notes; | %m.stageDirection; | %n.castList; |
           %n.figure; | %n.stage; | %n.table; | %n.text;'       >
<<!>!ENTITY % x.chunk ''                                           >
<<!>!ENTITY % m.chunk '%x.chunk; %n.ab; | %n.eTree; | %n.graph; | 
           %n.l; | 
           %n.lg; | %n.p; | %n.sp; | %n.tree; | %n.witList;'    >
</scrap>
</p>
<p>The <gi>ab</gi> element is new and we need to declare its
content model:
<scrap prev='newgis' name='Declare new GIs'>
<<!>!ENTITY % n.ab 'ab' >
</scrap>
</p>

<p>Only one content model must be redefined by hand, to flatten the
group:  that of <gi>set</gi> in the drama tag set.  The current
definition is this:
<eg><![ CDATA [
<!ELEMENT set           - -  ((head)?, %specialPara;)           >
<!ATTLIST set                %a.global;
          TEIform            CDATA               'set'          >
]]></eg>
If we flatten this in the expected way, we get this:
<eg><![CDATA[
<!ELEMENT %n.set;       - -  (#PCDATA | %m.phrase; | %m.inter;
                             | %m.chunk; | %m.Incl;
                             | %n.head;)*                       >
<!ATTLIST %n.set;            %a.global;
          TEIform            CDATA               'set'          >
]]></eg>
This has the unfortunate result of allowing <gi>head</gi> elements at
random locations; it might be better, in this case, to tighten the
content model instead.<note place='foot'>An inquiry on TEI-L might
usefully reveal whether anyone is actually using <gi>set</gi> and
whether they would be inconvenienced by this tighter model.</note>
Version 2 of the new model is this:
<scrap id='newset' name='New definition of set element'>
<<!>![%TEI.drama;[
<<!>!ENTITY % XML.set "INCLUDE" >
<<!>![%XML.set;[
<<!>!ELEMENT %n.set;       - -  ((%n.head;)?, %component.seq;)     >
<<!>!ATTLIST %n.set;            %a.global;
          TEIform            CDATA               'set'          >
]<!>]>
]<!>]>
</scrap>
Version 2 is not strictly compatible with the old version:  to be fully
compatible we have to allow inclusions up front (Version 3):
<eg><![CDATA[
<!ELEMENT %n.set;       - -  ((%m.Incl;)*, (%n.head;)?,
                             %component.seq;)                   >
]]></eg>
For now, the experimental XML version of the DTD will use Version 2
of this declaration.
</p>
</div3>
</div2>
<div2><head>Elements requiring manual intervention</head>
<p>(Scraps suppressing and redeclaring the remaining
elements to be supplied here.)</p>
<p>The elements to be treated here are:
address,
altgrp,
analytic,
app,
argument,
availability,
back,
bibl,
biblfull,
biblstruct,
body,
broadcast,
byline,
c,
castgroup,
castitem,
castlist,
cit,
closer,
dateline,
datestruct,
div,
div0,
div1,
div2,
div3,
div4,
div5,
div6,
div7,
docimprint,
doctitle,
editionStmt,
epilogue,
equipment,
etree,
f,
falt,
figure,
flib,
formula,
front,
fs,
fslib,
fvlib,
graph,
group,
imprint,
interpgrp,
joingrp,
lg,
lg1,
lg2,
lg3,
lg4,
lg5,
linkgrp,
list,
listbibl,
m,
monogr,
notesStmt,
ofig,
opener,
ovar,
performance,
prologue,
publicationStmt,
pvar,
rdggrp,
recording,
recordingStmt,
respStmt,
row,
scriptStmt,
series,
seriesStmt,
set,
sourcedesc,
sp,
spangrp,
table,
termentry,
text,
tig,
timeline,
timestruct,
titlepage,
titleStmt,
tree,
triangle,
u,
valt,
w, and
witlist.
</p>

<p>The following sections provide the DTD fragments necessary for
suppressing the existing declarations for these elements and declaring
them with new content models.</p>

<div3><head>Core tag set</head>

<p>
<scrap id='xco' name='Suppress definitions in core tag set'>
<<!>!ENTITY % address    'IGNORE' >
<<!>!ENTITY % analytic   'IGNORE' >
<<!>!ENTITY % bibl       'IGNORE' >
<<!>!ENTITY % biblFull   'IGNORE' >
<<!>!ENTITY % biblStruct 'IGNORE' >
<<!>!ENTITY % cit        'IGNORE' >
<<!>!ENTITY % imprint    'IGNORE' >
<<!>!ENTITY % lg         'IGNORE' >
<<!>!ENTITY % list       'IGNORE' >
<<!>!ENTITY % listBibl   'IGNORE' >
<<!>!ENTITY % monogr     'IGNORE' >
<<!>!ENTITY % respStmt   'IGNORE' >
<<!>!ENTITY % series     'IGNORE' >
<<!>!ENTITY % sp         'IGNORE' >
</scrap>
</p>
<p>The existing declarations are these:
<eg><![CDATA[
<!ELEMENT %n.address;   - O  ((%n.addrLine)+ | (%m.addrPart)*)  >
<!ELEMENT %n.analytic;  - O  (%n.author; | %n.editor; |
                             %n.respStmt; | %n.title;)*         >
<!ELEMENT %n.bibl;      - O  (#PCDATA | %m.phrase; |
                             %m.biblPart;)*                     >
<!ELEMENT %n.biblFull;  - O  (%n.titleStmt;, 
                             (%n.editionStmt)?,
                             (%n.extent)?, 
                             %n.publicationStmt;,
                             (%n.seriesStmt)?, 
                             (%n.notesStmt)?,
                             (%n.sourceDesc)*)                  >
<!ELEMENT %n.biblStruct;
                        - O  ((%n.analytic)?, 
                              (%n.monogr;,
                              (%n.series)*)+, 
                              (%n.note; | %n.idno;)*)           >
<!ELEMENT %n.cit;       - -  ((%n.q; | %n.quote;) 
                             & (%m.bibl; | %m.loc;))            >
<!ELEMENT %n.imprint;   - O  (%n.pubPlace; | %n.publisher;
                             | %n.date; | %n.biblScope;)*       >
<!ELEMENT %n.lg;        - O  ((%m.divtop)*, (%n.l; | %n.lg;)+,
                             (%m.divbot)*)                      >
<!ELEMENT %n.list;      - -  ( (%n.head)?,
                               ( ( (%n.item)+ )
                                 | ( (%n.headLabel)?,
                                     (%n.headItem)?,
                                     (%n.label;, %n.item;)+)))  >
<!ELEMENT %n.listBibl;  - -  ((%n.head)?, (%n.bibl; |
                             %n.biblStruct; | %n.biblFull;)+,
                             (%n.trailer)?)                     >
<!ELEMENT %n.monogr;    - O  ( ( ( (%n.author; | %n.editor; |
                                    %n.respStmt;)+, 
                                   (%n.title)+,
                                   (%n.editor; | %n.respStmt;)*) 
                                 |
                                 ( (%n.title)+, 
                                   (%n.author; | %n.editor; 
                                   | %n.respStmt;)*))?,
                               (%n.note; | %n.meeting;)*,
                               (%n.edition;, 
                                 (%n.editor; | %n.respStmt;)*)*, 
                               %n.imprint;,
                               (%n.imprint; | %n.extent; 
                                 | %n.biblScope;)* )            >
<!ELEMENT %n.respStmt;  - O  ((%n.resp; & %n.name;), 
                              (%n.resp; | %n.name;)*)           >
<!ELEMENT %n.series;    - O  (%n.title; | %n.editor; |
                             %n.respStmt; | %n.biblScope;)*     >
<!ELEMENT %n.sp;        - O  ((%n.speaker)?, (%n.p; | %n.l; |
                             %n.lg; | %n.seg; | %n.stage;)+)    >
]]></eg>
</p>
<p>The new definitions are these; note that <gi>cit</gi> and
<gi>respStmt</gi> have already been declared above.
<scrap id='newco' name='New definitions for core tag set'>
<<!>!ENTITY % XML.address "INCLUDE" >
<<!>![%XML.address;[
<<!>!ELEMENT %n.address;   - O  ((%m.Incl;)*,
                             ( (%n.addrLine;, (%m.Incl;)*)+
                             | ((%m.addrPart;), (%m.Incl;)*)*)) >
<<!>!ATTLIST %n.address;        %a.global;
          TEIform            CDATA               'address'      >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.analytic "INCLUDE" >
<<!>![%XML.analytic;[
<<!>!ELEMENT %n.analytic;  - O  (%n.author; | %n.editor;
                             | %n.respStmt; | %n.title;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.analytic;       %a.global;
          TEIform            CDATA               'analytic'     >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.bibl "INCLUDE" >
<<!>![%XML.bibl;[
<<!>!ELEMENT %n.bibl;      - O  (#PCDATA | %m.phrase; |
                             %m.biblPart; | %m.Incl;)*          >
<<!>!ATTLIST %n.bibl;           %a.global;
                             %a.declarable;
          TEIform            CDATA               'bibl'         >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.biblFull "INCLUDE" >
<<!>![%XML.biblFull;[
<<!>!ELEMENT %n.biblFull;  - O  ((%m.Incl;)*,
                             (%n.titleStmt;, (%m.Incl;)*),
                             (%n.editionStmt;, (%m.Incl;)*)?,
                             (%n.extent;, (%m.Incl;)*)?,
                             (%n.publicationStmt;, (%m.Incl;)*),
                             (%n.seriesStmt;, (%m.Incl;)*)?,
                             (%n.notesStmt;, (%m.Incl;)*)?,
                             (%n.sourceDesc;, (%m.Incl;)*)*
                             )                  >
<<!>!ATTLIST %n.biblFull;       %a.global;
                             %a.declarable;
          TEIform            CDATA               'biblFull'     >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.biblStruct "INCLUDE" >
<<!>![%XML.biblStruct;[
<<!>!ELEMENT %n.biblStruct;
                        - O  ((%m.Incl;)*,
                             (%n.analytic;, (%m.Incl;)*)?,
                             ( (%n.monogr;, (%m.Incl;)*),
                               (%n.series;, (%m.Incl;)*)* )+,
                             ( (%n.note; | %n.idno;),
                               (%m.Incl;)*)*) >

<<!>!ATTLIST %n.biblStruct;     %a.global;
                             %a.declarable;
          TEIform            CDATA               'biblStruct'   >
]<!>]>

<<!>!-- cit has already been declared.                           -->
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.imprint "INCLUDE" >
<<!>![%XML.imprint;[
<<!>!ELEMENT %n.imprint;   - O  (%n.pubPlace; | %n.publisher;
                             | %n.date; | %n.biblScope;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.imprint;        %a.global;
          TEIform            CDATA               'imprint'      >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.lg "INCLUDE" >
<<!>![%XML.lg;[
<<!>!ELEMENT %n.lg;        - O  ((%m.divtop; | %m.Incl;)*,
                             (%n.l; | %n.lg;),
                             (%n.l; | %n.lg; | %m.Incl;)*,
                             ((%m.divbot;), (%m.Incl;)*)*)         >
<<!>!ATTLIST %n.lg;             %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg'           >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.list "INCLUDE" >
<<!>![%XML.list;[
<<!>!ELEMENT %n.list;      - -  ((%m.Incl;)*,
                             (%n.head;, (%m.Incl;)*)?,
                             ( ((%n.item;, (%m.Incl;)*)*) |
                             ( (%n.headLabel;, (%m.Incl;)*)?,
                               (%n.headItem;, (%m.Incl;)*)?,
                               (%n.label;, (%m.Incl;)*,
                                %n.item;, (%m.Incl;)*)+)))         >
<<!>!ATTLIST %n.list;           %a.global;
          type               CDATA               simple
          TEIform            CDATA               'list'         >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.listBibl "INCLUDE" >
<<!>![%XML.listBibl;[
<<!>!ELEMENT %n.listBibl;  - -  ((%m.Incl;)*,
                             (%n.head;, (%m.Incl;)*)?,
                             (%n.bibl; | %n.biblStruct; 
                             | %n.biblFull;),
                             (%n.bibl; | %n.biblStruct;
                             | %n.biblFull; | %m.Incl;)*,
                             (%n.trailer;, (%m.Incl;)*)?)          >
<<!>!ATTLIST %n.listBibl;       %a.global;
                             %a.declarable;
          TEIform            CDATA               'listBibl'     >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.monogr "INCLUDE" >
<<!>![%XML.monogr;[
<<!>!ELEMENT %n.monogr;    - O  (
                             ((%m.Incl;)*,
                               (( 
                                 (%n.author; | %n.editor; | %n.respStmt;),
                                 (%n.author; | %n.editor;
                                   | %n.respStmt; | %m.Incl;)*,
                                 (%n.title;, (%m.Incl;)*)+,
                                 ((%n.editor; | %n.respStmt;), (%m.Incl;)*)*
                               )
                               |
                               ( 
                                 (%n.title;, (%m.Incl;)*)+,
                                 (
                                   (%n.author; | %n.editor; | %n.respStmt;),
                                   (%m.Incl;)*
                                 )*
                               ))
                             )?,
                             ((%n.note; | %n.meeting;), (%m.Incl;)*)*,
                             (%n.edition;, 
                              (%n.editor; | %n.respStmt; | %m.Incl;)*)*,
                             %n.imprint;, 
                             (%n.imprint; | %n.extent; |
                              %n.biblScope; | %m.Incl;)*
                             )                  >
<<!>!ATTLIST %n.monogr;         %a.global;
          TEIform            CDATA               'monogr'       >
]<!>]>

<<!>!-- respStmt has already been declared                       -->
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.series "INCLUDE" >
<<!>![%XML.series;[
<<!>!ELEMENT %n.series;    - O  (%n.title; | %n.editor; |
                             %n.respStmt; | %n.biblScope;
                             | %m.Incl;)*                       >
<<!>!ATTLIST %n.series;         %a.global;
          TEIform            CDATA               'series'       >
]<!>]>
</scrap><scrap prev='newco'>
<<!>!ENTITY % XML.sp "INCLUDE" >
<<!>![%XML.sp;[
<<!>!ELEMENT %n.sp;        - O  ((%m.Incl;)*,
                             (%n.speaker;, (%m.Incl;)*)?,
                             ((%n.p; | %n.l; | %n.lg; | %n.seg; | %n.ab;
                             | %n.stage;), (%m.Incl;)*)+)       >
<<!>!ATTLIST %n.sp;             %a.global;
          who                IDREFS              #IMPLIED
          TEIform            CDATA               'sp'           >
]<!>]>
</scrap>
</p>
</div3>

<!--* 2 p.m. 23 February 1999 *-->
<div3><head>Basic text-structure tag set</head>

<p>
<scrap id='xst' name='Suppress definitions in text-structure tag set'>
<<!>!ENTITY % argument 'IGNORE' >
<<!>!ENTITY % back     'IGNORE' >
<<!>!ENTITY % body     'IGNORE' >
<<!>!ENTITY % byline   'IGNORE' >
<<!>!ENTITY % closer   'IGNORE' >
<<!>!ENTITY % dateline 'IGNORE' >
<<!>!ENTITY % div      'IGNORE' >
<<!>!ENTITY % div0     'IGNORE' >
<<!>!ENTITY % div1     'IGNORE' >
<<!>!ENTITY % div2     'IGNORE' >
<<!>!ENTITY % div3     'IGNORE' >
<<!>!ENTITY % div4     'IGNORE' >
<<!>!ENTITY % div5     'IGNORE' >
<<!>!ENTITY % div6     'IGNORE' >
<<!>!ENTITY % div7     'IGNORE' >
<<!>!ENTITY % group    'IGNORE' >
<<!>!ENTITY % opener   'IGNORE' >
<<!>!ENTITY % text     'IGNORE' >
</scrap>
</p>
<p>The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.argument;  - -  ((%n.head)?, %component.seq;)      >
<!ELEMENT %n.back;      - O  ( (%m.front)*, ( ( (%m.divtop),
                             (%m.divtop | %n.titlePage;)*) | (
                             (%n.div;), (%n.div; |
                             (%m.front))*) | ( (%n.div1;),
                             (%n.div1; | (%m.front))*) )? )     >
<!ELEMENT %n.body;      - O  ((%m.divtop;)*, ( ( (%n.divGen)*,
                             ( (%n.div;, (%n.div; |
                             %n.divGen;)*) | (%n.div0;,
                             (%n.div0; | %n.divGen;)*) |
                             (%n.div1;, (%n.div1; |
                             %n.divGen;)*) ) ) | (
                             (%component)+, ((%n.divGen)*, (
                             (%n.div;, (%n.div; | %n.divGen;)*)
                             | (%n.div0;, (%n.div0; |
                             %n.divGen;)*) | (%n.div1;,
                             (%n.div1; | %n.divGen;)*) )? ))),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.byline;    - O  (%phrase.seq; | %n.docAuthor;)*    >
<!ELEMENT %n.closer;    - O  (%n.signed; | %n.dateline; |
                             %n.salute; | %phrase.seq;)*        >
<!ELEMENT %n.dateline;  - O  (%n.date; | %n.time; | %n.name; |
                             #PCDATA | %n.address;)*            >
<!ELEMENT %n.div;       - O  ((%m.divtop;)*, ((%n.div; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div0;      - O  ((%m.divtop;)*, ( (%n.div1; |
                             %n.divGen;)+ | ( (%component;)+,
                             (%n.div1; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div1;      - O  ((%m.divtop;)*, ( (%n.div2; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div2; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div2;      - O  ((%m.divtop;)*, ( (%n.div3; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div3; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div3;      - O  ((%m.divtop;)*, ( (%n.div4; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div4; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div4;      - O  ((%m.divtop;)*, ( (%n.div5; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div5; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div5;      - O  ((%m.divtop;)*, ( (%n.div6; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div6; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div6;      - O  ((%m.divtop;)*, ((%n.div7; |
                             %n.divGen;)+ | ((%component;)+,
                             (%n.div7; | %n.divGen;)*)),
                             (%m.divbot;)*)                     >
<!ELEMENT %n.div7;      - O  ((%m.divtop;)*, (%component;)+,
                             (%m.divbot;)*)                     >
<!ELEMENT %n.group;     - O  ((%m.divtop;)*, (%n.text; |
                             %n.group;)+, (%m.divbot;)*)        >
<!ELEMENT %n.opener;    - O  (%n.signed; | %n.dateline; |
                             %n.salute; | %phrase.seq;)*        >
<!ELEMENT %n.text;      - -  ((%n.front)?, (%n.body; |
                             %n.group;), (%n.back)?)
                                                +(%m.globincl;) >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newst' name='New definitions for text-structure tag set'>
<<!>!ENTITY % XML.argument "INCLUDE" >
<<!>![%XML.argument;[
<<!>!ELEMENT %n.argument;  - -  ((%m.Incl;)*, (%n.head;,
                             %component.seq;)?)                 >
<<!>!ATTLIST %n.argument;       %a.global;
          TEIform            CDATA               'argument'     >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.back "INCLUDE" >
<<!>![%XML.back;[
<<!>!ELEMENT %n.back;      - O
                             ( (%m.front; | %m.Incl;)*,
                               ( ( (%m.divtop;),
                                   (%m.divtop; | %n.titlePage;
                                   | %m.Incl;)*)
                                 |
                                 ( (%n.div;),
                                   (%n.div; | %m.front; | %m.Incl;)*)
                                 |
                                 ( (%n.div1;),
                                   (%n.div1; | %m.front; | %m.Incl;)*)
                               )?
                             )                                  >
<<!>!ATTLIST %n.back;           %a.global;
                             %a.declaring;
          TEIform            CDATA               'back'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.body "INCLUDE" >
<<!>![%XML.body;[
<<!>!ELEMENT %n.body;      - O  (
                               (%m.divtop; | %m.Incl;)*,
                               ( 
                                 (
                                   ((%component;), (%m.Incl;)*)+,
                                   ((%n.divGen;, (%m.Incl;)*)*,
                                     ( (%n.div;,
                                         (%n.div; | %n.divGen; | %m.Incl;)*)
                                       |
                                       (%n.div0;,
                                         (%n.div0; | %n.divGen; | %m.Incl;)*)
                                       |
                                       (%n.div1;,
                                         (%n.div1; | %n.divGen; | %m.Incl;)*)
                                     )?
                                   )
                                 )
                               |
                                 ( (%n.divGen;, (%m.Incl;)*)*,
                                   ( (%n.div;,
                                      (%n.div; | %n.divGen; | %m.Incl;)*)
                                     |
                                     (%n.div0;,
                                       (%n.div0; | %n.divGen; | %m.Incl;)*)
                                     |
                                     (%n.div1;,
                                       (%n.div1; | %n.divGen; | %m.Incl;)*)
                                   )
                                 )
                               ),
                               ((%m.divbot;), (%m.Incl;)*)*
                             )                                  >
<!--* 23 Feb 99, 2:30 p.m. *-->
<<!>!ATTLIST %n.body;           %a.global;
                             %a.declaring;
          TEIform            CDATA               'body'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!--* byline, closer, and dateline have already been done *-->

<<!>!ENTITY % XML.div "INCLUDE" >
<<!>![%XML.div;[
<<!>!ELEMENT %n.div;       - O  (
                               (%m.divtop; | %m.Incl;)*,
                               ( ((%n.div; | %n.divGen;), (%m.Incl;)*)+
                                 |
                                 ( (%component;, (%m.Incl;)*)+,
                                   ((%n.div; | %n.divGen;), (%m.Incl;)*)*)
                               ),
                               ((%m.divbot;), (%m.Incl;)*)*)    >
<<!>!ATTLIST %n.div;            %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div'          >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div0 "INCLUDE" >
<<!>![%XML.div0;[
<<!>!ELEMENT %n.div0;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div1; |
                             %n.divGen;), (%m.Incl;)*)+ | ( (%component;, (%m.Incl;)*)+,
                             ((%n.div1; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div0;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div0'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div1 "INCLUDE" >
<<!>![%XML.div1;[
<<!>!ELEMENT %n.div1;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div2; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div2; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div1;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div1'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div2 "INCLUDE" >
<<!>![%XML.div2;[
<<!>!ELEMENT %n.div2;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div3; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div3; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div2;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div2'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div3 "INCLUDE" >
<<!>![%XML.div3;[
<<!>!ELEMENT %n.div3;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div4; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div4; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div3;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div3'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div4 "INCLUDE" >
<<!>![%XML.div4;[
<<!>!ELEMENT %n.div4;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div5; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div5; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div4;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div4'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div5 "INCLUDE" >
<<!>![%XML.div5;[
<<!>!ELEMENT %n.div5;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div6; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div6; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div5;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div5'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div6 "INCLUDE" >
<<!>![%XML.div6;[
<<!>!ELEMENT %n.div6;      - O  ((%m.divtop; | %m.Incl;)*, ( ((%n.div7; |
                             %n.divGen;), (%m.Incl;)*)+ | ((%component;, (%m.Incl;)*)+,
                             ((%n.div7; | %n.divGen;), (%m.Incl;)*)*)),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div6;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div6'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.div7 "INCLUDE" >
<<!>![%XML.div7;[
<<!>!ELEMENT %n.div7;      - O  ((%m.divtop; | %m.Incl;)*, (%component;, (%m.Incl;)*)+,
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.div7;           %a.global;
                             %a.declaring;
                             %a.divn;
          TEIform            CDATA               'div7'         >
]<!>]>
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.group "INCLUDE" >
<<!>![%XML.group;[
<<!>!ELEMENT %n.group;     - O  ((%m.divtop; | %m.Incl;)*,
                             ((%n.text; | %n.group;),
                              (%n.text; | %n.group; | %m.Incl;)*),
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.group;          %a.global;
                             %a.declaring;
          TEIform            CDATA               'group'        >
]<!>]>

<<!>!--* opener has already been done *-->
</scrap><scrap prev='newst'>
<<!>!ENTITY % XML.text "INCLUDE" >
<<!>![%XML.text;[
<<!>!ELEMENT %n.text;      - -  ((%m.Incl;)*,
                             (%n.front;, (%m.Incl;)*)?,
                             (%n.body; | %n.group;),
                             (%m.Incl;)*,
                             (%n.back;, (%m.Incl;)*)?)
                                                                >
<<!>!ATTLIST %n.text;           %a.global;
                             %a.declaring;
          TEIform            CDATA               'text'         >
]<!>]>
</scrap>
</p>
</div3>

<div3><head>Front-matter tag set</head>

<p>
<scrap id='xfr' name='Suppress definitions in front-matter tag set'>
<<!>!--* docimprint has already been suppressed and redefined *-->
<<!>!ENTITY % docTitle        'IGNORE' >
<<!>!ENTITY % front           'IGNORE' >
<<!>!ENTITY % titlePage       'IGNORE' >
</scrap>
</p>

<p>The existing declarations are these:
<eg><![CDATA[
<!ELEMENT %n.front;     - O  ( (%m.front;)*, ( ( (%m.divtop;),
                             (%m.divtop; | %n.titlePage;)*) | (
                             (%n.div;), (%n.div; | (%m.front;)
                             )*) | ( (%n.div1;), (%n.div1; |
                             (%m.front;) )*) )? )               >
<!ELEMENT %n.titlePage; - O  (%m.tpParts;)+                     >
<!ELEMENT %n.docTitle;  - O  ((%n.titlePart)+)                  >
]]></eg>
</p>
<p>The new definitions are these.  The definition for <gi>front</gi>
has been changed to use <ident>fmchunk</ident> instead of 
<ident>divtop</ident>.
<scrap id='newfr' name='New definitions for front-matter tag set'>
<<!>!ENTITY % XML.front "INCLUDE" >
<<!>![%XML.front;[
<<!>!ELEMENT %n.front;     - O
                             ( (%m.front; | %m.Incl;)*,
                               ( ( (%m.fmchunk;),
                                   (%m.fmchunk; | %n.titlePage; | %m.Incl;)*)
                                 | ( (%n.div;),
                                     (%n.div; | %m.front; | %m.Incl;)*)
                                 | ( (%n.div1;),
                                     (%n.div1; | %m.front; | %m.Incl;)*)
                               )?
                             )                                  >
<<!>!ATTLIST %n.front;          %a.global;
                             %a.declaring;
          TEIform            CDATA               'front'        >
]<!>]>
</scrap><scrap prev='newfr'>
<<!>!ENTITY % XML.titlePage "INCLUDE" >
<<!>![%XML.titlePage;[
<<!>!ELEMENT %n.titlePage; - O  ((%m.Incl;)*,
                             (%m.tpParts;),
                             (%m.tpParts; | %m.Incl;)*)         >
<<!>!ATTLIST %n.titlePage;      %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'titlePage'    >
]<!>]>
</scrap><scrap prev='newfr'>
<<!>!ENTITY % XML.docTitle "INCLUDE" >
<<!>![%XML.docTitle;[
<<!>!ELEMENT %n.docTitle;  - O  ((%m.Incl;)*, 
                                (%n.titlePart;, (%m.Incl;)*)+)  >
<<!>!ATTLIST %n.docTitle;       %a.global;
          TEIform            CDATA               'docTitle'     >
]<!>]>
</scrap>
</div3>

<div3><head>Header tag set</head>

<p>

<scrap id='xhd' name='Suppress definitions in header tag set'>
<<!>!ENTITY % availability     'IGNORE' >
<<!>!ENTITY % broadcast        'IGNORE' >
<<!>!ENTITY % editionStmt      'IGNORE' >
<<!>!ENTITY % equipment        'IGNORE' >
<<!>!ENTITY % notesStmt        'IGNORE' >
<<!>!--     % publicationStmt  is already replaced -->
<<!>!ENTITY % recording        'IGNORE' >
<<!>!ENTITY % recordingStmt    'IGNORE' >
<<!>!ENTITY % scriptStmt       'IGNORE' >
<<!>!ENTITY % seriesStmt       'IGNORE' >
<<!>!ENTITY % sourceDesc       'IGNORE' >
<<!>!ENTITY % titleStmt        'IGNORE' >
</scrap>
</p>

<p>
The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.availability;
                        - O  ((%n.p;)+)                         >
<!ELEMENT %n.broadcast; - -  ((%n.p)+ | %n.bibl; |
                             %n.biblStruct; | %n.biblFull; |
                             %n.recording;)                     >
<!ELEMENT %n.editionStmt;
                        - O  ( (%n.edition;, (%n.respStmt)*) |
                             (%n.p;)+ )                         >
<!ELEMENT %n.equipment; - O  ((%n.p;)+)                         >

<!ELEMENT %n.notesStmt; - O  ((%n.note)+)                       >
<!ELEMENT %n.recording; - -  ((%n.p)+ | (%n.respStmt; |
                             %n.equipment; | %n.broadcast; |
                             %n.date;)*)                        >
<!ELEMENT %n.recordingStmt;
                        - -  ((%n.p)+ | (%n.recording)+ )       >
<!ELEMENT %n.scriptStmt;
                        - -  ((%n.p)+ | %n.bibl; | %n.biblFull;
                             | %n.biblStruct;)                  >
<!ELEMENT %n.seriesStmt;
                        - O  ( (%n.title;, (%n.idno; |
                             %n.respStmt;)*) | (%n.p)+ )        >
<!ELEMENT %n.sourceDesc;
                        - -  (%n.p; | %n.bibl; | %n.biblFull; |
                             %n.biblStruct; | %n.listBibl; |
                             %n.scriptStmt; |
                             %n.recordingStmt;)+                >
<!ELEMENT %n.titleStmt; - O  (((%n.title)+, (%n.author; |
                             %n.editor; | %n.sponsor; |
                             %n.funder; | %n.principal; |
                             %n.respStmt;)*))                   >
]]></eg>
</p>
<p>The new definitions are as follows.  We've changed the language
for some element types, in parallel with changes to TEI P3:
<list>
<item><gi>availability</gi> can be empty</item>
</list>
<scrap id='newhd' name='New definitions for header tag set'>
<<!>!ENTITY % XML.availability "INCLUDE" >
<<!>![%XML.availability;[
<<!>!ELEMENT %n.availability;
                        - O  (%n.p; | %m.Incl;)*                >
<<!>!ATTLIST %n.availability;   %a.global;
          status             (free | unknown | restricted)
                                                 #IMPLIED
          TEIform            CDATA               'availability' >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.broadcast "INCLUDE" >
<<!>![%XML.broadcast;[
<<!>!ELEMENT %n.broadcast; - -  ((%m.Incl;)*, ((%n.p;, (%m.Incl;)*)+ 
                             | ((%n.bibl; |
                             %n.biblStruct; | %n.biblFull; |
                             %n.recording;), (%m.Incl;)*)))     >
<<!>!ATTLIST %n.broadcast;      %a.global;
                             %a.declarable;
          TEIform            CDATA               'broadcast'    >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.editionStmt "INCLUDE" >
<<!>![%XML.editionStmt;[
<<!>!ELEMENT %n.editionStmt;
                        - O  ((%m.Incl;)*, ((%n.edition;, 
                                (%n.respStmt; | %m.Incl;)*) 
                                | (%n.p;, (%m.Incl;)*)+) 
                             )                          >
<<!>!ATTLIST %n.editionStmt;    %a.global;
          TEIform            CDATA               'editionStmt'  >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.equipment "INCLUDE" >
<<!>![%XML.equipment;[
<<!>!ELEMENT %n.equipment; - O  ((%m.Incl;)*, 
                                 (%n.p;, (%m.Incl;)*)+)         >
<<!>!ATTLIST %n.equipment;      %a.global;
                             %a.declarable;
          TEIform            CDATA               'equipment'    >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.notesStmt "INCLUDE" >
<<!>![%XML.notesStmt;[
<<!>!ELEMENT %n.notesStmt; - O  ((%m.Incl;)*, 
                                (%n.note;, (%m.Incl;)*)+)       >
<<!>!ATTLIST %n.notesStmt;      %a.global;
          TEIform            CDATA               'notesStmt'    >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.recording "INCLUDE" >
<<!>![%XML.recording;[
<<!>!ELEMENT %n.recording; - -  (((%m.Incl;)*, 
                             (%n.p;, (%m.Incl;)*)+)
                             | ((%n.respStmt; |
                             %n.equipment; | %n.broadcast; |
                             %n.date;), (%m.Incl;)*)*)          >
<<!>!ATTLIST %n.recording;      %a.global;
                             %a.declarable;
          type               (audio | video)     audio
          dur                CDATA               #IMPLIED
          TEIform            CDATA               'recording'    >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.recordingStmt "INCLUDE" >
<<!>![%XML.recordingStmt;[
<<!>!ELEMENT %n.recordingStmt;
                        - -  ((%m.Incl;)*, ((%n.p;, (%m.Incl;)*)+ 
                              | (%n.recording;, (%m.Incl;)*)+ ))>
<<!>!ATTLIST %n.recordingStmt;  %a.global;
          TEIform            CDATA               'recordingStmt'>
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.scriptStmt "INCLUDE" >
<<!>![%XML.scriptStmt;[
<<!>!ELEMENT %n.scriptStmt;
                        - -  ((%m.Incl;)*, ((%n.p;, (%m.Incl;)*)+ 
                             | ((%n.bibl; |
                             %n.biblStruct; | %n.biblFull;), 
                             (%m.Incl;)*)))                     >
<<!>!ATTLIST %n.scriptStmt;     %a.global;
                             %a.declarable;
          TEIform            CDATA               'scriptStmt'   >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.seriesStmt "INCLUDE" >
<<!>![%XML.seriesStmt;[
<<!>!ELEMENT %n.seriesStmt;
                        - O  ((%m.Incl;)*,  
                              ((%n.title;, 
                                 (%n.idno; | %n.respStmt; | %m.Incl;)*
                               )
                               | 
                               (%n.p;, (%m.Incl;)*)+) 
                             )        >
<<!>!ATTLIST %n.seriesStmt;     %a.global;
          TEIform            CDATA               'seriesStmt'   >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.sourceDesc "INCLUDE" >
<<!>![%XML.sourceDesc;[
<<!>!ELEMENT %n.sourceDesc;
                        - -  ((%m.Incl;)*, ((%n.p; | %n.bibl; 
                             | %n.biblFull; |
                             %n.biblStruct; | %n.listBibl; |
                             %n.scriptStmt; |
                             %n.recordingStmt;), (%m.Incl;)*)+)                >
<<!>!ATTLIST %n.sourceDesc;     %a.global;
                             %a.declarable;
          TEIform            CDATA               'sourceDesc'   >
]<!>]>
</scrap><scrap prev='newhd'>
<<!>!ENTITY % XML.titleStmt "INCLUDE" >
<<!>![%XML.titleStmt;[
<<!>!ELEMENT %n.titleStmt; - O  ( (%m.Incl;)*,
                                  (%n.title;, (%m.Incl;)*)+, 
                                  ( (%n.author; 
                                    | %n.editor; 
                                    | %n.sponsor; 
                                    | %n.funder; 
                                    | %n.principal; 
                                    | %n.respStmt;), 
                                    (%m.Incl;)*)*
                                )                               >
<<!>!ATTLIST %n.titleStmt;      %a.global;
          TEIform            CDATA               'titleStmt'    >
]<!>]>
</scrap>
</p>

</div3>

<div3><head>Verse tag set</head>

<p>

<scrap id='xve' name='Suppress definitions in verse tag set'>
<<!>!ENTITY % lg1              'IGNORE' >
<<!>!ENTITY % lg2              'IGNORE' >
<<!>!ENTITY % lg3              'IGNORE' >
<<!>!ENTITY % lg4              'IGNORE' >
<<!>!ENTITY % lg5              'IGNORE' >
</scrap>
</p>

<p>
The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.lg1;       - O  ((%n.head)?, (%n.l; | %n.lg2;)+)   >
<!ELEMENT %n.lg2;       - O  ((%n.head)?, (%n.l; | %n.lg3;)+)   >
<!ELEMENT %n.lg3;       - O  ((%n.head)?, (%n.l; | %n.lg4;)+)   >
<!ELEMENT %n.lg4;       - O  ((%n.head)?, (%n.l; | %n.lg5;)+)   >
<!ELEMENT %n.lg5;       - O  ((%n.head)?, (%n.l)+)              >
]]></eg>
</p>
<p>The new definitions are as follows:

<scrap id='newve' name='New definitions for verse tag set'>
<<!>![%TEI.verse;[
<<!>!ENTITY % XML.lg1 "INCLUDE" >
<<!>![%XML.lg1;[
<<!>!ELEMENT %n.lg1;       - O  ((%m.Incl;)*, 
                                (%n.head;, (%m.Incl;)*)?, 
                                ((%n.l; | %n.lg2;), 
                                (%m.Incl;)*)+)                  >
<<!>!ATTLIST %n.lg1;            %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg1'          >
]<!>]>
</scrap><scrap prev='newve'>
<<!>!ENTITY % XML.lg2 "INCLUDE" >
<<!>![%XML.lg2;[
<<!>!ELEMENT %n.lg2;       - O  ((%m.Incl;)*, 
                             (%n.head;, (%m.Incl;)*)?, 
                             ((%n.l; | %n.lg3;), (%m.Incl;)*)+) >
<<!>!ATTLIST %n.lg2;            %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg2'          >
]<!>]>
</scrap><scrap prev='newve'>
<<!>!ENTITY % XML.lg3 "INCLUDE" >
<<!>![%XML.lg3;[
<<!>!ELEMENT %n.lg3;       - O  ((%m.Incl;)*, 
                             (%n.head;, (%m.Incl;)*)?, 
                             ((%n.l; | %n.lg4;), (%m.Incl;)*)+) >
<<!>!ATTLIST %n.lg3;            %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg3'          >
]<!>]>
</scrap><scrap prev='newve'>
<<!>!ENTITY % XML.lg4 "INCLUDE" >
<<!>![%XML.lg4;[
<<!>!ELEMENT %n.lg4;       - O  ((%m.Incl;)*, 
                             (%n.head;, (%m.Incl;)*)?, 
                             ((%n.l; | %n.lg5;), (%m.Incl;)*)+) >
<<!>!ATTLIST %n.lg4;            %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg4'          >
]<!>]>
</scrap><scrap prev='newve'>
<<!>!ENTITY % XML.lg5 "INCLUDE" >
<<!>![%XML.lg5;[
<<!>!ELEMENT %n.lg5;       - O  ((%m.Incl;)*, 
                             (%n.head;, (%m.Incl;)*)?,
                             (%n.l;, (%m.Incl;)*)+)             >
<<!>!ATTLIST %n.lg5;            %a.global;
                             %a.divn;
                             %a.metrical;
          TEIform            CDATA               'lg5'          >
]<!>]>
]<!>]>
</scrap>
</p>

</div3>


<div3><head>Drama tag set</head>

<p>
<scrap id='xdr' name='Suppress definitions in drama tag set'>
<<!>!ENTITY % castGroup        'IGNORE' >
<<!>!--       castitem has been done already -->
<<!>!ENTITY % castList         'IGNORE' >
<<!>!ENTITY % epilogue         'IGNORE' >
<<!>!ENTITY % performance      'IGNORE' >
<<!>!ENTITY % prologue         'IGNORE' >
<<!>!ENTITY % set              'IGNORE' >
</scrap>
</p>
<p>
The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.castGroup; - -  (
                                (%n.head;)?, 
                                (%n.castItem; | %n.castGroup;)+, 
                                (%n.trailer;)?)    >
<!ELEMENT %n.castItem;  - O  (%n.role; | %n.roleDesc; |
                             %n.actor; | (%phrase.seq))*        >
<!ELEMENT %n.castList;  - -  (  (%m.divtop;)*, 
                                (%component;)*,
                                (%n.castItem; | %n.castGroup;)+,
                                (%component;)*)                 >
<!ELEMENT %n.epilogue;  - -  ((%m.divtop)*, (%component)+,
                             (%m.divbot)*)                      >
<!ELEMENT %n.performance;
                        - -  ((%m.divtop)*, (%component)+,
                             (%m.divbot)*)                      >
<!ELEMENT %n.prologue;  - -  ((%m.divtop)*, (%component)+,
                             (%m.divbot)*)                      >
<!ELEMENT %n.set;       - -  ((%n.head)?, %specialPara)         >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newdr' name='New definitions for drama tag set'>
<<!>![%TEI.drama;[
<<!>!ENTITY % XML.castGroup "INCLUDE" >
<<!>![%XML.castGroup;[
<<!>!ELEMENT %n.castGroup; - -  ((%m.Incl;)*, (%n.head;, (%m.Incl;)*)?, 
                                ((%n.castItem; |
                                %n.castGroup;), (%m.Incl;)*)+, 
                                (%n.trailer;, (%m.Incl;)*)?)    >
<<!>!ATTLIST %n.castGroup;      %a.global;
          TEIform            CDATA               'castGroup'    >
]<!>]>
<<!>!--* castItem has been done elsewhere *-->
</scrap><scrap prev='newdr'>
<<!>!ENTITY % XML.castList "INCLUDE" >
<<!>![%XML.castList;[
<<!>!ELEMENT %n.castList;  - -  (
                                (%m.divtop; | %m.Incl;)*, 
                                ((%component;), (%m.Incl;)*)*,
                                ((%n.castItem; | %n.castGroup;), 
                                (%m.Incl;)*)+,
                                ((%component;), (%m.Incl;)*)*)  >
<<!>!ATTLIST %n.castList;       %a.global;
          TEIform            CDATA               'castList'     >
]<!>]>
</scrap><scrap prev='newdr'>
<<!>!ENTITY % XML.epilogue "INCLUDE" >
<<!>![%XML.epilogue;[
<<!>!ELEMENT %n.epilogue;  - -  ((%m.divtop; | %m.Incl;)*, 
                             ((%component;), (%m.Incl;)*)+,
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.epilogue;       %a.global;
          TEIform            CDATA               'epilogue'     >
]<!>]>
</scrap><scrap prev='newdr'>
<<!>!ENTITY % XML.performance "INCLUDE" >
<<!>![%XML.performance;[
<<!>!ELEMENT %n.performance;
                        - -  ((%m.divtop; | %m.Incl;)*, 
                             ((%component;), (%m.Incl;)*)+,
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.performance;    %a.global;
          TEIform            CDATA               'performance'  >
]<!>]>
</scrap><scrap prev='newdr'>
<<!>!ENTITY % XML.prologue "INCLUDE" >
<<!>![%XML.prologue;[
<<!>!ELEMENT %n.prologue;  - -  ((%m.divtop; | %m.Incl;)*, 
                             ((%component;), (%m.Incl;)*)+,
                             ((%m.divbot;), (%m.Incl;)*)*)      >
<<!>!ATTLIST %n.prologue;       %a.global;
          TEIform            CDATA               'prologue'     >
]<!>]>

<<!>!-- set is already done -->
]<!>]>
</scrap>
</p>
</div3>

<div3><head>Spoken-text tag set</head>

<p>
<scrap id='xts' name='Suppress definitions in spoken-text tag set'>
<<!>!ENTITY % u                'IGNORE' >
</scrap>
</p>

<p>
The current definition is this:
<eg><![ CDATA [
<!ELEMENT %n.u;         - -  ((%phrase | %m.comp.spoken)+)      >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newts' name='New definitions for spoken-text tag set'>
<<!>![%TEI.spoken;[
<<!>!ENTITY % XML.u "INCLUDE" >
<<!>![%XML.u;[
<<!>!ELEMENT %n.u;         - -  (#PCDATA | %m.phrase; | %m.comp.spoken;
                                | %m.Incl;)*      >
<<!>!ATTLIST %n.u;              %a.global;
                             %a.timed;
                             %a.declaring;
          trans              (smooth | latching | overlap |
                             pause)              smooth
          who                IDREF               %INHERITED;
          TEIform            CDATA               'u'            >
]<!>]>
]<!>]>
</scrap>
</p>

</div3>

<div3><head>Dictionary tag set</head>

<p>We handle the dictionary tag set below, not here.  (The list
above does contain <gi>oVar</gi> and <gi>pVar</gi>, but that must be a
mistake.)
</p>
</div3>

<div3><head>Terminology tag set</head>

<p>
<scrap id='xte' name='Suppress definitions in terminology tag set'>
<<!>!ENTITY % ofig             'IGNORE' >
<<!>!ENTITY % termEntry        'IGNORE' >
<<!>!ENTITY % tig              'IGNORE' >
</scrap>
</p>
<p>
The current definitions in the nested tag set are these:
<eg><![ CDATA [
<!ELEMENT %n.ofig;      - O  ((%m.terminologyMisc)*,
                             (%n.otherForm;, (%n.gram)*),
                             (%m.terminologyMisc)*)             >
<!ELEMENT %n.termEntry; - O  ((%m.terminologyMisc)*, (%n.tig)+)

                                                 +(%m.terminologyInclusions)
                                                                >
<!ELEMENT %n.tig;       - O  ((%m.terminologyMisc)*, (%n.term;,
                             (%n.gram)*),
                             (%m.terminologyMisc)*, (%n.ofig)*)
                                                                >
]]></eg>
</p>
<p>
Note that <gi>termEntry</gi> has inclusions of its own.  These do not
require special treatment in our propagation of inclusions, since the
set of legal descendants of <gi>termEntry</gi> is the same as the set
of legal descendants of <gi>text</gi>.  The set of terminology
inclusions, however, does need to be revised for future versions
of the DTD, since it's not disjoint from elements named in content
models.  It includes elements normally included in any phrase-level 
content model; we don't want to include them in <ident>m.Incl</ident>,
since that would cause ambiguity.  So all terminological content
models should be rewritten for TEI P4, or even P3.5.
</p>
<p>The new definitions are as follows:
<scrap id='newte' name='New definitions for terminology tag set'>
<<!>![%TEI.terminology;[
<<!>!ENTITY % XML.ofig "INCLUDE" >
<<!>![%XML.ofig;[
<<!>!ELEMENT %n.ofig;      - O  ((%m.terminologyMisc; | %m.Incl;)*,
                             (%n.otherForm;, (%n.gram; | %m.Incl;)*),
                             ((%m.terminologyMisc;), (%m.Incl;)*)*)             >
<<!>!ATTLIST %n.ofig;           %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'ofig'         >
]<!>]>
</scrap><scrap prev='newte'>
<<!>!ENTITY % XML.termEntry "INCLUDE" >
<<!>![%XML.termEntry;[
<<!>!ELEMENT %n.termEntry; - O  ((%m.terminologyMisc; 
                                | %m.terminologyInclusions; | %m.Incl;)*, 
                                 (%n.tig;, 
                                (%m.Incl; | %m.terminologyInclusions;)*)+)
                                                                >
<<!>!ATTLIST %n.termEntry;      %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'termEntry'    >
]<!>]>
</scrap><scrap prev='newte'>
<<!>!ENTITY % XML.tig "INCLUDE" >
<<!>![%XML.tig;[
<<!>!ELEMENT %n.tig;       - O  ((%m.terminologyMisc;
                                | %m.terminologyInclusions; | %m.Incl;)*, 
                                (%n.term;,
                                 (%n.gram; | %m.terminologyInclusions; 
                                 | %m.Incl;)*),
                                ((%m.terminologyMisc;), 
                                 (%m.terminologyInclusions; | %m.Incl;)*)*, 
                                (%n.ofig;, 
                                 (%m.terminologyInclusions; | %m.Incl;)*)*)
                                                                >
<<!>!ATTLIST %n.tig;            %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'tig'          >
]<!>]>
]<!>]>
</scrap>
</p>
<p>In the flat version of the terminology tag set, there is no
<gi>ofig</gi> and no <gi>tig</gi> element.
The current definition of <gi>termEntry</gi> is this one:
<eg><![ CDATA [
<!ELEMENT %n.termEntry; - O  ( (%m.terminologyMisc |
                             %n.otherForm; | %n.gram; |
                             %m.terminologyInclusions)*,
                             (%n.term;, (%m.terminologyMisc |
                             %n.otherForm; | %n.gram; |
                             %m.terminologyInclusions)* )+ )    >
]]></eg>
</p>

<p>The new definition is as follows. Since we need both versions in
the extensions file, we invent a new parameter entity
(<ident>TEI.terminology.flat</ident>) to signal the difference
between the nested and flat terminology element sets.
<scrap id='newtef' name='New definitions for flat terminology tag set'>
<<!>![%TEI.terminology;[
<<!>!ENTITY % TEI.terminology.flat 'IGNORE'>
<<!>![%TEI.terminology.flat;[
<<!>!ENTITY % XML.termEntry "INCLUDE" >
<<!>![%XML.termEntry;[
<<!>!ELEMENT %n.termEntry; - O  ( (%m.terminologyMisc; |
                             %n.otherForm; | %n.gram; |
                             %m.terminologyInclusions; | %m.Incl;)*,
                             (%n.term;, 
                                (%m.terminologyMisc; |
                                %n.otherForm; | %n.gram; |
                                %m.terminologyInclusions; | %m.Incl;)* 
                             )+ 
                            )                                   >
<<!>!ATTLIST %n.termEntry;      %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'termEntry'    >
]<!>]>
]<!>]>
]<!>]>
</scrap>
</p>
</div3>

<div3><head>Segmentation and alignment tag set</head>

<p>
<scrap id='xsa'
       name='Suppress definitions in segmentation and alignment tag set'>
<<!>!ENTITY % altGrp           'IGNORE' >
<<!>!ENTITY % joinGrp          'IGNORE' >
<<!>!ENTITY % linkGrp          'IGNORE' >
<<!>!ENTITY % timeline         'IGNORE' >
</scrap>
</p>

<p>

The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.altGrp;    - -  ((%n.alt; | %n.ptr; | %n.xptr;)*)  >
<!ELEMENT %n.joinGrp;   - -  ((%n.join; | %n.ptr; | %n.xptr;)*)
                                                                >
<!ELEMENT %n.linkGrp;   - -  (%n.link; | %n.ptr; | %n.xptr;)+   >
<!ELEMENT %n.timeline;  - -  ((%n.when;)+)                      >
]]></eg>
</p>
<p>The new definitions are as follows.  We take the opportunity
to level the declarations by using stars, instead of plus signs,
on all of them.  This has the drawback of allowing a link group
to contain no links (only members of <ident>m.Incl</ident>), but
the advantage of dramatically simplifying the content model.
<scrap id='newsa'
       name='New definitions for segmentation and alignment tag set'>
<<!>![%TEI.linking;[
<<!>!ENTITY % XML.altGrp "INCLUDE" >
<<!>![%XML.altGrp;[
<<!>!ELEMENT %n.altGrp;    - -  ((%n.ptr; | %n.xptr; | %m.Incl;)*) >
<<!>!ATTLIST %n.altGrp;         %a.global;
                             %a.pointerGroup;
          mode               (excl | incl)       excl
          wScale             (perc | real)       perc
          TEIform            CDATA               'altGrp'       >
]<!>]>
</scrap><scrap prev='newsa'>
<<!>!ENTITY % XML.joinGrp "INCLUDE" >
<<!>![%XML.joinGrp;[
<<!>!ELEMENT %n.joinGrp;   - -  ((%n.ptr; | %n.xptr; | %m.Incl;)*)
                                                                >
<<!>!ATTLIST %n.joinGrp;        %a.global;
                             %a.pointerGroup;
          result             CDATA               #IMPLIED
          desc               CDATA               #IMPLIED
          TEIform            CDATA               'joinGrp'      >
]<!>]>
</scrap><scrap prev='newsa'>
<<!>!ENTITY % XML.linkGrp "INCLUDE" >
<<!>![%XML.linkGrp;[
<<!>!ELEMENT %n.linkGrp;   - -  (%n.ptr; | %n.xptr; | %m.Incl;)*   >
<<!>!ATTLIST %n.linkGrp;        %a.global;
                             %a.pointerGroup;
          TEIform            CDATA               'linkGrp'      >
]<!>]>
</scrap><scrap prev='newsa'>
<<!>!ENTITY % XML.timeline "INCLUDE" >
<<!>![%XML.timeline;[
<<!>!ELEMENT %n.timeline;  - -  ((%n.when;), (%m.Incl;)*)+         >
<<!>!ATTLIST %n.timeline;       %a.global;
          origin             IDREF               #REQUIRED
          unit               NMTOKEN             #IMPLIED
          interval           NUTOKEN             #IMPLIED
          TEIform            CDATA               'timeline'     >
]<!>]>
]<!>]>
</scrap>
</p>
<p>We have included <ident>m.Incl</ident> within these content models
in the interests of consistency:  this document is intended to provide
an XML-compatible DTD which accepts all valid TEI P3 documents, and
does not change the language unnecessarily.  In the long run, however,
it seems unlikely that we need to allow any <ident>m.Incl</ident>
elements within any of these content models.  Page breaks really and
truly do not occur within link groups.  Allowing timelines to nest
within timelines is daft.  And as we have seen, adding
<ident>m.Incl</ident> to the original content models introduces
ambiguity, since some members of that class were already named
in the models.  Removing the explicit mention avoids the ambigutity,
but renders the content model misleading.</p>
<p><emph>It is the editors' view that in P4, the <ident>m.Incl</ident>
class should not appear in these models; they should revert to the
form given in P3.</emph></p>

</div3>


<div3><head>Analysis and interpretation tag set</head>
<p>
<scrap id='xai' name='Suppress definitions in analysis tag set'>
<<!>!ENTITY % c               'IGNORE' >
<<!>!ENTITY % interpGrp       'IGNORE' >
<<!>!ENTITY % m               'IGNORE' >
<<!>!ENTITY % spanGrp         'IGNORE' >
<<!>!ENTITY % w               'IGNORE' >
</scrap>
</p>
<p>
The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.c;         - -  (#PCDATA)                          >
<!ELEMENT %n.interpGrp; - -  ((%n.interp;)*)                    >
<!ELEMENT %n.m;         - -  ((#PCDATA | %n.seg; | %n.c;)*)     >
<!ELEMENT %n.spanGrp;   - -  ((%n.span;)*)                      >
<!ELEMENT %n.w;         - -  ((#PCDATA | %n.seg; | %n.w; |
                             %n.m; | %n.c;)*)                   >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newai' name='New definitions for analysis tag set'>
<<!>![%TEI.analysis;[
<<!>!ENTITY % XML.c "INCLUDE" >
<<!>![%XML.c;[
<<!>!ELEMENT %n.c;         - -  (#PCDATA)                          >
<<!>!ATTLIST %n.c;              %a.global;
                             %a.seg;
          TEIform            CDATA               'c'            >
]<!>]>
</scrap>
Since <gi>interp</gi> is a member of class <ident>Incl</ident>,
we cannot name it directly in the content model, on pain of
ambiguity.  (Sigh.)
<scrap prev='newai'>
<<!>!ENTITY % XML.interpGrp "INCLUDE" >
<<!>![%XML.interpGrp;[
<<!>!--* We should really have: (%n.interp; | %m.Incl;)*         -->
<<!>!ELEMENT %n.interpGrp; - -  (%m.Incl;)*                        >
<<!>!ATTLIST %n.interpGrp;      %a.global;
                             %a.interpret;
          TEIform            CDATA               'interpGrp'    >
]<!>]>
</scrap><scrap prev='newai'>
<<!>!ENTITY % XML.m "INCLUDE" >
<<!>![%XML.m;[
<<!>!ELEMENT %n.m;         - -  (#PCDATA | %n.seg; | %n.c; | %m.Incl;)*  >
<<!>!ATTLIST %n.m;              %a.global;
                             %a.seg;
          baseform           CDATA               #IMPLIED
          TEIform            CDATA               'm'            >
]<!>]>
</scrap>
The <gi>spanGrp</gi> element, like <gi>interpGrp</gi>, becomes
close to meaningless now, if one doesn't understand that it is
supposed to contain spans, which are included in <ident>m.Incl</ident>.
<scrap prev='newai'>
<<!>!ENTITY % XML.spanGrp "INCLUDE" >
<<!>![%XML.spanGrp;[
<<!>!--* We should really have: (%n.span; | %m.Incl;)*           -->
<<!>!ELEMENT %n.spanGrp;   - -  (%m.Incl;)*                        >
<<!>!ATTLIST %n.spanGrp;        %a.global;
                             %a.interpret;
          TEIform            CDATA               'spanGrp'      >
]<!>]>
</scrap><scrap prev='newai'>
<<!>!ENTITY % XML.w "INCLUDE" >
<<!>![%XML.w;[
<<!>!ELEMENT %n.w;         - -  (#PCDATA | %n.seg; | %n.w; |
                             %n.m; | %n.c; | %m.Incl;)*         >
<<!>!ATTLIST %n.w;              %a.global;
                             %a.seg;
          lemma              CDATA               #IMPLIED
          TEIform            CDATA               'w'            >
]<!>]>

]<!>]>
</scrap>
</p>
</div3>

<div3><head>Feature structures tag set</head>

<p>The arguments given above against propagating global inclusions
to the segmentation and alignment element types apply with equal or greater
force to the feature-structures element types.  But we resist the
siren song of common sense and press on doggedly toward our goal of
an upward-compatible experimental XML DTD.

<scrap id='xfs' name='Suppress definitions in feature-structures tag set'>
<<!>!ENTITY % f               'IGNORE' >
<<!>!ENTITY % falt            'IGNORE' >
<<!>!ENTITY % flib            'IGNORE' >
<<!>!ENTITY % fs              'IGNORE' >
<<!>!ENTITY % fslib           'IGNORE' >
<<!>!ENTITY % fvlib           'IGNORE' >
<<!>!ENTITY % valt            'IGNORE' >
</scrap></p>
<p>

The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.f;         - O  (%n.null; | (%n.plus; | %n.minus;
                             | any | %n.none; | %n.dft; |
                             %n.uncertain; | %n.sym; | %n.nbr;
                             | %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt; | %n.alt; | %n.fs;)*)     >
<!ELEMENT %n.fAlt;      - -  ((%n.f; | %n.fs; | %n.fAlt;),
                             (%n.f; | %n.fs; | %n.fAlt;)+)      >
<!ELEMENT %n.fLib;      - -  ((%n.f; | %n.fAlt;)*)              >
<!ELEMENT %n.fs;        - -  ((%n.f; | %n.fAlt; | %n.alt;)*)    >
<!ELEMENT %n.fsLib;     - -  ((%n.fs; | %n.vAlt;)*)             >
<!ELEMENT %n.fvLib;     - -  ((%n.plus; | %n.minus; | any |
                             %n.none; | %n.dft; | %n.uncertain;
                             | %n.null; | %n.sym; | %n.nbr; |
                             %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt;)*)                        >
<!ELEMENT %n.vAlt;      - -  ((%n.plus; | %n.minus; | any |
                             %n.none; | %n.dft; | %n.uncertain;
                             | %n.null; | %n.sym; | %n.nbr; |
                             %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt; | %n.fs;), (%n.plus; |
                             %n.minus; | any | %n.none; |
                             %n.dft; | %n.uncertain; | %n.null;
                             | %n.sym; | %n.nbr; | %n.msr; |
                             %n.rate; | %n.str; | %n.vAlt; |
                             %n.fs;)+)                          >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newfs' name='New definitions for feature-structures tag set'>
<<!>![%TEI.fs;[
<<!>!ENTITY % XML.f "INCLUDE" >
<<!>![%XML.f;[
<<!>!ELEMENT %n.f;         - O  (%n.null; | (%n.plus; | %n.minus;
                             | any | %n.none; | %n.dft; |
                             %n.uncertain; | %n.sym; | %n.nbr;
                             | %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt; | %n.alt; | %n.fs;)*)     >
<<!>!ATTLIST %n.f;              %a.global;
          name               NMTOKEN             #REQUIRED
          org                (single | set | bag | list)
                                                 #IMPLIED
          rel                (eq | ne | sb | ns) eq
          fVal               IDREFS              #IMPLIED
          TEIform            CDATA               'f'            >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.fAlt "INCLUDE" >
<<!>![%XML.fAlt;[
<<!>!ELEMENT %n.fAlt;      - -  ((%n.f; | %n.fs; | %n.fAlt;),
                             (%n.f; | %n.fs; | %n.fAlt;)+)      >
<<!>!ATTLIST %n.fAlt;           %a.global;
          mutExcl            (Y | N)             #IMPLIED
          TEIform            CDATA               'fAlt'         >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.fLib "INCLUDE" >
<<!>![%XML.fLib;[
<<!>!ELEMENT %n.fLib;      - -  ((%n.f; | %n.fAlt;)*)              >
<<!>!ATTLIST %n.fLib;           %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'fLib'         >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.fs "INCLUDE" >
<<!>![%XML.fs;[
<<!>!ELEMENT %n.fs;        - -  ((%n.f; | %n.fAlt; | %n.alt;)*)    >
<<!>!ATTLIST %n.fs;             %a.global;
          type               CDATA               #IMPLIED
          feats              IDREFS              #IMPLIED
          rel                (eq | ne | sb | ns) sb
          TEIform            CDATA               'fs'           >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.fsLib "INCLUDE" >
<<!>![%XML.fsLib;[
<<!>!ELEMENT %n.fsLib;     - -  ((%n.fs; | %n.vAlt;)*)             >
<<!>!ATTLIST %n.fsLib;          %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'fsLib'        >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.fvLib "INCLUDE" >
<<!>![%XML.fvLib;[
<<!>!ELEMENT %n.fvLib;     - -  ((%n.plus; | %n.minus; | any |
                             %n.none; | %n.dft; | %n.uncertain;
                             | %n.null; | %n.sym; | %n.nbr; |
                             %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt;)*)                        >
<<!>!ATTLIST %n.fvLib;          %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'fvLib'        >
]<!>]>
</scrap><scrap prev='newfs'>
<<!>!ENTITY % XML.vAlt "INCLUDE" >
<<!>![%XML.vAlt;[
<<!>!ELEMENT %n.vAlt;      - -  ((%n.plus; | %n.minus; | any |
                             %n.none; | %n.dft; | %n.uncertain;
                             | %n.null; | %n.sym; | %n.nbr; |
                             %n.msr; | %n.rate; | %n.str; |
                             %n.vAlt; | %n.fs;), (%n.plus; |
                             %n.minus; | any | %n.none; |
                             %n.dft; | %n.uncertain; | %n.null;
                             | %n.sym; | %n.nbr; | %n.msr; |
                             %n.rate; | %n.str; | %n.vAlt; |
                             %n.fs;)+)                          >
<<!>!ATTLIST %n.vAlt;           %a.global;
          mutExcl            (Y | N)             #IMPLIED
          TEIform            CDATA               'vAlt'         >
]<!>]>
]<!>]>
</scrap></p>
<p>It will be noted that the new versions are identical to the old
versions.  Common sense has won out, and in this experimental XML
version of the TEI DTD, global inclusions are <emph>not</emph> propagated
into these feature-structure element types.</p>
</div3>

<div3><head>Names and dates tag set</head>

<p>The <gi>dateStruct</gi> and <gi>timeStruct</gi> element types
have already been rewritten above.</p>

</div3>

<div3><head>Text-criticism tag set</head>

<p>

<scrap id='xtc' name='Suppress definitions in text-criticism tag set'>
<<!>!ENTITY % app             'IGNORE' >
<<!>!ENTITY % rdgGrp          'IGNORE' >
<<!>!ENTITY % witList         'IGNORE' >
</scrap>
</p>
<p>

The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.app;       - O  ((%n.lem)?, ((%n.rdg;, (%n.wit)?)
                             | (%n.rdgGrp;, (%n.wit)?))+)       >
<!ELEMENT %n.rdgGrp;    - O  (%n.rdgGrp; | (%n.rdg;,
                             (%n.wit)?))+                       >
<!ELEMENT %n.witList;   - O  ((%n.witness)+)                    >
]]></eg>
</p>
<p>The new definitions are as follows.  We take the opportunity to
address one of Peter Robinson's long-standing concerns, and allow
witnesses to the lemma to be listed.  Note that the model for
<gi>rdgGrp</gi> seems bizarre.  Why are readings and reading
groups treated similarly in <gi>app</gi> entries and not in
<gi>rdgGrp</gi> elements?
<scrap id='newtc' name='New definitions for text-criticism tag set'>
<<!>![%TEI.textcrit;[
<<!>!ENTITY % XML.app "INCLUDE" >
<<!>![%XML.app;[
<<!>!ELEMENT %n.app;       - O  ( (%m.Incl;)*, 
                                  (%n.lem;, (%m.Incl;)*, 
                                  (%n.wit;, (%m.Incl;)*)?)?, 
                                  ( (%n.rdg;, (%m.Incl;)*, 
                                    (%n.wit;, (%m.Incl;)*)?)
                                    | 
                                    (%n.rdgGrp;, (%m.Incl;)*, 
                                    (%n.wit;, (%m.Incl;)*)?)
                                  )+
                                )                               >
<<!>!ATTLIST %n.app;            %a.global;
          type               CDATA               #IMPLIED
          from               IDREF               #IMPLIED
          to                 IDREF               #IMPLIED
          loc                CDATA               #IMPLIED
          TEIform            CDATA               'app'          >
]<!>]>
</scrap><scrap prev='newtc'>
<<!>!ENTITY % XML.rdgGrp "INCLUDE" >
<<!>![%XML.rdgGrp;[
<<!>!ELEMENT %n.rdgGrp;    - O  ((%m.Incl;)*, 
                                (((%n.rdgGrp;, (%m.Incl;)*) | 
                                  (%n.rdg;, (%m.Incl;)*, 
                                  (%n.wit;, (%m.Incl;)*)?)))+)  >
<<!>!ATTLIST %n.rdgGrp;         %a.global;
                             %a.readings;
          TEIform            CDATA               'rdgGrp'       >
]<!>]>
</scrap><scrap prev='newtc'>
<<!>!ENTITY % XML.witList "INCLUDE" >
<<!>![%XML.witList;[
<<!>!ELEMENT %n.witList;   - O  ((%m.Incl;)*, 
                             (%n.witness;, (%m.Incl;)*)+)       >
<<!>!ATTLIST %n.witList;        %a.global;
          TEIform            CDATA               'witList'      >
]<!>]>
]<!>]>
</scrap>
</p>
</div3>

<div3><head>Graphs and digraphs tag set</head>

<p>
<scrap id='xgd' name='Suppress definitions in graphs tag set'>
<<!>!ENTITY % eTree           'IGNORE' >
<<!>!ENTITY % forest          'IGNORE' >
<<!>!ENTITY % forestGrp       'IGNORE' >
<<!>!ENTITY % graph           'IGNORE' >
<<!>!ENTITY % tree            'IGNORE' >
<<!>!ENTITY % triangle        'IGNORE' >
</scrap></p>
<p>
The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.graph;     - -  ((%n.node;)+ & (%n.arc;)*)         >
<!ELEMENT %n.tree;      - -  ((%n.leaf; | %n.iNode;)*,
                             %n.root;, (%n.leaf; | %n.iNode;)*)
                                                                >
<!ELEMENT %n.eTree;     - -  ((%n.eTree; | %n.triangle; |
                             %n.eLeaf; )*)                      >
<!ELEMENT %n.triangle;  - -  ((%n.eTree; | %n.triangle; |
                             %n.eLeaf;)*)                       >
<!ELEMENT %n.forest;    - -  ((%n.tree; | %n.eTree; |
                             %n.triangle;)+)                    >
<!ELEMENT %n.forestGrp; - -  ((%n.forest;)+)                    >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newgd' name='New definitions for graphs tag set'>
<<!>![%TEI.nets;[
<<!>!ENTITY % XML.tree "INCLUDE" >
<<!>![%XML.tree;[
<<!>!ELEMENT %n.tree;      - -  ((%n.leaf; | %n.iNode; | %m.Incl;)*,
                             %n.root;, 
                             (%n.leaf; | %n.iNode; | %m.Incl;)*)
                                                                >
<<!>!ATTLIST %n.tree;           %a.global;
          label              CDATA               #IMPLIED
          arity              NUMBER              #IMPLIED
          ord                (Y | N | partial)   Y
          order              NUMBER              #IMPLIED
          TEIform            CDATA               'tree'         >
]<!>]>
</scrap><scrap prev='newgd'>
<<!>!ENTITY % XML.eTree "INCLUDE" >
<<!>![%XML.eTree;[
<<!>!ELEMENT %n.eTree;     - -  ((%n.eTree; | %n.triangle; |
                             %n.eLeaf; | %m.Incl;)*)            >
<<!>!ATTLIST %n.eTree;          %a.global;
          label              CDATA               #IMPLIED
          value              IDREF               #IMPLIED
          TEIform            CDATA               'eTree'        >
]<!>]>
</scrap><scrap prev='newgd'>
<<!>!ENTITY % XML.triangle "INCLUDE" >
<<!>![%XML.triangle;[
<<!>!ELEMENT %n.triangle;  - -  ((%n.eTree; | %n.triangle; |
                             %n.eLeaf; | %m.Incl;)*)            >
<<!>!ATTLIST %n.triangle;       %a.global;
          label              CDATA               #IMPLIED
          value              IDREF               #IMPLIED
          TEIform            CDATA               'triangle'     >
]<!>]>
</scrap><scrap prev='newgd'>
<<!>!ENTITY % XML.forest "INCLUDE" >
<<!>![%XML.forest;[
<<!>!ELEMENT %n.forest;    - -  ((%n.tree; | %n.eTree; |
                             %n.triangle; | %m.Incl;)*)         >
<<!>!ATTLIST %n.forest;         %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'forest'       >
]<!>]>
</scrap><scrap prev='newgd'>
<<!>!ENTITY % XML.forestGrp "INCLUDE" >
<<!>![%XML.forestGrp;[
<<!>!ELEMENT %n.forestGrp; - -  ((%n.forest;, (%m.Incl;)*)+)    >
<<!>!ATTLIST %n.forestGrp;      %a.global;
          type               CDATA               #IMPLIED
          TEIform            CDATA               'forestGrp'    >
]<!>]>
]<!>]>
</scrap>
</p>
</div3>

<div3><head>Tables tag set</head>

<p>

<scrap id='xtf' name='Suppress definitions in tables tag set'>
<<!>!ENTITY % figure          'IGNORE' >
<<!>!ENTITY % formula         'IGNORE' >
<<!>!ENTITY % row             'IGNORE' >
<<!>!ENTITY % table           'IGNORE' >
</scrap>
</p>
<p>

The current definitions are these:
<eg><![ CDATA [
<!ELEMENT %n.table;     - -  ((%n.head)*, (%n.row)+)            >
<!ELEMENT %n.row;       - O  ((%n.cell; | %n.table;)+)          >
<!ELEMENT %n.figure;    - -  ((%n.head)?, (%n.p)*,
                             (%n.figDesc)?, (%n.text)?)         >
<!ELEMENT %n.formula;   - -  %formulaContent;                   >
]]></eg>
</p>
<p>The new definitions are as follows:
<scrap id='newtf' name='New definitions for tables tag set'>
<<!>![%TEI.figures;[
<<!>!ENTITY % XML.table "INCLUDE" >
<<!>![%XML.table;[
<<!>!ELEMENT %n.table;     - -  ((%n.head; | %m.Incl;)*, 
                             (%n.row;, (%m.Incl;)*)+)           >
<<!>!ATTLIST %n.table;          %a.global;
          rows               NUMBER              #IMPLIED
          cols               NUMBER              #IMPLIED
          TEIform            CDATA               'table'        >
]<!>]>
</scrap><scrap prev='newtf'>
<<!>!ENTITY % XML.row "INCLUDE" >
<<!>![%XML.row;[
<<!>!ELEMENT %n.row;       - O  ((%n.cell; | %n.table;), 
                             (%m.Incl;)*)+                      >
<<!>!ATTLIST %n.row;            %a.global;
          role               CDATA               data
          TEIform            CDATA               'row'          >
]<!>]>
</scrap><scrap prev='newtf'>
<<!>!ENTITY % XML.figure "INCLUDE" >
<<!>![%XML.figure;[
<<!>!ELEMENT %n.figure;    - -  ((%m.Incl;)*, 
                              (%n.head;, (%m.Incl;)*)?, 
                              (%n.p;, (%m.Incl;)*)*,
                              (%n.figDesc;, (%m.Incl;)*)?, 
                              (%n.text;, (%m.Incl;)*)?)         >
<<!>!ATTLIST %n.figure;         %a.global;
          entity             ENTITY              #IMPLIED
          TEIform            CDATA               'figure'       >
]<!>]>
</scrap><scrap prev='newtf'>
<<!>!ENTITY % XML.formula "INCLUDE" >
<<!>![%XML.formula;[
<<!>!ELEMENT %n.formula;   - -  %formulaContent;                   >
<<!>!ATTLIST %n.formula;        %a.global;
          notation           %formulaNotations;   #REQUIRED
          TEIform            CDATA               'formula'      >
]<!>]>
]<!>]>
</scrap>
</p>

</div3>

</div2>

</div1>


<div1 id='probdic'><head>The problem of the dictionary chapter</head>
<p>The TEI base tag set for dictionaries cannot be made XML conformant
using the methods described here.  That tag set distinguishes two
top-level elements for dictionary entries:
<gi>entry</gi>, which has a relatively well-defined structure, and
<gi>entryFree</gi>, which has no prescribed structure at all:  any
element used in tagging dictionary entries may appear, within any
other element, at any level of nesting.  The desired freedom for
<gi>entryFree</gi> entries is guaranteed by the inclusion exception on
<gi>entryFree</gi>.  The standard declaration for the element is this:
<eg><![CDATA[
<!ELEMENT %n.entryFree; - O  (#PCDATA)
                                                 +(%m.dictionaryParts
                                                 | %m.phrase |
                                                 %m.inter)      >
]]></eg>
</p>

<p>If we use the techniques described above, all of the members of the
classes <ident>dictionaryParts</ident>, <ident>phrase</ident>, and
<ident>inter</ident> will be made legal at every point within any
members of any of those classes.  Apart from the havoc that would wreak
on the core tag set, it would wholly erase the distinction between
<gi>entry</gi> and <gi>entryFree</gi> elements.
</p>

<p>So some other method of handling anomalous dictionary entries is
needed in an XML version of the TEI DTD.  Borrowing ideas from B.
Tommie Usdin and Deborah A. Lapeyre, and with thanks also to David J.
Birnbaum, I propose a new approach to the problem.</p>

<p>The basic idea is to define an element for anomalous structures
in dictionary entries.  In this discussion, I'll assume this element is
called <gi>dictAnomaly</gi> for (<gloss>dictionary anomaly</gloss>).
For every element in the normal structure of a dictionary, the existing
content model is changed by taking the existing content model and adding
<gi>dictAnomaly</gi> as an alternative.  Thus the element
<gi>superentry</gi> currently has the following declaration:
<eg><![CDATA[
<!ELEMENT %n.superentry;
                        - O  ((%n.form)?, (%n.entry)+)          >
]]></eg>
After the change, it will have the declaration:
<eg><![CDATA[
<!ELEMENT %n.superentry;
                        - O  (((%n.form;)?, (%n.entry;)+)
                             | %n.dictAnomaly;)                 >
]]></eg>
That is, a superentry is either normal (an optional <gi>form</gi>
element followed by one or more <gi>entry</gi> elements), or else it is
anomalous.  The <gi>dictAnomaly</gi> element itself is defined as
allowing any sequence of character data, dictionary elements,
inter-level elements, or phrase-level elements:
<eg><![CDATA[
<!ELEMENT %n.anomaly;   - O  (#PCDATA | %m.dictionaryParts;
                             | %m.phrase; | %m.inter;)*         >
]]></eg>
An anomalous superentry contains a single <gi>dictAnomaly</gi> element,
and nothing else.
</p>
<p>For elements which are currently defined with mixed content,
<gi>dictAnomaly</gi> is simply added to the list of elements which can
occur within them.  This allows us to evade the mixed-content problem.
The simplest way to do this is to define <gi>dictAnomaly</gi> as a
phrase-level element in the dictionary tag set.  It also allows
anomalies to occur within generic phrase-level and inter-level elements
which are used in dictionary entries.</p>
<p>In principle, the extensions file should handle this thus:
<eg><![CDATA[
<!ENTITY % x.phrase 'dictAnomaly |' >
]]></eg>
But since we have to include new declarations for the entire
phrase-level class system in the extensions file anyway (to fix the
problems with <ident>phrase.seq</ident>), we can simply add
<gi>dictAnomaly</gi> to <ident>phrase</ident>, as was done above.
</p>
</div1>

<div1><head>Open questions and checklists</head>
<p>This list brings together in one place a number of open questions
mentioned above.
<list type=bullets>
<item>Should entities for omissibility indications be introduced into
the TEI Odd files?  Or should they be introduced only in the DTD
output from <ident>odddtd</ident>?  (Current leaning:  only in
the <ident>odddtd</ident> output:  entification would made the
DTD fragments in the Guidelines too hard to read.)</item>
<item>Should <gi>graph</gi> be defined as proposed here, or more
loosely?</item>
<item>Should the failure to parameterize exclusion exceptions be
regarded as a corrigible error?  (N.B. parameterizing them will
require the creation of new <ident>entDoc</ident> elements for
each of them.)</item>
<item>How many of the current class of global inclusions should
actually be globally legal?  Particularly to be considered here
are the elements now defined as taking only <kw>#PCDATA</kw>.</item>
<item>What should we do in the short term (experimental XML
version of the DTD) about <ident>specialPara</ident>?</item>
<item>What should we do in the long term (TEI P3.5 and P4)
about <ident>specialPara</ident>?</item>
</list>
</p>
<p>Corrigible errors identified in this document are:
<list type=bullets>
<item>absence of semicolons in parameter-entity references</item>
<item>use of ampersand connectors in four content models</item>
<item>use of <kw>#PCDATA</kw> not as prescribed in XML 1.0</item>
<item>excess parentheses in definition of <ident>phrase</ident></item>
</list>
</p>
</div1>
<div1>
<head>Miscellaneous Housekeeping</head>
<p>A few scraps necessary for housekeeping have no obvious
home in this document; I'll put them here. </p>
<p>Before we define <ident>component</ident>, we need to embed
all the entity files for the selected tag sets:
<scrap id='tagsetents' name='Embed tag-set-specific ent files'>
<<!>!-- 3.7.6:  Embedding tag-set-specific entity definitions    -->
<<!>![ %TEI.verse; [
<<!>!ENTITY % TEI.verse.ent system 'teivers2.ent'                  >
%TEI.verse.ent;
]<!>]>
<<!>![ %TEI.drama; [
<<!>!ENTITY % TEI.drama.ent system 'teidram2.ent'                  >
%TEI.drama.ent;
]<!>]>
<<!>![ %TEI.spoken; [
<<!>!ENTITY % TEI.spoken.ent system 'teispok2.ent'                 >
%TEI.spoken.ent;
]<!>]>
<<!>![ %TEI.dictionaries; [
<<!>!ENTITY % TEI.dictionaries.ent system 'teidict2.ent'           >
%TEI.dictionaries.ent;
]<!>]>
<<!>![ %TEI.terminology; [
<<!>!ENTITY % x.common ''                                          >
<<!>!ENTITY % m.common '%x.common %m.bibl; | %m.chunk; | 
           %m.hqinter; | %m.lists; | %m.notes; | %n.stage;'     >
<<!>!ENTITY % TEI.terminology.ent system 'teiterm2.ent'            >
%TEI.terminology.ent;
]<!>]>
<<!>![ %TEI.linking; [
<<!>!ENTITY % TEI.linking.ent system 'teilink2.ent'                >
%TEI.linking.ent;
]<!>]>
<<!>![ %TEI.analysis; [
<<!>!ENTITY % TEI.analysis.ent system 'teiana2.ent'                >
%TEI.analysis.ent;
]<!>]>
<<!>![ %TEI.transcr; [
<<!>!ENTITY % TEI.transcr.ent system 'teitran2.ent'                >
%TEI.transcr.ent;
]<!>]>
<<!>![ %TEI.textcrit; [
<<!>!ENTITY % TEI.textcrit.ent system 'teitc2.ent'                 >
%TEI.textcrit.ent;
]<!>]>
<<!>![ %TEI.names.dates; [
<<!>!ENTITY % TEI.names.dates.ent system 'teind2.ent'              >
%TEI.names.dates.ent;
]<!>]>
<<!>![ %TEI.figures; [
<<!>!ENTITY % TEI.figures.ent system 'teifig2.ent'                 >
%TEI.figures.ent;
]<!>]>
</scrap>
Note that the terminology entity file unwisely refers to
<ident>common</ident>, which we thus must define in an 
ad hoc way.
</p>
<p>Before we do that, we have to provide default values for all the tagset
entities:
<scrap id='tagsets' name='Provide default tagset declarations'>
<<!>!ENTITY % TEI.prose        'IGNORE'                            >
<<!>!ENTITY % TEI.verse        'IGNORE'                            >
<<!>!ENTITY % TEI.drama        'IGNORE'                            >
<<!>!ENTITY % TEI.spoken       'IGNORE'                            >
<<!>!ENTITY % TEI.dictionaries 'IGNORE'                            >
<<!>!ENTITY % TEI.terminology  'IGNORE'                            >
<<!>!ENTITY % TEI.general      'IGNORE'                            >
<<!>!ENTITY % TEI.mixed        'IGNORE'                            >
<<!>!ENTITY % TEI.linking      'IGNORE'                            >
<<!>!ENTITY % TEI.analysis     'IGNORE'                            >
<<!>!ENTITY % TEI.fs           'IGNORE'                            >
<<!>!ENTITY % TEI.certainty    'IGNORE'                            >
<<!>!ENTITY % TEI.transcr      'IGNORE'                            >
<<!>!ENTITY % TEI.textcrit     'IGNORE'                            >
<<!>!ENTITY % TEI.names.dates  'IGNORE'                            >
<<!>!ENTITY % TEI.nets         'IGNORE'                            >
<<!>!ENTITY % TEI.figures      'IGNORE'                            >
<<!>!ENTITY % TEI.corpus       'IGNORE'                            >
</scrap></p>
<p>And we need to define the TEI keywords and default
generic identifiers:
<scrap id='kw' name='Define TEI keywords'>
<<!>!ENTITY % INHERITED '#IMPLIED'                                 >
<<!>!ENTITY % ISO-date 'CDATA'                                     >
<<!>!ENTITY % extPtr 'CDATA'                                       >
<<!>!ENTITY % TEI.elementNames system 'teigis2.ent'                >
%TEI.elementNames;
</scrap></p>
<p><scrap id='ppfix' name='Fix placePart class'>
<<!>!ENTITY % x.placePart ''                                       >
<<!>!ENTITY % m.placePart '%x.placePart %n.bloc; | %n.country; | 
           %n.distance; | %n.geog; | %n.offset; 
           | %n.region; | %n.settlement;'                          >
</scrap></p>
</div1>

</body>

<back>
<div1><head>Notation</head>
<p>The notation in this paper is fairly simple:
<list type=bullets>
<item><ident>E</ident>, <ident>E'</ident> (E-prime),
<ident>F</ident>, <ident>G</ident> are <term>regular expressions</term>.
For purposes of this discussion, they are also content-model groups.
</item>

<item><ident>L(E)</ident> is the language accepted by
<ident>E</ident></item>
<item>&Sigma; is the alphabet (set) of atomic symbols used in the
expressions <ident>E</ident>, etc.
</item>
<item><ident>&Sigma;</ident>* is any string of symbols in
&Sigma;, including the empty string</item>
<item><ident>I</ident> is the set of symbols named in the
relevant (active) inclusion exceptions; in the context of a
regular expression <ident>E'</ident>, <ident>I</ident> should be
taken to stand for an alternation of all the symbols
<ident>i</ident> in the set <ident>I</ident>.  In an actual
content model, the expression written here as <code>I*</code>
will normally be written <code>%Istar;</code> or
<code>(%m.I;)*</code>, where the parameter entities are declared
along these lines:
<eg><![CDATA[
<!ENTITY % x.I ''>
<!ENTITY % m.I '%x.I; %m.globincl;'>
<!ENTITY % Istar '(%m.I;)*'>
]]>
</eg>
</item>
<item><ident>i</ident> is an arbitrary symbol in the set
<ident>I</ident></item>
<item><ident>x</ident>, <ident>y</ident> are strings of atomic
symbols (members of &Sigma;*)
</item>
<item><ident>xy</ident> is the concatenation of <ident>x</ident>
and <ident>y</ident>.</item>
</list>
</p>
</div1>

<![IGNORE[
<div1><head>Simple content-model normalizations</head>
<p>In order to ensure that the methods of handling inclusions are always
applicable, it may be necessary to normalize content models.  The
following reduction rules should be applied repeatedly, as long as any
reduction rules apply.
<list type=bullets>
<item>if <ident>E</ident> is nullable, then
<ident>red</ident>(<ident>E</ident>?) =
<ident>red</ident>(<ident>E</ident>)
</item>
<item>
<ident>red</ident>((<ident>E</ident>+)?) =
<ident>red</ident>(<ident>E</ident>)*
</item>
<item>if <ident>E</ident> is nullable, then
<ident>red</ident>(<ident>E</ident>+) =
<ident>red</ident>(<ident>E</ident>)*
</item>
<item>
<ident>red</ident>((<ident>E</ident>?)*) =
<ident>red</ident>(<ident>E</ident>)*
</item>
<item>
<ident>red</ident>((<ident>E</ident>+)*) =
<ident>red</ident>(<ident>E</ident>)*
</item>
<item>
<ident>red</ident>((<ident>E</ident>*)*) =
<ident>red</ident>(<ident>E</ident>)*
</item>
</list>
</div1>
]]>

<![IGNORE[
<div1><head>Reachability summary</head>
<p>
TeiCorpus2    >    teiHeader
TeiCorpus2    >    tei.2
tei.2         >    teiHeader
</p>
</div1>

]]>

</back>
</text>
</tei.2>
