Annotation of Amaya/doc/languages.html, revision 1.30

1.30    ! cvs         1: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        !             2:     "http://www.w3.org/TR/html4/loose.dtd">
1.18      cvs         3: <html>
                      4: <head>
1.30    ! cvs         5:   <title>The Languages of Thot</title>
        !             6:   <meta http-equiv="Content-Type" content="text/html">
1.18      cvs         7: </head>
1.30    ! cvs         8: 
1.18      cvs         9: <body>
                     10: 
1.19      cvs        11: <div class="frontmatter" align="center">
1.18      cvs        12: <h1>The Languages of Thot</h1>
                     13: 
                     14: <h3>Vincent Quint</h3>
                     15: 
                     16: <h4>Translated from French by Ethan Munson</h4>
                     17: 
1.30    ! cvs        18: <h4>Version of November 21, 2000</h4>
        !            19: 
        !            20: <p>© 1996-2000 INRIA</p>
1.18      cvs        21: <hr>
                     22: </div>
                     23: 
                     24: <div class="tableofcontents">
                     25: <h2><a href="languages.toc.html">Contents</a></h2>
                     26: <ul>
1.30    ! cvs        27:   <li><big><a href="#sect2">The document model of Thot</a></big>
        !            28:     <ul>
        !            29:       <li><strong><a href="#sectb21">The logical structure of
        !            30:         documents</a></strong></li>
        !            31:       <li><strong><a href="#sectb22">Generic and specific
        !            32:         structures</a></strong></li>
        !            33:       <li><strong><a href="#sectb23">Logical structure and physical
        !            34:         structure</a></strong></li>
        !            35:       <li><strong><a href="#sectb24">Document structures and object
        !            36:         structures</a></strong></li>
        !            37:     </ul>
        !            38:   </li>
        !            39:   <li><big><a href="#sect3">The S language</a></big>
        !            40:     <ul>
        !            41:       <li><strong><a href="#sectb31">Document meta-structure</a></strong>
        !            42:         <ul>
        !            43:           <li><a href="#sectc311">The basic types</a></li>
        !            44:           <li><a href="#sectc312">Constructed elements</a></li>
        !            45:           <li><a href="#sectc313">Logical structure constructors</a>
        !            46:             <ul>
        !            47:               <li><small><a href="#sectd3131">Aggregate and
        !            48:               List</a></small></li>
        !            49:               <li><small><a href="#sectd3132">Choice, Schema, and
        !            50:                 Unit</a></small></li>
        !            51:               <li><small><a href="#sectd3133">Reference and
        !            52:                 Inclusion</a></small></li>
        !            53:               <li><small><a href="#sectd3134">Mark pairs</a></small></li>
        !            54:               <li><small><a href="#sectd3135">Restrictions and
        !            55:                 Extensions</a></small></li>
        !            56:               <li><small><a href="#sectd3136">Summary</a></small></li>
        !            57:             </ul>
        !            58:           </li>
        !            59:           <li><a href="#sectc314">Associated Elements</a></li>
        !            60:           <li><a href="#sectc315">Attributes</a></li>
        !            61:           <li><a href="#sectc316">Discussion of the model</a></li>
        !            62:         </ul>
        !            63:       </li>
        !            64:       <li><strong><a href="#sectb32">The definition language for generic
        !            65:         structures</a></strong>
        !            66:         <ul>
        !            67:           <li><a href="#sectc321">Writing Conventions</a></li>
        !            68:           <li><a href="#sectc322">Extension schemas</a></li>
        !            69:           <li><a href="#sectc323">The general organization of structure
        !            70:             schemas</a></li>
        !            71:           <li><a href="#sectc324">The default presentation</a></li>
        !            72:           <li><a href="#sectc325">Global Attributes</a></li>
        !            73:           <li><a href="#sectc326">Parameters</a></li>
        !            74:           <li><a href="#sectc327">Structured elements</a></li>
        !            75:           <li><a href="#sectc328">Structure definitions</a>
        !            76:             <ul>
        !            77:               <li><small><a href="#sectd3281">List</a></small></li>
        !            78:               <li><small><a href="#sectd3282">Aggregate</a></small></li>
        !            79:               <li><small><a href="#sectd3283">Choice</a></small></li>
        !            80:               <li><small><a href="#sectd3284">Reference</a></small></li>
        !            81:               <li><small><a href="#sectd3285">Mark pairs</a></small></li>
        !            82:             </ul>
        !            83:           </li>
        !            84:           <li><a href="#sectc329">Imports</a></li>
        !            85:           <li><a href="#sectc3210">Extension rules</a></li>
        !            86:           <li><a href="#sectc3211">Associated elements</a></li>
        !            87:           <li><a href="#sectc3212">Units</a></li>
        !            88:           <li><a href="#sectc3213">Skeleton elements</a></li>
        !            89:           <li><a href="#sectc3214">Exceptions</a></li>
        !            90:         </ul>
        !            91:       </li>
        !            92:       <li><strong><a href="#sectb33">Some examples</a></strong>
        !            93:         <ul>
        !            94:           <li><a href="#sectc331">A class of documents: articles</a></li>
        !            95:           <li><a href="#sectc332">A class of objects: mathematical
        !            96:             formulas</a></li>
        !            97:         </ul>
        !            98:       </li>
        !            99:     </ul>
        !           100:   </li>
        !           101:   <li><big><a href="#sect4">The P language</a></big>
        !           102:     <ul>
        !           103:       <li><strong><a href="#sectb41">Document presentation</a></strong>
        !           104:         <ul>
        !           105:           <li><a href="#sectc411">Two levels of presentation</a></li>
        !           106:           <li><a href="#sectc412">Boxes</a></li>
        !           107:           <li><a href="#sectc413">Views and visibility</a></li>
        !           108:           <li><a href="#sectc414">Pages</a></li>
        !           109:           <li><a href="#sectc415">Numbering</a></li>
        !           110:           <li><a href="#sectc416">Presentation parameters</a></li>
        !           111:         </ul>
        !           112:       </li>
        !           113:       <li><strong><a href="#sectb42">Presentation description
        !           114:         language</a></strong>
        !           115:         <ul>
        !           116:           <li><a href="#sectc421">The organization of a presentation
        !           117:             schema</a></li>
        !           118:           <li><a href="#sectc422">Views</a></li>
        !           119:           <li><a href="#sectc423">Print Views</a></li>
        !           120:           <li><a href="#sectc424">Counters</a></li>
        !           121:           <li><a href="#sectc425">Presentation constants</a></li>
        !           122:           <li><a href="#sectc426">Variables</a></li>
        !           123:           <li><a href="#sectc427">Default presentation rules</a></li>
        !           124:           <li><a href="#sectc428">Presentation and page layout boxes</a></li>
        !           125:           <li><a href="#sectc429">Presentation of structured elements</a></li>
        !           126:           <li><a href="#sectc4210">Logical attribute presentation</a></li>
        !           127:           <li><a href="#sectc4212">Value transmission rules</a></li>
        !           128:           <li><a href="#sectc4213">Presentation rules</a></li>
        !           129:           <li><a href="#sectc4214">Conditions applying to presentation
        !           130:             rules</a>
        !           131:             <ul>
        !           132:               <li><small><a href="#sectd42141">Conditions based on the logical
        !           133:                 position of the element</a></small></li>
        !           134:               <li><small><a href="#sectd42142">Conditions on
        !           135:                 references</a></small></li>
        !           136:               <li><small><a href="#sectd42143">Conditions on logical
        !           137:                 attributes</a></small></li>
        !           138:               <li><small><a href="#sectd42144">Conditions on page
        !           139:                 breaks</a></small></li>
        !           140:               <li><small><a href="#sectd42145">Conditions on the element's
        !           141:                 content</a></small></li>
        !           142:               <li><small><a href="#sectd42146">Conditions on
        !           143:                 counters</a></small></li>
        !           144:             </ul>
        !           145:           </li>
        !           146:           <li><a href="#sectc4215">A presentation rule</a></li>
        !           147:           <li><a href="#sectc4216">Box axes</a></li>
        !           148:           <li><a href="#sectc4217">Distance units</a></li>
        !           149:           <li><a href="#sectc4218">Relative positions</a></li>
        !           150:           <li><a href="#sectc4219">Box extents</a>
        !           151:             <ul>
        !           152:               <li><small><a href="#sectd42191">Fixed extents</a></small></li>
        !           153:               <li><small><a href="#sectd42192">Relative
        !           154:               extents</a></small></li>
        !           155:               <li><small><a href="#sectd42193">Elastic
        !           156:               extents</a></small></li>
        !           157:             </ul>
        !           158:           </li>
        !           159:           <li><a href="#sectc4220">Overflow</a></li>
        !           160:           <li><a href="#sectc4221">Inheritance</a></li>
        !           161:           <li><a href="#sectc4222">Line breaking</a>
        !           162:             <ul>
        !           163:               <li><small><a href="#sectd42221">Line spacing</a></small></li>
        !           164:               <li><small><a href="#sectd42222">First line
        !           165:                 indentation</a></small></li>
        !           166:               <li><small><a href="#sectd42223">Alignment</a></small></li>
        !           167:               <li><small><a href="#sectd42224">Justification</a></small></li>
        !           168:               <li><small><a href="#sectd42225">Hyphenation</a></small></li>
        !           169:               <li><small><a href="#sectd42226">Avoiding line
        !           170:                 breaking</a></small></li>
        !           171:             </ul>
        !           172:           </li>
        !           173:           <li><a href="#sectc4223">Page breaking and line breaking
        !           174:             conditions</a></li>
        !           175:           <li><a href="#sectc4224">Visibility</a></li>
        !           176:           <li><a href="#sectc4225">Character style parameters</a>
        !           177:             <ul>
        !           178:               <li><small><a href="#sectd42251">Character size</a></small></li>
        !           179:               <li><small><a href="#sectd42252">Font and character
        !           180:                 style</a></small></li>
        !           181:               <li><small><a href="#sectd42253">Underlining</a></small></li>
        !           182:             </ul>
        !           183:           </li>
        !           184:           <li><a href="#sectc4226">Stacking order</a></li>
        !           185:           <li><a href="#sectc4227">Line style</a></li>
        !           186:           <li><a href="#sectc4228">Line thickness</a></li>
        !           187:           <li><a href="#sectc4229">Fill pattern</a></li>
        !           188:           <li><a href="#sectc4230">Colors</a></li>
        !           189:           <li><a href="#sectc4230a">Background color and border</a></li>
        !           190:           <li><a href="#sectc4230b">Background pictures</a></li>
        !           191:           <li><a href="#sectc4231">Presentation box content</a></li>
        !           192:           <li><a href="#sectc4232">Presentation box creation</a></li>
        !           193:           <li><a href="#sectc4233">Page layout</a></li>
        !           194:           <li><a href="#sectc4234">Box copies</a></li>
        !           195:         </ul>
        !           196:       </li>
        !           197:     </ul>
        !           198:   </li>
        !           199:   <li><big><a href="#sect5">The T language</a></big>
        !           200:     <ul>
        !           201:       <li><strong><a href="#sectb51">Document translation</a></strong>
        !           202:         <ul>
        !           203:           <li><a href="#sectc511">Translation principles</a></li>
        !           204:           <li><a href="#sectc512">Translation procedure</a></li>
        !           205:         </ul>
        !           206:       </li>
        !           207:       <li><strong><a href="#sectb52">Translation definition
        !           208:         language</a></strong>
        !           209:         <ul>
        !           210:           <li><a href="#sectc521">Organization of a translation
        !           211:           schema</a></li>
        !           212:           <li><a href="#sectc522">Line length</a></li>
        !           213:           <li><a href="#sectc523">Buffers</a></li>
        !           214:           <li><a href="#sectc524">Counters</a></li>
        !           215:           <li><a href="#sectc525">Constants</a></li>
        !           216:           <li><a href="#sectc526">Variables</a></li>
        !           217:           <li><a href="#sectc527">Translating structure elements</a></li>
        !           218:           <li><a href="#sectc528">Conditional rules</a>
        !           219:             <ul>
        !           220:               <li><small><a href="#sectd5281">Conditions based on the logical
        !           221:                 position of the element</a></small></li>
        !           222:               <li><small><a href="#sectd5282">Conditions on
        !           223:                 references</a></small></li>
        !           224:               <li><small><a href="#sectd5283">Conditions on the
        !           225:                 parameters</a></small></li>
        !           226:               <li><small><a href="#sectd5284">Conditions on the
        !           227:                 alphabets</a></small></li>
        !           228:               <li><small><a href="#sectd5285">Conditions on page
        !           229:                 breaks</a></small></li>
        !           230:               <li><small><a href="#sectd5286">Conditions on the element's
        !           231:                 content</a></small></li>
        !           232:               <li><small><a href="#sectd5287">Conditions on the presence of
        !           233:                 comments</a></small></li>
        !           234:               <li><small><a href="#sectd5288">Conditions on the presence of
        !           235:                 specific presentation rules</a></small></li>
        !           236:               <li><small><a href="#sectd5289">Conditions on the presence of
        !           237:                 logical attributes</a></small></li>
        !           238:               <li><small><a href="#sectd52810">Conditions on logical
        !           239:                 attributes</a></small></li>
        !           240:               <li><small><a href="#sectd52811">Conditions on specific
        !           241:                 presentation rules</a></small></li>
        !           242:             </ul>
        !           243:           </li>
        !           244:           <li><a href="#sectc529">Translation rules</a></li>
        !           245:           <li><a href="#sectc5210">The <tt>Create</tt> rule</a></li>
        !           246:           <li><a href="#sectc5211">The <tt>Write</tt> rule</a></li>
        !           247:           <li><a href="#sectc5212">The <tt>Read</tt> rule</a></li>
        !           248:           <li><a href="#sectc5213">The <tt>Include</tt> rule</a></li>
        !           249:           <li><a href="#sectc5214">The <tt>Get</tt> rule</a></li>
        !           250:           <li><a href="#sectc5215">The <tt>Copy</tt> rule</a></li>
        !           251:           <li><a href="#sectc5216">The <tt>Use</tt> rule</a></li>
        !           252:           <li><a href="#sectc5217">The <tt>Remove</tt> rule</a></li>
        !           253:           <li><a href="#sectc5218">The <tt>NoTranslation</tt> rule</a></li>
        !           254:           <li><a href="#sectc5219">The <tt>NoLineBreak</tt> rule</a></li>
        !           255:           <li><a href="#sectc5220">The <tt>ChangeMainFile</tt> rule</a></li>
        !           256:           <li><a href="#sectc5220a">The <tt>RemoveFile</tt> rule</a></li>
        !           257:           <li><a href="#sectc5221">The <tt>Set</tt> and <tt>Add</tt>
        !           258:           rules</a></li>
        !           259:           <li><a href="#sectc5221a">The <tt>Indent</tt> rule</a></li>
        !           260:           <li><a href="#sectc5222">Rule application order</a></li>
        !           261:           <li><a href="#sectc5223">Translation of logical attributes</a></li>
        !           262:           <li><a href="#sectc5224">Translation of specific
        !           263:           presentations</a></li>
        !           264:           <li><a href="#sectc5225">Recoding of characters, symbols and
        !           265:             graphics</a></li>
        !           266:         </ul>
        !           267:       </li>
        !           268:     </ul>
        !           269:   </li>
        !           270:   <li><big><a href="#sect6">Language grammars</a></big>
        !           271:     <ul>
        !           272:       <li><strong><a href="#sectb61">The M meta-language</a></strong></li>
        !           273:       <li><strong><a href="#sectb62">The S language</a></strong></li>
        !           274:       <li><strong><a href="#sectb63">The P language</a></strong></li>
        !           275:       <li><strong><a href="#sectb64">The T language</a></strong></li>
        !           276:     </ul>
        !           277:   </li>
        !           278:   <li><big><a href="#sect7">Character coding</a></big>
        !           279:     <ul>
        !           280:       <li><strong><a href="#sectb71">Characters</a></strong></li>
        !           281:       <li><strong><a href="#sectb72">Symbols</a></strong></li>
        !           282:       <li><strong><a href="#sectb73">Graphical elements</a></strong></li>
        !           283:     </ul>
        !           284:   </li>
1.18      cvs       285: </ul>
                    286: <hr>
                    287: </div>
1.1       cvs       288: 
1.18      cvs       289: <div class="chapter">
1.30    ! cvs       290: <h1><a name="sect2">The document model of Thot</a></h1>
1.1       cvs       291: 
1.30    ! cvs       292: <p>All of the services which Thot provides to the user are based on the
        !           293: system's internal document representation.  This representation is itself
        !           294: derived from the document model which underlies Thot.  The model is presented
        !           295: here, prior to the description of the languages which permit the generic
        !           296: specification of documents.</p>
1.1       cvs       297: 
1.18      cvs       298: <div class="section">
1.30    ! cvs       299: <h2><a name="sectb21">The logical structure of documents</a></h2>
1.1       cvs       300: 
1.30    ! cvs       301: <p>The document model of Thot is primarily designed to allow the user to
        !           302: operate on those entities which s/he has in mind when s/he works on a
        !           303: document. The model makes no assumptions about the nature of these entities.
        !           304: It is essentially these logical entities, such as paragraphs, sections,
        !           305: chapters, notes, titles, and cross-references which give a document its
        !           306: logical structure.</p>
        !           307: 
        !           308: <p>Because of this model, the author can divide the document into chapters,
1.1       cvs       309: giving each one a title.  The content of these chapters can be further divided
1.2       cvs       310: into sections, subsections, etc.  The text is organized into successive
                    311: paragraphs, according to the content. In the writing phase, the lines, pages,
                    312: margins, spacing, fonts, and character styles are not very important. In fact,
                    313: if the system requires documents to be written in these terms, it gets in the
                    314: way. So, Thot's model is primarily based on the logical aspect of documents.
1.18      cvs       315: The creation of a model of this type essentially requires the definition :</p>
                    316: <ul>
1.30    ! cvs       317:   <li>of the entities which can appear in the documents,</li>
        !           318:   <li>and the relations between these entities.</li>
1.18      cvs       319: </ul>
1.30    ! cvs       320: 
        !           321: <p>The choice of entities to include in the model can be subtle.  Some
        !           322: documents require chapters, while others only need various levels of sections.
        !           323: Certain documents contain appendices, others don't.  In different documents
        !           324: the same logical entity may go by different names (e.g. ``Conclusion'' and
1.1       cvs       325: ``Summary'').  Certain entities which are absolutely necessary in some
                    326: documents, such as clauses in a contract or the address of the recipient in a
1.18      cvs       327: letter, are useless in most other cases.</p>
1.30    ! cvs       328: 
        !           329: <p>The differences between documents result from more than just the entities
        !           330: that appear in them, but also from the relationships between these entities
        !           331: and the ways that they are linked.  In certain documents, notes are spread
        !           332: throughout the document, for example at the bottom of the page containing the
1.1       cvs       333: cross-reference to them, while in other documents they are collected at the
                    334: end of each chapter or even at the end of the work.  As another example, the
                    335: introduction of some documents can contain many sections, while in other
                    336: documents, the introduction is restricted to be a short sequence of
1.18      cvs       337: paragraphs.</p>
1.30    ! cvs       338: 
        !           339: <p>All of this makes it unlikely that a single model can describe any document
        !           340: at a relatively high level.  It is obviously tempting to make up a list of
        !           341: widely used entities, such as chapters, sections, paragraphs, and titles, and
        !           342: then map all other entities onto the available choices.  In this way, an
1.1       cvs       343: introduction can be supported as a chapter and a contract clause supported as
                    344: a paragraph or section. However, in trying to widen the range of usage of
                    345: certain entities, their meaning can be lost and the power of the model
                    346: reduced.  In addition, while this widening partially solves the problem of
                    347: choosing entities, it does not solve the problem of their organization: when a
                    348: chapter must be composed of sections, how does one indicate that an
                    349: introduction has none when it is merely another chapter?  One solution is to
                    350: include introductions in the list of supported entities. But then, how does
                    351: one distinguish those introductions which are allowed to have sections from
                    352: those which are not.  Perhaps this could be done by defining two types of
                    353: introduction. Clearly, this approach risks an infinite expansion of the list
1.18      cvs       354: of widely used entities.</p>
                    355: </div>
1.1       cvs       356: 
1.18      cvs       357: <div class="section">
1.30    ! cvs       358: <h2><a name="sectb22">Generic and specific structures</a></h2>
1.1       cvs       359: 
1.30    ! cvs       360: <p>Thus, it is apparently impossible to construct an exhaustive inventory of
        !           361: all those entities which are necessary and sufficient to precisely describe
        !           362: any document. It also seems impossible to specify all possible arrangements of
1.18      cvs       363: these entities in a document.  This is why Thot uses a <em>meta-model</em>
                    364: instead, which permits the description of numerous <em>models</em>, each one
                    365: describing a <em>class</em> of documents.</p>
1.30    ! cvs       366: 
        !           367: <p>A <em>class</em> is a set of documents having very similar structure. Thus,
1.1       cvs       368: the collection of research reports published by a laboratory constitutes a
                    369: class; the set of commercial proposals by the sales department of a company
                    370: constitutes another class; the set of articles published by a journal
                    371: constitutes a third class.  Clearly, it is not possible to enumerate every
                    372: possible document class.  It is also clear that new document classes must be
1.18      cvs       373: created to satisfy new needs and applications.</p>
1.30    ! cvs       374: 
        !           375: <p>To give a more rigorous definition of classes, we must introduce the ideas
        !           376: of <em>generic structure</em> and <em>specific structure</em>.  Each document
        !           377: has a <em>specific structure</em> which organizes the various parts which
        !           378: comprise it.  We illustrate this with the help of a simple example comparing
        !           379: two reports, A and B (<a href="#specstruct">see Figure</a>). The report A
        !           380: contains an introduction followed by three chapters and a conclusion.  The
        !           381: first chapter contains two sections, the second, three sections.  That is the
1.18      cvs       382: <em>specific</em> structure of document A. Similarly, the structure of
1.1       cvs       383: document B is: an introduction, two chapters, a conclusion; Chapter 1 has
                    384: three sections while Chapter 2 has four.  The specific structures of these two
1.18      cvs       385: documents are thus different.</p>
1.1       cvs       386: 
1.18      cvs       387: <div class="figure">
                    388: <hr>
                    389: <pre>        Report A                 Report B
1.1       cvs       390:              Introduction              Introduction
                    391:              Chapter 1                 Chapter 1
                    392:                   Section 1.1               Section 1.1
                    393:                   Section 1.2               Section 1.2
                    394:              Chapter 2                      Section 1.3
                    395:                   Section 2.1          Chapter 2
                    396:                   Section 2.2               Section 2.1
                    397:                   Section 2.3               Section 2.2
                    398:              Chapter 3                      Section 2.3
                    399:              Conclusion                     Section 2.4
1.18      cvs       400:                                        Conclusion</pre>
1.30    ! cvs       401: 
        !           402: <p align="center"><em><a name="specstruct">Two specific
        !           403: structures</a></em></p>
1.18      cvs       404: <hr>
1.30    ! cvs       405: </div>
        !           406: 
        !           407: <p>The <em>generic structure</em> defines the ways in which specific
        !           408: structures can be constructed.  It specifies how to generate specific
        !           409: structures.  The reports A and B, though different, are constructed in
        !           410: accordance with the same generic structure, which specifies that a report
        !           411: contains an introduction followed by a variable number of chapters and a
        !           412: conclusion, with each chapter containing a variable number of sections.</p>
        !           413: 
        !           414: <p>There is a one-to-one correspondence between a class and a generic
        !           415: structure: all the documents of a class are constructed in accordance with the
        !           416: same generic structure.  Hence the definition of the class: a class is a set
        !           417: of documents whose specific structure is constructed in accordance with the
        !           418: same generic structure.  A class is characterized by its generic
        !           419: structure.</p>
1.19      cvs       420: 
1.30    ! cvs       421: <p>Thus, a generic structure can be considered to be a model at the level
        !           422: which interests us, but only for one class of documents.  When the definition
        !           423: is limited to a single class of documents, it is possible to define a model
        !           424: which does a good job of representing the documents of the class, including
        !           425: the necessary entities and unencumbered by useless entities.  The description
        !           426: of the organization of the documents in the class can then be sufficiently
1.18      cvs       427: precise.</p>
                    428: </div>
1.1       cvs       429: 
1.18      cvs       430: <div class="section">
1.30    ! cvs       431: <h2><a name="sectb23">Logical structure and physical structure</a></h2>
1.1       cvs       432: 
1.30    ! cvs       433: <p>Generic structures only describe the <em>logical</em> organization of
1.18      cvs       434: documents, not their <em>physical</em> presentation on a screen or on sheets
1.1       cvs       435: of paper.  However, for a document to be displayed or printed, its graphic
1.18      cvs       436: presentation must be taken into account.</p>
1.30    ! cvs       437: 
        !           438: <p>An examination of current printed documents shows that the details of
1.1       cvs       439: presentation essentially serve to bring out their logical structure. Outside
                    440: of some particular domains, notably advertising, the presentation is rarely
                    441: independent of the logical organization of the text.  Moreover, the art of
                    442: typography consists of enhancing the organization of the text being set,
                    443: without catching the eye of the reader with overly pronounced effects.  Thus,
                    444: italic and boldface type are used to emphasize words or expressions which have
                    445: greater significance than the rest of the text: keywords, new ideas,
                    446: citations, book titles, etc.  Other effects highlight the organization of the
                    447: text: vertical space, margin changes, page breaks, centering, eventually
                    448: combined with the changes in the shapes or weight of the characters. These
                    449: effects serve to indicate the transitions between paragraphs, sections, or
                    450: chapters: an object's level in the logical structure of the document is shown
1.18      cvs       451: by the markedness of the effects.</p>
1.30    ! cvs       452: 
        !           453: <p>Since the model permits the description of all of the logical structure of
        !           454: the document, the presentation can be derived from the model without being
1.1       cvs       455: submerged in the document itself.  It suffices to use the logical structure of
                    456: the document to make the desired changes in its presentation: changes in type
1.18      cvs       457: size, type style, spacing, margin, centering, etc.</p>
1.30    ! cvs       458: 
        !           459: <p>Just as one cannot define a unique generic logical structure for all
        !           460: document classes, one cannot define universal presentation rules which can be
        !           461: applied to all document classes.  For certain types of documents the chapter
        !           462: titles will be centered on the page and printed in large, bold type.  For
        !           463: other documents, the same chapter titles will be printed in small, italic type
        !           464: and aligned on the left margin.</p>
        !           465: 
        !           466: <p>Therefore, it is necessary to base the presentation specifications for
1.1       cvs       467: documents on their class.  Such a specification can be very fine-grained,
                    468: because the presentation is expressed in terms of the entities defined in the
                    469: generic logical structure of the class.  Thus, it is possible to specify a
                    470: different presentation for the chapter titles and the section titles, and
                    471: similarly to specify titles for the sections according to their level in the
                    472: section hierarchy.  The set of rules which specify the presentation of all the
1.18      cvs       473: elements defined in a generic logical structure is called a <em>generic
                    474: presentation</em>.</p>
1.30    ! cvs       475: 
        !           476: <p>There are several advantages derived from having a presentation linked to
        !           477: the generic structure and described by a generic presentation. Homogeneity is
        !           478: the first.  Since every document in a class corresponds to the same generic
1.1       cvs       479: logical structure, a homogenous presentation for different documents of the
                    480: same class can be assured by applying the same generic presentation to all
                    481: documents of the class.  Homogeneity of presentation can also be found among
1.2       cvs       482: the entities of a single document: every section heading will be presented  in
1.1       cvs       483: the same way, the first line of every paragraph of the same type will have the
1.18      cvs       484: same indentation, etc.</p>
1.30    ! cvs       485: 
        !           486: <p>Another advantage of this approach to presentation is that it facilitates
1.1       cvs       487: changes to the graphical aspect of documents.  A change to the generic
                    488: presentation rules attached to each type of entity will alter the presentation
                    489: of the entire document, and will do so homogenously.  In this case, the
                    490: internal homogeneity of the class is no longer assured, but the way to control
                    491: it is simple.  It suffices to adopt a single generic presentation for the
1.18      cvs       492: entire class.</p>
1.30    ! cvs       493: 
        !           494: <p>If the presentation of the class does not have to be homogenous, then the
1.1       cvs       495: appearance of the document can be adapted to the way it will be used or to the
                    496: device used to render it.  This quality is sufficient to allow the existence
1.18      cvs       497: of <a name="mulpres">many generic presentations</a> for the same document
1.1       cvs       498: class. By applying one or the other of these presentations to it, the document
                    499: can be seen under different graphical aspects.  It must be emphasized that
                    500: this type of modification of the presentation is not a change to the document
                    501: itself (in its specific logical structure or its content), but only in its
1.18      cvs       502: appearance at the time of editing or printing.</p>
                    503: </div>
1.1       cvs       504: 
1.18      cvs       505: <div class="section">
1.30    ! cvs       506: <h2><a name="sectb24">Document structures and object structures</a></h2>
1.1       cvs       507: 
1.30    ! cvs       508: <p>So far, we have only discussed the global structure of documents and have
        !           509: not considered the contents found in that structure.  We could limit ourselves
        !           510: to purely textual contents by assuming that a title or a paragraph contains a
1.1       cvs       511: simple linear text.  But this model would be too restrictive.  In fact,
                    512: certain documents contain not only text, but also contain tables,  diagrams,
                    513: photographs, mathematical formulas, and program fragments.  The model must
1.18      cvs       514: permit the representation of such <em>objects</em>.</p>
1.30    ! cvs       515: 
        !           516: <p>Just as with the whole of the document, the model takes into account the
1.1       cvs       517: logical structure of objects of this type.  Some are clearly structured,
                    518: others are less so.  Logical structure can be recognized in mathematical
                    519: formulas, in tables, and in certain types of diagrams.  On the other hand, it
                    520: is difficult to define the structure of a photograph or of some drawings.  But
                    521: in any case, it does not seem possible to define one unique structure which
                    522: can represent every one of these types of objects.  The approach taken in the
                    523: definition of meta-structure and document classes also applies to objects.
                    524: Object classes can be defined which put together objects of similar type,
1.18      cvs       525: constructed from the same generic logical structure.</p>
1.30    ! cvs       526: 
        !           527: <p>Thus, a mathematical class can be defined and have a generic logical
        !           528: structure associated with it.  But even if a single generic structure can
        !           529: represent a sufficient variety of mathematical formulas, for other objects
        !           530: with less rigorous structure, multiple classes must be defined.  As for
        !           531: documents, using multiple classes assures that the model can describe the full
        !           532: range of objects to be presented.  It also permits the system to support
        !           533: objects which were not initially anticipated.  Moreover, this comment applies
        !           534: equally to mathematics: different classes of formulas can be described
        !           535: depending on the domain of mathematics being described.</p>
        !           536: 
        !           537: <p>Since objects have the same level of logical representation as documents,
        !           538: they gain the same advantages.  In particular, it is possible to define the
1.1       cvs       539: presentation separately from the objects themselves and attach it to the
                    540: class.  Thus, as for documents, objects of the same type have a uniform
                    541: presentation and the presentation of every object in a given class can be
                    542: changed simply by changing the generic presentation of the class.  Another
                    543: advantage of using this document model is that the system does not bother the
                    544: user with the details of presentation, but rather allows the user to
1.18      cvs       545: concentrate on the logical aspect of the document and the objects.</p>
1.30    ! cvs       546: 
        !           547: <p>It is clear that the documents in a class do not necessarily use the same
1.1       cvs       548: classes of objects: one technical report will contain tables while another
                    549: report will have no tables but will use mathematical formulas. The usable
1.2       cvs       550: object classes are not always mentioned in a limiting way in the generic
                    551: logical structure of documents.  Rather, they can be chosen freely from a
1.18      cvs       552: large set, independent of the document class.</p>
1.30    ! cvs       553: 
        !           554: <p>Thus, the object classes will be made commonplace and usable in every
1.1       cvs       555: document. The notion of ``object'' can be enlarged to include not only
                    556: non-textual elements, but also certain types of textual elements which can
                    557: appear in practically every document, whatever their class.  Among these
1.2       cvs       558: textual elements, one can mention enumerations, descriptions, examples,
1.18      cvs       559: quotations, even paragraphs.</p>
1.30    ! cvs       560: 
        !           561: <p>Thus, the document model is not a single, general model describing every
        !           562: type of document in one place.  Rather, it is a meta-model which can be used
        !           563: to describe many different models each of which represents either a class of
1.1       cvs       564: similar documents or a class of similar objects which every document can
1.18      cvs       565: include.</p>
                    566: </div>
                    567: <hr>
                    568: </div>
1.1       cvs       569: 
1.18      cvs       570: <div class="chapter">
                    571: <h1><a name="sect3">The S language</a></h1>
1.1       cvs       572: 
1.18      cvs       573: <div class="section">
1.30    ! cvs       574: <h2><a name="sectb31">Document meta-structure</a></h2>
1.1       cvs       575: 
1.30    ! cvs       576: <p>Since the concept of meta-structure is well suited to the task of
        !           577: describing documents at a high level of abstraction, this meta-structure must
        !           578: be precisely defined.  Toward that end this section first presents the basic
1.1       cvs       579: elements from which documents and structured objects are composed and then
                    580: specifies the ways in which these basic elements are assembled into structures
1.18      cvs       581: representing complete documents and objects.</p>
1.1       cvs       582: 
1.18      cvs       583: <div class="subsection">
1.30    ! cvs       584: <h3><a name="sectc311">The basic types</a></h3>
1.1       cvs       585: 
1.30    ! cvs       586: <p>At the lowest level of a document's structure, the first atom considered is
1.1       cvs       587: the character.  However, since characters are seldom isolated, usually
                    588: appearing as part of a linear sequence, and in order to reduce the complexity
1.18      cvs       589: of the document structure, <em>character strings</em> are used as atoms and
1.1       cvs       590: consecutive characters belonging to the same structural element are grouped in
1.18      cvs       591: the same character string.</p>
1.30    ! cvs       592: 
        !           593: <p>If the structure of a document is not refined to go down to  the level of
1.1       cvs       594: words or phrases, the contents of a simple paragraph can be considered to be a
                    595: single character string.  On the other hand, the title of a chapter, the title
                    596: of the first section of that chapter, and the text of the first paragraph of
                    597: that section constitute three different character strings, because they belong
1.18      cvs       598: to distinct structural elements.</p>
1.30    ! cvs       599: 
        !           600: <p>If, instead, a very fine-grained representation for the structure of a
1.1       cvs       601: document is sought, character strings could be defined to contain only a
                    602: single word, or even just a single character.  This is the case, for example,
                    603: in programs,  for which one wants to retain a structure very close to the
1.2       cvs       604: syntax of the programming language.  In this case, an assignment statement
1.1       cvs       605: initializing a simple variable to zero would be composed of two structural
                    606: elements, the identifier of the variable (a short character string) and the
1.18      cvs       607: assigned value (a string of a single character, `0').</p>
1.30    ! cvs       608: 
        !           609: <p>The character string is not the only atom necessary for representing those
1.1       cvs       610: documents that interest us.  It suffices for purely textual documents, but as
                    611: soon as the non-textual objects which we have considered arise, there must be
                    612: other atoms; the number of objects which are to be represented determines the
1.18      cvs       613: number of types of atoms that are necessary.</p>
1.30    ! cvs       614: 
        !           615: <p>Primitive <em>graphical elements</em> are used for tables and figures of
1.1       cvs       616: different types.  These elements are simple geometric shapes like horizontal
                    617: or vertical lines, which are sufficient for tables, or even oblique lines,
1.2       cvs       618: arrows, rectangles, circles, polygons, and curves for use in figures. From
                    619: these elements and character strings, graphical objects and tables can be
1.18      cvs       620: constructed.</p>
1.30    ! cvs       621: 
        !           622: <p>Photographs, though having very little structure, must still appear in
1.18      cvs       623: documents.  They are supported by <em>picture</em> elements, which are
                    624: represented as matrices of pixels.</p>
1.30    ! cvs       625: 
        !           626: <p>Finally, mathematical notations require certain elements which are
1.18      cvs       627: simultaneously characters and graphical elements, the <em>symbols</em>. By way
1.2       cvs       628: of example, radicals, integration signs, or even large parentheses are
1.1       cvs       629: examples of this type of atom.  The size of each of these symbols is
                    630: determined by its environment, that is to say, by the expression to which it
1.18      cvs       631: is attached.</p>
1.30    ! cvs       632: 
        !           633: <p>To summarize, the primitive elements which are used in the construction of
1.18      cvs       634: documents and structured objects are:</p>
                    635: <ul>
1.30    ! cvs       636:   <li>character strings,</li>
        !           637:   <li>graphical elements,</li>
        !           638:   <li>pictures,</li>
        !           639:   <li>and mathematical symbols.</li>
1.18      cvs       640: </ul>
                    641: </div>
1.1       cvs       642: 
1.18      cvs       643: <div class="subsection">
1.30    ! cvs       644: <h3><a name="sectc312">Constructed elements</a></h3>
        !           645: 
        !           646: <p>A document is evidently formed from primitive elements.  But the model of
        !           647: Thot also proposes higher level elements.  Thus, in a document composed of
        !           648: several chapters, each chapter is an element, and in the chapters each section
        !           649: is also an element, and so on.  A document is thus an organized set of
        !           650: elements.</p>
1.1       cvs       651: 
1.30    ! cvs       652: <p>In a document there are different sorts of elements.  Each element has a
1.18      cvs       653: <em>type</em> which indicates the role of the element within the document as a
1.1       cvs       654: whole.  Thus, we have, for example, the chapter and section types.  The
                    655: document is made up of typed elements: elements of the type chapter and
                    656: elements of the type section, among others, but also character string elements
                    657: and graphical elements: the primitive elements are typed elements just as
                    658: well.  At the other extreme, the document itself is also considered to be a
1.18      cvs       659: typed element.</p>
1.30    ! cvs       660: 
        !           661: <p>The important difference between the primitive elements and the other
        !           662: elements of the document is that the primitive elements are atoms (they cannot
        !           663: be decomposed), whereas the others, called <em>constructed elements</em>, are
1.1       cvs       664: composed of other elements, which can either be primitive elements or
                    665: constructed elements.  A constructed element of type chapter (or more simply,
                    666: ``a chapter'') is composed of sections, which are also constructed elements. A
                    667: paragraph, a constructed element, can be made up of character strings, which
1.18      cvs       668: are primitive elements, and of equations, which are constructed elements.</p>
1.30    ! cvs       669: 
        !           670: <p>A document is also a constructed element.  This is an important point. In
1.1       cvs       671: particular, it allows a document to be treated as part of another document,
                    672: and conversely, permits a part of a document to be treated as a complete
                    673: document.  Thus, an article presented in a journal is treated by its author as
                    674: a document in itself, while the editor of the journal considers it to be part
                    675: of an issue.  A table or a figure appearing in a document can be extracted and
                    676: treated as a complete document, for example to prepare transparencies for a
1.18      cvs       677: conference.</p>
1.30    ! cvs       678: 
        !           679: <p>These thoughts about types and constructed elements apply just as well to
1.1       cvs       680: objects as they do to documents.  A table is a constructed element made up of
                    681: other constructed elements, rows and columns.  A row is formed of cells, which
                    682: are also constructed elements which contain primitive elements (character
1.18      cvs       683: strings) and/or constructed elements like equations.</p>
                    684: </div>
1.1       cvs       685: 
1.18      cvs       686: <div class="subsection">
1.30    ! cvs       687: <h3><a name="sectc313">Logical structure constructors</a></h3>
1.1       cvs       688: 
1.30    ! cvs       689: <p>Having defined the primitive elements and the constructed elements, it is
        !           690: now time to define the types of organization which allow the building of
1.18      cvs       691: structures.  For this, we rely on the notion of the <em>constructor</em>.  A
1.1       cvs       692: constructor defines a way of assembling certain elements in a structure.  It
                    693: resides at the level of the meta-structure: it does not describe the existing
                    694: relations in a given structure, but rather defines  how elements are assembled
1.18      cvs       695: to build a structure that conforms to a model.</p>
1.30    ! cvs       696: 
        !           697: <p>In defining the overall organization of documents, the first two
        !           698: constructors considered are the aggregate and the list.</p>
1.1       cvs       699: 
1.18      cvs       700: <div class="subsubsection">
1.30    ! cvs       701: <h4><a name="sectd3131">Aggregate and List</a></h4>
1.1       cvs       702: 
1.30    ! cvs       703: <p>The <em>aggregate</em> constructor is used to define constructed element
        !           704: types which are collections of a given number of other elements. These
        !           705: collections may or may not be ordered.  The elements may be either constructed
        !           706: or primitive and are specified by their type.  A report (that is, a
        !           707: constructed element of the report type) has an aggregate structure.  It is
        !           708: formed from a title, an author's name, an introduction, a body, and a
        !           709: conclusion, making it a collection of five element types.  This type of
        !           710: constructor is found in practically every document, and generally at several
        !           711: levels in a document.</p>
        !           712: 
        !           713: <p>The <em>list</em> constructor is used to define constructed elements which
        !           714: are ordered sequences of elements (constructed or primitive) having the same
        !           715: type. The minimum and maximum numbers of elements for the sequence can be
        !           716: specified in the list constructor or the number of elements can be left
        !           717: unconstrained. The body of a report is a list of chapters and is typically
        !           718: required to contain a minimum of two chapters (is a chapter useful if it is
        !           719: the only one in the report?) The chapter itself can contain a list of
        !           720: sections, each section containing a list of paragraphs.  In the same way as
        !           721: the aggregate, the list is a very frequently used constructor in every type of
        !           722: document. However, these two constructors are not sufficient to describe every
        !           723: document structure; thus other constructors supplement them.</p>
1.18      cvs       724: </div>
1.1       cvs       725: 
1.18      cvs       726: <div class="subsubsection">
1.30    ! cvs       727: <h4><a name="sectd3132">Choice, Schema, and Unit</a></h4>
1.1       cvs       728: 
1.30    ! cvs       729: <p>The <em>choice</em> constructor is used to define the structure of an
        !           730: element type for which one alternative is chosen from several possibilities.
        !           731: Thus, a paragraph can be either a simple text paragraph, or an enumeration, or
        !           732: a citation.</p>
        !           733: 
        !           734: <p>The choice constructor indicates the complete list of possible options,
        !           735: which can be too restrictive in certain cases, the paragraph being one such
        !           736: case. Two constructors, <em>unit</em> and <em>schema</em>, address this
1.1       cvs       737: inconvenience.  They allow more freedom in the choice of an element type.  If
                    738: a paragraph is defined by a schema constructor, it is possible to put in the
                    739: place of a paragraph a table, an equation, a drawing or any other object
                    740: defined by another generic logical structure.  It is also possible to define a
                    741: paragraph as a sequence of units, which could be character strings, symbols,
1.2       cvs       742: or pictures.  The choice constructor alone defines a generic logical structure
1.1       cvs       743: that is relatively constrained; in contrast, using units and schemas, a very
1.18      cvs       744: open structure can be defined.</p>
1.30    ! cvs       745: 
        !           746: <p>The <em>schema</em> constructor represents an object defined by a generic
1.18      cvs       747: logical structure chosen freely from among those available.</p>
1.30    ! cvs       748: 
        !           749: <p>The <em>unit</em> constructor represents an element whose type can be
        !           750: either a primitive type or an element type defined as a unit in the generic
        !           751: logical structure of the document, or in another generic logical structure
        !           752: used in the document.  Such an element may be used in document objects
        !           753: constructed according to other generic structures.</p>
        !           754: 
        !           755: <p>Thus, for example, if a cross-reference to a footnote is defined in the
1.1       cvs       756: generic logical structure ``Article'' as a unit, a table (an object defined by
                    757: another generic structure) can contain cross-references to footnotes, when
                    758: they appear in an article.  In another type of document, a table defined by
                    759: the same generic structure can contain other types of elements, depending on
                    760: the type of document into which the table is inserted.  All that is needed is
                    761: to declare, in the generic structure for tables, that the contents of cells
                    762: are units.  In this way, the generic structure of objects is divided up
                    763: between different types of documents which are able to adapt themselves to the
1.18      cvs       764: environment into which they are inserted.</p>
                    765: </div>
1.1       cvs       766: 
1.18      cvs       767: <div class="subsubsection">
1.30    ! cvs       768: <h4><a name="sectd3133">Reference and Inclusion</a></h4>
1.1       cvs       769: 
1.30    ! cvs       770: <p>The <em>reference</em> is used to define document elements that are
1.18      cvs       771: cross-references to other elements, such as a section, a chapter, a
                    772: bibliographic citation, or a figure.  The reference is bi-directional.  It can
                    773: be used to access both the element being cross-referenced and each of the
                    774: elements which make use of the cross-reference.</p>
1.30    ! cvs       775: 
        !           776: <p>References can be either <em>internal</em> or <em>external</em>.  That is,
1.1       cvs       777: they can designate elements which appear in the same document or in another
1.18      cvs       778: document.</p>
1.30    ! cvs       779: 
        !           780: <p>The <em><a name="inclusion">inclusion</a></em> constructor is a special
        !           781: type of reference.  Like the reference, it is an internal or external
        !           782: bidirectional link, but it is not a cross-reference.  This link represents the
        !           783: ``live'' inclusion of the designated element; it accesses the most recent
        !           784: version of that element and not a ``dead'' copy, fixed in the state in which
        !           785: it was found at the moment the copy was made.  As soon as an element is
        !           786: modified, all of its inclusions are automatically brought up to date.  It must
        !           787: be noted that, in addition to inclusion, Thot permits the creation of ``dead''
        !           788: copies.</p>
        !           789: 
        !           790: <p>There are three types of inclusions: inclusions with full expansion,
1.1       cvs       791: inclusions with partial expansion, and inclusions without expansion. During
                    792: editing, inclusions without expansion are represented on the screen by the
                    793: name of the included document, in a special color, while inclusions with
                    794: expansion (full or partial) are represented by a copy (full or partial) of the
                    795: included element (also in a special color). The on-screen representation of a
1.18      cvs       796: partial inclusion is a <a href="#sectc3213">``skeleton''</a> image of the
                    797: included document.</p>
1.30    ! cvs       798: 
        !           799: <p>Inclusion with complete expansion can be used to include parts of the same
1.1       cvs       800: document or of other documents.  Thus, it can be either an internal or an
                    801: external link.  It can be used to include certain bibliographic entries of a
                    802: scientific article in another article, or to copy part of a mathematical
                    803: formula into another formula of the same document, thus assuring that both
1.18      cvs       804: copies will remain synchronized.</p>
1.30    ! cvs       805: 
        !           806: <p>Inclusion without expansion or with partial expansion is used to include
1.1       cvs       807: complete documents.  It is always an external link.  It is used primarily to
                    808: divide very large documents into sub-documents that are easier to manipulate,
                    809: especially when there are many authors.  So, a book can include some chapters,
                    810: where each chapter is a different document which can be edited separately.
                    811: When viewing the book on the screen, it might be desirable to see only the
                    812: titles of the chapters and sections.  This can be achieved using inclusion
1.18      cvs       813: with partial expansion.</p>
1.30    ! cvs       814: 
        !           815: <p>During printing, inclusions without expansion or with partial expansion can
        !           816: be represented either as they were shown on the screen or by a complete (and
1.18      cvs       817: up-to-date) copy of the included element or document.</p>
1.30    ! cvs       818: 
        !           819: <p>The inclusion constructor, whatever its type, respects the generic
        !           820: structure: only those elements authorized by the generic structure can be
        !           821: included at a given position in a document.</p>
1.18      cvs       822: </div>
1.1       cvs       823: 
1.18      cvs       824: <div class="subsubsection">
1.30    ! cvs       825: <h4><a name="sectd3134">Mark pairs</a></h4>
1.1       cvs       826: 
1.30    ! cvs       827: <p>It is often useful to delimit certain parts of a document independently
        !           828: from the logical structure.  For example, one might wish to attach some
        !           829: information (in the form of an <a href="#sectc315">attribute</a>) or a
        !           830: particular treatment to a group of words or a set of consecutive paragraphs.
        !           831: <em>Mark pairs</em> are used to do this.</p>
        !           832: 
        !           833: <p>Mark pairs are elements which are always paired and are terminals in the
1.1       cvs       834: logical structure of the document.  Their position in the structure of the
                    835: document is defined in the generic structure.  It is important to note that
1.18      cvs       836: when the terminals of a mark pair are <em>extensions</em> (see the next
                    837: section), they can be used quite freely.</p>
                    838: </div>
1.1       cvs       839: 
1.18      cvs       840: <div class="subsubsection">
1.30    ! cvs       841: <h4><a name="sectd3135">Restrictions and Extensions</a></h4>
1.1       cvs       842: 
1.30    ! cvs       843: <p>The primitive types and the constructors presented so far permit the
1.1       cvs       844: definition of the logical structure of documents and objects in a rigorous
                    845: way.  But this definition can be very cumbersome in certain cases, notably
                    846: when trying to constrain or extend the authorized element types in a
1.18      cvs       847: particular context.  <em>Restrictions</em> and <em>extensions</em> are used to
                    848: cope with these cases.</p>
1.30    ! cvs       849: 
        !           850: <p>A restriction associates with a particular element type <em>A</em>, a list
        !           851: of those element types which elements of type <em>A</em> may not contain, even
        !           852: if the definition of type <em>A</em> and those of its components authorize
        !           853: them otherwise.  This simplifies the writing of generic logical structures and
1.1       cvs       854: allows limitations to be placed, when necessary, on the choices offered by the
1.18      cvs       855: schema and unit constructors.</p>
1.30    ! cvs       856: 
        !           857: <p>Extensions are the inverse of restrictions.  They identify a list of
        !           858: element types whose presence <em>is</em> permitted, even if its definition and
        !           859: those of its components do not authorize them otherwise.</p>
1.18      cvs       860: </div>
                    861: 
                    862: <div class="subsubsection">
1.30    ! cvs       863: <h4><a name="sectd3136">Summary</a></h4>
1.18      cvs       864: 
1.30    ! cvs       865: <p>Thus, four constructors are used to construct a document:</p>
1.18      cvs       866: <ul>
1.30    ! cvs       867:   <li>the aggregate constructor (ordered or not),</li>
        !           868:   <li>the list constructor,</li>
        !           869:   <li>the choice constructor and its extensions, the unit and schema
        !           870:     constructors,</li>
        !           871:   <li>the reference constructor and its variant, the inclusion.</li>
        !           872: </ul>
        !           873: 
        !           874: <p>These constructors are also sufficient for objects.  Thus, these
        !           875: constructors provide a homogenous meta-model which can describe both the
        !           876: organization of the document as a whole and that of the various types of
        !           877: objects which it contains.  After presenting the description language for
        !           878: generic structures, we will present several examples which illustrate the
        !           879: appropriateness of the model.</p>
        !           880: 
        !           881: <p>The first three constructors (aggregate, list and choice) lead to tree-like
1.1       cvs       882: structures for documents and objects, the objects being simply the subtrees of
                    883: the tree of a document (or even of other objects' subtrees).  The reference
                    884: constructor introduces other, non-hierarchical, relations which augment those
                    885: of the tree: when a paragraph makes reference to a chapter or a section, that
                    886: relation leaves the purely tree-like structure.  Moreover,  external reference
                    887: and inclusion constructors permit the establishment of links between different
1.18      cvs       888: documents, thus creating a hypertext structure.</p>
                    889: </div>
                    890: </div>
1.1       cvs       891: 
1.18      cvs       892: <div class="subsection">
1.30    ! cvs       893: <h3><a name="sectc314">Associated Elements</a></h3>
1.1       cvs       894: 
1.30    ! cvs       895: <p>Thanks to the list, aggregate and choice constructors, the organization of
        !           896: the document is specified rigorously, using constructed and primitive
        !           897: elements. But a document is made up of more than just its elements; it clearly
        !           898: also contains links between them.  There exist elements whose position in the
1.1       cvs       899: document's structure is not determinable.  This is notably the case for
                    900: figures and notes.  A figure can be designated at many points in the same
                    901: document and its place in the physical document can vary over the life of the
                    902: document without any effect on the meaning or clarity of the document.  At one
                    903: time, it can be placed at the end of the document along with all other
                    904: figures.  At another time, it can appear at the top of the page which follows
                    905: the first mention of the figure.  The figures can be dispersed throughout the
                    906: document or can be grouped together.  The situation is similar for notes,
                    907: which can be printed at the bottom of the page on which they are mentioned or
                    908: assembled together at the end of the chapter or even the end of the work.  Of
                    909: course, this brings up questions of the physical position of elements in
                    910: documents that are broken into pages, but this reflects the structural
                    911: instability of these elements.  They cannot be treated the same way as
                    912: elements like paragraphs or sections, whose position in the structure is
1.18      cvs       913: directly linked to the semantics of the document.</p>
1.30    ! cvs       914: 
        !           915: <p>Those elements whose position in the structure of the document is not
        !           916: fixed, even though they are definitely part of the document, are called
1.18      cvs       917: <em>associated elements</em>.  Associated elements are themselves structures,
1.1       cvs       918: which is to say that their content can be organized logically by the
1.18      cvs       919: constructors from primitive and constructed elements.</p>
1.30    ! cvs       920: 
        !           921: <p>It can happen that the associated elements are totally disconnected from
        !           922: the structure of the document, as in a commentary or appraisal of the entire
        !           923: work. But more often, the associated elements are linked to the content of the
1.1       cvs       924: document by references.  This is generally the case for notes and figures,
1.18      cvs       925: among others.</p>
1.30    ! cvs       926: 
        !           927: <p>Thus, associated elements introduce a new use for the reference
        !           928: constructor. It not only serves to create links between elements of the
        !           929: principal structure of the document, but also serves to link the associated
        !           930: elements to the primary structure.</p>
1.18      cvs       931: </div>
1.1       cvs       932: 
1.18      cvs       933: <div class="subsection">
1.30    ! cvs       934: <h3><a name="sectc315">Attributes</a></h3>
1.1       cvs       935: 
1.30    ! cvs       936: <p>There remain logical aspects of documents that are not entirely described
        !           937: by the structure.  Certain types of semantic information, which are not stated
1.1       cvs       938: explicitly in the text, must also be taken into account.  In particular, such
                    939: information is shown by typographic effects which do not correspond to a
                    940: change between structural elements.  In fact, certain titles are set in bold
                    941: or italic or are printed in a different typeface from the rest of the text in
                    942: order to mark them as structurally distinct.  But these same effects
                    943: frequently appear in the middle of continuous text (e.g. in the interior of a
                    944: paragraph).  In this case, there is no change between structural elements; the
                    945: effect serves to highlight a word, expression, or phrase.  The notion of an
1.18      cvs       946: <em>attribute</em> is used to express this type of information.</p>
1.30    ! cvs       947: 
        !           948: <p>An attribute is a piece of information attached to a structural element
        !           949: which augments the type of the element and clarifies its function in the
        !           950: document. Keywords, foreign language words, and titles of other works can all
        !           951: be represented by character strings with attached attributes.  Attributes may
1.1       cvs       952: also be attached to constructed elements.  Thus, an attribute indicating the
                    953: language can be attached to a single word or to a large part of a
1.18      cvs       954: document.</p>
1.30    ! cvs       955: 
        !           956: <p>In fact, an attribute can be any piece of information which is linked to a
1.1       cvs       957: part of a document and which can be used by agents which work on the document.
                    958: For example, the language in which the document is written determines the set
                    959: of characters used by an editor or formatter.  It also determines the
                    960: algorithm or hyphenation dictionary to be used.  The attribute ``keyword''
                    961: facilitates the work of an information retrieval system.  The attribute
                    962: ``index word'' allows a formatter to automatically construct an index at the
1.18      cvs       963: end of the document.</p>
1.30    ! cvs       964: 
        !           965: <p>As with the types of constructed elements, the attributes and the values
        !           966: they can take are defined separately in each generic logical structure, not in
        !           967: the meta-model, according to the needs of the document class or the nature of
        !           968: the object.</p>
        !           969: 
        !           970: <p>Many types of attributes are offered: numeric, textual, references, and
1.18      cvs       971: enumerations:</p>
                    972: <ul>
1.30    ! cvs       973:   <li><em>Numeric attributes</em> can take integer values (negative, positive,
        !           974:     or null).</li>
        !           975:   <li><em>Textual attributes</em> have as their values character strings.</li>
        !           976:   <li><em>Reference attributes</em> designate an element of the logical
        !           977:     structure.</li>
        !           978:   <li><em>Enumeration attributes</em> can take one value from a limited list
        !           979:     of possible values, each value being a name.</li>
1.18      cvs       980: </ul>
1.30    ! cvs       981: 
        !           982: <p>In a generic structure, there is a distinction between <em>global
1.18      cvs       983: attributes</em> and <em>local attributes</em>.  A global attribute can be
1.1       cvs       984: applied to every element type defined in the generic structure where it is
                    985: specified.  In contrast, a local attribute can only be applied to certain
                    986: types of elements, even only a single type.  The ``language'' attribute
                    987: presented above is an example of a global attribute.  An example of a local
                    988: attribute is the rank of an author (principal author of the document or
                    989: secondary author): this attribute can only be applied sensibly to an element
1.18      cvs       990: of the ``author'' type.</p>
1.30    ! cvs       991: 
        !           992: <p>Attributes can be assigned to the elements which make up the document in
        !           993: many different ways.  The author can freely and dynamically place them on any
        !           994: part of the document in order to attach supplementary information of his/her
1.18      cvs       995: choice. However, attributes may only be assigned in accordance with the rules
                    996: of the generic structure; in particular, local attributes can only be assigned
                    997: to those element types for which they are defined.</p>
1.30    ! cvs       998: 
        !           999: <p>In the generic structure, certain local attributes can be made mandatory
        !          1000: for certain element types.  In this case, Thot automatically associates the
1.2       cvs      1001: attribute with the elements of this type and it requires the user to provide a
1.18      cvs      1002: value for this attribute.</p>
1.30    ! cvs      1003: 
        !          1004: <p>Attributes can also be automatically assigned, with a given value, by every
1.1       cvs      1005: application processing the document in order to systematically add a piece of
                   1006: information to certain predefined elements of the document.  By way of
                   1007: example, in a report containing a French abstract and an English abstract,
                   1008: each of the two abstracts is defined as a sequence of paragraphs.  The first
                   1009: abstract has a value of ``French'' for the ``language'' attribute while the
1.18      cvs      1010: second abstract's ``language'' attribute has a value of ``English''.</p>
1.30    ! cvs      1011: 
        !          1012: <p>In the case of mark pairs, attributes are logically associated with the
        !          1013: pair as a whole, but are actually attached to the first mark.</p>
1.18      cvs      1014: </div>
1.1       cvs      1015: 
1.18      cvs      1016: <div class="subsection">
1.30    ! cvs      1017: <h3><a name="sectc316">Discussion of the model</a></h3>
1.1       cvs      1018: 
1.30    ! cvs      1019: <p>The notions of attribute, constructor, structured element, and associated
1.1       cvs      1020: element are used in the definition of generic logical structures of documents
                   1021: and objects.  The problem is to assemble them to form generic structures.  In
                   1022: fact, many types of elements and attributes can be found in a variety of
                   1023: generic structures.  Rather than redefine them for each structure in which
                   1024: they appear, it is best to share them between structures. The object classes
                   1025: already fill this sharing function.  If a mathematical class is defined, its
                   1026: formulas can be used in many different document classes, without redefining
                   1027: the structure of each class.  This problem arises not only for the objects
                   1028: considered here; it also arises for the commonplace textual elements found in
                   1029: many document classes.  This is the reason why the notion of object is so
                   1030: broad and why paragraphs and enumerations are also considered to be objects.
                   1031: These object classes not only permit the sharing of the structures of
1.18      cvs      1032: elements, but also of the attributes defined in the generic structures.</p>
1.30    ! cvs      1033: 
        !          1034: <p>Structure, such as that presented here, can appear very rigid, and it is
1.1       cvs      1035: possible to imagine that a document editing system based on this model could
                   1036: prove very constraining to the user.  This is, in fact, a common criticism of
                   1037: syntax-directed editors.  This defect can be avoided with Thot, primarily for
1.18      cvs      1038: three reasons:</p>
                   1039: <ul>
1.30    ! cvs      1040:   <li>the generic structures are not fixed in the model itself,</li>
        !          1041:   <li>the model takes the dynamics of documents into account,</li>
        !          1042:   <li>the constructors offer great flexibility.</li>
1.18      cvs      1043: </ul>
1.30    ! cvs      1044: 
        !          1045: <p>When the generic structure of a document is not predefined, but rather is
1.1       cvs      1046: constructed specifically for each document class, it can be carefully adapted
                   1047: to the current needs.  In cases where the generic structure is inadequate for
                   1048: a particular document of the class, it is always possible either to create a
                   1049: new class with a generic structure well suited to the new case or to extend
                   1050: the generic structure of the existing class to take into account the specifics
                   1051: of the document which poses the problem.  These two solutions can also be
1.18      cvs      1052: applied to objects whose structures prove to be poorly designed.</p>
1.30    ! cvs      1053: 
        !          1054: <p>The model is sufficiently flexible to take into account all the phases of
        !          1055: the life of the document.  When a generic structure specifies that a report
        !          1056: must contain a title, an abstract, an introduction, at least two chapters, and
        !          1057: a conclusion, this means only that a report, <em>upon completion</em>, will
        !          1058: have to contain all of these elements.  When the author begins writing, none
        !          1059: of these elements is present.  Thot uses this model.  Therefore, it tolerates
1.2       cvs      1060: documents which do not conform strictly to the generic structure of their
                   1061: class;  it also considers the generic logical structure to be a way of helping
1.18      cvs      1062: the user in the construction of a complex document.</p>
1.30    ! cvs      1063: 
        !          1064: <p>In contrast, other applications may reject a document which does not
        !          1065: conform strictly to its generic structure.  This is, for example, what is done
        !          1066: by compilers which refuse to generate code for a program which is not
1.1       cvs      1067: syntactically correct.  This might also occur when using a document
1.18      cvs      1068: application for a report which does not have an abstract or title.</p>
1.30    ! cvs      1069: 
        !          1070: <p>The constructors of the document model bring a great flexibility to the
1.1       cvs      1071: generic structures.  A choice constructor (and even more, a unit or schema
                   1072: constructor)  can represent several, very different elements. The list
                   1073: constructor permits the addition of more elements of the same type.  Used
                   1074: together, these two constructors permit any series of elements of different
                   1075: types.  Of course, this flexibility can be reduced wherever necessary since a
                   1076: generic structure can limit the choices or the number of elements in a
1.18      cvs      1077: list.</p>
1.30    ! cvs      1078: 
        !          1079: <p>Another difficulty linked to the use of structure in the document model
1.1       cvs      1080: resides in the choice of the level of the structure.  The structure of a
                   1081: discussion could be extracted from the text itself via linguistic analysis.
                   1082: Some studies are exploring this approach, but the model of Thot excludes this
                   1083: type of structure.  It only takes into account the logical structure provided
1.18      cvs      1084: explicitly by the author.</p>
1.30    ! cvs      1085: 
        !          1086: <p>However, the level of structure of the model is not imposed.  Each generic
1.1       cvs      1087: structure defines its own level of structure, adapted to the document class or
                   1088: object and to the ways in which it will be processed.  If it will only be
                   1089: edited and printed, a  relatively simple structure suffices.  If more
                   1090: specialized processing will be applied to it, the structure must represent the
                   1091: element types on which this processing must act.  By way of example, a simple
                   1092: structure is sufficient for printing formulas, but a more complex structure is
                   1093: required to perform symbolic or numeric calculations on the mathematical
1.18      cvs      1094: expressions.  The document model of Thot allows both types of structure.</p>
                   1095: </div>
                   1096: </div>
1.1       cvs      1097: 
1.18      cvs      1098: <div class="section">
1.30    ! cvs      1099: <h2><a name="sectb32">The definition language for generic structures</a></h2>
1.1       cvs      1100: 
1.30    ! cvs      1101: <p>Generic structures, which form the basis of the document model of Thot, are
1.1       cvs      1102: specified using a special language.  This definition language, called S, is
1.18      cvs      1103: described in this section.</p>
1.30    ! cvs      1104: 
        !          1105: <p>Each generic structure, which defines a class of documents or objects, is
1.2       cvs      1106: specified by a file, written in the S language, which is called a
1.18      cvs      1107: <em>structure schema</em>.  Structure schemas are compiled into tables, called
                   1108: structure tables, which are used by Thot and which determine its behavior.</p>
1.1       cvs      1109: 
1.18      cvs      1110: <div class="subsection">
1.30    ! cvs      1111: <h3><a name="sectc321">Writing Conventions</a></h3>
1.1       cvs      1112: 
1.30    ! cvs      1113: <p>The grammar of S, like those of the languages P and T presented later, is
1.1       cvs      1114: described using the meta-language M, derived from the Backus-Naur Form
1.18      cvs      1115: (BNF).</p>
1.30    ! cvs      1116: 
        !          1117: <p>In this meta-language each rule of the grammar is composed of a grammar
        !          1118: symbol followed by an equals sign (`=') and the right part of the rule.  The
        !          1119: equals sign plays the same role as the traditional `::=' of BNF: it indicates
        !          1120: that the right part defines the symbol of the left part.  In the right
        !          1121: part,</p>
1.18      cvs      1122: <dl>
1.30    ! cvs      1123:   <dt>concatenation</dt>
        !          1124:     <dd>is shown by the juxtaposition of symbols;</dd>
        !          1125:   <dt>character strings</dt>
        !          1126:     <dd>between apostrophes ' represent terminal symbols, that is, keywords in
        !          1127:       the language defined.  Keywords are written here in upper-case letters,
        !          1128:       but can be written in any combination of upper and lower-case letters. 
        !          1129:       For example, the keyword <tt>DEFPRES</tt> of S can also be written as
        !          1130:       <tt>defpres</tt> or <tt>DefPres</tt>.</dd>
        !          1131:   <dt>material between brackets</dt>
        !          1132:     <dd>(`[' and `]') is optional;</dd>
        !          1133:   <dt>material between angle brackets</dt>
        !          1134:     <dd>(`&lt;' and `&gt;') can be repeated many times or omitted;</dd>
        !          1135:   <dt>the slash</dt>
        !          1136:     <dd>(`/') indicates an alternative, a choice between the options separated
        !          1137:       by the slash character;</dd>
        !          1138:   <dt>the period</dt>
        !          1139:     <dd>marks the end of a rule;</dd>
        !          1140:   <dt>text between braces</dt>
        !          1141:     <dd>(`{' and `}') is simply a comment.</dd>
1.18      cvs      1142: </dl>
1.30    ! cvs      1143: 
        !          1144: <p>The M meta-language also uses the concepts of identifiers, strings, and
1.18      cvs      1145: integers:</p>
                   1146: <dl>
1.30    ! cvs      1147:   <dt><tt>NAME</tt></dt>
        !          1148:     <dd>represents an identifier, a sequence of letters (upper or lower-case),
        !          1149:       digits, and underline characters (`_'), beginning with a letter.  Also
        !          1150:       considered a letter is the sequence of characters `<tt>\nnn</tt>' where
        !          1151:       the letter <tt>n</tt> represents the ISO Latin-1 code of the letter in
        !          1152:       octal.  It is thus possible to use accented letters in identifiers.  The
        !          1153:       maximum length of identifiers is fixed by the compiler.  It is normally
        !          1154:       31 characters.
        !          1155:       <p>Unlike keywords, upper and lower-case letters are distinct in
        !          1156:       identifiers. Thus, <tt>Title</tt>, <tt>TITLE</tt>, and <tt>title</tt>
        !          1157:       are considered different identifiers.</p>
        !          1158:     </dd>
        !          1159:   <dt><tt>STRING</tt></dt>
        !          1160:     <dd>represents a string.  This is a string of characters delimited by
        !          1161:       apostrophes. If an apostrophe must appear in a string, it is doubled. 
        !          1162:       As with identifiers, strings can contain characters represented by their
        !          1163:       octal code (after a backslash).  As with apostrophes, if a backslash
        !          1164:       must appear in a string, it is doubled.</dd>
        !          1165:   <dt><tt>NUMBER</tt></dt>
        !          1166:     <dd>represents a positive integer or zero (without a sign), or said
        !          1167:       another way, a sequence of decimal digits.</dd>
1.18      cvs      1168: </dl>
1.30    ! cvs      1169: 
        !          1170: <p>The M language can be used to define itself as follows:</p>
1.18      cvs      1171: <pre>{ Any text between braces is a comment. }
1.30    ! cvs      1172: Grammar      = Rule &lt; Rule &gt; 'END' .
        !          1173:                { The &lt; and &gt; signs indicate zero }
1.1       cvs      1174:                { or more repetitions. }
                   1175:                { END marks the end of the grammar. }
                   1176: Rule         = Ident '=' RightPart '.' .
                   1177:                { The period indicates the end of a rule }
                   1178: RightPart    = RtTerminal / RtIntermed .
                   1179:                { The slash indicates a choice }
                   1180: RtTerminal   ='NAME' / 'STRING' / 'NUMBER' .
                   1181:                { Right part of a terminal rule }
1.30    ! cvs      1182: RtIntermed   = Possibility &lt; '/' Possibility &gt; .
1.1       cvs      1183:                { Right part of an intermediate rule }
1.30    ! cvs      1184: Possibility  = ElemOpt &lt; ElemOpt &gt; .
        !          1185: ElemOpt      = Element / '[' Element &lt; Element &gt; ']' /
        !          1186:               '&lt;' Element &lt; Element &gt; '&gt;'  .
1.1       cvs      1187:                { Brackets delimit optional parts }
                   1188: Element      = Ident / KeyWord .
                   1189: Ident        = NAME .
                   1190:                { Identifier, sequence of characters }
                   1191: KeyWord      = STRING .
                   1192:                { Character string delimited by apostrophes }
1.18      cvs      1193: END</pre>
                   1194: </div>
1.1       cvs      1195: 
1.18      cvs      1196: <div class="subsection">
1.30    ! cvs      1197: <h3><a name="sectc322">Extension schemas</a></h3>
1.1       cvs      1198: 
1.30    ! cvs      1199: <p>A structure schema defines the generic logical structure of a class of
1.1       cvs      1200: documents or objects, independent of the operations which can be performed on
                   1201: the documents.  However, certain applications may require particular
                   1202: information to be represented by the structure for the documents that they
                   1203: operate on.  Thus a document version manager will need to indicate in the
                   1204: document the parts which belong to one version or another.  An indexing system
                   1205: will add highly-structured index tables as well as the links between these
1.18      cvs      1206: tables and the rest of the document.</p>
1.30    ! cvs      1207: 
        !          1208: <p>Thus, many applications need to extend the generic structure of the
        !          1209: documents on which they operate to introduce new attributes, associated
        !          1210: elements or element types.  These additions are specific to each application
        !          1211: and must be able to be applied to any generic structure: users will want to
        !          1212: manage versions or construct indices for many types of documents.  Extension
        !          1213: schemas fulfill this role: they define attributes, elements, associated
        !          1214: elements, units, etc., but they can only be used jointly with a structure
        !          1215: schema that they complete. Otherwise, structure schemas can always be used
        !          1216: without these extensions when the corresponding applications are not
        !          1217: available.</p>
1.18      cvs      1218: </div>
1.1       cvs      1219: 
1.18      cvs      1220: <div class="subsection">
1.30    ! cvs      1221: <h3><a name="sectc323">The general organization of structure schemas</a></h3>
1.1       cvs      1222: 
1.30    ! cvs      1223: <p>Every structure schema begins with the keyword <tt>STRUCTURE</tt> and ends
1.18      cvs      1224: with the keyword <tt>END</tt>.  The keyword <tt>STRUCTURE</tt> is followed by
                   1225: the keyword <tt>EXTENSION</tt> in the case where the schema defines an
1.1       cvs      1226: extension, then by the name of the generic structure which the schema defines
                   1227: (the name of the document or object class).  The name of the structure is
1.18      cvs      1228: followed by a semicolon.</p>
1.30    ! cvs      1229: 
        !          1230: <p>In the case of a complete schema (that is, a schema which is not an
1.1       cvs      1231: extension), the definition of the name of the structure is followed by the
                   1232: declarations of the default presentation schema, the global attributes, the
                   1233: parameters, the structure rules, the associated elements, the units, the
                   1234: skeleton elements and the exceptions.  Only the definition of the structure
                   1235: rules is required.  Each series of declarations begins with a keyword:
1.18      cvs      1236: <tt>DEFPRES</tt>, <tt>ATTR</tt>, <tt>PARAM</tt>, <tt>STRUCT</tt>,
                   1237: <tt>ASSOC</tt>, <tt>UNITS</tt>, <tt>EXPORT</tt>, <tt>EXCEPT</tt>.</p>
1.30    ! cvs      1238: 
        !          1239: <p>In the case of an extension schema, there are neither parameters nor
        !          1240: skeleton elements and the <tt>STRUCT</tt> section is optional, while that
        !          1241: section is required in a schema that is not an extension.  On the other hand,
        !          1242: extension schemas can contain an <tt>EXTENS</tt> section, which must not
        !          1243: appear in a schema which is not an extension; this section defines the
        !          1244: complements to attach to the rules found in the schema to which the extension
        !          1245: will be added. The sections <tt>ATTR</tt>, <tt>STRUCT</tt>, <tt>ASSOC</tt>,
        !          1246: and <tt>UNITS</tt> define new attributes, new elements, new associated
        !          1247: elements, and new units which add their definitions to the principal
        !          1248: schema.</p>
1.18      cvs      1249: <pre>     StructSchema ='STRUCTURE' ElemID ';'
1.1       cvs      1250:                    'DEFPRES' PresID ';'
                   1251:                  [ 'ATTR' AttrSeq ]
                   1252:                  [ 'PARAM' RulesSeq ]
                   1253:                    'STRUCT' RulesSeq
                   1254:                  [ 'ASSOC' RulesSeq ]
                   1255:                  [ 'UNITS' RulesSeq ]
                   1256:                  [ 'EXPORT' SkeletonSeq ]
                   1257:                  [ 'EXCEPT' ExceptSeq ]
                   1258:                    'END' .
1.18      cvs      1259:      ElemID       = NAME .</pre>
1.30    ! cvs      1260: 
        !          1261: <p>or</p>
1.18      cvs      1262: <pre>     ExtensSchema ='STRUCTURE' 'EXTENSION' ElemID ';'
1.1       cvs      1263:                    'DEFPRES' PresID ';'
                   1264:                  [ 'ATTR' AttrSeq ]
                   1265:                  [ 'STRUCT' RulesSeq ]
                   1266:                  [ 'EXTENS' ExtensRuleSeq ]
                   1267:                  [ 'ASSOC' RulesSeq ]
                   1268:                  [ 'UNITS' RulesSeq ]
                   1269:                  [ 'EXCEPT' ExceptSeq ]
                   1270:                    'END' .
1.18      cvs      1271:      ElemID       = NAME .</pre>
                   1272: </div>
1.1       cvs      1273: 
1.18      cvs      1274: <div class="subsection">
1.30    ! cvs      1275: <h3><a name="sectc324">The default presentation</a></h3>
1.1       cvs      1276: 
1.30    ! cvs      1277: <p>It was shown <a href="#mulpres">above</a> that many different presentations
1.1       cvs      1278: are possible for documents and objects of the same class.  The structure
1.18      cvs      1279: schema defines a preferred presentation for the class, called the <em>default
                   1280: presentation</em>.  Like generic structures, presentations are described by
                   1281: programs, called <em>presentation schemas</em>, which are written in a
                   1282: specific language, P, presented <a href="#sectb42">later</a> in this document.
                   1283: The name appearing after the keyword <tt>DEFPRES</tt> is the name of the
1.2       cvs      1284: default presentation schema.  When a new document is created, Thot will use
                   1285: this presentation schema by default, but the user remains free to choose
1.18      cvs      1286: another if s/he wishes.</p>
                   1287: <pre>     PresID = NAME .</pre>
                   1288: </div>
1.1       cvs      1289: 
1.18      cvs      1290: <div class="subsection">
1.30    ! cvs      1291: <h3><a name="sectc325">Global Attributes</a></h3>
1.1       cvs      1292: 
1.30    ! cvs      1293: <p>If the generic structure includes global attributes of its own, they are
1.18      cvs      1294: declared after the keyword <tt>ATTR</tt>.  Each global attribute is defined by
1.1       cvs      1295: its name, followed by an equals sign and the definition of its type.  The
1.18      cvs      1296: declaration of a global attribute is terminated by a semi-colon.</p>
1.30    ! cvs      1297: 
        !          1298: <p>For attributes of the numeric, textual, or reference types, the type is
1.18      cvs      1299: indicated by a keyword, <tt>INTEGER</tt>, <tt>TEXT</tt>, or <tt>REFERENCE</tt>
                   1300: respectively.</p>
1.30    ! cvs      1301: 
        !          1302: <p>In the case of a reference attribute, the keyword <tt>REFERENCE</tt> is
1.1       cvs      1303: followed by the type of the referenced element in parentheses.  It can refer
1.18      cvs      1304: to any type at all, specified by using the keyword <tt>ANY</tt>, or to a
1.1       cvs      1305: specific type.  In the latter case, the element type designated by the
1.18      cvs      1306: reference can be defined either in the <a href="#sectc327"><tt>STRUCT</tt>
                   1307: section</a> of the same structure schema or in the <tt>STRUCT</tt> section of
1.1       cvs      1308: another structure schema.  When the type is defined in another schema, the
                   1309: element type is followed by the name of the structure schema (within
                   1310: parentheses) in which it is defined.  The name of the designated element type
1.18      cvs      1311: can be preceded by the keyword <tt>First</tt> or <tt>Second</tt>, but only in
                   1312: the case where the type is defined as <a href="#sectd3285">a pair</a>.  These
1.1       cvs      1313: keywords indicate whether the attribute must designate the first mark of the
                   1314: pair or the second.  If the reference refers to a pair and neither of these
1.18      cvs      1315: two keywords is present, then the first mark is used.</p>
1.30    ! cvs      1316: 
        !          1317: <p>In the case of an enumeration attribute, the equals sign is followed by the
1.1       cvs      1318: list of names representing the possible values of the attribute, the names
                   1319: being separated from each other by commas.  An enumeration attribute has at
                   1320: least one possible value; the maximum number of values is defined by the
1.18      cvs      1321: compiler for the S language.</p>
1.30    ! cvs      1322: <pre>     AttrSeq   = Attribute &lt; Attribute &gt; .
1.1       cvs      1323:      Attribute = AttrID '=' AttrType  ';' .
                   1324:      AttrType  = 'INTEGER' / 'TEXT' /
                   1325:                  'REFERENCE' '(' RefType ')' /
                   1326:                  ValueSeq .
                   1327:      RefType   = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] .
                   1328:      FirstSec  = 'First' / 'Second' .
                   1329:      ExtStruct = '(' ElemID ')' .
1.30    ! cvs      1330:      ValueSeq  = AttrVal &lt; ',' AttrVal &gt; .
1.1       cvs      1331:      AttrID    = NAME .
1.18      cvs      1332:      AttrVal   = NAME .</pre>
1.30    ! cvs      1333: 
        !          1334: <p>There is a predefined global text attribute, the <em>language</em>, which
        !          1335: is automatically added to every Thot structure schema.  This attribute allows
1.2       cvs      1336: Thot to perform certain actions, such as hyphenation and spell-checking, which
                   1337: cannot be performed without knowing the language in which each part of the
                   1338: document is written.  This attribute can be used just like any explicitly
1.18      cvs      1339: declared attribute: the system acts as if every structure schema contains</p>
                   1340: <pre>ATTR
                   1341:    Language = TEXT;</pre>
1.30    ! cvs      1342: 
1.18      cvs      1343: <blockquote class="example">
1.30    ! cvs      1344:   <p><strong>Example:</strong></p>
        !          1345: 
        !          1346:   <p>The following specification defines the global enumeration attribute
        !          1347:   WordType.</p>
        !          1348:   <pre>ATTR
1.18      cvs      1349:    WordType = Definition, IndexWord, DocumentTitle;</pre>
                   1350: </blockquote>
                   1351: </div>
1.1       cvs      1352: 
1.18      cvs      1353: <div class="subsection">
1.30    ! cvs      1354: <h3><a name="sectc326">Parameters</a></h3>
1.1       cvs      1355: 
1.30    ! cvs      1356: <p>A parameter is a document element which can appear many times in the
        !          1357: document, but always has the same value.  This value can only be modified in a
1.1       cvs      1358: controlled way by certain applications.  For example, in an advertising
                   1359: circular, the name of the recipient may appear in the address part and in the
                   1360: text of the circular.  If the recipient's name were a parameter, it might only
1.18      cvs      1361: be able to be changed by a ``mail-merge'' application.</p>
1.30    ! cvs      1362: 
        !          1363: <p>Parameters are not needed for every document class, but if the schema
        !          1364: includes parameters they are declared after the keyword <tt>PARAM</tt>. Each
        !          1365: parameter declaration is made in the same way as a <a
        !          1366: href="#sectc327">structure element declaration</a>.</p>
        !          1367: 
        !          1368: <p>During editing, Thot permits the insertion of parameters wherever the
1.1       cvs      1369: structure schema allows; it also permits the removal of parameters which are
                   1370: already in the document but does not allow the modification of the parameter's
1.2       cvs      1371: content in any way.  The content is generated automatically by Thot during the
                   1372: creation of the parameter, based on the value of the parameter in the
1.18      cvs      1373: document.</p>
                   1374: </div>
1.1       cvs      1375: 
1.18      cvs      1376: <div class="subsection">
1.30    ! cvs      1377: <h3><a name="sectc327">Structured elements</a></h3>
1.1       cvs      1378: 
1.30    ! cvs      1379: <p>The rules for defining structured elements are required, except in an
1.1       cvs      1380: extension schema: they constitute the core of a structure schema, since they
                   1381: define the structure of the different types of elements that occur in a
1.18      cvs      1382: document or object of the class defined by the schema.</p>
1.30    ! cvs      1383: 
        !          1384: <p>The first structure rule after the keyword <tt>STRUCT</tt> must define the
1.1       cvs      1385: structure of the class whose name appears in the first instruction
1.18      cvs      1386: (<tt>STRUCTURE</tt>) of the schema.  This is the root rule of the schema,
                   1387: defining the root of the document tree or object tree.</p>
1.30    ! cvs      1388: 
        !          1389: <p>The remaining rules may be placed in any order, since the language permits
        !          1390: the definition of element types before or after their use, or even in the same
1.1       cvs      1391: instruction in which they are used.  This last case allows the definition of
1.18      cvs      1392: recursive structures.</p>
1.30    ! cvs      1393: 
        !          1394: <p>Each rule is composed of a name (the name of the element type whose
        !          1395: structure is being defined) followed by an equals sign and a structure
        !          1396: definition.</p>
        !          1397: 
        !          1398: <p>If any local attributes are associated with the element type defined by the
1.2       cvs      1399: rule, they appear between parentheses after the type name and before the
1.18      cvs      1400: equals sign.  The parentheses contain, first, the keyword <tt>ATTR</tt>, then
1.2       cvs      1401: the list of local attributes, separated by commas.  Each local attribute is
                   1402: composed of the name of the attribute followed by an equals sign and the
1.18      cvs      1403: definition of the attribute's type, just as in the definition of <a
                   1404: href="#sectc325">global attributes</a>.  The name of the attribute can be
1.2       cvs      1405: preceded by an exclamation point to indicate that the attribute must always be
                   1406: present for this element type.  The same attribute, identified by its name,
                   1407: can be defined  as a local attribute for multiple element types.  In this
                   1408: case, the equals sign and definition of the attribute type need only appear in
                   1409: the first occurrence of the attribute.  It should be noted that global
1.18      cvs      1410: attributes cannot also be defined as local attributes.</p>
1.30    ! cvs      1411: 
        !          1412: <p>If any <a href="#sectd3135">extensions</a> are defined for this element
        !          1413: type, a plus sign follows the structure definition and the names of the
        !          1414: extension element types appear between parentheses after the plus.  If there
        !          1415: are multiple extensions, they are separated by commas.  These types can either
        !          1416: be defined in the same schema, defined in other schemas, or they may be base
1.18      cvs      1417: types identified by the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>,
                   1418: <tt>SYMBOL</tt>, or <tt>PICTURE</tt>.</p>
1.30    ! cvs      1419: 
        !          1420: <p><a href="#sectd3135">Restrictions</a> are indicated in the same manner as
1.18      cvs      1421: extensions, but they are introduced by a minus sign and they come after the
                   1422: extensions, or if there are no extensions, after the structure definition.</p>
1.30    ! cvs      1423: 
        !          1424: <p>If the values of attributes must be attached systematically to this element
1.18      cvs      1425: type, they are introduced by the keyword <tt>WITH</tt> and declared in the
1.1       cvs      1426: form of a list of fixed-value attributes.  When such definitions of fixed
1.18      cvs      1427: attribute values appear, they are always the last part of the rule.</p>
1.30    ! cvs      1428: 
        !          1429: <p>The rule is terminated by a semicolon.</p>
        !          1430: <pre>  RuleSeq       = Rule &lt; Rule &gt; .
1.1       cvs      1431:   Rule          = ElemID [ LocAttrSeq ] '=' DefWithAttr ';'.
1.30    ! cvs      1432:   LocAttrSeq    = '(' 'ATTR' LocAttr &lt; ';' LocAttr &gt; ')' .
1.1       cvs      1433:   LocAttr       = [ '!' ] AttrID [ '=' AttrType ] .
                   1434:   DefWithAttr   = Definition
                   1435:                   [ '+' '(' ExtensionSeq ')' ]
                   1436:                   [ '-' '(' RestrictSeq ')' ]
                   1437:                   [ 'WITH' FixedAttrSeq ] .
1.30    ! cvs      1438:   ExtensionSeq  = ExtensionElem &lt; ',' ExtensionElem &gt; .
1.1       cvs      1439:   ExtensionElem = ElemID / 'TEXT' / 'GRAPHICS' /
                   1440:                   'SYMBOL' / 'PICTURE' .
1.30    ! cvs      1441:   RestrictSeq   = RestrictElem &lt; ',' RestrictElem &gt; .
1.1       cvs      1442:   RestrictElem  = ElemID / 'TEXT' / 'GRAPHICS' /
1.18      cvs      1443:                   'SYMBOL' / 'PICTURE' .</pre>
1.30    ! cvs      1444: 
        !          1445: <p>The list of fixed-value attributes is composed of a sequence of
1.1       cvs      1446: attribute-value pairs separated by commas.  Each pair contains the name of the
                   1447: attribute and the fixed value for this element type, the two being separated
                   1448: by an equals sign.  If the sign is preceded by a question mark the given value
                   1449: is only an initial value that may be modified later rather than a value fixed
                   1450: for all time.  Reference attributes are an exception to this norm.  They
                   1451: cannot be assigned a fixed value, but when the name of such an attribute
                   1452: appears this indicates that this element type must have a valid value for the
1.2       cvs      1453: attribute.  For the other attribute types, the fixed value is indicated by a
1.1       cvs      1454: signed integer (numeric attributes), a character string between apostrophes
1.18      cvs      1455: (textual attributes) or the name of a value (enumeration attributes).</p>
1.30    ! cvs      1456: 
        !          1457: <p>Fixed-value attributes can either be <a href="#sectc325">global</a> or
        !          1458: local to the element type for which they are fixed, but they must be declared
        !          1459: before they are used.</p>
        !          1460: <pre>    FixedAttrSeq    = FixedAttr &lt; ',' FixedAttr &gt; .
1.1       cvs      1461:     FixedAttr       = AttrID [ FixedOrModifVal ] .
                   1462:     FixedOrModifVal = [ '?' ] '=' FixedValue .
                   1463:     FixedValue      = [ '-' ] NumValue / TextVal / AttrVal .
                   1464:     NumValue        = NUMBER .
1.18      cvs      1465:     TextVal         = STRING .</pre>
                   1466: </div>
1.1       cvs      1467: 
1.18      cvs      1468: <div class="subsection">
1.30    ! cvs      1469: <h3><a name="sectc328">Structure definitions</a></h3>
1.1       cvs      1470: 
1.30    ! cvs      1471: <p>The structure of an element type can be a simple base type or a constructed
1.18      cvs      1472: type.</p>
1.30    ! cvs      1473: 
        !          1474: <p>For constructed types, it is frequently the case that similar structures
1.1       cvs      1475: appear in many places in a document.  For example the contents of the
                   1476: abstract, of the introduction, and of a section can have the same structure,
                   1477: that of a sequence of paragraphs.  In this case, a single, common structure
                   1478: can be defined (the paragraph sequence in this example), and the schema is
                   1479: written to indicate that each element type possesses this structure, as
1.18      cvs      1480: follows:</p>
                   1481: <pre>     Abstract           = Paragraph_sequence;
1.1       cvs      1482:      Introduction       = Paragraph_sequence;
1.18      cvs      1483:      Section_contents   = Paragraph_sequence;</pre>
1.30    ! cvs      1484: 
        !          1485: <p>The equals sign means ``has the same structure as''.</p>
        !          1486: 
        !          1487: <p>If the element type defined is a simple base type, this is indicated by one
        !          1488: of the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>, <tt>SYMBOL</tt>, or
1.18      cvs      1489: <tt>PICTURE</tt>.  If some local attributes must be associated with a base
1.1       cvs      1490: type, the keyword of the base type is followed by the declaration of the local
1.18      cvs      1491: attributes using the syntax <a href="#sectc327">presented above.</a></p>
1.30    ! cvs      1492: 
        !          1493: <p>In the case of an open choice, the type is indicated by the keyword
1.18      cvs      1494: <tt>UNIT</tt> for units or the keyword <tt>NATURE</tt> for objects having a
                   1495: structure defined by any other schema.</p>
1.30    ! cvs      1496: 
        !          1497: <p>A unit represents one of the two following categories:</p>
1.18      cvs      1498: <ul>
1.30    ! cvs      1499:   <li>a base type: text, graphical element, symbol, picture,</li>
        !          1500:   <li>an element whose type is chosen from among the types defined as units in
        !          1501:     the <tt>UNITS</tt> section of the document's structure schema.  It can
        !          1502:     also be chosen from among the types defined as <a
        !          1503:     href="#sectd3132">units</a> in the <a href="#sectc3212"><tt>UNITS</tt>
        !          1504:     section</a> of the structure schemas that defines the ancestors of the
        !          1505:     element to which the rule is applied.</li>
1.18      cvs      1506: </ul>
1.30    ! cvs      1507: 
        !          1508: <p>Before the creation of an element defined as a unit, Thot asks the user to
1.18      cvs      1509: choose between the categories of elements.</p>
1.30    ! cvs      1510: 
        !          1511: <p>Thus, the contents of a paragraph can be specified as a sequence of units,
1.1       cvs      1512: which will permit the inclusion in the paragraphs of character strings,
                   1513: symbols, and various elements, such as cross-references, if these are defined
1.18      cvs      1514: as units.</p>
1.30    ! cvs      1515: 
        !          1516: <p>A schema object (keyword <tt>NATURE</tt>) represents an object defined by a
1.1       cvs      1517: structure schema freely chosen from among the available schemas; in the case
                   1518: the element type is defined by the first rule (the root rule) of the chosen
1.18      cvs      1519: schema.</p>
1.30    ! cvs      1520: 
        !          1521: <p>If the element type defined is a constructed type, the list, aggregate,
1.1       cvs      1522: choice, and reference constructors are used.  In this case the definition
                   1523: begins with a keyword identifying the constructor.  This keyword is followed
1.18      cvs      1524: by a syntax specific to each constructor.</p>
1.30    ! cvs      1525: 
        !          1526: <p>The local attribute definitions appear after the name of the element type
1.18      cvs      1527: being defined, if this element type has <a href="#sectc327">local
                   1528: attributes</a>.</p>
                   1529: <pre>   Definition = BaseType [ LocAttrSeq ] / Constr / Element .
1.1       cvs      1530:    BaseType   = 'TEXT' / 'GRAPHICS' / 'SYMBOL' / 'PICTURE' /
                   1531:                 'UNIT' / 'NATURE' .
                   1532:    Element    = ElemID [ ExtOrDef ] .
                   1533:    ExtOrDef   = 'EXTERN' / 'INCLUDED' / 
                   1534:                 [ LocAttrSeq ] '=' Definition .
                   1535:    Constr     = 'LIST' [ '[' min '..' max ']' ] 'OF'
                   1536:                        '(' DefWithAttr ')' /
                   1537:                 'BEGIN' DefOptSeq 'END' /
                   1538:                 'AGGREGATE' DefOptSeq 'END' /
                   1539:                 'CASE' 'OF' DefSeq 'END' /
                   1540:                 'REFERENCE' '(' RefType ')' /
1.18      cvs      1541:                 'PAIR' .</pre>
1.1       cvs      1542: 
1.18      cvs      1543: <div class="subsubsection">
1.30    ! cvs      1544: <h4><a name="sectd3281">List</a></h4>
1.1       cvs      1545: 
1.30    ! cvs      1546: <p>The list constructor permits the definition of an element type composed of
        !          1547: a list of elements, all of the same type.  A list definition begins with the
1.18      cvs      1548: <tt>LIST</tt> keyword followed by an optional range, the keyword <tt>OF</tt>,
1.1       cvs      1549: and the definition, between parentheses, of the element type which must
                   1550: compose the list.  The optional range is composed of the minimum and maximum
                   1551: number of elements for the list separated by two periods and enclosed by
                   1552: brackets.  If the range is not present, the number of list elements is
                   1553: unconstrained.  When only one of the two bounds of the range is unconstrained,
                   1554: it is represented by a star ('*') character.  Even when both bounds are
1.18      cvs      1555: unconstrained, they can be specified by <tt>[*..*]</tt>, but it is simpler not
                   1556: to specify any bound.</p>
                   1557: <pre>               'LIST' [ '[' min '..' max ']' ]
1.1       cvs      1558:                'OF' '(' DefWithAttr ')'
                   1559:      min     = Integer / '*' .
                   1560:      max     = Integer / '*' .
1.18      cvs      1561:      Integer = NUMBER .</pre>
1.30    ! cvs      1562: 
        !          1563: <p>Before the document is edited, Thot creates the minimum number of elements
        !          1564: for the list.  If no minimum was given, it creates a single element. If a
        !          1565: maximum number of elements is given and that number is attained, the editor
        !          1566: refuses to create new elements for the list.</p>
        !          1567: 
        !          1568: <blockquote class="example">
        !          1569:   <p><strong>Example:</strong></p>
        !          1570: 
        !          1571:   <p>The following two instructions define the body of a document as a
        !          1572:   sequence of at least two chapters and the contents of a section as a
        !          1573:   sequence of paragraphs.  A single paragraph can be the entire contents of a
        !          1574:   section.</p>
        !          1575:   <pre>Body             = LIST [2..*] OF (Chapter);
1.18      cvs      1576: Section_contents = LIST OF (Paragraph);</pre>
                   1577: </blockquote>
                   1578: </div>
1.1       cvs      1579: 
1.18      cvs      1580: <div class="subsubsection">
1.30    ! cvs      1581: <h4><a name="sectd3282">Aggregate</a></h4>
1.1       cvs      1582: 
1.30    ! cvs      1583: <p>The aggregate constructor is used to define an element type as a collection
        !          1584: of sub-elements, each having a fixed type.  The collection may be ordered or
1.1       cvs      1585: unordered.  The elements composing the collection are called
1.18      cvs      1586: <em>components</em>.  In the definition of an aggregate, a keyword indicates
                   1587: whether or not the aggregate is ordered: <tt>BEGIN</tt> for an ordered
                   1588: aggregate, <tt>AGGREGATE</tt> for an unordered aggregate. This keyword is
1.1       cvs      1589: followed by the list of component type definitions which is terminated by the
1.18      cvs      1590: <tt>END</tt> keyword.  The component type definitions are separated by
                   1591: commas.</p>
1.30    ! cvs      1592: 
        !          1593: <p>Before creating an aggregate, the Thot editor creates all the aggregate's
1.1       cvs      1594: components in the order they appear in the structure schema, even for
                   1595: unordered aggregates.  However, unlike ordered aggregates, the components of
                   1596: an unordered aggregate may be rearranged using operations of the Thot editor.
                   1597: The exceptions to the rule are any components whose name was preceded by a
                   1598: question mark character ('?').  These components, which are optional, can be
                   1599: created by explicit request, possibly at the time the aggregate is created,
1.18      cvs      1600: but they are not created automatically <em>prior</em> to the creation of the
                   1601: aggregate.</p>
                   1602: <pre>                 'BEGIN' DefOptSeq 'END'
1.30    ! cvs      1603:      DefOptSeq = DefOpt ';' &lt; DefOpt ';' &gt; .
1.18      cvs      1604:      DefOpt    = [ '?' ] DefWithAttr .</pre>
1.30    ! cvs      1605: 
1.18      cvs      1606: <blockquote class="example">
1.30    ! cvs      1607:   <p><strong>Example:</strong></p>
        !          1608: 
        !          1609:   <p>In a bilingual document, each paragraph has an English version and a
        !          1610:   French version.  In certain cases, the translator wants to add a marginal
        !          1611:   note, but this note is present in very few paragraphs.  Thus, it must not be
        !          1612:   created systematically for every paragraph.  A bilingual paragraph of this
        !          1613:   type is declared:</p>
        !          1614:   <pre>Bilingual_paragraph = BEGIN
1.1       cvs      1615:                       French_paragraph  = TEXT;
                   1616:                       English_paragraph = TEXT;
                   1617:                       ? Note            = TEXT;
1.18      cvs      1618:                       END;</pre>
                   1619: </blockquote>
                   1620: </div>
1.1       cvs      1621: 
1.18      cvs      1622: <div class="subsubsection">
1.30    ! cvs      1623: <h4><a name="sectd3283">Choice</a></h4>
1.1       cvs      1624: 
1.30    ! cvs      1625: <p>The choice constructor permits the definition of an element type which is
1.18      cvs      1626: chosen from among a set of possible types.  The keywords <tt>CASE</tt> and
                   1627: <tt>OF</tt> are followed by a list of definitions of possible types, which are
                   1628: separated by semicolons and terminated by the <tt>END</tt> keyword.</p>
                   1629: <pre>               'CASE' 'OF' DefSeq 'END'
1.30    ! cvs      1630:      DefSeq = DefWithAttr ';' &lt; DefWithAttr ';' &gt; .</pre>
        !          1631: 
        !          1632: <p>Before the creation of an element defined as a choice, the Thot editor
1.1       cvs      1633: presents the list of possible types for the element to the user.  The user has
1.18      cvs      1634: only to select the element type that s/he wants to create from this list.</p>
1.30    ! cvs      1635: 
        !          1636: <p>The order of the type declarations is important.  It determines the order
        !          1637: of the list presented to the user before the creation of the element.  Also,
        !          1638: when a Choice element is being created automatically, the first type in the
        !          1639: list is used.  In fact, using the Thot editor, when an empty Choice element is
1.1       cvs      1640: selected, it is possible to select this element and to enter its text from
                   1641: keyboard. In this case, the editor uses the first element type which can
1.18      cvs      1642: contain an atom of the character string type.</p>
1.30    ! cvs      1643: 
        !          1644: <p>The two special cases of the choice constructor, the <a
1.18      cvs      1645: href="#sectc328"><em>schema</em></a> and the <a
                   1646: href="#sectc3212"><em>unit</em></a> are discussed elsewhere.</p>
1.30    ! cvs      1647: 
1.18      cvs      1648: <blockquote class="example">
1.30    ! cvs      1649:   <p><strong>Example:</strong></p>
        !          1650: 
        !          1651:   <p>It is common in documents to treat a variety of objects as if they were
        !          1652:   ordinary paragraphs.  Thus, a ``Paragraph'' might actually be composed of a
        !          1653:   block of text (an ordinary paragraph), or a mathematical formula whose
        !          1654:   structure is defined by another structure schema named Math, or a table,
        !          1655:   also defined by another structure schema.  Here is a definition of such a
        !          1656:   paragraph:</p>
        !          1657:   <pre>Paragraph = CASE OF
1.1       cvs      1658:               Simple_text = TEXT;
                   1659:               Formula     = Math;
                   1660:               Table_para  = Table;
1.18      cvs      1661:               END;</pre>
                   1662: </blockquote>
                   1663: </div>
1.1       cvs      1664: 
1.18      cvs      1665: <div class="subsubsection">
1.30    ! cvs      1666: <h4><a name="sectd3284">Reference</a></h4>
1.1       cvs      1667: 
1.30    ! cvs      1668: <p>Like all elements in Thot, references are typed.  An element type defined
        !          1669: as a reference is a cross-reference to an element of some other given type.
        !          1670: The keyword <tt>REFERENCE</tt> is followed by the name of a type enclosed in
1.1       cvs      1671: parentheses.  When the type which is being cross-referenced is defined in
                   1672: another structure schema, the type name is itself followed by the name of the
1.18      cvs      1673: external structure schema in which it is defined.</p>
1.30    ! cvs      1674: 
        !          1675: <p>When the designated element type is a <a href="#sectd3285">mark pair</a>,
        !          1676: it can be preceded by a <tt>FIRST</tt> or <tt>SECOND</tt> keyword.  These
1.18      cvs      1677: keywords indicate whether the reference points to the first or second mark of
                   1678: the pair. If the reference points to a pair and neither of these two keywords
                   1679: is present, the reference is considered to point to the first mark of the
                   1680: pair.</p>
1.30    ! cvs      1681: 
        !          1682: <p>There is an exception to the principle of typed references:  it is possible
        !          1683: to define a reference which designates an element of any type, which can
        !          1684: either be in the same document or another document. In this case, it suffices
        !          1685: to put the keyword <tt>ANY</tt> in the parentheses which indicate the
        !          1686: referenced element type.</p>
1.18      cvs      1687: <pre>             'REFERENCE' '(' RefType ')'
                   1688:    RefType = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] .</pre>
1.30    ! cvs      1689: 
        !          1690: <p>When defining an inclusion, the <tt>REFERENCE</tt> keyword is not used.
1.1       cvs      1691: Inclusions with complete expansion are not declared as such in the structure
                   1692: schemas, since any element defined in a structure schema can be replaced by an
                   1693: element of the same type.  Instead, inclusions without expansion or with
                   1694: partial expansion must be declared explicitly whenever they will include a
                   1695: complete object ( and not a part of an object).  In this case, the object type
                   1696: to be included (that is, the name of its structure schema) is followed by a
1.18      cvs      1697: keyword: <tt>EXTERN</tt> for inclusion without expansion and <tt>INCLUDED</tt>
                   1698: for partial expansion.</p>
1.30    ! cvs      1699: 
        !          1700: <p>Before creating a cross-reference or an inclusion, the Thot editor asks the
1.1       cvs      1701: user to choose, from the document images displayed, the referenced or included
1.18      cvs      1702: element.</p>
1.30    ! cvs      1703: 
1.18      cvs      1704: <blockquote class="example">
1.30    ! cvs      1705:   <p><strong>Example:</strong></p>
        !          1706: 
        !          1707:   <p>If the types Note and Section are defined in the Article structure
        !          1708:   schema, it is possible to define, in the same structure schema, a reference
        !          1709:   to a note and a reference to a section in this manner:</p>
        !          1710:   <pre>Ref_note    = REFERENCE (Note);
1.18      cvs      1711: Ref_section = REFERENCE (Section);</pre>
1.30    ! cvs      1712: 
        !          1713:   <p>It is also possible to define the generic structure of a collection of
        !          1714:   articles, which include (with partial expansion) objects of the Article
        !          1715:   class and which possess an introduction which may include cross-references
        !          1716:   to sections of the included articles.  In the Collection structure schema,
        !          1717:   the definitions are:</p>
        !          1718:   <pre>Collection = BEGIN
1.6       cvs      1719:              Collection_title = TEXT;
                   1720:              Introduction = LIST OF (Elem = CASE OF
1.1       cvs      1721:                                            TEXT;
                   1722:                                            Ref_sect;
                   1723:                                            END);
1.6       cvs      1724:              Body = LIST OF (Article INCLUDED);
                   1725:              END;
1.18      cvs      1726: Ref_sect   = REFERENCE (Section (Article));</pre>
1.30    ! cvs      1727: 
        !          1728:   <p>Here we define a Folder document class which has a title and includes
        !          1729:   documents of different types, particularly Folders:</p>
        !          1730:   <pre>Folder   = BEGIN
1.6       cvs      1731:            Folder_title    = TEXT;
                   1732:            Folder_contents = LIST OF (Document);
                   1733:            END;
1.1       cvs      1734: 
                   1735: Document = CASE OF
                   1736:               Article EXTERN;
                   1737:               Collection EXTERN;
                   1738:               Folder EXTERN;
1.18      cvs      1739:               END;</pre>
1.30    ! cvs      1740: 
        !          1741:   <p>Under this definition, Folder represents either an aggregate which
        !          1742:   contains a folder title and the list of included documents or an included
        !          1743:   folder.  To resolve this ambiguity, in the P language, the placement of a
        !          1744:   star character in front of the type name (here, Folder) indicates an
        !          1745:   included document.</p>
1.18      cvs      1746: </blockquote>
                   1747: </div>
1.1       cvs      1748: 
1.18      cvs      1749: <div class="subsubsection">
1.30    ! cvs      1750: <h4><a name="sectd3285">Mark pairs</a></h4>
1.1       cvs      1751: 
1.30    ! cvs      1752: <p>Like other elements, mark pairs are typed.  The two marks of the pair have
        !          1753: the same type, but there exist two predefined subtypes which apply to all mark
1.18      cvs      1754: pairs: the first mark of the pair (called <tt>First</tt> in the P and T
                   1755: languages) and the second mark (called <tt>Second</tt>).</p>
1.30    ! cvs      1756: 
        !          1757: <p>In the S language, a mark pair is noted simply by the <tt>PAIR</tt>
1.18      cvs      1758: keyword.</p>
1.30    ! cvs      1759: 
        !          1760: <p>In the Thot editor, marks are always moved or destroyed together.  The two
1.1       cvs      1761: marks of a pair have the same identifier, unique within the document, which
1.18      cvs      1762: permits intertwining mark pairs without risk of ambiguity.</p>
                   1763: </div>
                   1764: </div>
1.1       cvs      1765: 
1.18      cvs      1766: <div class="subsection">
1.30    ! cvs      1767: <h3><a name="sectc329">Imports</a></h3>
1.1       cvs      1768: 
1.30    ! cvs      1769: <p>Because of schema constructors, it is possible, before editing a document,
        !          1770: to use classes defined by other structure schemas whenever they are needed. It
        !          1771: is also possible to assign specific document classes to certain element types.
        !          1772: In this case, these classes are simply designated by their name.  In fact, if
        !          1773: a type name is not defined in the structure schema, it is assumed that it
1.18      cvs      1774: specifies a structure defined by another structure schema.</p>
1.30    ! cvs      1775: 
1.18      cvs      1776: <blockquote class="example">
1.30    ! cvs      1777:   <p><strong>Example:</strong></p>
        !          1778: 
        !          1779:   <p>If the types Math and Table don't appear in the left part of a structure
        !          1780:   rule in the schema, the following two rules indicate that a formula has the
        !          1781:   structure of an object defined by the structure schema Math and that a table
        !          1782:   element has the structure of an object defined by the Table schema.</p>
        !          1783:   <pre>Formula    = Math;
1.18      cvs      1784: Table_elem = Table;</pre>
                   1785: </blockquote>
                   1786: </div>
                   1787: 
                   1788: <div class="subsection">
1.30    ! cvs      1789: <h3><a name="sectc3210">Extension rules</a></h3>
1.18      cvs      1790: 
1.30    ! cvs      1791: <p>The <tt>EXTENS</tt> section, which can only appear in an extension schema,
1.1       cvs      1792: defines complements to the rules in the primary schema (i.e. the structure
                   1793: schema to which the extension schema will be applied). More precisely, this
                   1794: section permits the addition to an existing type of local attributes,
1.18      cvs      1795: extensions, restrictions and fixed-value attributes.</p>
1.30    ! cvs      1796: 
        !          1797: <p>These additions can be applied to the root rule of the primary schema,
1.18      cvs      1798: designated by the keyword <tt>Root</tt>, or to any other explicitly named
                   1799: rule.</p>
1.30    ! cvs      1800: 
        !          1801: <p>Extension rules are separated from each other by a semicolon and each
1.18      cvs      1802: extension rule has the same syntax as a <a href="#sectc327">structure
                   1803: rule</a>, but the part which defines the constructor is absent.</p>
1.30    ! cvs      1804: <pre>     ExtenRuleSeq = ExtensRule ';' &lt; ExtensRule ';' &gt; .
1.6       cvs      1805:      ExtensRule   = RootOrElem [ LocAttrSeq ]
                   1806:                     [ '+' '(' ExtensionSeq ')' ]
                   1807:                     [ '-' '(' RestrictSeq ')' ]
                   1808:                     [ 'WITH' FixedAttrSeq ] .
1.18      cvs      1809:      RootOrElem   = 'Root' / ElemID .</pre>
                   1810: </div>
1.1       cvs      1811: 
1.18      cvs      1812: <div class="subsection">
1.30    ! cvs      1813: <h3><a name="sectc3211">Associated elements</a></h3>
1.1       cvs      1814: 
1.30    ! cvs      1815: <p>If associated elements are necessary, they must be declared in a specific
1.18      cvs      1816: section of the structure schema, introduced by the keyword <tt>ASSOC</tt>.
1.1       cvs      1817: Each associated element type is specified like any other structured element.
                   1818: However, these types must not appear in any other element types of the schema,
1.18      cvs      1819: except in <tt>REFERENCE</tt> rules.</p>
                   1820: </div>
1.1       cvs      1821: 
1.18      cvs      1822: <div class="subsection">
1.30    ! cvs      1823: <h3><a name="sectc3212">Units</a></h3>
        !          1824: 
        !          1825: <p>The <tt>UNITS</tt> section of the structure schema contains the
        !          1826: declarations of the element types which can be used in the external objects
        !          1827: making up parts of the document or in objects of the class defined by the
        !          1828: schema.  As with associated elements, these element types are defined just
        !          1829: like other structured element types. They can be used in the other element
        !          1830: types of the schema, but they can also be used in any other rule of the
        !          1831: schema.</p>
        !          1832: 
        !          1833: <blockquote class="example">
        !          1834:   <p><strong>Example:</strong></p>
1.1       cvs      1835: 
1.30    ! cvs      1836:   <p>If references to notes are declared as units:</p>
        !          1837:   <pre>UNITS
1.18      cvs      1838:    Ref_note = REFERENCE (Note);</pre>
1.30    ! cvs      1839: 
        !          1840:   <p>then it is possible to use references to notes in a cell of a table, even
        !          1841:   when <tt>Table</tt> is an external structure schema.  The <tt>Table</tt>
        !          1842:   schema must declare a cell to be a sequence of units, which can then be base
        !          1843:   element types (text, for example) or references to notes in the
        !          1844:   document.</p>
        !          1845:   <pre>Cell = LIST OF (UNITS);</pre>
1.18      cvs      1846: </blockquote>
                   1847: </div>
1.1       cvs      1848: 
1.18      cvs      1849: <div class="subsection">
1.30    ! cvs      1850: <h3><a name="sectc3213">Skeleton elements</a></h3>
1.1       cvs      1851: 
1.30    ! cvs      1852: <p>When editing a document which contains or must contain external references
        !          1853: to several other documents, it may be necessary to load a large number of
1.1       cvs      1854: documents, simply to see the parts designated by the external references of
                   1855: the document while editing, or to access the source of included elements.  In
                   1856: this case, the external documents are not modified and it is only necessary to
                   1857: see the elements of these documents which could be referenced.  Because of
                   1858: this, the editor will suggest that the documents be loaded in ``skeleton''
                   1859: form.  This form contains only the elements of the document explicitly
1.18      cvs      1860: mentioned in the <tt>EXPORT</tt> section of their structure schema and, for
1.1       cvs      1861: these elements, only the part of the contents specified in that section. This
                   1862: form has the advantage of being very compact, thus requiring very few
                   1863: resources from the editor.  This is also the skeleton form which constitutes
1.18      cvs      1864: the expanded form of <a href="#inclusion">inclusions</a> with partial
                   1865: expansion.</p>
1.30    ! cvs      1866: 
        !          1867: <p>Skeleton elements must be declared explicitly in the <tt>EXPORT</tt>
        !          1868: section of the structure schema that defines them.  This section begins with
        !          1869: the keyword <tt>EXPORT</tt> followed by a comma-separated list of the element
1.1       cvs      1870: types which must appear in the skeleton form and ending with a semicolon.
1.18      cvs      1871: These types must have been previously declared in the schema.</p>
1.30    ! cvs      1872: 
        !          1873: <p>For each skeleton element type, the part of the contents which is loaded by
1.1       cvs      1874: the editor, and therefore displayable, can be specified by putting the keyword
1.18      cvs      1875: <tt>WITH</tt> and the name of the contained element type to be loaded after
1.1       cvs      1876: the name of the skeleton element type.  In this case only that named element,
                   1877: among all the elements contained in the exportable element type, will be
1.18      cvs      1878: loaded.  If the <tt>WITH</tt> is absent, the entire contents of the skeleton
1.1       cvs      1879: element will be loaded by the editor.  If instead, it is better that the
                   1880: skeleton form not load the contents of a particular element type, the keyword
1.18      cvs      1881: <tt>WITH</tt> must be followed by the word <tt>Nothing</tt>.</p>
                   1882: <pre>                [ 'EXPORT' SkeletonSeq ]
1.1       cvs      1883: 
1.30    ! cvs      1884:      SkeletonSeq = SkelElem &lt; ',' SkelElem &gt; ';' .
1.1       cvs      1885:      SkelElem    = ElemID [ 'WITH' Contents ] .
1.18      cvs      1886:      Contents    = 'Nothing' / ElemID [ ExtStruct ] .</pre>
1.30    ! cvs      1887: 
1.18      cvs      1888: <blockquote class="example">
1.30    ! cvs      1889:   <p><strong>Example:</strong></p>
        !          1890: 
        !          1891:   <p>Suppose that, in documents of the article class, the element types
        !          1892:   Article_title, Figure, Section, Paragraph, and Biblio should appear in the
        !          1893:   skeleton form in order to make it easier to create external references to
        !          1894:   them from other documents.  When loading an article in its skeleton form,
        !          1895:   all of these element types will be loaded except for paragraphs, but only
        !          1896:   the article title will be loaded in its entirety.  For figures, the caption
        !          1897:   will be loaded, while for sections, the title will be loaded, and for
        !          1898:   bibliographic entries, only the title that they contain will be loaded. 
        !          1899:   Note that bibliographic elements are defined in another structure schema,
        !          1900:   RefBib.  To produce this result, the following declarations should be placed
        !          1901:   in the Article structure schema:</p>
        !          1902:   <pre>EXPORT
1.1       cvs      1903:    Article_title,
1.5       cvs      1904:    Figure With Caption,
1.1       cvs      1905:    Section With Section_title,
                   1906:    Paragraph With Nothing,
1.18      cvs      1907:    Biblio With Biblio_title(RefBib);</pre>
                   1908: </blockquote>
                   1909: </div>
1.1       cvs      1910: 
1.18      cvs      1911: <div class="subsection">
1.30    ! cvs      1912: <h3><a name="sectc3214">Exceptions</a></h3>
1.1       cvs      1913: 
1.30    ! cvs      1914: <p>The behavior of the Thot editor and the actions that it performs are
1.1       cvs      1915: determined by the structure schemas.  These actions are applied to all
                   1916: document and object types in accordance with their generic structure.  For
                   1917: certain object types, such as tables and graphics, these actions are not
                   1918: sufficient or are poorly adapted and some special actions must be added to or
                   1919: substituted for certain standard actions.  These special actions are called
1.18      cvs      1920: <em>exceptions</em>.</p>
1.30    ! cvs      1921: 
        !          1922: <p>Exceptions only inhibit or modify certain standard actions, but they can be
1.18      cvs      1923: used freely in every structure schema.</p>
1.30    ! cvs      1924: 
        !          1925: <p>Each structure schema can contain a section defining exceptions.  It begins
1.18      cvs      1926: with the keyword <tt>EXCEPT</tt> and is composed of a sequence of exception
1.1       cvs      1927: declarations, separated by semicolons.  Each declaration of an exception
                   1928: begins with the name of an element type or attribute followed by a colon. This
                   1929: indicates the element type or attribute to which the following exceptions
1.18      cvs      1930: apply.  When the given element type name is a <a href="#sectd3285">mark
                   1931: pair</a>, and only in this case, the type name can be preceded by the keyword
                   1932: <tt>First</tt> or <tt>Second</tt>, to indicate if the exceptions which follow
1.1       cvs      1933: are associated with the first mark of the pair or the second.  In the absence
1.18      cvs      1934: of this keyword, the first mark is used.</p>
1.30    ! cvs      1935: 
        !          1936: <p>When placed in an <a href="#sectc322">extension schema</a>, the keyword
1.18      cvs      1937: <tt>EXTERN</tt> indicates that the type name which follows is found in the
1.1       cvs      1938: principal schema (the schema being extended by the extension schema).  The
1.18      cvs      1939: exceptions are indicated by a name.  They are separated by semicolons.</p>
                   1940: <pre>                  [ 'EXCEPT' ExceptSeq ]
1.1       cvs      1941: 
1.30    ! cvs      1942:      ExceptSeq     = Except ';' &lt; Except ';' &gt; .
1.1       cvs      1943:      Except        = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr
                   1944:                      ':' ExcValSeq .
                   1945:      ExcTypeOrAttr = ElemID / AttrID .
1.30    ! cvs      1946:      ExcValSeq     = ExcValue &lt; ',' ExcValue &gt; .
1.19      cvs      1947:      ExcValue      ='NoCut' / 'NoCreate' / 'NoHMove' / 
                   1948:                     'NoVMove' / 'NoHResize' / 'NoVResize' /
                   1949:                     'NoMove' / 'NoResize' / 'MoveResize' /
                   1950:                     'NewWidth' / 'NewHeight' / 'NewHPos' /
                   1951:                     'NewVPos' / 'Invisible' /
1.28      cvs      1952:                     'NoSelect' / 'NoSpellCheck' /
1.1       cvs      1953:                     'Hidden' / 'ActiveRef' /
                   1954:                     'ImportLine' / 'ImportParagraph' /
                   1955:                     'NoPaginate' / 'ParagraphBreak' /
1.19      cvs      1956:                     'PageBreak' / 'PageBreakAllowed' / 'PageBreakPlace' /
                   1957:                     'PageBreakRepetition' / 'PageBreakRepBefore' /
1.9       cvs      1958:                     'HighlightChildren' / 'ExtendedSelection' /
1.29      cvs      1959:                     'ReturnCreateNL' / 'ReturnCreateWithin' /
                   1960:                     'IsDraw' / 'IsTable' /
1.19      cvs      1961:                     'IsRow' / 'IsColHead' / 'IsCell' /
                   1962:                     'NewPercentWidth' / 'ColRef' / 'ColSpan' /
                   1963:                     'RowSpan' / 'SaveDocument' / 'Shadow' .</pre>
1.30    ! cvs      1964: 
        !          1965: <p>The following are the available exceptions:</p>
1.18      cvs      1966: <dl>
1.30    ! cvs      1967:   <dt><tt>NoCut</tt></dt>
        !          1968:     <dd>This exception can only be applied to element types.  Elements of a
        !          1969:       type to which this exception is applied cannot be deleted by the
        !          1970:     editor.</dd>
        !          1971:   <dt><tt>NoCreate</tt></dt>
        !          1972:     <dd>This exception can only be applied to element types.  Elements of a
        !          1973:       type to which this exception is applied cannot be created by ordinary
        !          1974:       commands for creating new elements.  These elements are usually created
        !          1975:       by special actions associated with other exceptions.</dd>
        !          1976:   <dt><tt>NoHMove</tt></dt>
        !          1977:     <dd>This exception can only be applied to element types.  Elements of a
        !          1978:       type to which this exception is applied cannot be moved horizontally
        !          1979:       with the mouse. Their children elements cannot be moved either.</dd>
        !          1980:   <dt><tt>NoVMove</tt></dt>
        !          1981:     <dd>This exception can only be applied to element types.  Elements of a
        !          1982:       type to which this exception is applied cannot be moved vertically with
        !          1983:       the mouse. Their children elements cannot be moved either.</dd>
        !          1984:   <dt><tt>NoMove</tt></dt>
        !          1985:     <dd>This exception can only be applied to element types.  Elements of a
        !          1986:       type to which this exception is applied cannot be moved in any direction
        !          1987:       with the mouse.  Their children elements cannot be moved either.</dd>
        !          1988:   <dt><tt>NoHResize</tt></dt>
        !          1989:     <dd>This exception can only be applied to element types.  Elements of a
        !          1990:       type to which this exception is applied cannot be resized horizontally
        !          1991:       with the mouse. Their children elements cannot be resized either.</dd>
        !          1992:   <dt><tt>NoVResize</tt></dt>
        !          1993:     <dd>This exception can only be applied to element types.  Elements of a
        !          1994:       type to which this exception is applied cannot be resized vertically
        !          1995:       with the mouse. Their children elements cannot be resized either.</dd>
        !          1996:   <dt><tt>NoResize</tt></dt>
        !          1997:     <dd>This exception can only be applied to element types.  Elements of a
        !          1998:       type to which this exception is applied cannot be resized in any
        !          1999:       direction with the mouse.  Their children elements cannot be resized
        !          2000:       either.</dd>
        !          2001:   <dt><tt>MoveResize</tt></dt>
        !          2002:     <dd>This exception can only be applied to element types.  Elements of a
        !          2003:       type to which this exception is applied can be moved and resized in any
        !          2004:       direction with the mouse, even if one of their ancestor element has an
        !          2005:       exception that prevents moving or resizing.  Their children elements can
        !          2006:       also be resized or moved.</dd>
        !          2007:   <dt><tt>NewWidth</tt></dt>
        !          2008:     <dd>This exception can only be applied to numeric attributes.  If the
        !          2009:       width of an element which has this attribute is modified with the mouse,
        !          2010:       the value of the new width will be assigned to the attribute.</dd>
        !          2011:   <dt><tt>NewHeight</tt></dt>
        !          2012:     <dd>This exception can only be applied to numeric attributes.  If the
        !          2013:       height of an element which has this attribute is modified with the
        !          2014:       mouse, the value of the new height will be assigned to the
        !          2015:     attribute.</dd>
        !          2016:   <dt><tt>NewHPos</tt></dt>
        !          2017:     <dd>This exception can only be applied to numeric attributes.  If the
        !          2018:       horizontal position of an element which has this attribute is modified
        !          2019:       with the mouse, the value of the new horizontal position will be
        !          2020:       assigned to the attribute.</dd>
        !          2021:   <dt><tt>NewVPos</tt></dt>
        !          2022:     <dd>This exception can only be applied to numeric attributes.  If the
        !          2023:       vertical position of an element which has this attribute is modified
        !          2024:       with the mouse, the value of the new vertical position will be assigned
        !          2025:       to the attribute.</dd>
        !          2026:   <dt><tt>Invisible</tt></dt>
        !          2027:     <dd>This exception can only be applied to attributes, but can be applied
        !          2028:       to all attribute types.  It indicates that the attribute must not be
        !          2029:       seen by the user and that its value must not be changed directly.  This
        !          2030:       exception is usually used when another exception manipulates the value
        !          2031:       of an attribute.</dd>
        !          2032:   <dt><tt>NoSelect</tt></dt>
        !          2033:     <dd>This exception can only be applied to element types.  Elements of a
        !          2034:       type to which this exception is applied cannot  be selected directly
        !          2035:       with the mouse, but they can be selected by other methods provided by
        !          2036:       the editor.</dd>
        !          2037:   <dt>NoSpellCheck</dt>
        !          2038:     <dd>This exception can only be applied to element types.  Elements of a
        !          2039:       type to which this exception is applied are not taken into account by
        !          2040:       the spell checker.</dd>
        !          2041:   <dt><tt>Hidden</tt></dt>
        !          2042:     <dd>This exception can only be applied to element types.  It indicates
        !          2043:       that elements of this type, although present in the document's
        !          2044:       structure, must not be shown to the user of the editor.  In particular,
        !          2045:       the creation menus must not propose this type and the selection message
        !          2046:       must not pick it.</dd>
        !          2047:   <dt><tt>ActiveRef</tt></dt>
        !          2048:     <dd>This exception can only be applied to attributes of the reference
        !          2049:       type.  It indicates that when the user of the editor makes a double
        !          2050:       click on an element which possesses a reference attribute having this
        !          2051:       exception, the element designated by the reference attribute will be
        !          2052:       selected.</dd>
        !          2053:   <dt><tt>ImportLine</tt></dt>
        !          2054:     <dd>This exception can only be applied to element types.  It indicates
        !          2055:       that elements of this type should receive the content of imported text
        !          2056:       files.  An element is created for each line of the imported file.  A
        !          2057:       structure schema cannot contain several exceptions <tt>ImportLine</tt>
        !          2058:       and, if it contains one, it should not contain any exception
        !          2059:       <tt>ImportParagraph</tt>.</dd>
        !          2060:   <dt><tt>ImportParagraph</tt></dt>
        !          2061:     <dd>This exception can only be applied to element types.  It indicates
        !          2062:       that elements of this type should receive the content of imported text
        !          2063:       files.  An element is created for each paragraph of the imported file. 
        !          2064:       A paragraph is a sequence of lines without any empty line.  A structure
        !          2065:       schema cannot contain several exceptions <tt>ImportParagraph</tt> and,
        !          2066:       if it contains one, it should not contain any exception
        !          2067:       <tt>ImportLine</tt>.</dd>
        !          2068:   <dt><tt>NoPaginate</tt></dt>
        !          2069:     <dd>This exception can only be applied to the root element, i.e. the name
        !          2070:       that appear after the keyword <tt>STRUCTURE</tt> at the beginning of the
        !          2071:       structure schema.  It indicates that the editor should not allow the
        !          2072:       user to paginate documents of that type.</dd>
        !          2073:   <dt><tt>ParagraphBreak</tt></dt>
        !          2074:     <dd>This exception can only be applied to element types.  When the caret
        !          2075:       is within an element of a type to which this exception is applied, it is
        !          2076:       that element that will be split when the user hits the Return key.</dd>
        !          2077:   <dt><tt>ReturnCreateNL</tt></dt>
        !          2078:     <dd>This exception can only be applied to element types.  When the caret
        !          2079:       is within an element of a type to which this exception is applied, the
        !          2080:       Return key simply inserts a New line character (code \212) at the
        !          2081:       current position. The Return key does not create a new element; it does
        !          2082:       not split the current element either.</dd>
        !          2083:   <dt><tt>ReturnCreateWithin</tt></dt>
        !          2084:     <dd>This exception can only be applied to element types.  When the caret
        !          2085:       is within an element of a type to which this exception is applied, the
        !          2086:       Return key will create a new element within that element, not a sibling
        !          2087:       after that element.</dd>
        !          2088:   <dt><tt>HighlightChildren</tt></dt>
        !          2089:     <dd>This exception can only be applied to element types.  Elements of a
        !          2090:       type to which this exception is applied are not highlighted themselves
        !          2091:       when they are selected, but all their children are highlighted
        !          2092:     instead.</dd>
        !          2093:   <dt><tt>ExtendedSelection</tt></dt>
        !          2094:     <dd>This exception can only be applied to element types.  The selection
        !          2095:       extension command (middle button of the mouse) only add the clicked
        !          2096:       element (if it has that exception) to the current selection, without
        !          2097:       selecting other elements between the current selection and the clicked
        !          2098:       element.</dd>
        !          2099:   <dt>IsDraw, IsTable, IsColHead, IsRow, IsCell</dt>
        !          2100:     <dd>These exceptions can only be applied to element types.  Elements of a
        !          2101:       type to which these exceptions are applied are identified as Draws,
        !          2102:       Tables, Colheads, Rows or Cells and specific processing are applied to
        !          2103:       them.</dd>
        !          2104:   <dt>ColRef</dt>
        !          2105:     <dd>This exception can only be applied to attributes of the reference
        !          2106:       type. It indicates that this attribute refers to the column head (see
        !          2107:       exception IsColHead) which the element belongs to.</dd>
        !          2108:   <dt>ColSpan, RowSpan</dt>
        !          2109:     <dd>These exceptions can only be applied to numeric attributes of cells. 
        !          2110:       They indicate that attribute values give how many columns or rows the
        !          2111:       element spans.</dd>
        !          2112:   <dt>Shadow</dt>
        !          2113:     <dd>This exception can only be applied to element types.  Text of elements
        !          2114:       of a type to which this exception is applied are displayed and printed
        !          2115:       as a set of stars ('*').</dd>
1.18      cvs      2116: </dl>
1.30    ! cvs      2117: 
1.18      cvs      2118: <blockquote class="example">
1.30    ! cvs      2119:   <p><strong>Example:</strong></p>
        !          2120: 
        !          2121:   <p>Consider a structure schema for object-style graphics which defines the
        !          2122:   Graphic_object element type with the associated Height and Weight numeric
        !          2123:   attributes.  Suppose that we want documents of this class to have the
        !          2124:   following qualities:</p>
        !          2125:   <ul>
        !          2126:     <li>Whenever the width or height of an object is changed using the mouse,
        !          2127:       the new values are stored in the object's Width and Height
        !          2128:     attributes.</li>
        !          2129:     <li>The user should not be able to change the values of the Width and
        !          2130:       Height attributes via the Attributes menu of the Thot editor.</li>
        !          2131:   </ul>
        !          2132: 
        !          2133:   <p>The following exceptions will produce this effect.</p>
        !          2134:   <pre>STRUCT
1.1       cvs      2135: ...
1.5       cvs      2136:    Graphics_object (ATTR Height = Integer; Width = Integer)
1.1       cvs      2137:        = GRAPHICS with Height ?= 10, Width ?= 10;
                   2138: ...
                   2139: EXCEPT
                   2140:    Height: NewHeight, Invisible;
1.18      cvs      2141:    Width: NewWidth, Invisible;</pre>
                   2142: </blockquote>
                   2143: </div>
                   2144: </div>
1.1       cvs      2145: 
1.18      cvs      2146: <div class="section">
1.30    ! cvs      2147: <h2><a name="sectb33">Some examples</a></h2>
1.1       cvs      2148: 
1.30    ! cvs      2149: <p>In order to illustrate the principles of the document model and the syntax
        !          2150: of the S language, this section presents two examples of structure schemas.
        !          2151: One defines a class of documents, the other defines a class of objects.</p>
1.1       cvs      2152: 
1.18      cvs      2153: <div class="subsection">
1.30    ! cvs      2154: <h3><a name="sectc331">A class of documents: articles</a></h3>
1.1       cvs      2155: 
1.30    ! cvs      2156: <p>This example shows a possible structure for articles published in a
        !          2157: journal. Text between braces is comments.</p>
1.18      cvs      2158: <pre>STRUCTURE Article;  { This schema defines the Article class }
1.1       cvs      2159: DEFPRES ArticleP;   { The default presentation schema is
                   2160:                       ArticleP }
                   2161: ATTR                { Global attribute definitions }
                   2162:    WordType = Definition, IndexWord, DocumentTitle;
                   2163:    { A single global attribute is defined, with three values }
                   2164: STRUCT              { Definition of the generic structure }
                   2165:    Article = BEGIN  { The Article class has an aggregate
                   2166:                       structure }
                   2167:              Title = BEGIN   { The title is an aggregate }
                   2168:                      French_title = 
                   2169:                          Text WITH Language='Fran\347ais';
                   2170:                      English_title =
                   2171:                          Text WITH Language='English';
                   2172:                      END;
                   2173:              Authors = 
                   2174:                LIST OF (Author
                   2175:                  (ATTR Author_type=principal,secondary)
                   2176:                  { The Author type has a local attribute }
                   2177:                  = BEGIN
                   2178:                    Author_name = Text;
                   2179:                    Info = Paragraphs ;
                   2180:                    { Paragraphs is defined later }
                   2181:                    Address    = Text;
                   2182:                    END
                   2183:                  );
                   2184:              Keywords = Text;
                   2185:              { The journal's editor introduces the article
                   2186:                with a short introduction, in French and
                   2187:                in English }
                   2188:              Introduction = 
                   2189:                  BEGIN
                   2190:                  French_intr  = Paragraphs WITH
                   2191:                                 Language='Fran\347ais';
                   2192:                  English_intr = Paragraphs WITH
                   2193:                                 Language='English';
                   2194:                  END;
                   2195:              Body = Sections; { Sections are defined later }
                   2196:                    { Appendixes are only created on demand }
                   2197:            ? Appendices = 
                   2198:                  LIST OF (Appendix =
                   2199:                           BEGIN
                   2200:                           Appendix_Title    = Text;
                   2201:                           Appendix_Contents = Paragraphs;
                   2202:                           END
                   2203:                          );
                   2204:              END;      { End of the Article aggregate }
                   2205: 
                   2206:     Sections = LIST [2..*] OF (
                   2207:                  Section = { At least 2 sections }
                   2208:                  BEGIN
                   2209:                  Section_title   = Text;
                   2210:                  Section_contents =
                   2211:                    BEGIN
                   2212:                    Paragraphs;
                   2213:                    Sections; { Sections at a lower level }
                   2214:                    END;
                   2215:                  END
                   2216:                  );
                   2217: 
                   2218:     Paragraphs = LIST OF (Paragraph = CASE OF
                   2219:                                Enumeration = 
                   2220:                                    LIST [2..*] OF
                   2221:                                        (Item = Paragraphs);
                   2222:                                Isolated_formula = Formula;
                   2223:                                LIST OF (UNIT);
                   2224:                                END
                   2225:                           );
                   2226: 
                   2227: ASSOC         { Associated elements definitions }
                   2228: 
                   2229:    Figure = BEGIN
1.5       cvs      2230:             Figure_caption  = Text;
1.1       cvs      2231:             Illustration   = NATURE;
                   2232:             END;
                   2233: 
                   2234:    Biblio_citation = CASE OF
                   2235:                         Ref_Article =
                   2236:                            BEGIN
                   2237:                            Authors_Bib   = Text;
                   2238:                            Article_Title = Text;
                   2239:                            Journal       = Text;
                   2240:                            Page_Numbers  = Text;
                   2241:                            Date          = Text;
                   2242:                            END;
                   2243:                         Ref_Livre =
                   2244:                            BEGIN
                   2245:                            Authors_Bib; { Defined above }
                   2246:                            Book_Title   = Text;
                   2247:                            Editor       = Text;
                   2248:                            Date;        { Defined above }
                   2249:                            END;
                   2250:                        END;
                   2251: 
                   2252:    Note =  Paragraphs - (Ref_note);
                   2253: 
                   2254: UNITS      { Elements which can be used in objects }
                   2255: 
                   2256:    Ref_note    = REFERENCE (Note);
                   2257:    Ref_biblio  = REFERENCE (Biblio_citation);
                   2258:    Ref_figure  = REFERENCE (Figure);
                   2259:    Ref_formula = REFERENCE (Isolated_formula);
                   2260: 
                   2261: EXPORT     { Skeleton elements }
                   2262: 
                   2263:    Title,
1.5       cvs      2264:    Figure with Figure_caption,
1.1       cvs      2265:    Section With Section_title;
                   2266: 
1.18      cvs      2267: END           { End of the structure schema }</pre>
1.30    ! cvs      2268: 
        !          2269: <p>This schema is very complete since it defines both paragraphs and
1.1       cvs      2270: bibliographic citations.  These element types could just as well be defined in
1.18      cvs      2271: other structure schemas, as is the case with the <tt>Formula</tt> class.  All
1.1       cvs      2272: sorts of other elements can be inserted into an article, since a paragraph can
                   2273: contain any type of unit.  Similarly, figures can be any class of document or
1.18      cvs      2274: object that the user chooses.</p>
1.30    ! cvs      2275: 
        !          2276: <p>Generally, an article doesn't contain appendices, but it is possible to add
1.1       cvs      2277: them on explicit request:  this is the effect of the question mark before the
1.18      cvs      2278: word Appendices.</p>
1.30    ! cvs      2279: 
        !          2280: <p>The Figure, Biblio_citation and Note elements are associated elements.
        !          2281: Thus, they are only used in <tt>REFERENCE</tt> statements.</p>
        !          2282: 
        !          2283: <p>Various types of cross-references can be put in paragraphs.  They can also
        !          2284: be placed the objects which are part of the article, since the
        !          2285: cross-references are defined as units (<tt>UNITS</tt>).</p>
        !          2286: 
        !          2287: <p>There is a single restriction to prevent the creation of Ref_note elements
1.18      cvs      2288: within notes.</p>
1.30    ! cvs      2289: 
        !          2290: <p>It is worth noting that the S language permits the definition of recursive
1.1       cvs      2291: structures like sections: a section can contain other sections (which are thus
                   2292: at the next lower level of the document tree).  Paragraphs are also recursive
                   2293: elements, since a paragraph can contain an enumeration in which each element
1.18      cvs      2294: (<tt>Item</tt>) is composed of paragraphs.</p>
                   2295: </div>
1.1       cvs      2296: 
1.18      cvs      2297: <div class="subsection">
1.30    ! cvs      2298: <h3><a name="sectc332">A class of objects: mathematical formulas</a></h3>
1.1       cvs      2299: 
1.30    ! cvs      2300: <p>The example below defines the <tt>Formula</tt> class which is used in
        !          2301: Article documents.  This class represents mathematical formulas  with a rather
        !          2302: simple structure, but sufficient to produce a correct rendition on the screen
        !          2303: or printer.  To support more elaborate operations (formal or numeric
1.1       cvs      2304: calculations), a finer structure should be defined. This class doesn't use any
1.18      cvs      2305: other class and doesn't define any associated elements or units.</p>
                   2306: <pre>STRUCTURE Formula;
1.1       cvs      2307: DEFPRES FormulaP;
                   2308: 
                   2309: ATTR
                   2310:    String_type = Function_name, Variable_name;
                   2311: 
                   2312: STRUCT
                   2313:    Formula      = Expression;
                   2314:    Expression   = LIST OF (Construction);
                   2315:    Construction = CASE OF
                   2316:                   TEXT;         { Simple character string }
                   2317:                   Index    = Expression;
                   2318:                   Exponent = Expression;
                   2319:                   Fraction =
                   2320:                         BEGIN
1.6       cvs      2321:                         Numerator   = Expression;
1.1       cvs      2322:                         Denominator = Expression;
                   2323:                         END;
                   2324:                   Root = 
                   2325:                         BEGIN
                   2326:                       ? Order = TEXT;
                   2327:                         Root_Contents = Expression;
                   2328:                         END;
                   2329:                   Integral =
                   2330:                         BEGIN
                   2331:                         Integration_Symbol = SYMBOL;
                   2332:                         Lower_Bound        = Expression;
                   2333:                         Upper_Bound        = Expression;
                   2334:                         END;
                   2335:                   Triple =
                   2336:                         BEGIN
                   2337:                         Princ_Expression = Expression;
                   2338:                         Lower_Expression = Expression;
                   2339:                         Upper_Expression = Expression;
                   2340:                         END;
                   2341:                   Column = LIST [2..*] OF 
                   2342:                               (Element = Expression);
                   2343:                   Parentheses_Block =
                   2344:                         BEGIN
                   2345:                         Opening  = SYMBOL;
                   2346:                         Contents = Expression;
                   2347:                         Closing  = SYMBOL;
                   2348:                         END;
                   2349:                   END;       { End of Choice Constructor }
1.18      cvs      2350: END                          { End of Structure Schema }</pre>
1.30    ! cvs      2351: 
        !          2352: <p>This schema defines a single global attribute which allows functions and
1.1       cvs      2353: variables to be distinguished.  In the presentation schema, this attribute can
                   2354: be used to choose between roman (for functions) and italic characters (for
1.18      cvs      2355: variables).</p>
1.30    ! cvs      2356: 
        !          2357: <p>A formula's structure is that of a mathematical expression, which is itself
        !          2358: a sequence of mathematical constructions.  A mathematical construction can be
1.1       cvs      2359: either a simple character string, an index, an exponent, a fraction, a root,
                   2360: etc.  Each of these mathematical constructions has a sensible structure which
                   2361: generally includes one or more expressions, thus making the formula class's
1.18      cvs      2362: structure definition recursive.</p>
1.30    ! cvs      2363: 
        !          2364: <p>In most cases, the roots which appear in the formulas are square roots and
1.1       cvs      2365: their order (2) is not specified.  This is why the Order component is marked
                   2366: optional by a question mark.  When explicitly requested, it is possible to add
1.18      cvs      2367: an order to a root, for example for cube roots (order = 3).</p>
1.30    ! cvs      2368: 
        !          2369: <p>An integral is formed by an integration symbol, chosen by the user (simple
1.1       cvs      2370: integral, double, curvilinear, etc.), and two bounds.  A more fine-grained
                   2371: schema would add components for the integrand and the integration variable.
                   2372: Similarly, the Block_Parentheses construction leaves the choice of opening and
                   2373: closing symbols to the user.  They can be brackets, braces, parentheses,
1.18      cvs      2374: etc.</p>
                   2375: </div>
                   2376: </div>
                   2377: <hr>
                   2378: </div>
1.1       cvs      2379: 
1.18      cvs      2380: <div class="chapter">
                   2381: <h1><a name="sect4">The P Language</a></h1>
1.1       cvs      2382: 
1.18      cvs      2383: <div class="section">
1.30    ! cvs      2384: <h2><a name="sectb41">Document presentation</a></h2>
1.1       cvs      2385: 
1.30    ! cvs      2386: <p>Because of the model adopted for Thot, the presentation of documents is
1.1       cvs      2387: clearly separated from their structure and content.  After having presented
                   2388: the logical structure of documents, we now detail the principles implemented
1.18      cvs      2389: for their presentation.  The concept of <em>presentation</em> encompasses what
1.5       cvs      2390: is often called the page layout, the composition, or the document style.  It
1.18      cvs      2391: is the set of operations which display the document on the screen or print it
                   2392: on paper.  Like logical structure, document presentation is defined
                   2393: generically with the help of a language, called P.</p>
1.1       cvs      2394: 
1.18      cvs      2395: <div class="subsection">
1.30    ! cvs      2396: <h3><a name="sectc411">Two levels of presentation</a></h3>
1.1       cvs      2397: 
1.30    ! cvs      2398: <p>The link between structure and presentation is clear: the logical
        !          2399: organization of a document is used to carry out its presentation, since the
        !          2400: purpose of the presentation is to make evident the organization of the
        !          2401: document.  But the presentation is equally dependent on the device used to
        !          2402: render the document. Certain presentation effects, notably changes of font or
        !          2403: character set, cannot be performed on all printers or on all screens.  This is
        !          2404: why Thot uses a two-level approach, where the presentation is first described
        !          2405: in abstract terms, without taking into account each particular device, and
        !          2406: then the presentation is realized within the constraints of a given
        !          2407: device.</p>
        !          2408: 
        !          2409: <p>Thus, presentation is only described as a function of the structure of the
1.1       cvs      2410: documents and the image that would be produced on an idealized device.  For
                   2411: this reason, presentation descriptions do not refer to any device
1.18      cvs      2412: characteristics: they describe <em>abstract presentations</em> which can be
                   2413: concretized on different devices.</p>
1.30    ! cvs      2414: 
        !          2415: <p>A presentation description also defines a <em>generic presentation</em>,
        !          2416: since it describes the appearance of a class of documents or objects. This
        !          2417: generic presentation must also be applied to document and object instances,
        !          2418: each conforming to its generic logical structure, but with all the allowances
        !          2419: that were called to mind above: missing elements, constructed elements with
        !          2420: other logical structures, etc.</p>
        !          2421: 
        !          2422: <p>In order to preserve the homogeneity between documents and objects,
1.1       cvs      2423: presentation is described with a single set of tools which support the layout
                   2424: of a large document as well as the composition of objects like a graphical
                   2425: figure or mathematical formula.  This unity of presentation description tools
                   2426: contrasts with the traditional approach, which focuses more on documents than
                   2427: objects and thus is based on the usual typographic conventions, such as the
                   2428: placement of margins, indentations, vertical spaces, line lengths,
1.18      cvs      2429: justification, font changes, etc.</p>
                   2430: </div>
1.1       cvs      2431: 
1.18      cvs      2432: <div class="subsection">
1.30    ! cvs      2433: <h3><a name="sectc412">Boxes</a></h3>
1.1       cvs      2434: 
1.30    ! cvs      2435: <p>To assure the homogeneity of tools, all presentation in Thot, for documents
        !          2436: as well as for the objects which they contain, is based on the notion of the
1.18      cvs      2437: <em>box</em>, such as was implemented in T<sub><big>E</big></sub>X.</p>
1.30    ! cvs      2438: 
        !          2439: <p>Corresponding to each element of the document is a box,  which is the
1.1       cvs      2440: rectangle enclosing the element on the display device (screen or sheet of
1.18      cvs      2441: paper);  the outline of this rectangle is not visible, except when a <a
                   2442: href="#sectc4230a"><tt>ShowBox</tt> rule</a> applies to the element. The sides
                   2443: of the box are parallel to the sides of the screen or the sheet of paper.  By
                   2444: way of example, a box is associated with a character string, a line of text, a
                   2445: page, a paragraph, a title, a mathematical formula, or a table cell.</p>
1.30    ! cvs      2446: 
        !          2447: <p>Whatever element it corresponds to, each box possesses four sides and four
1.18      cvs      2448: axes, which we designate as follows (<a href="#boxes">see figure</a>):</p>
                   2449: <dl>
1.30    ! cvs      2450:   <dt><tt>Top</tt></dt>
        !          2451:     <dd>the upper side,</dd>
        !          2452:   <dt><tt>Bottom</tt></dt>
        !          2453:     <dd>the lower side,</dd>
        !          2454:   <dt><tt>Left</tt></dt>
        !          2455:     <dd>the left side,</dd>
        !          2456:   <dt><tt>Right</tt></dt>
        !          2457:     <dd>the right side,</dd>
        !          2458:   <dt><tt>VMiddle</tt></dt>
        !          2459:     <dd>the vertical axis passing through the center of the box,</dd>
        !          2460:   <dt><tt>HMiddle</tt></dt>
        !          2461:     <dd>the horizontal axis passing through the center of the box,</dd>
        !          2462:   <dt><tt>VRef</tt></dt>
        !          2463:     <dd>the vertical reference axis,</dd>
        !          2464:   <dt><tt>HRef</tt></dt>
        !          2465:     <dd>the horizontal reference axis.</dd>
1.18      cvs      2466: </dl>
                   2467: 
                   2468: <div class="figure">
                   2469: <hr>
                   2470: <pre>        Left   VRef  VMiddle        Right
1.1       cvs      2471:                  :      :
                   2472:     Top   -----------------------------
                   2473:           |      :      :             |
                   2474:           |      :      :             |
                   2475:           |      :      :             |
                   2476:           |      :      :             |
                   2477:           |      :      :             |
                   2478: HMiddle ..|...........................|..
                   2479:           |      :      :             |
                   2480:           |      :      :             |
                   2481:    HRef ..|...........................|..
                   2482:           |      :      :             |
                   2483:           |      :      :             |
                   2484:   Bottom  -----------------------------
1.18      cvs      2485:                  :      :</pre>
1.30    ! cvs      2486: 
        !          2487: <p align="center"><em><a name="boxes">The sides and axes of
        !          2488: boxes</a><em></em></em></p>
1.18      cvs      2489: <hr>
1.30    ! cvs      2490: </div>
1.19      cvs      2491: 
1.30    ! cvs      2492: <p>The principal role of boxes is to set the extent and position of the images
        !          2493: of the different elements of a document with respect to each other on the
1.1       cvs      2494: reproduction device.  This is done by defining relations between the boxes of
                   2495: different elements which give relative extents and positions to these
1.18      cvs      2496: boxes.</p>
1.30    ! cvs      2497: 
        !          2498: <p>There are three types of boxes:</p>
1.18      cvs      2499: <ul>
1.30    ! cvs      2500:   <li>boxes corresponding to structural elements of the document,</li>
        !          2501:   <li>presentation boxes,</li>
        !          2502:   <li>page layout boxes.</li>
1.18      cvs      2503: </ul>
1.30    ! cvs      2504: 
        !          2505: <p><strong>Boxes corresponding to structural elements of the document</strong>
1.1       cvs      2506: are those which linked to each of the elements (base or structured) of the
                   2507: logical structure of the document.  Such a box contains all the contents of
1.18      cvs      2508: the element to which it corresponds (there is an exception: see <a
                   2509: href="#sectc4220">rules <tt>VertOverflow</tt> and <tt>HorizOverflow</tt></a>).
                   2510: These boxes form a tree-like structure, identical to that of the structural
                   2511: elements to which they correspond.  This tree expresses the inclusion
                   2512: relationships between the boxes: a box includes all the boxes of its subtree.
                   2513: On the other hand, there are no predefined rules for the relative positions of
                   2514: the included boxes.  If they are at the same level, they can overlap, be
                   2515: contiguous, or be disjoint. The rules expressed in the generic presentation
                   2516: specify their relative positions.</p>
1.30    ! cvs      2517: 
        !          2518: <p><strong>Presentation boxes</strong> represent elements which are not found
        !          2519: in the logical structure of the document but which are added to meet the needs
        !          2520: of presentation.  These boxes are linked to the elements of the logical
        !          2521: structure that are best suited to bringing them out. For example, they are
        !          2522: used to add the character string ``Summary:'' before the summary in the
        !          2523: presentation of a report or to represent the fraction bar in a formula, or
        !          2524: also to make the title of a field in a form appear.  These elements have no
        !          2525: role in the logical structure of the document: the presence of a Summary
        !          2526: element in the document does not require the creation of another structural
        !          2527: object to hold the word ``Summary''. Similarly, if a Fraction element contains
        !          2528: both a Numerator element and a Denominator element, the fraction bar has no
        !          2529: purpose structurally.  On the other hand, these elements of the presentation
        !          2530: are important for the reader of the reproduced document or for the user of an
1.1       cvs      2531: editor.  This is why they must appear in the document's image.  It is the
                   2532: generic presentation which specifies the presentation boxes to add by
                   2533: indicating their content (a base element for which the value is specified) and
                   2534: the position that they must take in the tree of boxes.  During editing, these
1.18      cvs      2535: boxes cannot be modified by the user.</p>
1.30    ! cvs      2536: 
        !          2537: <p><strong>Page layout boxes</strong> are boxes created implicitly by the page
1.1       cvs      2538: layout rules.  These rules indicate how the contents of a structured element
                   2539: must be broken into lines and pages.  In contrast to presentation boxes, these
                   2540: line and page boxes do not depend on the logical structure of the document,
1.18      cvs      2541: but rather on the physical constraints of the output devices: character size,
                   2542: height and width of the window on the screen or of the sheet of paper.</p>
                   2543: </div>
1.1       cvs      2544: 
1.18      cvs      2545: <div class="subsection">
1.30    ! cvs      2546: <h3><a name="sectc413">Views and visibility</a></h3>
1.1       cvs      2547: 
1.30    ! cvs      2548: <p>One of the operations that one might wish to perform on a document is to
        !          2549: view it is different ways.  For this reason, it is possible to define several
1.18      cvs      2550: <em>views</em> for the same document, or better yet, for all documents of the
1.1       cvs      2551: same class.  A view is not a different presentation of the document, but
                   2552: rather a filter which only allows the display of certain parts of the
                   2553: document.  For example, it might be desirable to see only the titles of
                   2554: chapters and sections in order to be able to move rapidly through the
                   2555: document.  Such a view could be called a ``table of contents''.  It might also
                   2556: be desirable to see only the mathematical formulas of a document in order to
                   2557: avoid being distracted by the non-mathematical aspects of the document.  A
1.18      cvs      2558: ``mathematics'' view could provide this service.</p>
1.30    ! cvs      2559: 
        !          2560: <p>Views, like presentation, are based on the generic logical structure. Each
1.1       cvs      2561: document class, and each generic presentation, can be provided with views
                   2562: which are particularly useful for that class or presentation.  For each view,
1.18      cvs      2563: the <em>visibility</em> of elements is defined, indicated whether or not the
1.1       cvs      2564: elements must be presented to the user.  The visibility is calculated  as a
                   2565: function of the type of the elements or their hierarchical position in the
                   2566: structure of the document.  Thus, for a table of contents, all the ``Chapter
                   2567: Title'' and ``Section Title'' elements are made visible.  However, the
                   2568: hierarchical level could be used to make the section titles invisible below a
                   2569: certain threshold level.  By varying this threshold, the granularity of the
                   2570: view can be varied.  In the ``mathematics'' view, only Formula elements would
1.18      cvs      2571: be made visible, no matter what their hierarchical level.</p>
1.30    ! cvs      2572: 
        !          2573: <p>Because views are especially useful for producing a synthetic image of the
1.1       cvs      2574: document, it is necessary to adapt the presentation of the elements to the
                   2575: view in which they appear.  For example, it is inappropriate to have a page
                   2576: break before every chapter title in the table of contents.  Thus, generic
                   2577: presentations take into account the possible views and permit each element
1.18      cvs      2578: type's presentation to vary according the view in which its image appears.</p>
1.30    ! cvs      2579: 
        !          2580: <p><a name="views">Views</a> are also used, when editing documents, to display
1.1       cvs      2581: the associated elements.  So, in addition to the primary view of the document,
                   2582: there can be a ``notes'' view and a ``figures'' view which contain,
                   2583: respectively, the associated elements of the Note and Figure types. In this
                   2584: way, it is possible to see simultaneously the text which refers to these
                   2585: elements and the elements themselves, even if they will be separated when
1.18      cvs      2586: printed.</p>
                   2587: </div>
1.1       cvs      2588: 
1.18      cvs      2589: <div class="subsection">
1.30    ! cvs      2590: <h3><a name="sectc414">Pages</a></h3>
1.1       cvs      2591: 
1.30    ! cvs      2592: <p>Presentation schemas can be defined which display the document as a long
1.1       cvs      2593: scroll, without page breaks.  This type of schema is particularly well-suited
                   2594: to the initial phase of work on a document, where jumps from page to page
                   2595: would hinder composing and reading the document on a screen.  In this case,
                   2596: the associated elements (such as notes), which are normally displayed in the
                   2597: page footer, are presented in a separate window.  But, once the document is
                   2598: written, it may be desirable to display the document on the screen in the same
                   2599: manner in which it will be printed.  So, the presentation schema must define
1.18      cvs      2600: pages.</p>
1.30    ! cvs      2601: 
        !          2602: <p>The P language permits the specification of the dimensions of pages as well
        !          2603: as their composition.  It is possible to generate running titles, page
        !          2604: numbers, zones at the bottom of the page for notes, etc.  The editor follows
        !          2605: this model and inserts page break marks in the document which are used during
        !          2606: printing, insuring that the pages on paper are the same as on the screen.</p>
        !          2607: 
        !          2608: <p>Once a document has been edited with a presentation schema defining pages,
        !          2609: it contains page marks.  But it is always possible to edit the document using
        !          2610: a schema without pages.  In this case, the page marks are simply ignored by
        !          2611: the editor.  They are considered again as soon as a schema with pages is used.
1.18      cvs      2612: Thus, the user is free to choose between schemas with and without pages.</p>
1.30    ! cvs      2613: 
        !          2614: <p>Thot treats the page break, rather than the page itself, as a box. This
        !          2615: page break box contains all the elements of one page's footer, a rule marking
        !          2616: the edge of this page, and all the elements of the next page's header.  The
1.1       cvs      2617: elements of the header and footer can be running titles, page number,
                   2618: associated elements (notes, for example), etc. All these elements, as well as
                   2619: their content and graphical appearance, are defined by the generic
1.18      cvs      2620: presentation.</p>
                   2621: </div>
1.1       cvs      2622: 
1.18      cvs      2623: <div class="subsection">
1.30    ! cvs      2624: <h3><a name="sectc415">Numbering</a></h3>
1.1       cvs      2625: 
1.30    ! cvs      2626: <p>Many elements are numbered in documents: pages, chapters, sections,
        !          2627: formulas, theorems, notes, figures, bibliographic references, exercises,
        !          2628: examples, lemmas, etc.  Because Thot has a notion of logical structure, all of
        !          2629: these numbers (with the exception of pages) are redundant with information
        !          2630: implicit in the logical structure of the document.  Such numbers are simply a
        !          2631: way to make the structure of the document more visible.  So, they are part of
        !          2632: the document's presentation and are calculated by the editor from the logical
1.1       cvs      2633: structure.  The structure does not contain numbers as such; it only defines
                   2634: relative structural positions between elements, which serve as ordering
1.18      cvs      2635: relations on these elements.</p>
1.30    ! cvs      2636: 
        !          2637: <p>If the structure schema defines the body of a document as a sequence of at
1.18      cvs      2638: least two chapters:</p>
                   2639: <pre>Body = LIST [2..*] OF Chapter;</pre>
1.30    ! cvs      2640: 
        !          2641: <p>the sequence defined by the list constructor is ordered and each chapter
        !          2642: can be assigned a number based on its rank in the Body list.  Therefore, all
1.18      cvs      2643: elements contained in lists a the structure of a document can be numbered, but
                   2644: they are not the only ones.  The tree structure induced by the aggregate,
                   2645: list, and choice constructors (excluding references) defines a total order on
                   2646: the elements of the document's primary structure.  So, it is possible to
                   2647: define a numbering which uses this order, filtering elements according to
                   2648: their type so that only certain element types are taken into account in the
                   2649: numbering.  In this way, it possible to number all the theorems and lemmas of
                   2650: a chapter in the same sequence of numbers, even when they are not part of the
                   2651: same list constructor and appear at different levels of the document's tree.
                   2652: By changing the filter, they can be numbered separately: one sequence of
                   2653: numbers for theorems, another for the lemmas.</p>
1.30    ! cvs      2654: 
        !          2655: <p>Associated elements pose a special problem, since they are not part of the
1.1       cvs      2656: document's primary structure, but are attached only by references, which
                   2657: violate the total order of the document.  Then, these associated elements are
                   2658: frequently numbered, precisely because the number is an effective way to
                   2659: visualize the reference.  In order to resolve this problem, Thot implicitly
                   2660: defines a list constructor for each type of associated element, gathering
                   2661: together (and ordering) these elements.  Thus, the associated elements can be
1.18      cvs      2662: numbered by type.</p>
1.30    ! cvs      2663: 
        !          2664: <p>Since they are calculated from the document's logical structure and only
        !          2665: for the needs of the presentation, numbers are presentation elements,
        !          2666: described by presentation boxes, just like the fraction bar or the word
        !          2667: ``Summary''. Nevertheless, numbers differ from these other boxes because their
        !          2668: content varies from instance to instance, even though they are of the same
        !          2669: type, whereas all fraction bars are horizontal lines and the same word
        !          2670: ``Summary'' appears at the head of every document's summary.</p>
1.18      cvs      2671: </div>
1.1       cvs      2672: 
1.18      cvs      2673: <div class="subsection">
1.30    ! cvs      2674: <h3><a name="sectc416">Presentation parameters</a></h3>
1.1       cvs      2675: 
1.30    ! cvs      2676: <p>The principal parameters which determine document presentation are the
1.18      cvs      2677: <em>positions</em> and <em>dimensions</em> of boxes, the <em>font</em>, the
                   2678: <em>style</em>, the <em>size</em>, the <em>underlining</em> and the
                   2679: <em>color</em> of their content.  From these parameters, and some others of
1.1       cvs      2680: less importance, it is possible to represent the usual typographic parameters
                   2681: for the textual parts of the document.  These same parameters can be used to
                   2682: describe the geometry of the non-textual elements, even though they are
1.18      cvs      2683: two-dimensional elements unlike the text, which is linear.</p>
1.30    ! cvs      2684: 
        !          2685: <p>As we have already  seen, the positions of the boxes always respect the
        !          2686: rule of enclosure: a box in the tree encloses all the boxes of the next lower
        !          2687: level which are attached to it.  The positional parameters permit the
        !          2688: specification of the position of each box in relation to the enclosing box or
        !          2689: to its sibling boxes (boxes directly attached to the same enclosing box in the
        !          2690: tree of boxes).</p>
        !          2691: 
        !          2692: <p>The presentation parameters also provide control over the dimensions of the
1.1       cvs      2693: boxes.  The dimensions of a box can depend either on its content or on its
                   2694: context (its sibling boxes and the enclosing box). Each dimension (height or
1.18      cvs      2695: width) can be defined independently of the other.</p>
1.30    ! cvs      2696: 
        !          2697: <p>Because of the position and dimension parameters, it is possible to do the
1.1       cvs      2698: same things that are normally done in typography by changing margins, line
                   2699: lengths, and vertical or horizontal skips.  This approach can also align or
1.18      cvs      2700: center elements and groups of elements.</p>
1.30    ! cvs      2701: 
        !          2702: <p>In contrast to the position and dimension parameters, the font, style,
        !          2703: size, underlining, and color do not concern the box itself (the rectangle
        !          2704: delimiting the element), but its content.  These parameters indicate the
        !          2705: typographic attributes which must be applied to the text contained in the box,
        !          2706: and by extension, to all base elements.</p>
        !          2707: 
        !          2708: <p>For text, the font parameter is used to change the family of characters
1.1       cvs      2709: (Times, Helvetica, Courier, etc.); the style is used to obtain italic or
                   2710: roman, bold or light characters;  the size determines the point size of the
                   2711: characters; underlining defines the type and thickness of the lines drawn
1.18      cvs      2712: above, below, or through the characters.</p>
1.30    ! cvs      2713: 
        !          2714: <p>For graphics, the line style parameter can be either solid, dotted, or
        !          2715: dashed; the line thickness parameter controls the width of the lines; the fill
        !          2716: pattern parameter determines how closed geometric figures must be filled.</p>
        !          2717: 
        !          2718: <p>While some of the parameters which determine the appearance of a box's
1.1       cvs      2719: contents make sense only for one content type (text or graphic), other
                   2720: parameters apply to all content types: these are the color parameters. These
1.18      cvs      2721: indicate the color of lines and the background color.</p>
                   2722: </div>
                   2723: </div>
1.1       cvs      2724: 
1.18      cvs      2725: <div class="section">
1.30    ! cvs      2726: <h2><a name="sectb42">Presentation description language</a></h2>
        !          2727: 
        !          2728: <p>A generic presentation defines the values of presentation parameters (or
        !          2729: the way to calculate those values) for a generic structure, or more precisely,
        !          2730: for all the element types and all the global and local attributes defined in
        !          2731: that generic structure.  This definition of the presentation parameters is
        !          2732: made with the P language.  A program written in this language, that is a
        !          2733: generic presentation expressed in P, is call a <em>presentation schema</em>.
        !          2734: This section describes the syntax and semantics of the language, using the
        !          2735: same <a href="#sectc321">meta-language</a> as was used for the definition of
        !          2736: the S language.</p>
1.1       cvs      2737: 
1.30    ! cvs      2738: <p>Recall that it is possible to write many different presentation schemas for
1.1       cvs      2739: the same class of documents or objects.  This allows users to choose for a
                   2740: document the graphical appearance  which best suits their type of work or
1.18      cvs      2741: their personal taste.</p>
1.1       cvs      2742: 
1.18      cvs      2743: <div class="subsection">
1.30    ! cvs      2744: <h3><a name="sectc421">The organization of a presentation schema</a></h3>
1.1       cvs      2745: 
1.30    ! cvs      2746: <p>A presentation schema begins with the word <tt>PRESENTATION</tt> and ends
        !          2747: with the word <tt>END</tt>.  The word <tt>PRESENTATION</tt> is followed by the
        !          2748: name of the generic structure to which the presentation will be applied.  This
        !          2749: name must be the same as that which follows the keyword <tt>STRUCTURE</tt> in
        !          2750: the structure schema associated with the presentation schema.</p>
        !          2751: 
        !          2752: <p>After this declaration of the name of the structure, the following sections
1.18      cvs      2753: appear (in order):</p>
                   2754: <ul>
1.30    ! cvs      2755:   <li>Declarations of
        !          2756:     <ul>
        !          2757:       <li>all views,</li>
        !          2758:       <li>printed views,</li>
        !          2759:       <li>counters,</li>
        !          2760:       <li>presentation constants,</li>
        !          2761:       <li>variables,</li>
        !          2762:     </ul>
        !          2763:   </li>
        !          2764:   <li>default presentation rules,</li>
        !          2765:   <li>presentation box and page layout box definitions,</li>
        !          2766:   <li>presentation rules for structured elements,</li>
        !          2767:   <li>presentation rules for attributes,</li>
        !          2768:   <li>rules for transmitting values to attributes of included documents.</li>
1.18      cvs      2769: </ul>
1.30    ! cvs      2770: 
        !          2771: <p>Each of these sections is introduced by a keyword which is followed by a
1.18      cvs      2772: sequence of declarations.  Every section is optional.</p>
                   2773: <pre>     SchemaPres ='PRESENTATION' ElemID ';'
1.1       cvs      2774:                [ 'VIEWS' ViewSeq ]
                   2775:                [ 'PRINT' PrintViewSeq ]
                   2776:                [ 'COUNTERS' CounterSeq ]
                   2777:                [ 'CONST' ConstSeq ]
                   2778:                [ 'VAR' VarSeq ]
                   2779:                [ 'DEFAULT' ViewRuleSeq ]
                   2780:                [ 'BOXES' BoxSeq ]
                   2781:                [ 'RULES' PresentSeq ]
                   2782:                [ 'ATTRIBUTES' PresAttrSeq ]
                   2783:                [ 'TRANSMIT' TransmitSeq ]
                   2784:                  'END' .
1.18      cvs      2785:      ElemID     = NAME .</pre>
                   2786: </div>
1.1       cvs      2787: 
1.18      cvs      2788: <div class="subsection">
1.30    ! cvs      2789: <h3><a name="sectc422">Views</a></h3>
1.1       cvs      2790: 
1.30    ! cvs      2791: <p>Each of the possible views must be declared in the presentation schema.  As
1.18      cvs      2792: has <a href="#views">already been described</a>, the presentation rules for an
1.1       cvs      2793: element type can vary according to the view in which the element appears.  The
                   2794: name of the view is used to designate the view to which the presentation rules
1.18      cvs      2795: apply (see the <a href="#inkeyword"><tt>IN</tt> instruction</a>).  The
1.1       cvs      2796: definition of the view's contents are dispersed throughout the presentation
                   2797: rules attached to the different element types and attributes.  The
1.18      cvs      2798: <tt>VIEWS</tt> section is simply a sequence of view names separated by commas
                   2799: and terminated by a semi-colon.</p>
1.30    ! cvs      2800: 
        !          2801: <p>One of the view names (and only one) can be followed by the keyword
1.18      cvs      2802: <tt>EXPORT</tt>.  This keyword identifies the view which presents the members
                   2803: of the document class in <a href="#sectc3213">skeleton form</a>.  The
                   2804: graphical appearance  and the content of this view is defined just as with
                   2805: other views, but it is useless to specify presentation rules concerning this
                   2806: view for the elements which are not loaded in the skeleton form.</p>
1.30    ! cvs      2807: 
        !          2808: <p>It is not necessary to declare any views; in this case there is a single
1.1       cvs      2809: unnamed view.  If many views are declared, the first view listed is considered
                   2810: the principal view.  The principal view is the one to which all rules that are
1.18      cvs      2811: not preceded by an indication of a view will apply (see the <a
                   2812: href="#inkeyword">instruction <tt>IN</tt></a>).</p>
1.30    ! cvs      2813: 
        !          2814: <p>The principal view is the the one which the editor presents on the screen
        !          2815: when the user asks to create or edit a document.  Thus, it makes sense to put
        !          2816: the most frequently used view at the head of the list.  But if the structure
1.18      cvs      2817: schema contains <a href="#sectc3213">skeleton elements</a> and is loaded in
                   2818: its skeleton form, the view whose name is followed by the keyword
                   2819: <tt>EXPORT</tt> will be opened and no other views can be opened.</p>
                   2820: <pre>                      'VIEWS' ViewSeq
1.1       cvs      2821:      ViewSeq         = ViewDeclaration
1.30    ! cvs      2822:                        &lt; ',' ViewDeclaration &gt; ';' .
1.1       cvs      2823:      ViewDeclaration = ViewID [ 'EXPORT' ] .
1.18      cvs      2824:      ViewID          = NAME .</pre>
1.30    ! cvs      2825: 
1.18      cvs      2826: <blockquote class="example">
1.30    ! cvs      2827:   <p><strong>Example:</strong></p>
        !          2828: 
        !          2829:   <p>When editing a report, it might be useful have views of the table of
        !          2830:   contents and of the mathematical formulas, in addition to the principal view
        !          2831:   which shows the document in its entirety.  To achieve this, a presentation
        !          2832:   schema for the Report class would have the following <tt>VIEWS</tt>
        !          2833:   section:</p>
        !          2834:   <pre>VIEWS
1.18      cvs      2835:      Full_text, Table_of_contents, Formulas;</pre>
1.30    ! cvs      2836: 
        !          2837:   <p>The contents of these views are specified in the presentation rules of
        !          2838:   the schema.</p>
1.18      cvs      2839: </blockquote>
                   2840: </div>
1.1       cvs      2841: 
1.18      cvs      2842: <div class="subsection">
1.30    ! cvs      2843: <h3><a name="sectc423">Print Views</a></h3>
1.1       cvs      2844: 
1.30    ! cvs      2845: <p>When editing a document, each view is presented in a different window.  In
1.18      cvs      2846: addition to the views specified by the <tt>VIEWS</tt> instruction, the user
1.1       cvs      2847: can display the associated elements with one window for each type of
1.18      cvs      2848: associated element.</p>
1.30    ! cvs      2849: 
        !          2850: <p>When printing a document, it is possible to print any number of views,
        !          2851: chosen from among all the views which the editor can display (views in the
        !          2852: strict sense or associated elements).  Print views, as well as the order in
        !          2853: which they must be printed, are indicated by the <tt>PRINT</tt> instruction.
        !          2854: It appears after the <tt>VIEWS</tt> instruction and is formed of the keyword
1.18      cvs      2855: <tt>PRINT</tt> followed by the ordered list of print view names.  The print
1.1       cvs      2856: view names are separated by commas and followed by a semi-colon.  A print view
1.18      cvs      2857: name is either a view name declared in the <tt>VIEWS</tt> instruction or the
1.1       cvs      2858: name of an associated element type (with an ``s'' added to the end).  The
1.18      cvs      2859: associated element must have been declared in the <tt>ASSOC</tt> section of
                   2860: the structure schema.</p>
                   2861: <pre>                    'PRINT' PrintViewSeq
1.30    ! cvs      2862:      PrintViewSeq = PrintView &lt; ',' PrintView &gt; ';' .
1.18      cvs      2863:      PrintView    = ViewID / ElemID .</pre>
1.30    ! cvs      2864: 
        !          2865: <p>If the <tt>PRINT</tt> instruction is absent, the printing program will
        !          2866: print only the principal view (the first view specified by the <tt>VIEWS</tt>
1.18      cvs      2867: instruction or the single, unnamed view when there is no <tt>VIEWS</tt>
                   2868: instruction).</p>
1.30    ! cvs      2869: 
1.18      cvs      2870: <blockquote class="example">
1.30    ! cvs      2871:   <p><strong>Example:</strong></p>
        !          2872: 
        !          2873:   <p>Consider a Report presentation using the view declarations from the
        !          2874:   preceding example.  Suppose we want to print the full text and table of
        !          2875:   contents views, but not the Formulas view, which is only useful when
        !          2876:   editing.  In addition, suppose that we also want to print the bibliographic
        !          2877:   citations, which are associated elements (of type <tt>Citation</tt>).  A
        !          2878:   sensible printing order would be to print the full text then the
        !          2879:   bibliography and finally the table of contents.  To obtain this result when
        !          2880:   printing, the presentation schema would say:</p>
        !          2881:   <pre>PRINT
1.18      cvs      2882:      Full_text, Citations, Table_of_contents;</pre>
                   2883: </blockquote>
                   2884: </div>
                   2885: 
                   2886: <div class="subsection">
1.30    ! cvs      2887: <h3><a name="sectc424">Counters</a></h3>
1.18      cvs      2888: 
1.30    ! cvs      2889: <p>A presentation has a <em>counter</em> for each type of number in the
1.1       cvs      2890: presentation.  All counters, and therefore all types of numbers, used in the
1.18      cvs      2891: schema must be declared after the <tt>COUNTERS</tt> keyword.</p>
1.30    ! cvs      2892: 
        !          2893: <p>Each counter declaration is composed of a name identifying the counter
1.1       cvs      2894: followed by a colon and the counting function to be applied to the counter.
1.18      cvs      2895: The counter declaration ends with a semi-colon.</p>
1.30    ! cvs      2896: 
        !          2897: <p>The counting function indicates how the counter values will be calculated.
1.16      cvs      2898: Three types of counting functions are available.  The first type is used to
                   2899: count the elements of a list or aggregate: it assigns to the counter the rank
1.18      cvs      2900: of the element in the list or aggregate.  More precisely, the function</p>
                   2901: <pre>RANK OF ElemID [ LevelAsc ] [ INIT AttrID ]
                   2902:         [ 'REINIT' AttrID ]</pre>
1.30    ! cvs      2903: 
        !          2904: <p>indicates that when an element creates, by a creation rule (see the <a
1.18      cvs      2905: href="#sectc4232"><tt>Create</tt> instructions</a>), a presentation box
1.5       cvs      2906: containing  the counter value, this value is the rank of the creating element,
1.18      cvs      2907: if it is of type <tt>ElemID</tt>, otherwise the rank of the first element of
                   2908: type <tt>ElemID</tt> which encloses the creating element in the logical
                   2909: structure of the document.</p>
1.30    ! cvs      2910: 
        !          2911: <p>The type name can be preceded by a star in the special case where the
1.18      cvs      2912: structure schema defines an element of whose <tt>ElemID</tt> is the same as
                   2913: that of an <a href="#sectd3284">inclusion</a> without expansion or with
                   2914: partial expansion.  To resolve this ambiguity, the <tt>ElemID</tt> alone
                   2915: refers to the type defined in the structure schema while the <tt>ElemID</tt>
                   2916: preceded by a star refers to the included type.</p>
1.30    ! cvs      2917: 
        !          2918: <p>The type name <tt>ElemID</tt> can be followed by an integer.  That number
1.1       cvs      2919: represents the relative level, among the ancestors of the creating element, of
1.18      cvs      2920: the element whose rank is asked.  If that relative level <i>n</i> is unsigned,
                   2921: the <i>n</i><sup>th</sup> element of type <tt>ElemID</tt> encountered when
1.1       cvs      2922: travelling the logical structure from the root to the creating element is
1.16      cvs      2923: taken into account.  If the relative level is negative, the logical structure
                   2924: is travelled in the other direction, from the creating element to the
1.18      cvs      2925: root.</p>
1.30    ! cvs      2926: 
        !          2927: <p>The function can end with the keyword <tt>INIT</tt> followed by the name of
        !          2928: a numeric attribute (and only a numeric attribute).  Then, the rank of the
        !          2929: first element of the list or aggregate is considered to be the value of this
1.1       cvs      2930: attribute, rather than the default value of 1, and the rank of the other
                   2931: elements is shifted accordingly.  The attribute which determines the initial
1.18      cvs      2932: value is searched on the element itself and on its ancestors.</p>
1.30    ! cvs      2933: 
        !          2934: <p>The function can end with the keyword <tt>REINIT</tt> followed by the name
        !          2935: of a numeric attribute (and only a numeric attribute).  Then, if an element to
        !          2936: be counted has this attribute, the counter value for this element is the
1.1       cvs      2937: attribute value and the following elements are numbered starting from this
1.18      cvs      2938: value.</p>
1.30    ! cvs      2939: 
        !          2940: <p>When the <tt>RANK</tt> function is written</p>
1.18      cvs      2941: <pre>RANK OF Page [ ViewID ] [ INIT AttrID ]</pre>
1.30    ! cvs      2942: 
        !          2943: <p>(<tt>Page</tt>is a keyword of the P language), the counter takes as its
        !          2944: value the number of the page on which the element which creates the
        !          2945: presentation box containing the number appears.  This is done as if the pages
        !          2946: of the document form a list for each view.  The counter only takes into
        !          2947: account the pages of the relevant view, that is the view displaying the
        !          2948: presentation box whose contents take the value of the number.  However, if the
        !          2949: keyword <tt>Page</tt> is followed by the name of a view (between parentheses),
        !          2950: it is the pages of that view that are taken into account.  As in the preceding
        !          2951: form, the <tt>RANK</tt> function applied to pages can end with the
        !          2952: <tt>INIT</tt> keyword followed by the name of a numeric attribute which sets
        !          2953: the value of the first page's number.  This attribute must be a local
        !          2954: attribute of the document itself, and not of one of its components.</p>
        !          2955: 
        !          2956: <p>The second counting function is used to count the occurrences of a certain
1.18      cvs      2957: element type in a specified context.  The instruction</p>
                   2958: <pre>SET n ON Type1 ADD m ON Type2 [ INIT AttrID ]</pre>
1.30    ! cvs      2959: 
        !          2960: <p>says that when the document is traversed from beginning to end (in the
        !          2961: order induced by the logical structure), the counter is assigned the value
1.18      cvs      2962: <tt>n</tt> each time an element of type <tt>Type1</tt> is encountered, no
                   2963: matter what the current value of the counter, and the value <tt>m</tt> is
                   2964: added to the current value of the counter each time an element of type
                   2965: <tt>Type2</tt> is encountered.</p>
1.30    ! cvs      2966: 
        !          2967: <p>As with the <tt>RANK</tt> function, the type names can be preceded by a
        !          2968: star to resolve the ambiguity of included elements.</p>
        !          2969: 
        !          2970: <p>If the function ends with the keyword <tt>INIT</tt> followed by the name of
        !          2971: an attribute and if the document possesses this attribute, the value of this
1.18      cvs      2972: attribute is used in place of <tt>n</tt>.  The attribute must be numeric.  It
                   2973: is searched on the element itself and on its ancestors.</p>
1.30    ! cvs      2974: 
        !          2975: <p>This function can also be used with the <tt>Page</tt> keyword in the place
        !          2976: of <tt>Type1</tt> or <tt>Type2</tt>.  In the first case, the counter is
1.18      cvs      2977: reinitialized on each page with the value <tt>n</tt>, while in the second
                   2978: case, it is incremented by <tt>m</tt> on each page.  As with the preceding
                   2979: counting function, the word <tt>Page</tt> can be followed by a name between
1.1       cvs      2980: parentheses.  In this case, the name specifies a view whose pages are taken
1.18      cvs      2981: into account.</p>
1.30    ! cvs      2982: 
        !          2983: <p>The definition of a counter can contain several <tt>SET</tt> functions and
1.18      cvs      2984: several <tt>ADD</tt> functions, each with a different value.  The total number
                   2985: of counting functions must not be greater than 6.</p>
1.30    ! cvs      2986: 
        !          2987: <p>The third counting function is used to count the elements of a certain type
1.16      cvs      2988: encountered when travelling from the creating element to the root of the
                   2989: logical structure.  The creating element is included if it is of that type.
1.18      cvs      2990: That function is written</p>
                   2991: <pre>RLEVEL OF Type</pre>
1.30    ! cvs      2992: 
        !          2993: <p>where <tt>Type</tt> represents the type of the elements to be counted.</p>
        !          2994: 
        !          2995: <p>The formal definition of counter declarations is:</p>
1.18      cvs      2996: <pre>                    'COUNTERS' CounterSeq
1.30    ! cvs      2997:      CounterSeq   = Counter &lt; Counter &gt; .
1.1       cvs      2998:      Counter      = CounterID ':' CounterFunc ';' .
                   2999:      CounterID    = NAME .
                   3000:      CounterFunc  = 'RANK' 'OF' TypeOrPage [ SLevelAsc ]
1.16      cvs      3001:                     [ 'INIT' AttrID ] [ 'REINIT' AttrID ] /
1.30    ! cvs      3002:                     SetFunction &lt; SetFunction &gt;
        !          3003:                     AddFunction &lt; AddFunction &gt;
1.16      cvs      3004:                     [ 'INIT' AttrID ] /
                   3005:                     'RLEVEL' 'OF' ElemID .
1.1       cvs      3006:      SLevelAsc    = [ '-' ] LevelAsc .
                   3007:      LevelAsc     =  NUMBER .
                   3008:      SetFunction  = 'SET' CounterValue 'ON' TypeOrPage .
                   3009:      AddFunction  = 'ADD' CounterValue 'ON' TypeOrPage .
                   3010:      TypeOrPage   = 'Page' [ '(' ViewID ')' ] / 
1.16      cvs      3011:                     [ '*' ] ElemID .
1.18      cvs      3012:      CounterValue = NUMBER .</pre>
1.30    ! cvs      3013: 
1.18      cvs      3014: <blockquote class="example">
1.30    ! cvs      3015:   <p><strong>Example:</strong></p>
        !          3016: 
        !          3017:   <p>If the body of a chapter is defined as a sequence of sections in the
        !          3018:   structure schema:</p>
        !          3019:   <pre>Chapter_body = LIST OF (Section = 
1.1       cvs      3020:                             BEGIN
                   3021:                             Section_Title = Text;
                   3022:                             Section_Body  = Paragraphs;
                   3023:                             END
1.18      cvs      3024:                          );</pre>
1.30    ! cvs      3025: 
        !          3026:   <p>the section counter is declared:</p>
        !          3027:   <pre>SectionCtr : RANK OF Section;</pre>
        !          3028: 
        !          3029:   <p>and the display of the section number before the section title is
        !          3030:   obtained by a <a href="#sectc4232"><tt>CreateBefore</tt> rule</a> attached
        !          3031:   the <tt>Section_Title</tt> type, which creates a presentation box whose
        !          3032:   content is the value of the <tt>SectionCtr</tt> counter (see the <a
        !          3033:   href="#sectc4231"><tt>Content</tt> instruction</a>).</p>
        !          3034: 
        !          3035:   <p>In order to number the formulas separately within each chapter, the
        !          3036:   formula counter is declared:</p>
        !          3037:   <pre>FormulaCtr : SET 0 ON Chapter ADD 1 ON Formula;</pre>
        !          3038: 
        !          3039:   <p>and the display of the formula number in the right margin, alongside each
        !          3040:   formula, is obtained by a <tt>CreateAfter</tt> instruction attached to the
        !          3041:   <tt>Formula</tt> type, which creates a presentation box whose content is the
        !          3042:   value of the <tt>FormulaCtr</tt> counter.</p>
        !          3043: 
        !          3044:   <p>To number the page chapter by chapter, with the first page of each
        !          3045:   chapter having the number 1, the counter definition would be</p>
        !          3046:   <pre>ChapterPageCtr : SET 0 ON Chapter ADD 1 ON Page;</pre>
        !          3047: 
        !          3048:   <p>If there is also a chapter counter</p>
        !          3049:   <pre>ChapterCtr : RANK OF Chapter;</pre>
        !          3050: 
        !          3051:   <p>the <a href="#sectc4231">content</a> of a presentation box created at the
        !          3052:   top of each page could be defined as:</p>
        !          3053:   <pre>Content : (VALUE(ChapterCtr, URoman) TEXT '-'
1.18      cvs      3054:            VALUE(ChapterPageCtr, Arabic));</pre>
1.30    ! cvs      3055: 
        !          3056:   <p>Thus, the presentation box contains the number of the chapter in
        !          3057:   upper-case roman numerals followed by a hyphen and the number of the page
        !          3058:   within the chapter in arabic numerals.</p>
1.18      cvs      3059: </blockquote>
1.30    ! cvs      3060: 
1.18      cvs      3061: <blockquote class="example">
1.30    ! cvs      3062:   <p><strong>Example:</strong></p>
        !          3063: 
        !          3064:   <p>To count tables and figures together in a document of the chapter type, a
        !          3065:   counter could be defined using:</p>
        !          3066:   <pre>CommonCtr : SET 0 ON Chapter ADD 1 ON Table
1.18      cvs      3067:             ADD 1 ON Figure;</pre>
                   3068: </blockquote>
                   3069: </div>
1.1       cvs      3070: 
1.18      cvs      3071: <div class="subsection">
1.30    ! cvs      3072: <h3><a name="sectc425">Presentation constants</a></h3>
1.1       cvs      3073: 
1.30    ! cvs      3074: <p>Presentation constants are used in the definition of the content of
1.18      cvs      3075: presentation boxes.  This content is used in <a href="#sectc426">variable
                   3076: definitions</a> and in the <a href="#sectc4231"><tt>Content</tt> rule</a>. The
1.1       cvs      3077: only presentation constants which can be used are character strings,
1.2       cvs      3078: mathematical symbols, graphical elements, and pictures, that is to say, base
1.18      cvs      3079: elements.</p>
1.30    ! cvs      3080: 
        !          3081: <p>Constants can be defined directly in the variables or presentation boxes
1.18      cvs      3082: (<tt>Content</tt> rule) which use them.  But it is only necessary them to
1.1       cvs      3083: declare once, in the constant declaration section, even though they are used
                   3084: in many variables or boxes.  Thus, each declared constant has a name, which
                   3085: allows it to be designated whenever it is used, a type (one of the four base
                   3086: types) and a value (a character string or a single character for mathematical
1.18      cvs      3087: symbols and graphical elements).</p>
1.30    ! cvs      3088: 
        !          3089: <p>The constant declarations appear after the keyword <tt>CONST</tt>.  Each
1.1       cvs      3090: declaration is composed of the name of the constant, an equals sign, a keyword
1.18      cvs      3091: representing its type (<tt>Text</tt>, <tt>Symbol</tt>, <tt>Graphics</tt> or
                   3092: <tt>Picture</tt>) and the string representing its value. A semi-colon
                   3093: terminates each declaration.</p>
1.30    ! cvs      3094: 
        !          3095: <p>In the case of a character string, the keyword <tt>Text</tt> can be
        !          3096: followed by the name of an alphabet (for example, <tt>Greek</tt> or
        !          3097: <tt>Latin</tt>) in which the constant's text should be expressed.  If the
        !          3098: alphabet name is absent, the Latin alphabet is used.  When the alphabet name
        !          3099: is present, only the first letter of the alphabet name is interpreted.  Thus,
        !          3100: the words <tt>Greek</tt> and <tt>Grec</tt> designate the same alphabet.  In
        !          3101: current versions of Thot, only the Greek and Latin alphabets are
        !          3102: available.</p>
1.18      cvs      3103: <pre>                 'CONST' ConstSeq
1.30    ! cvs      3104:      ConstSeq   = Const &lt; Const &gt; .
1.1       cvs      3105:      Const      = ConstID '=' ConstType ConstValue ';' .
                   3106:      ConstID    = NAME .
                   3107:      ConstType  ='Text' [ Alphabet ] / 'Symbol' /
                   3108:                  'Graphics' / 'Picture' .
                   3109:      ConstValue = STRING .
1.18      cvs      3110:      Alphabet   = NAME .</pre>
1.30    ! cvs      3111: 
        !          3112: <p>For character strings in the Latin alphabet (ISO Latin-1 character set),
1.1       cvs      3113: characters having codes higher than 127 (decimal) are represented by their
1.18      cvs      3114: code in octal.</p>
1.30    ! cvs      3115: 
        !          3116: <p>In the case of a symbol or graphical element, the value only contains a
        !          3117: single character, between apostrophes, which indicates the form of the element
        !          3118: which must be drawn in the box whose content is the constant.  The symbol or
1.1       cvs      3119: graphical element takes the dimensions of the box, which are determined by the
1.18      cvs      3120: <tt>Height</tt> and <tt>Width</tt> rules. See <a href="#sectb72">table of
                   3121: codes</a> for the symbols and graphical elements.</p>
1.30    ! cvs      3122: 
1.18      cvs      3123: <blockquote class="example">
1.30    ! cvs      3124:   <p><strong>Example:</strong></p>
        !          3125: 
        !          3126:   <p>The constants ``Summary:'' and fraction bar, which were described
        !          3127:   earlier, are declared:</p>
        !          3128:   <pre>CONST
1.1       cvs      3129:      SummaryConst = Text 'Summary:';
1.18      cvs      3130:      Bar          = Graphics 'h';</pre>
                   3131: </blockquote>
                   3132: </div>
1.1       cvs      3133: 
1.18      cvs      3134: <div class="subsection">
1.30    ! cvs      3135: <h3><a name="sectc426">Variables</a></h3>
1.1       cvs      3136: 
1.30    ! cvs      3137: <p>Variables permit the definition of computed content for presentation boxes.
        !          3138: A variable is associated with a presentation box by a <tt>Content</tt> rule;
        !          3139: but before being used in a <tt>Content</tt> rule, a variable can be defined in
        !          3140: the <tt>VAR</tt> section.  It is also possible to define a variable at the
        !          3141: time of its use in a <tt>Content</tt> rule, as can be done with a
        !          3142: constant.</p>
        !          3143: 
        !          3144: <p>A variable has a name and a value which is a character string resulting
        !          3145: from the concatenation of the values of a sequence of functions.  Each
        !          3146: variable declaration is composed of the variable name followed by a colon and
        !          3147: the sequence of functions which produces its value, separated by spaces.  Each
1.18      cvs      3148: declaration is terminated by a semi-colon.</p>
                   3149: <pre>                  'VAR' VarSeq
1.30    ! cvs      3150:      VarSeq      = Variable &lt; Variable &gt; .
1.1       cvs      3151:      Variable    = VarID ':' FunctionSeq ';' .
                   3152:      VarID       = NAME .
1.30    ! cvs      3153:      FunctionSeq = Function &lt; Function &gt; .</pre>
        !          3154: 
        !          3155: <p>Several functions are available.  The first two return, in the form of a
1.18      cvs      3156: character string, the current date.  <tt>DATE</tt> returns the date in
                   3157: English, while <tt>FDATE</tt> returns the date in french.</p>
1.30    ! cvs      3158: 
        !          3159: <p>Two other functions, <tt>DocName</tt> and <tt>DirName</tt>, return the
1.18      cvs      3160: document name and the directory where the document is stored.</p>
1.30    ! cvs      3161: 
        !          3162: <p>Function <tt>ElemName</tt> returns the type of the element which created
        !          3163: the presentation box whose contents are the variable.</p>
        !          3164: 
        !          3165: <p>Another function simply returns the value of a presentation constant. For
        !          3166: any constant declared in the <tt>CONST</tt> section, it is sufficient to give
        !          3167: the name of the constant.  Otherwise, the type and value of the constant must
        !          3168: be given, using the same form as in a <a href="#sectc425">constant
1.18      cvs      3169: declaration</a>. If the constant is not of type text, (types <tt>Symbol</tt>,
                   3170: <tt>Graphics</tt> or <tt>Picture</tt>), it must be alone in the variable
                   3171: definition; only constants of type <tt>Text</tt> can be mixed with other
                   3172: functions.</p>
1.30    ! cvs      3173: 
        !          3174: <p>It is also possible to obtain the value of an attribute, simply by
        !          3175: mentioning the attribute's name.  The value of this function is the value of
        !          3176: the attribute for the element which created the presentation box whose
        !          3177: contents are the variable.  If the creating element does not have the
        !          3178: indicated attribute, the value is an empty string.  In the case of a numeric
        !          3179: attribute, the attribute is translated into a decimal number in arabic
        !          3180: numerals.  If another form is desired, the <tt>VALUE</tt> function must be
        !          3181: used.</p>
        !          3182: 
        !          3183: <p>The last available function returns, as a character string, the value of a
1.1       cvs      3184: counter, an attribute or a page number. This value can be presented in
1.18      cvs      3185: different styles.  The keyword <tt>VALUE</tt> is followed (between
1.1       cvs      3186: parentheses) by the name of the counter, the name of the attribute, or the
1.18      cvs      3187: keyword <tt>PageNumber</tt> and the desired style, the two parameters being
1.1       cvs      3188: separated by a comma.  The style is a keyword which indicates whether the
1.18      cvs      3189: value should be presented in arabic numerals (<tt>Arabic</tt>), lower-case
                   3190: roman numerals (<tt>LRoman</tt>), or upper-case roman numerals
                   3191: (<tt>URoman</tt>), or by an upper-case letter (<tt>Uppercase</tt>) or
                   3192: lower-case letter (<tt>Lowercase</tt>).</p>
1.30    ! cvs      3193: 
        !          3194: <p>For a page counter, the keyword <tt>PageNumber</tt> can be followed,
        !          3195: between parentheses, by the name of the view from which to obtain the page
        !          3196: number.  By default, the first view declared in the <tt>VIEWS</tt> section is
        !          3197: used.  The value obtained is the number of the page on which is found the
        !          3198: element that is using the variable in a <tt>Content</tt> rule.</p>
        !          3199: 
        !          3200: <p>For an ordinary counter, the name of the counter can be preceded by the
1.18      cvs      3201: keyword <tt>MaxRangeVal</tt> or <tt>MinRangeVal</tt>.  These keywords mean
1.1       cvs      3202: that the value returned by the function is the maximum (minimum resp.) value
                   3203: taken by the counter in the whole document, not the value for the element
1.18      cvs      3204: concerned by the function.</p>
                   3205: <pre>     Function     = 'DATE' / 'FDATE' /
1.1       cvs      3206:                     'DocName' / 'DirName' /
                   3207:                     'ElemName' / 'AttributeName' /
                   3208:                      ConstID / ConstType ConstValue /
                   3209:                      AttrID /
                   3210:                     'VALUE' '(' PageAttrCtr ','
                   3211:                                 CounterStyle ')' .
1.6       cvs      3212:      PageAttrCtr  = 'PageNumber' [ '(' ViewID ')' ] /
1.1       cvs      3213:                      [ MinMax ] CounterID / AttrID .
                   3214:      CounterStyle = 'Arabic' / 'LRoman' / 'URoman' /
                   3215:                     'Uppercase' / 'Lowercase' .
1.18      cvs      3216:      MinMax       = 'MaxRangeVal' / 'MinRangeVal' .</pre>
1.30    ! cvs      3217: 
1.18      cvs      3218: <blockquote class="example">
1.30    ! cvs      3219:   <p><strong>Example:</strong></p>
        !          3220: 
        !          3221:   <p>To make today's date appear at the top of the first page of a report, a
        !          3222:   <a href="#sectc4232"><tt>CREATE</tt> rule</a> associated with the
        !          3223:   Report_Title element type generates a presentation box whose content
        !          3224:   (specified by the <tt>Content</tt> rule of that presentation box) is the
        !          3225:   variable:</p>
        !          3226:   <pre>VAR
1.18      cvs      3227:      Todays_date : TEXT 'Version of ' DATE;</pre>
1.30    ! cvs      3228: 
        !          3229:   <p>To produce, before each section title, the chapter number (in upper-case
        !          3230:   roman numerals) followed by the section number (in arabic numerals), two
        !          3231:   counters must be defined:</p>
        !          3232:   <pre>COUNTERS
1.1       cvs      3233:      ChapterCtr : RANK OF Chapter;
1.18      cvs      3234:      SectionCtr : RANK OF Section;</pre>
1.30    ! cvs      3235: 
        !          3236:   <p>and the Section_Title element must create a presentation box whose
        !          3237:   content is the variable</p>
        !          3238:   <pre>VAR
1.1       cvs      3239:      SectionNum : VALUE (ChapterCtr, URoman) TEXT '-'
1.18      cvs      3240:                   VALUE (SectionCtr, Arabic);</pre>
1.30    ! cvs      3241: 
        !          3242:   <p>In order to make the page number on which each section begins appear in
        !          3243:   the table of contents view next to the section title, each Section_Title
        !          3244:   element must create a presentation box, visible only in the table of
        !          3245:   contents view, whose content is the variable:</p>
        !          3246:   <pre>VAR
1.1       cvs      3247:      TitlePageNume :
1.18      cvs      3248:            VALUE (PageNumber(Full_text), Arabic);</pre>
                   3249: </blockquote>
                   3250: </div>
1.1       cvs      3251: 
1.18      cvs      3252: <div class="subsection">
1.30    ! cvs      3253: <h3><a name="sectc427">Default presentation rules</a></h3>
1.1       cvs      3254: 
1.30    ! cvs      3255: <p>In order to avoid having to specify, for each element type defined in the
1.1       cvs      3256: structure schema, values for every one of the numerous presentation
                   3257: parameters, the presentation schema allows the definition of a set of default
                   3258: presentation rules.  These rules apply to all the boxes of the elements
                   3259: defined in the structure schema and to the presentation boxes and page layout
                   3260: boxes defined in the presentation schema.  Only rules which differ from these
1.18      cvs      3261: default need to be specified in other sections of the presentation schema.</p>
1.30    ! cvs      3262: 
        !          3263: <p>For the primary view, the default rules can define every presentation
1.18      cvs      3264: parameter, but not the <a href="#presfunct">presentation functions</a> or the
                   3265: <a href="#sectc4223">linebreaking conditions</a> (the <tt>NoBreak1</tt>,
                   3266: <tt>NoBreak2</tt>, and <tt>Gather</tt> rules).</p>
1.30    ! cvs      3267: 
        !          3268: <p>In a presentation schema, the default presentation rules section is
        !          3269: optional; in this case, the <tt>DEFAULT</tt> keyword is also absent and the
        !          3270: following rules are considered to be the default rules:</p>
1.26      cvs      3271: <pre>   Visibility:        Enclosing =;
                   3272:    VertRef:           * . Left;
                   3273:    HorizRef:          Enclosed . HRef;
                   3274:    Height:            Enclosed . Height;
                   3275:    Width:             Enclosed . Width;
                   3276:    VertPos:           Top = Previous . Bottom;
                   3277:    HorizPos:          Left = Enclosing . Left;
                   3278:    MarginTop:         0;
                   3279:    MarginRight:       0;
                   3280:    MarginBottom:      0;
                   3281:    MarginLeft:        0;
                   3282:    PaddingTop:        0;
                   3283:    PaddingRight:      0;
                   3284:    PaddingBottom:     0;
                   3285:    PaddingLeft:       0;
                   3286:    BorderTopWidth:    0;
                   3287:    BorderRightWidth:  0;
                   3288:    BorderBottomWidth: 0;
                   3289:    BorderLeftWidth:   0;
                   3290:    BorderTopColor:    Foreground;
                   3291:    BorderRightColor:  Foreground;
                   3292:    BorderBottomColor: Foreground;
                   3293:    BorderLeftColor:   Foreground;
                   3294:    BorderTopStyle:    None;
                   3295:    BorderRightStyle:  None;
                   3296:    BorderBottomStyle: None;
                   3297:    BorderLeftStyle:   None;
                   3298:    VertOverflow:      No;
                   3299:    HorizOverflow:     No;
                   3300:    Size:              Enclosing =;
                   3301:    Style:             Enclosing =;
                   3302:    Weight:            Enclosing =;
                   3303:    Font:              Enclosing =;
                   3304:    Underline:         Enclosing =;
                   3305:    Thickness:         Enclosing =;
                   3306:    Indent:            Enclosing =;
                   3307:    LineSpacing:       Enclosing =;
                   3308:    Adjust:            Enclosing =;
                   3309:    Justify:           Enclosing =;
                   3310:    Hyphenate:         Enclosing =;
                   3311:    PageBreak:         Yes;
                   3312:    LineBreak:         Yes;
                   3313:    InLine:            Yes;
                   3314:    Depth:             0;
                   3315:    LineStyle:         Enclosing =;
                   3316:    LineWeight:        Enclosing =;
                   3317:    FillPattern:       Enclosing =;
                   3318:    Background:        Enclosing =;
                   3319:    Foreground:        Enclosing =;</pre>
1.30    ! cvs      3320: 
        !          3321: <p>If other values are desired for the default rules, they must be defined
1.1       cvs      3322: explicitly in the default rules section.  In fact, it is only necessary to
                   3323: define those default rules which differ from the ones above, since the rules
1.18      cvs      3324: above will be used whenever a rule is not explicitly named.</p>
1.30    ! cvs      3325: 
        !          3326: <p>Default rules for views other than the primary  view can also be specified.
1.1       cvs      3327: Otherwise, the default rules for the primary views are applied to the other
1.18      cvs      3328: views.</p>
1.30    ! cvs      3329: 
        !          3330: <p>Default rules are expressed in the same way as <a
        !          3331: href="#sectc4215">explicit rules for document elements</a>.</p>
1.18      cvs      3332: </div>
1.1       cvs      3333: 
1.18      cvs      3334: <div class="subsection">
1.30    ! cvs      3335: <h3><a name="sectc428">Presentation and page layout boxes</a></h3>
1.1       cvs      3336: 
1.30    ! cvs      3337: <p>The presentation process uses elements which are not part of the logical
1.1       cvs      3338: structure of the document, such as pages (which are the page layout boxes) or
                   3339: alternatively, rules, numbers, or words introducing certain parts of the
                   3340: document, such as ``Summary'', ``Appendices'', ``Bibliography'', etc. (which
1.18      cvs      3341: are presentation boxes).</p>
1.30    ! cvs      3342: 
        !          3343: <p>After the word <tt>BOXES</tt>, each presentation or page layout box is
        !          3344: defined by its name and a sequence of presentation rules which indicate how
        !          3345: they must be displayed.  These rules are the same as those which define the
        !          3346: boxes associated with element of the logical structure of the document, with a
1.18      cvs      3347: single exception, the <a href="#sectc4231"><tt>Content</tt> rule</a> which is
1.1       cvs      3348: used only to specify the content of presentation boxes.  The content of boxes
                   3349: associated with elements of the document structure is defined in each document
                   3350: or object and thus is not specified in the presentation schema, which applies
1.18      cvs      3351: to all documents or objects of a class.</p>
1.30    ! cvs      3352: 
        !          3353: <p>Among the rules which define a presentation box, certain ones can refer to
1.1       cvs      3354: another presentation box (for example, in their positional rules).  If the
                   3355: designated box is defined after the box which designates it, a
1.18      cvs      3356: <tt>FORWARD</tt> instruction followed by the name of the designated box must
                   3357: appear before the designation.</p>
                   3358: <pre>             'BOXES' BoxSeq
1.30    ! cvs      3359:      BoxSeq = Box &lt; Box &gt; .
1.1       cvs      3360:      Box    ='FORWARD' BoxID ';' /
                   3361:               BoxID ':' ViewRuleSeq .
1.18      cvs      3362:      BoxID  = NAME .</pre>
                   3363: </div>
1.1       cvs      3364: 
1.18      cvs      3365: <div class="subsection">
1.30    ! cvs      3366: <h3><a name="sectc429">Presentation of structured elements</a></h3>
1.1       cvs      3367: 
1.30    ! cvs      3368: <p>After the words <tt>RULES</tt>, the presentation schema gives the
        !          3369: presentation rules that apply to the elements whose types are defined in the
        !          3370: structure schema.  Only those rules which differ from the <a
1.18      cvs      3371: href="#sectc427">default</a> must be specified in the <tt>RULES</tt>
                   3372: section.</p>
1.30    ! cvs      3373: 
        !          3374: <p>The rule definitions for each element type are composed of the name of the
1.1       cvs      3375: element type (as specified in the structure schema) followed by a colon and
1.18      cvs      3376: the set of rules specific to that type.</p>
1.30    ! cvs      3377: 
        !          3378: <p>The type name can be preceded by a star in the special case where the
1.18      cvs      3379: structure schema defines an <a href="#sectd3284">inclusion</a> without
1.1       cvs      3380: expansion (or with partial expansion) of a type with the same name as an
1.18      cvs      3381: element of defined in the structure schema.</p>
1.30    ! cvs      3382: 
        !          3383: <p>In the case where the element is a <a href="#sectd3285">mark pair</a>, but
1.18      cvs      3384: only in this case, the type name can be preceded by the keywords
                   3385: <tt>First</tt> or <tt>Second</tt>.  These keywords indicate whether the rules
                   3386: that follow apply to the first or second mark of the pair.</p>
                   3387: <pre>                 'RULES' PresentSeq
1.30    ! cvs      3388:      PresentSeq = Present &lt; Present &gt; .
1.6       cvs      3389:      Present    = [ '*' ] [ FirstSec ] ElemID ':'
                   3390:                   ViewRuleSeq .
1.18      cvs      3391:      FirstSec   = 'First' / 'Second' .</pre>
1.30    ! cvs      3392: 
        !          3393: <p>A presentation schema can define presentation rules for base elements,
        !          3394: which are defined implicitly in the structure schemas.  In the English version
        !          3395: of the presentation schema compiler, the base type names are the same as in
        !          3396: the S language, but they are terminated by the <tt>_UNIT</tt> suffix:
1.18      cvs      3397: <tt>TEXT_UNIT</tt>, <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>,
                   3398: <tt>GRAPHICS_UNIT</tt>.  The base type names are written in upper-case
                   3399: letters.</p>
                   3400: </div>
                   3401: 
                   3402: <div class="subsection">
1.30    ! cvs      3403: <h3><a name="sectc4210">Logical attribute presentation</a></h3>
1.18      cvs      3404: 
1.30    ! cvs      3405: <p>After the keyword <tt>ATTRIBUTES</tt>, all attributes which are to have
        !          3406: some effect on the presentation of the element to which they are attached must
        !          3407: be mentioned, along with the corresponding presentation rules.  This is true
        !          3408: for both global attributes (which can be attached to all element types) and
        !          3409: local attributes (which can only be attached to certain element types).</p>
        !          3410: 
        !          3411: <p>Also mentioned in this section are attributes which imply an effect on
1.1       cvs      3412: elements in the subtree of the element to which they are attached. The
                   3413: presentation of these descendants  can be modified as a function of the value
                   3414: of the attribute which they inherit, just as if it was attached to them
1.18      cvs      3415: directly.</p>
1.30    ! cvs      3416: 
        !          3417: <p>The specification for each attribute includes the attribute's name,
        !          3418: followed by an optional value specification and, after a colon, a set of
        !          3419: rules.  The set of rules must contain at least one rule.</p>
        !          3420: 
        !          3421: <p>When there is no value specification, the rules are applied to all elements
1.1       cvs      3422: which carry the attribute, no matter what their value.  When the rules must
                   3423: only apply when the attribute has certain values, these values must be
1.18      cvs      3424: specified.  Thus, the same attribute can appear in the <tt>ATTRIBUTES</tt>
1.1       cvs      3425: section several times, with each appearance having a different value
                   3426: specification.  However, reference attributes never have a value specification
1.18      cvs      3427: and, as a result, can only appear once in the <tt>ATTRIBUTES</tt> section.</p>
1.30    ! cvs      3428: 
        !          3429: <p>To specify that the presentation rules apply to some of the descendants of
        !          3430: the element having the attribute, the name of the affected element type is
        !          3431: given, between parentheses, after the attribute name.  This way, the
        !          3432: presentation rules for the attribute will be applied to the element having the
        !          3433: attribute, if it is of the given type, and to all of its descendants of the
        !          3434: given type. In the case where this type is a <a href="#sectd3285">mark
        !          3435: pair</a>, but only in this case, the type name can be preceded by the keywords
        !          3436: <tt>First</tt> or <tt>Second</tt>.  These keywords indicate whether the rules
        !          3437: that follow apply to the first or second mark of the pair. If the rule must
        !          3438: apply to several different element types, the specification must be repeated
        !          3439: for each element type.</p>
        !          3440: 
        !          3441: <p>The specification of values for which the presentation rules will be
        !          3442: applied varies according to the type of the attribute:</p>
1.18      cvs      3443: <dl>
1.30    ! cvs      3444:   <dt>numeric attribute</dt>
        !          3445:     <dd>If the rules are to apply for one value of the attribute, then the
        !          3446:       attribute name is followed by an equals sign and this value.  If the
        !          3447:       rules are to apply for all values less than (or greater than) a
        !          3448:       threshold value, non-inclusive, the attribute name followed by a '&lt;'
        !          3449:       sign (or a '&gt;' sign, respectively) and the threshold value.  If the
        !          3450:       rules must apply to a range of values, the attribute name is followed by
        !          3451:       the word '<tt>IN</tt>' and the two bounds of the range, enclosed in
        !          3452:       brackets and separated by two periods ('<tt>..</tt>').  In the case of
        !          3453:       ranges, the values of the bounds are included in the range.
        !          3454:       <p>The threshold value in the comparisons can be the value of an
        !          3455:       attribute attached to an ancestor element.  In this case, the attribute
        !          3456:       name is given instead of a constant value.</p>
        !          3457:       <p>It is also possible to write rules which apply only when a comparison
        !          3458:       between two different attributes of the element's ancestors is true. In
        !          3459:       this case, the first attribute name is followed by a comparison keyword
        !          3460:       and the name of the second attribute.  The comparison keywords are
        !          3461:       <tt>EQUAL</tt> (simple equality), <tt>LESS</tt> (non-inclusive less
        !          3462:       than), and <tt>GREATER</tt> (non-inclusive greater than).</p>
        !          3463:     </dd>
        !          3464:   <dt>text attribute</dt>
        !          3465:     <dd>If the rules are to apply for one value of the attribute, then the
        !          3466:       attribute name is followed by an equals sign and this value.</dd>
        !          3467:   <dt>reference attribute</dt>
        !          3468:     <dd>There is never a value specification; the rules apply no matter what
        !          3469:       element is designated by the attribute.</dd>
        !          3470:   <dt>enumerated attribute</dt>
        !          3471:     <dd>If the rules are to apply for one value of the attribute, then the
        !          3472:       attribute name is followed by an equals sign and this value.</dd>
1.18      cvs      3473: </dl>
1.30    ! cvs      3474: 
        !          3475: <p>The order in which the rules associated with a numeric attribute are
        !          3476: defined is important.  When multiple sets of rules can be applied, the first
        !          3477: set declared is the one used.</p>
        !          3478: 
        !          3479: <p>Rules for attributes have priority over both default rules and rules
1.1       cvs      3480: associated with element types.  The attribute rules apply to the element to
                   3481: which the attribute is attached.  It is the rules which apply to the
                   3482: surrounding elements (and especially to the descendants) which determine the
                   3483: effect of the attribute rules on the environment ( and especially on the
1.18      cvs      3484: terminal elements of the structure).</p>
                   3485: <pre>                    'ATTRIBUTES' PresAttrSeq
1.30    ! cvs      3486:      PresAttrSeq  = PresAttr &lt; PresAttr &gt; .
1.1       cvs      3487:      PresAttr     = AttrID [ '(' [ FirstSec ] ElemID ')' ]
                   3488:                     [ AttrRelation ] ':' ViewRuleSeq .
                   3489:      AttrID       = NAME .
                   3490:      AttrRelation ='=' AttrVal /
1.30    ! cvs      3491:                     '&gt;' [ '-' ] MinValue /
1.1       cvs      3492:                     '&lt;' [ '-' ] MaxValue /
                   3493:                     'IN' '[' [ '-' ] LowerBound '..'
                   3494:                     [ '-' ] UpperBound ']' /
                   3495:                     'GREATER' AttrID /
                   3496:                     'EQUAL' AttrID /
                   3497:                     'LESS' AttrID .
                   3498:      AttrVal      = [ '-' ] EqualNum / EqualText /
                   3499:                     AttrValue .
                   3500:      MinValue     = NUMBER .
                   3501:      MaxValue     = NUMBER .
                   3502:      LowerBound   = NUMBER .
                   3503:      UpperBound   = NUMBER.
                   3504:      EqualNum     = NUMBER .
                   3505:      EqualText    = STRING .
1.18      cvs      3506:      AttrValue    = NAME .</pre>
1.30    ! cvs      3507: 
        !          3508: <p>In presentation rules associated with a numeric attribute (and only in such
1.1       cvs      3509: rules), the attribute name can be used in place of a numeric value.  In this
                   3510: case, the value of the attribute is used in the application of the rule. Thus,
                   3511: the attribute can represent a relation between the size of two boxes, the
                   3512: height and width of a box, the height of an area where page breaks are
                   3513: prohibited, the distance between two boxes, the position of the reference axis
                   3514: of a box, the interline spacing,  the indentation of the first line, the
1.18      cvs      3515: visibility, the depth (z-order), or the character set.</p>
1.30    ! cvs      3516: 
        !          3517: <p>The presentation rules associated with reference attributes, it is possible
        !          3518: to use the element designated by the attribute as a reference box in a
        !          3519: positional or extent rule.  This element is represented in the <a
1.18      cvs      3520: href="#sectc4218">position</a> or <a href="#sectc4219">extent</a> rule by the
                   3521: keyword <tt>Referred</tt>.</p>
1.30    ! cvs      3522: 
1.18      cvs      3523: <blockquote class="example">
1.30    ! cvs      3524:   <p><strong>Example:</strong></p>
        !          3525: 
        !          3526:   <p>In all structure schemas, there is a global Language attribute defined as
        !          3527:   follows:</p>
        !          3528:   <pre>ATTR
1.18      cvs      3529:      Language = TEXT;</pre>
1.30    ! cvs      3530: 
        !          3531:   <p>The following rules would make French text be displayed in roman
        !          3532:   characters and English text be displayed in italics:</p>
        !          3533:   <pre>ATTRIBUTES
1.1       cvs      3534:      Language = 'French' :
1.6       cvs      3535:                 Style : Roman;
1.1       cvs      3536:      Language = 'English' :
1.18      cvs      3537:                 Style : Italics;</pre>
1.30    ! cvs      3538: 
        !          3539:   <p>Using these rules, when the user puts the Language attribute with the
        !          3540:   value 'English' on the summary of a document, every character string
        !          3541:   (terminal elements) contained in the summary are displayed in italics.  See
        !          3542:   the <a href="#sectd42252"><tt>Style</tt> rule</a>.</p>
1.18      cvs      3543: </blockquote>
1.30    ! cvs      3544: 
1.18      cvs      3545: <blockquote class="example">
1.30    ! cvs      3546:   <p><strong>Example:</strong></p>
        !          3547: 
        !          3548:   <p>A numeric attribute representing the importance of the part of the
        !          3549:   document to which it is attached can be defined:</p>
        !          3550:   <pre>ATTR
1.18      cvs      3551:      Importance = INTEGER;</pre>
1.30    ! cvs      3552: 
        !          3553:   <p>In the presentation schema, the importance of an element is reflected in
        !          3554:   the choice of character size, using the following rules.</p>
        !          3555:   <pre>ATTRIBUTES
1.1       cvs      3556:      Importance &lt; 2 :
                   3557:               Size : 1;
                   3558:      Importance IN [2..4] :
                   3559:               Size : Importance;
                   3560:      Importance = 10 :
                   3561:               Size : 5;
1.30    ! cvs      3562:      Importance &gt; 4 :
1.18      cvs      3563:               Size : 4;</pre>
1.30    ! cvs      3564: 
        !          3565:   <p>Thus, the character size corresponds to the value of the Importance
        !          3566:   attribute; its value is</p>
        !          3567:   <ul>
        !          3568:     <li>the value of the Importance attribute when the value is between 2 and
        !          3569:       4 (inclusive),</li>
        !          3570:     <li>1, when the value of the Importance attribute is less than 2,</li>
        !          3571:     <li>4, when the value of the Importance attribute is greater than 4,</li>
        !          3572:     <li>5, when the value of the Importance attribute is 10.</li>
        !          3573:   </ul>
        !          3574: 
        !          3575:   <p>The last case (value 5) must be defined before the case which handles all
        !          3576:   Importance values greater than 4, because the two rules are not disjoint and
        !          3577:   the first one defined will have priority.  Otherwise, when the Importance
        !          3578:   attribute has value 10, the font size will be 4.</p>
1.18      cvs      3579: </blockquote>
1.30    ! cvs      3580: 
1.18      cvs      3581: <blockquote class="example">
1.30    ! cvs      3582:   <p><strong>Example:</strong></p>
        !          3583: 
        !          3584:   <p>Suppose the structure defines a list element which can have an attribute
        !          3585:   defining the type of list (numbered or not):</p>
        !          3586:   <pre>STRUCT
1.1       cvs      3587:     list (ATTR list_type = enumeration, dash)
1.18      cvs      3588:          = LIST OF (list_item = TEXT);</pre>
1.30    ! cvs      3589: 
        !          3590:   <p>Then, the presentation schema could use the attribute placed on the list
        !          3591:   element to put either a dash or a number before the each element of the
        !          3592:   list:</p>
        !          3593:   <pre>ATTRIBUTES
1.1       cvs      3594:    list_type (list_item) = enumeration :
                   3595:         CreateBefore (NumberBox);
                   3596:    list_type (list_item) = dash :
1.18      cvs      3597:         CreateBefore (DashBox);</pre>
                   3598: </blockquote>
1.30    ! cvs      3599: 
1.18      cvs      3600: <blockquote class="example">
1.30    ! cvs      3601:   <p><strong>Example:</strong></p>
        !          3602: 
        !          3603:   <p>Suppose that two attributes are defined in the structure schema.  The
        !          3604:   first is a numeric global attribute called ``version''.  The other is a
        !          3605:   local attribute defined on the root of the document called
        !          3606:   ``Document_version'':</p>
        !          3607:   <pre>STRUCTURE Document
1.1       cvs      3608: ATTR
                   3609:     version = INTEGER;
                   3610: STRUCT
                   3611:     Document (ATTR Document_version = INTEGER) =
                   3612:         BEGIN
                   3613:         SomeElement ;
                   3614:         ...
                   3615:         SomeOtherElement ;
                   3616:         END ;
1.18      cvs      3617: ...</pre>
1.30    ! cvs      3618: 
        !          3619:   <p>These attributes can be used in the presentation schema to place change
        !          3620:   bars in the margin next to elements whose version attribute has a value
        !          3621:   equal to the Document_version attribute of the root and to place a star in
        !          3622:   margin of elements whose version attribute is less than the value of the
        !          3623:   root's Document_version attribute:</p>
        !          3624:   <pre>ATTRIBUTES
1.1       cvs      3625:     version EQUAL Document_version :
                   3626:         CreateBefore (ChangeBarBox) ;
                   3627:     version LESS Document_version :
1.18      cvs      3628:         CreateBefore (StarBox) ;</pre>
                   3629: </blockquote>
                   3630: </div>
1.1       cvs      3631: 
1.18      cvs      3632: <div class="subsection">
1.30    ! cvs      3633: <h3><a name="sectc4212">Value transmission rules</a></h3>
1.1       cvs      3634: 
1.30    ! cvs      3635: <p>The last section of a presentation schema, which is optional, serves to
1.1       cvs      3636: defines the way in which a document transmits certain values to its
1.18      cvs      3637: sub-documents.  A sub-document is an document <a
                   3638: href="#inclusion">included</a> without expansion or with partial expansion.
1.1       cvs      3639: The primary document can transmit to its sub-documents the values of certain
                   3640: counters or the textual content of certain of its elements, as a function of
1.18      cvs      3641: their type.</p>
1.30    ! cvs      3642: 
        !          3643: <p>The sub-documents receive these values in attributes which must be defined
        !          3644: in their structure schema as local attributes of the root element.  The types
        !          3645: of these attributes must correspond to the type of the value which they
        !          3646: receive: numeric attributes for receiving the value of a counter, textual
        !          3647: attributes for receiving the content of an element.</p>
        !          3648: 
        !          3649: <p>In the structure schema of the primary document, there appears at the end,
1.18      cvs      3650: after the <tt>TRANSMIT</tt> keyword, a sequence of transmission rules.  Each
1.1       cvs      3651: rule begins with the name of the counter to transmit or of the element type
                   3652: whose textual content will be transmitted.  This name is followed by the
1.18      cvs      3653: keyword <tt>To</tt> and the name of the attribute of the sub-document to which
1.1       cvs      3654: the value is transmitted.  The sub-document class is indicated between
                   3655: parentheses after the name of the attribute.  The transmission rule ends with
1.18      cvs      3656: a semicolon.</p>
1.30    ! cvs      3657: <pre>     TransmitSeq   =  Transmit &lt; Transmit &gt; .
1.1       cvs      3658:      Transmit      =  TypeOrCounter 'To' ExternAttr
                   3659:                       '(' ElemID ')' ';' .
                   3660:      TypeOrCounter =  CounterID / ElemID .
1.18      cvs      3661:      ExternAttr    =  NAME .</pre>
1.30    ! cvs      3662: 
1.18      cvs      3663: <blockquote class="example">
1.30    ! cvs      3664:   <p><strong>Example:</strong></p>
        !          3665: 
        !          3666:   <p>Consider a Book document class which includes instances of the Chapter
        !          3667:   document class.  These classes might have the following schemas:</p>
        !          3668:   <pre>STRUCTURE Book
1.1       cvs      3669: STRUCT
                   3670:    Book = BEGIN
                   3671:           Title = Text;
                   3672:           Body  = LIST OF (Chapter INCLUDED);
                   3673:           END;
                   3674:    ...
                   3675: 
                   3676: STRUCTURE Chapter
                   3677: STRUCT
                   3678:    Chapter (ATTR FirstPageNum = Integer;
                   3679:                  ChapterNum = Integer;
                   3680:                  CurrentTitle   = Text) =
1.6       cvs      3681:           BEGIN
                   3682:           ChapterTitle = Text;
                   3683:           ...
                   3684:           END;
1.18      cvs      3685:    ...</pre>
1.30    ! cvs      3686: 
        !          3687:   <p>Then the presentation schema for books could define chapter and page
        !          3688:   counters. The following transmission rules in the book presentation schema
        !          3689:   would transmit values for the three attributes defined at the root of each
        !          3690:   chapter sub-document.</p>
        !          3691:   <pre>PRESENTATION Book;
1.1       cvs      3692: VIEWS
                   3693:    Full_text;
                   3694: COUNTERS
                   3695:    ChapterCtr: Rank of Chapter;
                   3696:    PageCtr: Rank of Page(Full_text);
                   3697: ...
                   3698: TRANSMIT
                   3699:    PageCtr TO FirstPageNum(Chapter);
                   3700:    ChapterCtr TO ChapterNum(Chapter);
                   3701:    Title TO CurrentTitle(Chapter);
1.18      cvs      3702: END</pre>
1.30    ! cvs      3703: 
        !          3704:   <p>Thus, each chapter included in a book can number its pages as a function
        !          3705:   of the number of pages preceding it in the book, can make the chapter's
        !          3706:   number appear before the number of each of its sections, or can place the
        !          3707:   title of the book at the top of each page.</p>
1.18      cvs      3708: </blockquote>
                   3709: </div>
1.1       cvs      3710: 
1.18      cvs      3711: <div class="subsection">
1.30    ! cvs      3712: <h3><a name="sectc4213">Presentation rules</a></h3>
1.1       cvs      3713: 
1.30    ! cvs      3714: <p>Whether defining the appearance of a presentation or page layout box, an
1.1       cvs      3715: element type, or an attribute value, the set of presentation rules that apply
1.18      cvs      3716: is always defined in the same way.</p>
1.30    ! cvs      3717: 
        !          3718: <p>Normally, a set of presentation rules is placed between the keywords
1.18      cvs      3719: <tt>BEGIN</tt> and <tt>END</tt>, the keyword <tt>END</tt> being followed by a
1.1       cvs      3720: semicolon.  The first section of this block defines the rules that apply to
1.18      cvs      3721: the primary view, if the <a href="#sectc427">default rules</a> are not
1.1       cvs      3722: completely suitable.  Next comes the rules which apply to specific other
                   3723: views, with a rule sequence for each view for which the default rules are not
                   3724: satisfactory.  If the default rules are suitable for the non-primary views,
                   3725: there will not be any specific rules for these views.  If there is only one
1.18      cvs      3726: rule which applies to all views then the keywords <tt>BEGIN</tt> and
                   3727: <tt>END</tt> need not appear.</p>
1.30    ! cvs      3728: 
        !          3729: <p>For each view, it is only necessary to specify those rules which differ
        !          3730: from the default rules for the view, so that for certain views (or even all
        !          3731: views), there may be no specific rules.</p>
        !          3732: 
        !          3733: <p>The specific rules for a non-primary view are introduced by the <a
1.18      cvs      3734: name="inkeyword"><tt>IN</tt> keyword</a>, followed by the view name.  The
                   3735: rules for that view follow, delimited by the keywords <tt>BEGIN</tt> and
                   3736: <tt>END</tt>, or without these two keywords when there is only one rule.</p>
1.30    ! cvs      3737: 
        !          3738: <p><strong>Note:</strong> the view name which follows the <tt>IN</tt> keyword
1.1       cvs      3739: must not be the name of the primary view, since the rules for that view are
1.18      cvs      3740: found before the rules for the other views.</p>
1.30    ! cvs      3741: 
        !          3742: <p>Within each block concerning a view, other blocks can appear, delimited by
        !          3743: the same keywords <tt>BEGIN</tt> and <tt>END</tt>.  Each of these blocks
        !          3744: gathers the presentation rules that apply, for a given view, only when a given
1.1       cvs      3745: condition is satisfied.  Each block is preceded by a condition introduced by
1.18      cvs      3746: the <tt>IF</tt> keyword.  If such a conditional block contains only one rule,
                   3747: the keywords <tt>BEGIN</tt> and <tt>END</tt> can be omitted.</p>
1.30    ! cvs      3748: 
        !          3749: <p>Although the syntax allows any presentation rule to appear in a conditional
1.18      cvs      3750: block, only <a href="#sectc4232">creation rules</a> are allowed after any
                   3751: condition; other rules are allowed only after conditions <tt>Within</tt> and
1.1       cvs      3752: ElemID.  In addition, the following rules cannot be conditional:
1.18      cvs      3753: <tt>PageBreak, LineBreak, Inline, Gather</tt>.</p>
1.30    ! cvs      3754: 
        !          3755: <p>For a given view, the rules that apply without any condition must appear
1.1       cvs      3756: before the first conditional block.  If some rules apply only when none of the
                   3757: specified condition holds, they are grouped in a block preceded by the keyword
1.18      cvs      3758: <tt>Otherwise</tt>, and that block must appear after the last conditionnal
                   3759: block concerning the same view.</p>
1.30    ! cvs      3760: <pre>     ViewRuleSeq  = 'BEGIN' &lt; RulesAndCond &gt; &lt; ViewRules &gt;
1.1       cvs      3761:                     'END' ';' /
                   3762:                     ViewRules / CondRules / Rule .
                   3763:      RulesAndCond = CondRules / Rule .
                   3764:      ViewRules    = 'IN' ViewID CondRuleSeq .
1.30    ! cvs      3765:      CondRuleSeq  = 'BEGIN' &lt; RulesAndCond &gt; 'END' ';' /
1.1       cvs      3766:                     CondRules / Rule .
1.30    ! cvs      3767:      CondRules    = CondRule &lt; CondRule &gt;
1.1       cvs      3768:                     [ 'Otherwise' RuleSeq ] .
                   3769:      CondRule     = 'IF' ConditionSeq RuleSeq .
1.30    ! cvs      3770:      RulesSeq     = 'BEGIN' Rule &lt; Rule &gt; 'END' ';' /
1.18      cvs      3771:                     Rule .</pre>
1.30    ! cvs      3772: 
1.18      cvs      3773: <blockquote class="example">
1.30    ! cvs      3774:   <p><strong>Example:</strong></p>
        !          3775: 
        !          3776:   <p>The following rules for a report's title make the title visible in the
        !          3777:   primary view and invisible in the table of contents and in the formula views
        !          3778:   (see the <a href="#sectc4224"><tt>Visibility</tt> rule</a>).</p>
        !          3779:   <pre>Title : BEGIN
1.1       cvs      3780:         Visibility : 1;
                   3781:         ...    {Other rules for the primary view}
                   3782:         IN Table_of_contents
                   3783:            Visibility : 0;
                   3784:         IN Formulas
                   3785:            Visibility : 0;
1.18      cvs      3786:         END;</pre>
                   3787: </blockquote>
                   3788: </div>
1.1       cvs      3789: 
1.18      cvs      3790: <div class="subsection">
1.30    ! cvs      3791: <h3><a name="sectc4214">Conditions applying to presentation rules</a></h3>
1.1       cvs      3792: 
1.30    ! cvs      3793: <p>Many conditions can be applied to presentation rules.  Conditions allow
1.1       cvs      3794: certain presentation rules to apply only in certain cases.  These conditions
                   3795: can be based on the structural position of the element.  They can be based on
                   3796: whether the element has references, and what type of references, whether the
                   3797: element has attributes, whether the element is empty or not.  They can also be
1.18      cvs      3798: based on the value of a counter.</p>
1.30    ! cvs      3799: 
        !          3800: <p>It is possible to specify several conditions which must all be true for the
1.18      cvs      3801: rules to apply.</p>
1.30    ! cvs      3802: 
        !          3803: <p>A set of conditions is specified by the <tt>IF</tt> keyword.  This keyword
        !          3804: is followed by the sequence of conditions, separated by the <tt>AND</tt>
        !          3805: keyword. Each condition is specified by a keyword which defines the condition
        !          3806: type. In some cases, the keyword is followed by other data, which specify the
        !          3807: condition more precisely.</p>
        !          3808: 
        !          3809: <p>An elementary condition can be negative; it is then preceded by the
1.18      cvs      3810: <tt>NOT</tt> keyword.</p>
1.30    ! cvs      3811: 
        !          3812: <p>When the presentation rule(s) controlled by the condition apply to a
        !          3813: reference element or a reference attribute, an elementary condition can also
        !          3814: apply to element referred by this reference.  The <tt>Target</tt> keyword is
        !          3815: used for that purpose.  It must appear before the keyword defining the
        !          3816: condition type.</p>
1.18      cvs      3817: <pre>     CondRule      ='IF' ConditionSeq RuleSeq .
1.30    ! cvs      3818:      ConditionSeq  = Condition &lt; 'AND' Condition &gt; .
1.1       cvs      3819:      Condition     = [ 'NOT' ] [ 'Target' ] ConditionElem .
                   3820:      ConditionElem ='First' / 'Last' /
                   3821:                      [ 'Immediately' ] 'Within' [ NumParent ]
                   3822:                                        ElemID [ ExtStruct ] /
                   3823:                      ElemID /
                   3824:                     'Referred' / 'FirstRef' / 'LastRef' /
                   3825:                     'ExternalRef' / 'InternalRef' / 'CopyRef' /
                   3826:                     'AnyAttributes' / 'FirstAttr' / 'LastAttr' /
                   3827:                     'UserPage' / 'StartPage' / 'ComputedPage' /
                   3828:                     'Empty' /
                   3829:                     '(' [ MinMax ] CounterName CounterCond ')' /
                   3830:                      CondPage '(' CounterID ')' .
                   3831:      NumParent     = [ GreaterLess ] NParent .
1.30    ! cvs      3832:      GreaterLess   ='&gt;' / '&lt;' .
1.1       cvs      3833:      NParent       = NUMBER.
1.6       cvs      3834:      ExtStruct     ='(' ElemID ')' .
1.30    ! cvs      3835:      CounterCond   ='&lt;' MaxCtrVal / '&gt;' MinCtrVal /
1.1       cvs      3836:                     '=' EqCtrVal / 
                   3837:                     'IN' '[' ['-'] MinCtrBound '.' '.'
                   3838:                      ['-'] MaxCtrBound ']' .
                   3839:      PageCond      ='Even' / 'Odd' / 'One' .
                   3840:      MaxCtrVal     = NUMBER .
                   3841:      MinCtrVal     = NUMBER .
                   3842:      EqCtrVal      = NUMBER .
                   3843:      MaxCtrBound   = NUMBER .
1.18      cvs      3844:      MinCtrBound   = NUMBER .</pre>
1.1       cvs      3845: 
1.18      cvs      3846: <div class="subsubsection">
                   3847: <h4><a name="sectd42141">Conditions based on the logical position of the
                   3848: element</a></h4>
1.30    ! cvs      3849: 
        !          3850: <p>The condition can be on the position of the element in the document's
        !          3851: logical structure tree.  It is possible to test whether the element is the
        !          3852: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is
        !          3853: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>). These
1.18      cvs      3854: conditions can be associated only with <a href="#sectc4232">creation
                   3855: rules</a>.</p>
1.30    ! cvs      3856: 
        !          3857: <p>It is also possible to test if the element is contained in an element of a
1.18      cvs      3858: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). The type
                   3859: is indicated after the keyword <tt>Within</tt>. If that element type is
1.1       cvs      3860: defined in a structure schema which is not the one which corresponds to the
                   3861: presentation schema, the type name of this element must be followed, between
1.18      cvs      3862: parentheses, by the name of the structure schema which defines it.</p>
1.30    ! cvs      3863: 
        !          3864: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the
1.18      cvs      3865: condition is satisfied only if the <em>parent</em> element has the type
                   3866: indicated. If the word <tt>Immediately</tt> is missing, the condition is
                   3867: satisfied if any <em>ancestor</em> has the type indicated.</p>
1.30    ! cvs      3868: 
        !          3869: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the
1.1       cvs      3870: type.  It specifies the number of ancestors of the indicated type that must be
                   3871: present for the condition to be satisfied.  If the keyword
1.18      cvs      3872: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the
                   3873: element must have the indicated type.  The integer <i>n</i> must be positive
1.30    ! cvs      3874: or zero.  It can be preceded by <tt>&lt;</tt> or <tt>&gt;</tt> to indicate a
1.1       cvs      3875: maximum or minimum number of ancestors.  If these symbols are missing, the
1.18      cvs      3876: condition is satisfied only if it exists exactly <i>n</i> ancestors.  When
1.30    ! cvs      3877: this number is missing, it is equivalent to &gt; 0.</p>
        !          3878: 
        !          3879: <p>If the condition applies to presentation rules associated with an
        !          3880: attribute, in the <tt>ATTRIBUTES</tt> section of the presentation schema, the
        !          3881: condition can be simply an element name. Presentation rules are then executed
        !          3882: only if the attribute is attached to an element of that type. The keyword
        !          3883: <tt>NOT</tt> before the element name indicates that the presentation rules
        !          3884: must be executed only if the element is not of the type indicated.</p>
1.18      cvs      3885: </div>
1.1       cvs      3886: 
1.18      cvs      3887: <div class="subsubsection">
1.30    ! cvs      3888: <h4><a name="sectd42142">Conditions on references</a></h4>
        !          3889: 
        !          3890: <p>References may be taken into account in conditions, which can be based on
        !          3891: the fact that the element, or one of its ancestors, is designated by a at
        !          3892: least one reference (<tt>Referred</tt>) or by none (<tt>NOT
        !          3893: Referred</tt>).</p>
        !          3894: 
        !          3895: <p>If the element or attribute to which the condition is attached is a
        !          3896: reference, the condition can be based on the fact that it acts as the first
        !          3897: reference to the designated element (<tt>FirstRef</tt>), or as the last
        !          3898: (<tt>LastRef</tt>), or as a reference to an element located in another
        !          3899: document (<tt>ExternalRef</tt>) or in the same document
        !          3900: (<tt>InternalRef</tt>).</p>
1.1       cvs      3901: 
1.30    ! cvs      3902: <p>The condition can also be based on the fact that the element is an <a
1.18      cvs      3903: href="#inclusion">inclusion</a>.  This is noted (<tt>CopyRef</tt>).</p>
1.30    ! cvs      3904: 
        !          3905: <p>Like all conditions, conditions on references can be inverted by the
1.18      cvs      3906: <tt>NOT</tt> keyword. These conditions can be associated only with <a
                   3907: href="#sectc4232">creation rules</a>.</p>
                   3908: </div>
1.1       cvs      3909: 
1.18      cvs      3910: <div class="subsubsection">
1.30    ! cvs      3911: <h4><a name="sectd42143">Conditions on logical attributes</a></h4>
        !          3912: 
        !          3913: <p>The condition can be based on the presence or absence of attributes
        !          3914: associated with the element, no matter what the attributes or their values.
        !          3915: The <tt>AnyAttributes</tt> keyword expresses this condition.</p>
1.1       cvs      3916: 
1.30    ! cvs      3917: <p>If the condition appears in the presentation rules of an attribute, the
1.18      cvs      3918: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate that
1.1       cvs      3919: the rules must only be applied if this attribute is the first attribute for
                   3920: the element or if it is the last (respectively).  These conditions can also be
1.18      cvs      3921: inverted by the <tt>NOT</tt> keyword. These conditions can be associated only
                   3922: with <a href="#sectc4232">creation rules</a>.</p>
1.30    ! cvs      3923: 
        !          3924: <p>It is also possible to apply certain presentation rules only when the
        !          3925: element being processed or one of its ancestors has a certain attribute,
        !          3926: perhaps with a certain value.  This can be done in the <a
1.18      cvs      3927: href="#sectc4210"><tt>ATTRIBUTES</tt> section</a>.</p>
                   3928: </div>
1.1       cvs      3929: 
1.18      cvs      3930: <div class="subsubsection">
1.30    ! cvs      3931: <h4><a name="sectd42144">Conditions on page breaks</a></h4>
1.1       cvs      3932: 
1.30    ! cvs      3933: <p>The page break base type (and only this type) can use the following
1.18      cvs      3934: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, and <tt>UserPage</tt>.
                   3935: The <tt>ComputedPage</tt> condition indicates that the presentation rule(s)
1.1       cvs      3936: should apply if the page break was created automatically by Thot;  the
1.18      cvs      3937: <tt>StartPage</tt> condition is true if the page break is generated before the
                   3938: element by the <tt>Page</tt> rule; and the <tt>UserPage</tt> condition applies
                   3939: if the page break was inserted by the user.</p>
1.30    ! cvs      3940: 
        !          3941: <p>These conditions can be associated only with <a href="#sectc4232">creation
1.18      cvs      3942: rules</a>.</p>
                   3943: </div>
1.1       cvs      3944: 
1.18      cvs      3945: <div class="subsubsection">
1.30    ! cvs      3946: <h4><a name="sectd42145">Conditions on the element's content</a></h4>
1.1       cvs      3947: 
1.30    ! cvs      3948: <p>The condition can be based on whether or not the element is empty.  An
        !          3949: element which has no children or whose leaves are all empty is considered to
        !          3950: be empty itself.  This condition is expressed by the <tt>Empty</tt> keyword,
        !          3951: optionally preceded by the <tt>NOT</tt> keyword. This condition can be
        !          3952: associated only with <a href="#sectc4232">creation rules</a>.</p>
1.18      cvs      3953: </div>
1.1       cvs      3954: 
1.18      cvs      3955: <div class="subsubsection">
1.30    ! cvs      3956: <h4><a name="sectd42146">Conditions on counters</a></h4>
1.1       cvs      3957: 
1.30    ! cvs      3958: <p>Presentation rules can apply when the counter's value is one, is even or
        !          3959: odd, is equal, greater than or less than a given value or falls in a range of
1.1       cvs      3960: values.  This is particularly useful for creating header and footer boxes.
1.18      cvs      3961: These conditions can be associated only with <a href="#sectc4232">creation
                   3962: rules</a>.</p>
1.30    ! cvs      3963: 
        !          3964: <p>To compare the value of a counter to a given value, a comparison is given
1.1       cvs      3965: between parentheses. The comparison is composed of the counter name followed
                   3966: by an equals, greater than, or less than sign and the value to which the
                   3967: counter will be compared.  A test for whether or not a counter's value falls
                   3968: in a range also appears within parentheses.  In this case, the counter name is
1.18      cvs      3969: followed by the <tt>IN</tt> keyword and the range definition within brackets.
                   3970: The <tt>Even</tt>, <tt>Odd</tt> and <tt>One</tt> are used to test a counter's
                   3971: value and are followed by the counter name between parentheses.</p>
1.30    ! cvs      3972: 
        !          3973: <p>The list of possible conditions on counters is:</p>
1.18      cvs      3974: <dl>
1.30    ! cvs      3975:   <dt><tt>Even (Counter)</tt></dt>
        !          3976:     <dd>the box is created only if the counter has an even value.</dd>
        !          3977:   <dt><tt>Odd (Counter)</tt></dt>
        !          3978:     <dd>the box is created only if the counter has an odd value.</dd>
        !          3979:   <dt><tt>One (Counter)</tt></dt>
        !          3980:     <dd>the box is created only the counter's value is 1.</dd>
        !          3981:   <dt><tt>NOT One (Counter)</tt></dt>
        !          3982:     <dd>the box is created, unless the counter's value is 1.</dd>
        !          3983:   <dt><tt>(Counter &lt; Value)</tt></dt>
        !          3984:     <dd>the box is created only if the counter's value is less than
        !          3985:     Value.</dd>
        !          3986:   <dt><tt>(Counter &gt; Value)</tt></dt>
        !          3987:     <dd>the box is created only if the counter's value is greater than
        !          3988:     Value.</dd>
        !          3989:   <dt><tt>(Counter = Value)</tt></dt>
        !          3990:     <dd>the box is created only if the counter's value is equal to Value.</dd>
        !          3991:   <dt><tt>NOT (Counter = Value)</tt></dt>
        !          3992:     <dd>the is created only if the counter's value is different than
        !          3993:     Value.</dd>
        !          3994:   <dt><tt>(Counter IN [MinValue..MaxValue])</tt></dt>
        !          3995:     <dd>the box is created only if the counter's value falls in the range
        !          3996:       bounded by MinValue and MaxValue (inclusive).</dd>
        !          3997:   <dt><tt>NOT (Counter IN [MinValue..MaxValue])</tt></dt>
        !          3998:     <dd>the box is created only if the value of the counter does not fall in
        !          3999:       the range bounded by MinValue and MaxValue (inclusive).</dd>
1.18      cvs      4000: </dl>
1.30    ! cvs      4001: 
        !          4002: <p><strong>Note:</strong> the <tt>NOT Even</tt> and <tt>NOT Odd</tt>
        !          4003: conditions are syntactically correct but can be expressed more simply by
        !          4004: <tt>Odd</tt> and <tt>Even</tt>, respectively.</p>
1.18      cvs      4005: </div>
                   4006: </div>
1.1       cvs      4007: 
1.18      cvs      4008: <div class="subsection">
1.30    ! cvs      4009: <h3><a name="sectc4215">A presentation rule</a></h3>
1.1       cvs      4010: 
1.30    ! cvs      4011: <p>A presentation rule defines either a presentation parameter or presentation
1.18      cvs      4012: function.  The parameters are:</p>
                   4013: <ul>
1.30    ! cvs      4014:   <li>the position of the vertical and horizontal reference axes of the
        !          4015:   box,</li>
        !          4016:   <li>the position of the box in relation to other boxes,</li>
        !          4017:   <li>the height or width of the box, with overflow exceptions,</li>
        !          4018:   <li>the margins, padding and borders of the box,</li>
        !          4019:   <li>the characteristics of the lines contained in the box: linespacing,
        !          4020:     indentation of the first line, justification, hyphenation,</li>
        !          4021:   <li>the conditions for breaking the box across pages,</li>
        !          4022:   <li>the characteristics of the characters contained in the box: size, font,
        !          4023:     style, underlining,</li>
        !          4024:   <li>the depth of the box among overlapping boxes (often called stacking
        !          4025:     order),</li>
        !          4026:   <li>the characteristics of graphic elements contained in the box: style and
        !          4027:     thickness of lines, fill pattern for closed objects,</li>
        !          4028:   <li>the colors in text, graphics, pictures, and symbols contained in the box
        !          4029:     are displayed or printed,</li>
        !          4030:   <li>for presentation boxes only, the contents of the box.</li>
        !          4031: </ul>
        !          4032: 
        !          4033: <p>The <a name="presfunct">presentation functions</a> are:</p>
        !          4034: <ul>
        !          4035:   <li>the creation of a presentation box</li>
        !          4036:   <li>the line-breaking or page-breaking style,</li>
        !          4037:   <li>the copying of another box,</li>
        !          4038:   <li>the display of the box background and border,</li>
        !          4039:   <li>the display of a background picture and its aspect.</li>
        !          4040: </ul>
        !          4041: 
        !          4042: <p>For each box and each view, every presentation parameter is defined once
        !          4043: and only once, either explicitly or by the <a href="#sectc427">default
        !          4044: rules</a>. In contrast, presentation functions are not obligatory and can
        !          4045: appear many times for the same element.  for example an element can create
        !          4046: many presentation boxes.  Another element may not use any presentation
1.18      cvs      4047: functions.</p>
1.30    ! cvs      4048: 
        !          4049: <p>Each rule defining a presentation parameter begins with a keyword followed
        !          4050: by a colon.  The keyword indicates the parameter which is the subject of the
1.18      cvs      4051: rule. After the keyword and the colon, the remainder of the rule varies.  All
                   4052: rules are terminated by a semicolon.</p>
                   4053: <pre>     Rule      = PresParam ';' / PresFunc ';' .
1.6       cvs      4054:      PresParam ='VertRef' ':'       PositionHoriz /
                   4055:                 'HorizRef' ':'      PositionVert /
                   4056:                 'VertPos' ':'       VPos /
                   4057:                 'HorizPos' ':'      HPos /
                   4058:                 'Height' ':'        Dimension /
                   4059:                 'Width' ':'         Dimension /
                   4060:                 'VertOverflow' ':'  Boolean /
1.1       cvs      4061:                 'HorizOverflow' ':' Boolean /
1.26      cvs      4062:                 'MarginTop' ':'     MarginWidth /
                   4063:                 'MarginRight' ':'   MarginWidth /
                   4064:                 'MarginBottom' ':'  MarginWidth /
                   4065:                 'MarginLeft' ':'    MarginWidth /
                   4066:                 'PaddingTop' ':'    PaddingWidth /
                   4067:                 'PaddingRight' ':'  PaddingWidth /
                   4068:                 'PaddingBottom' ':' PaddingWidth /
                   4069:                 'PaddingLeft' ':'   PaddingWidth /
                   4070:                 'BorderTopWidth' ':' BorderWidth /
                   4071:                 'BorderRightWidth' ':' BorderWidth /
                   4072:                 'BorderBottomWidth' ':' BorderWidth /
                   4073:                 'BorderLeftWidth' ':' BorderWidth /
                   4074:                 'BorderTopColor' ':' BorderColor /
                   4075:                 'BorderRightColor' ':' BorderColor /
                   4076:                 'BorderBottomColor' ':' BorderColor /
                   4077:                 'BorderLeftColor' ':' BorderColor /
                   4078:                 'BorderTopStyle' ':' BorderStyle /
                   4079:                 'BorderRightStyle' ':' BorderStyle /
                   4080:                 'BorderBottomStyle' ':' BorderStyle /
                   4081:                 'BorderLeftStyle' ':' BorderStyle .
1.6       cvs      4082:                 'LineSpacing' ':'   DistanceInherit /
                   4083:                 'Indent' ':'        DistanceInherit /
                   4084:                 'Adjust' ':'        AdjustInherit /
                   4085:                 'Justify' ':'       BoolInherit /
                   4086:                 'Hyphenate' ':'     BoolInherit /
                   4087:                 'PageBreak' ':'     Boolean /
                   4088:                 'LineBreak' ':'     Boolean /
                   4089:                 'InLine' ':'        Boolean /
                   4090:                 'NoBreak1' ':'      AbsDist /
                   4091:                 'NoBreak2' ':'      AbsDist /
                   4092:                 'Gather' ':'        Boolean /
                   4093:                 'Visibility' ':'    NumberInherit /
                   4094:                 'Size'  ':'         SizeInherit /
                   4095:                 'Font' ':'          NameInherit /
                   4096:                 'Style' ':'         StyleInherit /
1.23      cvs      4097:                 'Weight' ':'        WeightInherit /
1.6       cvs      4098:                 'Underline' ':'     UnderLineInherit /
                   4099:                 'Thickness' ':'     ThicknessInherit /
                   4100:                 'Depth' ':'         NumberInherit /
                   4101:                 'LineStyle' ':'     LineStyleInherit /
                   4102:                 'LineWeight' ':'    DistanceInherit /
                   4103:                 'FillPattern' ':'   NameInherit /
                   4104:                 'Background' ':'    NameInherit /
1.13      cvs      4105:                 'Foreground' ':'    NameInherit /
1.6       cvs      4106:                 'Content' ':'       VarConst .
1.1       cvs      4107:      PresFunc = Creation '(' BoxID ')' /
                   4108:                 'Line' /
                   4109:                 'NoLine' /
                   4110:                 'Page' '(' BoxID ')' /
1.13      cvs      4111:                 'Copy' '(' BoxTypeToCopy ')' /
                   4112:                 'ShowBox' /
1.18      cvs      4113:                 'BackgroundPicture' ':' FileName /
                   4114:                 'PictureMode' ':'   PictMode /</pre>
                   4115: </div>
                   4116: 
                   4117: <div class="subsection">
1.30    ! cvs      4118: <h3><a name="sectc4216">Box axes</a></h3>
1.18      cvs      4119: 
1.30    ! cvs      4120: <p>The position of the middle axes <tt>VMiddle</tt> and <tt>HMiddle</tt> in
1.1       cvs      4121: relation to their box is always calculated automatically as a function of the
                   4122: height and width of the box and is not specified by the presentation rules. In
                   4123: the presentation schema, these middle axes are used only to position their box
                   4124: with respect to another by specifying the distance between the middle axis and
1.18      cvs      4125: an axis or a side of another box (see the <a href="#sectc4218">relative
                   4126: position</a>).</p>
1.30    ! cvs      4127: 
        !          4128: <p>The reference axes of a box are also used to position their box in relation
        !          4129: to another, but in contrast to the middle axes, the presentation schema must
        !          4130: make their position explicit, either in relation to a side or the middle axis
        !          4131: of the box itself, or in relation to an axis of an enclosed box.</p>
        !          4132: 
        !          4133: <p>Only boxes of base elements have predefined reference axes.  For character
1.1       cvs      4134: string boxes, the horizontal reference axis is the baseline of the characters
                   4135: (the line which passes immediately under the upper-case letters, ignoring the
                   4136: letter Q) and the vertical reference axis is at the left edge of the first
1.18      cvs      4137: character of the string.</p>
1.30    ! cvs      4138: 
        !          4139: <p>The positions of a box's reference axes are defined by the <tt>VertRef</tt>
1.18      cvs      4140: and <tt>HorizRef</tt> rules which specify the <a href="#distance">distance</a>
1.1       cvs      4141: between the reference axis and an axis or parallel side of the same box or of
1.18      cvs      4142: an enclosed box.</p>
                   4143: <pre>               'VertRef'  ':' PositionHoriz
                   4144:                'HorizRef' ':' PositionVert</pre>
1.30    ! cvs      4145: 
1.18      cvs      4146: <blockquote class="example">
1.30    ! cvs      4147:   <p><strong>Example:</strong></p>
        !          4148: 
        !          4149:   <p>If, in the structure schema for mathematical formulas, the fraction
        !          4150:   element is defined by</p>
        !          4151:   <pre>Fraction = BEGIN
1.1       cvs      4152:            Numerator   = Expression;
                   4153:            Denominator = Expression;
1.18      cvs      4154:            END;</pre>
1.30    ! cvs      4155: 
        !          4156:   <p>then the horizontal reference axis of the fraction can be positioned on
        !          4157:   top of the denominator by the rule:</p>
        !          4158:   <pre>Fraction :
1.1       cvs      4159:      BEGIN
                   4160:      HorizRef : Enclosed Denominator . Top;
                   4161:      ...
1.18      cvs      4162:      END;</pre>
1.30    ! cvs      4163: 
        !          4164:   <p>To put the horizontal reference axis of a column at its middle:</p>
        !          4165:   <pre>Column :
1.1       cvs      4166:      BEGIN
                   4167:      HorizRef : * . HMiddle;
                   4168:      ...
1.18      cvs      4169:      END;</pre>
                   4170: </blockquote>
                   4171: </div>
1.1       cvs      4172: 
1.18      cvs      4173: <div class="subsection">
1.30    ! cvs      4174: <h3><a name="sectc4217">Distance units</a></h3>
1.1       cvs      4175: 
1.30    ! cvs      4176: <p>Some distances and dimensions appear in many rules of a presentation
        !          4177: schema, especially in position rules (<tt>VertPos, HorizPos</tt>), in extent
        !          4178: rules for boxes (<tt>Height, Width</tt>), in rules defining lines
        !          4179: (<tt>LineSpacing, Indent</tt>), in rules controlling pagination (<tt>NoBreak1,
        !          4180: NoBreak2</tt>) and in rules specifying the thickness of strokes
        !          4181: (<tt>LineWeight</tt>).</p>
        !          4182: 
        !          4183: <p>In all these rules, the distance or extent can be expressed</p>
        !          4184: <ul>
        !          4185:   <li>either in relative units, which depend on the size of the characters in
        !          4186:     the current font: height of the element's font or height of the letter
        !          4187:     'x',</li>
        !          4188:   <li>or in absolute units: centimeter, millimeter, inch, typographer's point,
        !          4189:     pica or pixel.</li>
        !          4190: </ul>
        !          4191: 
        !          4192: <p>Units can be chosen freely.  Thus, it is possible to use relative units in
        !          4193: one rule, centimeters in the next rule, and typographer's points in
        !          4194: another.</p>
        !          4195: 
        !          4196: <p>Absolute units are used to set rigid rules for the appearance of documents.
        !          4197: In contrast, relative units allow changes of scale.  The editor lets the value
        !          4198: of relative units be changed dynamically.  Such changes affect every box using
1.1       cvs      4199: relative units simultaneously and in the same proportion. Changing the value
                   4200: of the relative units affects the size of the characters and graphical
1.18      cvs      4201: elements, and the size of the boxes and the distances between them.</p>
1.30    ! cvs      4202: 
        !          4203: <p>A <a name="distance">distance</a> or extent is specified by a number, which
1.1       cvs      4204: may be followed by one or more spaces and a units keyword.  When there is no
                   4205: units keyword, the number specifies the number of relative units, where a
                   4206: relative unit is the height of a character in the current font (an em).  When
                   4207: the number is followed by a units keyword, the keyword indicates the type of
1.18      cvs      4208: absolute units:</p>
                   4209: <ul>
1.30    ! cvs      4210:   <li><tt>em</tt>: height of the element's font,</li>
        !          4211:   <li><tt>ex</tt>: height of the letter 'x',</li>
        !          4212:   <li><tt>cm</tt>: centimeter,</li>
        !          4213:   <li><tt>mm</tt>: millimeter,</li>
        !          4214:   <li><tt>in</tt>: inch (1 in = 2.54 cm),</li>
        !          4215:   <li><tt>pt</tt>: point (1 pt = 1/72 in),</li>
        !          4216:   <li><tt>pc</tt>: pica (1 pc = 12 pt),</li>
        !          4217:   <li><tt>px</tt>: pixel.</li>
1.18      cvs      4218: </ul>
1.30    ! cvs      4219: 
        !          4220: <p>Whatever the chosen unit, relative or absolute, the number is not
        !          4221: necessarily an integer and may be expressed in fixed point notation (using the
        !          4222: American convention of a period to express the decimal point).</p>
        !          4223: 
        !          4224: <p>If the distance appears in a presentation rule for a numeric attribute, the
1.1       cvs      4225: number can be replaced by the name of an attribute.  In this case, the value
                   4226: of the attribute is used.  Obviously, the attribute name cannot be followed by
                   4227: a decimal point and a fractional part, but it can be followed a units keyword.
1.18      cvs      4228: However, the choice of units is limited to em, ex, pt and px.</p>
                   4229: <pre>     Distance      = [ Sign ] AbsDist .
1.1       cvs      4230:      Sign          ='+' / '-' .
                   4231:      AbsDist       = IntegerOrAttr [ '.' DecimalPart ]
                   4232:                      [ Unit ].
                   4233:      IntegerOrAttr = IntegerPart / AttrID .
                   4234:      IntegerPart   = NUMBER .
                   4235:      DecimalPart   = NUMBER .
                   4236:      Unit          ='em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' /
1.18      cvs      4237:                     'pc' / 'px' / '%' .</pre>
1.30    ! cvs      4238: 
1.18      cvs      4239: <blockquote class="example">
1.30    ! cvs      4240:   <p><strong>Example:</strong></p>
        !          4241: 
        !          4242:   <p>The following rules specify that a box has a height of 10.5 centimeters
        !          4243:   and a width of 5.3 ems:</p>
        !          4244:   <pre>Height : 10.5 cm;
1.18      cvs      4245: Width  : 5.3;</pre>
                   4246: </blockquote>
                   4247: </div>
1.1       cvs      4248: 
1.18      cvs      4249: <div class="subsection">
1.30    ! cvs      4250: <h3><a name="sectc4218">Relative positions</a></h3>
1.1       cvs      4251: 
1.30    ! cvs      4252: <p>The positioning of boxes uses the eight axes and sides, the sides generally
1.1       cvs      4253: being used to define the juxtapositioning (vertical or horizontal) of boxes,
                   4254: the middle axes being used to define centering, and the reference axes being
1.18      cvs      4255: used for alignment.</p>
1.30    ! cvs      4256: 
        !          4257: <p>Two rules allow a box to be placed relative to other boxes.  The
1.18      cvs      4258: <tt>VertPos</tt> rule positions the box vertically.  The <tt>HorizPos</tt>
                   4259: rule positions the box horizontally.  It is possible that a box's position
                   4260: could be entirely determined by other boxes positioned relative to it. In this
                   4261: case, the position is implicit and the word <tt>nil</tt> can be used to
                   4262: specify that no position rule is needed.  Otherwise, an explicit rule must be
                   4263: given by indicating the axis or side which defines the position of the box,
                   4264: followed by an equals sign and the distance between between this axis or side
                   4265: and a parallel axis or side of another box, called the reference box.  The box
                   4266: for which the rule is written will be positioned relative to the reference
                   4267: box.</p>
                   4268: <pre>                 'VertPos' ':' VPos
1.6       cvs      4269:                  'HorizPos' ':' HPos
                   4270:      HPos      = 'nil' / VertAxis '=' HorizPosition
                   4271:                  [ 'UserSpecified' ].
                   4272:      VPos      = 'nil' / HorizAxis '=' VertPosition
                   4273:                  [ 'UserSpecified' ].
1.1       cvs      4274:      VertAxis  = 'Left' / 'VMiddle' / 'VRef' / 'Right' .
1.18      cvs      4275:      HorizAxis = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' .</pre>
1.30    ! cvs      4276: 
        !          4277: <p>The reference box is an adjacent box: enclosing, enclosed or adjacent. When
        !          4278: a rule is associated with a reference type attribute (and only in this case),
        !          4279: it can be a box of the element designated by the attribute.  The reference box
1.18      cvs      4280: can be either a presentation box previously defined in the <tt>BOXES</tt>
1.1       cvs      4281: section of the schema and created by a creation function, or the box
1.18      cvs      4282: associated with a structured element.</p>
1.30    ! cvs      4283: 
        !          4284: <p>The structural position of the reference box (relative to the box for which
1.18      cvs      4285: the rule is being written) is indicated by a keyword: <tt>Enclosing</tt>,
                   4286: <tt>Enclosed</tt>, or, for sibling boxes, <tt>Previous</tt> or <tt>Next</tt>.
1.1       cvs      4287: The reference attributes, or presentation boxes created by a reference
1.18      cvs      4288: attribute, the <tt>Referred</tt> keyword may be used to designate the element
                   4289: which the reference points to.  The keyword <tt>Creator</tt> can be used in
1.1       cvs      4290: rules for presentation boxes to designate the box of the element which created
1.18      cvs      4291: the presentation box.  Finally, the <tt>Root</tt> keyword can be used to
                   4292: designate the root of the document.</p>
1.30    ! cvs      4293: 
        !          4294: <p>When the keyword is ambiguous, it is followed by the name of an element
        !          4295: type or presentation box which resolves the ambiguity (the <tt>Creator</tt>
        !          4296: and <tt>Root</tt> keywords are never ambiguous).  If this name is not given,
        !          4297: then the first box encountered is used as the reference box. It is also
        !          4298: possible to use just the name of an element type or presentation box without
        !          4299: an initial keyword. In this case, a sibling having that name will be used.  If
        !          4300: the name is preceded by the keyword <tt>NOT</tt>, then the reference box will
        !          4301: be the first box whose type is not the named one.</p>
        !          4302: 
        !          4303: <p>In place of the box or type name, the keywords <tt>AnyElem</tt>,
1.18      cvs      4304: <tt>AnyBox</tt> and <tt>ElemWithAttr</tt> can be used, representing
1.17      cvs      4305: respectively, any structured element box, any presentation box, and the box
                   4306: corresponding to any structured element having a particular attribute,
                   4307: whatever its value; the name of this attribute must follow the keyword
1.18      cvs      4308: <tt>ElemWithAttr</tt>.</p>
1.30    ! cvs      4309: 
        !          4310: <p>A type name may be preceded by a star in order to resolve the ambiguity in
        !          4311: the special case where the structure schema defines an <a
1.18      cvs      4312: href="#sectd3284">inclusion</a> without expansion (or with partial expansion)
                   4313: of the same type as an element of the scheme.  For mark pairs (and only for <a
                   4314: href="#sectd3285">mark pairs</a>) the type name <em>must</em> be preceded by
                   4315: the <tt>First</tt> or <tt>Second</tt> keyword, which indicates which of the
                   4316: two marks of the pair  should be used as the reference box.</p>
1.30    ! cvs      4317: 
        !          4318: <p>The star character ('<tt>*</tt>') used alone designates the box to which
        !          4319: the rule applies (in this case, it is obviously useless to specify the type of
        !          4320: the reference box).</p>
        !          4321: 
        !          4322: <p>The keywords <tt>Enclosing</tt> and <tt>Enclosed</tt> can be used no matter
1.1       cvs      4323: what constructor defines the type to which the rule applies.  When applied to
1.18      cvs      4324: the element which represents the entire document, <tt>Enclosing</tt>
1.1       cvs      4325: designates the window or page in which the document's image is displayed for
                   4326: the view to which the rule applies.  A box or type name without a keyword is
                   4327: used for aggregate elements and designates another element of the same
                   4328: aggregate.  It can also be used to designate a presentation or page layout
1.18      cvs      4329: box.  The keywords <tt>Previous</tt> and <tt>Next</tt> are primarily used to
1.1       cvs      4330: denote list elements, but can also be used to denote elements of an
1.18      cvs      4331: aggregate.</p>
1.30    ! cvs      4332: 
        !          4333: <p>In the position rule, the structural position relative to the reference box
        !          4334: is followed, after a period, by the name of an axis or side.  The rule
        !          4335: specifies its node's position as being some distance from this axis or side of
        !          4336: the reference box.  If this distance is zero, then the distance does not
        !          4337: appear in the rule.  Otherwise, it does appear as a positive or negative
        !          4338: number (the sign is required for negative numbers). The sign takes into
        !          4339: account the orientation of the coordinate axes: for top to bottom for the
        !          4340: vertical axis and from left to right for the horizontal axis.  Thus, a
        !          4341: negative distance in a vertical position indicates that the side or axis
        !          4342: specified in the rule is above the side or axis of the reference box.</p>
        !          4343: 
        !          4344: <p>The distance can be followed by the <tt>UserSpecified</tt> keyword (even if
1.18      cvs      4345: the distance is nil and does not appear, the <tt>UserSpecified</tt> keyword
1.1       cvs      4346: can be used).  It indicates that when the element to which the rule applies is
                   4347: being created, the editor will ask the user to specify the distance himself,
                   4348: using the mouse.  In this case, the distance specified in the rule is a
                   4349: default distance which is suggested to the user but can be modified.  The
1.18      cvs      4350: <tt>UserSpecified</tt> keyword can be used either in the vertical position
                   4351: rule, the horizontal position rule, or both.</p>
                   4352: <pre>     VertPosition  = Reference '.' HorizAxis [ Distance ] .
1.1       cvs      4353:      HorizPosition = Reference '.' VertAxis [ Distance ] .
                   4354:      Reference     ='Enclosing' [ BoxTypeNot ] /
                   4355:                     'Enclosed' [ BoxTypeNot ] /
                   4356:                     'Previous' [ BoxTypeNot ] /
                   4357:                     'Next' [ BoxTypeNot ] /
                   4358:                     'Referred' [ BoxTypeNot ] /
                   4359:                     'Creator' /
                   4360:                     'Root' /
                   4361:                     '*' /
                   4362:                      BoxOrType .
                   4363:      BoxOrType     = BoxID /
                   4364:                      [ '*' ] [ FirstSec ] ElemID /
1.17      cvs      4365:                     'AnyElem' / 'AnyBox' /
                   4366:                     'ElemWithAttr' AttrID .
1.18      cvs      4367:      BoxTypeNot    = [ 'NOT' ] BoxOrType .</pre>
1.30    ! cvs      4368: 
1.18      cvs      4369: <blockquote class="example">
1.30    ! cvs      4370:   <p><strong>Example:</strong></p>
        !          4371: 
        !          4372:   <p>If a <a name="expos1">report</a> is defined by the following structure
        !          4373:   schema:</p>
        !          4374:   <pre>Report = BEGIN
1.6       cvs      4375:          Title  = Text;
                   4376:          Summary = Text;
                   4377:          Keywords = Text;
                   4378:          ...
1.18      cvs      4379:          END;</pre>
1.30    ! cvs      4380: 
        !          4381:   <p>then the presentation schema could contain the rules:</p>
        !          4382:   <pre>Report : BEGIN
1.6       cvs      4383:          VertPos  : Top = Enclosing . Top;
                   4384:          HorizPos : Left = Enclosing . Left;
                   4385:          ...
1.18      cvs      4386:          END;</pre>
1.30    ! cvs      4387: 
        !          4388:   <p>These rules place the <a name="reportexample">report</a> in the upper
        !          4389:   left corner of the enclosing box, which is the window in which the document
        !          4390:   is being edited.</p>
        !          4391:   <pre>Title :  BEGIN
1.6       cvs      4392:          VertPos  : Top = Enclosing . Top + 1;
                   4393:          HorizPos : VMiddle = Enclosing . VMiddle;
                   4394:          ...
1.18      cvs      4395:          END;</pre>
1.30    ! cvs      4396: 
        !          4397:   <p>The top of the title is one line (a line has the height of the characters
        !          4398:   of the title) from the top of the report, which is also the top of the
        !          4399:   editing window.  The title is centered horizontally in the window (see <a
        !          4400:   href="#posdim">figure</a>).</p>
        !          4401:   <pre>Summary : BEGIN
1.1       cvs      4402:           VertPos  : Top = Title . Bottom + 1.5;
                   4403:           HorizPos : Left = Enclosing . Left + 2 cm;
                   4404:           ...
1.18      cvs      4405:           END;</pre>
1.30    ! cvs      4406: 
        !          4407:   <p>The top of the summary is place a line and a half below the bottom of the
        !          4408:   title and is shifted two centimeters from the side of the window.</p>
1.18      cvs      4409: </blockquote>
1.30    ! cvs      4410: 
1.18      cvs      4411: <blockquote class="example">
1.30    ! cvs      4412:   <p><strong>Example:</strong></p>
        !          4413: 
        !          4414:   <p>Suppose there is a <a name="expos2">Design</a> logical structure which
        !          4415:   contains graphical elements:</p>
        !          4416:   <pre>Design = LIST OF (ElemGraph = GRAPHICS);</pre>
        !          4417: 
        !          4418:   <p>The following rules allow the user to freely choose the position of each
        !          4419:   element when it is created:</p>
        !          4420:   <pre>ElemGraph =
1.1       cvs      4421:    BEGIN
                   4422:    VertPos : Top = Enclosing . Top + 1 cm UserSpecified;
                   4423:    HorizPos: Left = Enclosing . Left UserSpecified;
                   4424:    ...
1.18      cvs      4425:    END;</pre>
1.30    ! cvs      4426: 
        !          4427:   <p>Thus, when a graphical element is created, its default placement is at
        !          4428:   the left of the window and 1 cm from the top, but the user can move it
        !          4429:   immediately, simply by moving the mouse.</p>
1.18      cvs      4430: </blockquote>
                   4431: </div>
1.1       cvs      4432: 
1.18      cvs      4433: <div class="subsection">
1.30    ! cvs      4434: <h3><a name="sectc4219">Box extents</a></h3>
1.1       cvs      4435: 
1.30    ! cvs      4436: <p>The extents (height and width) of each box are defined by the two rules
1.18      cvs      4437: <tt>Height</tt> and <tt>Width</tt>.  There are three types of extents: fixed,
                   4438: relative, and elastic.</p>
1.1       cvs      4439: 
1.18      cvs      4440: <div class="subsubsection">
1.30    ! cvs      4441: <h4><a name="sectd42191">Fixed extents</a></h4>
1.1       cvs      4442: 
1.30    ! cvs      4443: <p>A fixed dimension sets the height or width of the box independently of all
1.18      cvs      4444: other boxes.  It is expressed in <a href="#sectc4217">distance units</a>.  The
                   4445: extent can be followed by the <tt>UserSpecified</tt> keyword which indicates
1.1       cvs      4446: that when the element to which the rule applies is being created, the editor
                   4447: will ask the user to specify the extent himself, using the mouse.  In this
                   4448: case, the extent specified in the rule is a default extent which is suggested
1.18      cvs      4449: to the user but can be modified.  The <tt>UserSpecified</tt> keyword can be
                   4450: used either in the <tt>Height</tt> rule, the <tt>Width</tt> rule, or both.</p>
1.30    ! cvs      4451: 
        !          4452: <p>A fixed extent rule can be ended by the <tt>Min</tt> keyword, which
        !          4453: signifies that the indicated value is a minimum, and that, if the contents of
        !          4454: the box require it, a larger extent is possible.</p>
1.18      cvs      4455: <pre>                'Height' ':' Dimension
1.1       cvs      4456:                 'Width' ':' Dimension
                   4457:      Dimension = AbsDist [ 'UserSpecified' ]  [ 'Min' ] /
1.18      cvs      4458:                  ...</pre>
1.30    ! cvs      4459: 
1.18      cvs      4460: <blockquote class="example">
1.30    ! cvs      4461:   <p><strong>Example:</strong></p>
        !          4462: 
        !          4463:   <p>Continuing with the <a href="#expos2">previous example</a>, it is
        !          4464:   possible to allow the user to choose the size of each graphical element as
        !          4465:   it is created:</p>
        !          4466:   <pre>ElemGraph : BEGIN
1.6       cvs      4467:             Width :  2 cm UserSpecified;
1.1       cvs      4468:             Height : 1 cm UserSpecified;
                   4469:             ...
1.18      cvs      4470:             END;</pre>
1.30    ! cvs      4471: 
        !          4472:   <p>Thus, when a graphical element is create, it is drawn by default with a
        !          4473:   width of 2 cm and a height of 1 cm, but the user is free to resize it
        !          4474:   immediately with the mouse.</p>
        !          4475:   <pre>Summary :  BEGIN
1.1       cvs      4476:            Height : 5 cm Min;
                   4477:            ...
                   4478:            END;
                   4479: Keywords : BEGIN
                   4480:            VertPos : Top = Summary . Bottom;
                   4481:            ...
1.18      cvs      4482:            END;</pre>
                   4483: </blockquote>
                   4484: </div>
1.1       cvs      4485: 
1.18      cvs      4486: <div class="subsubsection">
1.30    ! cvs      4487: <h4><a name="sectd42192">Relative extents</a></h4>
        !          4488: 
        !          4489: <p>A relative extent determines the extent as a function of the extent of
        !          4490: another box, just as a relative position places a box in relation to another.
        !          4491: The reference box in an extent rule is designated using the same syntax as is
        !          4492: used in a relative position rule.  It is followed by a period and a
        !          4493: <tt>Height</tt> or <tt>Width</tt> keyword, depending on the extent being
        !          4494: referred to.  Next comes the relation between the extent being defined and the
        !          4495: extent of the reference box.  This relation can be either a percentage or a
        !          4496: difference.</p>
1.1       cvs      4497: 
1.30    ! cvs      4498: <p>A percentage is indicated by a star (the multiplication symbol) followed by
1.1       cvs      4499: the numeric percentage value (which may be greater than or less than 100) and
                   4500: the percent (`%') character.  A difference is simply indicated by a signed
1.18      cvs      4501: difference.</p>
1.30    ! cvs      4502: 
        !          4503: <p>If the rule appears in the presentation rules of a numeric attribute, the
1.1       cvs      4504: percentage value can be replaced by the name of the attribute. This attribute
1.18      cvs      4505: is then used as a percentage.  The attribute can also be used as part of a <a
                   4506: href="#distance">difference</a>.</p>
1.30    ! cvs      4507: 
        !          4508: <p>Just as with a fixed extent, a relative extent rule can end with the
1.18      cvs      4509: <tt>Min</tt> keyword, which signifies that the extent is a minimum and that,
                   4510: if the contents of the box require it, a larger extent is possible.</p>
1.30    ! cvs      4511: 
        !          4512: <p>A special case of relative extent rules is:</p>
1.18      cvs      4513: <pre>Height : Enclosed . Height;</pre>
1.30    ! cvs      4514: 
        !          4515: <p>or</p>
1.18      cvs      4516: <pre>Width  : Enclosed . Width;</pre>
1.30    ! cvs      4517: 
        !          4518: <p>which specifies that the box has a height (or width) such that it encloses
        !          4519: all the boxes which it contains, excluding boxes having a rule
        !          4520: <tt>VertOverflow: Yes;</tt> or <tt>HorizOverflow: Yes;</tt>.</p>
        !          4521: 
        !          4522: <p><strong>Note:</strong> character strings (type <tt>TEXT_UNIT</tt>)
        !          4523: generally must use the sum of the widths of the characters which compose them
        !          4524: as their width, which is expressed by the rule:</p>
1.18      cvs      4525: <pre>TEXT_UNIT :
                   4526:      Width : Enclosed . Width;</pre>
1.30    ! cvs      4527: 
        !          4528: <p>If this rule is not the default <tt>Width</tt> rule, it must be given
1.18      cvs      4529: explicitly in the <tt>RULES</tt> section which defines the presentation rules
                   4530: of the logical elements.</p>
                   4531: <pre>                  'Height' ':' Extent
1.1       cvs      4532:                   'Width' ':' Extent
                   4533:      Extent      = Reference '.' HeightWidth [ Relation ]
                   4534:                    [ 'Min' ] / ...
                   4535:      HeightWidth ='Height' / 'Width' .
                   4536:      Relation    ='*' ExtentAttr '%' / Distance .
                   4537:      ExtentAttr  = ExtentVal / AttrID .
1.18      cvs      4538:      ExtentVal   = NUMBER .</pre>
1.30    ! cvs      4539: 
1.18      cvs      4540: <blockquote class="example">
1.30    ! cvs      4541:   <p><strong>Example:</strong></p>
        !          4542: 
        !          4543:   <p>Completing the <a href="#expos1">above example</a>, it is possible to
        !          4544:   specify that the report takes its width from the editing window and its
        !          4545:   height from the size of its contents (this can obviously be greater than
        !          4546:   that of the window):</p>
        !          4547:   <pre>Report :  BEGIN
1.1       cvs      4548:           Width : Enclosing . Width;
                   4549:           Height : Enclosed . Height;
                   4550:           ...
1.18      cvs      4551:           END;</pre>
1.30    ! cvs      4552: 
        !          4553:   <p>Then, the following rules make the title occupy 60% of the width of the
        !          4554:   report (which is that of the window) and is broken into centered lines of
        !          4555:   this width (see the <a href="#sectc4222"><tt>Line</tt> rule</a>).</p>
        !          4556:   <pre>Title :   BEGIN
1.1       cvs      4557:           Width : Enclosing . Width * 60%;
                   4558:           Height : Enclosed . Height;
                   4559:           Line;
                   4560:           Adjust : VMiddle;
                   4561:           ...
1.18      cvs      4562:           END;</pre>
1.30    ! cvs      4563: 
        !          4564:   <p>The summary occupy the entire width of the window, with the exception of
        !          4565:   a 2 cm margin reserved by the horizontal position rule:</p>
        !          4566:   <pre>Summary : BEGIN
1.1       cvs      4567:           Width : Enclosing . Width - 2 cm;
                   4568:           Height : Enclosed . Height;
                   4569:           ...
1.18      cvs      4570:           END;</pre>
                   4571: 
1.30    ! cvs      4572:   <p>This set of rules, plus the <a href="#reportexample">position rules given
        !          4573:   above</a>, produce the layout of boxes shown in the following<a
        !          4574:   href="#posdim">figure</a>.</p>
        !          4575: 
        !          4576:   <div class="figure">
        !          4577:   <hr>
        !          4578:   <pre>-------------------------------------------------------------
1.1       cvs      4579: | Window and Report           ^                             |
                   4580: |                             | 1 line                      |
                   4581: |                             v                             |
                   4582: |           -------------------------------------           |
                   4583: |           |                                   |           |
                   4584: :    20%    :               Title               :    20%    :
1.30    ! cvs      4585: :&lt;---------&gt;:                                   :&lt;---------&gt;:
1.1       cvs      4586: :           :                60%                :           :
1.30    ! cvs      4587: :           :&lt;---------------------------------&gt;:           :
1.1       cvs      4588: |           |                                   |           |
                   4589: |           -------------------------------------           |
                   4590: |                             ^                             |
                   4591: |                             | 1.5 line                    |
                   4592: |                             |                             |
                   4593: |                             v                             |
                   4594: |        ---------------------------------------------------|
                   4595: |  2 cm  |                                                  |
1.30    ! cvs      4596: |&lt;------&gt;|                    Summary                       |
1.18      cvs      4597: :        :                                                  :</pre>
1.19      cvs      4598: 
1.30    ! cvs      4599:   <p align="center"><em><a name="posdim">Box position and
        !          4600:   extent</a><em></em></em></p>
        !          4601:   <hr>
        !          4602:   </div>
1.18      cvs      4603: </blockquote>
                   4604: </div>
1.1       cvs      4605: 
1.18      cvs      4606: <div class="subsubsection">
1.30    ! cvs      4607: <h4><a name="sectd42193">Elastic extents</a></h4>
1.1       cvs      4608: 
1.30    ! cvs      4609: <p>The last type of extent is the elastic extent.  Either one or both extents
        !          4610: can be elastic.  A box has an elastic extent when two opposite sides are
        !          4611: linked by distance constraints to two sides or axes of other boxes.</p>
        !          4612: 
        !          4613: <p>One of the sides of the elastic box is linked by a position rule
1.18      cvs      4614: (<tt>VertPos</tt> or <tt>HorizPos</tt>) to a neighboring box.  The other side
                   4615: is link to another box by a <tt>Height</tt> or <tt>Width</tt> rule, which
1.1       cvs      4616: takes the same form as the position rule.  For the elastic box itself, the
                   4617: notions of sides (left or right, top or bottom) are fuzzy, since the movement
                   4618: of either one of the two reference boxes can, for example, make the left side
                   4619: of the elastic box move to the right of its right side.  This is not
                   4620: important.  The only requirement is that the two sides of the elastic box used
1.18      cvs      4621: in the position and extent rule are opposite sides of the box.</p>
                   4622: <pre>             'Height' ':' Extent
1.6       cvs      4623:              'Width' ':' Extent
1.18      cvs      4624:      Extent = HPos / VPos / ...</pre>
1.30    ! cvs      4625: 
1.18      cvs      4626: <blockquote class="example">
1.30    ! cvs      4627:   <p><strong>Example:</strong></p>
        !          4628: 
        !          4629:   <p>Suppose we want to draw an elastic arrow or line between the middle of
        !          4630:   the bottom side of box A and the upper left corner of box B.  To do this, we
        !          4631:   would define a graphics box whose upper left corner coincides with the
        !          4632:   middle of the bottom side of A (a position rule) and whose lower right
        !          4633:   corner coincides with with the upper left corner of B (dimension rules):</p>
        !          4634:   <pre>LinkedBox :
1.1       cvs      4635:    BEGIN
1.6       cvs      4636:    VertPos  : Top = A .Bottom;
1.1       cvs      4637:    HorizPos : Left = A . VMiddle;
1.6       cvs      4638:    Height   : Bottom = B . Top;
                   4639:    Width    : Right = B . Left;
1.18      cvs      4640:    END;</pre>
                   4641: </blockquote>
1.30    ! cvs      4642: 
1.18      cvs      4643: <blockquote class="example">
1.30    ! cvs      4644:   <p><strong>Example:</strong></p>
        !          4645: 
        !          4646:   <p>The element SectionTitle creates a presentation box called SectionNum
        !          4647:   which contains the number of the section.  Suppose we want to align the
        !          4648:   SectionNum and SectionTitle horizontally, have the SectionNum take its width
        !          4649:   from its contents (the section number), have the SectionTitle box begin 0.5
        !          4650:   cm to the right of the SectionNum box and end at the right edge of its
        !          4651:   enclosing box. This would make the SectionTitle box elastic, since its width
        !          4652:   is defined by the position of its left and right sides.  The following rules
        !          4653:   produce this effect:</p>
        !          4654:   <pre>SectionNum :
1.1       cvs      4655:    BEGIN
                   4656:    HorizPos : Left = Enclosing . Left;
                   4657:    Width : Enclosed . Width;
                   4658:    ...
                   4659:    END;
                   4660: 
                   4661: SectionTitle :
                   4662:    BEGIN
                   4663:    HorizPos : Left = SectionNum . Right + 0.5 cm;
                   4664:    Width : Right = Enclosing . Right;
                   4665:    ...
1.18      cvs      4666:    END;</pre>
                   4667: </blockquote>
                   4668: </div>
                   4669: </div>
1.1       cvs      4670: 
1.18      cvs      4671: <div class="subsection">
1.30    ! cvs      4672: <h3><a name="sectc4220">Overflow</a></h3>
1.1       cvs      4673: 
1.30    ! cvs      4674: <p>A boxes corresponding to a structural element normally contain all boxes
1.1       cvs      4675: corresponding to the elements of its subtree.  However, in some cases, it
                   4676: could be necessary to allow a box to jut out from its parent box. Two
                   4677: presentation rules indicate that such an overflow is allowed, one for
1.18      cvs      4678: horizontal overflow, one for vertical overflow.</p>
1.30    ! cvs      4679: 
        !          4680: <p>Each of these rules is expressed by a keyword followed by a colon and the
1.18      cvs      4681: keyword <tt>Yes</tt> or <tt>No</tt>.</p>
                   4682: <pre>               'VertOverflow' ':' Boolean /
1.1       cvs      4683:                'HorizOverflow' ':' Boolean .
1.18      cvs      4684:      Boolean = 'Yes' / 'No' .</pre>
                   4685: </div>
1.1       cvs      4686: 
1.30    ! cvs      4687: <p>@@@@@ ******</p>
        !          4688: 
1.26      cvs      4689: <p>Explain Margin, Padding and Border. Refer to CSS2.</p>
                   4690: <pre>                'MarginTop' ':' MarginWidth /
                   4691:                 'MarginRight' ':' MarginWidth /
                   4692:                 'MarginBottom' ':' MarginWidth /
                   4693:                 'MarginLeft' ':' MarginWidth /
                   4694:                 'PaddingTop' ':' PaddingWidth /
                   4695:                 'PaddingRight' ':' PaddingWidth /
                   4696:                 'PaddingBottom' ':' PaddingWidth /
                   4697:                 'PaddingLeft' ':' PaddingWidth /
                   4698:                 'BorderTopWidth' ':' BorderWidth /
                   4699:                 'BorderRightWidth' ':' BorderWidth /
                   4700:                 'BorderBottomWidth' ':' BorderWidth /
                   4701:                 'BorderLeftWidth' ':' BorderWidth /
                   4702:                 'BorderTopColor' ':' BorderColor /
                   4703:                 'BorderRightColor' ':' BorderColor /
                   4704:                 'BorderBottomColor' ':' BorderColor /
                   4705:                 'BorderLeftColor' ':' BorderColor /
                   4706:                 'BorderTopStyle' ':' BorderStyle /
                   4707:                 'BorderRightStyle' ':' BorderStyle /
                   4708:                 'BorderBottomStyle' ':' BorderStyle /
                   4709:                 'BorderLeftStyle' ':' BorderStyle .
                   4710: 
                   4711: MarginWidth   = InheritParent / 'Auto' / Distance .
                   4712: PaddingWidth  = InheritParent / Distance .
                   4713: BorderWidth   = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance .
                   4714: BorderColor   = InheritParent / 'Transparent' / 'Foreground' /
                   4715:                 ColorName .
                   4716: BorderStyle   = InheritParent /
                   4717:                 'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' /
                   4718:                 'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' .
1.27      cvs      4719: InheritParent = 'Enclosing' '=' / 'Creator' '=' .
1.26      cvs      4720: ColorName     =  NAME .</pre>
1.30    ! cvs      4721: 
        !          4722: <p>@@@@@ ******</p>
1.26      cvs      4723: 
1.18      cvs      4724: <div class="subsection">
1.30    ! cvs      4725: <h3><a name="sectc4221">Inheritance</a></h3>
1.1       cvs      4726: 
1.30    ! cvs      4727: <p>A presentation parameter can be defined by reference to the same parameter
        !          4728: of another box in the tree of boxes.  These structural links are expressed by
1.1       cvs      4729: kinship.  The reference box can be that of the element immediately above in
1.18      cvs      4730: the structure (<tt>Enclosing</tt>), two levels above (<tt>GrandFather</tt>),
                   4731: immediately below (<tt>Enclosed</tt>) or immediately before
                   4732: (<tt>Previous</tt>).  In the case of a presentation box, and only in that
1.1       cvs      4733: case, the reference box may be the element which created the presentation box
1.18      cvs      4734: (<tt>Creator</tt>).</p>
1.30    ! cvs      4735: 
        !          4736: <p>Kinship is expressed in terms of the logical structure of the document and
        !          4737: not in terms of the tree of boxes.  The presentation box cannot transmit any
        !          4738: of their parameters by inheritance; only structured element boxes can do so.
        !          4739: As an example, consider an element B which follows an element A in the logical
1.1       cvs      4740: structure.  The element B creates a presentation box P in front of itself,
1.18      cvs      4741: using the <tt>CreateBefore</tt> rule (see the <a href="#sectc4232">creation
                   4742: rules</a>).  If element B's box inherits its character style using the
                   4743: <tt>Previous</tt> kinship operation, it gets its character style from A's box,
1.1       cvs      4744: not from P's box.  Inheritance works differently for positions and extents,
1.18      cvs      4745: which can refer to presentation boxes.</p>
1.30    ! cvs      4746: 
        !          4747: <p>The inherited parameter value can be the same as that of the reference box.
1.1       cvs      4748: This is indicated by an equals sign.  However, for numeric parameters, a
                   4749: different value can be obtained by adding or subtracting a number from the
                   4750: reference box's parameter value.  Addition is indicated by a plus sign before
                   4751: the number, while subtraction is specified with a minus sign.  The value of a
                   4752: parameter can also be given a maximum (if the sign is a plus) or minimum (if
1.18      cvs      4753: the sign is a minus).</p>
1.30    ! cvs      4754: 
        !          4755: <p>If the rule is being applied to a numeric attribute, the number to add or
1.1       cvs      4756: subtract can be replaced by the attribute name.  The value of a maximum or
                   4757: minimum may also be replaced by an attribute name.  In these cases, the value
1.18      cvs      4758: of the attribute is used.</p>
                   4759: <pre>  Inheritance    = Kinship  InheritedValue .
1.6       cvs      4760:   Kinship        ='Enclosing' / 'GrandFather' / 'Enclosed' /
                   4761:                   'Previous' / 'Creator' .
1.1       cvs      4762:   InheritedValue ='+' PosIntAttr [ 'Max' maximumA ] /
1.6       cvs      4763:                   '-' NegIntAttr [ 'Min' minimumA ] /
                   4764:                   '=' .
                   4765:   PosIntAttr     = PosInt / AttrID .
                   4766:   PosInt         = NUMBER .
                   4767:   NegIntAttr     = NegInt / AttrID .
                   4768:   NegInt         = NUMBER .
                   4769:   maximumA       = maximum / AttrID .
                   4770:   maximum        = NUMBER .
                   4771:   minimumA       = minimum / AttrID .
1.18      cvs      4772:   minimum        = NUMBER .</pre>
1.30    ! cvs      4773: 
        !          4774: <p>The parameters which can be obtained by inheritance are justification,
1.1       cvs      4775: hyphenation, interline spacing, character font (font family), font style, font
                   4776: size, visibility, indentation, underlining, alignment of text, stacking order
                   4777: of objects, the style and thickness of lines, fill pattern and the colors of
1.18      cvs      4778: lines and characters.</p>
                   4779: </div>
1.1       cvs      4780: 
1.18      cvs      4781: <div class="subsection">
1.30    ! cvs      4782: <h3><a name="sectc4222">Line breaking</a></h3>
1.1       cvs      4783: 
1.30    ! cvs      4784: <p>The <tt>Line</tt> rule specifies that the contents of the box should be
        !          4785: broken into lines: the boxes included in the box to which this rule is
        !          4786: attached are displayed one after the other, from left to right, with their
        !          4787: horizontal reference axes aligned so that they form a series of lines.  The
        !          4788: length of these lines is equal to the width of the box to which the
        !          4789: <tt>Line</tt> rule is attached.</p>
        !          4790: 
        !          4791: <p>When an included box overflows the current line, it is either carried
        !          4792: forward to the next line, cur, or left the way it is.  The <a
1.18      cvs      4793: href="#sectc4223"><tt>LineBreak</tt> rule</a> is used to allow or prevent the
1.1       cvs      4794: breaking of included boxes.  If the included box is not breakable but is
                   4795: longer than the space remaining on the line, it is left as is.  When a
                   4796: character string box is breakable, the line is broken between words or, if
1.18      cvs      4797: necessary, by <a href="#sectd42225">hyphenating a word</a>.  When a compound
                   4798: box is breakable, the box is transparent in regard to line breaking. The boxes
                   4799: included in the compound box are treated just like included boxes which have
                   4800: the <tt>LineBreak</tt> rule.  Thus, it is possible to traverse a complete
                   4801: subtree of boxes to line break the text leaves of a complex structure.</p>
1.30    ! cvs      4802: 
        !          4803: <p>The relative position rules of the included boxes are ignored, since the
        !          4804: boxes will be placed according to the line breaking rules.</p>
        !          4805: 
        !          4806: <p>The <tt>Line</tt> rule does not have a parameter.  The characteristics of
        !          4807: the lines that will be constructed are determined by the <tt>LineSpacing</tt>,
1.18      cvs      4808: <tt>Indent</tt>, <tt>Adjust</tt>, <tt>Justify</tt>, and <tt>Hyphenate</tt>
                   4809: rules.  Moreover, the <a href="#insectd42226"><tt>Inline</tt> rule</a> permits
                   4810: the exclusion of certain elements from the line breaking process.</p>
1.30    ! cvs      4811: 
        !          4812: <p>When the <tt>Line</tt> rule appears in the rules sequence of a non-primary
1.18      cvs      4813: view, it applies only to that view, but when the <tt>Line</tt> rule appears in
1.1       cvs      4814: the rules sequence of the primary view, it also applies to the other views by
1.18      cvs      4815: default, except for those views which explicitly invoke the <tt>NoLine</tt>
                   4816: rule.  Thus, the <tt>NoLine</tt> rule can be used in a non-primary view to
                   4817: override the primary view's <tt>Line</tt> rule.  The <tt>NoLine</tt> rule must
                   4818: not be used with the primary view because the absence of the <tt>Line</tt>
                   4819: rule has the same effect. Like the <tt>Line</tt> rule, the <tt>NoLine</tt>
                   4820: rule does not take any parameters.</p>
                   4821: <pre>              'Line'
                   4822:               'NoLine'</pre>
                   4823: 
                   4824: <div class="subsubsection">
1.30    ! cvs      4825: <h4><a name="sectd42221">Line spacing</a></h4>
1.18      cvs      4826: 
1.30    ! cvs      4827: <p>The <tt>LineSpacing</tt> rule defines the line spacing to be used in the
        !          4828: line breaking process.  The line spacing is the distance between the baselines
1.1       cvs      4829: (horizontal reference axis) of the successive lines produced by the
1.18      cvs      4830: <tt>Line</tt> rule.  The value of the line spacing can be specified as a
                   4831: constant or by inheritance.  It is expressed in any of the available <a
                   4832: href="#sectc4217">distance units</a>.</p>
1.30    ! cvs      4833: 
        !          4834: <p>Inheritance allows the value to be obtained from a relative in the
        !          4835: structure tree, either without change (an equals sign appears after the
        !          4836: inheritance keyword), with a positive difference (a plus sign), or a negative
        !          4837: difference (a minus sign).  When the rule uses a difference, the value of the
        !          4838: difference follows the sign and is expressed as a <a
        !          4839: href="#sectc4217">distance</a>.</p>
1.18      cvs      4840: <pre>                     'LineSpacing' ':' DistOrInherit
1.6       cvs      4841:      DistOrInherit =  Kinship InheritedDist / Distance .
1.18      cvs      4842:      InheritedDist = '=' / '+' AbsDist / '-' AbsDist .</pre>
1.30    ! cvs      4843: 
        !          4844: <p>When the line spacing value (or its difference from another element) is
1.1       cvs      4845: expressed in relative units, it changes with the size of the characters. Thus,
                   4846: when a larger font is chosen for a part of the document, the line spacing of
                   4847: that part expands proportionally.  In contrast, when the line spacing value is
                   4848: expressed in absolute units (centimeters, inches, typographer's points), it is
                   4849: independent of the characters, which permits the maintenance of a consistent
                   4850: line spacing, whatever the character font.  Either approach can be taken,
1.18      cvs      4851: depending on the desired effect.</p>
                   4852: </div>
1.1       cvs      4853: 
1.18      cvs      4854: <div class="subsubsection">
1.30    ! cvs      4855: <h4><a name="sectd42222">First line indentation</a></h4>
1.1       cvs      4856: 
1.30    ! cvs      4857: <p>The <tt>Indent</tt> rule is used to specify the indentation of the first
        !          4858: line of the elements broken into lines by the <tt>Line</tt> function. The
1.1       cvs      4859: indentation determines how far the first line of the element is shifted with
                   4860: respect to the other lines of the same element.  It can be specified as a
                   4861: constant or by inheritance.  The constant value is a positive integer (shifted
                   4862: to the right; the sign is optional), a negative integer (shifted to the left)
1.18      cvs      4863: or zero (no shift).  All available <a href="#sectc4217">units</a> can be
                   4864: used.</p>
1.30    ! cvs      4865: 
        !          4866: <p>Indentation can be defined for any box, regardless of whether the box is
        !          4867: line broken, and transmitted by inheritance to elements that are line broken.
        !          4868: The size of the indentation is specified in the same manner as the <a
1.18      cvs      4869: href="#sectd42221">line spacing</a>.</p>
                   4870: <pre>              'Indent' ':' DistOrInherit</pre>
                   4871: </div>
1.1       cvs      4872: 
1.18      cvs      4873: <div class="subsubsection">
1.30    ! cvs      4874: <h4><a name="sectd42223">Alignment</a></h4>
1.1       cvs      4875: 
1.30    ! cvs      4876: <p>The alignment style of the lines constructed during line breaking is
        !          4877: defined by the <tt>Adjust</tt> rule.  The alignment value can be a constant or
1.18      cvs      4878: inherited.  A constant value is specified by a keyword:</p>
                   4879: <ul>
1.30    ! cvs      4880:   <li><tt>Left</tt>: at the left edge,</li>
        !          4881:   <li><tt>Right</tt>: at the right edge,</li>
        !          4882:   <li><tt>VMiddle</tt>: centered</li>
        !          4883:   <li><tt>LeftWithDots</tt>: at the left edge with a dotted line filling out
        !          4884:     the last line up to the right edge of the line breaking box.</li>
1.18      cvs      4885: </ul>
1.30    ! cvs      4886: 
        !          4887: <p>An inherited value can only be the same as that of the reference box and is
1.18      cvs      4888: specified by a kinship keyword followed by an equals sign.</p>
                   4889: <pre>                      'Adjust' ':' AlignOrInherit
1.1       cvs      4890:      AlignOrInherit = Kinship '=' / Alignment .
                   4891:      Alignment      = 'Left' / 'Right' / 'VMiddle' /
1.18      cvs      4892:                       'LeftWithDots' .</pre>
                   4893: </div>
1.1       cvs      4894: 
1.18      cvs      4895: <div class="subsubsection">
1.30    ! cvs      4896: <h4><a name="sectd42224">Justification</a></h4>
1.1       cvs      4897: 
1.30    ! cvs      4898: <p>The <tt>Justify</tt> rule indicates whether the lines contained in the box
        !          4899: and produced by a <tt>Line</tt> rule should be extended horizontally to occupy
        !          4900: the entire width of their enclosing box.  The first and last lines are treated
1.1       cvs      4901: specially: the position of the beginning of the first line is fixed by the
1.18      cvs      4902: <tt>Indent</tt> rule and last line is not extended.  The justification
1.1       cvs      4903: parameter defined by this rule takes a boolean value, which can be a constant
                   4904: or inherited.  A constant boolean value is expressed by either the
1.18      cvs      4905: <tt>Yes</tt> or the <tt>No</tt> keyword.  An inherited value can only be the
1.1       cvs      4906: same as that of the reference box and is specified by a kinship keyword
1.18      cvs      4907: followed by an equals sign.</p>
                   4908: <pre>                  'Justify' ':' BoolInherit
1.1       cvs      4909:      BoolInherit = Boolean / Kinship '=' .
1.18      cvs      4910:      Boolean     ='Yes' / 'No' .</pre>
1.30    ! cvs      4911: 
        !          4912: <p>When the lines are justified, the alignment parameter specified in the
1.18      cvs      4913: <tt>Adjust</tt> rule has no influence, other than on the last line produced.
1.1       cvs      4914: This occurs because, when the other are extended to the limits of the box, the
1.18      cvs      4915: alignment style is no longer perceptible.</p>
1.30    ! cvs      4916: 
1.18      cvs      4917: <blockquote class="example">
1.30    ! cvs      4918:   <p><strong>Example:</strong></p>
        !          4919: 
        !          4920:   <p>An important use of inheritance is to vary the characteristics of lines
        !          4921:   for an element type (for example, Paragraph) according to the enclosing
        !          4922:   environment (for example, Summary or Section), and thus obtain different
        !          4923:   line breaking styles for the same elements when they appear in different
        !          4924:   environments.  The following rules specify that paragraphs inherit their
        !          4925:   alignment, justification, and line spacing:</p>
        !          4926:   <pre>Paragraph :
1.1       cvs      4927:    BEGIN
                   4928:    Justify : Enclosing = ;
                   4929:    LineSpacing : Enclosing = ;
                   4930:    Adjust : Enclosing =;
                   4931:    Line;
1.18      cvs      4932:    END;</pre>
1.30    ! cvs      4933: 
        !          4934:   <p>If the alignment, justification, and line spacing of the Section and
        !          4935:   Summary elements is fixed:</p>
        !          4936:   <pre>Section :
1.1       cvs      4937:    BEGIN
                   4938:    Adjust : Left;
                   4939:    Justify : Yes;
                   4940:    LineSpacing : 1;
                   4941:    END;
                   4942: Summary :
                   4943:    BEGIN
                   4944:    Adjust : VMiddle;
                   4945:    Justify : No;
                   4946:    LineSpacing : 1.3;
1.18      cvs      4947:    END;</pre>
1.30    ! cvs      4948: 
        !          4949:   <p>then the paragraphs appearing in sections are justified with a simple
        !          4950:   line spacing while those appearing in summaries are centered and not
        !          4951:   justified and have a larger line spacing.  These are nevertheless the very
        !          4952:   same type of paragraph defined in the logical structure schema.</p>
1.18      cvs      4953: </blockquote>
                   4954: </div>
                   4955: 
                   4956: <div class="subsubsection">
1.30    ! cvs      4957: <h4><a name="sectd42225">Hyphenation</a></h4>
1.18      cvs      4958: 
1.30    ! cvs      4959: <p>The <tt>Hyphenate</tt> rule indicates whether or not words should be broken
        !          4960: by hyphenation at the end of lines.  It affects the lines produced by the
1.18      cvs      4961: <tt>Line</tt> rule and contained in the box carrying the <tt>Hyphenate</tt>
                   4962: rule.</p>
1.30    ! cvs      4963: 
        !          4964: <p>The hyphenation parameter takes a boolean value, which can be either
        !          4965: constant or inherited.  A constant boolean value is expressed by either the
1.18      cvs      4966: <tt>Yes</tt> or the <tt>No</tt> keyword.  An inherited value can only be the
1.1       cvs      4967: same as that of the reference box and is specified by a kinship keyword
1.18      cvs      4968: followed by an equals sign.</p>
                   4969: <pre>                   'Hyphenate' ':' BoolInherit
1.1       cvs      4970:      BoolInherit = Boolean / Kinship '=' .
1.18      cvs      4971:      Boolean     = 'Yes' / 'No' .</pre>
                   4972: </div>
                   4973: 
                   4974: <div class="subsubsection">
1.30    ! cvs      4975: <h4><a name="sectd42226">Avoiding line breaking</a></h4>
1.18      cvs      4976: 
1.30    ! cvs      4977: <p>The <tt>InLine</tt> rule is used to specify that a box that would otherwise
1.18      cvs      4978: participate in line breaking asked for by the <tt>Line</tt> rule of an
1.1       cvs      4979: enclosing box, instead avoids the line breaking process and positions itself
1.18      cvs      4980: according to the <tt>HorizPos</tt> and <tt>VertPos</tt> rules that apply to
                   4981: it.  When the <tt>InLine</tt> rule applies to a box which would not be line
                   4982: broken, it has no effect.</p>
1.30    ! cvs      4983: 
        !          4984: <p>The rule is expressed by the <tt>InLine</tt> keyword followed by a colon
        !          4985: and the keyword <tt>Yes</tt>, if the box should participate in line breaking,
        !          4986: or the keyword <tt>No</tt>, if it should not.  This is the only form possible:
1.1       cvs      4987: this rule cannot be inherited.  Moreover, it can only appear in the rules of
                   4988: the primary view and applies to all views defined in the presentation
1.18      cvs      4989: schema.</p>
                   4990: <pre>               'InLine' ':' Boolean .
                   4991:      Boolean = 'Yes' / 'No' .</pre>
1.30    ! cvs      4992: 
1.18      cvs      4993: <blockquote class="example">
1.30    ! cvs      4994:   <p><strong>Example:</strong></p>
        !          4995: 
        !          4996:   <p>Suppose the structure schema defines a logical attribute called
        !          4997:   <tt>New</tt> which is used to identify the passages in a document which were
        !          4998:   recently modified.  It would be nice to have the presentation schema make a
        !          4999:   bar appear in the left margin next to each passage having the <tt>New</tt>
        !          5000:   attribute.  A new passage can be an entire element, such as a paragraph or
        !          5001:   section, or it can be some words in the middle of a paragraph.  To produce
        !          5002:   the desired effect, the <tt>New</tt> attribute is given a creation rule
        !          5003:   which generates a <tt>VerticalBar</tt> presentation box.</p>
        !          5004: 
        !          5005:   <p>When the <tt>New</tt> attribute is attached to a character string which
        !          5006:   is inside a line broken element (inside a paragraph, for example), the bar
        !          5007:   is one of the elements which participates in line breaking and it is placed
        !          5008:   normally in the current line, at the end of the character string which has
        !          5009:   the attribute.  To avoid this, the <tt>InLine</tt> rule is used in the
        !          5010:   following way:</p>
        !          5011:   <pre>BOXES
1.1       cvs      5012:   VerticalBar:
                   5013:      BEGIN
                   5014:      Content: Graphics 'l';
                   5015:      HorizPos: Left = Root . Left;
                   5016:      VertPos: Top = Creator . Top;
                   5017:      Height: Bottom = Creator . Bottom;
                   5018:      Width: 1 pt;
                   5019:      InLine: No;
                   5020:      ...
                   5021:      END;
                   5022: ...
                   5023: ATTRIBUTES
                   5024:   Nouveau:
                   5025:      BEGIN
                   5026:      CreateAfter(VerticalBar);
1.18      cvs      5027:      END;</pre>
                   5028: </blockquote>
                   5029: </div>
                   5030: </div>
1.1       cvs      5031: 
1.18      cvs      5032: <div class="subsection">
1.30    ! cvs      5033: <h3><a name="sectc4223">Page breaking and line breaking conditions</a></h3>
1.1       cvs      5034: 
1.30    ! cvs      5035: <p>Pages are constructed by the editor in accordance with the model specified
        !          5036: by a <a href="#sectc4233"><tt>Page</tt> rule</a>.  The page model describes
        !          5037: only the composition of the pages but does not give any rules for breaking
1.18      cvs      5038: different element types across pages.  Now, it is possible that certain
                   5039: elements must not be cut by page breaks, while others can be cut anywhere. The
                   5040: <tt>PageBreak</tt>, <tt>NoBreak1</tt>, and <tt>NoBreak2</tt> rules are used to
                   5041: specify the conditions under which each element type can be cut.</p>
1.30    ! cvs      5042: 
        !          5043: <p>The <tt>PageBreak</tt> rule is used to indicate whether or not the box can
        !          5044: be cut during the construction of pages.  If cutting is authorized, the box
        !          5045: can be cut, with one part appearing at the bottom of a page and the other part
1.1       cvs      5046: appearing at the top of the next page. The rule is formed by the
1.18      cvs      5047: <tt>PageBreak</tt> keyword followed by a colon and a constant boolean value
                   5048: (<tt>Yes</tt> or <tt>No</tt>).  This is the only form possible: this rule
1.1       cvs      5049: cannot be inherited.  Moreover, it can only appear in the rules of the primary
1.18      cvs      5050: view and applies to all views defined in the presentation schema.</p>
1.30    ! cvs      5051: 
        !          5052: <p>Whether objects can be cut by line breaks can be controlled in a similar
        !          5053: way using the <tt>LineBreak</tt> rule.  This rule allows the specification of
1.1       cvs      5054: whether or not the box can be cut during the construction of lines.  If
                   5055: cutting is authorized, the box can be cut, with one part appearing at the end
                   5056: of a line and the other part appearing at the beginning of the next line.  The
1.18      cvs      5057: rule is formed by the <tt>LineBreak</tt> keyword followed by a colon and a
                   5058: constant boolean value (<tt>Yes</tt> or <tt>No</tt>).  This is the only form
1.1       cvs      5059: possible: this rule cannot be inherited.  Moreover, it can only appear in the
                   5060: rules of the primary view and applies to all views defined in the presentation
1.18      cvs      5061: schema.</p>
                   5062: <pre>               'PageBreak' ':' Boolean .
1.1       cvs      5063:                'LineBreak' ':' Boolean .
1.18      cvs      5064:      Boolean = 'Yes' / 'No' .</pre>
1.30    ! cvs      5065: 
        !          5066: <p>When a box can be cut by a page break, it is possible that a page break
        !          5067: will fall an inappropriate spot, creating, for example, a widow or orphan, or
1.1       cvs      5068: separating the title of a section from the first paragraph of the section. The
1.18      cvs      5069: <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules are used to avoid this. They
                   5070: specify that the box of the element to which they apply cannot be cut within a
                   5071: certain zone at the top (<tt>NoBreak1</tt> rule) or at the bottom
                   5072: (<tt>NoBreak2</tt> rule).  These two rules specify the height of the zones in
                   5073: which page breaks are prohibited.</p>
1.30    ! cvs      5074: 
        !          5075: <p>The <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules give the height of the
        !          5076: zone in which page breaking is prohibited.  The height is given as a constant
        !          5077: value using any of the <a href="#sectc4217">available units</a>, absolute or
1.18      cvs      5078: relative.  The value may not be inherited.</p>
                   5079: <pre>                   'NoBreak1' ':' AbsDist .
                   5080:                    'NoBreak2' ':' AbsDist .</pre>
1.30    ! cvs      5081: 
1.18      cvs      5082: <blockquote class="example">
1.30    ! cvs      5083:   <p><strong>Example:</strong></p>
        !          5084: 
        !          5085:   <p>The following rules prevent widows and orphans in a paragraph:</p>
        !          5086:   <pre>Paragraph :
1.1       cvs      5087:    BEGIN
                   5088:    NoBreak1 : 2;
                   5089:    NoBreak2 : 2;
1.18      cvs      5090:    END;</pre>
1.30    ! cvs      5091: 
        !          5092:   <p>This rule prevents a section title from becoming separated from the first
        !          5093:   paragraph of the section by prohibiting page breaks at the beginning of the
        !          5094:   section rule:</p>
        !          5095:   <pre>Section :
1.18      cvs      5096:    NoBreak1 : 1.5 cm;</pre>
1.30    ! cvs      5097: 
        !          5098:   <p>Finally, this rule prevents a figure from being page broken in any
        !          5099:   way:</p>
        !          5100:   <pre>Figure :
1.18      cvs      5101:    PageBreak : No;</pre>
                   5102: </blockquote>
1.30    ! cvs      5103: 
        !          5104: <p>The Thot editor constructs the document images displayed on the screen
1.1       cvs      5105: dynamically.  As the user moves in the document or makes the document scroll
                   5106: in a window, the editor constructs the image to be displayed in little bits,
                   5107: filling the gaps which are produced in the course of these operations.  It
                   5108: stops filling in the image when an element reaches the edge of the window in
                   5109: which the gap appears.  If the appearance of the document is complex, it is
                   5110: possible that the image in incomplete, even though the edge of the window was
                   5111: reached.  For example, an element might need to be presented to the side of
                   5112: the last element displayed, but its image was not constructed.  The user will
                   5113: not know whether the element is really absent or if its image has simply not
1.18      cvs      5114: been constructed.</p>
1.30    ! cvs      5115: 
        !          5116: <p>The <tt>Gather</tt> rule is used to remedy this problem.  When the rule
1.18      cvs      5117: <tt>Gather : Yes;</tt> is associated with an element type, the image of such
                   5118: elements is constructed as a block by the editor: it is never split up.</p>
1.30    ! cvs      5119: 
        !          5120: <p>The <tt>Gather</tt> rule may not appear in the <a href="#sectc427">default
1.18      cvs      5121: rules</a>.  Elements which do not have the <tt>Gather</tt> rule are considered
                   5122: susceptible to being split up during display.  Thus, it is not necessary to
                   5123: use the <tt>Gather : No;</tt> form. This rule must be used prudently and only
                   5124: for those elements which truly need it.  If used incorrectly, it can
                   5125: pointlessly increase the size of the image constructed by the editor and lead
                   5126: to excessive memory consumption by the editor.</p>
1.30    ! cvs      5127: 
        !          5128: <p>Like the <tt>PageBreak</tt> and <tt>LineBreak</tt> rules, the
        !          5129: <tt>Gather</tt> rule can only appear in rules of the primary view and applies
        !          5130: to all views defined in the presentation schema.</p>
1.18      cvs      5131: <pre>                   'Gather' ':' Boolean .</pre>
                   5132: </div>
1.1       cvs      5133: 
1.18      cvs      5134: <div class="subsection">
1.30    ! cvs      5135: <h3><a name="sectc4224">Visibility</a></h3>
1.1       cvs      5136: 
1.30    ! cvs      5137: <p>The visibility parameter is used to control which elements should or should
1.1       cvs      5138: not be displayed, based on context.  An element can have different
                   5139: visibilities in different views.  If an element's visibility is zero for a
                   5140: view, that element is not displayed in that view and does not occupy any space
1.18      cvs      5141: (its extents are zero).</p>
1.30    ! cvs      5142: 
        !          5143: <p>Visibility takes non-negative integer values (positive or zero).  If values
1.1       cvs      5144: greater than 1 are used, they allow the user to choose a degree of visibility
                   5145: and, thus, to see only those boxes whose visibility parameter exceeds a
                   5146: certain threshold.  This gives the user control over the granularity of the
1.18      cvs      5147: displayed pictures.</p>
1.30    ! cvs      5148: 
        !          5149: <p>The visibility parameter can be defined as a constant or by inheritance. If
1.1       cvs      5150: defined by inheritance, it cannot be based on the value of the next or
1.18      cvs      5151: previous box.  Visibility can only be inherited from above.</p>
1.30    ! cvs      5152: 
        !          5153: <p>If it is a numeric attribute's presentation rule, the visibility can be
1.1       cvs      5154: specified by the attribute's name, in which case the value of the attribute is
1.18      cvs      5155: used.</p>
                   5156: <pre>                   'Visibility' ':' NumberInherit
1.1       cvs      5157:      NumberInherit = Integer / AttrID / Inheritance .
1.18      cvs      5158:      Integer       = NUMBER .</pre>
1.30    ! cvs      5159: 
1.18      cvs      5160: <blockquote class="example">
1.30    ! cvs      5161:   <p><strong>Example:</strong></p>
        !          5162: 
        !          5163:   <p>Suppose that only <tt>Formula</tt> elements should be displayed in the
        !          5164:   <tt>MathView</tt> view.  Then, the default rules should include:</p>
        !          5165:   <pre>DEFAULT
1.18      cvs      5166:      IN MathView Visibility:0;</pre>
1.30    ! cvs      5167: 
        !          5168:   <p>which makes all elements invisible in the <tt>MathView</tt> view. 
        !          5169:   However, the <tt>Formula</tt> element also has a <tt>Visibility</tt>
        !          5170:   rule:</p>
        !          5171:   <pre>Formula :
1.18      cvs      5172:      IN MathView Visibility:5;</pre>
1.30    ! cvs      5173: 
        !          5174:   <p>which makes formulas, and only formulas, visible.</p>
1.18      cvs      5175: </blockquote>
                   5176: </div>
1.1       cvs      5177: 
1.18      cvs      5178: <div class="subsection">
1.30    ! cvs      5179: <h3><a name="sectc4225">Character style parameters</a></h3>
1.1       cvs      5180: 
1.30    ! cvs      5181: <p>Four parameters are used to determine which characters are used to display
1.18      cvs      5182: text.  They are size, font, style, and underlining.</p>
1.1       cvs      5183: 
1.18      cvs      5184: <div class="subsubsection">
1.30    ! cvs      5185: <h4><a name="sectd42251">Character size</a></h4>
        !          5186: 
        !          5187: <p>The size parameter has two effects.  First, it is used to specify the
        !          5188: actual size and distance units for boxes defined in <a
        !          5189: href="#sectc4217">relative units</a>.  Second, it defines the size of the
        !          5190: characters contained in the box.</p>
1.1       cvs      5191: 
1.30    ! cvs      5192: <p>As a distance or length, the size can be expressed in abstract or absolute
1.1       cvs      5193: units.  It can also be inherited.  If it is not inherited, it is expressed
1.18      cvs      5194: simply as an integer followed by the <tt>pt</tt> keyword, which indicates that
                   5195: the size is expressed in typographer's points. The absence of the <tt>pt</tt>
1.1       cvs      5196: keyword indicates that it is in abstract units in which the value 1 represents
                   5197: the smallest size while the value 16 is the largest size.  The relationship
                   5198: between these abstract sizes and the real character sizes is controlled by a
                   5199: table which can be modified statically or even dynamically during the
1.18      cvs      5200: execution of the Thot editor.</p>
1.30    ! cvs      5201: 
        !          5202: <p>If the <tt>Size</tt> rule is a numeric attribute's presentation rule, the
        !          5203: value of the size parameter can be specified by the attribute's name, in which
        !          5204: case the value of the attribute is used.</p>
        !          5205: 
        !          5206: <p><strong>Note:</strong> the only unit available for  defining an absolute
        !          5207: size is the typographer's point.  Centimeters and inches may not be used.</p>
        !          5208: 
        !          5209: <p>If the size is inherited, the rule must specify the relative from which to
        !          5210: inherit and any percentage or difference from that relative's value. A
        !          5211: percentage is indicated by a <tt>*</tt> followed by the value of the
        !          5212: percentage and a <tt>%</tt>. A difference can be expressed in either
        !          5213: typographer's points or in abstract units and the maximum or minimum size can
        !          5214: be specified, but without specifying the unit: it is the same as was specified
        !          5215: for the difference.</p>
        !          5216: 
        !          5217: <p>In a numeric attribute's presentation rule, the difference in size or the
1.22      cvs      5218: percentage can be indicated by the attribute's name instead of the numeric
                   5219: value, which means that the attribute's value should be used as the difference
                   5220: or percentage.  The attribute can also be used as the minimum or maximum size
                   5221: for a difference.</p>
                   5222: <pre>                      'Size' ':' SizeInherit
                   5223:      SizeInherit     = SizeAttr [ 'pt' ] /
                   5224:                        Kinship InheritedSize .
                   5225:      InheritedSize   ='+' SizeAttr [ 'pt' ]
                   5226:                        [ 'Max' MaxSizeAttr ] /
                   5227:                       '-' SizeAttr [ 'pt' ]
                   5228:                        [ 'Min' MinSizeAttr ] /
                   5229:                       '*' PercentSizeAttr '%' /
                   5230:                       '=' .
                   5231:      SizeAttr        = Size / AttrID .
                   5232:      Size            = NUMBER .
                   5233:      MaxSizeAttr     = MaxSize / AttrID .
                   5234:      MaxSize         = NUMBER .
                   5235:      MinSizeAttr     = MinSize / AttrID .
                   5236:      MinSize         = NUMBER .
                   5237:      PercentSizeAttr = PercentSize / AttrID .
                   5238:      PercentSize     = NUMBER .</pre>
1.30    ! cvs      5239: 
1.18      cvs      5240: <blockquote class="example">
1.30    ! cvs      5241:   <p><strong>Example:</strong></p>
        !          5242: 
        !          5243:   <p>The rule</p>
        !          5244:   <pre>Size : Enclosing - 2 pt Min 7;</pre>
        !          5245: 
        !          5246:   <p>states that the character size is 2 points less than that of the
        !          5247:   enclosing box, but that it may not be less than 7 points, whatever the
        !          5248:   enclosing box's value.</p>
        !          5249: 
        !          5250:   <p>The following rules make the text of a report be displayed with
        !          5251:   medium-sized characters (for example, size 5), while the title is displayed
        !          5252:   with larger characters and the summary is displayed with smaller
        !          5253:   characters:</p>
        !          5254:   <pre>Report :
1.1       cvs      5255:      Size : 5;
                   5256: Title :
                   5257:      Size : Enclosing + 2;
                   5258: Summary :
1.18      cvs      5259:      Size : Enclosing - 1;</pre>
1.30    ! cvs      5260: 
        !          5261:   <p>Thus, the character sizes in the entire document can be changed by
        !          5262:   changing the size parameter of the Report element, while preserving the
        !          5263:   relationships between the sizes of the different elements.</p>
1.18      cvs      5264: </blockquote>
                   5265: </div>
                   5266: 
                   5267: <div class="subsubsection">
1.30    ! cvs      5268: <h4><a name="sectd42252">Font and character style</a></h4>
1.18      cvs      5269: 
1.30    ! cvs      5270: <p>The <tt>Font</tt> rule determines the font family to be used to display the
1.18      cvs      5271: characters contained in the box, while the <tt>Style</tt> rule determines
1.23      cvs      5272: their style and the <tt>Weight</tt> rule determines their weight.  Thot
                   5273: recognizes three character fonts (Times, Helvetica, and Courier), three
                   5274: styles: Roman, Italics, and Oblique, and two weights: Normal and Bold.</p>
1.30    ! cvs      5275: 
        !          5276: <p>The font family, style and weight can be specified by a named constant or
        !          5277: can be inherited.  For the name of the font family only the first character is
        !          5278: used.</p>
        !          5279: 
        !          5280: <p>Only identical inheritance is allowed: the box takes the same font, style
        !          5281: or weight as the box from which it inherits.  This is indicated by an equals
1.23      cvs      5282: sign after the kinship specification.</p>
                   5283: <pre>               'Font' ':'          NameInherit /
                   5284:                'Style' ':'         StyleInherit /
                   5285:                'Weight' ':'        WeightInherit /
                   5286: 
                   5287: NameInherit   = Kinship '=' / FontName .
                   5288: FontName      = NAME .
                   5289: StyleInherit  = Kinship '=' /
                   5290:                 'Roman' / 'Italics' / 'Oblique' .
                   5291: WeightInherit = Kinship '=' /
                   5292:                 'Normal' / 'Bold' .</pre>
1.30    ! cvs      5293: 
1.18      cvs      5294: <blockquote class="example">
1.30    ! cvs      5295:   <p><strong>Example:</strong></p>
        !          5296: 
        !          5297:   <p>To specify that the summary uses the font family of the rest of the
        !          5298:   document, but in the italic style, the following rules are used:</p>
        !          5299:   <pre>Summary :
1.1       cvs      5300:    BEGIN
                   5301:    Font : Enclosing =;
                   5302:    Style : Italics;
1.18      cvs      5303:    END;</pre>
                   5304: </blockquote>
                   5305: </div>
                   5306: 
                   5307: <div class="subsubsection">
1.30    ! cvs      5308: <h4><a name="sectd42253">Underlining</a></h4>
1.18      cvs      5309: 
1.30    ! cvs      5310: <p>The <tt>Underline</tt> rule is used to specify if the characters contained
        !          5311: in a box should have lines drawn on or near them.  There are four underlining
1.18      cvs      5312: styles: <tt>Underlined</tt>, <tt>Overlined</tt>, <tt>CrossedOut</tt>, and
                   5313: <tt>NoUnderline</tt>.  The <tt>Thickness</tt> rule specifies the thickness of
                   5314: the line, <tt>Thin</tt> or <tt>Thick</tt>.</p>
1.30    ! cvs      5315: 
        !          5316: <p>As with font family and style, only identical inheritance is allowed: the
        !          5317: box has the same underlining type as the box from which it inherits the value.
1.18      cvs      5318: This is indicated by an equals sign after the kinship specification.</p>
                   5319: <pre>                   'Underline' ':' UnderLineInherit /
1.1       cvs      5320:                    'Thickness' ':' ThicknessInherit /
                   5321: 
                   5322: UnderLineInherit = Kinship '=' / 'NoUnderline' /
                   5323:                    'Underlined' / 
                   5324:                    'Overlined' / 'CrossedOut' .
1.18      cvs      5325: ThicknessInherit = Kinship '=' / 'Thick' / 'Thin' .</pre>
                   5326: </div>
                   5327: </div>
                   5328: 
                   5329: <div class="subsection">
1.30    ! cvs      5330: <h3><a name="sectc4226">Stacking order</a></h3>
1.18      cvs      5331: 
1.30    ! cvs      5332: <p>The <tt>Depth</tt> rule is used to define the stacking order of terminal
        !          5333: boxes when multiple boxes at least partially overlap.  This rule defines how
        !          5334: the depth parameter, which is zero or a positive integer, is calculated.  The
1.1       cvs      5335: depth parameter has a value for all boxes.  For terminal boxes in the
                   5336: structure and for presentation boxes, the depth value is used during display
                   5337: and printing: the boxes with the lowest value overlap those with higher
                   5338: depths.  For non-terminal boxes, the depth is not interpreted during display,
1.18      cvs      5339: but it is used to calculate the depth of terminal boxes by inheritance.</p>
1.30    ! cvs      5340: 
        !          5341: <p>Like most other rules, the depth rule is defined in the <a
1.18      cvs      5342: href="#sectc427">default rules</a> of each presentation schema.  Thus, there
                   5343: is always a depth value, even when it is not necessary because there is no
                   5344: overlapping.  To avoid useless operations, a zero value can be given to the
                   5345: depth parameter, which signifies that overlapping is never a problem.</p>
1.30    ! cvs      5346: 
        !          5347: <p>The depth rule has the same form as the <a href="#sectc4224">visibility
1.18      cvs      5348: rule</a>. It can be defined by inheritance or by a constant numeric value.
                   5349: When the rule is attached to a numeric attribute, it can take the value of
                   5350: that attribute.</p>
                   5351: <pre>                'Depth' ':' NumberInherit</pre>
1.30    ! cvs      5352: 
1.18      cvs      5353: <blockquote class="example">
1.30    ! cvs      5354:   <p><strong>Example:</strong></p>
        !          5355: 
        !          5356:   <p>For a purely textual document, in which overlapping never poses a
        !          5357:   problem, a single default <tt>Depth</tt> rule in the presentation schema is
        !          5358:   sufficient:</p>
        !          5359:   <pre>DEFAULT
1.1       cvs      5360:     Depth : 0;
1.18      cvs      5361:     ...</pre>
1.30    ! cvs      5362: 
        !          5363:   <p>To make the text of examples appear on a light blue background, a
        !          5364:   presentation box is defined:</p>
        !          5365:   <pre>BOXES
1.1       cvs      5366:    BlueBG :
                   5367:       BEGIN
                   5368:       Content : Graphics 'R';
                   5369:       Background : LightBlue3;
                   5370:       FillPattern: backgroundcolor;
                   5371:       Depth : 2;
                   5372:       ...
1.18      cvs      5373:       END;</pre>
1.30    ! cvs      5374: 
        !          5375:   <p>and is created by the <tt>Example</tt> element, which has the rules:</p>
        !          5376:   <pre>RULES
1.1       cvs      5377:    Example :
                   5378:       BEGIN
                   5379:       CreateFirst (BlueBG);
                   5380:       Depth : 1;
                   5381:       ...
1.18      cvs      5382:       END;</pre>
1.30    ! cvs      5383: 
        !          5384:   <p>In this way, the text of an example (if it inherits its depth from its
        !          5385:   ancestor) will be superimposed on a light blue background, and not the
        !          5386:   reverse).</p>
1.18      cvs      5387: </blockquote>
                   5388: </div>
                   5389: 
                   5390: <div class="subsection">
1.30    ! cvs      5391: <h3><a name="sectc4227">Line style</a></h3>
1.18      cvs      5392: 
1.30    ! cvs      5393: <p>The <tt>LineStyle</tt> rule determines the style of line which should be
        !          5394: used to draw all the elements contained in the box and the box itself, if it
        !          5395: has a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>.  The line style can be
1.18      cvs      5396: indicated by a name (<tt>Solid</tt>, <tt>Dashed</tt>, <tt>Dotted</tt>) or it
1.13      cvs      5397: can be inherited.  All elements of the graphic base type are affected by this
1.1       cvs      5398: rule, but it can be attached to any box and transmitted by inheritance to the
1.18      cvs      5399: graphic elements.  The border of elements having a <a
                   5400: href="#sectc4230a"><tt>ShowBox</tt> rule</a> is drawn according to the line
                   5401: style specified by this rule.</p>
1.30    ! cvs      5402: 
        !          5403: <p>Only identical inheritance is allowed: the box takes the same line style as
1.1       cvs      5404: the box from which it inherits.  This is indicated by an equals sign after the
1.18      cvs      5405: kinship specification.</p>
                   5406: <pre>                      'LineStyle' ':' LineStyleInherit
1.1       cvs      5407:      LineStyleInherit = Kinship '=' /
1.18      cvs      5408:                       'Solid' / 'Dashed' / 'Dotted' .</pre>
1.30    ! cvs      5409: 
1.18      cvs      5410: <blockquote class="example">
1.30    ! cvs      5411:   <p><strong>Example:</strong></p>
        !          5412: 
        !          5413:   <p>To specify that, in Figures, the graphical parts should be drawn in solid
        !          5414:   lines, the Figure element is given a rule using the <tt>Solid</tt> name:</p>
        !          5415:   <pre>Figure :
1.18      cvs      5416:    LineStyle : Solid;</pre>
1.30    ! cvs      5417: 
        !          5418:   <p>and the elements composing figures are given an inheritance rule:</p>
        !          5419:   <pre>   LineStyle : Enclosing =;</pre>
1.18      cvs      5420: </blockquote>
                   5421: </div>
                   5422: 
                   5423: <div class="subsection">
1.30    ! cvs      5424: <h3><a name="sectc4228">Line thickness</a></h3>
1.18      cvs      5425: 
1.30    ! cvs      5426: <p>The <tt>LineWeight</tt> rule determines the thickness of the lines  of all
1.1       cvs      5427: graphical elements which appear in the box, no matter what their line style.
                   5428: Line thickness can be specified by a constant value or by inheritance.  A
                   5429: constant value is a positive number followed by an optional unit specification
1.18      cvs      5430: (which is absent when using relative units).  All available <a
                   5431: href="#sectc4217">distance units</a> can be used.  Line thickness is expressed
                   5432: in the same way as <a href="#sectd42221">line spacing</a>.</p>
                   5433: <pre>                 'LineWeight' ':' DistOrInherit</pre>
1.30    ! cvs      5434: 
        !          5435: <p>All elements of the graphic base type are affected by this rule, but it can
        !          5436: be attached to any box and transmitted by inheritance to the graphic elements.
1.18      cvs      5437: The border of element having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>
                   5438: is also drawn according to the thickness specified by this rule.</p>
1.30    ! cvs      5439: 
1.18      cvs      5440: <blockquote class="example">
1.30    ! cvs      5441:   <p><strong>Example:</strong></p>
        !          5442: 
        !          5443:   <p>To specify that, in Figures, the graphical parts should be drawn with
        !          5444:   lines 0.3 pt thick, the Figure element is given this rule:</p>
        !          5445:   <pre>Figure :
1.18      cvs      5446:    LineWeight : 0.3 pt;</pre>
1.30    ! cvs      5447: 
        !          5448:   <p>and the elements composing figures are given an inheritance rule:</p>
        !          5449:   <pre>   LineWeight : Enclosing =;</pre>
1.18      cvs      5450: </blockquote>
                   5451: </div>
                   5452: 
                   5453: <div class="subsection">
1.30    ! cvs      5454: <h3><a name="sectc4229">Fill pattern</a></h3>
1.18      cvs      5455: 
1.30    ! cvs      5456: <p>The <tt>FillPattern</tt> rule determines the pattern used to fill closed
1.1       cvs      5457: graphical elements (circles, rectangles, etc.) which appear in the box.  This
1.18      cvs      5458: rule also specifies the pattern used to fill the box associated with elements
                   5459: having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a><a>.  This pattern can
                   5460: be indicated by a named constant or by inheritance.  The named constant
                   5461: identifies one of the patterns available in Thot.  The names of the available
                   5462: patterns are: nopattern, foregroundcolor, backgroundcolor, gray1, gray2,
                   5463: gray3, gray4, gray5, gray6, gray7, horiz1, horiz2, horiz3, vert1, vert2,
                   5464: vert3, left1, left2, left3, right1, right2, right3, square1, square2, square3,
                   5465: lozenge, brick, tile, sea, basket.</a></p>
1.30    ! cvs      5466: 
        !          5467: <p>Like the other rules peculiar to graphics, <tt>LineStyle</tt> and
1.18      cvs      5468: <tt>LineWeight</tt>, only elements of the graphic base type are affected by
                   5469: the <tt>FillPattern</tt> rule, but the rule can be attached to any box and
1.1       cvs      5470: transmitted by inheritance to the graphic elements.  As with the other rules
1.18      cvs      5471: specific to graphics, only identical inheritance is allowed.</p>
1.30    ! cvs      5472: 
        !          5473: <p>The <tt>FillPattern</tt> rule can also be used to determine whether or not
1.12      cvs      5474: text characters, symbols and pictures should be colored.  For these element
                   5475: types (text, symbols, and pictures), the only valid values are
1.18      cvs      5476: <tt>nopattern</tt>, <tt>foregroundcolor</tt>, and <tt>backgroundcolor</tt>.
                   5477: When <tt>FillPattern</tt> has the value <tt>backgroundcolor</tt>, text
                   5478: characters, symbols, and bitmaps are given the color specified by the <a
                   5479: href="#sectc4230"><tt>Background</tt> rule</a> which applies to these
                   5480: elements.  When <tt>FillPattern</tt> has the value <tt>foregroundcolor</tt>,
                   5481: these same elements are given the color specified by the <a
                   5482: href="#sectc4230"><tt>Foreground</tt> rule</a> which applies to these
                   5483: elements.  In all other case, text characters are not colored.</p>
                   5484: <pre>                 'FillPattern' ':' NameInherit</pre>
1.30    ! cvs      5485: 
1.18      cvs      5486: <blockquote class="example">
1.30    ! cvs      5487:   <p><strong>Example:</strong></p>
        !          5488: 
        !          5489:   <p>To specify that, in Figures, the closed graphical elements should be
        !          5490:   filled with a pattern resembling a brick wall, the Figure element is given
        !          5491:   this rule:</p>
        !          5492:   <pre>Figure :
1.18      cvs      5493:    FillPattern : brick;</pre>
1.30    ! cvs      5494: 
        !          5495:   <p>and the elements composing figures are given an inheritance rule:</p>
        !          5496:   <pre>   FillPattern : Enclosing =;</pre>
1.18      cvs      5497: </blockquote>
                   5498: </div>
                   5499: 
                   5500: <div class="subsection">
1.30    ! cvs      5501: <h3><a name="sectc4230">Colors</a></h3>
1.18      cvs      5502: 
1.30    ! cvs      5503: <p>The <tt>Foreground</tt> and <tt>Background</tt> rules determine the
        !          5504: foreground and background colors of the base elements which appear in the box.
        !          5505: They also control the color of boxes associated with elements having a <a
1.18      cvs      5506: href="#sectc4230a"><tt>ShowBox</tt> rule</a>.  These colors can be specified
                   5507: with a named constant or by inheritance.  The named constants specify one of
                   5508: the available colors in Thot.  The available color names can be found in the
1.30    ! cvs      5509: file <tt>thot.color</tt>. In addition to those names, you can use the keyword
        !          5510: <code>Transparent</code>, to not draw anything.</p>
        !          5511: 
        !          5512: <p>The color rules affect the same way all base elements and elements having a
        !          5513: <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>, no matter what their type
        !          5514: (text, graphics, pictures, symbols).  The color rules can be associated with
        !          5515: any box and can be transmitted by inheritance to the base elements or the
        !          5516: elements having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>.  Like the
        !          5517: preceding rules, only inheritance of the same value is allowed.</p>
        !          5518: <pre>                 'Foreground' ':' Color
        !          5519:                  'Background' ':' Color
        !          5520:       Color = 'Transparent' / Link '=' / FontColorName .</pre>
        !          5521: 
        !          5522: <p><strong>Note:</strong> text colors only appear for text elements whose <a
1.18      cvs      5523: href="#sectc4229">fill pattern</a> does not prevent the use of color.</p>
1.30    ! cvs      5524: 
1.18      cvs      5525: <blockquote class="example">
1.30    ! cvs      5526:   <p><strong>Example:</strong></p>
        !          5527: 
        !          5528:   <p>To specify that, in Figures, everything must be drawn in blue on a
        !          5529:   background of yellow, the Figure element is given these rules:</p>
        !          5530:   <pre>Figure :
1.1       cvs      5531:    BEGIN
                   5532:    Foreground : Blue;
                   5533:    Background : Yellow;
                   5534:    Fillpattern : backgroundcolor;
1.18      cvs      5535:    END;</pre>
1.30    ! cvs      5536: 
        !          5537:   <p>and the elements composing figures are given inheritance rules:</p>
        !          5538:   <pre>   Foreground : Enclosing =;
1.1       cvs      5539:    Background : Enclosing =;
1.18      cvs      5540:    FillPattern : Enclosing =;</pre>
                   5541: </blockquote>
                   5542: </div>
                   5543: 
                   5544: <div class="subsection">
1.30    ! cvs      5545: <h3><a name="sectc4230a">Background color and border</a></h3>
1.18      cvs      5546: 
1.30    ! cvs      5547: <p>Boxes associated with structural elements are normally not visible, but it
        !          5548: is possible to draw their border and/or to paint their area when it is needed.
1.18      cvs      5549: This is achieved by associating the <tt>ShowBox</tt> rule with the concerned
1.13      cvs      5550: element.  This rule has no parameter and no value. It is simply written
1.18      cvs      5551: <tt>Showbox;</tt>. It is not inherited nor transmitted to any other element.
                   5552: It applies only to the element with which it is associated.</p>
                   5553: <pre>                 'ShowBox'</pre>
1.30    ! cvs      5554: 
        !          5555: <p>When an element has a <tt>ShowBox</tt> rule, the border is drawn only if
        !          5556: the <tt>LineWeight</tt> rule that applies to that element has a non-zero value
1.18      cvs      5557: (this value can be inherited).  The color, style and thickness of the border
                   5558: are defined by the <tt>Foreground</tt>, <tt>LineStyle</tt>, and
                   5559: <tt>LineWeight</tt> rules that apply to the element.</p>
1.30    ! cvs      5560: 
        !          5561: <p>When an element has a <tt>ShowBox</tt> rule, the background of this element
        !          5562: is paint only if the value of the <tt>FillPattern</tt> rule that applies to
        !          5563: that element is not <tt>nopattern</tt>.  The pattern and color(s) of the
        !          5564: background are defined by the <tt>FillPattern</tt>, <tt>Background</tt>, and
1.18      cvs      5565: <tt>Foreground</tt> rules that apply to the element.</p>
                   5566: </div>
                   5567: 
                   5568: <div class="subsection">
1.30    ! cvs      5569: <h3><a name="sectc4230b">Background pictures</a></h3>
1.18      cvs      5570: 
1.30    ! cvs      5571: <p>The <tt>BackgroundPicture</tt> rule allows to display a picture as the
1.13      cvs      5572: background of an element.  It has a single parameter, the file name of the
1.18      cvs      5573: picture.  This is a string delimited by single quotes.  If the first character
                   5574: in this string is '/', it is considered as an absolute path, otherwise the
                   5575: file is searched for along the schema directory path.  This file may contain a
                   5576: picture in any format accepted by Thot (xbm, xpm, gif, jpeg, png, etc.)</p>
1.30    ! cvs      5577: 
        !          5578: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only to
1.13      cvs      5579: the element with which they are associated.  They are not inherited nor
1.18      cvs      5580: transmitted to children elements.</p>
1.30    ! cvs      5581: 
        !          5582: <p>The background picture has not always the same size as the element's box.
1.13      cvs      5583: There are diffrent ways to fill the element box with the picture.  This is
1.18      cvs      5584: specified by the <tt>PictureMode</tt> rule, which should be associated to the
                   5585: same element.  This rule may take one of the following values:</p>
                   5586: <dl>
1.30    ! cvs      5587:   <dt><tt>NormalSize</tt></dt>
        !          5588:     <dd>The picture is centered in the box, and clipped if it is too
        !          5589:     large.</dd>
        !          5590:   <dt><tt>Scale</tt></dt>
        !          5591:     <dd>The picture is zoomed to fit the box size.</dd>
        !          5592:   <dt><tt>RepeatX</tt></dt>
        !          5593:     <dd>The picture is repeated horizontally to fit the box width.</dd>
        !          5594:   <dt><tt>RepeatY</tt></dt>
        !          5595:     <dd>The picture is repeated vertically to fit the box height.</dd>
        !          5596:   <dt><tt>RepeatXY</tt></dt>
        !          5597:     <dd>The picture is repeated both horizontally and vertically to fill the
        !          5598:       box.</dd>
1.18      cvs      5599: </dl>
1.30    ! cvs      5600: 
        !          5601: <p>If an element has a <tt>BackgroundPicture</tt> rule and no
1.18      cvs      5602: <tt>PictureMode</tt> rule, the <tt>NormalSize</tt> value is assumed.</p>
                   5603: <pre>                 'BackgroundPicture' ':' FileName /
1.13      cvs      5604:                  'PictureMode' ':' PictMode .
                   5605:  
                   5606:       FileName = STRING .
1.18      cvs      5607:       PictMode = 'NormalSize' / 'Scale' / 'RepeatXY' / 'RepeatX' / 'RepeatY' .</pre>
1.30    ! cvs      5608: 
        !          5609: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only to
1.13      cvs      5610: the element with which they are associated.  They are not inherited nor
1.18      cvs      5611: transmitted to children elements.</p>
                   5612: </div>
1.13      cvs      5613: 
1.18      cvs      5614: <div class="subsection">
1.30    ! cvs      5615: <h3><a name="sectc4231">Presentation box content</a></h3>
1.1       cvs      5616: 
1.30    ! cvs      5617: <p>The <tt>Content</tt> rule applies to presentation boxes.  It indicates the
1.1       cvs      5618: content given to a box.  This content is either a variable's value or a
1.18      cvs      5619: constant value.  In the special case of <a href="#sectc4233">header or footer
                   5620: boxes</a>, the content can also be a structured element type.</p>
1.30    ! cvs      5621: 
        !          5622: <p>If the content is a constant, it can be specified, as in a variable
1.18      cvs      5623: declaration, either by the name of a constant declared in the <tt>CONST</tt>
1.1       cvs      5624: section or by direct specification of the type and value of the box's
1.18      cvs      5625: content.</p>
1.30    ! cvs      5626: 
        !          5627: <p>Similarly, if it is a variable, the name of a variable declared in
1.18      cvs      5628: <tt>VAR</tt> section can be given or the variable may be defined within
                   5629: parentheses.  The content inside the parentheses has the same syntax as a <a
                   5630: href="#sectc426">variable declaration</a>.</p>
1.30    ! cvs      5631: 
        !          5632: <p>When the content is a structured element type, the name of the element type
        !          5633: is given after the colon.  In this case,  the box's content is all elements of
1.1       cvs      5634: the named type which are designated by references which are part of the page
1.18      cvs      5635: on which the header or footer with this <tt>Content</tt> rule appears.  Only
                   5636: associated elements can appear in a <tt>Content</tt> rule and the structure
1.1       cvs      5637: must provide references to these elements.  Moreover, the box whose content
                   5638: they are must be a header or footer box generated by a page box of the primary
1.18      cvs      5639: view.</p>
                   5640: <pre>               'Content' ':' VarConst
1.1       cvs      5641:      VarConst = ConstID / ConstType ConstValue /
                   5642:                 VarID / '(' FunctionSeq ')' /
1.18      cvs      5643:                 ElemID .</pre>
1.30    ! cvs      5644: 
        !          5645: <p>A presentation box can have only one <tt>Content</tt> rule, which means
        !          5646: that the content of a presentation box cannot vary from view to view. However,
        !          5647: such an effect can be achieved by creating several presentation boxes, each
        !          5648: with different content and visible in different views.</p>
        !          5649: 
        !          5650: <p>The <tt>Content</tt> rule also applies to elements defined as references in
1.1       cvs      5651: the structure schema.  In this case, the content defined by the rule  must be
                   5652: a constant.  It is this content which appears on the screen or paper to
                   5653: represent references of the type to which the rule applies.  A reference can
1.18      cvs      5654: have a <tt>Content</tt> rule or a <a href="#sectc4234"><tt>Copy</tt> rule</a>
1.1       cvs      5655: for each view.  If neither of these rules appears, the reference is displayed
1.18      cvs      5656: as <tt>[*]</tt>, which is equivalent to the rule:</p>
                   5657: <pre>     Content: Text '[*]';</pre>
1.30    ! cvs      5658: 
1.18      cvs      5659: <blockquote class="example">
1.30    ! cvs      5660:   <p><strong>Example:</strong></p>
        !          5661: 
        !          5662:   <p>The content of the presentation box created to make the chapter number
        !          5663:   and section number appear before each section title can be defined by:</p>
        !          5664:   <pre>BOXES
1.1       cvs      5665:      SectionNumBox :
                   5666:           BEGIN
                   5667:           Content : NumSection;
                   5668:           ...
1.18      cvs      5669:           END;</pre>
1.30    ! cvs      5670: 
        !          5671:   <p>if the <tt>NumSection</tt> variable has been defined in the variable
        !          5672:   definition section of the presentation schema.  Otherwise the
        !          5673:   <tt>Content</tt> would be written:</p>
        !          5674:   <pre>BOXES
1.1       cvs      5675:      SectionNumBox :
                   5676:           BEGIN
                   5677:           Content : (VALUE (ChapterCtr, Roman) TEXT '.'
                   5678:                      VALUE (SectionCtr, Arabic));
                   5679:           ...
1.18      cvs      5680:           END;</pre>
1.30    ! cvs      5681: 
        !          5682:   <p>To specify that a page footer should contain all elements of the
        !          5683:   <tt>Note</tt> type are referred to in the page, the following rule is
        !          5684:   written:</p>
        !          5685:   <pre>BOXES
1.1       cvs      5686:      NotesFooterBox :
                   5687:           BEGIN
                   5688:           Content : Note;
                   5689:           ...
1.18      cvs      5690:           END;</pre>
1.30    ! cvs      5691: 
        !          5692:   <p><tt>Note</tt> is defined as an associated element in the structure schema
        !          5693:   and NotesFooterBox is created by a page box of the primary view.</p>
1.18      cvs      5694: </blockquote>
                   5695: </div>
1.1       cvs      5696: 
1.18      cvs      5697: <div class="subsection">
1.30    ! cvs      5698: <h3><a name="sectc4232">Presentation box creation</a></h3>
1.1       cvs      5699: 
1.30    ! cvs      5700: <p>A creation rule specifies that a presentation box should be created when an
1.18      cvs      5701: element of the type to which the rule is attached appears in the document.</p>
1.30    ! cvs      5702: 
        !          5703: <p>A keyword specifies the position, relative to the creating box, at which
        !          5704: the created box will be placed in the structure:</p>
1.18      cvs      5705: <dl>
1.30    ! cvs      5706:   <dt><tt>CreateFirst</tt></dt>
        !          5707:     <dd>specifies that the box should be created as the first box of the next
        !          5708:       lower level, before any already existing boxes, and only if the
        !          5709:       beginning of the creating element is visible;</dd>
        !          5710:   <dt><tt>CreateLast</tt></dt>
        !          5711:     <dd>specifies that the box should be created as the last box of the next
        !          5712:       lower level, after any existing boxes, and only if the end of the
        !          5713:       creating element is visible;</dd>
        !          5714:   <dt><tt>CreateBefore</tt></dt>
        !          5715:     <dd>specifies that the box should be created before the creating box, on
        !          5716:       the same level as the creating box, and only if the beginning of the
        !          5717:       creating element is visible;</dd>
        !          5718:   <dt><tt>CreateAfter</tt></dt>
        !          5719:     <dd>specifies that the box should be created after the creating box, on
        !          5720:       the same level as the creating box, and only if the beginning of the
        !          5721:       creating element is visible;</dd>
        !          5722:   <dt><tt>CreateEnclosing</tt></dt>
        !          5723:     <dd>specifies that the box should be created at the upper level relatively
        !          5724:       to the creating box, and that it must contain that creating box and all
        !          5725:       presentation boxes created by the same creating box.</dd>
1.18      cvs      5726: </dl>
1.30    ! cvs      5727: 
        !          5728: <p>This keyword can be followed by the <tt>Repeated</tt> keyword to indicate
        !          5729: that the box must be created for each part of the creating element. These
        !          5730: parts result from the division of the element by page breaks or column
        !          5731: changes.  If the <tt>Repeated</tt> keyword is missing, the box is only created
        !          5732: for the first part of the creating element (<tt>CreateFirst</tt> and
1.18      cvs      5733: <tt>CreateBefore</tt> rules) or for the last part (<tt>CreateLast</tt> and
                   5734: <tt>CreateAfter</tt> rules).</p>
1.30    ! cvs      5735: 
        !          5736: <p>The type of presentation to be created is specified at the end of the rule
1.18      cvs      5737: between parentheses.</p>
1.30    ! cvs      5738: 
        !          5739: <p>Creation rules cannot appear in the <a href="#sectc427">default
        !          5740: presentation rules</a>.  The boxes being created should have a
        !          5741: <tt>Content</tt> rule which indicates their <a
        !          5742: href="#sectc4231">content</a>.</p>
        !          5743: 
        !          5744: <p>Creation rules can only appear in the block of rules for the primary view;
1.1       cvs      5745: creation is provoked by a document element for all views. However, for each
                   5746: view, the presentation box is only created if the creating element is itself a
                   5747: box in the view. Moreover, the visibility parameter of the presentation box
                   5748: can be adjusted to control the creation of the box on a view-by-view
1.18      cvs      5749: basis.</p>
                   5750: <pre>                     Creation '(' BoxID ')'
1.1       cvs      5751:      Creation      = Create [ 'Repeated' ] .
                   5752:      Create        ='CreateFirst' / 'CreateLast' /
                   5753:                     'CreateBefore' / 'CreateAfter' /
1.18      cvs      5754:                     'CreateEnclosing' .</pre>
1.30    ! cvs      5755: 
1.18      cvs      5756: <blockquote class="example">
1.30    ! cvs      5757:   <p><strong>Example:</strong></p>
        !          5758: 
        !          5759:   <p>Let us define an object type, called Table, which is composed of a
        !          5760:   sequence of columns, all having the same fixed width, where the columns are
        !          5761:   separated by vertical lines.  There is a line to the left of the first
        !          5762:   column and one to the right of the last.  Each column has a variable number
        !          5763:   of cells, placed one on top of the other and separated by horizontal lines. 
        !          5764:   There are no horizontal lines above the first cell or below the last cell. 
        !          5765:   The text contained in each cell is  broken into lines and these lines are
        !          5766:   centered horizontally in the cell. The logical structure of this object is
        !          5767:   defined by:</p>
        !          5768:   <pre>Table   = LIST OF (Column);
1.18      cvs      5769: Column  = LIST OF (Cell = Text);</pre>
                   5770: 
1.30    ! cvs      5771:   <div class="figure">
        !          5772:   <hr>
        !          5773:   <pre>|                |                |               |
1.1       cvs      5774: |  xx xxxx xxxx  |x xxxx xxx xxxxx|  x xxx x xxx  |
                   5775: | xxx xxx xxxx x |   x xx x xxx   | xxxxx xxxx xx |
                   5776: |   xxxxx xxxx   |----------------|  xxx xxxxx x  |
                   5777: | xxxxx xxx xxxx | xxxx xx xx xxx |     xx xx     |
                   5778: | xxx xxxx x xxx |  xxxx x xxx x  |---------------|
                   5779: |----------------| xxx xxxx xxxxx |  xxxxx xxxxx  |
                   5780: | xxx xxx xxxxxx |----------------| xxx xxxx xxxx |
                   5781: |  xxxx xxxx xx  |  xxxx xx x xx  |  xxx xx x xx  |
                   5782: |----------------| xxx xxxxx xxxx | xxxx xxxx xxx |
                   5783: | xxxxx xxx xxxx |  xxxx xx x xx  |   xxxxx xxx   |
1.18      cvs      5784: |xxxx xx x xxxxxx| xxxx xx xxxxxx |  xxxxx xxxxx  |</pre>
1.19      cvs      5785: 
1.30    ! cvs      5786:   <p align="center"><em><a name="table">The design of a table</a></em></p>
        !          5787:   <hr>
        !          5788:   </div>
        !          5789: 
        !          5790:   <p>The presentation of the table should resemble the design of the above <a
        !          5791:   href="#table">figure</a>.  It is defined by the following presentation
        !          5792:   schema fragment:</p>
        !          5793:   <pre>BOXES
1.1       cvs      5794:      VertLine : BEGIN
                   5795:                 Width : 0.3 cm;
                   5796:                 Height : Enclosing . Height;
                   5797:                 VertPos : Top = Enclosing . Top;
                   5798:                 HorizPos : Left = Previous . Right;
                   5799:                 Content : Graphics 'v';
                   5800:                 END;
                   5801: 
                   5802:      HorizLine: BEGIN
                   5803:                 Width : Enclosing . Width;
                   5804:                 Height : 0.3 cm;
                   5805:                 VertPos : Top = Previous . Bottom;
                   5806:                 HorizPos : Left = Enclosing . Left;
                   5807:                 Content : Graphics 'h';
                   5808:                 END;
                   5809: 
                   5810: RULES
1.6       cvs      5811:      Column   : BEGIN
                   5812:                 CreateBefore (VertLine);
                   5813:                 IF LAST CreateAfter (VertLine);
                   5814:                 Width : 2.8 cm;
                   5815:                 Height : Enclosed . Height;
                   5816:                 VertPos : Top = Enclosing . Top;
                   5817:                 HorizPos : Left = Previous . Right;
                   5818:                 END;
                   5819: 
                   5820:      Cell     : BEGIN
                   5821:                 IF NOT FIRST CreateBefore (HorizLine);
                   5822:                 Width : Enclosing . Width;
                   5823:                 Height : Enclosed . Height;
                   5824:                 VertPos : Top = Previous . Bottom;
                   5825:                 HorizPos : Left = Enclosing . Left;
                   5826:                 Line;
                   5827:                 Adjust : VMiddle;
1.18      cvs      5828:                 END;</pre>
1.30    ! cvs      5829: 
        !          5830:   <p>It is useful to note that the horizontal position rule of the first
        !          5831:   vertical line will not be applied, since there is no preceding box. In this
        !          5832:   case, the box is simply placed on the left side of the enclosing box.</p>
1.18      cvs      5833: </blockquote>
                   5834: </div>
                   5835: 
                   5836: <div class="subsection">
1.30    ! cvs      5837: <h3><a name="sectc4233">Page layout</a></h3>
1.18      cvs      5838: 
1.30    ! cvs      5839: <p>The page models specified in the <tt>Page</tt> rule are defined by boxes
1.18      cvs      5840: declared in the <tt>BOXES</tt> section of the presentation schema.  Pages are
1.1       cvs      5841: not described as frames which will be filled by the document's text, but as
                   5842: element are inserted in the flow of the document and which mark the page
                   5843: breaks.  Each of these page break elements contains presentation boxes which
                   5844: represent the footer boxes of a page followed by header boxes of the next
                   5845: page.  The page box itself is the simple line which separates two pages on the
                   5846: screen.  Both the footer and header boxes placed themselves with respect to
                   5847: this page box, with the footer being placed above it and the header boxes
1.18      cvs      5848: being placed above it.</p>
1.30    ! cvs      5849: 
        !          5850: <p>The boxes created by a page box are headers and footers and can only place
1.1       cvs      5851: themselves vertically with respect to the page box itself (which is in fact
                   5852: the separation between two pages).  Besides, it is their vertical position
                   5853: rule  which determines whether they are header or footer boxes.  Header and
                   5854: footer boxes must have an explicit vertical position rule (they must not use
1.18      cvs      5855: the default rule).</p>
1.30    ! cvs      5856: 
        !          5857: <p>Footer boxes must have an absolute height or inherit the height of their
1.18      cvs      5858: contents:</p>
                   5859: <pre>Height : Enclosed . Height;</pre>
1.30    ! cvs      5860: 
        !          5861: <p>A page box must have height and width rules and these two rules must be
1.1       cvs      5862: specified with constant values, expressed in centimeters, inches, or
                   5863: typographer's points.  These two rules are interpreted in a special way for
                   5864: page boxes:  they determine the width of the page and the vertical distance
                   5865: between two page separators, which is the height of the page and its header
1.18      cvs      5866: and footer together.</p>
1.30    ! cvs      5867: 
        !          5868: <p>A page box should also have vertical and horizontal position rules and
        !          5869: these two rules should specify the position on the sheet of paper of the
        !          5870: rectangle enclosing the page's contents.  These two rules must position the
        !          5871: upper left corner of the enclosing rectangle in relation to the upper left
        !          5872: corner of the sheet of paper, considered to be the enclosing element.  In both
        !          5873: rules, distances must be expressed in fixed units: centimeters (<tt>cm</tt>),
        !          5874: inches (<tt>in</tt>), or typographer's points (<tt>pt</tt>).  Thus, rules
        !          5875: similar to the following should be found in the rules for a page box:</p>
1.18      cvs      5876: <pre>BOXES
1.1       cvs      5877:    ThePage :
                   5878:       BEGIN
                   5879:       VertPos : Top = Enclosing . Top + 3 cm;
                   5880:       HorizPos : Left = Enclosing . Left + 2.5 cm;
                   5881:       Width : 16 cm;
                   5882:       Height : 22.5 cm;
1.18      cvs      5883:       END;</pre>
1.30    ! cvs      5884: 
        !          5885: <p>When a document must be page broken, the page models to be constructed are
1.18      cvs      5886: defined in the <tt>BOXES</tt> section of the presentation schema by declaring
                   5887: page boxes and header and footer boxes.  Also, the <tt>Page</tt> rule is used
1.1       cvs      5888: to specify to which parts of the document and to which views each model should
1.18      cvs      5889: be applied.</p>
1.30    ! cvs      5890: 
        !          5891: <p>The <tt>Page</tt> rule has only one parameter, given between parentheses
        !          5892: after the <tt>Page</tt> keyword.  This parameter is the name of the box which
        !          5893: must serve as the model for page construction.  When a <tt>Page</tt> rule is
1.1       cvs      5894: attached to an element type, each time such an element appears in a document,
                   5895: a page break takes place and the page model indicated in the rule is applied
                   5896: to all following pages, until reaching the next element which has a
1.18      cvs      5897: <tt>Page</tt> rule.</p>
1.30    ! cvs      5898: 
        !          5899: <p>The <tt>Page</tt> rule applies to only one view; if it appears in the
        !          5900: primary view's block of rules, a <tt>Page</tt> rule applies only to that view.
        !          5901: Thus, different page models can be defined for the full document and for its
        !          5902: table of contents, which is another view of the same document. Some views can
        !          5903: be specified with pages, and other views of the same document can be specified
1.18      cvs      5904: without pages.</p>
                   5905: <pre>                   'Page' '(' BoxID ')'</pre>
                   5906: </div>
                   5907: 
                   5908: <div class="subsection">
1.30    ! cvs      5909: <h3><a name="sectc4234">Box copies</a></h3>
1.18      cvs      5910: 
1.30    ! cvs      5911: <p>The <tt>Copy</tt> rule can be used for an element which is defined as a
1.7       cvs      5912: reference in the structure schema.  In this case, the rule specifies, between
1.18      cvs      5913: parenthesis, the name of the box (declared in the <tt>BOXES</tt> section)
1.1       cvs      5914: which must be produced when this reference appears in the structure of a
                   5915: document.  The box produced is a copy (same contents, but possible different
                   5916: presentation) of the box type indicated by the parameter between parentheses,
                   5917: and which is in the element designated by the reference.  The name of a box
                   5918: can be replaced by type name. Then what is copied is the contents of the
1.18      cvs      5919: element of this type which is inside the referenced element.</p>
1.30    ! cvs      5920: 
        !          5921: <p>Whether a box name or type name is given, it may be followed by the name of
        !          5922: a structure schema between parentheses.  This signifies that the box or type
        !          5923: is defined in the indicated structure schema and not in the structure schema
        !          5924: with which the rule's presentation schema is associated.</p>
        !          5925: 
        !          5926: <p>The <tt>Copy</tt> rule can also be applied to a presentation box.  If the
1.1       cvs      5927: presentation box was created by a reference attribute, the rule is applied as
                   5928: in the case of a reference element: the contents of the box having the
1.18      cvs      5929: <tt>Copy</tt> rule are based on the element designated by the reference
                   5930: attribute.  For other presentation boxes, the <tt>Copy</tt> rule takes a type
1.1       cvs      5931: name parameter which can be followed, between parentheses, by the name of the
                   5932: structure schema in which the type is defined, if it is not defined in the
                   5933: same schema.  The contents of the box which has this rule are a copy of the
                   5934: element of this type which is in the element creating the presentation box, or
                   5935: by default, the box of this type which precedes the presentation box.  This
                   5936: last facility is used, for example, to define the running titles in headers or
1.18      cvs      5937: footers.</p>
                   5938: <pre>                  'Copy' '(' BoxTypeToCopy ')' .
1.1       cvs      5939:   BoxTypeToCopy = BoxID [ ExtStruct ] /
1.6       cvs      5940:                   ElemID [ ExtStruct ] .
1.18      cvs      5941:   ExtStruct     = '(' ElemID ')' .</pre>
1.30    ! cvs      5942: 
        !          5943: <p>Like the creation rules, the <tt>Copy</tt> rule cannot appear in the <a
1.18      cvs      5944: href="#sectc427">default presentation rules</a>.  Moreover, this rule can only
                   5945: appear in the primary view's block of rules; the copy rule is applied to all
                   5946: views.</p>
1.30    ! cvs      5947: 
1.18      cvs      5948: <blockquote class="example">
1.30    ! cvs      5949:   <p><strong>Example:</strong></p>
        !          5950: 
        !          5951:   <p>If the following definitions are in the structure schema:</p>
        !          5952:   <pre>Body = LIST OF (Chapter =
1.1       cvs      5953:                      BEGIN
                   5954:                      ChapterTitle = Text;
                   5955:                      ChapterBody = SectionSeq;
                   5956:                      END);
1.18      cvs      5957: RefChapter = REFERENCE (Chapter);</pre>
1.30    ! cvs      5958: 
        !          5959:   <p>then the following presentation rules (among many other rules in the
        !          5960:   presentation schema) can be specified:</p>
        !          5961:   <pre>COUNTERS
1.1       cvs      5962:    ChapterCtr : RANK OF Chapter;
                   5963: BOXES
                   5964:    ChapterNumber :
                   5965:       BEGIN
                   5966:       Content : (VALUE (ChapterCtr, URoman));
                   5967:       ...
                   5968:       END;
                   5969: RULES
                   5970:    Chapter :
                   5971:       BEGIN
                   5972:       CreateFirst (ChapterNumber);
                   5973:       ...
                   5974:       END;
                   5975:    RefChapter :
                   5976:       BEGIN
                   5977:       Copy (ChapterNumber);
                   5978:       ...
1.18      cvs      5979:       END;</pre>
1.30    ! cvs      5980: 
        !          5981:   <p>which makes the number of the chapter designated by the reference appear
        !          5982:   in uppercase roman numerals, in place of the reference to a chapter itself.
        !          5983:   Alternatively, the chapter title can be made to appear in place of the
        !          5984:   reference by writing this <tt>Copy</tt>rule:</p>
        !          5985:   <pre>      Copy (ChapterTitle);</pre>
        !          5986: 
        !          5987:   <p>To define a header box, named <tt>RunningTitle</tt>, which contains the
        !          5988:   title of the current chapter, the box's contents are defined in this
        !          5989:   way:</p>
        !          5990:   <pre>BOXES
1.1       cvs      5991:    RunningTitle :
1.18      cvs      5992:       Copy (ChapterTitle);</pre>
                   5993: </blockquote>
                   5994: </div>
                   5995: </div>
                   5996: <hr>
                   5997: </div>
1.1       cvs      5998: 
1.18      cvs      5999: <div class="chapter">
                   6000: <h1><a name="sect5">The T language</a></h1>
1.1       cvs      6001: 
1.18      cvs      6002: <div class="section">
1.30    ! cvs      6003: <h2><a name="sectb51">Document translation</a></h2>
1.1       cvs      6004: 
1.30    ! cvs      6005: <p>Because of its document model, Thot can produce documents in a high-level
1.18      cvs      6006: abstract form.  This form, called the <em>canonical form</em> is specific to
1.1       cvs      6007: Thot; it is well suited to the editor's manipulations, but it does not
                   6008: necessarily suit other operations which might be applied to documents. Because
                   6009: of this, the Thot editor offers the choice of saving documents in its own form
                   6010: (the canonical form) or a format defined by the user.  In the latter case, the
                   6011: Thot document is transformed by the translation program.  This facility can
                   6012: also be used to export documents from Thot to systems using other
1.18      cvs      6013: formalisms.</p>
1.1       cvs      6014: 
1.18      cvs      6015: <div class="subsection">
1.30    ! cvs      6016: <h3><a name="sectc511">Translation principles</a></h3>
1.1       cvs      6017: 
1.30    ! cvs      6018: <p>Document translation allows the export of documents to other systems which
        !          6019: do not accept Thot's canonical form.  Translation can be used to export
        !          6020: document to source-based formatters like T<sub><big>E</big></sub>X,
1.18      cvs      6021: L<sup>A</sup>T<sub><big>E</big></sub>X, and <tt>troff</tt>.  It can also be
1.1       cvs      6022: used to translate documents into interchange formats like SGML or HTML.  To
                   6023: allow the widest range of possible exports, Thot does not limit the choice of
                   6024: translations, but rather allows the user to define the formalisms into which
1.18      cvs      6025: documents can be translated.</p>
1.30    ! cvs      6026: 
        !          6027: <p>For each document or object class, a set of translation rules can be
        !          6028: defined, specifying how the canonical form should be transformed into a given
1.18      cvs      6029: formalism.  These translation rules are grouped into <em>translation
                   6030: schemas</em>, each schema containing the rules necessary to translate a
1.1       cvs      6031: generic logical structure (document or object structure) into a particular
                   6032: formalism.  The same generic logical structure can have several different
                   6033: translation schemas, each defining translation rules for a different
1.18      cvs      6034: formalism.</p>
1.30    ! cvs      6035: 
        !          6036: <p>Like presentation schemas, translation schemas are generic.  Thus, they
        !          6037: apply to an entire object or document class and permit translation of all
        !          6038: documents or objects of that class.</p>
1.18      cvs      6039: </div>
1.1       cvs      6040: 
1.18      cvs      6041: <div class="subsection">
1.30    ! cvs      6042: <h3><a name="sectc512">Translation procedure</a></h3>
1.1       cvs      6043: 
1.30    ! cvs      6044: <p>The translator works on the specific logical structure of the document
        !          6045: being translated.  It traverses the primary tree of this logical structure in
1.1       cvs      6046: pre-order and, at each node encountered, it applies the corresponding
                   6047: translation rules defined in the translation schema. Translation can be
1.18      cvs      6048: associated:</p>
                   6049: <ul>
1.30    ! cvs      6050:   <li>with element types defined in the structure schema,</li>
        !          6051:   <li>with global or local attributes defined in the structure schema,</li>
        !          6052:   <li>with specific presentation rules,</li>
        !          6053:   <li>with the content of the leaves of  the structure (characters, symbols
        !          6054:     and graphical elements)</li>
1.18      cvs      6055: </ul>
1.30    ! cvs      6056: 
        !          6057: <p>Thus, for each node, the translator applies all rules associated with the
1.1       cvs      6058: element type, all rules associated with each attribute (local or global)
                   6059: carried by the element, and if the element is a leaf of the tree, it also
1.10      cvs      6060: applies translation rules for characters, symbols, or graphical elements,
1.18      cvs      6061: depending on the type of the leaf.</p>
1.30    ! cvs      6062: 
        !          6063: <p>Rules associated with the content of leaves are different from all other
1.1       cvs      6064: rules: they specify only how to translate character strings, symbols, and
                   6065: graphical elements.  All other rules, whether associated with element types,
                   6066: with specific presentation rules or with attributes, are treated similarly.
1.18      cvs      6067: These rules primarily allow:</p>
                   6068: <ul>
1.30    ! cvs      6069:   <li>generation of a text constant or variable before or after the contents
        !          6070:     of an element,</li>
        !          6071:   <li>modification of the order in which elements appear after
        !          6072:   translation,</li>
        !          6073:   <li>removal of an element in the translated document,</li>
        !          6074:   <li>and writing messages on the user's terminal during translation.</li>
1.18      cvs      6075: </ul>
                   6076: </div>
                   6077: </div>
1.1       cvs      6078: 
1.18      cvs      6079: <div class="section">
1.30    ! cvs      6080: <h2><a name="sectb52">Translation definition language</a></h2>
1.1       cvs      6081: 
1.30    ! cvs      6082: <p>Translation schemas are written in a custom language, called T, which is
1.1       cvs      6083: described in the rest of this chapter.  The grammar of T is specified using
1.18      cvs      6084: the same <a href="#sectc321">meta-language</a> as was used for the S and P
1.1       cvs      6085: languages and the translation schemas are written using the same conventions
                   6086: as the structure and presentation schemas.  In particular, the keywords of the
                   6087: T language (the stings between apostrophes in the following syntax rules) can
                   6088: be written in any combination of upper-case and lower-case letters, but
                   6089: identifiers created by the programmer must always be written in the same
1.18      cvs      6090: way.</p>
1.1       cvs      6091: 
1.18      cvs      6092: <div class="subsection">
1.30    ! cvs      6093: <h3><a name="sectc521">Organization of a translation schema</a></h3>
1.1       cvs      6094: 
1.30    ! cvs      6095: <p>A translation schema is begun by the <tt>TRANSLATION</tt> keyword and is
1.18      cvs      6096: terminated by the <tt>END</tt> keyword.  The <tt>TRANSLATION</tt> keyword is
1.1       cvs      6097: followed by the name of the generic structure for which a translation is being
                   6098: defined and a semicolon.  This name must be identical to the name which
1.18      cvs      6099: appears after the <tt>STRUCTURE</tt> keyword in the corresponding structure
                   6100: schema.</p>
1.30    ! cvs      6101: 
        !          6102: <p>After this declaration of the structure, the following material appears in
1.18      cvs      6103: order:</p>
                   6104: <ul>
1.30    ! cvs      6105:   <li>the length of lines produced by the translation,</li>
        !          6106:   <li>the character delimiting the end of the line,</li>
        !          6107:   <li>the character string which the translator will insert if it must
        !          6108:     line-break the translated text,</li>
        !          6109:   <li>declarations of
        !          6110:     <ul>
        !          6111:       <li>buffers,</li>
        !          6112:       <li>counters,</li>
        !          6113:       <li>constants,</li>
        !          6114:       <li>variables,</li>
        !          6115:     </ul>
        !          6116:   </li>
        !          6117:   <li>translation rules associated with element types,</li>
        !          6118:   <li>translation rules associated with attributes,</li>
        !          6119:   <li>translation rules associated with specific presentation rules,</li>
        !          6120:   <li>translation rules associated with characters strings, symbols and
        !          6121:     graphical elements.</li>
1.18      cvs      6122: </ul>
1.30    ! cvs      6123: 
        !          6124: <p>Each of these sections is introduced by a keyword followed by a sequence of
1.1       cvs      6125: declarations.  All of these sections are optional, expect for the translation
1.18      cvs      6126: rules associated with element types. Many <tt>TEXTTRANSLATE</tt> sections can
1.1       cvs      6127: appear, each defining the rules for translating character strings of a
1.18      cvs      6128: particular alphabet.</p>
                   6129: <pre>     TransSchema ='TRANSLATION' ElemID ';'
1.1       cvs      6130:                 [ 'LINELENGTH' LineLength ';' ]
                   6131:                 [ 'LINEEND' CHARACTER ';' ]
                   6132:                 [ 'LINEENDINSERT' STRING ';' ]
                   6133:                 [ 'BUFFERS' BufferSeq ]
                   6134:                 [ 'COUNTERS' CounterSeq ]
                   6135:                 [ 'CONST' ConstSeq ]
                   6136:                 [ 'VAR' VariableSeq ]
                   6137:                   'RULES' ElemSeq
                   6138:                 [ 'ATTRIBUTES' AttrSeq ]
                   6139:                 [ 'PRESENTATION' PresSeq ]
1.30    ! cvs      6140:                 &lt; 'TEXTTRANSLATE' TextTransSeq &gt;
1.1       cvs      6141:                 [ 'SYMBTRANSLATE' TransSeq ]
                   6142:                 [ 'GRAPHTRANSLATE' TransSeq ]
1.18      cvs      6143:                   'END' .</pre>
                   6144: </div>
1.1       cvs      6145: 
1.18      cvs      6146: <div class="subsection">
1.30    ! cvs      6147: <h3><a name="sectc522">Line length</a></h3>
1.1       cvs      6148: 
1.30    ! cvs      6149: <p>If a <tt>LINELENGTH</tt> instruction is present after the structure
1.1       cvs      6150: declaration, the translator divides the text it produces into lines, each line
                   6151: having a length less than or equal to the integer which follows the
1.18      cvs      6152: <tt>LINELENGTH</tt> keyword.  This maximum line length is expressed as a
1.1       cvs      6153: number of characters.  The end of the line is marked by the character defined
1.18      cvs      6154: by the <tt>LINEEND</tt> instruction.  When the translator breaks the lines on
1.1       cvs      6155: a space character in generated text, this space will be replaced by the
1.18      cvs      6156: character string defined by the <tt>LINEENDINSERT</tt> instruction.</p>
1.30    ! cvs      6157: 
        !          6158: <p>If the <tt>LINEEND</tt> instruction is not defined then the linefeed
        !          6159: character (octal code 12) is used as the default line end character. If the
1.18      cvs      6160: <tt>LINEENDINSERT</tt> instruction is not defined, the linefeed character is
                   6161: inserted at the end of the produced lines.  If there is no <tt>LINELENGTH</tt>
1.1       cvs      6162: instruction, the translated text is not divided into lines.  Otherwise, if the
                   6163: translation rules generate line end marks, these marks remain in the
                   6164: translated text, but the length of the lines is not controlled by the
1.18      cvs      6165: translator.</p>
                   6166: <pre>     LineLength = NUMBER .</pre>
1.30    ! cvs      6167: 
1.18      cvs      6168: <blockquote class="example">
1.30    ! cvs      6169:   <p><strong>Example:</strong></p>
        !          6170: 
        !          6171:   <p>To limit the lines produced by the translator to a length of 80
        !          6172:   characters, the following rule is written at the beginning of the
        !          6173:   translation schema.</p>
        !          6174:   <pre>LineLength 80;</pre>
1.18      cvs      6175: </blockquote>
                   6176: </div>
1.1       cvs      6177: 
1.18      cvs      6178: <div class="subsection">
1.30    ! cvs      6179: <h3><a name="sectc523">Buffers</a></h3>
1.1       cvs      6180: 
1.30    ! cvs      6181: <p>A buffer is a  unit of memory managed by the translator, which can either
1.18      cvs      6182: contain text read from the terminal during the translation (see the <a
                   6183: href="#sectc5212"><tt>Read</tt> rule</a>), or the name of the last picture
1.1       cvs      6184: (bit-map) encountered by the translator in its traversal of the document.
1.2       cvs      6185: Remember the pictures are stored in files that are separate for the document
1.1       cvs      6186: files and that the canonical form contains only the names of the files in
1.18      cvs      6187: which the pictures are found.</p>
1.30    ! cvs      6188: 
        !          6189: <p>Thus, there are two types of buffers:  buffers for reading from the
        !          6190: terminal (filled by the <tt>Read</tt> rule) and the buffer of picture names
        !          6191: (containing the name of the last picture encountered).  A translation schema
        !          6192: can use either type, one or several read buffers and one (and only one)
        !          6193: picture name buffer.</p>
        !          6194: 
        !          6195: <p>If any buffers are used, the <tt>BUFFERS</tt> keyword must be present,
1.1       cvs      6196: followed by declarations of every buffer used in the translation schema.  Each
                   6197: buffer declaration  is composed only of the name of the buffer, chosen freely
1.2       cvs      6198: by the programmer.  The picture name buffer is identified by the
1.18      cvs      6199: <tt>Picture</tt> keyword, between parentheses, following the buffer name.  The
                   6200: <tt>Picture</tt> keyword may only appear once.  Each buffer declaration is
                   6201: terminated by a semicolon.</p>
1.30    ! cvs      6202: <pre>     BufferSeq = Buffer &lt; Buffer &gt; .
1.1       cvs      6203:      Buffer    = BufferID [ '(' 'Picture' ')' ] ';' .
1.18      cvs      6204:      BufferID  = NAME .</pre>
1.30    ! cvs      6205: 
1.18      cvs      6206: <blockquote class="example">
1.30    ! cvs      6207:   <p><strong>Example:</strong></p>
        !          6208: 
        !          6209:   <p>The following buffer declarations create a picture name buffer named
        !          6210:   <tt>pictureName</tt> and a read buffer named <a
        !          6211:   name="destname"><tt>DestName</tt></a>:</p>
        !          6212:   <pre>BUFFERS
1.18      cvs      6213:      pictureName (Picture); DestName;</pre>
                   6214: </blockquote>
                   6215: </div>
1.1       cvs      6216: 
1.18      cvs      6217: <div class="subsection">
1.30    ! cvs      6218: <h3><a name="sectc524">Counters</a></h3>
        !          6219: 
        !          6220: <p>Certain translation rules generate text that varies according to the
        !          6221: context of the element to which the rules apply.  Variable text is defined
        !          6222: either in the <a href="#sectc526"><tt>VAR</tt> section</a> of the translation
        !          6223: schema or in the rule itself (see the <tt>Create</tt> and <tt>Write</tt>
        !          6224: rules).  Both types of definition rely on counters for the calculation of
        !          6225: variable material.</p>
        !          6226: 
        !          6227: <p>There are two types of counter: counters whose value is explicitely
        !          6228: computed by applying <a href="#sectc5221"><tt>Set</tt> and <tt>Add</tt>
        !          6229: rules</a>, and counters whose value is computed by a function associated with
        !          6230: the counter. Those functions allow the same calculations as can be used in
        !          6231: presentation schemas. As in a presentation schema, counters must be defined in
        !          6232: the <tt>COUNTERS</tt> section of the translation schema before they are
        !          6233: used.</p>
        !          6234: 
        !          6235: <p>When counters are used in a translation schema, the <tt>COUNTERS</tt>
        !          6236: keyword is followed by the declarations of every counter used.  Each
        !          6237: declaration is composed of the counter's name possibly followed by a colon and
        !          6238: the counting function to be used for the counter.  The declaration is
        !          6239: terminated by a semi-colon. If the counter is explicitely computed by
        !          6240: <tt>Set</tt> and <tt>Add</tt> rules, no counting function is indicated. If a
        !          6241: counting function is indicated, <tt>Set</tt> and <tt>Add</tt> rules cannot be
        !          6242: applied to that counter.</p>
1.1       cvs      6243: 
1.30    ! cvs      6244: <p>The counting function indicates how the counter's value will be computed.
1.18      cvs      6245: Three functions are available: <tt>Rank</tt>, <tt>Rlevel</tt>, and
                   6246: <tt>Set</tt>.</p>
                   6247: <ul>
1.30    ! cvs      6248:   <li><tt>Rank of ElemID</tt> indicates that the counter's value is the rank
        !          6249:     of the element of type <tt>ElemID</tt> which encloses the element for
        !          6250:     which the counter is being evaluated.  For the purposes of this function,
        !          6251:     an element of type <tt>ElemID</tt> is considered to enclose itself.  This
        !          6252:     function is primarily used  when the element of type <tt>ElemID</tt> is
        !          6253:     part of an aggregate or list, in which case the counter's value is the
        !          6254:     element's rank in its list or aggregate.  Note that, unlike the
        !          6255:     <tt>Rank</tt> function for presentation schemas, the <tt>Page</tt> keyword
        !          6256:     cannot be used in place of the <tt>ElemID</tt>.
        !          6257:     <p>The type name <tt>ElemID</tt> can be followed by an integer.  That
        !          6258:     number represents the relative level, among the ancestors of the concerned
        !          6259:     element, of the element whose rank is asked.  If that relative level
        !          6260:     <i>n</i> is unsigned, the <i>n<sup>th</sup></i> element of type
        !          6261:     <tt>ElemID</tt> encountered when travelling the logical structure from the
        !          6262:     root to the concerned element is taken into account.  If the relative
        !          6263:     level is negative, the logical structure is travelled in the other
        !          6264:     direction, from the concerned element to the root.</p>
        !          6265:   </li>
        !          6266:   <li><tt>Rlevel of ElemID</tt> indicates that the counter's values is the
        !          6267:     relative level in the tree of the element for which the counter is being
        !          6268:     evaluated. The counter counts the number of elements of type
        !          6269:     <tt>ElemID</tt> which are found on the path between the root of the
        !          6270:     document's logical structure tree and the element (inclusive).</li>
        !          6271:   <li><tt>Set n on Type1 Add m on Type2</tt> indicates that the counter's
        !          6272:     value is calculated as follows:  in traversing the document from the
        !          6273:     beginning to the element for which the counter is being evaluated, the
        !          6274:     counter is set to the value <tt>n</tt> each time a <tt>Type1</tt> element
        !          6275:     is encountered and is incremented by the amount <tt>m</tt> each time a
        !          6276:     <tt>Type2</tt> element is encountered.  The initial value <tt>n</tt> and
        !          6277:     the increment <tt>m</tt> are integers.</li>
        !          6278: </ul>
        !          6279: 
        !          6280: <p>As in a presentation schema, the <tt>Rank</tt> and <tt>Set</tt> functions
        !          6281: can be modified by a numeric attribute which changes their initial value. This
        !          6282: is indicated by the <tt>Init</tt> keyword followed by the numeric attribute's
1.18      cvs      6283: name.  The <tt>Set</tt> function takes the value of the attribute instead of
                   6284: the <tt>InitValue</tt> (<tt>n</tt>).  For the <tt>Rank</tt> function, the
1.1       cvs      6285: value of the attribute is considered to be the rank of the first element of
                   6286: the list (rather than the normal value of 1). Subsequent items in the list
                   6287: have their ranks shifted accordingly.  In both cases, the attribute must be
1.18      cvs      6288: numeric and must be a local attribute of the root of the document itself.</p>
1.30    ! cvs      6289: <pre>     CounterSeq  = Counter &lt; Counter &gt; .
1.1       cvs      6290:      Counter     = CounterID [ ':' CounterFunc ] ';' .
                   6291:      CounterID   = NAME .
                   6292:      CounterFunc = 'Rank' 'of' ElemID [ SLevelAsc ]
                   6293:                    [ 'Init' AttrID ] /
                   6294:                    'Rlevel' 'of' ElemID /
                   6295:                    'Set' InitValue 'On' ElemID
                   6296:                          'Add' Increment 'On' ElemID
                   6297:                          [ 'Init' AttrID ] .
                   6298:      SLevelAsc   = [ '-' ] LevelAsc .
                   6299:      LevelAsc    =  NUMBER .
                   6300:      InitValue   = NUMBER .
                   6301:      Increment   = NUMBER .
                   6302:      ElemID      = NAME .
1.18      cvs      6303:      AttrID      = NAME .</pre>
1.30    ! cvs      6304: 
1.18      cvs      6305: <blockquote class="example">
1.30    ! cvs      6306:   <p><strong>Example:</strong></p>
        !          6307: 
        !          6308:   <p>If the body of a chapter is defined in the structure schema by:</p>
        !          6309:   <pre>Chapter_Body = LIST OF
1.1       cvs      6310:          (Section = BEGIN
                   6311:                     Section_Title = Text;
                   6312:                     Section_Body  = BEGIN
                   6313:                                     Paragraphs;
                   6314:                                     Section;
                   6315:                                     END;
                   6316:                     END
1.18      cvs      6317:          );</pre>
1.30    ! cvs      6318: 
        !          6319:   <p>(sections are defined recursively), a counter can be defined giving the
        !          6320:   <a name="sectnum">number of a section</a> within its level in the
        !          6321:   hierarchy:</p>
        !          6322:   <pre>COUNTERS
1.18      cvs      6323:    SectionNumber : Rank of Section;</pre>
1.30    ! cvs      6324: 
        !          6325:   <p>A counter holding the hierarchic level of a section:</p>
        !          6326:   <pre>   SectionLevel : Rlevel of Section;</pre>
        !          6327: 
        !          6328:   <p>A <a name="uniquenum">counter</a> which sequentially numbers all the
        !          6329:   document's sections, whatever their hierarchic level:</p>
        !          6330:   <pre>   UniqueSectNum : Set 0 on Document Add 1 on Section;</pre>
1.18      cvs      6331: </blockquote>
                   6332: </div>
1.1       cvs      6333: 
1.18      cvs      6334: <div class="subsection">
1.30    ! cvs      6335: <h3><a name="sectc525">Constants</a></h3>
1.1       cvs      6336: 
1.30    ! cvs      6337: <p>A common feature of translation rules is the generation of constant text.
        !          6338: This text can be defined in the rule that generates it (see for example the <a
1.18      cvs      6339: href="#sectc5210"><tt>Create</tt></a> and <a
                   6340: href="#sectc5211"><tt>Write</tt></a> rules); but it can also be defined once
                   6341: in the constant declaration section and used many times in different rules.
                   6342: The latter option is preferable when the same text is used in several rules or
                   6343: several <a href="#sectc526">variables</a>.</p>
1.30    ! cvs      6344: 
        !          6345: <p>The <tt>CONST</tt> keyword begins the constant declaration section of the
1.1       cvs      6346: translation schema.  It must be omitted if no constants are declared. Each
                   6347: constant declaration is composed of the constant name, an equals sign, and the
                   6348: constant's value, which is a character string between apostrophes.  A constant
1.18      cvs      6349: declaration is terminated by a semicolon.</p>
1.30    ! cvs      6350: <pre>     ConstSeq   = Const &lt; Const &gt; .
1.1       cvs      6351:      Const      = ConstID '=' ConstValue ';' .
                   6352:      ConstID    = NAME .
1.18      cvs      6353:      ConstValue = STRING .</pre>
1.30    ! cvs      6354: 
1.18      cvs      6355: <blockquote class="example">
1.30    ! cvs      6356:   <p><strong><a name="levelexample">Example:</a></strong></p>
        !          6357: 
        !          6358:   <p>The following rule assigns the name <tt>TxtLevel</tt> to the character
        !          6359:   string ``Level'':</p>
        !          6360:   <pre>CONST
1.18      cvs      6361:      TxtLevel = 'Level';</pre>
                   6362: </blockquote>
                   6363: </div>
1.1       cvs      6364: 
1.18      cvs      6365: <div class="subsection">
1.30    ! cvs      6366: <h3><a name="sectc526">Variables</a></h3>
1.1       cvs      6367: 
1.30    ! cvs      6368: <p>Variables allow to define variable text which is generated by the
1.18      cvs      6369: <tt>Create</tt> and <tt>Write</tt> rules.  They are also used to define file
                   6370: names which are used in the <tt>Create</tt>, <tt>ChangeMainFile</tt>,
                   6371: <tt>RemoveFile</tt>, and <tt>Indent</tt> rules.  Variables can be defined
                   6372: either in the <tt>VAR</tt> section of the translation schema or directly in
                   6373: the rules which use them.  Variables that define file names must be declared
                   6374: in the <tt>VAR</tt> section, and when the same variable is used several times
                   6375: in the translation schema, it makes sense to define it globally in the
                   6376: <tt>VAR</tt> section.  This section is only present if at least one variable
                   6377: is defined globally.</p>
1.30    ! cvs      6378: 
        !          6379: <p>After the <tt>VAR</tt> keyword, each global variable is defined by its
        !          6380: name, a colon separator and a sequence of functions (at least one function).
        !          6381: Each variable definition is terminated by a semicolon. Functions determine the
1.1       cvs      6382: different parts which together give the value of the variable.  The value is
                   6383: obtained by concatenating the strings produced by each of the functions. Seven
                   6384: types of functions are available.  Each variable definition may use any number
1.18      cvs      6385: of functions of each type.</p>
                   6386: <ul>
1.30    ! cvs      6387:   <li>The function <tt>Value(Counter)</tt>returns a string representing the
        !          6388:     value taken by the counter when it is evaluated for the element in whose
        !          6389:     rule the variable is used.  The counter must have been declared in the
        !          6390:     <tt>COUNTERS</tt> section of the translation schema.  When the counter is
        !          6391:     expressed in arabic numerals, the counter name can be followed by a colon
        !          6392:     and an integer indicating a minimum length (number of characters) for the
        !          6393:     string; if the counter's value is normally expressed with fewer characters
        !          6394:     than the required minimum, zeroes are added to the front of the string to
        !          6395:     achieve the minimum length.
        !          6396:     <p>By default, the counter value is written in arabic digits. If another
        !          6397:     representation of that value is needed, the counter name must be followed
        !          6398:     by a comma and one of the following keywords:</p>
        !          6399:     <ul>
        !          6400:       <li><tt>Arabic</tt>: arabic numerals (default value),</li>
        !          6401:       <li><tt>LRoman</tt>: lower-case roman numerals,</li>
        !          6402:       <li><tt>URoman</tt>: upper-case roman numerals,</li>
        !          6403:       <li><tt>Uppercase</tt>: upper-case letter,</li>
        !          6404:       <li><tt>Lowercase</tt>: lower-case letter.</li>
        !          6405:     </ul>
        !          6406:   </li>
        !          6407:   <li>The function <tt>FileDir</tt>, without parameter, returns a string
        !          6408:     representing the name of the directory of the output file that has been
        !          6409:     given as a parameter to the translation program. The string includes a
        !          6410:     character '/' at the end.</li>
        !          6411:   <li>The function <tt>FileName</tt>, without parameter, returns a string
        !          6412:     representing the name of the output file that has been given as a
        !          6413:     parameter to the translation program. The file extension (the character
        !          6414:     string that terminate the file name, after a dot) is not part of that
        !          6415:     string.</li>
        !          6416:   <li>The function <tt>Extension</tt>, without parameter, returns a string
        !          6417:     representing the extension of the file name. That string is empty if the
        !          6418:     file name that has been given as a parameter to the translation program
        !          6419:     has no extension. If there is an extension, its first character is a
        !          6420:   dot.</li>
        !          6421:   <li>The function <tt>DocumentName</tt>, without parameter, returns a string
        !          6422:     representing the name of the document being translated.</li>
        !          6423:   <li>The function <tt>DocumentDir</tt>, without parameter, returns a string
        !          6424:     representing the directory containing the document being translated.</li>
        !          6425:   <li>The function formed by the name of a constant returns that constant's
        !          6426:     value.</li>
        !          6427:   <li>The function formed by a character string between apostrophes returns
        !          6428:     that string.</li>
        !          6429:   <li>The function formed by the name of a buffer returns the contents of that
        !          6430:     buffer.  If the named buffer is the picture buffer, then the name of the
        !          6431:     last picture encountered is returned.  Otherwise, the buffer is a read
        !          6432:     buffer and the value returned is text previously read from the terminal. 
        !          6433:     If the buffer is empty (no picture has been encountered or the
        !          6434:     <tt>Read</tt> rule has not been executed for the buffer), then the empty
        !          6435:     string is returned.</li>
        !          6436:   <li>The function formed by an attribute name takes the value of the
        !          6437:     indicated attribute for the element to which the variable applies.  If the
        !          6438:     element does not have that attribute, then the element's ancestor are
        !          6439:     searched toward the root of the tree.  If one of the ancestors does have
        !          6440:     the attribute then its value is used.  If no ancestors have the attribute,
        !          6441:     then the value of the function is the empty string.</li>
1.18      cvs      6442: </ul>
1.30    ! cvs      6443: <pre>     VariableSeq = Variable &lt; Variable &gt; .
        !          6444:      Variable    = VarID ':' Function &lt; Function &gt; ';' .
1.1       cvs      6445:      VarID       = NAME .
                   6446:      Function    ='Value' '(' CounterID [ ':' Length ]
                   6447:                             [ ',' CounterStyle ] ')' /
                   6448:                   'FileDir' / 'FileName' / 'Extension' /
                   6449:                   'DocumentName' / 'DocumentDir' /
                   6450:                    ConstID / CharString / 
                   6451:                    BufferID / AttrID .
                   6452:      Length      = NUMBER .
                   6453:      CounterStyle= 'Arabic' / 'LRoman' / 'URoman' /
                   6454:                    'Uppercase' / 'Lowercase' .
1.18      cvs      6455:      CharString  = STRING .</pre>
1.30    ! cvs      6456: 
1.18      cvs      6457: <blockquote class="example">
1.30    ! cvs      6458:   <p><strong>Example:</strong></p>
        !          6459: 
        !          6460:   <p>To create, at the beginning of each section of the translated document,
        !          6461:   text composed of the string ``Section'' followed by the section number, the
        !          6462:   following <a name="varsectexample">variable definition</a> might be
        !          6463:   used:</p>
        !          6464:   <pre>VAR
1.18      cvs      6465:      SectionVar : 'Section' Value(SectionNumber);</pre>
1.30    ! cvs      6466: 
        !          6467:   <p>(see the definition of <a
        !          6468:   href="#sectnum"><tt>SectionNumber</tt></a>).</p>
        !          6469: 
        !          6470:   <p>The following variable definition can be used to create, at the beginning
        !          6471:   of each section, the text ``Level'' followed by the hierarchical level of
        !          6472:   the section. It used the constant defined above.</p>
        !          6473:   <pre>     LevelVar : TxtLevel Value(SectionLevel);</pre>
        !          6474: 
        !          6475:   <p>(see the definitions of <a href="#sectnum"><tt>SectionLevel</tt></a> and
        !          6476:   of <a href="#levelexample"><tt>TxtLevel</tt></a>).</p>
        !          6477: 
        !          6478:   <p>To generate the translation of each section in a different file (see <a
        !          6479:   href="#sectc5220">rule <tt>ChangeMainFile</tt></a>), the name of these files
        !          6480:   might be defined by the following variable:</p>
        !          6481:   <pre>     VarOutpuFile : FileName Value(SectionNumber)
1.18      cvs      6482:                     Extension;</pre>
1.30    ! cvs      6483: 
        !          6484:   <p>If <tt>output.txt</tt> is the name of the <a name="varoutputfile">output
        !          6485:   file</a> specified when starting the translation program, translated
        !          6486:   sections are written in files <tt>output1.txt</tt>, <tt>output2.txt</tt>,
        !          6487:   etc.</p>
1.18      cvs      6488: </blockquote>
                   6489: </div>
                   6490: 
                   6491: <div class="subsection">
1.30    ! cvs      6492: <h3><a name="sectc527">Translating structure elements</a></h3>
1.18      cvs      6493: 
1.30    ! cvs      6494: <p>The <tt>RULES</tt> keyword introduces the translation rules which will be
1.1       cvs      6495: applied to the various structured element types.  Translation rules can be
                   6496: specified for each element type defined in the structure schema, including the
1.18      cvs      6497: base types defined implicitly, whose names are <tt>TEXT_UNIT</tt>,
                   6498: <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>, <tt>GRAPHIC_UNIT</tt> and
                   6499: <tt>PAGE_UNIT</tt>.  But it is not necessary to specify rules for every
                   6500: defined type.</p>
1.30    ! cvs      6501: 
        !          6502: <p>If there are no translation rules for an element type, the elements that it
1.1       cvs      6503: contains (and which may have rules themselves) will still be translated, but
                   6504: the translator will produce nothing for the element itself.  To make the
1.18      cvs      6505: translator completely ignore the content of an element the <a
                   6506: href="#sectc5217"><tt>Remove</tt> rule</a> must be used.</p>
1.30    ! cvs      6507: 
        !          6508: <p>The translation rules for an element type defined in the structure schema
        !          6509: are written using the name of the type followed by a colon and the list of
1.18      cvs      6510: applicable rules.  When the element  type is a <a href="#sectd3285">mark
                   6511: pair</a>, but only in this case, the type name must be preceded by the
                   6512: <tt>First</tt> or <tt>Second</tt> keyword.  This keyword indicates whether the
                   6513: rules that follow apply to the first or second mark of the pair.</p>
1.30    ! cvs      6514: 
        !          6515: <p>The list of rules can take several forms.  It may be a simple
        !          6516: non-conditional rule.  It can also be formed by a condition followed by one or
        !          6517: more simple rules.  Or it can be a block of rules beginning with the
        !          6518: <tt>BEGIN</tt> keyword and ending with the <tt>END</tt> keyword and a
        !          6519: semicolon.  This block of rules can contain one or more simple rules and/or
        !          6520: one or more conditions, each followed by one or more simple rules.</p>
        !          6521: <pre>     ElemSeq        = TransType &lt; TransType &gt; .
1.1       cvs      6522:      TransType      = [ FirstSec ] ElemID ':' RuleSeq .
                   6523:      FirstSec       = 'First' / 'Second' .
1.30    ! cvs      6524:      RuleSeq        = Rule / 'BEGIN' &lt; Rule &gt; 'END' ';' .
1.1       cvs      6525:      Rule           = SimpleRule / ConditionBlock .
                   6526:      ConditionBlock = 'IF' ConditionSeq SimpleRuleSeq .
1.30    ! cvs      6527:      SimpleRuleSeq  = 'BEGIN' &lt; SimpleRule &gt; 'END' ';' / 
1.18      cvs      6528:                       SimpleRule .</pre>
                   6529: </div>
1.1       cvs      6530: 
1.18      cvs      6531: <div class="subsection">
1.30    ! cvs      6532: <h3><a name="sectc528">Conditional rules</a></h3>
1.1       cvs      6533: 
1.30    ! cvs      6534: <p>In a translation schema, the translation rules are either associated with
1.1       cvs      6535: element types or with attribute values or with a specific presentation.  They
                   6536: are applied by the translator each time an element of the corresponding type
                   6537: is encountered in the translated document or each time the attribute value is
                   6538: carried by an element or also, each time the specific translation is attached
                   6539: to an element.  This systematic application of the rules can be relaxed: it is
                   6540: possible to add a condition to one or more rules, so that these rules are only
1.18      cvs      6541: applied when the condition is true.</p>
1.30    ! cvs      6542: 
        !          6543: <p>A condition begins with the keyword <tt>IF</tt>, followed by a sequence of
1.1       cvs      6544: elementary conditions.  Elementary conditions are separated from each other by
1.18      cvs      6545: the <tt>AND</tt> keyword.  If there is only one elementary condition, this
1.1       cvs      6546: keyword is absent.  The rules are only applied if all the elementary
                   6547: conditions are true.  The elementary condition can be negative; it is then
1.18      cvs      6548: preceded by the <tt>NOT</tt> keyword.</p>
1.30    ! cvs      6549: 
        !          6550: <p>When the translation rule(s) controlled by the condition apply to a
        !          6551: reference element or a reference attribute, an elementary condition can also
        !          6552: apply to element referred by this reference.  The <tt>Target</tt> keyword is
        !          6553: used for that purpose.  It must appear before the keyword defining the
        !          6554: condition type.</p>
        !          6555: 
        !          6556: <p>Depending on their type, some conditions may apply either to the element
        !          6557: with which they are associated, or to one of its ancestor.  In the case of an
1.18      cvs      6558: ancestor, the key word <tt>Ancestor</tt> must be used, followed by</p>
                   6559: <ul>
1.30    ! cvs      6560:   <li>either an integer which represents the number of levels in the tree
        !          6561:     between the element and the ancestor of interest,</li>
        !          6562:   <li>or the type name of the ancestor of interest.  If that type is defined
        !          6563:     in a separate structure schema, the name of that schema must follow
        !          6564:     between parentheses.</li>
1.18      cvs      6565: </ul>
1.30    ! cvs      6566: 
        !          6567: <p>There is a special case for the parent element, which can be simply written
1.18      cvs      6568: <tt>Parent</tt> instead of <tt>Ancestor 1</tt>.</p>
1.30    ! cvs      6569: 
        !          6570: <p>Only conditions <tt>First</tt>, <tt>Last</tt>, <tt>Referred</tt>,
1.18      cvs      6571: <tt>Within</tt>, <tt>Attributes</tt>, <tt>Presentation</tt>, <tt>Comment</tt>
1.1       cvs      6572: and those concerning an attribute or a specific presentation can apply to an
1.18      cvs      6573: ancestor. Conditions <tt>Defined</tt>, <tt>FirstRef</tt>, <tt>LastRef</tt>,
                   6574: <tt>ExternalRef</tt>, <tt>Alphabet</tt>, <tt>FirstAttr</tt>,
                   6575: <tt>LastAttr</tt>, <tt>ComputedPage</tt>, <tt>StartPage</tt>,
                   6576: <tt>UserPage</tt>, <tt>ReminderPage</tt>, <tt>Empty</tt> cannot be preceded by
                   6577: keywords <tt>Parent</tt> or <tt>Ancestor</tt>.</p>
1.30    ! cvs      6578: 
        !          6579: <p>In condition <tt>Referred</tt> and in the condition that applies to a named
1.18      cvs      6580: attribute, a symbol '<tt>*</tt>' can indicate that the condition is related
1.5       cvs      6581: only to the element itself. If this symbol is not present, not only the
1.18      cvs      6582: element is considered, but also its ancestor, at any level.</p>
1.30    ! cvs      6583: 
        !          6584: <p>The form of an elementary condition varies according to the type of
1.18      cvs      6585: condition.</p>
1.1       cvs      6586: 
1.18      cvs      6587: <div class="subsubsection">
                   6588: <h4><a name="sectd5281">Conditions based on the logical position of the
                   6589: element</a></h4>
1.30    ! cvs      6590: 
        !          6591: <p>The condition can be on the position of the element in the document's
        !          6592: logical structure tree.  It is possible to test whether the element is the
        !          6593: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is
        !          6594: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>).</p>
        !          6595: 
        !          6596: <p>It is also possible to test if the element is contained in an element of a
1.18      cvs      6597: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). If that
1.1       cvs      6598: element type is defined in a structure schema which is not the one which
                   6599: corresponds to the translation schema, the type name of this element must be
                   6600: followed, between parentheses, by the name of the structure schema which
1.18      cvs      6601: defines it.</p>
1.30    ! cvs      6602: 
        !          6603: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the
1.18      cvs      6604: condition is satisfied only if the <em>parent</em> element has the type
                   6605: indicated. If the word <tt>Immediately</tt> is missing, the condition is
                   6606: satisfied if any <em>ancestor</em> has the type indicated.</p>
1.30    ! cvs      6607: 
        !          6608: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the
1.1       cvs      6609: type.  It specifies the number of ancestors of the indicated type that must be
                   6610: present for the condition to be satisfied.  If the keyword
1.18      cvs      6611: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the
                   6612: element must have the indicated type.  The integer <i>n</i> must be positive
1.30    ! cvs      6613: or zero.  It can be preceded by <tt>&lt;</tt> or <tt>&gt;</tt> to indicate a
1.1       cvs      6614: maximum or minimum number of ancestors.  If these symbols are missing, the
1.18      cvs      6615: condition is satisfied only if it exists exactly <i>n</i> ancestors.  When
1.30    ! cvs      6616: this number is missing, it is equivalent to &gt; 0.</p>
        !          6617: 
        !          6618: <p>If the condition applies to translation rules associated with an attribute,
1.18      cvs      6619: i.e. if it is in the <tt>ATTRIBUTES</tt> section of the presentation schema,
1.11      cvs      6620: the condition can be simply an element name. Translation rules are then
1.18      cvs      6621: executed only if the attribute is attached to an element of that type. The
                   6622: keyword <tt>NOT</tt> before the element name indicates that the translation
                   6623: rules must be executed only if the element is not of the type indicated.</p>
                   6624: </div>
1.1       cvs      6625: 
1.18      cvs      6626: <div class="subsubsection">
1.30    ! cvs      6627: <h4><a name="sectd5282">Conditions on references</a></h4>
1.1       cvs      6628: 
1.30    ! cvs      6629: <p>References may be taken into account in conditions, which can be based on
        !          6630: the fact that the element, or one of its ancestors (unless symbol <tt>*</tt>
        !          6631: is present), is designated by a at least one reference (<tt>Referred</tt>) or
        !          6632: by none (<tt>NOT Referred</tt>).  If the element or attribute to which the
1.1       cvs      6633: condition is attached is a reference, the condition can be based on the fact
                   6634: that it acts as the first reference to the designated element
1.18      cvs      6635: (<tt>FirstRef</tt>), or as the last (<tt>LastRef</tt>), or as a reference to
                   6636: an element located in another document (<tt>ExternalRef</tt>).  Like all
                   6637: conditions, conditions on references can be inverted by the <tt>NOT</tt>
                   6638: keyword.</p>
                   6639: </div>
                   6640: 
                   6641: <div class="subsubsection">
1.30    ! cvs      6642: <h4><a name="sectd5283">Conditions on the parameters</a></h4>
1.18      cvs      6643: 
1.30    ! cvs      6644: <p>Elements which are <a href="#sectc326">parameters</a> can be given a
1.18      cvs      6645: particular condition which is based on whether or not the parameter is given a
                   6646: value in the document (<tt>Defined</tt> or <tt>NOT Defined</tt>,
                   6647: respectively).</p>
                   6648: </div>
1.1       cvs      6649: 
1.18      cvs      6650: <div class="subsubsection">
1.30    ! cvs      6651: <h4><a name="sectd5284">Conditions on the alphabets</a></h4>
1.1       cvs      6652: 
1.30    ! cvs      6653: <p>The character string base type (and only this type) can use the condition
1.18      cvs      6654: <tt>Alphabet = a</tt> which indicates that the translation rule(s) should only
1.1       cvs      6655: apply if the alphabet of the character string is the one whose name appears
1.18      cvs      6656: after the equals sign (or is not, if there is a preceding <tt>NOT</tt>
1.1       cvs      6657: keyword).  This condition cannot be applied to translation rules of an
1.18      cvs      6658: attribute.</p>
1.30    ! cvs      6659: 
        !          6660: <p>In the current implementation of Thot, the available alphabets are the
1.18      cvs      6661: <tt>Latin</tt> alphabet and the <tt>Greek</tt> alphabet.</p>
                   6662: </div>
1.1       cvs      6663: 
1.18      cvs      6664: <div class="subsubsection">
1.30    ! cvs      6665: <h4><a name="sectd5285">Conditions on page breaks</a></h4>
1.1       cvs      6666: 
1.30    ! cvs      6667: <p>The page break base type (and only this type) can use the following
1.18      cvs      6668: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, <tt>UserPage</tt>, and
                   6669: <tt>ReminderPage</tt>.  The <tt>ComputedPage</tt> condition indicates that the
1.1       cvs      6670: translation rule(s) should apply if the page break was created automatically
1.18      cvs      6671: by Thot;  the <tt>StartPage</tt> condition is true if the page break is
                   6672: generated before the element by the <tt>Page</tt> rule of the P language; the
                   6673: <tt>UserPage</tt> condition applies if the page break was inserted by the
                   6674: user; and the <tt>ReminderPage</tt> is applied if the page break is a reminder
                   6675: of page breaking.</p>
                   6676: </div>
1.1       cvs      6677: 
1.18      cvs      6678: <div class="subsubsection">
1.30    ! cvs      6679: <h4><a name="sectd5286">Conditions on the element's content</a></h4>
1.1       cvs      6680: 
1.30    ! cvs      6681: <p>The condition can be based on whether or not the element is empty.  An
        !          6682: element which has no children or whose leaves are all empty is considered to
        !          6683: be empty itself.  This condition is expressed by the <tt>Empty</tt> keyword,
        !          6684: optionally preceded by the <tt>NOT</tt> keyword.</p>
1.18      cvs      6685: </div>
1.1       cvs      6686: 
1.18      cvs      6687: <div class="subsubsection">
1.30    ! cvs      6688: <h4><a name="sectd5287">Conditions on the presence of comments</a></h4>
1.1       cvs      6689: 
1.30    ! cvs      6690: <p>The condition can be based on the presence or absence of comments
        !          6691: associated with the translated element.  This condition is expressed by the
        !          6692: keyword <tt>Comment</tt>, optionally preceded by the keyword <tt>NOT</tt>.</p>
1.18      cvs      6693: </div>
1.1       cvs      6694: 
1.18      cvs      6695: <div class="subsubsection">
                   6696: <h4><a name="sectd5288">Conditions on the presence of specific presentation
                   6697: rules</a></h4>
1.30    ! cvs      6698: 
        !          6699: <p>The condition can be based on the presence or absence of specific
        !          6700: presentation rules associated with the translated element, whatever the rules,
        !          6701: their value or their number.  This condition is expressed by the keyword
1.18      cvs      6702: <tt>Presentation</tt>, optionally preceded by the <tt>NOT</tt> keyword.</p>
                   6703: </div>
1.1       cvs      6704: 
1.18      cvs      6705: <div class="subsubsection">
                   6706: <h4><a name="sectd5289">Conditions on the presence of logical
                   6707: attributes</a></h4>
1.30    ! cvs      6708: 
        !          6709: <p>In the same way, the condition can be based on the presence or absence of
1.1       cvs      6710: attributes associated with the translated elements, no matter what the
1.18      cvs      6711: attributes or their values.  The <tt>Attributes</tt> keyword expresses this
                   6712: condition.</p>
                   6713: </div>
1.1       cvs      6714: 
1.18      cvs      6715: <div class="subsubsection">
1.30    ! cvs      6716: <h4><a name="sectd52810">Conditions on logical attributes</a></h4>
1.1       cvs      6717: 
1.30    ! cvs      6718: <p>If the condition appears in the translation rules of an attribute, the
1.18      cvs      6719: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate that
1.1       cvs      6720: the rules must only be applied if this attribute is the first attribute for
                   6721: the translated element or if it is the last (respectively).  These conditions
1.18      cvs      6722: can also be inverted by the <tt>NOT</tt> keyword.</p>
1.30    ! cvs      6723: 
        !          6724: <p>Another type of condition can only be applied to the translation rules when
1.18      cvs      6725: the element being processed (or one of its ancestors if symbol <tt>*</tt> is
1.1       cvs      6726: missing) has a certain attribute, perhaps with a certain value or, in
                   6727: contrast, when the element does not have this attribute with this value.  The
                   6728: condition is specified by writing the name of the attribute after the keyword
1.18      cvs      6729: <tt>IF</tt> or <tt>AND</tt>.  The <tt>NOT</tt> keyword can be used to invert
1.1       cvs      6730: the condition.  If the translation rules must be applied to any element which
                   6731: has this attribute (or does not have it, if the condition is inverted) no
                   6732: matter what the attribute's value, the condition is complete.  If, in
                   6733: contrast, the condition applies to one or more values of the attribute, these
                   6734: are indicated after the name of the attribute, except for reference attributes
1.18      cvs      6735: which do not have values.</p>
1.30    ! cvs      6736: 
        !          6737: <p>The representation of the values of an <a name="relattr">attribute</a> in a
1.1       cvs      6738: condition depends on the attribute's type.  For attributes with enumerated or
                   6739: textual types, the value (a name or character string between apostrophes,
                   6740: respectively) is simply preceded by an equals sign.  For numeric attributes,
                   6741: the condition can be based on a single value or on a range of values.  In the
                   6742: case of a unique value, this value (an integer) is simply preceded by an
1.18      cvs      6743: equals sign.  Conditions based on ranges of values have several forms:</p>
                   6744: <ul>
1.30    ! cvs      6745:   <li>all values less than a given value (the value is preceded by a ``less
        !          6746:     than'' sign).</li>
        !          6747:   <li>all values greater than a given value (the value is preceded by a
        !          6748:     ``greater than'' sign).</li>
        !          6749:   <li>all values falling in an interval, bounds included.  The range of values
        !          6750:     is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>, where
        !          6751:     Minimum and Maximum are integers.</li>
1.18      cvs      6752: </ul>
1.30    ! cvs      6753: 
        !          6754: <p>All numeric values may be negative.  The integer is simply preceded by a
        !          6755: minus sign.</p>
        !          6756: 
        !          6757: <p>Both local and global attributes can be used in conditions.</p>
1.18      cvs      6758: </div>
1.1       cvs      6759: 
1.18      cvs      6760: <div class="subsubsection">
1.30    ! cvs      6761: <h4><a name="sectd52811">Conditions on specific presentation rules</a></h4>
1.1       cvs      6762: 
1.30    ! cvs      6763: <p>It is possible to apply translation rules only when the element being
1.1       cvs      6764: processed has or does not have a specific presentation rule, possibly with a
                   6765: certain value.  The condition is specified by writing the name of the
1.18      cvs      6766: presentation rule after the keyword <tt>IF</tt> or <tt>AND</tt>.  The
                   6767: <tt>NOT</tt> keyword can be used to invert the condition.  If the translation
1.1       cvs      6768: rules must be applied to any element which has this presentation rule (or does
                   6769: not have it, if the condition is inverted) no matter what the rule's value,
                   6770: the condition is complete.  If, in contrast, the condition applies to one or
                   6771: more values of the rule, these are indicated after the name of the
1.18      cvs      6772: attribute.</p>
1.30    ! cvs      6773: 
        !          6774: <p>The representation of presentation rule values in a condition is similar to
1.1       cvs      6775: that for attribute values.  The representation of these values depend on the
                   6776: type of the presentation rule. There are three categories of presentation
1.18      cvs      6777: rules:</p>
                   6778: <ul>
1.30    ! cvs      6779:   <li>those taking numeric values (<tt>Size, Indent, LineSpacing,
        !          6780:     LineWeight</tt>),</li>
        !          6781:   <li>those with values taken from a predefined list (<tt>Adjust, Justify,
        !          6782:     Hyphenate, Style, Weight, Font, UnderLine, Thickness,
        !          6783:   LineStyle</tt>),</li>
        !          6784:   <li>those whose value is a name (<tt>FillPattern, Background,
        !          6785:     Foreground</tt>).</li>
1.18      cvs      6786: </ul>
1.30    ! cvs      6787: 
        !          6788: <p>For presentation rules which take numeric values, the condition can take a
1.1       cvs      6789: unique value or a range of values.  In the case of a unique value, this value
                   6790: (an integer) is simply preceded by an equals sign. Conditions based on ranges
1.18      cvs      6791: of values have several forms:</p>
                   6792: <ul>
1.30    ! cvs      6793:   <li>all values less than a given value (the value is preceded by a ``less
        !          6794:     than'' sign).</li>
        !          6795:   <li>all values greater than a given value (the value is preceded by a
        !          6796:     ``greater than'' sign).</li>
        !          6797:   <li>all values falling in an interval, bounds included.  The range of values
        !          6798:     is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>, where
        !          6799:     Minimum and Maximum are integers.</li>
1.18      cvs      6800: </ul>
1.30    ! cvs      6801: 
        !          6802: <p>Values for the <tt>Indent</tt>rule may be negative.  The integer is then
1.2       cvs      6803: simply preceded by a minus sign and represents how far the first line starts
1.18      cvs      6804: to the left of the other lines.</p>
1.30    ! cvs      6805: 
        !          6806: <p>For presentation rules whose values are taken from predefined lists, the
        !          6807: value which satisfies the condition is indicated by an equals sign followed by
        !          6808: the name of the value.</p>
        !          6809: 
        !          6810: <p>For presentation rule whose values are names, the value which satisfies the
1.1       cvs      6811: condition is indicated by the equals sign followed by the value's name. The
1.18      cvs      6812: names of fill patterns (the <tt>FillPattern</tt> rule) and of colors (the
                   6813: <tt>Foreground</tt> and <tt>Background</tt> rules) known to Thot are the same
                   6814: as in the P language.</p>
1.30    ! cvs      6815: 
        !          6816: <p>The syntax of conditions based on the specific presentation is the same as
        !          6817: the syntax used to express the <a href="#sectc5224">translation of specific
1.18      cvs      6818: presentation rules</a>.</p>
1.30    ! cvs      6819: 
        !          6820: <p>When a condition has only one rule, the condition is simply followed by
        !          6821: that rule.  If it has several rules, they are placed after the condition
        !          6822: between the keywords <tt>BEGIN</tt> and <tt>END</tt>.</p>
1.18      cvs      6823: <pre>   ConditionSeq = Condition [ 'AND' Condition ] .
1.1       cvs      6824:    Condition    = [ 'NOT' ] [ 'Target' ] Cond .
                   6825:    Cond         = CondElem / CondAscend .
                   6826:    CondElem     ='FirstRef' / 'LastRef' /
                   6827:                  'ExternalRef' /
                   6828:                  'Defined' /
                   6829:                  'Alphabet' '=' Alphabet /
                   6830:                  'ComputedPage' / 'StartPage' / 
                   6831:                  'UserPage' / 'ReminderPage' /
                   6832:                  'Empty' /
1.11      cvs      6833:                   ElemID /
1.1       cvs      6834:                  'FirstAttr' / 'LastAttr' .
                   6835:    CondAscend   = [ Ascend ] CondOnAscend .
                   6836:    Ascend       = '*' / 'Parent' / 'Ancestor' LevelOrType .
                   6837:    LevelOrType  = CondRelLevel / ElemID [ ExtStruct ] .
                   6838:    CondRelLevel = NUMBER .
                   6839:    CondOnAscend ='First' / 'Last' /
                   6840:                  'Referred' / 
                   6841:                   [ 'Immediately' ] 'Within' [ NumParent ]
                   6842:                                     ElemID [ ExtStruct ] /
                   6843:                  'Attributes' /
                   6844:                   AttrID [ RelatAttr ] /
                   6845:                  'Presentation' /
                   6846:                   PresRule /
                   6847:                  'Comment' .                  
                   6848:    NumParent    = [ GreaterLess ] NParent .
1.30    ! cvs      6849:    GreaterLess  = '&gt;' / '&lt;' .
1.1       cvs      6850:    NParent      = NUMBER.
                   6851:    ExtStruct    = '(' ElemID ')' .
                   6852:    Alphabet     = NAME .
                   6853:    RelatAttr    ='=' Value /
1.30    ! cvs      6854:                  '&gt;' [ '-' ] Minimum /
1.1       cvs      6855:                  '&lt;' [ '-' ] Maximum /
                   6856:                  'IN' '[' [ '-' ] MinInterval '..'
                   6857:                           [ '-' ] MaxInterval ']' .
                   6858:    Value        = [ '-' ] IntegerVal / TextVal / AttrValue .
                   6859:    Minimum      = NUMBER .
                   6860:    Maximum      = NUMBER .
                   6861:    MinInterval  = NUMBER .
                   6862:    MaxInterval  = NUMBER .
                   6863:    IntegerVal   = NUMBER .
                   6864:    TextVal      = STRING .
1.18      cvs      6865:    AttrValue    = NAME .</pre>
1.30    ! cvs      6866: 
1.18      cvs      6867: <blockquote class="example">
1.30    ! cvs      6868:   <p><strong>Example:</strong></p>
        !          6869: 
        !          6870:   <p>Suppose that after each element of type Section_Title it is useful to
        !          6871:   produce the text <tt>\label{SectX}</tt> where <tt>X</tt> represents the
        !          6872:   section number, but only if the section is designated by one or more
        !          6873:   references in the document.  The following conditional rule produces this
        !          6874:   effect:</p>
        !          6875:   <pre>RULES
1.1       cvs      6876:   Section_Title :
                   6877:     IF Referred
1.18      cvs      6878:       Create ('\label{Sect' Value(UniqueSectNum) '}\12') After;</pre>
1.30    ! cvs      6879: 
        !          6880:   <p>(the declaration of the <a href="#sectc5224"><tt>UniqueSectNum</tt>
        !          6881:   counter</a> is given above).  The string <tt>\12</tt> represents a line
        !          6882:   break.</p>
1.18      cvs      6883: </blockquote>
1.30    ! cvs      6884: 
1.18      cvs      6885: <blockquote class="example">
1.30    ! cvs      6886:   <p><strong>Example:</strong></p>
        !          6887: 
        !          6888:   <p>Suppose that for elements of the Elmnt type it would be useful to produce
        !          6889:   a character indicating the value of the numeric attribute Level associated
        !          6890:   with the element: an  ``A'' for all values of Level less than 3, a ``B'' for
        !          6891:   values between 3 and 10 and a ``C'' for values greater than 10.  This can be
        !          6892:   achieved by writing the following rules for the Elmnt type:</p>
        !          6893:   <pre>RULES
1.1       cvs      6894:   Elmnt :
                   6895:     BEGIN
                   6896:     IF Level &lt; 3
                   6897:       Create 'A';
                   6898:     IF Level IN [3..10]
                   6899:       Create 'B';
1.30    ! cvs      6900:     IF Level &gt; 10
1.1       cvs      6901:       Create 'C';
1.18      cvs      6902:     END;</pre>
                   6903: </blockquote>
                   6904: </div>
                   6905: </div>
1.1       cvs      6906: 
1.18      cvs      6907: <div class="subsection">
1.30    ! cvs      6908: <h3><a name="sectc529">Translation rules</a></h3>
1.1       cvs      6909: 
1.30    ! cvs      6910: <p>Fifteen types of translation rules can be associated with element types and
1.18      cvs      6911: attribute values.  They are the <tt>Create</tt>, <tt>Write</tt>,
                   6912: <tt>Read</tt>, <tt>Include</tt>, <tt>Get</tt>, <tt>Copy</tt>, <tt>Use</tt>,
                   6913: <tt>Remove</tt>, <tt>NoTranslation</tt>, <tt>NoLineBreak</tt>,
                   6914: <tt>ChangeMainFile</tt>, <tt>RemoveFile</tt>, <tt>Set</tt>, <tt>Add</tt>,
                   6915: <tt>Indent</tt>, rules.  Each rule has its own syntax, although they are all
                   6916: based on very similar models.</p>
                   6917: <pre>     SimpleRule = 'Create' [ 'IN' VarID ] Object
1.1       cvs      6918:                         [ Position ] ';' /
                   6919:                   'Write' Object [ Position ] ';' /
                   6920:                   'Read' BufferID [ Position ] ';' /
                   6921:                   'Include' File [ Position ] ';' /
                   6922:                   'Get' [ RelPosition ] ElemID 
                   6923:                         [ ExtStruct ] 
                   6924:                         [ Position ] ';' /
                   6925:                   'Copy' [ RelPosition ] ElemID 
                   6926:                         [ ExtStruct ] 
                   6927:                         [ Position ] ';' /
                   6928:                   'Use' TrSchema [ 'For' ElemID ] ';' /
                   6929:                   'Remove' ';' /
                   6930:                   'NoTranslation' ';' /
                   6931:                   'NoLineBreak' ';' /
                   6932:                   'ChangeMainFile' VarID [ Position ] ';' /
1.14      cvs      6933:                   'RemoveFile' VarID [ Position ] ';' /
1.10      cvs      6934:                   'Set' CounterID InitValue [ Position ] ';' /
                   6935:                   'Add' CounterID Increment [ Position ] ';' /
1.25      cvs      6936:                   'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .</pre>
1.18      cvs      6937: </div>
                   6938: 
                   6939: <div class="subsection">
1.30    ! cvs      6940: <h3><a name="sectc5210">The <tt>Create</tt> rule</a></h3>
1.18      cvs      6941: 
1.30    ! cvs      6942: <p>The most frequently used rule is undoubtedly the <tt>Create</tt> rule,
        !          6943: which generates fixed or variable text (called an <em>object</em>) in the
        !          6944: output file.  The generated text can be made to appear either before or after
        !          6945: the content of the element to which the rule applies. The rule begins with the
1.18      cvs      6946: <tt>Create</tt> keyword, followed by a specifier for the object and a keyword
                   6947: (<tt>Before</tt> or <tt>After</tt>) indicating the position of the generated
                   6948: text (<a href="#sectc5222">before or after</a> the element's content).  If the
1.1       cvs      6949: position is not indicated, the object will be generated before the element's
                   6950: content.  This rule, like all translation rules, is terminated by a
1.18      cvs      6951: semicolon.</p>
1.30    ! cvs      6952: 
        !          6953: <p>The <tt>Create</tt> keyword can be followed by the <tt>IN</tt> keyword and
        !          6954: by the name of a variable.  This means that the text generated by the rule
        !          6955: must not be written in the main output file, but in the file whose name is
1.18      cvs      6956: specified by the variable.</p>
1.30    ! cvs      6957: 
        !          6958: <p>This allows the translation program to generate text in different files
        !          6959: during the same run. These files do not need to be explicitely declared or
        !          6960: opened. They do not need to be closed either, but if they contain temporary
        !          6961: data, they can be removed (see the <a href="#sectc5220a"><tt>RemoveFile</tt>
        !          6962: rule</a>). As soon as the translation program executes a <tt>Create</tt> rule
        !          6963: for a file that is not yet open, it opens the file. These files are closed
        !          6964: when the translation is finished.</p>
1.18      cvs      6965: <pre>               'Create' [ 'IN' VarID ] Object
1.1       cvs      6966:                         [ Position ] ';'
                   6967:      Object   = ConstID / CharString /
                   6968:                 BufferID /
                   6969:                 VarID /
1.30    ! cvs      6970:                '(' Function &lt; Function &gt; ')' /
1.21      cvs      6971:                 [ 'Translated' ] AttrID /
1.1       cvs      6972:                'Value' /
                   6973:                'Content' /
                   6974:                'Comment' / 
                   6975:                'Attributes' /
                   6976:                'Presentation' /
                   6977:                'RefId' /
                   6978:                'PairId' /
                   6979:                'FileDir' /
                   6980:                'FileName' /
                   6981:                'Extension' /
                   6982:                'DocumentName' /
                   6983:                'DocumentDir' /
                   6984:                 [ 'Referred' ] ReferredObject .
                   6985:      Position ='After' / 'Before' .
                   6986: 
                   6987:      ReferredObject = VarID /
                   6988:                 ElemID [ ExtStruct ] /
                   6989:                'RefId' /
                   6990:                'DocumentName' /
1.18      cvs      6991:                'DocumentDir' .</pre>
1.30    ! cvs      6992: 
        !          6993: <p>The object to be generated can be:</p>
1.18      cvs      6994: <ul>
1.30    ! cvs      6995:   <li>a constant string, specified by its name if it is declared in the
        !          6996:     schema's <tt>CONST</tt> section, or given directly as a value between
        !          6997:     apostrophes;</li>
        !          6998:   <li>the contents of a buffer, designated by the name of the buffer;</li>
        !          6999:   <li>a variable, designated by its name if it is declared in the translation
        !          7000:     schema's <tt>VAR</tt> section, or given directly between parentheses.  The
        !          7001:     text generated is the value of that variable evaluated for the element to
        !          7002:     which the rule applies.</li>
        !          7003:   <li>the value of an attribute, if the element being translated has this
        !          7004:     attribute. The attribute is specified by its name. If it's a text
        !          7005:     attribute, it can be preceded by the <code>Translated</code> keyword,
        !          7006:     which causes the attribute value to be recoded using the text translation
        !          7007:     table defined by section <code><a
        !          7008:     href="#sectc5225">TEXTTRANSLATE</a></code>;</li>
        !          7009:   <li>the value of a specific presentation rule.  This object can only be
        !          7010:     generated if the translation rule is for a <a href="#prestransl">specific
        !          7011:     presentation rule</a>.  It is specified by the <tt>Value</tt>
        !          7012:   keyword;</li>
        !          7013:   <li>the element's content.  That is, the content of the leaves of the
        !          7014:     subtree of the translated element.  This is specified by the
        !          7015:     <tt>Content</tt> keyword;</li>
        !          7016:   <li>the comment attached to the element.  When the element doesn't have a
        !          7017:     comment, nothing is generated.  This is indicated by the <tt>Comment</tt>
        !          7018:     keyword;</li>
        !          7019:   <li>the translation of all attributes of the element (which is primarily
        !          7020:     used to apply the attribute translation rules <a
        !          7021:     href="#sectc5222">before</a> those of the element type).  This is
        !          7022:     specified by the <tt>Attributes</tt> keyword.</li>
        !          7023:   <li>the translation of all of the element's specific presentation rules
        !          7024:     (which is primarily used to apply the translation rules for the specific
        !          7025:     presentation rules <a href="#sectc5222">before</a> those of the element or
        !          7026:     its attributes). This option is specified by the <tt>Presentation</tt>
        !          7027:     keyword;</li>
        !          7028:   <li>The value of the reference's identifier.<br>
        !          7029:     Thot associates a unique identifier with each element in a document.  This
        !          7030:     identifier (called <em>reference's identifier</em> or <em>label</em>) is a
        !          7031:     character string containing the letter `L' followed by digits.  Thot uses
        !          7032:     it in references for identifying the referred element.<br>
        !          7033:     The <tt>RefId</tt> keyword produces the reference's identifier of the
        !          7034:     element to which the translation rule is applied, or the reference's
        !          7035:     identifier of its first ancestor that is referred by a reference or that
        !          7036:     can be referred by a reference.</li>
        !          7037:   <li>the value of a mark pair's unique identifier.  This may only be used for
        !          7038:     <a href="#sectd3285">mark pairs</a> and is indicated by the
        !          7039:     <tt>PairId</tt> keyword.</li>
        !          7040:   <li>the directory containing the file being generated (this string includes
        !          7041:     an ending '/', if it is not empty).  This is indicated by the
        !          7042:     <tt>FileDir</tt> keyword.</li>
        !          7043:   <li>the name of the file being generated (only the name, without the
        !          7044:     directory and without the extension). This is indicated by the
        !          7045:     <tt>FileName</tt> keyword.</li>
        !          7046:   <li>the extension of the file being generated (this string starts with a
        !          7047:     dot, if it is not empty).  This is indicated by the <tt>Extension</tt>
        !          7048:     keyword.</li>
        !          7049:   <li>the name of the document being translated.  This is indicated by the
        !          7050:     <tt>DocumentName</tt> keyword.</li>
        !          7051:   <li>the directory containing the document being translated.  This is
        !          7052:     indicated by the <tt>DocumentDir</tt> keyword.</li>
1.18      cvs      7053: </ul>
1.30    ! cvs      7054: 
        !          7055: <p>When the rule applies to a reference (an element or an attribute defined as
        !          7056: a reference in the structure schema), it can generate a text related to the
1.21      cvs      7057: element referred by that reference.  The rule name is then followed by the
1.18      cvs      7058: <tt>Referred</tt> keyword and a specification of the object to be generated
                   7059: for the referred element.  This specification can be:</p>
                   7060: <ul>
1.30    ! cvs      7061:   <li>the name of a variable.  The rule generates the value of that variable,
        !          7062:     computed for the referred element.</li>
        !          7063:   <li>an element type.  The rule generates the translation of the element of
        !          7064:     that type, which is in the subtree of the referred element.  If this
        !          7065:     element is not defined in the structure schema which corresponds to the
        !          7066:     translation schema (that is, an object defined in another schema), the
        !          7067:     element's type name must be followed by the name of its structure schema
        !          7068:     between parentheses.</li>
        !          7069:   <li>the <tt>RefId</tt> keyword.  The rule generates the reference's
        !          7070:     identifier of the referred element.</li>
        !          7071:   <li>the <tt>DocumentName</tt> keyword.  The rule generates the name of the
        !          7072:     document to which the referred element belongs.</li>
        !          7073:   <li>the <tt>DocumentDir</tt> keyword.  The rule generates the name of the
        !          7074:     directory that contains the document of the referred element.</li>
1.18      cvs      7075: </ul>
                   7076: </div>
1.1       cvs      7077: 
1.18      cvs      7078: <div class="subsection">
1.30    ! cvs      7079: <h3><a name="sectc5211">The <tt>Write</tt> rule</a></h3>
1.1       cvs      7080: 
1.30    ! cvs      7081: <p>The <tt>Write</tt> has the same syntax as the <tt>Create</tt> rule.  It
        !          7082: also produces the same effect, but the generated text is displayed on the
        !          7083: user's terminal during the translation of the document, instead of being
        !          7084: produced in the translated document.  This is useful for helping the user keep
        !          7085: track of the progress of the translation and for prompting the user on the
        !          7086: terminal for input required by the <tt>Read</tt> rule.</p>
1.18      cvs      7087: <pre>               'Write' Object [ Position ] ';'</pre>
1.30    ! cvs      7088: 
        !          7089: <p>Notice: if the translator is launched by the editor (by the ``Save as''
1.18      cvs      7090: command), messages produced by the <tt>Write</tt> rule are not displayed.</p>
1.30    ! cvs      7091: 
1.18      cvs      7092: <blockquote class="example">
1.30    ! cvs      7093:   <p><strong>Example:</strong></p>
        !          7094: 
        !          7095:   <p>To make the translator display the number of each section being
        !          7096:   translated on the user's terminal, the following rule is specified for the
        !          7097:   <tt>Section</tt> element type:</p>
        !          7098:   <pre>Section : BEGIN
1.1       cvs      7099:           Write VarSection;
                   7100:           ...
1.18      cvs      7101:           END;</pre>
1.30    ! cvs      7102: 
        !          7103:   <p>(see <a href="#varsectexample">above</a> for the definition of the
        !          7104:   <tt>VarSection</tt> variable).</p>
        !          7105: 
        !          7106:   <p>To display text on the terminal before issuing a read operation with the
        !          7107:   <tt>Read</tt> rule, the following rule is used:</p>
        !          7108:   <pre>BEGIN
1.1       cvs      7109: Write 'Enter the name of the destination: ';
                   7110: ...
1.18      cvs      7111: END;</pre>
                   7112: </blockquote>
                   7113: </div>
                   7114: 
                   7115: <div class="subsection">
1.30    ! cvs      7116: <h3><a name="sectc5212">The <tt>Read</tt> rule</a></h3>
1.18      cvs      7117: 
1.30    ! cvs      7118: <p>The <tt>Read</tt> rule reads text from the terminal during the translation
        !          7119: of the document and saves the text read in one of the buffers declared in the
1.18      cvs      7120: <tt>BUFFERS</tt> section of the schema.  The buffer to be used is indicated by
                   7121: its name, after the <tt>READ</tt> keyword.  This name can be followed, as in
                   7122: the <tt>Create</tt> and <tt>Write</tt> rules, by a keyword indicating if the
                   7123: read operation must be performed <tt>Before</tt> or <tt>After</tt> the
1.1       cvs      7124: translation of the element's content.  If this keyword is absent, the read
                   7125: operation is done beforehand.  The text is read into the buffer and remains
1.5       cvs      7126: there until a rule using the same buffer - possibly the same rule - is
1.18      cvs      7127: applied.</p>
                   7128: <pre>               'Read' BufferID [ Position ] ';'</pre>
1.30    ! cvs      7129: 
1.18      cvs      7130: <blockquote class="example">
1.30    ! cvs      7131:   <p><strong>Example:</strong></p>
        !          7132: 
        !          7133:   <p>The following set of rules tells the user that the translator is waiting
        !          7134:   for the entry of some text, reads this text into a buffer and copies the
        !          7135:   text into the translated document.</p>
        !          7136:   <pre>BEGIN
1.1       cvs      7137: Write 'Enter the name of the destination: ';
                   7138: Read DestName;
                   7139: Create DestName;
                   7140: ...
1.18      cvs      7141: END;</pre>
1.30    ! cvs      7142: 
        !          7143:   <p>(see <a href="#destname">above</a> the definition of
        !          7144:   <tt>DestName</tt>).</p>
1.18      cvs      7145: </blockquote>
                   7146: </div>
                   7147: 
                   7148: <div class="subsection">
1.30    ! cvs      7149: <h3><a name="sectc5213">The <tt>Include</tt> rule</a></h3>
1.18      cvs      7150: 
1.30    ! cvs      7151: <p>The <tt>Include</tt> rule, like the <tt>Create</tt> rule, is used to
        !          7152: produce text in the translated document.  It inserts constant text which is
        !          7153: not defined in the translation schema, but is instead taken from a file.  The
1.18      cvs      7154: file's name  is specified after the <tt>Include</tt> keyword, either directly
1.1       cvs      7155: as a character string between apostrophes or as the name of one of the buffers
1.18      cvs      7156: declared in the <tt>BUFFERS</tt> section of the schema.  In the latter case,
1.1       cvs      7157: the buffer is assumed to contain the file's name.  This can be used when the
                   7158: included file's name is known only at the moment of translation.  This only
1.18      cvs      7159: requires that the <tt>Include</tt> rule is preceded by a <tt>Read</tt> rule
                   7160: which puts the name of the file desired by the user into the buffer.</p>
1.30    ! cvs      7161: 
        !          7162: <p>Like the other rules, it is possible to specify whether the inclusion will
1.1       cvs      7163: occur before or after the element's content, with the default being before.
                   7164: The file inclusion is only done at the moment of translation, not during the
                   7165: compilation of the translation schema. Thus, the file to be included need not
                   7166: exist during the compilation, but it must be accessible at the time of
                   7167: translation.  Its contents can also be modified between two translations, thus
                   7168: producing different results, even if neither the document or the translation
1.18      cvs      7169: schema are modified.</p>
1.30    ! cvs      7170: 
        !          7171: <p>During translation, the file to be included is searched for along the
        !          7172: schema directory path (indicated by the environment variable
        !          7173: <tt>THOTSCH</tt>).  The file name is normally only composed of a simple name,
        !          7174: without specification of a complete file path.  However, if the filename
        !          7175: starts with a '/', it is considered as an absolute path.</p>
1.18      cvs      7176: <pre>                'Include' File [ Position ] ';'
1.6       cvs      7177:      File     = FileName / BufferID .
1.18      cvs      7178:      FileName = STRING .</pre>
1.30    ! cvs      7179: 
1.18      cvs      7180: <blockquote class="example">
1.30    ! cvs      7181:   <p><strong>Example:</strong></p>
        !          7182: 
        !          7183:   <p>Suppose that it is desirable to print documents of the Article class with
        !          7184:   a formatter which requires a number of declarations and definitions at the
        !          7185:   beginning of the file.  The <tt>Include</tt>rule can be used to achieve
        !          7186:   this. All the declarations and definitions a replaced in a file called
        !          7187:   <tt>DeclarArt</tt> and then the <tt>Article</tt> element type is given the
        !          7188:   following rule:</p>
        !          7189:   <pre>Article : BEGIN
1.1       cvs      7190:           Include 'DeclarArt' Before;
                   7191:           ...
1.18      cvs      7192:           END;</pre>
                   7193: </blockquote>
                   7194: </div>
                   7195: 
                   7196: <div class="subsection">
1.30    ! cvs      7197: <h3><a name="sectc5214">The <tt>Get</tt> rule</a></h3>
1.18      cvs      7198: 
1.30    ! cvs      7199: <p>The <tt>Get</tt> rule is used to change the order in which the elements
        !          7200: appear in the translated document.  More precisely, it produces  the
        !          7201: translation of a specified element before or after the translation of the
        !          7202: content of the element to which the rule applies.  The <tt>Before</tt> and
        !          7203: <tt>After</tt> keywords are placed at the end of the rule to specify whether
        !          7204: the operation should be performed before or after translation of the rule's
        !          7205: element (the default is before). The type of the element to be moved must be
        !          7206: specified after the <tt>Get</tt> keyword, optionally preceded by a keyword
        !          7207: indicating where the element will be found in the logical structure of the
        !          7208: document:</p>
1.18      cvs      7209: <dl>
1.30    ! cvs      7210:   <dt><tt>Included</tt></dt>
        !          7211:     <dd>The element to be moved is the first element of the indicated type
        !          7212:       which is found inside the element to which the rule applies.</dd>
        !          7213:   <dt><tt>Referred</tt></dt>
        !          7214:     <dd>This keyword can only be used if the rule applies to a reference
        !          7215:       element. The element to be moved is either the element designated by the
        !          7216:       reference (if that element is of the specified type), or the first
        !          7217:       element of the desired type contained within the element designated by
        !          7218:       the reference.</dd>
        !          7219:   <dt>no keyword</dt>
        !          7220:     <dd>If the element to be moved is an associated element, defined in the <a
        !          7221:       href="#sectc314"><tt>ASSOC</tt> section</a> of the structure schema, all
        !          7222:       associated elements of this type which have not been translated yet are
        !          7223:       then translated.  Certain elements may in fact have already been
        !          7224:       translated by a <tt>Get Referred</tt> rule.
        !          7225:       <p>If the element to be moved is not an associated element, the
        !          7226:       translator takes the first element of the indicated type from among the
        !          7227:       siblings of the rule's element.  This is primarily used to change the
        !          7228:       order of the components of an aggregate.</p>
        !          7229:     </dd>
1.18      cvs      7230: </dl>
1.30    ! cvs      7231: 
        !          7232: <p>If the element to be moved is defined in a structure schema which is not
        !          7233: the one which corresponds to the translation schema (in the case of an
        !          7234: included object with a different schema), the type name of this element must
        !          7235: be followed, between parentheses, by the name of the structure schema which
1.18      cvs      7236: defines it.</p>
                   7237: <pre>                   'Get' [ RelPosition ] ElemID 
1.6       cvs      7238:                          [ ExtStruct ]
                   7239:                          [ Position ] ';' /
                   7240:      RelPosition = 'Included' / 'Referred' .
1.18      cvs      7241:      ExtStruct   = '(' ElemID ')' .</pre>
1.30    ! cvs      7242: 
        !          7243: <p>The <tt>Get</tt> rule has no effect if the element which it is supposed to
1.1       cvs      7244: move has already been translated.  Thus, the element will not be duplicated.
                   7245: It is generally best to associate the rule with the first element which will
                   7246: be encountered by the translator in its traversal of the document.  Suppose an
1.18      cvs      7247: aggregate has two elements <tt>A</tt> and <tt>B</tt>, with <tt>A</tt>
1.1       cvs      7248: appearing first in the logical structure.  To permute these two elements, a
1.18      cvs      7249: <tt>Get B before</tt> rule should be associated with the <tt>A</tt> element
                   7250: type, not the inverse.  Similarly, a rule of the form <tt>Get Included X
                   7251: After</tt>, even though syntactically correct, makes no sense since, by the
1.1       cvs      7252: time it will be applied, after the translation of the contents of the element
1.18      cvs      7253: to which it is attached, the <tt>X</tt> element will already have been
                   7254: translated.</p>
1.30    ! cvs      7255: 
        !          7256: <p>The <tt>Get</tt> rule is the only way to obtain the translation of the
1.1       cvs      7257: associated elements.  In fact, the translator only traverses the primary tree
                   7258: of the document and thus does not translate the associated elements, except
1.18      cvs      7259: when the translation is explicitly required by a <tt>Get Referred Type</tt> or
                   7260: <tt>Get Type</tt> rule where <tt>Type</tt> is an associated element type.</p>
1.30    ! cvs      7261: 
1.18      cvs      7262: <blockquote class="example">
1.30    ! cvs      7263:   <p><strong>Example:</strong></p>
        !          7264: 
        !          7265:   <p>The structure schema defined figures as associated element which are
        !          7266:   composed of some content and a caption.  Moreover, it is possible to make
        !          7267:   references to figures, using elements of the <tt>RefFigure</tt> type:</p>
        !          7268:   <pre>     ...
1.1       cvs      7269:      RefFigure = REFERENCE(Figure);
                   7270: ASSOC
1.6       cvs      7271:      Figure    = BEGIN
                   7272:                  Content = NATURE;
                   7273:                  Caption = Text;
                   7274:                  END;
1.18      cvs      7275:      ...</pre>
1.30    ! cvs      7276: 
        !          7277:   <p>Suppose it would be useful to make a figure appear in the translated
        !          7278:   document at the place in the text where the first reference to the figure is
        !          7279:   made.  If some figures are not referenced, then they would appear at the end
        !          7280:   of the document.  Also, each figure's caption should appear before the
        !          7281:   content.  The following rules in the translation schema will produce this
        !          7282:   result:</p>
        !          7283:   <pre>Article :   BEGIN
1.1       cvs      7284:             ...
                   7285:             Get Figures After;
                   7286:             END;
                   7287: RefFigure : BEGIN
                   7288:             If FirstRef Get Referred Figure;
                   7289:             ...
                   7290:             END;
                   7291: Content :   BEGIN
                   7292:             Get Caption Before;
                   7293:             ...
1.18      cvs      7294:             END;</pre>
                   7295: </blockquote>
                   7296: </div>
                   7297: 
                   7298: <div class="subsection">
1.30    ! cvs      7299: <h3><a name="sectc5215">The <tt>Copy</tt> rule</a></h3>
1.18      cvs      7300: 
1.30    ! cvs      7301: <p>Like the <tt>Get</tt> rule, the <tt>Copy</tt> rule generates the
        !          7302: translation of a specified element, but it acts even if the element has
        !          7303: already been translated and it allows to copy it or to translate it later.
        !          7304: Both rules have the same syntax.</p>
1.18      cvs      7305: <pre>              'Copy' [ RelPosition ] ElemID 
                   7306:                      [ ExtStruct ] [ Position ] ';'</pre>
                   7307: </div>
                   7308: 
                   7309: <div class="subsection">
1.30    ! cvs      7310: <h3><a name="sectc5216">The <tt>Use</tt> rule</a></h3>
1.18      cvs      7311: 
1.30    ! cvs      7312: <p>The <tt>Use</tt> rule specifies the translation schema to be applied to
1.1       cvs      7313: objects of a certain class that are part of the document.  This rule only
                   7314: appears in the rules for the root element of the document (the first type
1.18      cvs      7315: defined after the <tt>STRUCT</tt> keyword in the structure schema) or the
1.1       cvs      7316: rules of an element defined by an external structure (by another structure
1.18      cvs      7317: schema).  Also, the <tt>Use</tt> rule cannot be conditional.</p>
1.30    ! cvs      7318: 
        !          7319: <p>If the rule is applied to an element defined by an external structure, the
1.18      cvs      7320: <tt>Use</tt> keyword is simply followed by the name of the translation schema
1.1       cvs      7321: to be used for element constructed  according to that external structure.  If
                   7322: the rule is applied to the document's root element, it is formed by the
1.18      cvs      7323: <tt>Use</tt> keyword followed by the translation schema's name, the
                   7324: <tt>For</tt> keyword and the name of the external structure to which the
                   7325: indicated translation schema should be applied.</p>
                   7326: <pre>               'Use' TrSchema [ 'For' ElemID ] ';'
                   7327:      TrSchema = NAME .</pre>
1.30    ! cvs      7328: 
        !          7329: <p>If no <tt>Use</tt> rule defines the translation schema to be used for an
1.1       cvs      7330: external structure which appears in a document, the translator asks the user,
                   7331: during the translation process, which schema should be used. Thus, it is not
1.18      cvs      7332: necessary to give the translation schema a <tt>Use</tt> rule for every
1.1       cvs      7333: external structure used, especially when the choice of translation schemas is
1.18      cvs      7334: to be left to the user.</p>
1.30    ! cvs      7335: 
        !          7336: <p>Notice: if the translator is launched by the editor (by the ``Save as''
1.18      cvs      7337: command), prompts are not displayed.</p>
1.30    ! cvs      7338: 
1.18      cvs      7339: <blockquote class="example">
1.30    ! cvs      7340:   <p><strong>Example:</strong></p>
        !          7341: 
        !          7342:   <p>The <tt>Article</tt> structure schema uses the <tt>Formula</tt> external
        !          7343:   structure, defined by another structure schema, for mathematical
        !          7344:   formulas:</p>
        !          7345:   <pre>STRUCTURE Article;
1.1       cvs      7346:    ...
                   7347: STRUCT
                   7348:    Article = ...
                   7349:    ...
                   7350:    Formula_in_text  = Formula;
                   7351:    Isolated_formula = Formula;
                   7352:    ...
1.18      cvs      7353: END</pre>
1.30    ! cvs      7354: 
        !          7355:   <p>Suppose that it would be useful to use the <tt>FormulaT</tt> translation
        !          7356:   schema for the formulas of an article.  This can be expressed in two
        !          7357:   different ways in the <tt>Article</tt> class translation schema, using the
        !          7358:   rules:</p>
        !          7359:   <pre>RULES
1.1       cvs      7360:     Article :
1.18      cvs      7361:        Use FormulaT for Formula;</pre>
1.30    ! cvs      7362: 
        !          7363:   <p>or:</p>
        !          7364:   <pre>RULES
1.1       cvs      7365:     ...
                   7366:     Formula :
1.18      cvs      7367:        Use FormulaT;</pre>
                   7368: </blockquote>
                   7369: </div>
                   7370: 
                   7371: <div class="subsection">
1.30    ! cvs      7372: <h3><a name="sectc5217">The <tt>Remove</tt> rule</a></h3>
1.18      cvs      7373: 
1.30    ! cvs      7374: <p>The <tt>Remove</tt> rule indicates that nothing should be generated, in the
1.1       cvs      7375: translated document, for the content of the element to which the rule applies.
                   7376: The content of that element is simply ignored by the translator.  This does
                   7377: not prevent the generation of text for the element itself, using the
1.18      cvs      7378: <tt>Create</tt> or <tt>Include</tt> rules, for example.</p>
1.30    ! cvs      7379: 
        !          7380: <p>The <tt>Remove</tt> rule is simply written with the <tt>Remove</tt>
        !          7381: keyword. It is terminated, like all rules, by a semicolon.</p>
1.18      cvs      7382: <pre>               'Remove' ';'</pre>
                   7383: </div>
                   7384: 
                   7385: <div class="subsection">
1.30    ! cvs      7386: <h3><a name="sectc5218">The <tt>NoTranslation</tt> rule</a></h3>
1.18      cvs      7387: 
1.30    ! cvs      7388: <p>The <tt>NoTranslation</tt> rule indicates to the translator that it must
        !          7389: not translate the content of the leaves of the element to which it applies. In
1.18      cvs      7390: contrast to the <tt>Remove</tt> rule, it does not suppress the content of the
1.1       cvs      7391: element, but it inhibits the translation of character strings, symbols, and
                   7392: graphical elements contained in the element.  These are retrieved so that
1.18      cvs      7393: after the translation of the document, the rules of the <a
                   7394: href="#sectc5225"><tt>TEXTTRANSLATE</tt>, <tt>SYMBTRANSLATE</tt> and
                   7395: <tt>GRAPHTRANSLATE</tt> sections</a> will not be applied to them.</p>
1.30    ! cvs      7396: 
        !          7397: <p>The <tt>NoTranslation</tt> rule is written with the <tt>NoTranslation</tt>
1.18      cvs      7398: keyword followed by a semicolon.</p>
                   7399: <pre>               'NoTranslation' ';'</pre>
                   7400: </div>
                   7401: 
                   7402: <div class="subsection">
1.30    ! cvs      7403: <h3><a name="sectc5219">The <tt>NoLineBreak</tt> rule</a></h3>
1.18      cvs      7404: 
1.30    ! cvs      7405: <p>The <tt>NoLineBreak</tt> rule indicates to the translator that it must not
1.1       cvs      7406: generate additional line breaks in the output produced for the element to
1.18      cvs      7407: which it applies.  This is as if it was an <a href="#sectc522">instruction
                   7408: <tt>LINELENGTH 0;</tt></a> at the beginning of the translation schema, but
                   7409: only for the current element.</p>
1.30    ! cvs      7410: 
        !          7411: <p>The <tt>NoLineBreak</tt> rule is written with the <tt>NoLineBreak</tt>
        !          7412: keyword followed by a semicolon.</p>
1.18      cvs      7413: <pre>               'NoLineBreak' ';'</pre>
                   7414: </div>
1.1       cvs      7415: 
1.18      cvs      7416: <div class="subsection">
1.30    ! cvs      7417: <h3><a name="sectc5220">The <tt>ChangeMainFile</tt> rule</a></h3>
1.1       cvs      7418: 
1.30    ! cvs      7419: <p>When the translation program starts, it opens a main output file, whose
        !          7420: name is given as a parameter of the translator.  All <a
1.18      cvs      7421: href="#sectc5210"><tt>Create</tt> rules</a> without explicit indication of the
                   7422: output file write sequentially in this file.  When a <tt>ChangeMainFile</tt>
                   7423: rule is executed, the main output file is closed and it is replaced by a new
                   7424: one, whose name is specified in the <tt>ChangeMainFile</tt> rule.  The
                   7425: <tt>Create</tt> rules without indication of the output file that are then
                   7426: executed write in this new file.  Several <tt>ChangeMainFile</tt> rules can be
                   7427: executed during the same translation, for dividing the main output into
                   7428: several files.</p>
1.30    ! cvs      7429: 
        !          7430: <p>This rule is written with the <tt>ChangeMainFile</tt> keyword followed by
        !          7431: the name of a variable that specifies the name of the new main file. The
        !          7432: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the rule
        !          7433: to specify whether the operation should be performed before or after
        !          7434: translation of the rule's element (the default is before). This rule, like all
        !          7435: translation rules, is terminated by a semicolon.</p>
1.18      cvs      7436: <pre>               'ChangeMainFile' VarID [ Position ] ';'</pre>
1.30    ! cvs      7437: 
1.18      cvs      7438: <blockquote class="example">
1.30    ! cvs      7439:   <p><strong>Example:</strong></p>
        !          7440: 
        !          7441:   <p>To generate the translation of each section in a different file, the
        !          7442:   following rule can be associated with type <tt>Section</tt>.  That rule uses
        !          7443:   the <a href="#varoutputfile"><tt>VarOutpuFile</tt> variable</a> defined
        !          7444:   above.</p>
        !          7445:   <pre>     Section:
1.18      cvs      7446:          ChangeMainFile VarOutpuFile Before;</pre>
1.30    ! cvs      7447: 
        !          7448:   <p>If <tt>output.txt</tt> is the name of the output file specified when
        !          7449:   starting the translation program, translated sections are written in files
        !          7450:   <tt>output1.txt</tt>, <tt>output2.txt</tt>, etc.</p>
1.18      cvs      7451: </blockquote>
                   7452: </div>
1.1       cvs      7453: 
1.18      cvs      7454: <div class="subsection">
1.30    ! cvs      7455: <h3><a name="sectc5220a">The <tt>RemoveFile</tt> rule</a></h3>
1.14      cvs      7456: 
1.30    ! cvs      7457: <p>Files may be used for storing temporary data that are no longer needed when
1.18      cvs      7458: the translation of a document is complete.  These files may be removed by the
                   7459: <tt>RemoveFile</tt> rule.</p>
1.30    ! cvs      7460: 
        !          7461: <p>This rule is written with the <tt>RemoveFile</tt> keyword followed by the
        !          7462: name of a variable that specifies the name of the file to be removed.  The
        !          7463: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the rule
        !          7464: to specify whether the operation should be performed before or after
        !          7465: translation of the rule's element (the default is before).  This rule, like
        !          7466: all translation rules, is terminated by a semicolon.</p>
1.18      cvs      7467: <pre>               'RemoveFile' VarID [ Position ] ';'</pre>
                   7468: </div>
                   7469: 
                   7470: <div class="subsection">
1.30    ! cvs      7471: <h3><a name="sectc5221">The <tt>Set</tt> and <tt>Add</tt> rules</a></h3>
1.18      cvs      7472: 
1.30    ! cvs      7473: <p>The <tt>Set</tt> and <tt>Add</tt> rules are used for modifying the value of
1.18      cvs      7474: counters that have no <a href="#sectc524">counting function</a>.  Only this
                   7475: type of counter can be used in the <tt>Set</tt> and <tt>Add</tt> rules.</p>
1.30    ! cvs      7476: 
        !          7477: <p>Both rules have the same syntax: after the keyword <tt>Set</tt> or
1.18      cvs      7478: <tt>Add</tt> appear the counter name and the value to assign to the counter
                   7479: (<tt>Set</tt> rule) or the value to be added to the counter (<tt>Add</tt>
                   7480: rule).  The keyword <tt>Before</tt> or <tt>After</tt> can follow that value to
1.1       cvs      7481: indicate when the rule must be applied: before or after the element's content
1.18      cvs      7482: is translated. By default, <tt>Before</tt> is assumed.  A semicolon terminates
                   7483: the rule.</p>
                   7484: <pre>               'Set' CounterID InitValue [ Position ] ';' /
                   7485:                'Add' CounterID Increment [ Position ] ';'</pre>
                   7486: </div>
                   7487: 
                   7488: <div class="subsection">
1.30    ! cvs      7489: <h3><a name="sectc5221a">The <tt>Indent</tt> rule</a></h3>
1.18      cvs      7490: 
1.30    ! cvs      7491: <p>The <tt>Indent</tt> rule is used to modify the value of text indentation in
1.18      cvs      7492: the output files.</p>
1.30    ! cvs      7493: 
        !          7494: <p>Each time the translator creates a new line in an output file, it generates
        !          7495: a variable number of space characters at the beginning of the new line.  By
1.25      cvs      7496: default, the number of these characters (the indentation value) is 0.  It can
                   7497: be changed with the <tt>Indent</tt> rule.</p>
1.30    ! cvs      7498: 
        !          7499: <p>In its simple form, the rule begins with the <tt>Indent</tt> keyword,
1.25      cvs      7500: followed by the indentation sign (optional) and value and a keyword
1.30    ! cvs      7501: <tt>Before</tt> or <tt>After</tt> indicating that the indentation should be
        !          7502: changed <a href="#sectc5222">before or after</a> the element's content is
        !          7503: generated.  If the position is not indicated, the indentation is changed
1.25      cvs      7504: before the element's content is generated.  This rule, like all translation
                   7505: rules, is terminated by a semicolon.</p>
1.30    ! cvs      7506: 
        !          7507: <p>The indentation value is indicated by an integer, which is the number of
        !          7508: space characters to be generated at the beginning of each new line. A sign
1.18      cvs      7509: (<tt>+</tt> or <tt>-</tt>) can appear before the integer to indicate that the
                   7510: value is relative: the current value of indentation is incremented (if sign is
                   7511: <tt>+</tt>) or decremented (if sign is <tt>-</tt>) by the specified value.</p>
1.30    ! cvs      7512: 
        !          7513: <p>Keyword <tt>Suspend</tt> or <tt>Resume</tt> can appear instead of the
1.25      cvs      7514: (possibly signed) identation value.  <tt>Suspend</tt> means that the new
1.30    ! cvs      7515: indentation value to be used is zero until another <tt>Indent</tt> rule is
        !          7516: executed and changes the indentation value. <tt>Resume</tt> means that the
        !          7517: indentation value that was used before the last <tt>Indent Suspend</tt> was
        !          7518: executed becomes the new value.  Only one <tt>Suspend</tt> can be used before
        !          7519: a <tt>Resume</tt>; <tt>Supend</tt>-<tt>Resume</tt> pairs can not be
        !          7520: nested.</p>
        !          7521: 
        !          7522: <p>Like the <a href="#sectc5210"><tt>Create</tt> rule</a>, the <tt>Indent</tt>
1.18      cvs      7523: keyword can be followed by the <tt>IN</tt> keyword and by the name of a <a
                   7524: href="#sectc526">variable</a>.  This means that the rule must not change
1.10      cvs      7525: indentation in the main output file, but in the file whose name is specified
                   7526: by the variable (by default, indentation is changed in the main output
1.18      cvs      7527: file).</p>
1.25      cvs      7528: <pre>               'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .
1.10      cvs      7529: 
1.25      cvs      7530: Indent        = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue .
1.10      cvs      7531: IndentSign    = '+' / '-' .
1.18      cvs      7532: IndentValue   = NUMBER .</pre>
                   7533: </div>
1.10      cvs      7534: 
1.18      cvs      7535: <div class="subsection">
1.30    ! cvs      7536: <h3><a name="sectc5222">Rule application order</a></h3>
1.1       cvs      7537: 
1.30    ! cvs      7538: <p>The translator translates the elements which comprise the document in the
1.18      cvs      7539: order induced by the tree structure, except when the <tt>Get</tt> rule is used
1.1       cvs      7540: to change the order of translation.  For each element, the translator first
                   7541: applies the rules specified for the element's type that must be applied before
1.18      cvs      7542: translation of the element's content (rules ending with the <tt>Before</tt>
1.1       cvs      7543: keyword or which have no position keyword).  If several rules meet these
                   7544: criteria, the translator applies them in the order in where they appear in the
1.18      cvs      7545: translation schema.</p>
1.30    ! cvs      7546: 
        !          7547: <p>It then applies all <a href="#sectc5223">rules for the attributes</a> which
1.1       cvs      7548: the element has and which must be applied before the translation of the
1.18      cvs      7549: element's content (rules ending with the <tt>Before</tt> keyword or which have
1.1       cvs      7550: no position keyword).  For one attribute value, the translator applies the
1.18      cvs      7551: rules in the order in which they are defined in the translation schema.</p>
1.30    ! cvs      7552: 
        !          7553: <p>The same procedure is followed with translation rules for specific
1.18      cvs      7554: presentations.</p>
1.30    ! cvs      7555: 
        !          7556: <p>Next, the element's content is translated, as long as a <tt>Remove</tt>
        !          7557: rule does not apply.</p>
        !          7558: 
        !          7559: <p>In the next step, the translator applies rules for the specific
        !          7560: presentation of the element that are to be applied after translation of the
        !          7561: content (rules which end with the <tt>After</tt> keyword).  The rules for each
        !          7562: type of presentation rule or each value are applied in the order in which the
1.18      cvs      7563: translation appear in the schema.</p>
1.30    ! cvs      7564: 
        !          7565: <p>Then, the same procedure is followed for translation rules for attributes
        !          7566: of the element.</p>
        !          7567: 
        !          7568: <p>Finally, the translator applies rules for the element which must be applied
1.1       cvs      7569: after translation of the element's content.  These rules are applied in the
                   7570: order that they appear in the translation schema.  When the translation of an
                   7571: element is done, the translator procedes to translate the following
1.18      cvs      7572: element.</p>
1.30    ! cvs      7573: 
        !          7574: <p>This order can be changed with the <tt>Attributes</tt> and
1.18      cvs      7575: <tt>Presentation</tt> options of the <a href="#sectc5210"><tt>Create</tt>
                   7576: rule</a>.</p>
                   7577: </div>
1.1       cvs      7578: 
1.18      cvs      7579: <div class="subsection">
1.30    ! cvs      7580: <h3><a name="sectc5223">Translation of logical attributes</a></h3>
1.1       cvs      7581: 
1.30    ! cvs      7582: <p>After the rules for the element types, the translation schema defines rules
1.18      cvs      7583: for attribute values.  This section begins with the <tt>ATTRIBUTES</tt>
1.1       cvs      7584: keyword and is composed of a sequence of rule blocks each preceded by an
1.18      cvs      7585: attribute name and an optional value or value range.</p>
1.30    ! cvs      7586: 
        !          7587: <p>If the attribute's name appears alone before the rule block, the rule are
1.1       cvs      7588: applied to all element which have the attribute, no matter what value the
                   7589: attribute has.  In this case, the attribute name is followed by a colon before
1.18      cvs      7590: the beginning of the rule block.</p>
1.30    ! cvs      7591: 
        !          7592: <p>The attribute's name can be followed by the name of an element type between
1.1       cvs      7593: parentheses.  This says, as in presentation schemas, that the rule block which
                   7594: follows applies not to the element which has the attribute, but to its
1.18      cvs      7595: descendants of the type indicated between the parentheses.</p>
1.30    ! cvs      7596: 
        !          7597: <p>If values are given after the attribute name (or after the name of the
        !          7598: element type), the rules are applied only when the attribute has the indicated
        !          7599: values. The same attribute can appear several times, with different values and
1.1       cvs      7600: different translation rules.  Attribute values are indicated in the same way
1.18      cvs      7601: as in <a href="#sectc528">conditions</a> and are followed by a colon before
                   7602: the block of rules.</p>
1.30    ! cvs      7603: 
        !          7604: <p>The rule block associated with an attribute is either a simple rule or a
1.18      cvs      7605: sequence of rules delimited by the <tt>BEGIN</tt> and <tt>END</tt> keywords.
                   7606: Note that rules associated with attribute values cannot be conditional.</p>
1.30    ! cvs      7607: 
        !          7608: <p>Translation rules are not required for all attributes (or their values)
1.1       cvs      7609: defined in a structure schema.  Only those attributes for which a particular
                   7610: action must be performed by the translator must have such rules.  The rules
1.18      cvs      7611: that can be used are those described above, from <a
                   7612: href="#sectc5210"><tt>Create</tt></a> to <a
                   7613: href="#sectc5218"><tt>NoTranslation</tt></a>.</p>
1.30    ! cvs      7614: <pre>     AttrSeq       = TransAttr &lt; TransAttr &gt; .
1.1       cvs      7615:      TransAttr     = AttrID [ '(' ElemID ')' ] 
                   7616:                      [ RelatAttr ] ':' RuleSeq .
                   7617:      AttrID        = NAME .
1.18      cvs      7618:      ElemID        = NAME .</pre>
1.30    ! cvs      7619: 
1.18      cvs      7620: <blockquote class="example">
1.30    ! cvs      7621:   <p><strong>Example:</strong></p>
        !          7622: 
        !          7623:   <p>The structure defined the ``Language'' attribute which can take the
        !          7624:   values ``French'' and ``English''.  To have the French parts of the original
        !          7625:   document removed and prevent the translation of the leaves of the English
        !          7626:   parts, the following rules would be used:</p>
        !          7627:   <pre>ATTRIBUTES
1.1       cvs      7628:    Language=French :
                   7629:       Remove;
                   7630:    Language=English :
1.18      cvs      7631:       NoTranslation;</pre>
                   7632: </blockquote>
                   7633: </div>
1.1       cvs      7634: 
1.18      cvs      7635: <div class="subsection">
1.30    ! cvs      7636: <h3><a name="sectc5224">Translation of specific presentations</a></h3>
1.1       cvs      7637: 
1.30    ! cvs      7638: <p>After the rules for attributes, the translation schema defines rules for
        !          7639: the specific presentation.  This section begins with the <tt>PRESENTATION</tt>
1.1       cvs      7640: keyword and is composed of a sequence of translation rule blocks each preceded
                   7641: by a presentation rule name, optionally accompanied by a part which depends on
1.18      cvs      7642: the particular presentation rule.</p>
1.30    ! cvs      7643: 
        !          7644: <p>Each of these translation rule blocks is applied when the translator
        !          7645: operates on an element which has a specific presentation rule of the type
        !          7646: indicated at the head of the block.  Depending on the type of the specific
        !          7647: presentation rule, it is possible to specify values of the presentation rule
        !          7648: for which the translation rule block should be applied.</p>
        !          7649: 
        !          7650: <p>There are three categories of the presentation rules:</p>
        !          7651: <ul>
        !          7652:   <li>rules taking numeric values: <tt>Size</tt>, <tt>Indent</tt>,
        !          7653:     <tt>LineSpacing</tt>, <tt>LineWeight</tt>,</li>
        !          7654:   <li>rules whose values are taken from a predefined list (i.e. whose type is
        !          7655:     an enumeration): <tt>Adjust</tt>, <tt>Justify</tt>, <tt>Hyphenate,/TT&gt;,
        !          7656:     <tt>Style</tt>, <tt>Weight</tt>, <tt>Font</tt>, <tt>UnderLine</tt>,
        !          7657:     <tt>Thickness</tt>, <tt>LineStyle</tt>,</tt></li>
        !          7658:   <li>rules whose value is a name: <tt>FillPattern</tt>, <tt>Background</tt>,
        !          7659:     <tt>Foreground</tt>.</li>
1.18      cvs      7660: </ul>
1.30    ! cvs      7661: 
        !          7662: <p>For presentation rules of the first category, the values which provoke
1.1       cvs      7663: application of the translation rules are indicated in the same manner as for
1.18      cvs      7664: <a href="#relattr">numeric attributes</a>.  This can be either a unique value
1.1       cvs      7665: or range of values.  For a unique value, the value (an integer) is simply
                   7666: preceded by an equals sign.  Value ranges can be specified in one of three
1.18      cvs      7667: ways:</p>
                   7668: <ul>
1.30    ! cvs      7669:   <li>all values less than a given value (this value is preceded by a ``less
        !          7670:     than'' sign '<tt>&lt;</tt>'),</li>
        !          7671:   <li>all values greater than a given value (this value is preceded by a`
        !          7672:     `greater than'' sign '<tt>&gt;</tt>'),</li>
        !          7673:   <li>all values falling in an interval, bounds included.  The range of values
        !          7674:     is then specified <tt>IN [</tt>Minimum<tt>..</tt>Maximum<tt>]</tt>, where
        !          7675:     Minimum and Maximum are integers.</li>
1.18      cvs      7676: </ul>
1.30    ! cvs      7677: 
        !          7678: <p>All numeric values can be negative, in which case the integer is preceded
        !          7679: by a minus sign.  All values must be given in typographers points.</p>
        !          7680: 
        !          7681: <p>For presentation rules whose values are taken from a predefined list, the
1.1       cvs      7682: value which provokes application of the translation rules is simply indicated
1.18      cvs      7683: by the equals sign followed by the name of the value.</p>
1.30    ! cvs      7684: 
        !          7685: <p>For presentation rules whose values are names, the value which provokes the
1.1       cvs      7686: application of translation rules is simply indicated by the equals sign
                   7687: followed by the name of the value.  The names of the fill patterns (the
1.18      cvs      7688: <tt>FillPattern</tt> rule) and of the colors (the <tt>Foreground</tt> and
                   7689: <tt>Background</tt> rules) used in Thot are the same as in the P language.</p>
1.30    ! cvs      7690: <pre>     PresSeq        = PresTrans &lt; PresTrans &gt; .
1.1       cvs      7691:      PresTrans      = PresRule ':' RuleSeq .
                   7692:      PresRule       = 'Size' [ PresRelation ] /
                   7693:                       'Indent' [ PresRelation ] /
                   7694:                       'LineSpacing' [ PresRelation ] /
                   7695:                       'Adjust' [ '=' AdjustVal ] /
                   7696:                       'Justify' [ '=' BoolVal ] /
                   7697:                       'Hyphenate' [ '=' BoolVal ] /
                   7698:                       'Style' [ '=' StyleVal ] /
1.24      cvs      7699:                       'Weight' [ '=' WeightVal ] /
1.1       cvs      7700:                       'Font' [ '=' FontVal ] /
                   7701:                       'UnderLine' [ '=' UnderLineVal ] /
                   7702:                       'Thickness' [ '=' ThicknessVal ] /
                   7703:                       'LineStyle' [ '=' LineStyleVal ] /
                   7704:                       'LineWeight' [ PresRelation ] /
                   7705:                       'FillPattern' [ '=' Pattern ] /
                   7706:                       'Background' [ '=' Color ] /
                   7707:                       'Foreground' [ '=' Color ] .
                   7708: 
                   7709:      PresRelation   = '=' PresValue /
1.30    ! cvs      7710:                       '&gt;' [ '-' ] PresMinimum /
1.1       cvs      7711:                       '&lt;' [ '-' ] PresMaximum /
                   7712:                       'IN' '[' [ '-' ] PresIntervalMin '..'
                   7713:                               [ '-' ] PresIntervalMax ']' .
                   7714:      AdjustVal      = 'Left' / 'Right' / 'VMiddle' / 
                   7715:                       'LeftWithDots' .
                   7716:      BoolVal        = 'Yes' / 'No' .
1.24      cvs      7717:      StyleVal       = 'Roman' / 'Italics' / 'Oblique' .
                   7718:      WeightVal      = 'Normal' / 'Bold' .
1.1       cvs      7719:      FontVal        = 'Times' / 'Helvetica' / 'Courier' .
                   7720:      UnderLineVal   = 'NoUnderline' / 'UnderLined' /
                   7721:                       'OverLined' / 'CrossedOut' .
                   7722:      ThicknessVal   = 'Thick' / 'Thin' .
1.6       cvs      7723:      LineStyleVal   = 'Solid' / 'Dashed' / 'Dotted' .
1.1       cvs      7724:      Pattern        = NAME .
                   7725:      Color          = NAME .
                   7726:      PresMinimum    = NUMBER .
                   7727:      PresMaximum    = NUMBER .
                   7728:      PresIntervalMin= NUMBER .
                   7729:      PresIntervalMax= NUMBER .
                   7730:      PresValue      = [ '-' ] PresVal .
1.18      cvs      7731:      PresVal        = NUMBER .</pre>
1.30    ! cvs      7732: 
        !          7733: <p>The <a name="prestransl">translation rules associated with specific
1.18      cvs      7734: presentation rules</a> can use the value of the specific presentation rule
1.1       cvs      7735: that causes them to be applied.  This behavior is designated by the keyword
1.18      cvs      7736: <tt>Value</tt>. For numerically-valued presentation rules, the numeric value
1.1       cvs      7737: is produced.  For other presentation rules, the name of the value is
1.18      cvs      7738: produced.</p>
1.30    ! cvs      7739: 
        !          7740: <p>It should be noted that modifications to the layout of the document's
        !          7741: elements that are made using the combination of the control key and a mouse
        !          7742: button will have no effect on the translation of the document.</p>
        !          7743: 
        !          7744: <blockquote class="example">
        !          7745:   <p><strong>Example:</strong></p>
        !          7746: 
        !          7747:   <p>Suppose that it is desirable to use the same font sizes as in the
        !          7748:   specific presentation, but the font size must be between 10 and 18
        !          7749:   typographer's points. If font size is set in the translated document by the
        !          7750:   string <tt>pointsize=n</tt> where <tt>n</tt> is the font size in
        !          7751:   typographer's points then the following rules will suffice:</p>
        !          7752:   <pre>PRESENTATION
1.1       cvs      7753:    Size &lt; 10 :
                   7754:         Create 'pointsize=10';
                   7755:    Size in [10..18] :
                   7756:         BEGIN
                   7757:         Create 'pointsize=';
                   7758:         Create Value;
                   7759:         END;
1.30    ! cvs      7760:    Size &gt; 18 :
1.18      cvs      7761:         Create 'pointsize=18';</pre>
                   7762: </blockquote>
                   7763: </div>
1.1       cvs      7764: 
1.18      cvs      7765: <div class="subsection">
1.30    ! cvs      7766: <h3><a name="sectc5225">Recoding of characters, symbols and graphics</a></h3>
1.1       cvs      7767: 
1.30    ! cvs      7768: <p>The coding of characters, graphical elements and symbols as defined in Thot
1.1       cvs      7769: does not necessarily correspond to what is required by an application to which
                   7770: a Thot document must be exported.  Because of this the translator can recode
                   7771: these terminal elements of the documents structure.  The last sections of a
                   7772: translation schema are intended for this purpose, each specifying the recoding
1.18      cvs      7773: rules for one type of terminal element.</p>
1.30    ! cvs      7774: 
        !          7775: <p>The recoding rules for character strings are grouped by alphabets. There is
        !          7776: a group of rules for each alphabet of the Thot document that must be
        !          7777: translated. Each such group of rules begins with the <tt>TEXTTRANSLATE</tt>
        !          7778: keyword, followed by the specification of the alphabet to translate and the
        !          7779: recoding rules, between the <tt>BEGIN</tt> and <tt>END</tt> keywords unless
        !          7780: there is only one recoding rule for the alphabet. The specification of the
        !          7781: alphabet is not required: by default it is assumed to the Latin alphabet (the
        !          7782: ISO Latin-1 character set).</p>
        !          7783: 
        !          7784: <p>Each recoding rule is formed by a source string between apostrophes and a
1.1       cvs      7785: target string, also between apostrophes, the two strings being separated by
1.30    ! cvs      7786: the arrow symbol (<tt>-&gt;</tt>), formed by the ``minus'' and ``greater
        !          7787: than'' characters.  The rule is terminated by a semi-colon.</p>
1.18      cvs      7788: <pre>     TextTransSeq = [ Alphabet ] TransSeq .
1.1       cvs      7789:      Alphabet     = NAME .
1.30    ! cvs      7790:      TransSeq     ='BEGIN' &lt; Translation &gt; 'END' ';' /
1.1       cvs      7791:                     Translation .
1.30    ! cvs      7792:      Translation  = Source [ '-&gt;' Target ] ';' .
1.1       cvs      7793:      Source       = STRING .
1.18      cvs      7794:      Target       = STRING .</pre>
1.30    ! cvs      7795: 
        !          7796: <p>One such rule signifies that when the source string appears in a text leaf
        !          7797: of the document being translated, the translator must replace it, in the
1.1       cvs      7798: translated document, with the target string.  The source string and the target
                   7799: string can have different lengths and the target string can be empty.  In this
                   7800: last case, the translator simply suppresses every occurrence of the source
1.18      cvs      7801: string in the translated document.</p>
1.30    ! cvs      7802: 
        !          7803: <p>For a given alphabet, the order of the rules is not important and has no
1.1       cvs      7804: significance because the T language compiler reorders the rules in ways that
                   7805: speed up the translator's work.  The total number of recoding rules is limited
1.18      cvs      7806: by the compiler as is the maximum length of the source and target strings.</p>
1.30    ! cvs      7807: 
        !          7808: <p>The recoding rules for symbols and graphical elements are written in the
        !          7809: same manner as the recoding rules for character strings.  They are preceded,
1.18      cvs      7810: respectively, by the <tt>SYMBTRANSLATE</tt> and <tt>GRAPHTRANSLATE</tt> and so
1.1       cvs      7811: not require a specification of the alphabet. Their source string is limited to
                   7812: one character, since, in Thot, each symbol and each graphical element is
                   7813: represented by a single character.  The symbol and graphical element codes are
1.18      cvs      7814: defined along with the <a href="#sect7">non-standard character codes</a>.</p>
1.30    ! cvs      7815: 
1.18      cvs      7816: <blockquote class="example">
1.30    ! cvs      7817:   <p><strong>Example:</strong></p>
        !          7818: 
        !          7819:   <p>In a translation schema producing documents destined for use with the
        !          7820:   L<sup>A</sup>T<sub><big>E</big></sub>X formatter, the Latin characters``é''
        !          7821:   (octal code 351 in Thot) and ``č'' (octal code 350 in Thot)  must be
        !          7822:   converted to their representation in
        !          7823:   L<sup>A</sup>T<sub><big>E</big></sub>X:</p>
        !          7824:   <pre>TEXTTRANSLATE Latin
1.1       cvs      7825:      BEGIN
1.30    ! cvs      7826:      '\350' -&gt; '\`{e}';    { e grave }
        !          7827:      '\351' -&gt; '\''{e}';   { e acute }
1.18      cvs      7828:      END;</pre>
                   7829: </blockquote>
                   7830: </div>
                   7831: </div>
                   7832: <hr>
                   7833: </div>
1.1       cvs      7834: 
1.18      cvs      7835: <div class="chapter">
1.30    ! cvs      7836: <h1><a name="sect6">Language grammars</a></h1>
1.1       cvs      7837: 
1.30    ! cvs      7838: <p>This chapter gives the complete grammars of the languages of Thot. The
1.1       cvs      7839: grammars were presented and described in the preceding chapters, which also
                   7840: specify the semantics of the languages.  This section gives only the
1.18      cvs      7841: syntax.</p>
1.1       cvs      7842: 
1.18      cvs      7843: <div class="section">
1.30    ! cvs      7844: <h2><a name="sectb61">The M meta-language</a></h2>
1.1       cvs      7845: 
1.30    ! cvs      7846: <p>The language grammars are all expressed in the same formalism, the M
1.18      cvs      7847: meta-language, which is defined in this section.</p>
                   7848: <pre>{ Any text between braces is a comment. }
1.30    ! cvs      7849: Grammar      = Rule &lt; Rule &gt; 'END' .
        !          7850:                { The &lt; and &gt; signs indicate zero }
1.1       cvs      7851:                { or more repetitions. }
                   7852:                { END marks the end of the grammar. }
                   7853: Rule         = Ident '=' RightPart '.' .
                   7854:                { The period indicates the end of a rule }
                   7855: RightPart    = RtTerminal / RtIntermed .
                   7856:                { The slash indicates a choice }
                   7857: RtTerminal   ='NAME' / 'STRING' / 'NUMBER' .
                   7858:                { Right part of a terminal rule }
1.30    ! cvs      7859: RtIntermed   = Possibility &lt; '/' Possibility &gt; .
1.1       cvs      7860:                { Right part of an intermediate rule }
1.30    ! cvs      7861: Possibility  = ElemOpt &lt; ElemOpt &gt; .
        !          7862: ElemOpt      = Element / '[' Element &lt; Element &gt; ']' /
        !          7863:               '&lt;' Element &lt; Element &gt; '&gt;'  .
1.1       cvs      7864:                { Brackets delimit optional parts }
                   7865: Element      = Ident / KeyWord .
                   7866: Ident        = NAME .
                   7867:                { Identifier, sequence of characters
                   7868: KeyWord      = STRING .
                   7869:                { Character string delimited by apostrophes }
1.18      cvs      7870: END</pre>
                   7871: </div>
1.1       cvs      7872: 
1.18      cvs      7873: <div class="section">
1.30    ! cvs      7874: <h2><a name="sectb62">The S language</a></h2>
1.1       cvs      7875: 
1.30    ! cvs      7876: <p>The S language is used to write structure schemas, which contain the
        !          7877: generic logical structures of document and object classes.  It is described
        !          7878: here in the M meta-language.</p>
1.18      cvs      7879: <pre>StructSchema   = 'STRUCTURE' [ 'EXTENSION' ] ElemID ';'
1.1       cvs      7880:                  'DEFPRES' PresID ';'
                   7881:                [ 'ATTR' AttrSeq ]
                   7882:                [ 'PARAM' RulesSeq ]
                   7883:                [ 'STRUCT' RulesSeq ]
                   7884:                [ 'EXTENS' ExtensRuleSeq ]
                   7885:                [ 'ASSOC' RulesSeq ]
                   7886:                [ 'UNITS' RulesSeq ]
                   7887:                [ 'EXPORT' SkeletonSeq ]
                   7888:                [ 'EXCEPT' ExceptSeq ]
                   7889:                  'END' .
                   7890: 
                   7891: ElemID         = NAME .
                   7892: PresID         = NAME .
                   7893: 
1.30    ! cvs      7894: AttrSeq        = Attribute &lt; Attribute &gt; .
1.1       cvs      7895: Attribute      = AttrID '=' AttrType ';' .
                   7896: AttrType       = 'INTEGER' / 'TEXT' /
                   7897:                  'REFERENCE' '(' RefType ')' /
                   7898:                  ValueSeq .
                   7899: RefType        = 'ANY' /
                   7900:                  [ FirstSec ] ElemID [ ExtStruct ] .
1.30    ! cvs      7901: ValueSeq       = AttrVal &lt; ',' AttrVal &gt; .
1.1       cvs      7902: AttrID         = NAME .
                   7903: FirstSec       = 'First' / 'Second' .
                   7904: ExtStruct      = '(' ElemID ')' .
                   7905: AttrVal        = NAME .
                   7906: 
1.30    ! cvs      7907: RulesSeq       = Rule &lt; Rule &gt; .
1.1       cvs      7908: Rule           = ElemID [ LocAttrSeq ] '='
                   7909:                  DefWithAttr ';' .
                   7910: LocAttrSeq     = '(' 'ATTR' LocalAttr
1.30    ! cvs      7911:                       &lt; ';' LocalAttr &gt; ')' .
1.1       cvs      7912: LocalAttr      = [ '!' ] AttrID [ '=' AttrType ] .
                   7913: DefWithAttr    = Definition
                   7914:                  [ '+' '(' ExtensionSeq ')' ]
                   7915:                  [ '-' '(' RestrictSeq ')' ]
                   7916:                  [ 'WITH' FixedAttrSeq ] .
1.30    ! cvs      7917: ExtensionSeq   = ExtensionElem &lt; ',' ExtensionElem &gt; .
1.1       cvs      7918: ExtensionElem  = ElemID / 'TEXT' / 'GRAPHICS' /
                   7919:                  'SYMBOL' / 'PICTURE' .
1.30    ! cvs      7920: RestrictSeq    = RestrictElem &lt; ',' RestrictElem &gt; .
1.1       cvs      7921: RestrictElem   = ElemID / 'TEXT' / 'GRAPHICS' /
                   7922:                  'SYMBOL' / 'PICTURE' .
1.30    ! cvs      7923: FixedAttrSeq   = FixedAttr &lt; ',' FixedAttr &gt; .
1.1       cvs      7924: FixedAttr      = AttrID [ FixedOrModifVal ] .
                   7925: FixedOrModifVal= [ '?' ] '=' FixedValue .
                   7926: FixedValue     = [ '-' ] NumValue / TextValue / AttrVal .
                   7927: NumValue       = NUMBER .
                   7928: TextValue      = STRING .
                   7929: 
                   7930: Definition     = BaseType [ LocAttrSeq ] / Constr /
                   7931:                  Element .
                   7932: BaseType       = 'TEXT' / 'GRAPHICS' / 'SYMBOL' /
                   7933:                  'PICTURE' / 'UNIT' / 'NATURE' .
                   7934: Element        = ElemID [ ExtOrDef ] .
                   7935: ExtOrDef       = 'EXTERN' / 'INCLUDED' /
                   7936:                  [ LocAttrSeq ] '=' Definition .
                   7937: 
                   7938: Constr         = 'LIST' [ '[' min '..' max ']' ] 'OF'
                   7939:                         '(' DefWithAttr ')' /
                   7940:                  'BEGIN' DefOptSeq 'END' /
                   7941:                  'AGGREGATE' DefOptSeq 'END' /
                   7942:                  'CASE' 'OF' DefSeq 'END' /
                   7943:                  'REFERENCE' '(' RefType ')' /
                   7944:                  'PAIR' .
                   7945: 
                   7946: min            = Integer / '*' .
                   7947: max            = Integer / '*' .
                   7948: Integer        = NUMBER .
                   7949: 
1.30    ! cvs      7950: DefOptSeq      = DefOpt ';' &lt; DefOpt ';' &gt; .
1.1       cvs      7951: DefOpt         = [ '?' ] DefWithAttr .
                   7952: 
1.30    ! cvs      7953: DefSeq         = DefWithAttr ';' &lt; DefWithAttr ';' &gt; .
1.1       cvs      7954: 
1.30    ! cvs      7955: SkeletonSeq    = SkeletonElem &lt; ',' SkeletonElem &gt; ';' .
1.1       cvs      7956: SkeletonElem   = ElemID [ 'WITH' Contents ] .
                   7957: Contents       = 'Nothing' / ElemID [ ExtStruct ] .
                   7958: 
1.30    ! cvs      7959: ExceptSeq      = Except ';' &lt; Except ';' &gt; .
1.1       cvs      7960: Except         = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr ':'
                   7961:                  ExcValSeq .
                   7962: ExcTypeOrAttr  = ElemID / AttrID .
1.30    ! cvs      7963: ExcValSeq      = ExcValue &lt; ',' ExcValue &gt; .
1.1       cvs      7964: ExcValue       = 'NoCut' / 'NoCreate' /
                   7965:                  'NoHMove' / 'NoVMove' / 'NoMove' /
                   7966:                  'NoHResize' / 'NoVResize' / 'NoResize' /
1.18      cvs      7967:                  'MoveResize' /
1.1       cvs      7968:                  'NewWidth' / 'NewHeight' /
                   7969:                  'NewHPos' / 'NewVPos' /
                   7970:                  'Invisible' / 'NoSelect' /
                   7971:                  'Hidden' / 'ActiveRef' /
                   7972:                  'ImportLine' / 'ImportParagraph' /
1.9       cvs      7973:                  'NoPaginate' / 'ParagraphBreak' /
                   7974:                  'HighlightChildren' / 'ExtendedSelection' /
1.29      cvs      7975:                  'ReturnCreateNL' / 'ReturnCreateWithin' .
1.1       cvs      7976: 
1.30    ! cvs      7977: ExtensRuleSeq  = ExtensRule ';' &lt; ExtensRule ';' &gt; .
1.1       cvs      7978: ExtensRule     = RootOrElem [ LocAttrSeq ]
                   7979:                  [ '+' '(' ExtensionSeq ')' ]
                   7980:                  [ '-' '(' RestrictSeq ')' ]
                   7981:                  [ 'WITH' FixedAttrSeq ] .
                   7982: RootOrElem     = 'Root' / ElemID .
                   7983: 
1.18      cvs      7984: END</pre>
                   7985: </div>
1.1       cvs      7986: 
1.18      cvs      7987: <div class="section">
1.30    ! cvs      7988: <h2><a name="sectb63">The P language</a></h2>
1.1       cvs      7989: 
1.30    ! cvs      7990: <p>The P language is used to write presentation schemas, which define the
1.1       cvs      7991: graphical presentation rules to be applied to different classes of documents
1.18      cvs      7992: and objects.  It is described here in the M meta-language.</p>
                   7993: <pre>PresSchema      = 'PRESENTATION' ElemID ';'
1.1       cvs      7994:                 [ 'VIEWS' ViewSeq ]
                   7995:                 [ 'PRINT' PrintViewSeq ]
                   7996:                 [ 'COUNTERS' CounterSeq ]
                   7997:                 [ 'CONST' ConstSeq ]
                   7998:                 [ 'VAR' VarSeq ]
                   7999:                 [ 'DEFAULT' ViewRuleSeq ]
                   8000:                 [ 'BOXES' BoxSeq ]
                   8001:                 [ 'RULES' PresentSeq ]
                   8002:                 [ 'ATTRIBUTES' PresAttrSeq ]
                   8003:                 [ 'TRANSMIT' TransmitSeq ]
                   8004:                   'END' .
                   8005: 
                   8006: ElemID          = NAME .
                   8007: 
                   8008: ViewSeq         = ViewDeclaration
1.30    ! cvs      8009:                   &lt; ',' ViewDeclaration &gt; ';' .
1.1       cvs      8010: ViewDeclaration = ViewID [ 'EXPORT' ] .
                   8011: ViewID          = NAME .
                   8012: 
1.30    ! cvs      8013: PrintViewSeq    = PrintView &lt; ',' PrintView &gt; ';' .
1.1       cvs      8014: PrintView       = ViewID / ElemID .
                   8015: 
1.30    ! cvs      8016: CounterSeq      = Counter &lt; Counter &gt; .
1.1       cvs      8017: Counter         = CounterID ':' CounterFunc ';' .
                   8018: CounterID       = NAME .
                   8019: CounterFunc     = 'RANK' 'OF' TypeOrPage [ SLevelAsc ]
                   8020:                   [ 'INIT' AttrID ] [ 'REINIT' AttrID ] /
1.30    ! cvs      8021:                   SetFunction &lt; SetFunction &gt;
        !          8022:                   AddFunction &lt; AddFunction &gt;
1.1       cvs      8023:                   [ 'INIT' AttrID ] /
1.16      cvs      8024:                   'RLEVEL' 'OF' ElemID .
1.1       cvs      8025: SLevelAsc       = [ '-' ] LevelAsc .
                   8026: LevelAsc        = NUMBER .
                   8027: SetFunction     = 'SET' CounterValue 'ON' TypeOrPage .
                   8028: AddFunction     = 'ADD' CounterValue 'ON' TypeOrPage .
                   8029: TypeOrPage      = 'Page' [ '(' ViewID ')' ] /
1.16      cvs      8030:                   [ '*' ] ElemID .
1.1       cvs      8031: CounterValue    = NUMBER .
                   8032: 
1.30    ! cvs      8033: ConstSeq        = Const &lt; Const &gt; .
1.1       cvs      8034: Const           = ConstID '=' ConstType ConstValue ';' .
                   8035: ConstID         = NAME .
                   8036: ConstType       = 'Text' [ Alphabet ] / 'Symbol' /
                   8037:                   'Graphics' / 'Picture' .
                   8038: ConstValue      = STRING .
                   8039: Alphabet        = NAME .
                   8040: 
1.30    ! cvs      8041: VarSeq          = Variable &lt; Variable &gt; .
1.1       cvs      8042: Variable        = VarID ':' FunctionSeq ';' .
                   8043: VarID           = NAME .
1.30    ! cvs      8044: FunctionSeq     = Function &lt; Function &gt; .
1.1       cvs      8045: Function        = 'DATE' / 'FDATE' /
                   8046:                   'DocName' / 'DirName' /
                   8047:                   'ElemName' / 'AttributeName' /
                   8048:                   ConstID / ConstType ConstValue /
                   8049:                   AttrID /
                   8050:                   'VALUE' '(' PageAttrCtr ','
                   8051:                   CounterStyle ')' .
                   8052: PageAttrCtr     = 'PageNumber' [ '(' ViewID ')' ] /
                   8053:                   [ MinMax ] CounterID / AttrID .
                   8054: CounterStyle    = 'Arabic' / 'LRoman' / 'URoman' /
                   8055:                   'Uppercase' / 'Lowercase' .
                   8056: MinMax          = 'MaxRangeVal' / 'MinRangeVal' .
                   8057: 
1.30    ! cvs      8058: BoxSeq          = Box &lt; Box &gt; .
1.1       cvs      8059: Box             = 'FORWARD' BoxID ';' /
                   8060:                   BoxID ':' ViewRuleSeq .
                   8061: BoxID           = NAME .
                   8062: 
1.30    ! cvs      8063: PresentSeq      = Present &lt; Present &gt; .
1.1       cvs      8064: Present         = [ '*' ] [ FirstSec ] ElemID ':'
                   8065:                   ViewRuleSeq .
                   8066: FirstSec        = 'First' / 'Second' .
                   8067: 
1.30    ! cvs      8068: PresAttrSeq     = PresAttr &lt; PresAttr &gt; .
1.1       cvs      8069: PresAttr        = AttrID [ '(' [ FirstSec ] ElemID ')' ] 
                   8070:                   [ AttrRelation ] ':' ViewRuleSeq .
                   8071: AttrID          = NAME .
                   8072: AttrRelation    = '=' AttrVal /
1.30    ! cvs      8073:                   '&gt;' [ '-' ] MinValue /
1.1       cvs      8074:                   '&lt;' [ '-' ] MaxValue /
                   8075:                   'IN' '[' [ '-' ] LowerBound '..' 
                   8076:                   [ '-' ] UpperBound ']' /
                   8077:                   'GREATER' AttrID /
                   8078:                   'EQUAL' AttrID /
                   8079:                   'LESS' AttrID .
                   8080: AttrVal         = [ '-' ] EqualNum / EqualText / AttrValue .
                   8081: MinValue        = NUMBER .
                   8082: MaxValue        = NUMBER .
                   8083: LowerBound      = NUMBER .
                   8084: UpperBound      = NUMBER.
                   8085: EqualNum        = NUMBER .
                   8086: EqualText       = STRING .
                   8087: AttrValue       = NAME .
                   8088: 
1.30    ! cvs      8089: ViewRuleSeq     = 'BEGIN' &lt; RulesAndCond &gt; &lt; ViewRules &gt;
1.1       cvs      8090:                   'END' ';' /
                   8091:                   ViewRules / CondRules / Rule .
                   8092: RulesAndCond    = CondRules / Rule .
                   8093: ViewRules       = 'IN' ViewID CondRuleSeq .
1.30    ! cvs      8094: CondRuleSeq     = 'BEGIN' &lt; RulesAndCond &gt; 'END' ';' /
1.1       cvs      8095:                   CondRules / Rule .
1.30    ! cvs      8096: CondRules       = CondRule &lt; CondRule &gt;
1.1       cvs      8097:                   [ 'Otherwise' RuleSeq ] .
                   8098: CondRule        = 'IF' ConditionSeq RuleSeq .
1.30    ! cvs      8099: RulesSeq        = 'BEGIN' Rule &lt; Rule &gt; 'END' ';' / Rule .
1.1       cvs      8100: 
1.30    ! cvs      8101: ConditionSeq    = Condition &lt; 'AND' Condition &gt; .
1.6       cvs      8102: Condition       = [ 'NOT' ] [ 'Target' ] ConditionElem .
                   8103: ConditionElem   = 'First' / 'Last' /
                   8104:                   [ 'Immediately' ] 'Within' [ NumParent ]
                   8105:                                      ElemID [ ExtStruct ] /
                   8106:                    ElemID /
                   8107:                   'Referred' / 'FirstRef' / 'LastRef' /
                   8108:                   'ExternalRef' / 'InternalRef' / 'CopyRef' /
                   8109:                   'AnyAttributes' / 'FirstAttr' / 'LastAttr' /
                   8110:                   'UserPage' / 'StartPage' / 'ComputedPage' /
                   8111:                   'Empty' /
                   8112:                   '(' [ MinMax ] CounterName CounterCond ')' /
                   8113:                   CondPage '(' CounterID ')' .
                   8114: NumParent       = [ GreaterLess ] NParent .
1.30    ! cvs      8115: GreaterLess     = '&gt;' / '&lt;' .
1.6       cvs      8116: NParent         = NUMBER.
1.30    ! cvs      8117: CounterCond     = '&lt;' MaxCtrVal / '&gt;' MinCtrVal /
1.6       cvs      8118:                   '=' EqCtrVal / 
                   8119:                   'IN' '[' ['-'] MinCtrBound '..' 
                   8120:                   ['-'] MaxCtrBound ']' .
                   8121: PageCond        = 'Even' / 'Odd' / 'One' .
                   8122: MaxCtrVal       = NUMBER .
                   8123: MinCtrVal       = NUMBER .
                   8124: EqCtrVal        = NUMBER .
                   8125: MaxCtrBound     = NUMBER .
                   8126: MinCtrBound     = NUMBER .
1.1       cvs      8127: 
                   8128: Rule            = PresParam ';' / PresFunc ';' .
                   8129: PresParam       = 'VertRef' ':' HorizPosition /
                   8130:                   'HorizRef' ':' VertPosition /
                   8131:                   'VertPos' ':' VPos /
                   8132:                   'HorizPos' ':' HPos /
                   8133:                   'Height' ':' Extent /
                   8134:                   'Width' ':' Extent /
                   8135:                   'VertOverflow' ':' Boolean /
                   8136:                   'HorizOverflow' ':' Boolean /
1.26      cvs      8137:                   'MarginTop' ':' MarginWidth /
                   8138:                   'MarginRight' ':' MarginWidth /
                   8139:                   'MarginBottom' ':' MarginWidth /
                   8140:                   'MarginLeft' ':' MarginWidth /
                   8141:                   'PaddingTop' ':' PaddingWidth /
                   8142:                   'PaddingRight' ':' PaddingWidth /
                   8143:                   'PaddingBottom' ':' PaddingWidth /
                   8144:                   'PaddingLeft' ':' PaddingWidth /
                   8145:                   'BorderTopWidth' ':' BorderWidth /
                   8146:                   'BorderRightWidth' ':' BorderWidth /
                   8147:                   'BorderBottomWidth' ':' BorderWidth /
                   8148:                   'BorderLeftWidth' ':' BorderWidth /
                   8149:                   'BorderTopColor' ':' BorderColor /
                   8150:                   'BorderRightColor' ':' BorderColor /
                   8151:                   'BorderBottomColor' ':' BorderColor /
                   8152:                   'BorderLeftColor' ':' BorderColor /
                   8153:                   'BorderTopStyle' ':' BorderStyle /
                   8154:                   'BorderRightStyle' ':' BorderStyle /
                   8155:                   'BorderBottomStyle' ':' BorderStyle /
                   8156:                   'BorderLeftStyle' ':' BorderStyle .
1.1       cvs      8157:                   'LineSpacing' ':' DistOrInherit /
                   8158:                   'Indent' ':' DistOrInherit /
                   8159:                   'Adjust' ':' AlignOrInherit /
                   8160:                   'Justify' ':' BoolInherit /
                   8161:                   'Hyphenate' ':' BoolInherit /
                   8162:                   'PageBreak' ':' Boolean /
                   8163:                   'LineBreak' ':' Boolean /
                   8164:                   'InLine' ':' Boolean /
                   8165:                   'NoBreak1' ':' AbsDist /
                   8166:                   'NoBreak2' ':' AbsDist /
                   8167:                   'Gather' ':' Boolean /
                   8168:                   'Visibility' ':' NumberInherit /
                   8169:                   'Size'  ':' SizeInherit /
                   8170:                   'Font' ':' NameInherit /
                   8171:                   'Style' ':' StyleInherit /
1.23      cvs      8172:                   'Weight' ':' WeightInherit /
1.1       cvs      8173:                   'Underline' ':' UnderLineInherit /
                   8174:                   'Thickness' ':' ThicknessInherit /
                   8175:                   'Depth' ':' NumberInherit /
                   8176:                   'LineStyle' ':' LineStyleInherit /
                   8177:                   'LineWeight' ':' DistOrInherit /
                   8178:                   'FillPattern' ':' NameInherit /
1.30    ! cvs      8179:                   'Background' ':' Color /
        !          8180:                   'Foreground' ':' Color /
1.1       cvs      8181:                   'Content' ':' VarConst .
                   8182: PresFunc        = Creation '(' BoxID ')' /
                   8183:                   'Line' /
                   8184:                   'NoLine' /
                   8185:                   'Page' '(' BoxID ')' /
1.13      cvs      8186:                   'Copy' '(' BoxTypeToCopy ')' /
                   8187:                   'ShowBox' /
1.18      cvs      8188:                   'BackgroundPicture' ':' FileName /
                   8189:                   'PictureMode' ':' PictMode .
1.1       cvs      8190: 
                   8191: BoxTypeToCopy   = BoxID [ ExtStruct ] /
                   8192:                    ElemID [ ExtStruct ] .
                   8193: ExtStruct       = '(' ElemID ')' .
                   8194: 
                   8195: Distance        = [ Sign ] AbsDist .
                   8196: Sign            = '+' / '-' .
                   8197: AbsDist         = IntegerOrAttr [ '.' DecimalPart ]
                   8198:                   [ Unit ] .
                   8199: IntegerOrAttr   = IntegerPart / AttrID .
                   8200: IntegerPart     = NUMBER .
                   8201: DecimalPart     = NUMBER .
                   8202: Unit            = 'em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' /
                   8203:                   'pc' / 'px' / '%' .
                   8204: 
                   8205: HPos            = 'nil' / VertAxis '=' HorizPosition 
                   8206:                   [ 'UserSpecified' ] .
                   8207: VPos            = 'nil' / HorizAxis '=' VertPosition 
                   8208:                   [ 'UserSpecified' ] .
                   8209: VertAxis        = 'Left' / 'VMiddle' / 'VRef' / 'Right' .
                   8210: HorizAxis       = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' .
                   8211: 
1.6       cvs      8212: VertPosition    = Reference '.' HorizAxis [ Distance ] .
                   8213: HorizPosition   = Reference '.' VertAxis [ Distance ] .
                   8214: Reference       = 'Enclosing' [ BoxTypeNot ] /
                   8215:                   'Enclosed' [ BoxTypeNot ] /
                   8216:                   'Previous' [ BoxTypeNot ] /
                   8217:                   'Next' [ BoxTypeNot ] /
                   8218:                   'Referred' [ BoxTypeNot ] /
                   8219:                   'Creator' /
                   8220:                   'Root' /
                   8221:                   '*' /
                   8222:                   BoxOrType .
                   8223: BoxOrType       = BoxID /
                   8224:                   [ '*' ] [ FirstSec ] ElemID /
1.17      cvs      8225:                   'AnyElem' / 'AnyBox' /
                   8226:                   'ElemWithAttr' AttrID .
1.6       cvs      8227: BoxTypeNot      = [ 'NOT' ] BoxOrType .
                   8228: 
                   8229: Extent          = Reference '.' HeightWidth
                   8230:                   [ Relation ] [ 'Min' ] /
                   8231:                   AbsDist [ 'UserSpecified' ] [ 'Min' ] /
                   8232:                   HPos / VPos .
                   8233: HeightWidth     = 'Height' / 'Width' .
                   8234: Relation        = '*' ExtentAttr '%' / Distance .
                   8235: ExtentAttr      = ExtentVal / AttrID .
                   8236: ExtentVal       = NUMBER .
1.26      cvs      8237: 
                   8238: MarginWidth     = InheritParent / 'Auto' / Distance .
                   8239: PaddingWidth    = InheritParent / Distance .
                   8240: BorderWidth     = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance .
                   8241: BorderColor     = InheritParent / 'Transparent' / 'Foreground' /
                   8242:                   ColorName .
                   8243: BorderStyle     = InheritParent /
                   8244:                   'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' /
                   8245:                   'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' .
1.27      cvs      8246: InheritParent   = 'Enclosing' '=' / 'Creator' '=' .
1.26      cvs      8247: ColorName       = NAME .
1.6       cvs      8248: 
                   8249: Inheritance     = Kinship  InheritedValue .
                   8250: Kinship         = 'Enclosing' / 'GrandFather'/ 'Enclosed' /
                   8251:                   'Previous' / 'Creator' .
                   8252: InheritedValue  = '+' PosIntAttr [ 'Max' maximumA ] /
                   8253:                   '-' NegIntAttr [ 'Min' minimumA ] /
                   8254:                   '=' .
                   8255: PosIntAttr      = PosInt / AttrID .
                   8256: PosInt          = NUMBER .
                   8257: NegIntAttr      = NegInt / AttrID .
                   8258: NegInt          = NUMBER .
                   8259: maximumA        = maximum / AttrID .
                   8260: maximum         = NUMBER .
                   8261: minimumA        = minimum / AttrID .
                   8262: minimum         = NUMBER .
                   8263: 
                   8264: AlignOrInherit  = Kinship '=' / Alignment .
                   8265: Alignment       = 'Left' / 'Right' / 'VMiddle' /
                   8266:                   'LeftWithDots' .
1.1       cvs      8267: 
1.6       cvs      8268: DistOrInherit   = Kinship InheritedDist / Distance .
                   8269: InheritedDist   = '=' / '+' AbsDist / '-' AbsDist .
1.1       cvs      8270: 
1.6       cvs      8271: BoolInherit     = Boolean / Kinship '=' .
                   8272: Boolean         = 'Yes' / 'No' .
1.1       cvs      8273: 
1.6       cvs      8274: NumberInherit   = Integer / AttrID / Inheritance .
                   8275: Integer         = NUMBER .
1.1       cvs      8276: 
                   8277: LineStyleInherit= Kinship '=' / 'Solid' / 'Dashed' /
                   8278:                   'Dotted' .
                   8279: 
1.6       cvs      8280: SizeInherit     = SizeAttr [ 'pt' ] / Kinship InheritedSize .
                   8281: InheritedSize   = '+' SizeAttr [ 'pt' ]
                   8282:                       [ 'Max' MaxSizeAttr ] /
                   8283:                   '-' SizeAttr [ 'pt' ]
                   8284:                       [ 'Min' MinSizeAttr ] /
1.22      cvs      8285:                   '*' PercentSizeAttr '%' /
1.6       cvs      8286:                   '=' .
                   8287: SizeAttr        = Size / AttrID .
                   8288: Size            = NUMBER .
                   8289: MaxSizeAttr     = MaxSize / AttrID .
                   8290: MaxSize         = NUMBER .
                   8291: MinSizeAttr     = MinSize / AttrID .
                   8292: MinSize         = NUMBER .
1.22      cvs      8293: PercentSizeAttr = PercentSize / AttrID .
                   8294: PercentSize     = NUMBER .
1.6       cvs      8295: 
                   8296: NameInherit     = Kinship '=' / FontName .
                   8297: FontName        = NAME .
1.30    ! cvs      8298: Color           = 'Transparent' / Kinship '=' / FontName .
1.6       cvs      8299: StyleInherit    = Kinship '=' /
1.23      cvs      8300:                   'Roman' / 'Italics' / 'Oblique' .
                   8301: WeightInherit   = Kinship '=' /
                   8302:                   'Normal' / 'Bold' .
1.1       cvs      8303: UnderLineInherit= Kinship '=' /
1.6       cvs      8304:                   'NoUnderline' / 'Underlined' / 
                   8305:                   'Overlined' / 'CrossedOut' .
1.1       cvs      8306: ThicknessInherit= Kinship '=' / 'Thick' / 'Thin' .
1.13      cvs      8307: 
                   8308: FileName =        STRING .
                   8309: PictMode =        'NormalSize' / 'Scale' /
                   8310:                   'RepeatXY' / 'RepeatX' / 'RepeatY' .
1.1       cvs      8311: 
1.6       cvs      8312: VarConst        = ConstID / ConstType ConstValue /
                   8313:                   VarID / '(' FunctionSeq ')' /
                   8314:                   ElemID .
                   8315: 
                   8316: Creation        = Create [ 'Repeated' ] .
                   8317: Create          = 'CreateFirst' / 'CreateLast' /
                   8318:                   'CreateBefore' / 'CreateAfter' /
                   8319:                   'CreateEnclosing' .
                   8320: 
1.30    ! cvs      8321: TransmitSeq     = Transmit &lt; Transmit &gt; .
1.6       cvs      8322: Transmit        = TypeOrCounter 'To' ExternAttr
                   8323:                   '(' ElemID ')' ';' .
                   8324: TypeOrCounter   = CounterID / ElemID .
                   8325: ExternAttr      = NAME .
1.1       cvs      8326: 
1.18      cvs      8327: END</pre>
                   8328: </div>
1.1       cvs      8329: 
1.18      cvs      8330: <div class="section">
                   8331: <h2><a name="sectb64">The T language</a></h2>
                   8332: <pre>TransSchema   = 'TRANSLATION' ElemID ';'
1.1       cvs      8333:               [ 'LINELENGTH' LineLength ';' ]
                   8334:               [ 'LINEEND' CHARACTER ';' ]
                   8335:               [ 'LINEENDINSERT' STRING ';' ]
                   8336:               [ 'BUFFERS' BufferSeq ]
                   8337:               [ 'COUNTERS' CounterSeq ]
                   8338:               [ 'CONST' ConstSeq ]
                   8339:               [ 'VAR' VariableSeq ]
                   8340:                 'RULES' ElemSeq
                   8341:               [ 'ATTRIBUTES' AttrSeq ]
                   8342:               [ 'PRESENTATION' PresSeq ]
1.30    ! cvs      8343:               &lt; 'TEXTTRANSLATE' TextTransSeq &gt;
1.1       cvs      8344:               [ 'SYMBTRANSLATE' TransSeq ]
                   8345:               [ 'GRAPHTRANSLATE' TransSeq ]
                   8346:                 'END' .
                   8347: 
                   8348: LineLength    = NUMBER .
                   8349: 
1.30    ! cvs      8350: BufferSeq     = Buffer &lt; Buffer &gt; .
1.1       cvs      8351: Buffer        = BufferID [ '(' 'Picture' ')' ] ';' .
                   8352: BufferID      = NAME .
                   8353: 
1.30    ! cvs      8354: CounterSeq    = Counter &lt; Counter &gt; .
1.1       cvs      8355: Counter       = CounterID [ ':' CounterFunc ] ';' .
                   8356: CounterID     = NAME .
                   8357: CounterFunc   = 'Rank' 'of' ElemID [ SLevelAsc ]
                   8358:                 [ 'Init' AttrID ] /
                   8359:                 'Rlevel' 'of' ElemID /
                   8360:                 'Set' InitValue 'On' ElemID
                   8361:                       'Add' Increment 'On' ElemID
                   8362:                       [ 'Init' AttrID ] .
                   8363: SLevelAsc     = [ '-' ] LevelAsc .
                   8364: LevelAsc      =  NUMBER .
                   8365: InitValue     = NUMBER .
                   8366: Increment     = NUMBER .
                   8367: ElemID        = NAME .
                   8368: AttrID        = NAME .
                   8369: 
1.30    ! cvs      8370: ConstSeq      = Const &lt; Const &gt; .
1.1       cvs      8371: Const         = ConstID '=' ConstValue ';' .
                   8372: ConstID       = NAME .
                   8373: ConstValue    = STRING .
                   8374: 
1.30    ! cvs      8375: VariableSeq   = Variable &lt; Variable &gt; .
        !          8376: Variable      = VarID ':' Function &lt; Function &gt; ';' .
1.1       cvs      8377: VarID         = NAME .
                   8378: Function      = 'Value' '(' CounterID [ ':' Length ]
                   8379:                           [ ',' CounterStyle ]  ')' /
                   8380:                 'FileDir' / 'FileName' / 'Extension' /
                   8381:                 'DocumentName' / 'DocumentDir' /
                   8382:                 ConstID / CharString / 
                   8383:                 BufferID / AttrID .
                   8384: Length        = NUMBER .
                   8385: CounterStyle=   'Arabic' / 'LRoman' / 'URoman' /
                   8386:                 'Uppercase' / 'Lowercase' .
                   8387: CharString    = STRING .
                   8388: 
1.30    ! cvs      8389: ElemSeq       = TransType &lt; TransType &gt; .
1.1       cvs      8390: TransType     = [ FirstSec ] ElemID ':' RuleSeq .
                   8391: FirstSec      = 'First' / 'Second' .
1.30    ! cvs      8392: RuleSeq       = Rule / 'BEGIN' &lt; Rule &gt; 'END' ';' .
1.1       cvs      8393: Rule          = SimpleRule / ConditionBlock .
                   8394: ConditionBlock= 'IF' ConditionSeq SimpleRuleSeq .
1.30    ! cvs      8395: SimpleRuleSeq = 'BEGIN' &lt; SimpleRule &gt; 'END' ';' / 
1.1       cvs      8396:                 SimpleRule .
                   8397: 
                   8398: ConditionSeq  = Condition [ 'AND' Condition ] .
                   8399: Condition     = [ 'NOT' ] [ 'Target' ] Cond .
                   8400: Cond          = CondElem / CondAscend .
                   8401: CondElem      = 'FirstRef' / 'LastRef' /
                   8402:                 'ExternalRef' /
                   8403:                 'Defined' /
                   8404:                 'Alphabet' '=' Alphabet /
                   8405:                 'ComputedPage' / 'StartPage' / 
                   8406:                 'UserPage' / 'ReminderPage' /
                   8407:                 'Empty' /
1.18      cvs      8408:                 ElemID /
1.1       cvs      8409:                 'FirstAttr' / 'LastAttr' .
                   8410: CondAscend    = [ Ascend ] CondOnAscend .
                   8411: Ascend        = '*' / 'Parent' / 'Ancestor' LevelOrType .
                   8412: LevelOrType   = CondRelLevel / ElemID [ ExtStruct ] .
                   8413: CondRelLevel  = NUMBER .
                   8414: CondOnAscend  = 'First' / 'Last' /
                   8415:                 'Referred' / 
                   8416:                 [ 'Immediately' ] 'Within' [ NumParent ]
                   8417:                                   ElemID [ ExtStruct ] /
                   8418:                 'Attributes' /
                   8419:                 AttrID [ RelatAttr ] /
                   8420:                 'Presentation' /
                   8421:                 PresRule /
                   8422:                 'Comment' .                  
                   8423: NumParent     = [ GreaterLess ] NParent .
1.30    ! cvs      8424: GreaterLess   = '&gt;' / '&lt;' .
1.1       cvs      8425: NParent       = NUMBER.
                   8426: Alphabet      = NAME .
                   8427: RelatAttr     = '=' Value /
1.30    ! cvs      8428:                  '&gt;' [ '-' ] Minimum /
1.1       cvs      8429:                  '&lt;' [ '-' ] Maximum /
                   8430:                  'IN' '[' [ '-' ] MinInterval '..'
                   8431:                           [ '-' ] MaxInterval ']' .
                   8432: Value         = [ '-' ] IntegerVal / TextVal / AttrValue .
                   8433: Minimum       = NUMBER .
                   8434: Maximum       = NUMBER .
                   8435: MinInterval   = NUMBER .
                   8436: MaxInterval   = NUMBER .
                   8437: IntegerVal    = NUMBER .
                   8438: TextVal       = STRING .
                   8439: AttrValue     = NAME .
                   8440: 
                   8441: SimpleRule    = 'Create' [ 'IN' VarID ] Object
                   8442:                        [ Position ] ';' /
                   8443:                 'Write' Object [ Position ] ';' /
                   8444:                 'Read' BufferID [ Position ] ';' /
                   8445:                 'Include' File [ Position ] ';' /
1.6       cvs      8446:                 'Get'  [ RelPosition ] ElemID 
                   8447:                        [ ExtStruct ] 
                   8448:                        [ Position ] ';' /
1.1       cvs      8449:                 'Copy' [ RelPosition ] ElemID 
                   8450:                        [ ExtStruct ] 
                   8451:                        [ Position ] ';' /
                   8452:                 'Use' TrSchema [ 'For' ElemID ] ';' /
                   8453:                 'Remove' ';' /
                   8454:                 'NoTranslation' ';' /
                   8455:                 'NoLineBreak' ';' /
                   8456:                 'ChangeMainFile' VarID [ Position ] ';' /
1.14      cvs      8457:                 'RemoveFile' VarID [ Position ] ';' /
1.10      cvs      8458:                 'Set' CounterID InitValue [ Position ] ';' /
                   8459:                 'Add' CounterID Increment [ Position ] ';' /
1.25      cvs      8460:                 'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .
1.10      cvs      8461: 
1.25      cvs      8462: Indent        = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue .
1.10      cvs      8463: IndentSign    = '+' / '-' .
                   8464: IndentValue   = NUMBER .
1.1       cvs      8465: 
                   8466: Object        = ConstID / CharString /
                   8467:                 BufferID /
                   8468:                 VarID /
1.30    ! cvs      8469:                 '(' Function &lt; Function &gt; ')' /
1.21      cvs      8470:                  [ 'Translated' ] AttrID /
1.1       cvs      8471:                 'Value' /
                   8472:                 'Content' /
                   8473:                 'Comment' / 
                   8474:                 'Attributes' /
                   8475:                 'Presentation' /
                   8476:                 'RefId' /
                   8477:                 'PairId' /
                   8478:                 'FileDir' / 'FileName' / 'Extension' /
                   8479:                 'DocumentName' / 'DocumentDir' /
                   8480:                 [ 'Referred' ] ReferredObject .
                   8481: Position      = 'After' / 'Before' .
                   8482: 
1.6       cvs      8483: ReferredObject= VarID /
                   8484:                 ElemID [ ExtStruct ] /
                   8485:                 'RefId' /
                   8486:                 'DocumentName' / 'DocumentDir' .                
1.1       cvs      8487: 
1.6       cvs      8488: File          = FileName / BufferID .
                   8489: FileName      = STRING .
1.1       cvs      8490: 
1.6       cvs      8491: RelPosition   = 'Included' / 'Referred' .
                   8492: ExtStruct     = '(' ElemID ')' .
1.1       cvs      8493: 
1.6       cvs      8494: TrSchema      = NAME .
                   8495: 
1.30    ! cvs      8496: AttrSeq       = TransAttr &lt; TransAttr &gt; .
1.6       cvs      8497: TransAttr     = AttrID [ '(' ElemID ')' ] 
                   8498:                 [ RelatAttr ] ':' RuleSeq .
                   8499: 
1.30    ! cvs      8500: PresSeq       = PresTrans &lt; PresTrans &gt; .
1.6       cvs      8501: PresTrans     = PresRule ':' RuleSeq .
                   8502: PresRule      = 'Size' [ PresRelation ] /
                   8503:                 'Indent' [ PresRelation ] /
                   8504:                 'LineSpacing' [ PresRelation ] /
                   8505:                 'Adjust' [ '=' AdjustVal ] /
                   8506:                 'Justify' [ '=' BoolVal ] /
                   8507:                 'Hyphenate' [ '=' BoolVal ] /
                   8508:                 'Style' [ '=' StyleVal ] /
1.24      cvs      8509:                 'Weight' [ '=' WeightVal ] /
1.6       cvs      8510:                 'Font' [ '=' FontVal ] /
                   8511:                 'UnderLine' [ '=' UnderLineVal ] /
                   8512:                 'Thickness' [ '=' ThicknessVal ] /
                   8513:                 'LineStyle' [ '=' LineStyleVal ] /
                   8514:                 'LineWeight' [ PresRelation ] /
                   8515:                 'FillPattern' [ '=' Pattern ] /
                   8516:                 'Background' [ '=' Color ] /
                   8517:                 'Foreground' [ '=' Color ] .
                   8518: 
                   8519: PresRelation  = '=' PresValue /
1.30    ! cvs      8520:                 '&gt;' [ '-' ] PresMinimum /
1.6       cvs      8521:                 '&lt;' [ '-' ] PresMaximum /
                   8522:                 'IN' '[' [ '-' ] PresIntervalMin '..'
                   8523:                          [ '-' ] PresIntervalMax ']' .
                   8524: AdjustVal     = 'Left' / 'Right' / 'VMiddle' / 
                   8525:                 'LeftWithDots' .
                   8526: BoolVal       = 'Yes' / 'No' .
1.24      cvs      8527: StyleVal      = 'Roman' / 'Italics' / 'Oblique' .
                   8528: WeightVal     = 'Normal' / 'Bold' .
1.6       cvs      8529: FontVal       = 'Times' / 'Helvetica' / 'Courier' .
                   8530: UnderLineVal  = 'NoUnderline' / 'UnderLined' /
                   8531:                 'OverLined' / 'CrossedOut' .
                   8532: ThicknessVal  = 'Thick' / 'Thin' .
                   8533: LineStyleVal  = 'Solid' / 'Dashed' / 'Dotted' .
                   8534: Pattern       = NAME .
                   8535: Color         = NAME .
                   8536: PresMinimum   = NUMBER .
                   8537: PresMaximum   = NUMBER .
1.1       cvs      8538: PresIntervalMin= NUMBER .
                   8539: PresIntervalMax= NUMBER .
1.6       cvs      8540: PresValue     = [ '-' ] PresVal .
                   8541: PresVal       = NUMBER .
1.1       cvs      8542: 
1.6       cvs      8543: TextTransSeq  = [ Alphabet ] TransSeq .
                   8544: Alphabet      = NAME .
1.30    ! cvs      8545: TransSeq      = 'BEGIN' &lt; Translation &gt; 'END' ';' /
1.6       cvs      8546:                 Translation .
1.30    ! cvs      8547: Translation   = Source [ '-&gt;' Target ] ';' .
1.6       cvs      8548: Source        = STRING .
1.18      cvs      8549: Target        = STRING .</pre>
                   8550: </div>
                   8551: <hr>
                   8552: </div>
1.1       cvs      8553: 
1.18      cvs      8554: <div class="chapter">
                   8555: <h1><a name="sect7">Character coding</a></h1>
1.1       cvs      8556: 
1.18      cvs      8557: <div class="section">
1.30    ! cvs      8558: <h2><a name="sectb71">Characters</a></h2>
1.1       cvs      8559: 
1.30    ! cvs      8560: <p>The characters of the Latin alphabet follow the encoding defined in the ISO
1.5       cvs      8561: 8859-1 (ISO Latin-1) standard.  The characters of the Greek alphabet follow
1.18      cvs      8562: the encoding defined by Adobe for its Symbol font (Adobe FontSpecific).</p>
1.30    ! cvs      8563: 
        !          8564: <p>Characters whose octal code is greater than 0200 are written in the form of
1.1       cvs      8565: their octal code preceded by a backslash character (``\'').  For example, the
1.30    ! cvs      8566: French word 'Résumé' is written <tt>R\351sum\351</tt>.</p>
        !          8567: 
        !          8568: <p>To the ISO 8859-1 encoding four characters with the following codes have
        !          8569: been added:<br>
1.18      cvs      8570: <tt>212</tt>: line break<br>
                   8571: <tt>240</tt>: sticky space<br>
                   8572: <tt>201</tt>: thin space<br>
                   8573: <tt>202</tt>: en space</p>
1.30    ! cvs      8574: 
        !          8575: <p>The <tt>212</tt> character is a ``line break'' character which forces a
        !          8576: line break.  The <tt>240</tt> character is a ``sticky space'', which cannot be
1.18      cvs      8577: replaced by a line break.</p>
                   8578: </div>
1.1       cvs      8579: 
1.18      cvs      8580: <div class="section">
1.30    ! cvs      8581: <h2><a name="sectb72">Symbols</a></h2>
1.1       cvs      8582: 
1.30    ! cvs      8583: <p>The table below gives the codes for the symbols of Thot.  Symbols can be
        !          8584: used in presentation schemas constants and in transcoding rules of translation
1.18      cvs      8585: schemas.  Each symbol is represented by a single character.</p>
                   8586: <ul>
1.30    ! cvs      8587:   <li><tt>r</tt>: a radical</li>
        !          8588:   <li><tt>i</tt>: a simple integral</li>
        !          8589:   <li><tt>c</tt>: a curvilinear integral</li>
        !          8590:   <li><tt>d</tt>: a double integral</li>
        !          8591:   <li><tt>t</tt>: a triple integral</li>
        !          8592:   <li><tt>S</tt>: the summation symbol</li>
        !          8593:   <li><tt>P</tt>: the product symbol</li>
        !          8594:   <li><tt>U</tt>: the union symbol</li>
        !          8595:   <li><tt>I</tt>: the intersection symbol</li>
        !          8596:   <li><tt>&gt;</tt>: a right arrow</li>
        !          8597:   <li><tt>&lt;</tt>: a left arrow</li>
        !          8598:   <li><tt>^</tt>:  an up arrow</li>
        !          8599:   <li><tt>V</tt>: a down arrow</li>
        !          8600:   <li><tt>(</tt>: an opening parenthesis</li>
        !          8601:   <li><tt>)</tt>: a closing parenthesis</li>
        !          8602:   <li><tt>{</tt>: an opening brace</li>
        !          8603:   <li><tt>}</tt>: a closing brace</li>
        !          8604:   <li><tt>[</tt>: an opening bracket</li>
        !          8605:   <li><tt>]</tt>: a closing bracket</li>
1.18      cvs      8606: </ul>
                   8607: </div>
1.1       cvs      8608: 
1.18      cvs      8609: <div class="section">
1.30    ! cvs      8610: <h2><a name="sectb73">Graphical elements</a></h2>
1.1       cvs      8611: 
1.30    ! cvs      8612: <p>The table below gives the codes for the graphical elements of Thot. These
1.1       cvs      8613: elements can be used in presentation schemas constants and in transcoding
                   8614: rules of translation schemas.  Each graphical element is represented by a
1.18      cvs      8615: single character.</p>
                   8616: <ul>
1.30    ! cvs      8617:   <li>a: a circle</li>
        !          8618:   <li><p><tt>A</tt>: an open curve with an arrow head at the end</p>
        !          8619:   </li>
        !          8620:   <li><tt>b</tt>: a horizontal line along the lower side of the box</li>
        !          8621:   <li><tt>B</tt>: an open curve</li>
        !          8622:   <li><tt>c</tt>: an ellipse inscribed in the box</li>
        !          8623:   <li><tt>C</tt>: a rectangle with rounded corners</li>
        !          8624:   <li><tt>D</tt>: an open curve with two arrow heads</li>
        !          8625:   <li><tt>e</tt>: The northwest/southeast diagonal of the box with an
        !          8626:     arrowhead at the bottom</li>
        !          8627:   <li><tt>E</tt>: The southwest/northeast diagonal of the box with an
        !          8628:     arrowhead at the top</li>
        !          8629:   <li><tt>F</tt>: an open curve with an arrow head at start</li>
        !          8630:   <li><tt>g</tt>: a line from the origin of the box to its opposite
        !          8631:   corner</li>
        !          8632:   <li><tt>h</tt>: a horizontal line as wide as the box and placed in its
        !          8633:     middle</li>
        !          8634:   <li><tt>l</tt>: a vertical line on the left side of the box</li>
        !          8635:   <li><tt>L</tt>: a lozenge</li>
        !          8636:   <li><tt>M</tt>: an open broken line with two arrow heads</li>
        !          8637:   <li><tt>N</tt>: an open broken line with an arrow head at start</li>
        !          8638:   <li><tt>o</tt>: The southwest/northeast diagonal of the box with an
        !          8639:     arrowhead at the bottom</li>
        !          8640:   <li><tt>O</tt>: The northwest/southeast diagonal of the box with an
        !          8641:     arrowhead at the top</li>
        !          8642:   <li><tt>p</tt>: a polygon</li>
        !          8643:   <li><tt>P</tt>: a rectangle with round corners and a horizontal bar at the
        !          8644:     top</li>
        !          8645:   <li><tt>Q</tt>: an ellipse with a horizontal bar at the top</li>
        !          8646:   <li><tt>r</tt>: a vertical line on the right side of the box</li>
        !          8647:   <li><tt>R</tt>: a rectangle which is the shape of the box</li>
        !          8648:   <li><tt>s</tt>: a closed curve</li>
        !          8649:   <li><tt>S</tt>: an open broken line</li>
        !          8650:   <li><tt>t</tt>: a horizontal line along the upper side of the box</li>
        !          8651:   <li><tt>U</tt>: an open broken line with an arrow head at the end</li>
        !          8652:   <li><tt>v</tt>: a vertical line as tall as the box and placed in its
        !          8653:   middle</li>
        !          8654:   <li><tt>V</tt>: a down arrow as tall as the box and in its middle</li>
        !          8655:   <li>w: a segment (2 points)</li>
        !          8656:   <li><tt>W</tt>: the upper right corner</li>
        !          8657:   <li>x: a segment (2 points) with an arrow head at the end</li>
        !          8658:   <li><tt>X</tt>: the lower right corner</li>
        !          8659:   <li>y: a segment (2 points) with an arrow head at the end</li>
        !          8660:   <li><tt>Y</tt>: the lower left corner</li>
        !          8661:   <li>z: a segment (2 points) with an arrow head at the end</li>
        !          8662:   <li><tt>Z</tt>: the upper left corner</li>
        !          8663:   <li><tt>space</tt>: a transparent element</li>
        !          8664:   <li><tt>^</tt>: an up arrow as tall as the box and in its middle</li>
        !          8665:   <li><tt>&gt;</tt>: a right arrow as long as the box's width and in its
        !          8666:     middle</li>
        !          8667:   <li><tt>&gt;</tt>: a left arrow as long as the box's width and in its
        !          8668:   middle</li>
        !          8669:   <li><tt>/</tt>: The southwest/northeast diagonal of the box</li>
        !          8670:   <li><tt>\</tt>: the northwest/southeast diagonal of the box</li>
1.18      cvs      8671: </ul>
                   8672: <hr>
                   8673: </div>
                   8674: </div>
                   8675: </body>
                   8676: </html>

Webmaster