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

1.37    ! cvs         1: <?xml version="1.0" encoding="iso-8859-1"?>
        !             2: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        !             3:     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        !             4: <html xmlns="http://www.w3.org/1999/xhtml">
1.18      cvs         5: <head>
1.30      cvs         6:   <title>The Languages of Thot</title>
1.37    ! cvs         7:   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
1.18      cvs         8: </head>
1.30      cvs         9: 
1.18      cvs        10: <body>
                     11: 
1.19      cvs        12: <div class="frontmatter" align="center">
1.18      cvs        13: <h1>The Languages of Thot</h1>
                     14: 
                     15: <h3>Vincent Quint</h3>
                     16: 
                     17: <h4>Translated from French by Ethan Munson</h4>
                     18: 
1.37    ! cvs        19: <h4>Version of April 16, 2001</h4>
1.30      cvs        20: 
1.37    ! cvs        21: <p>© 1996-2001 INRIA</p>
        !            22: <hr />
1.18      cvs        23: </div>
                     24: 
                     25: <div class="tableofcontents">
                     26: <h2><a href="languages.toc.html">Contents</a></h2>
                     27: <ul>
1.37    ! cvs        28:   <li><big><a href="#sect2">The document model of Thot</a></big> 
1.30      cvs        29:     <ul>
                     30:       <li><strong><a href="#sectb21">The logical structure of
                     31:         documents</a></strong></li>
                     32:       <li><strong><a href="#sectb22">Generic and specific
                     33:         structures</a></strong></li>
                     34:       <li><strong><a href="#sectb23">Logical structure and physical
                     35:         structure</a></strong></li>
                     36:       <li><strong><a href="#sectb24">Document structures and object
                     37:         structures</a></strong></li>
                     38:     </ul>
                     39:   </li>
1.37    ! cvs        40:   <li><big><a href="#sect3">The S language</a></big> 
1.30      cvs        41:     <ul>
1.37    ! cvs        42:       <li><strong><a href="#sectb31">Document meta-structure</a></strong> 
1.30      cvs        43:         <ul>
                     44:           <li><a href="#sectc311">The basic types</a></li>
                     45:           <li><a href="#sectc312">Constructed elements</a></li>
1.37    ! cvs        46:           <li><a href="#sectc313">Logical structure constructors</a> 
1.30      cvs        47:             <ul>
                     48:               <li><small><a href="#sectd3131">Aggregate and
                     49:               List</a></small></li>
                     50:               <li><small><a href="#sectd3132">Choice, Schema, and
                     51:                 Unit</a></small></li>
                     52:               <li><small><a href="#sectd3133">Reference and
                     53:                 Inclusion</a></small></li>
                     54:               <li><small><a href="#sectd3134">Mark pairs</a></small></li>
                     55:               <li><small><a href="#sectd3135">Restrictions and
                     56:                 Extensions</a></small></li>
                     57:               <li><small><a href="#sectd3136">Summary</a></small></li>
                     58:             </ul>
                     59:           </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
1.37    ! cvs        65:         structures</a></strong> 
1.30      cvs        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="#sectc327">Structured elements</a></li>
1.37    ! cvs        74:           <li><a href="#sectc328">Structure definitions</a> 
1.30      cvs        75:             <ul>
                     76:               <li><small><a href="#sectd3281">List</a></small></li>
                     77:               <li><small><a href="#sectd3282">Aggregate</a></small></li>
                     78:               <li><small><a href="#sectd3283">Choice</a></small></li>
                     79:               <li><small><a href="#sectd3284">Reference</a></small></li>
                     80:               <li><small><a href="#sectd3285">Mark pairs</a></small></li>
                     81:             </ul>
                     82:           </li>
                     83:           <li><a href="#sectc329">Imports</a></li>
                     84:           <li><a href="#sectc3210">Extension rules</a></li>
                     85:           <li><a href="#sectc3212">Units</a></li>
                     86:           <li><a href="#sectc3213">Skeleton elements</a></li>
                     87:           <li><a href="#sectc3214">Exceptions</a></li>
                     88:         </ul>
                     89:       </li>
1.37    ! cvs        90:       <li><strong><a href="#sectb33">Some examples</a></strong> 
1.30      cvs        91:         <ul>
                     92:           <li><a href="#sectc331">A class of documents: articles</a></li>
                     93:           <li><a href="#sectc332">A class of objects: mathematical
                     94:             formulas</a></li>
                     95:         </ul>
                     96:       </li>
                     97:     </ul>
                     98:   </li>
1.37    ! cvs        99:   <li><big><a href="#sect4">The P language</a></big> 
1.30      cvs       100:     <ul>
1.37    ! cvs       101:       <li><strong><a href="#sectb41">Document presentation</a></strong> 
1.30      cvs       102:         <ul>
                    103:           <li><a href="#sectc411">Two levels of presentation</a></li>
                    104:           <li><a href="#sectc412">Boxes</a></li>
                    105:           <li><a href="#sectc413">Views and visibility</a></li>
                    106:           <li><a href="#sectc414">Pages</a></li>
                    107:           <li><a href="#sectc415">Numbering</a></li>
1.34      cvs       108:           <li><a href="#sectc416">Presentation properties</a></li>
1.30      cvs       109:         </ul>
                    110:       </li>
                    111:       <li><strong><a href="#sectb42">Presentation description
1.37    ! cvs       112:         language</a></strong> 
1.30      cvs       113:         <ul>
                    114:           <li><a href="#sectc421">The organization of a presentation
                    115:             schema</a></li>
                    116:           <li><a href="#sectc422">Views</a></li>
                    117:           <li><a href="#sectc423">Print Views</a></li>
                    118:           <li><a href="#sectc424">Counters</a></li>
                    119:           <li><a href="#sectc425">Presentation constants</a></li>
                    120:           <li><a href="#sectc426">Variables</a></li>
                    121:           <li><a href="#sectc427">Default presentation rules</a></li>
                    122:           <li><a href="#sectc428">Presentation and page layout boxes</a></li>
                    123:           <li><a href="#sectc429">Presentation of structured elements</a></li>
                    124:           <li><a href="#sectc4210">Logical attribute presentation</a></li>
                    125:           <li><a href="#sectc4212">Value transmission rules</a></li>
                    126:           <li><a href="#sectc4213">Presentation rules</a></li>
                    127:           <li><a href="#sectc4214">Conditions applying to presentation
1.37    ! cvs       128:             rules</a> 
1.30      cvs       129:             <ul>
1.37    ! cvs       130:               <li><small><a href="#sectd42141">Conditions based on the
        !           131:                 logical position of the element</a></small></li>
1.30      cvs       132:               <li><small><a href="#sectd42142">Conditions on
                    133:                 references</a></small></li>
                    134:               <li><small><a href="#sectd42143">Conditions on logical
                    135:                 attributes</a></small></li>
                    136:               <li><small><a href="#sectd42144">Conditions on page
                    137:                 breaks</a></small></li>
                    138:               <li><small><a href="#sectd42145">Conditions on the element's
                    139:                 content</a></small></li>
                    140:               <li><small><a href="#sectd42146">Conditions on
                    141:                 counters</a></small></li>
                    142:             </ul>
                    143:           </li>
                    144:           <li><a href="#sectc4215">A presentation rule</a></li>
                    145:           <li><a href="#sectc4216">Box axes</a></li>
                    146:           <li><a href="#sectc4217">Distance units</a></li>
                    147:           <li><a href="#sectc4218">Relative positions</a></li>
1.37    ! cvs       148:           <li><a href="#sectc4219">Box extents</a> 
1.30      cvs       149:             <ul>
                    150:               <li><small><a href="#sectd42191">Fixed extents</a></small></li>
                    151:               <li><small><a href="#sectd42192">Relative
                    152:               extents</a></small></li>
                    153:               <li><small><a href="#sectd42193">Elastic
                    154:               extents</a></small></li>
                    155:             </ul>
                    156:           </li>
                    157:           <li><a href="#sectc4220">Overflow</a></li>
                    158:           <li><a href="#sectc4221">Inheritance</a></li>
1.37    ! cvs       159:           <li><a href="#sectc4222">Line breaking</a> 
1.30      cvs       160:             <ul>
                    161:               <li><small><a href="#sectd42221">Line spacing</a></small></li>
                    162:               <li><small><a href="#sectd42222">First line
                    163:                 indentation</a></small></li>
                    164:               <li><small><a href="#sectd42223">Alignment</a></small></li>
                    165:               <li><small><a href="#sectd42225">Hyphenation</a></small></li>
                    166:               <li><small><a href="#sectd42226">Avoiding line
                    167:                 breaking</a></small></li>
                    168:             </ul>
                    169:           </li>
                    170:           <li><a href="#sectc4223">Page breaking and line breaking
                    171:             conditions</a></li>
                    172:           <li><a href="#sectc4224">Visibility</a></li>
1.37    ! cvs       173:           <li><a href="#sectc4225">Character style properties</a> 
1.30      cvs       174:             <ul>
                    175:               <li><small><a href="#sectd42251">Character size</a></small></li>
                    176:               <li><small><a href="#sectd42252">Font and character
                    177:                 style</a></small></li>
                    178:               <li><small><a href="#sectd42253">Underlining</a></small></li>
                    179:             </ul>
                    180:           </li>
                    181:           <li><a href="#sectc4226">Stacking order</a></li>
                    182:           <li><a href="#sectc4227">Line style</a></li>
                    183:           <li><a href="#sectc4228">Line thickness</a></li>
                    184:           <li><a href="#sectc4229">Fill pattern</a></li>
                    185:           <li><a href="#sectc4230">Colors</a></li>
                    186:           <li><a href="#sectc4230a">Background color and border</a></li>
                    187:           <li><a href="#sectc4230b">Background pictures</a></li>
                    188:           <li><a href="#sectc4231">Presentation box content</a></li>
                    189:           <li><a href="#sectc4232">Presentation box creation</a></li>
                    190:           <li><a href="#sectc4233">Page layout</a></li>
                    191:           <li><a href="#sectc4234">Box copies</a></li>
                    192:         </ul>
                    193:       </li>
                    194:     </ul>
                    195:   </li>
1.37    ! cvs       196:   <li><big><a href="#sect5">The T language</a></big> 
1.30      cvs       197:     <ul>
1.37    ! cvs       198:       <li><strong><a href="#sectb51">Document translation</a></strong> 
1.30      cvs       199:         <ul>
                    200:           <li><a href="#sectc511">Translation principles</a></li>
                    201:           <li><a href="#sectc512">Translation procedure</a></li>
                    202:         </ul>
                    203:       </li>
                    204:       <li><strong><a href="#sectb52">Translation definition
1.37    ! cvs       205:         language</a></strong> 
1.30      cvs       206:         <ul>
                    207:           <li><a href="#sectc521">Organization of a translation
                    208:           schema</a></li>
                    209:           <li><a href="#sectc522">Line length</a></li>
                    210:           <li><a href="#sectc523">Buffers</a></li>
                    211:           <li><a href="#sectc524">Counters</a></li>
                    212:           <li><a href="#sectc525">Constants</a></li>
                    213:           <li><a href="#sectc526">Variables</a></li>
                    214:           <li><a href="#sectc527">Translating structure elements</a></li>
1.37    ! cvs       215:           <li><a href="#sectc528">Conditional rules</a> 
1.30      cvs       216:             <ul>
                    217:               <li><small><a href="#sectd5281">Conditions based on the logical
                    218:                 position of the element</a></small></li>
                    219:               <li><small><a href="#sectd5282">Conditions on
                    220:                 references</a></small></li>
                    221:               <li><small><a href="#sectd5284">Conditions on the
                    222:                 alphabets</a></small></li>
                    223:               <li><small><a href="#sectd5285">Conditions on page
                    224:                 breaks</a></small></li>
                    225:               <li><small><a href="#sectd5286">Conditions on the element's
                    226:                 content</a></small></li>
                    227:               <li><small><a href="#sectd5288">Conditions on the presence of
                    228:                 specific presentation rules</a></small></li>
                    229:               <li><small><a href="#sectd5289">Conditions on the presence of
                    230:                 logical attributes</a></small></li>
                    231:               <li><small><a href="#sectd52810">Conditions on logical
                    232:                 attributes</a></small></li>
                    233:               <li><small><a href="#sectd52811">Conditions on specific
                    234:                 presentation rules</a></small></li>
                    235:             </ul>
                    236:           </li>
                    237:           <li><a href="#sectc529">Translation rules</a></li>
                    238:           <li><a href="#sectc5210">The <tt>Create</tt> rule</a></li>
                    239:           <li><a href="#sectc5211">The <tt>Write</tt> rule</a></li>
                    240:           <li><a href="#sectc5212">The <tt>Read</tt> rule</a></li>
                    241:           <li><a href="#sectc5213">The <tt>Include</tt> rule</a></li>
                    242:           <li><a href="#sectc5214">The <tt>Get</tt> rule</a></li>
                    243:           <li><a href="#sectc5215">The <tt>Copy</tt> rule</a></li>
                    244:           <li><a href="#sectc5216">The <tt>Use</tt> rule</a></li>
                    245:           <li><a href="#sectc5217">The <tt>Remove</tt> rule</a></li>
1.31      cvs       246:           <li><a href="#sectc5217a">The <code>Ignore</code> rule</a></li>
1.30      cvs       247:           <li><a href="#sectc5218">The <tt>NoTranslation</tt> rule</a></li>
                    248:           <li><a href="#sectc5219">The <tt>NoLineBreak</tt> rule</a></li>
                    249:           <li><a href="#sectc5220">The <tt>ChangeMainFile</tt> rule</a></li>
                    250:           <li><a href="#sectc5220a">The <tt>RemoveFile</tt> rule</a></li>
                    251:           <li><a href="#sectc5221">The <tt>Set</tt> and <tt>Add</tt>
                    252:           rules</a></li>
                    253:           <li><a href="#sectc5221a">The <tt>Indent</tt> rule</a></li>
                    254:           <li><a href="#sectc5222">Rule application order</a></li>
                    255:           <li><a href="#sectc5223">Translation of logical attributes</a></li>
                    256:           <li><a href="#sectc5224">Translation of specific
                    257:           presentations</a></li>
                    258:           <li><a href="#sectc5225">Recoding of characters, symbols and
                    259:             graphics</a></li>
                    260:         </ul>
                    261:       </li>
                    262:     </ul>
                    263:   </li>
1.37    ! cvs       264:   <li><big><a href="#sect6">Language grammars</a></big> 
1.30      cvs       265:     <ul>
                    266:       <li><strong><a href="#sectb61">The M meta-language</a></strong></li>
                    267:       <li><strong><a href="#sectb62">The S language</a></strong></li>
                    268:       <li><strong><a href="#sectb63">The P language</a></strong></li>
                    269:       <li><strong><a href="#sectb64">The T language</a></strong></li>
                    270:     </ul>
                    271:   </li>
1.37    ! cvs       272:   <li><big><a href="#sect7">Character coding</a></big> 
1.30      cvs       273:     <ul>
                    274:       <li><strong><a href="#sectb71">Characters</a></strong></li>
                    275:       <li><strong><a href="#sectb72">Symbols</a></strong></li>
                    276:       <li><strong><a href="#sectb73">Graphical elements</a></strong></li>
                    277:     </ul>
                    278:   </li>
1.18      cvs       279: </ul>
1.37    ! cvs       280: <hr />
1.18      cvs       281: </div>
1.1       cvs       282: 
1.18      cvs       283: <div class="chapter">
1.37    ! cvs       284: <h1><a name="sect2" id="sect2">The document model of Thot</a></h1>
1.1       cvs       285: 
1.30      cvs       286: <p>All of the services which Thot provides to the user are based on the
1.37    ! cvs       287: system's internal document representation. This representation is itself
        !           288: derived from the document model which underlies Thot. The model is presented
1.30      cvs       289: here, prior to the description of the languages which permit the generic
                    290: specification of documents.</p>
1.1       cvs       291: 
1.18      cvs       292: <div class="section">
1.37    ! cvs       293: <h2><a name="sectb21" id="sectb21">The logical structure of documents</a></h2>
1.1       cvs       294: 
1.30      cvs       295: <p>The document model of Thot is primarily designed to allow the user to
                    296: operate on those entities which s/he has in mind when s/he works on a
                    297: document. The model makes no assumptions about the nature of these entities.
                    298: It is essentially these logical entities, such as paragraphs, sections,
                    299: chapters, notes, titles, and cross-references which give a document its
                    300: logical structure.</p>
                    301: 
                    302: <p>Because of this model, the author can divide the document into chapters,
1.37    ! cvs       303: giving each one a title. The content of these chapters can be further divided
        !           304: into sections, subsections, etc. The text is organized into successive
1.2       cvs       305: paragraphs, according to the content. In the writing phase, the lines, pages,
1.37    ! cvs       306: margins, spacing, fonts, and character styles are not very important. In
        !           307: fact, if the system requires documents to be written in these terms, it gets
        !           308: in the way. So, Thot's model is primarily based on the logical aspect of
        !           309: documents. The creation of a model of this type essentially requires the
        !           310: definition :</p>
1.18      cvs       311: <ul>
1.30      cvs       312:   <li>of the entities which can appear in the documents,</li>
                    313:   <li>and the relations between these entities.</li>
1.18      cvs       314: </ul>
1.30      cvs       315: 
1.37    ! cvs       316: <p>The choice of entities to include in the model can be subtle. Some
        !           317: documents require chapters, while others only need various levels of
        !           318: sections. Certain documents contain appendices, others don't. In different
        !           319: documents the same logical entity may go by different names (e.g.
        !           320: ``Conclusion'' and ``Summary''). Certain entities which are absolutely
        !           321: necessary in some documents, such as clauses in a contract or the address of
        !           322: the recipient in a letter, are useless in most other cases.</p>
1.30      cvs       323: 
                    324: <p>The differences between documents result from more than just the entities
                    325: that appear in them, but also from the relationships between these entities
1.37    ! cvs       326: and the ways that they are linked. In certain documents, notes are spread
1.30      cvs       327: throughout the document, for example at the bottom of the page containing the
1.1       cvs       328: cross-reference to them, while in other documents they are collected at the
1.37    ! cvs       329: end of each chapter or even at the end of the work. As another example, the
1.1       cvs       330: introduction of some documents can contain many sections, while in other
                    331: documents, the introduction is restricted to be a short sequence of
1.18      cvs       332: paragraphs.</p>
1.30      cvs       333: 
1.37    ! cvs       334: <p>All of this makes it unlikely that a single model can describe any
        !           335: document at a relatively high level. It is obviously tempting to make up a
        !           336: list of widely used entities, such as chapters, sections, paragraphs, and
        !           337: titles, and then map all other entities onto the available choices. In this
        !           338: way, an introduction can be supported as a chapter and a contract clause
        !           339: supported as a paragraph or section. However, in trying to widen the range of
        !           340: usage of certain entities, their meaning can be lost and the power of the
        !           341: model reduced. In addition, while this widening partially solves the problem
        !           342: of choosing entities, it does not solve the problem of their organization:
        !           343: when a chapter must be composed of sections, how does one indicate that an
        !           344: introduction has none when it is merely another chapter? One solution is to
1.1       cvs       345: include introductions in the list of supported entities. But then, how does
                    346: one distinguish those introductions which are allowed to have sections from
1.37    ! cvs       347: those which are not. Perhaps this could be done by defining two types of
1.1       cvs       348: introduction. Clearly, this approach risks an infinite expansion of the list
1.18      cvs       349: of widely used entities.</p>
                    350: </div>
1.1       cvs       351: 
1.18      cvs       352: <div class="section">
1.37    ! cvs       353: <h2><a name="sectb22" id="sectb22">Generic and specific structures</a></h2>
1.1       cvs       354: 
1.30      cvs       355: <p>Thus, it is apparently impossible to construct an exhaustive inventory of
                    356: all those entities which are necessary and sufficient to precisely describe
1.37    ! cvs       357: any document. It also seems impossible to specify all possible arrangements
        !           358: of these entities in a document. This is why Thot uses a <em>meta-model</em>
1.18      cvs       359: instead, which permits the description of numerous <em>models</em>, each one
                    360: describing a <em>class</em> of documents.</p>
1.30      cvs       361: 
1.37    ! cvs       362: <p>A <em>class</em> is a set of documents having very similar structure.
        !           363: Thus, the collection of research reports published by a laboratory
        !           364: constitutes a class; the set of commercial proposals by the sales department
        !           365: of a company constitutes another class; the set of articles published by a
        !           366: journal constitutes a third class. Clearly, it is not possible to enumerate
        !           367: every possible document class. It is also clear that new document classes
        !           368: must be created to satisfy new needs and applications.</p>
1.30      cvs       369: 
                    370: <p>To give a more rigorous definition of classes, we must introduce the ideas
1.37    ! cvs       371: of <em>generic structure</em> and <em>specific structure</em>. Each document
1.30      cvs       372: has a <em>specific structure</em> which organizes the various parts which
1.37    ! cvs       373: comprise it. We illustrate this with the help of a simple example comparing
1.30      cvs       374: two reports, A and B (<a href="#specstruct">see Figure</a>). The report A
1.37    ! cvs       375: contains an introduction followed by three chapters and a conclusion. The
        !           376: first chapter contains two sections, the second, three sections. That is the
1.18      cvs       377: <em>specific</em> structure of document A. Similarly, the structure of
1.1       cvs       378: document B is: an introduction, two chapters, a conclusion; Chapter 1 has
1.37    ! cvs       379: three sections while Chapter 2 has four. The specific structures of these two
1.18      cvs       380: documents are thus different.</p>
1.1       cvs       381: 
1.18      cvs       382: <div class="figure">
1.37    ! cvs       383: <hr />
1.18      cvs       384: <pre>        Report A                 Report B
1.1       cvs       385:              Introduction              Introduction
                    386:              Chapter 1                 Chapter 1
                    387:                   Section 1.1               Section 1.1
                    388:                   Section 1.2               Section 1.2
                    389:              Chapter 2                      Section 1.3
                    390:                   Section 2.1          Chapter 2
                    391:                   Section 2.2               Section 2.1
                    392:                   Section 2.3               Section 2.2
                    393:              Chapter 3                      Section 2.3
                    394:              Conclusion                     Section 2.4
1.18      cvs       395:                                        Conclusion</pre>
1.30      cvs       396: 
1.37    ! cvs       397: <p align="center"><em><a name="specstruct" id="specstruct">Two specific
1.30      cvs       398: structures</a></em></p>
1.37    ! cvs       399: <hr />
1.30      cvs       400: </div>
                    401: 
                    402: <p>The <em>generic structure</em> defines the ways in which specific
1.37    ! cvs       403: structures can be constructed. It specifies how to generate specific
        !           404: structures. The reports A and B, though different, are constructed in
1.30      cvs       405: accordance with the same generic structure, which specifies that a report
                    406: contains an introduction followed by a variable number of chapters and a
                    407: conclusion, with each chapter containing a variable number of sections.</p>
                    408: 
                    409: <p>There is a one-to-one correspondence between a class and a generic
1.37    ! cvs       410: structure: all the documents of a class are constructed in accordance with
        !           411: the same generic structure. Hence the definition of the class: a class is a
        !           412: set of documents whose specific structure is constructed in accordance with
        !           413: the same generic structure. A class is characterized by its generic
1.30      cvs       414: structure.</p>
1.19      cvs       415: 
1.30      cvs       416: <p>Thus, a generic structure can be considered to be a model at the level
1.37    ! cvs       417: which interests us, but only for one class of documents. When the definition
1.30      cvs       418: is limited to a single class of documents, it is possible to define a model
                    419: which does a good job of representing the documents of the class, including
1.37    ! cvs       420: the necessary entities and unencumbered by useless entities. The description
1.30      cvs       421: of the organization of the documents in the class can then be sufficiently
1.18      cvs       422: precise.</p>
                    423: </div>
1.1       cvs       424: 
1.18      cvs       425: <div class="section">
1.37    ! cvs       426: <h2><a name="sectb23" id="sectb23">Logical structure and physical
        !           427: structure</a></h2>
1.1       cvs       428: 
1.30      cvs       429: <p>Generic structures only describe the <em>logical</em> organization of
1.18      cvs       430: documents, not their <em>physical</em> presentation on a screen or on sheets
1.37    ! cvs       431: of paper. However, for a document to be displayed or printed, its graphic
1.18      cvs       432: presentation must be taken into account.</p>
1.30      cvs       433: 
                    434: <p>An examination of current printed documents shows that the details of
1.1       cvs       435: presentation essentially serve to bring out their logical structure. Outside
                    436: of some particular domains, notably advertising, the presentation is rarely
1.37    ! cvs       437: independent of the logical organization of the text. Moreover, the art of
1.1       cvs       438: typography consists of enhancing the organization of the text being set,
1.37    ! cvs       439: without catching the eye of the reader with overly pronounced effects. Thus,
        !           440: italic and boldface type are used to emphasize words or expressions which
        !           441: have greater significance than the rest of the text: keywords, new ideas,
        !           442: citations, book titles, etc. Other effects highlight the organization of the
1.1       cvs       443: text: vertical space, margin changes, page breaks, centering, eventually
                    444: combined with the changes in the shapes or weight of the characters. These
                    445: effects serve to indicate the transitions between paragraphs, sections, or
                    446: chapters: an object's level in the logical structure of the document is shown
1.18      cvs       447: by the markedness of the effects.</p>
1.30      cvs       448: 
                    449: <p>Since the model permits the description of all of the logical structure of
                    450: the document, the presentation can be derived from the model without being
1.37    ! cvs       451: submerged in the document itself. It suffices to use the logical structure of
1.1       cvs       452: the document to make the desired changes in its presentation: changes in type
1.18      cvs       453: size, type style, spacing, margin, centering, etc.</p>
1.30      cvs       454: 
                    455: <p>Just as one cannot define a unique generic logical structure for all
                    456: document classes, one cannot define universal presentation rules which can be
1.37    ! cvs       457: applied to all document classes. For certain types of documents the chapter
        !           458: titles will be centered on the page and printed in large, bold type. For
        !           459: other documents, the same chapter titles will be printed in small, italic
        !           460: type and aligned on the left margin.</p>
1.30      cvs       461: 
                    462: <p>Therefore, it is necessary to base the presentation specifications for
1.37    ! cvs       463: documents on their class. Such a specification can be very fine-grained,
1.1       cvs       464: because the presentation is expressed in terms of the entities defined in the
1.37    ! cvs       465: generic logical structure of the class. Thus, it is possible to specify a
1.1       cvs       466: different presentation for the chapter titles and the section titles, and
                    467: similarly to specify titles for the sections according to their level in the
1.37    ! cvs       468: section hierarchy. The set of rules which specify the presentation of all the
1.18      cvs       469: elements defined in a generic logical structure is called a <em>generic
                    470: presentation</em>.</p>
1.30      cvs       471: 
                    472: <p>There are several advantages derived from having a presentation linked to
                    473: the generic structure and described by a generic presentation. Homogeneity is
1.37    ! cvs       474: the first. Since every document in a class corresponds to the same generic
1.1       cvs       475: logical structure, a homogenous presentation for different documents of the
                    476: same class can be assured by applying the same generic presentation to all
1.37    ! cvs       477: documents of the class. Homogeneity of presentation can also be found among
        !           478: the entities of a single document: every section heading will be presented in
        !           479: the same way, the first line of every paragraph of the same type will have
        !           480: the same indentation, etc.</p>
1.30      cvs       481: 
                    482: <p>Another advantage of this approach to presentation is that it facilitates
1.37    ! cvs       483: changes to the graphical aspect of documents. A change to the generic
        !           484: presentation rules attached to each type of entity will alter the
        !           485: presentation of the entire document, and will do so homogenously. In this
        !           486: case, the internal homogeneity of the class is no longer assured, but the way
        !           487: to control it is simple. It suffices to adopt a single generic presentation
        !           488: for the entire class.</p>
1.30      cvs       489: 
                    490: <p>If the presentation of the class does not have to be homogenous, then the
1.37    ! cvs       491: appearance of the document can be adapted to the way it will be used or to
        !           492: the device used to render it. This quality is sufficient to allow the
        !           493: existence of <a name="mulpres" id="mulpres">many generic presentations</a>
        !           494: for the same document class. By applying one or the other of these
        !           495: presentations to it, the document can be seen under different graphical
        !           496: aspects. It must be emphasized that this type of modification of the
        !           497: presentation is not a change to the document itself (in its specific logical
        !           498: structure or its content), but only in its appearance at the time of editing
        !           499: or printing.</p>
1.18      cvs       500: </div>
1.1       cvs       501: 
1.18      cvs       502: <div class="section">
1.37    ! cvs       503: <h2><a name="sectb24" id="sectb24">Document structures and object
        !           504: structures</a></h2>
1.1       cvs       505: 
1.30      cvs       506: <p>So far, we have only discussed the global structure of documents and have
1.37    ! cvs       507: not considered the contents found in that structure. We could limit ourselves
1.30      cvs       508: to purely textual contents by assuming that a title or a paragraph contains a
1.37    ! cvs       509: simple linear text. But this model would be too restrictive. In fact, certain
        !           510: documents contain not only text, but also contain tables, diagrams,
        !           511: photographs, mathematical formulas, and program fragments. The model must
1.18      cvs       512: permit the representation of such <em>objects</em>.</p>
1.30      cvs       513: 
                    514: <p>Just as with the whole of the document, the model takes into account the
1.37    ! cvs       515: logical structure of objects of this type. Some are clearly structured,
        !           516: others are less so. Logical structure can be recognized in mathematical
        !           517: formulas, in tables, and in certain types of diagrams. On the other hand, it
        !           518: is difficult to define the structure of a photograph or of some drawings. But
1.1       cvs       519: in any case, it does not seem possible to define one unique structure which
1.37    ! cvs       520: can represent every one of these types of objects. The approach taken in the
1.1       cvs       521: definition of meta-structure and document classes also applies to objects.
                    522: Object classes can be defined which put together objects of similar type,
1.18      cvs       523: constructed from the same generic logical structure.</p>
1.30      cvs       524: 
                    525: <p>Thus, a mathematical class can be defined and have a generic logical
1.37    ! cvs       526: structure associated with it. But even if a single generic structure can
1.30      cvs       527: represent a sufficient variety of mathematical formulas, for other objects
1.37    ! cvs       528: with less rigorous structure, multiple classes must be defined. As for
        !           529: documents, using multiple classes assures that the model can describe the
        !           530: full range of objects to be presented. It also permits the system to support
        !           531: objects which were not initially anticipated. Moreover, this comment applies
1.30      cvs       532: equally to mathematics: different classes of formulas can be described
                    533: depending on the domain of mathematics being described.</p>
                    534: 
                    535: <p>Since objects have the same level of logical representation as documents,
1.37    ! cvs       536: they gain the same advantages. In particular, it is possible to define the
1.1       cvs       537: presentation separately from the objects themselves and attach it to the
1.37    ! cvs       538: class. Thus, as for documents, objects of the same type have a uniform
1.1       cvs       539: presentation and the presentation of every object in a given class can be
1.37    ! cvs       540: changed simply by changing the generic presentation of the class. Another
1.1       cvs       541: advantage of using this document model is that the system does not bother the
                    542: user with the details of presentation, but rather allows the user to
1.18      cvs       543: concentrate on the logical aspect of the document and the objects.</p>
1.30      cvs       544: 
                    545: <p>It is clear that the documents in a class do not necessarily use the same
1.1       cvs       546: classes of objects: one technical report will contain tables while another
                    547: report will have no tables but will use mathematical formulas. The usable
1.2       cvs       548: object classes are not always mentioned in a limiting way in the generic
1.37    ! cvs       549: logical structure of documents. Rather, they can be chosen freely from a
1.18      cvs       550: large set, independent of the document class.</p>
1.30      cvs       551: 
                    552: <p>Thus, the object classes will be made commonplace and usable in every
1.1       cvs       553: document. The notion of ``object'' can be enlarged to include not only
                    554: non-textual elements, but also certain types of textual elements which can
1.37    ! cvs       555: appear in practically every document, whatever their class. Among these
1.2       cvs       556: textual elements, one can mention enumerations, descriptions, examples,
1.18      cvs       557: quotations, even paragraphs.</p>
1.30      cvs       558: 
                    559: <p>Thus, the document model is not a single, general model describing every
1.37    ! cvs       560: type of document in one place. Rather, it is a meta-model which can be used
1.30      cvs       561: to describe many different models each of which represents either a class of
1.1       cvs       562: similar documents or a class of similar objects which every document can
1.18      cvs       563: include.</p>
                    564: </div>
1.37    ! cvs       565: <hr />
1.18      cvs       566: </div>
1.1       cvs       567: 
1.18      cvs       568: <div class="chapter">
1.37    ! cvs       569: <h1><a name="sect3" id="sect3">The S language</a></h1>
1.1       cvs       570: 
1.18      cvs       571: <div class="section">
1.37    ! cvs       572: <h2><a name="sectb31" id="sectb31">Document meta-structure</a></h2>
1.1       cvs       573: 
1.30      cvs       574: <p>Since the concept of meta-structure is well suited to the task of
                    575: describing documents at a high level of abstraction, this meta-structure must
1.37    ! cvs       576: be precisely defined. Toward that end this section first presents the basic
1.1       cvs       577: elements from which documents and structured objects are composed and then
1.37    ! cvs       578: specifies the ways in which these basic elements are assembled into
        !           579: structures representing complete documents and objects.</p>
1.1       cvs       580: 
1.18      cvs       581: <div class="subsection">
1.37    ! cvs       582: <h3><a name="sectc311" id="sectc311">The basic types</a></h3>
1.1       cvs       583: 
1.37    ! cvs       584: <p>At the lowest level of a document's structure, the first atom considered
        !           585: is the character. However, since characters are seldom isolated, usually
1.1       cvs       586: appearing as part of a linear sequence, and in order to reduce the complexity
1.18      cvs       587: of the document structure, <em>character strings</em> are used as atoms and
1.37    ! cvs       588: consecutive characters belonging to the same structural element are grouped
        !           589: in the same character string.</p>
1.30      cvs       590: 
1.37    ! cvs       591: <p>If the structure of a document is not refined to go down to the level of
        !           592: words or phrases, the contents of a simple paragraph can be considered to be
        !           593: a single character string. On the other hand, the title of a chapter, the
        !           594: title of the first section of that chapter, and the text of the first
        !           595: paragraph of that section constitute three different character strings,
        !           596: because they belong to distinct structural elements.</p>
1.30      cvs       597: 
                    598: <p>If, instead, a very fine-grained representation for the structure of a
1.1       cvs       599: document is sought, character strings could be defined to contain only a
1.37    ! cvs       600: single word, or even just a single character. This is the case, for example,
        !           601: in programs, for which one wants to retain a structure very close to the
        !           602: syntax of the programming language. In this case, an assignment statement
1.1       cvs       603: initializing a simple variable to zero would be composed of two structural
                    604: elements, the identifier of the variable (a short character string) and the
1.18      cvs       605: assigned value (a string of a single character, `0').</p>
1.30      cvs       606: 
                    607: <p>The character string is not the only atom necessary for representing those
1.37    ! cvs       608: documents that interest us. It suffices for purely textual documents, but as
1.1       cvs       609: soon as the non-textual objects which we have considered arise, there must be
                    610: other atoms; the number of objects which are to be represented determines the
1.18      cvs       611: number of types of atoms that are necessary.</p>
1.30      cvs       612: 
                    613: <p>Primitive <em>graphical elements</em> are used for tables and figures of
1.37    ! cvs       614: different types. These elements are simple geometric shapes like horizontal
1.1       cvs       615: or vertical lines, which are sufficient for tables, or even oblique lines,
1.2       cvs       616: arrows, rectangles, circles, polygons, and curves for use in figures. From
                    617: these elements and character strings, graphical objects and tables can be
1.18      cvs       618: constructed.</p>
1.30      cvs       619: 
                    620: <p>Photographs, though having very little structure, must still appear in
1.37    ! cvs       621: documents. They are supported by <em>picture</em> elements, which are
1.18      cvs       622: represented as matrices of pixels.</p>
1.30      cvs       623: 
                    624: <p>Finally, mathematical notations require certain elements which are
1.37    ! cvs       625: simultaneously characters and graphical elements, the <em>symbols</em>. By
        !           626: way of example, radicals, integration signs, or even large parentheses are
        !           627: examples of this type of atom. The size of each of these symbols is
1.1       cvs       628: determined by its environment, that is to say, by the expression to which it
1.18      cvs       629: is attached.</p>
1.30      cvs       630: 
                    631: <p>To summarize, the primitive elements which are used in the construction of
1.18      cvs       632: documents and structured objects are:</p>
                    633: <ul>
1.30      cvs       634:   <li>character strings,</li>
                    635:   <li>graphical elements,</li>
                    636:   <li>pictures,</li>
                    637:   <li>and mathematical symbols.</li>
1.18      cvs       638: </ul>
                    639: </div>
1.1       cvs       640: 
1.18      cvs       641: <div class="subsection">
1.37    ! cvs       642: <h3><a name="sectc312" id="sectc312">Constructed elements</a></h3>
1.30      cvs       643: 
1.37    ! cvs       644: <p>A document is evidently formed from primitive elements. But the model of
        !           645: Thot also proposes higher level elements. Thus, in a document composed of
        !           646: several chapters, each chapter is an element, and in the chapters each
        !           647: section is also an element, and so on. A document is thus an organized set of
1.30      cvs       648: elements.</p>
1.1       cvs       649: 
1.37    ! cvs       650: <p>In a document there are different sorts of elements. Each element has a
        !           651: <em>type</em> which indicates the role of the element within the document as
        !           652: a whole. Thus, we have, for example, the chapter and section types. The
1.1       cvs       653: document is made up of typed elements: elements of the type chapter and
1.37    ! cvs       654: elements of the type section, among others, but also character string
        !           655: elements and graphical elements: the primitive elements are typed elements
        !           656: just as well. At the other extreme, the document itself is also considered to
        !           657: be a typed element.</p>
1.30      cvs       658: 
                    659: <p>The important difference between the primitive elements and the other
1.37    ! cvs       660: elements of the document is that the primitive elements are atoms (they
        !           661: cannot be decomposed), whereas the others, called <em>constructed
        !           662: elements</em>, are composed of other elements, which can either be primitive
        !           663: elements or constructed elements. A constructed element of type chapter (or
        !           664: more simply, ``a chapter'') is composed of sections, which are also
        !           665: constructed elements. A paragraph, a constructed element, can be made up of
        !           666: character strings, which are primitive elements, and of equations, which are
        !           667: constructed elements.</p>
1.30      cvs       668: 
1.37    ! cvs       669: <p>A document is also a constructed element. This is an important point. In
1.1       cvs       670: particular, it allows a document to be treated as part of another document,
                    671: and conversely, permits a part of a document to be treated as a complete
1.37    ! cvs       672: document. Thus, an article presented in a journal is treated by its author as
1.1       cvs       673: a document in itself, while the editor of the journal considers it to be part
1.37    ! cvs       674: of an issue. A table or a figure appearing in a document can be extracted and
1.1       cvs       675: treated as a complete document, for example to prepare transparencies for a
1.18      cvs       676: conference.</p>
1.30      cvs       677: 
                    678: <p>These thoughts about types and constructed elements apply just as well to
1.37    ! cvs       679: objects as they do to documents. A table is a constructed element made up of
        !           680: other constructed elements, rows and columns. A row is formed of cells, which
1.1       cvs       681: are also constructed elements which contain primitive elements (character
1.18      cvs       682: strings) and/or constructed elements like equations.</p>
                    683: </div>
1.1       cvs       684: 
1.18      cvs       685: <div class="subsection">
1.37    ! cvs       686: <h3><a name="sectc313" id="sectc313">Logical structure constructors</a></h3>
1.1       cvs       687: 
1.30      cvs       688: <p>Having defined the primitive elements and the constructed elements, it is
                    689: now time to define the types of organization which allow the building of
1.37    ! cvs       690: structures. For this, we rely on the notion of the <em>constructor</em>. A
        !           691: constructor defines a way of assembling certain elements in a structure. It
1.1       cvs       692: resides at the level of the meta-structure: it does not describe the existing
1.37    ! cvs       693: relations in a given structure, but rather defines how elements are assembled
1.18      cvs       694: to build a structure that conforms to a model.</p>
1.30      cvs       695: 
                    696: <p>In defining the overall organization of documents, the first two
                    697: constructors considered are the aggregate and the list.</p>
1.1       cvs       698: 
1.18      cvs       699: <div class="subsubsection">
1.37    ! cvs       700: <h4><a name="sectd3131" id="sectd3131">Aggregate and List</a></h4>
1.1       cvs       701: 
1.30      cvs       702: <p>The <em>aggregate</em> constructor is used to define constructed element
                    703: types which are collections of a given number of other elements. These
1.37    ! cvs       704: collections may or may not be ordered. The elements may be either constructed
        !           705: or primitive and are specified by their type. A report (that is, a
        !           706: constructed element of the report type) has an aggregate structure. It is
1.30      cvs       707: formed from a title, an author's name, an introduction, a body, and a
1.37    ! cvs       708: conclusion, making it a collection of five element types. This type of
1.30      cvs       709: constructor is found in practically every document, and generally at several
                    710: levels in a document.</p>
                    711: 
                    712: <p>The <em>list</em> constructor is used to define constructed elements which
                    713: are ordered sequences of elements (constructed or primitive) having the same
                    714: type. The minimum and maximum numbers of elements for the sequence can be
                    715: specified in the list constructor or the number of elements can be left
                    716: unconstrained. The body of a report is a list of chapters and is typically
                    717: required to contain a minimum of two chapters (is a chapter useful if it is
                    718: the only one in the report?) The chapter itself can contain a list of
1.37    ! cvs       719: sections, each section containing a list of paragraphs. In the same way as
        !           720: the aggregate, the list is a very frequently used constructor in every type
        !           721: of document. However, these two constructors are not sufficient to describe
        !           722: every document structure; thus other constructors supplement them.</p>
1.18      cvs       723: </div>
1.1       cvs       724: 
1.18      cvs       725: <div class="subsubsection">
1.37    ! cvs       726: <h4><a name="sectd3132" id="sectd3132">Choice, Schema, and Unit</a></h4>
1.1       cvs       727: 
1.30      cvs       728: <p>The <em>choice</em> constructor is used to define the structure of an
                    729: element type for which one alternative is chosen from several possibilities.
1.37    ! cvs       730: Thus, a paragraph can be either a simple text paragraph, or an enumeration,
        !           731: or a citation.</p>
1.30      cvs       732: 
                    733: <p>The choice constructor indicates the complete list of possible options,
                    734: which can be too restrictive in certain cases, the paragraph being one such
                    735: case. Two constructors, <em>unit</em> and <em>schema</em>, address this
1.37    ! cvs       736: inconvenience. They allow more freedom in the choice of an element type. If a
        !           737: paragraph is defined by a schema constructor, it is possible to put in the
1.1       cvs       738: place of a paragraph a table, an equation, a drawing or any other object
1.37    ! cvs       739: defined by another generic logical structure. It is also possible to define a
1.1       cvs       740: paragraph as a sequence of units, which could be character strings, symbols,
1.37    ! cvs       741: or pictures. The choice constructor alone defines a generic logical structure
1.1       cvs       742: that is relatively constrained; in contrast, using units and schemas, a very
1.18      cvs       743: open structure can be defined.</p>
1.30      cvs       744: 
                    745: <p>The <em>schema</em> constructor represents an object defined by a generic
1.18      cvs       746: logical structure chosen freely from among those available.</p>
1.30      cvs       747: 
                    748: <p>The <em>unit</em> constructor represents an element whose type can be
                    749: either a primitive type or an element type defined as a unit in the generic
                    750: logical structure of the document, or in another generic logical structure
1.37    ! cvs       751: used in the document. Such an element may be used in document objects
1.30      cvs       752: constructed according to other generic structures.</p>
                    753: 
                    754: <p>Thus, for example, if a cross-reference to a footnote is defined in the
1.37    ! cvs       755: generic logical structure ``Article'' as a unit, a table (an object defined
        !           756: by another generic structure) can contain cross-references to footnotes, when
        !           757: they appear in an article. In another type of document, a table defined by
1.1       cvs       758: the same generic structure can contain other types of elements, depending on
1.37    ! cvs       759: the type of document into which the table is inserted. All that is needed is
1.1       cvs       760: to declare, in the generic structure for tables, that the contents of cells
1.37    ! cvs       761: are units. In this way, the generic structure of objects is divided up
        !           762: between different types of documents which are able to adapt themselves to
        !           763: the environment into which they are inserted.</p>
1.18      cvs       764: </div>
1.1       cvs       765: 
1.18      cvs       766: <div class="subsubsection">
1.37    ! cvs       767: <h4><a name="sectd3133" id="sectd3133">Reference and Inclusion</a></h4>
1.1       cvs       768: 
1.30      cvs       769: <p>The <em>reference</em> is used to define document elements that are
1.18      cvs       770: cross-references to other elements, such as a section, a chapter, a
1.37    ! cvs       771: bibliographic citation, or a figure. The reference is bi-directional. It can
1.18      cvs       772: be used to access both the element being cross-referenced and each of the
                    773: elements which make use of the cross-reference.</p>
1.30      cvs       774: 
1.37    ! cvs       775: <p>References can be either <em>internal</em> or <em>external</em>. That is,
1.1       cvs       776: they can designate elements which appear in the same document or in another
1.18      cvs       777: document.</p>
1.30      cvs       778: 
1.37    ! cvs       779: <p>The <em><a name="inclusion" id="inclusion">inclusion</a></em> constructor
        !           780: is a special type of reference. Like the reference, it is an internal or
        !           781: external bidirectional link, but it is not a cross-reference. This link
        !           782: represents the ``live'' inclusion of the designated element; it accesses the
        !           783: most recent version of that element and not a ``dead'' copy, fixed in the
        !           784: state in which it was found at the moment the copy was made. As soon as an
        !           785: element is modified, all of its inclusions are automatically brought up to
        !           786: date. It must be noted that, in addition to inclusion, Thot permits the
        !           787: creation of ``dead'' copies.</p>
1.30      cvs       788: 
                    789: <p>There are three types of inclusions: inclusions with full expansion,
1.1       cvs       790: inclusions with partial expansion, and inclusions without expansion. During
                    791: editing, inclusions without expansion are represented on the screen by the
                    792: name of the included document, in a special color, while inclusions with
1.37    ! cvs       793: expansion (full or partial) are represented by a copy (full or partial) of
        !           794: the included element (also in a special color). The on-screen representation
        !           795: of a partial inclusion is a <a href="#sectc3213">``skeleton''</a> image of
        !           796: the included document.</p>
1.30      cvs       797: 
                    798: <p>Inclusion with complete expansion can be used to include parts of the same
1.37    ! cvs       799: document or of other documents. Thus, it can be either an internal or an
        !           800: external link. It can be used to include certain bibliographic entries of a
1.1       cvs       801: scientific article in another article, or to copy part of a mathematical
                    802: formula into another formula of the same document, thus assuring that both
1.18      cvs       803: copies will remain synchronized.</p>
1.30      cvs       804: 
                    805: <p>Inclusion without expansion or with partial expansion is used to include
1.37    ! cvs       806: complete documents. It is always an external link. It is used primarily to
1.1       cvs       807: divide very large documents into sub-documents that are easier to manipulate,
1.37    ! cvs       808: especially when there are many authors. So, a book can include some chapters,
1.1       cvs       809: where each chapter is a different document which can be edited separately.
                    810: When viewing the book on the screen, it might be desirable to see only the
1.37    ! cvs       811: titles of the chapters and sections. This can be achieved using inclusion
1.18      cvs       812: with partial expansion.</p>
1.30      cvs       813: 
1.37    ! cvs       814: <p>During printing, inclusions without expansion or with partial expansion
        !           815: can be represented either as they were shown on the screen or by a complete
        !           816: (and up-to-date) copy of the included element or document.</p>
1.30      cvs       817: 
                    818: <p>The inclusion constructor, whatever its type, respects the generic
                    819: structure: only those elements authorized by the generic structure can be
                    820: included at a given position in a document.</p>
1.18      cvs       821: </div>
1.1       cvs       822: 
1.18      cvs       823: <div class="subsubsection">
1.37    ! cvs       824: <h4><a name="sectd3134" id="sectd3134">Mark pairs</a></h4>
1.1       cvs       825: 
1.30      cvs       826: <p>It is often useful to delimit certain parts of a document independently
1.37    ! cvs       827: from the logical structure. For example, one might wish to attach some
1.30      cvs       828: information (in the form of an <a href="#sectc315">attribute</a>) or a
                    829: particular treatment to a group of words or a set of consecutive paragraphs.
                    830: <em>Mark pairs</em> are used to do this.</p>
                    831: 
                    832: <p>Mark pairs are elements which are always paired and are terminals in the
1.37    ! cvs       833: logical structure of the document. Their position in the structure of the
        !           834: document is defined in the generic structure. It is important to note that
1.18      cvs       835: when the terminals of a mark pair are <em>extensions</em> (see the next
                    836: section), they can be used quite freely.</p>
                    837: </div>
1.1       cvs       838: 
1.18      cvs       839: <div class="subsubsection">
1.37    ! cvs       840: <h4><a name="sectd3135" id="sectd3135">Restrictions and Extensions</a></h4>
1.1       cvs       841: 
1.30      cvs       842: <p>The primitive types and the constructors presented so far permit the
1.1       cvs       843: definition of the logical structure of documents and objects in a rigorous
1.37    ! cvs       844: way. But this definition can be very cumbersome in certain cases, notably
1.1       cvs       845: when trying to constrain or extend the authorized element types in a
1.37    ! cvs       846: particular context. <em>Restrictions</em> and <em>extensions</em> are used to
1.18      cvs       847: cope with these cases.</p>
1.30      cvs       848: 
                    849: <p>A restriction associates with a particular element type <em>A</em>, a list
1.37    ! cvs       850: of those element types which elements of type <em>A</em> may not contain,
        !           851: even if the definition of type <em>A</em> and those of its components
        !           852: authorize them otherwise. This simplifies the writing of generic logical
        !           853: structures and allows limitations to be placed, when necessary, on the
        !           854: choices offered by the schema and unit constructors.</p>
        !           855: 
        !           856: <p>Extensions are the inverse of restrictions. They identify a list of
        !           857: element types whose presence <em>is</em> permitted, even if its definition
        !           858: and those of its components do not authorize them otherwise.</p>
1.18      cvs       859: </div>
                    860: 
                    861: <div class="subsubsection">
1.37    ! cvs       862: <h4><a name="sectd3136" id="sectd3136">Summary</a></h4>
1.18      cvs       863: 
1.30      cvs       864: <p>Thus, four constructors are used to construct a document:</p>
1.18      cvs       865: <ul>
1.30      cvs       866:   <li>the aggregate constructor (ordered or not),</li>
                    867:   <li>the list constructor,</li>
                    868:   <li>the choice constructor and its extensions, the unit and schema
                    869:     constructors,</li>
                    870:   <li>the reference constructor and its variant, the inclusion.</li>
                    871: </ul>
                    872: 
1.37    ! cvs       873: <p>These constructors are also sufficient for objects. Thus, these
1.30      cvs       874: constructors provide a homogenous meta-model which can describe both the
                    875: organization of the document as a whole and that of the various types of
1.37    ! cvs       876: objects which it contains. After presenting the description language for
1.30      cvs       877: generic structures, we will present several examples which illustrate the
                    878: appropriateness of the model.</p>
                    879: 
1.37    ! cvs       880: <p>The first three constructors (aggregate, list and choice) lead to
        !           881: tree-like structures for documents and objects, the objects being simply the
        !           882: subtrees of the tree of a document (or even of other objects' subtrees). The
        !           883: reference constructor introduces other, non-hierarchical, relations which
        !           884: augment those of the tree: when a paragraph makes reference to a chapter or a
        !           885: section, that relation leaves the purely tree-like structure. Moreover,
        !           886: external reference and inclusion constructors permit the establishment of
        !           887: links between different documents, thus creating a hypertext structure.</p>
1.18      cvs       888: </div>
                    889: </div>
1.1       cvs       890: 
1.18      cvs       891: <div class="subsection">
1.37    ! cvs       892: <h3><a name="sectc315" id="sectc315">Attributes</a></h3>
1.1       cvs       893: 
1.30      cvs       894: <p>There remain logical aspects of documents that are not entirely described
1.37    ! cvs       895: by the structure. Certain types of semantic information, which are not stated
        !           896: explicitly in the text, must also be taken into account. In particular, such
1.1       cvs       897: information is shown by typographic effects which do not correspond to a
1.37    ! cvs       898: change between structural elements. In fact, certain titles are set in bold
1.1       cvs       899: or italic or are printed in a different typeface from the rest of the text in
1.37    ! cvs       900: order to mark them as structurally distinct. But these same effects
1.1       cvs       901: frequently appear in the middle of continuous text (e.g. in the interior of a
1.37    ! cvs       902: paragraph). In this case, there is no change between structural elements; the
        !           903: effect serves to highlight a word, expression, or phrase. The notion of an
1.18      cvs       904: <em>attribute</em> is used to express this type of information.</p>
1.30      cvs       905: 
                    906: <p>An attribute is a piece of information attached to a structural element
                    907: which augments the type of the element and clarifies its function in the
                    908: document. Keywords, foreign language words, and titles of other works can all
1.37    ! cvs       909: be represented by character strings with attached attributes. Attributes may
        !           910: also be attached to constructed elements. Thus, an attribute indicating the
1.1       cvs       911: language can be attached to a single word or to a large part of a
1.18      cvs       912: document.</p>
1.30      cvs       913: 
                    914: <p>In fact, an attribute can be any piece of information which is linked to a
1.37    ! cvs       915: part of a document and which can be used by agents which work on the
        !           916: document. For example, the language in which the document is written
        !           917: determines the set of characters used by an editor or formatter. It also
        !           918: determines the algorithm or hyphenation dictionary to be used. The attribute
        !           919: ``keyword'' facilitates the work of an information retrieval system. The
        !           920: attribute ``index word'' allows a formatter to automatically construct an
        !           921: index at the end of the document.</p>
1.30      cvs       922: 
                    923: <p>As with the types of constructed elements, the attributes and the values
1.37    ! cvs       924: they can take are defined separately in each generic logical structure, not
        !           925: in the meta-model, according to the needs of the document class or the nature
        !           926: of the object.</p>
1.30      cvs       927: 
                    928: <p>Many types of attributes are offered: numeric, textual, references, and
1.18      cvs       929: enumerations:</p>
                    930: <ul>
1.37    ! cvs       931:   <li><em>Numeric attributes</em> can take integer values (negative,
        !           932:     positive, or null).</li>
1.30      cvs       933:   <li><em>Textual attributes</em> have as their values character strings.</li>
                    934:   <li><em>Reference attributes</em> designate an element of the logical
                    935:     structure.</li>
                    936:   <li><em>Enumeration attributes</em> can take one value from a limited list
                    937:     of possible values, each value being a name.</li>
1.18      cvs       938: </ul>
1.30      cvs       939: 
                    940: <p>In a generic structure, there is a distinction between <em>global
1.37    ! cvs       941: attributes</em> and <em>local attributes</em>. A global attribute can be
1.1       cvs       942: applied to every element type defined in the generic structure where it is
1.37    ! cvs       943: specified. In contrast, a local attribute can only be applied to certain
        !           944: types of elements, even only a single type. The ``language'' attribute
        !           945: presented above is an example of a global attribute. An example of a local
1.1       cvs       946: attribute is the rank of an author (principal author of the document or
                    947: secondary author): this attribute can only be applied sensibly to an element
1.18      cvs       948: of the ``author'' type.</p>
1.30      cvs       949: 
                    950: <p>Attributes can be assigned to the elements which make up the document in
1.37    ! cvs       951: many different ways. The author can freely and dynamically place them on any
1.30      cvs       952: part of the document in order to attach supplementary information of his/her
1.18      cvs       953: choice. However, attributes may only be assigned in accordance with the rules
1.37    ! cvs       954: of the generic structure; in particular, local attributes can only be
        !           955: assigned to those element types for which they are defined.</p>
1.30      cvs       956: 
                    957: <p>In the generic structure, certain local attributes can be made mandatory
1.37    ! cvs       958: for certain element types. In this case, Thot automatically associates the
        !           959: attribute with the elements of this type and it requires the user to provide
        !           960: a value for this attribute.</p>
        !           961: 
        !           962: <p>Attributes can also be automatically assigned, with a given value, by
        !           963: every application processing the document in order to systematically add a
        !           964: piece of information to certain predefined elements of the document. By way
        !           965: of example, in a report containing a French abstract and an English abstract,
        !           966: each of the two abstracts is defined as a sequence of paragraphs. The first
1.1       cvs       967: abstract has a value of ``French'' for the ``language'' attribute while the
1.18      cvs       968: second abstract's ``language'' attribute has a value of ``English''.</p>
1.30      cvs       969: 
                    970: <p>In the case of mark pairs, attributes are logically associated with the
                    971: pair as a whole, but are actually attached to the first mark.</p>
1.18      cvs       972: </div>
1.1       cvs       973: 
1.18      cvs       974: <div class="subsection">
1.37    ! cvs       975: <h3><a name="sectc316" id="sectc316">Discussion of the model</a></h3>
1.1       cvs       976: 
1.37    ! cvs       977: <p>The notions of attribute, constructor, and structured element are used in
        !           978: the definition of generic logical structures of documents and objects. The
        !           979: problem is to assemble them to form generic structures. In fact, many types
        !           980: of elements and attributes can be found in a variety of generic structures.
        !           981: Rather than redefine them for each structure in which they appear, it is best
        !           982: to share them between structures. The object classes already fill this
        !           983: sharing function. If a mathematical class is defined, its formulas can be
        !           984: used in many different document classes, without redefining the structure of
        !           985: each class. This problem arises not only for the objects considered here; it
        !           986: also arises for the commonplace textual elements found in many document
        !           987: classes. This is the reason why the notion of object is so broad and why
        !           988: paragraphs and enumerations are also considered to be objects. These object
        !           989: classes not only permit the sharing of the structures of elements, but also
        !           990: of the attributes defined in the generic structures.</p>
1.30      cvs       991: 
                    992: <p>Structure, such as that presented here, can appear very rigid, and it is
1.1       cvs       993: possible to imagine that a document editing system based on this model could
1.37    ! cvs       994: prove very constraining to the user. This is, in fact, a common criticism of
        !           995: syntax-directed editors. This defect can be avoided with Thot, primarily for
1.18      cvs       996: three reasons:</p>
                    997: <ul>
1.30      cvs       998:   <li>the generic structures are not fixed in the model itself,</li>
                    999:   <li>the model takes the dynamics of documents into account,</li>
                   1000:   <li>the constructors offer great flexibility.</li>
1.18      cvs      1001: </ul>
1.30      cvs      1002: 
                   1003: <p>When the generic structure of a document is not predefined, but rather is
1.1       cvs      1004: constructed specifically for each document class, it can be carefully adapted
1.37    ! cvs      1005: to the current needs. In cases where the generic structure is inadequate for
1.1       cvs      1006: a particular document of the class, it is always possible either to create a
                   1007: new class with a generic structure well suited to the new case or to extend
1.37    ! cvs      1008: the generic structure of the existing class to take into account the
        !          1009: specifics of the document which poses the problem. These two solutions can
        !          1010: also be applied to objects whose structures prove to be poorly designed.</p>
1.30      cvs      1011: 
                   1012: <p>The model is sufficiently flexible to take into account all the phases of
1.37    ! cvs      1013: the life of the document. When a generic structure specifies that a report
        !          1014: must contain a title, an abstract, an introduction, at least two chapters,
        !          1015: and a conclusion, this means only that a report, <em>upon completion</em>,
        !          1016: will have to contain all of these elements. When the author begins writing,
        !          1017: none of these elements is present. Thot uses this model. Therefore, it
        !          1018: tolerates documents which do not conform strictly to the generic structure of
        !          1019: their class; it also considers the generic logical structure to be a way of
        !          1020: helping the user in the construction of a complex document.</p>
1.30      cvs      1021: 
                   1022: <p>In contrast, other applications may reject a document which does not
1.37    ! cvs      1023: conform strictly to its generic structure. This is, for example, what is done
1.30      cvs      1024: by compilers which refuse to generate code for a program which is not
1.37    ! cvs      1025: syntactically correct. This might also occur when using a document
1.18      cvs      1026: application for a report which does not have an abstract or title.</p>
1.30      cvs      1027: 
                   1028: <p>The constructors of the document model bring a great flexibility to the
1.37    ! cvs      1029: generic structures. A choice constructor (and even more, a unit or schema
        !          1030: constructor) can represent several, very different elements. The list
        !          1031: constructor permits the addition of more elements of the same type. Used
1.1       cvs      1032: together, these two constructors permit any series of elements of different
1.37    ! cvs      1033: types. Of course, this flexibility can be reduced wherever necessary since a
1.1       cvs      1034: generic structure can limit the choices or the number of elements in a
1.18      cvs      1035: list.</p>
1.30      cvs      1036: 
                   1037: <p>Another difficulty linked to the use of structure in the document model
1.37    ! cvs      1038: resides in the choice of the level of the structure. The structure of a
1.1       cvs      1039: discussion could be extracted from the text itself via linguistic analysis.
                   1040: Some studies are exploring this approach, but the model of Thot excludes this
1.37    ! cvs      1041: type of structure. It only takes into account the logical structure provided
1.18      cvs      1042: explicitly by the author.</p>
1.30      cvs      1043: 
1.37    ! cvs      1044: <p>However, the level of structure of the model is not imposed. Each generic
        !          1045: structure defines its own level of structure, adapted to the document class
        !          1046: or object and to the ways in which it will be processed. If it will only be
        !          1047: edited and printed, a relatively simple structure suffices. If more
        !          1048: specialized processing will be applied to it, the structure must represent
        !          1049: the element types on which this processing must act. By way of example, a
        !          1050: simple structure is sufficient for printing formulas, but a more complex
        !          1051: structure is required to perform symbolic or numeric calculations on the
        !          1052: mathematical expressions. The document model of Thot allows both types of
        !          1053: structure.</p>
1.18      cvs      1054: </div>
                   1055: </div>
1.1       cvs      1056: 
1.18      cvs      1057: <div class="section">
1.37    ! cvs      1058: <h2><a name="sectb32" id="sectb32">The definition language for generic
        !          1059: structures</a></h2>
1.1       cvs      1060: 
1.37    ! cvs      1061: <p>Generic structures, which form the basis of the document model of Thot,
        !          1062: are specified using a special language. This definition language, called S,
        !          1063: is described in this section.</p>
1.30      cvs      1064: 
                   1065: <p>Each generic structure, which defines a class of documents or objects, is
1.2       cvs      1066: specified by a file, written in the S language, which is called a
1.37    ! cvs      1067: <em>structure schema</em>. Structure schemas are compiled into tables, called
1.18      cvs      1068: structure tables, which are used by Thot and which determine its behavior.</p>
1.1       cvs      1069: 
1.18      cvs      1070: <div class="subsection">
1.37    ! cvs      1071: <h3><a name="sectc321" id="sectc321">Writing Conventions</a></h3>
1.1       cvs      1072: 
1.30      cvs      1073: <p>The grammar of S, like those of the languages P and T presented later, is
1.1       cvs      1074: described using the meta-language M, derived from the Backus-Naur Form
1.18      cvs      1075: (BNF).</p>
1.30      cvs      1076: 
                   1077: <p>In this meta-language each rule of the grammar is composed of a grammar
1.37    ! cvs      1078: symbol followed by an equals sign (`=') and the right part of the rule. The
1.30      cvs      1079: equals sign plays the same role as the traditional `::=' of BNF: it indicates
1.37    ! cvs      1080: that the right part defines the symbol of the left part. In the right
1.30      cvs      1081: part,</p>
1.18      cvs      1082: <dl>
1.30      cvs      1083:   <dt>concatenation</dt>
                   1084:     <dd>is shown by the juxtaposition of symbols;</dd>
                   1085:   <dt>character strings</dt>
1.37    ! cvs      1086:     <dd>between apostrophes ' represent terminal symbols, that is, keywords
        !          1087:       in the language defined. Keywords are written here in upper-case
        !          1088:       letters, but can be written in any combination of upper and lower-case
        !          1089:       letters. For example, the keyword <tt>DEFPRES</tt> of S can also be
        !          1090:       written as <tt>defpres</tt> or <tt>DefPres</tt>.</dd>
1.30      cvs      1091:   <dt>material between brackets</dt>
                   1092:     <dd>(`[' and `]') is optional;</dd>
                   1093:   <dt>material between angle brackets</dt>
                   1094:     <dd>(`&lt;' and `&gt;') can be repeated many times or omitted;</dd>
                   1095:   <dt>the slash</dt>
1.37    ! cvs      1096:     <dd>(`/') indicates an alternative, a choice between the options
        !          1097:       separated by the slash character;</dd>
1.30      cvs      1098:   <dt>the period</dt>
                   1099:     <dd>marks the end of a rule;</dd>
                   1100:   <dt>text between braces</dt>
                   1101:     <dd>(`{' and `}') is simply a comment.</dd>
1.18      cvs      1102: </dl>
1.30      cvs      1103: 
                   1104: <p>The M meta-language also uses the concepts of identifiers, strings, and
1.18      cvs      1105: integers:</p>
                   1106: <dl>
1.30      cvs      1107:   <dt><tt>NAME</tt></dt>
1.37    ! cvs      1108:     <dd>represents an identifier, a sequence of letters (upper or
        !          1109:       lower-case), digits, and underline characters (`_'), beginning with a
        !          1110:       letter. Also considered a letter is the sequence of characters
        !          1111:       `<tt>\nnn</tt>' where the letter <tt>n</tt> represents the ISO Latin-1
        !          1112:       code of the letter in octal. It is thus possible to use accented
        !          1113:       letters in identifiers. The maximum length of identifiers is fixed by
        !          1114:       the compiler. It is normally 31 characters. 
1.30      cvs      1115:       <p>Unlike keywords, upper and lower-case letters are distinct in
                   1116:       identifiers. Thus, <tt>Title</tt>, <tt>TITLE</tt>, and <tt>title</tt>
                   1117:       are considered different identifiers.</p>
                   1118:     </dd>
                   1119:   <dt><tt>STRING</tt></dt>
1.37    ! cvs      1120:     <dd>represents a string. This is a string of characters delimited by
        !          1121:       apostrophes. If an apostrophe must appear in a string, it is doubled.
        !          1122:       As with identifiers, strings can contain characters represented by
        !          1123:       their octal code (after a backslash). As with apostrophes, if a
        !          1124:       backslash must appear in a string, it is doubled.</dd>
1.30      cvs      1125:   <dt><tt>NUMBER</tt></dt>
                   1126:     <dd>represents a positive integer or zero (without a sign), or said
                   1127:       another way, a sequence of decimal digits.</dd>
1.18      cvs      1128: </dl>
1.30      cvs      1129: 
                   1130: <p>The M language can be used to define itself as follows:</p>
1.18      cvs      1131: <pre>{ Any text between braces is a comment. }
1.30      cvs      1132: Grammar      = Rule &lt; Rule &gt; 'END' .
                   1133:                { The &lt; and &gt; signs indicate zero }
1.1       cvs      1134:                { or more repetitions. }
                   1135:                { END marks the end of the grammar. }
                   1136: Rule         = Ident '=' RightPart '.' .
                   1137:                { The period indicates the end of a rule }
                   1138: RightPart    = RtTerminal / RtIntermed .
                   1139:                { The slash indicates a choice }
                   1140: RtTerminal   ='NAME' / 'STRING' / 'NUMBER' .
                   1141:                { Right part of a terminal rule }
1.30      cvs      1142: RtIntermed   = Possibility &lt; '/' Possibility &gt; .
1.1       cvs      1143:                { Right part of an intermediate rule }
1.30      cvs      1144: Possibility  = ElemOpt &lt; ElemOpt &gt; .
                   1145: ElemOpt      = Element / '[' Element &lt; Element &gt; ']' /
                   1146:               '&lt;' Element &lt; Element &gt; '&gt;'  .
1.1       cvs      1147:                { Brackets delimit optional parts }
                   1148: Element      = Ident / KeyWord .
                   1149: Ident        = NAME .
                   1150:                { Identifier, sequence of characters }
                   1151: KeyWord      = STRING .
                   1152:                { Character string delimited by apostrophes }
1.18      cvs      1153: END</pre>
                   1154: </div>
1.1       cvs      1155: 
1.18      cvs      1156: <div class="subsection">
1.37    ! cvs      1157: <h3><a name="sectc322" id="sectc322">Extension schemas</a></h3>
1.1       cvs      1158: 
1.30      cvs      1159: <p>A structure schema defines the generic logical structure of a class of
1.1       cvs      1160: documents or objects, independent of the operations which can be performed on
1.37    ! cvs      1161: the documents. However, certain applications may require particular
1.1       cvs      1162: information to be represented by the structure for the documents that they
1.37    ! cvs      1163: operate on. Thus a document version manager will need to indicate in the
        !          1164: document the parts which belong to one version or another. An indexing system
1.1       cvs      1165: will add highly-structured index tables as well as the links between these
1.18      cvs      1166: tables and the rest of the document.</p>
1.30      cvs      1167: 
                   1168: <p>Thus, many applications need to extend the generic structure of the
1.37    ! cvs      1169: documents on which they operate to introduce new attributes or element types.
        !          1170: These additions are specific to each application and must be able to be
        !          1171: applied to any generic structure: users will want to manage versions or
        !          1172: construct indices for many types of documents. Extension schemas fulfill this
        !          1173: role: they define attributes, elements, units, etc., but they can only be
        !          1174: used jointly with a structure schema that they complete. Otherwise, structure
        !          1175: schemas can always be used without these extensions when the corresponding
        !          1176: applications are not available.</p>
1.18      cvs      1177: </div>
1.1       cvs      1178: 
1.18      cvs      1179: <div class="subsection">
1.37    ! cvs      1180: <h3><a name="sectc323" id="sectc323">The general organization of structure
        !          1181: schemas</a></h3>
1.1       cvs      1182: 
1.30      cvs      1183: <p>Every structure schema begins with the keyword <tt>STRUCTURE</tt> and ends
1.37    ! cvs      1184: with the keyword <tt>END</tt>. The keyword <tt>STRUCTURE</tt> is followed by
1.18      cvs      1185: the keyword <tt>EXTENSION</tt> in the case where the schema defines an
1.1       cvs      1186: extension, then by the name of the generic structure which the schema defines
1.37    ! cvs      1187: (the name of the document or object class). The name of the structure is
1.18      cvs      1188: followed by a semicolon.</p>
1.30      cvs      1189: 
                   1190: <p>In the case of a complete schema (that is, a schema which is not an
1.1       cvs      1191: extension), the definition of the name of the structure is followed by the
                   1192: declarations of the default presentation schema, the global attributes, the
1.37    ! cvs      1193: structure rules, the units, the skeleton elements and the exceptions. Only
        !          1194: the definition of the structure rules is required. Each series of
        !          1195: declarations begins with a keyword: <tt>DEFPRES</tt>, <tt>ATTR</tt>,
        !          1196: <tt>STRUCT</tt>, <tt>UNITS</tt>, <tt>EXPORT</tt>, <tt>EXCEPT</tt>.</p>
1.34      cvs      1197: 
                   1198: <p>In the case of an extension schema, there are no skeleton elements and the
                   1199: <tt>STRUCT</tt> section is optional, while that section is required in a
1.37    ! cvs      1200: schema that is not an extension. On the other hand, extension schemas can
        !          1201: contain an <tt>EXTENS</tt> section, which must not appear in a schema which
        !          1202: is not an extension; this section defines the complements to attach to the
        !          1203: rules found in the schema to which the extension will be added. The sections
        !          1204: <tt>ATTR</tt>, <tt>STRUCT</tt>, and <tt>UNITS</tt> define new attributes, new
        !          1205: elements, and new units which add their definitions to the principal
        !          1206: schema.</p>
1.18      cvs      1207: <pre>     StructSchema ='STRUCTURE' ElemID ';'
1.1       cvs      1208:                    'DEFPRES' PresID ';'
                   1209:                  [ 'ATTR' AttrSeq ]
                   1210:                    'STRUCT' RulesSeq
                   1211:                  [ 'UNITS' RulesSeq ]
                   1212:                  [ 'EXPORT' SkeletonSeq ]
                   1213:                  [ 'EXCEPT' ExceptSeq ]
                   1214:                    'END' .
1.18      cvs      1215:      ElemID       = NAME .</pre>
1.30      cvs      1216: 
                   1217: <p>or</p>
1.18      cvs      1218: <pre>     ExtensSchema ='STRUCTURE' 'EXTENSION' ElemID ';'
1.1       cvs      1219:                    'DEFPRES' PresID ';'
                   1220:                  [ 'ATTR' AttrSeq ]
                   1221:                  [ 'STRUCT' RulesSeq ]
                   1222:                  [ 'EXTENS' ExtensRuleSeq ]
                   1223:                  [ 'UNITS' RulesSeq ]
                   1224:                  [ 'EXCEPT' ExceptSeq ]
                   1225:                    'END' .
1.18      cvs      1226:      ElemID       = NAME .</pre>
                   1227: </div>
1.1       cvs      1228: 
1.18      cvs      1229: <div class="subsection">
1.37    ! cvs      1230: <h3><a name="sectc324" id="sectc324">The default presentation</a></h3>
1.1       cvs      1231: 
1.37    ! cvs      1232: <p>It was shown <a href="#mulpres">above</a> that many different
        !          1233: presentations are possible for documents and objects of the same class. The
        !          1234: structure schema defines a preferred presentation for the class, called the
        !          1235: <em>default presentation</em>. Like generic structures, presentations are
        !          1236: described by programs, called <em>presentation schemas</em>, which are
        !          1237: written in a specific language, P, presented <a href="#sectb42">later</a> in
        !          1238: this document. The name appearing after the keyword <tt>DEFPRES</tt> is the
        !          1239: name of the default presentation schema. When a new document is created, Thot
        !          1240: will use this presentation schema by default, but the user remains free to
        !          1241: choose another if s/he wishes.</p>
1.18      cvs      1242: <pre>     PresID = NAME .</pre>
                   1243: </div>
1.1       cvs      1244: 
1.18      cvs      1245: <div class="subsection">
1.37    ! cvs      1246: <h3><a name="sectc325" id="sectc325">Global Attributes</a></h3>
1.1       cvs      1247: 
1.30      cvs      1248: <p>If the generic structure includes global attributes of its own, they are
1.37    ! cvs      1249: declared after the keyword <tt>ATTR</tt>. Each global attribute is defined by
        !          1250: its name, followed by an equals sign and the definition of its type. The
1.18      cvs      1251: declaration of a global attribute is terminated by a semi-colon.</p>
1.30      cvs      1252: 
                   1253: <p>For attributes of the numeric, textual, or reference types, the type is
1.37    ! cvs      1254: indicated by a keyword, <tt>INTEGER</tt>, <tt>TEXT</tt>, or
        !          1255: <tt>REFERENCE</tt> respectively.</p>
1.30      cvs      1256: 
                   1257: <p>In the case of a reference attribute, the keyword <tt>REFERENCE</tt> is
1.37    ! cvs      1258: followed by the type of the referenced element in parentheses. It can refer
1.18      cvs      1259: to any type at all, specified by using the keyword <tt>ANY</tt>, or to a
1.37    ! cvs      1260: specific type. In the latter case, the element type designated by the
1.18      cvs      1261: reference can be defined either in the <a href="#sectc327"><tt>STRUCT</tt>
                   1262: section</a> of the same structure schema or in the <tt>STRUCT</tt> section of
1.37    ! cvs      1263: another structure schema. When the type is defined in another schema, the
1.1       cvs      1264: element type is followed by the name of the structure schema (within
1.37    ! cvs      1265: parentheses) in which it is defined. The name of the designated element type
1.18      cvs      1266: can be preceded by the keyword <tt>First</tt> or <tt>Second</tt>, but only in
1.37    ! cvs      1267: the case where the type is defined as <a href="#sectd3285">a pair</a>. These
1.1       cvs      1268: keywords indicate whether the attribute must designate the first mark of the
1.37    ! cvs      1269: pair or the second. If the reference refers to a pair and neither of these
1.18      cvs      1270: two keywords is present, then the first mark is used.</p>
1.30      cvs      1271: 
1.37    ! cvs      1272: <p>In the case of an enumeration attribute, the equals sign is followed by
        !          1273: the list of names representing the possible values of the attribute, the
        !          1274: names being separated from each other by commas. An enumeration attribute has
        !          1275: at least one possible value; the maximum number of values is defined by the
1.18      cvs      1276: compiler for the S language.</p>
1.30      cvs      1277: <pre>     AttrSeq   = Attribute &lt; Attribute &gt; .
1.1       cvs      1278:      Attribute = AttrID '=' AttrType  ';' .
                   1279:      AttrType  = 'INTEGER' / 'TEXT' /
                   1280:                  'REFERENCE' '(' RefType ')' /
                   1281:                  ValueSeq .
                   1282:      RefType   = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] .
                   1283:      FirstSec  = 'First' / 'Second' .
                   1284:      ExtStruct = '(' ElemID ')' .
1.30      cvs      1285:      ValueSeq  = AttrVal &lt; ',' AttrVal &gt; .
1.1       cvs      1286:      AttrID    = NAME .
1.18      cvs      1287:      AttrVal   = NAME .</pre>
1.30      cvs      1288: 
                   1289: <p>There is a predefined global text attribute, the <em>language</em>, which
1.37    ! cvs      1290: is automatically added to every Thot structure schema. This attribute allows
        !          1291: Thot to perform certain actions, such as hyphenation and spell-checking,
        !          1292: which cannot be performed without knowing the language in which each part of
        !          1293: the document is written. This attribute can be used just like any explicitly
1.18      cvs      1294: declared attribute: the system acts as if every structure schema contains</p>
                   1295: <pre>ATTR
                   1296:    Language = TEXT;</pre>
1.30      cvs      1297: 
1.18      cvs      1298: <blockquote class="example">
1.30      cvs      1299:   <p><strong>Example:</strong></p>
                   1300: 
                   1301:   <p>The following specification defines the global enumeration attribute
                   1302:   WordType.</p>
                   1303:   <pre>ATTR
1.18      cvs      1304:    WordType = Definition, IndexWord, DocumentTitle;</pre>
                   1305: </blockquote>
                   1306: </div>
1.1       cvs      1307: 
1.18      cvs      1308: <div class="subsection">
1.37    ! cvs      1309: <h3><a name="sectc327" id="sectc327">Structured elements</a></h3>
1.1       cvs      1310: 
1.30      cvs      1311: <p>The rules for defining structured elements are required, except in an
1.1       cvs      1312: extension schema: they constitute the core of a structure schema, since they
                   1313: define the structure of the different types of elements that occur in a
1.18      cvs      1314: document or object of the class defined by the schema.</p>
1.30      cvs      1315: 
                   1316: <p>The first structure rule after the keyword <tt>STRUCT</tt> must define the
1.1       cvs      1317: structure of the class whose name appears in the first instruction
1.37    ! cvs      1318: (<tt>STRUCTURE</tt>) of the schema. This is the root rule of the schema,
1.18      cvs      1319: defining the root of the document tree or object tree.</p>
1.30      cvs      1320: 
                   1321: <p>The remaining rules may be placed in any order, since the language permits
1.37    ! cvs      1322: the definition of element types before or after their use, or even in the
        !          1323: same instruction in which they are used. This last case allows the definition
        !          1324: of recursive structures.</p>
1.30      cvs      1325: 
                   1326: <p>Each rule is composed of a name (the name of the element type whose
                   1327: structure is being defined) followed by an equals sign and a structure
                   1328: definition.</p>
                   1329: 
1.37    ! cvs      1330: <p>If any local attributes are associated with the element type defined by
        !          1331: the rule, they appear between parentheses after the type name and before the
        !          1332: equals sign. The parentheses contain, first, the keyword <tt>ATTR</tt>, then
        !          1333: the list of local attributes, separated by commas. Each local attribute is
1.2       cvs      1334: composed of the name of the attribute followed by an equals sign and the
1.18      cvs      1335: definition of the attribute's type, just as in the definition of <a
1.37    ! cvs      1336: href="#sectc325">global attributes</a>. The name of the attribute can be
        !          1337: preceded by an exclamation point to indicate that the attribute must always
        !          1338: be present for this element type. The same attribute, identified by its name,
        !          1339: can be defined as a local attribute for multiple element types. In this case,
        !          1340: the equals sign and definition of the attribute type need only appear in the
        !          1341: first occurrence of the attribute. It should be noted that global attributes
        !          1342: cannot also be defined as local attributes.</p>
1.30      cvs      1343: 
                   1344: <p>If any <a href="#sectd3135">extensions</a> are defined for this element
                   1345: type, a plus sign follows the structure definition and the names of the
1.37    ! cvs      1346: extension element types appear between parentheses after the plus. If there
        !          1347: are multiple extensions, they are separated by commas. These types can either
1.30      cvs      1348: be defined in the same schema, defined in other schemas, or they may be base
1.18      cvs      1349: types identified by the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>,
                   1350: <tt>SYMBOL</tt>, or <tt>PICTURE</tt>.</p>
1.30      cvs      1351: 
                   1352: <p><a href="#sectd3135">Restrictions</a> are indicated in the same manner as
1.18      cvs      1353: extensions, but they are introduced by a minus sign and they come after the
                   1354: extensions, or if there are no extensions, after the structure definition.</p>
1.30      cvs      1355: 
1.37    ! cvs      1356: <p>If the values of attributes must be attached systematically to this
        !          1357: element type, they are introduced by the keyword <tt>WITH</tt> and declared
        !          1358: in the form of a list of fixed-value attributes. When such definitions of
        !          1359: fixed attribute values appear, they are always the last part of the rule.</p>
1.30      cvs      1360: 
                   1361: <p>The rule is terminated by a semicolon.</p>
                   1362: <pre>  RuleSeq       = Rule &lt; Rule &gt; .
1.1       cvs      1363:   Rule          = ElemID [ LocAttrSeq ] '=' DefWithAttr ';'.
1.30      cvs      1364:   LocAttrSeq    = '(' 'ATTR' LocAttr &lt; ';' LocAttr &gt; ')' .
1.1       cvs      1365:   LocAttr       = [ '!' ] AttrID [ '=' AttrType ] .
                   1366:   DefWithAttr   = Definition
                   1367:                   [ '+' '(' ExtensionSeq ')' ]
                   1368:                   [ '-' '(' RestrictSeq ')' ]
                   1369:                   [ 'WITH' FixedAttrSeq ] .
1.30      cvs      1370:   ExtensionSeq  = ExtensionElem &lt; ',' ExtensionElem &gt; .
1.1       cvs      1371:   ExtensionElem = ElemID / 'TEXT' / 'GRAPHICS' /
                   1372:                   'SYMBOL' / 'PICTURE' .
1.30      cvs      1373:   RestrictSeq   = RestrictElem &lt; ',' RestrictElem &gt; .
1.1       cvs      1374:   RestrictElem  = ElemID / 'TEXT' / 'GRAPHICS' /
1.18      cvs      1375:                   'SYMBOL' / 'PICTURE' .</pre>
1.30      cvs      1376: 
                   1377: <p>The list of fixed-value attributes is composed of a sequence of
1.37    ! cvs      1378: attribute-value pairs separated by commas. Each pair contains the name of the
1.1       cvs      1379: attribute and the fixed value for this element type, the two being separated
1.37    ! cvs      1380: by an equals sign. If the sign is preceded by a question mark the given value
1.1       cvs      1381: is only an initial value that may be modified later rather than a value fixed
1.37    ! cvs      1382: for all time. Reference attributes are an exception to this norm. They cannot
        !          1383: be assigned a fixed value, but when the name of such an attribute appears
        !          1384: this indicates that this element type must have a valid value for the
        !          1385: attribute. For the other attribute types, the fixed value is indicated by a
1.1       cvs      1386: signed integer (numeric attributes), a character string between apostrophes
1.18      cvs      1387: (textual attributes) or the name of a value (enumeration attributes).</p>
1.30      cvs      1388: 
                   1389: <p>Fixed-value attributes can either be <a href="#sectc325">global</a> or
                   1390: local to the element type for which they are fixed, but they must be declared
                   1391: before they are used.</p>
                   1392: <pre>    FixedAttrSeq    = FixedAttr &lt; ',' FixedAttr &gt; .
1.1       cvs      1393:     FixedAttr       = AttrID [ FixedOrModifVal ] .
                   1394:     FixedOrModifVal = [ '?' ] '=' FixedValue .
                   1395:     FixedValue      = [ '-' ] NumValue / TextVal / AttrVal .
                   1396:     NumValue        = NUMBER .
1.18      cvs      1397:     TextVal         = STRING .</pre>
                   1398: </div>
1.1       cvs      1399: 
1.18      cvs      1400: <div class="subsection">
1.37    ! cvs      1401: <h3><a name="sectc328" id="sectc328">Structure definitions</a></h3>
1.1       cvs      1402: 
1.37    ! cvs      1403: <p>The structure of an element type can be a simple base type or a
        !          1404: constructed type.</p>
1.30      cvs      1405: 
                   1406: <p>For constructed types, it is frequently the case that similar structures
1.37    ! cvs      1407: appear in many places in a document. For example the contents of the
1.1       cvs      1408: abstract, of the introduction, and of a section can have the same structure,
1.37    ! cvs      1409: that of a sequence of paragraphs. In this case, a single, common structure
1.1       cvs      1410: can be defined (the paragraph sequence in this example), and the schema is
                   1411: written to indicate that each element type possesses this structure, as
1.18      cvs      1412: follows:</p>
                   1413: <pre>     Abstract           = Paragraph_sequence;
1.1       cvs      1414:      Introduction       = Paragraph_sequence;
1.18      cvs      1415:      Section_contents   = Paragraph_sequence;</pre>
1.30      cvs      1416: 
                   1417: <p>The equals sign means ``has the same structure as''.</p>
                   1418: 
1.37    ! cvs      1419: <p>If the element type defined is a simple base type, this is indicated by
        !          1420: one of the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>, <tt>SYMBOL</tt>, or
        !          1421: <tt>PICTURE</tt>. If some local attributes must be associated with a base
        !          1422: type, the keyword of the base type is followed by the declaration of the
        !          1423: local attributes using the syntax <a href="#sectc327">presented above.</a></p>
1.30      cvs      1424: 
                   1425: <p>In the case of an open choice, the type is indicated by the keyword
1.18      cvs      1426: <tt>UNIT</tt> for units or the keyword <tt>NATURE</tt> for objects having a
                   1427: structure defined by any other schema.</p>
1.30      cvs      1428: 
                   1429: <p>A unit represents one of the two following categories:</p>
1.18      cvs      1430: <ul>
1.30      cvs      1431:   <li>a base type: text, graphical element, symbol, picture,</li>
1.37    ! cvs      1432:   <li>an element whose type is chosen from among the types defined as units
        !          1433:     in the <tt>UNITS</tt> section of the document's structure schema. It can
1.30      cvs      1434:     also be chosen from among the types defined as <a
                   1435:     href="#sectd3132">units</a> in the <a href="#sectc3212"><tt>UNITS</tt>
                   1436:     section</a> of the structure schemas that defines the ancestors of the
                   1437:     element to which the rule is applied.</li>
1.18      cvs      1438: </ul>
1.30      cvs      1439: 
                   1440: <p>Before the creation of an element defined as a unit, Thot asks the user to
1.18      cvs      1441: choose between the categories of elements.</p>
1.30      cvs      1442: 
                   1443: <p>Thus, the contents of a paragraph can be specified as a sequence of units,
1.1       cvs      1444: which will permit the inclusion in the paragraphs of character strings,
                   1445: symbols, and various elements, such as cross-references, if these are defined
1.18      cvs      1446: as units.</p>
1.30      cvs      1447: 
1.37    ! cvs      1448: <p>A schema object (keyword <tt>NATURE</tt>) represents an object defined by
        !          1449: a structure schema freely chosen from among the available schemas; in the
        !          1450: case the element type is defined by the first rule (the root rule) of the
        !          1451: chosen schema.</p>
1.30      cvs      1452: 
                   1453: <p>If the element type defined is a constructed type, the list, aggregate,
1.37    ! cvs      1454: choice, and reference constructors are used. In this case the definition
        !          1455: begins with a keyword identifying the constructor. This keyword is followed
1.18      cvs      1456: by a syntax specific to each constructor.</p>
1.30      cvs      1457: 
                   1458: <p>The local attribute definitions appear after the name of the element type
1.18      cvs      1459: being defined, if this element type has <a href="#sectc327">local
                   1460: attributes</a>.</p>
                   1461: <pre>   Definition = BaseType [ LocAttrSeq ] / Constr / Element .
1.1       cvs      1462:    BaseType   = 'TEXT' / 'GRAPHICS' / 'SYMBOL' / 'PICTURE' /
                   1463:                 'UNIT' / 'NATURE' .
                   1464:    Element    = ElemID [ ExtOrDef ] .
                   1465:    ExtOrDef   = 'EXTERN' / 'INCLUDED' / 
                   1466:                 [ LocAttrSeq ] '=' Definition .
                   1467:    Constr     = 'LIST' [ '[' min '..' max ']' ] 'OF'
                   1468:                        '(' DefWithAttr ')' /
                   1469:                 'BEGIN' DefOptSeq 'END' /
                   1470:                 'AGGREGATE' DefOptSeq 'END' /
                   1471:                 'CASE' 'OF' DefSeq 'END' /
                   1472:                 'REFERENCE' '(' RefType ')' /
1.18      cvs      1473:                 'PAIR' .</pre>
1.1       cvs      1474: 
1.18      cvs      1475: <div class="subsubsection">
1.37    ! cvs      1476: <h4><a name="sectd3281" id="sectd3281">List</a></h4>
1.1       cvs      1477: 
1.30      cvs      1478: <p>The list constructor permits the definition of an element type composed of
1.37    ! cvs      1479: a list of elements, all of the same type. A list definition begins with the
1.18      cvs      1480: <tt>LIST</tt> keyword followed by an optional range, the keyword <tt>OF</tt>,
1.1       cvs      1481: and the definition, between parentheses, of the element type which must
1.37    ! cvs      1482: compose the list. The optional range is composed of the minimum and maximum
1.1       cvs      1483: number of elements for the list separated by two periods and enclosed by
1.37    ! cvs      1484: brackets. If the range is not present, the number of list elements is
        !          1485: unconstrained. When only one of the two bounds of the range is unconstrained,
        !          1486: it is represented by a star ('*') character. Even when both bounds are
        !          1487: unconstrained, they can be specified by <tt>[*..*]</tt>, but it is simpler
        !          1488: not to specify any bound.</p>
1.18      cvs      1489: <pre>               'LIST' [ '[' min '..' max ']' ]
1.1       cvs      1490:                'OF' '(' DefWithAttr ')'
                   1491:      min     = Integer / '*' .
                   1492:      max     = Integer / '*' .
1.18      cvs      1493:      Integer = NUMBER .</pre>
1.30      cvs      1494: 
                   1495: <p>Before the document is edited, Thot creates the minimum number of elements
1.37    ! cvs      1496: for the list. If no minimum was given, it creates a single element. If a
1.30      cvs      1497: maximum number of elements is given and that number is attained, the editor
                   1498: refuses to create new elements for the list.</p>
                   1499: 
                   1500: <blockquote class="example">
                   1501:   <p><strong>Example:</strong></p>
                   1502: 
                   1503:   <p>The following two instructions define the body of a document as a
                   1504:   sequence of at least two chapters and the contents of a section as a
1.37    ! cvs      1505:   sequence of paragraphs. A single paragraph can be the entire contents of a
1.30      cvs      1506:   section.</p>
                   1507:   <pre>Body             = LIST [2..*] OF (Chapter);
1.18      cvs      1508: Section_contents = LIST OF (Paragraph);</pre>
                   1509: </blockquote>
                   1510: </div>
1.1       cvs      1511: 
1.18      cvs      1512: <div class="subsubsection">
1.37    ! cvs      1513: <h4><a name="sectd3282" id="sectd3282">Aggregate</a></h4>
1.1       cvs      1514: 
1.37    ! cvs      1515: <p>The aggregate constructor is used to define an element type as a
        !          1516: collection of sub-elements, each having a fixed type. The collection may be
        !          1517: ordered or unordered. The elements composing the collection are called
        !          1518: <em>components</em>. In the definition of an aggregate, a keyword indicates
1.18      cvs      1519: whether or not the aggregate is ordered: <tt>BEGIN</tt> for an ordered
                   1520: aggregate, <tt>AGGREGATE</tt> for an unordered aggregate. This keyword is
1.1       cvs      1521: followed by the list of component type definitions which is terminated by the
1.37    ! cvs      1522: <tt>END</tt> keyword. The component type definitions are separated by
1.18      cvs      1523: commas.</p>
1.30      cvs      1524: 
                   1525: <p>Before creating an aggregate, the Thot editor creates all the aggregate's
1.1       cvs      1526: components in the order they appear in the structure schema, even for
1.37    ! cvs      1527: unordered aggregates. However, unlike ordered aggregates, the components of
1.1       cvs      1528: an unordered aggregate may be rearranged using operations of the Thot editor.
                   1529: The exceptions to the rule are any components whose name was preceded by a
1.37    ! cvs      1530: question mark character ('?'). These components, which are optional, can be
1.1       cvs      1531: created by explicit request, possibly at the time the aggregate is created,
1.18      cvs      1532: but they are not created automatically <em>prior</em> to the creation of the
                   1533: aggregate.</p>
                   1534: <pre>                 'BEGIN' DefOptSeq 'END'
1.30      cvs      1535:      DefOptSeq = DefOpt ';' &lt; DefOpt ';' &gt; .
1.18      cvs      1536:      DefOpt    = [ '?' ] DefWithAttr .</pre>
1.30      cvs      1537: 
1.18      cvs      1538: <blockquote class="example">
1.30      cvs      1539:   <p><strong>Example:</strong></p>
                   1540: 
                   1541:   <p>In a bilingual document, each paragraph has an English version and a
1.37    ! cvs      1542:   French version. In certain cases, the translator wants to add a marginal
        !          1543:   note, but this note is present in very few paragraphs. Thus, it must not be
        !          1544:   created systematically for every paragraph. A bilingual paragraph of this
1.30      cvs      1545:   type is declared:</p>
                   1546:   <pre>Bilingual_paragraph = BEGIN
1.1       cvs      1547:                       French_paragraph  = TEXT;
                   1548:                       English_paragraph = TEXT;
                   1549:                       ? Note            = TEXT;
1.18      cvs      1550:                       END;</pre>
                   1551: </blockquote>
                   1552: </div>
1.1       cvs      1553: 
1.18      cvs      1554: <div class="subsubsection">
1.37    ! cvs      1555: <h4><a name="sectd3283" id="sectd3283">Choice</a></h4>
1.1       cvs      1556: 
1.30      cvs      1557: <p>The choice constructor permits the definition of an element type which is
1.37    ! cvs      1558: chosen from among a set of possible types. The keywords <tt>CASE</tt> and
        !          1559: <tt>OF</tt> are followed by a list of definitions of possible types, which
        !          1560: are separated by semicolons and terminated by the <tt>END</tt> keyword.</p>
1.18      cvs      1561: <pre>               'CASE' 'OF' DefSeq 'END'
1.30      cvs      1562:      DefSeq = DefWithAttr ';' &lt; DefWithAttr ';' &gt; .</pre>
                   1563: 
                   1564: <p>Before the creation of an element defined as a choice, the Thot editor
1.37    ! cvs      1565: presents the list of possible types for the element to the user. The user has
1.18      cvs      1566: only to select the element type that s/he wants to create from this list.</p>
1.30      cvs      1567: 
1.37    ! cvs      1568: <p>The order of the type declarations is important. It determines the order
        !          1569: of the list presented to the user before the creation of the element. Also,
1.30      cvs      1570: when a Choice element is being created automatically, the first type in the
1.37    ! cvs      1571: list is used. In fact, using the Thot editor, when an empty Choice element is
1.1       cvs      1572: selected, it is possible to select this element and to enter its text from
                   1573: keyboard. In this case, the editor uses the first element type which can
1.18      cvs      1574: contain an atom of the character string type.</p>
1.30      cvs      1575: 
                   1576: <p>The two special cases of the choice constructor, the <a
1.18      cvs      1577: href="#sectc328"><em>schema</em></a> and the <a
                   1578: href="#sectc3212"><em>unit</em></a> are discussed elsewhere.</p>
1.30      cvs      1579: 
1.18      cvs      1580: <blockquote class="example">
1.30      cvs      1581:   <p><strong>Example:</strong></p>
                   1582: 
                   1583:   <p>It is common in documents to treat a variety of objects as if they were
1.37    ! cvs      1584:   ordinary paragraphs. Thus, a ``Paragraph'' might actually be composed of a
1.30      cvs      1585:   block of text (an ordinary paragraph), or a mathematical formula whose
                   1586:   structure is defined by another structure schema named Math, or a table,
1.37    ! cvs      1587:   also defined by another structure schema. Here is a definition of such a
1.30      cvs      1588:   paragraph:</p>
                   1589:   <pre>Paragraph = CASE OF
1.1       cvs      1590:               Simple_text = TEXT;
                   1591:               Formula     = Math;
                   1592:               Table_para  = Table;
1.18      cvs      1593:               END;</pre>
                   1594: </blockquote>
                   1595: </div>
1.1       cvs      1596: 
1.18      cvs      1597: <div class="subsubsection">
1.37    ! cvs      1598: <h4><a name="sectd3284" id="sectd3284">Reference</a></h4>
1.1       cvs      1599: 
1.37    ! cvs      1600: <p>Like all elements in Thot, references are typed. An element type defined
1.30      cvs      1601: as a reference is a cross-reference to an element of some other given type.
                   1602: The keyword <tt>REFERENCE</tt> is followed by the name of a type enclosed in
1.37    ! cvs      1603: parentheses. When the type which is being cross-referenced is defined in
1.1       cvs      1604: another structure schema, the type name is itself followed by the name of the
1.18      cvs      1605: external structure schema in which it is defined.</p>
1.30      cvs      1606: 
                   1607: <p>When the designated element type is a <a href="#sectd3285">mark pair</a>,
1.37    ! cvs      1608: it can be preceded by a <tt>FIRST</tt> or <tt>SECOND</tt> keyword. These
1.18      cvs      1609: keywords indicate whether the reference points to the first or second mark of
                   1610: the pair. If the reference points to a pair and neither of these two keywords
                   1611: is present, the reference is considered to point to the first mark of the
                   1612: pair.</p>
1.30      cvs      1613: 
1.37    ! cvs      1614: <p>There is an exception to the principle of typed references: it is possible
1.30      cvs      1615: to define a reference which designates an element of any type, which can
                   1616: either be in the same document or another document. In this case, it suffices
                   1617: to put the keyword <tt>ANY</tt> in the parentheses which indicate the
                   1618: referenced element type.</p>
1.18      cvs      1619: <pre>             'REFERENCE' '(' RefType ')'
                   1620:    RefType = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] .</pre>
1.30      cvs      1621: 
                   1622: <p>When defining an inclusion, the <tt>REFERENCE</tt> keyword is not used.
1.1       cvs      1623: Inclusions with complete expansion are not declared as such in the structure
1.37    ! cvs      1624: schemas, since any element defined in a structure schema can be replaced by
        !          1625: an element of the same type. Instead, inclusions without expansion or with
1.1       cvs      1626: partial expansion must be declared explicitly whenever they will include a
1.37    ! cvs      1627: complete object ( and not a part of an object). In this case, the object type
1.1       cvs      1628: to be included (that is, the name of its structure schema) is followed by a
1.37    ! cvs      1629: keyword: <tt>EXTERN</tt> for inclusion without expansion and
        !          1630: <tt>INCLUDED</tt> for partial expansion.</p>
1.30      cvs      1631: 
1.37    ! cvs      1632: <p>Before creating a cross-reference or an inclusion, the Thot editor asks
        !          1633: the user to choose, from the document images displayed, the referenced or
        !          1634: included element.</p>
1.30      cvs      1635: 
1.18      cvs      1636: <blockquote class="example">
1.30      cvs      1637:   <p><strong>Example:</strong></p>
                   1638: 
                   1639:   <p>If the types Note and Section are defined in the Article structure
                   1640:   schema, it is possible to define, in the same structure schema, a reference
                   1641:   to a note and a reference to a section in this manner:</p>
                   1642:   <pre>Ref_note    = REFERENCE (Note);
1.18      cvs      1643: Ref_section = REFERENCE (Section);</pre>
1.30      cvs      1644: 
                   1645:   <p>It is also possible to define the generic structure of a collection of
                   1646:   articles, which include (with partial expansion) objects of the Article
                   1647:   class and which possess an introduction which may include cross-references
1.37    ! cvs      1648:   to sections of the included articles. In the Collection structure schema,
1.30      cvs      1649:   the definitions are:</p>
                   1650:   <pre>Collection = BEGIN
1.6       cvs      1651:              Collection_title = TEXT;
                   1652:              Introduction = LIST OF (Elem = CASE OF
1.1       cvs      1653:                                            TEXT;
                   1654:                                            Ref_sect;
                   1655:                                            END);
1.6       cvs      1656:              Body = LIST OF (Article INCLUDED);
                   1657:              END;
1.18      cvs      1658: Ref_sect   = REFERENCE (Section (Article));</pre>
1.30      cvs      1659: 
                   1660:   <p>Here we define a Folder document class which has a title and includes
                   1661:   documents of different types, particularly Folders:</p>
                   1662:   <pre>Folder   = BEGIN
1.6       cvs      1663:            Folder_title    = TEXT;
                   1664:            Folder_contents = LIST OF (Document);
                   1665:            END;
1.1       cvs      1666: 
                   1667: Document = CASE OF
                   1668:               Article EXTERN;
                   1669:               Collection EXTERN;
                   1670:               Folder EXTERN;
1.18      cvs      1671:               END;</pre>
1.30      cvs      1672: 
                   1673:   <p>Under this definition, Folder represents either an aggregate which
                   1674:   contains a folder title and the list of included documents or an included
1.37    ! cvs      1675:   folder. To resolve this ambiguity, in the P language, the placement of a
1.30      cvs      1676:   star character in front of the type name (here, Folder) indicates an
                   1677:   included document.</p>
1.18      cvs      1678: </blockquote>
                   1679: </div>
1.1       cvs      1680: 
1.18      cvs      1681: <div class="subsubsection">
1.37    ! cvs      1682: <h4><a name="sectd3285" id="sectd3285">Mark pairs</a></h4>
1.1       cvs      1683: 
1.37    ! cvs      1684: <p>Like other elements, mark pairs are typed. The two marks of the pair have
        !          1685: the same type, but there exist two predefined subtypes which apply to all
        !          1686: mark pairs: the first mark of the pair (called <tt>First</tt> in the P and T
1.18      cvs      1687: languages) and the second mark (called <tt>Second</tt>).</p>
1.30      cvs      1688: 
                   1689: <p>In the S language, a mark pair is noted simply by the <tt>PAIR</tt>
1.18      cvs      1690: keyword.</p>
1.30      cvs      1691: 
1.37    ! cvs      1692: <p>In the Thot editor, marks are always moved or destroyed together. The two
1.1       cvs      1693: marks of a pair have the same identifier, unique within the document, which
1.18      cvs      1694: permits intertwining mark pairs without risk of ambiguity.</p>
                   1695: </div>
                   1696: </div>
1.1       cvs      1697: 
1.18      cvs      1698: <div class="subsection">
1.37    ! cvs      1699: <h3><a name="sectc329" id="sectc329">Imports</a></h3>
1.1       cvs      1700: 
1.30      cvs      1701: <p>Because of schema constructors, it is possible, before editing a document,
1.37    ! cvs      1702: to use classes defined by other structure schemas whenever they are needed.
        !          1703: It is also possible to assign specific document classes to certain element
        !          1704: types. In this case, these classes are simply designated by their name. In
        !          1705: fact, if a type name is not defined in the structure schema, it is assumed
        !          1706: that it specifies a structure defined by another structure schema.</p>
1.30      cvs      1707: 
1.18      cvs      1708: <blockquote class="example">
1.30      cvs      1709:   <p><strong>Example:</strong></p>
                   1710: 
                   1711:   <p>If the types Math and Table don't appear in the left part of a structure
                   1712:   rule in the schema, the following two rules indicate that a formula has the
1.37    ! cvs      1713:   structure of an object defined by the structure schema Math and that a
        !          1714:   table element has the structure of an object defined by the Table
        !          1715:   schema.</p>
1.30      cvs      1716:   <pre>Formula    = Math;
1.18      cvs      1717: Table_elem = Table;</pre>
                   1718: </blockquote>
                   1719: </div>
                   1720: 
                   1721: <div class="subsection">
1.37    ! cvs      1722: <h3><a name="sectc3210" id="sectc3210">Extension rules</a></h3>
1.18      cvs      1723: 
1.30      cvs      1724: <p>The <tt>EXTENS</tt> section, which can only appear in an extension schema,
1.1       cvs      1725: defines complements to the rules in the primary schema (i.e. the structure
                   1726: schema to which the extension schema will be applied). More precisely, this
                   1727: section permits the addition to an existing type of local attributes,
1.18      cvs      1728: extensions, restrictions and fixed-value attributes.</p>
1.30      cvs      1729: 
                   1730: <p>These additions can be applied to the root rule of the primary schema,
1.18      cvs      1731: designated by the keyword <tt>Root</tt>, or to any other explicitly named
                   1732: rule.</p>
1.30      cvs      1733: 
                   1734: <p>Extension rules are separated from each other by a semicolon and each
1.18      cvs      1735: extension rule has the same syntax as a <a href="#sectc327">structure
                   1736: rule</a>, but the part which defines the constructor is absent.</p>
1.30      cvs      1737: <pre>     ExtenRuleSeq = ExtensRule ';' &lt; ExtensRule ';' &gt; .
1.6       cvs      1738:      ExtensRule   = RootOrElem [ LocAttrSeq ]
                   1739:                     [ '+' '(' ExtensionSeq ')' ]
                   1740:                     [ '-' '(' RestrictSeq ')' ]
                   1741:                     [ 'WITH' FixedAttrSeq ] .
1.18      cvs      1742:      RootOrElem   = 'Root' / ElemID .</pre>
                   1743: </div>
1.1       cvs      1744: 
1.18      cvs      1745: <div class="subsection">
1.37    ! cvs      1746: <h3><a name="sectc3212" id="sectc3212">Units</a></h3>
1.30      cvs      1747: 
                   1748: <p>The <tt>UNITS</tt> section of the structure schema contains the
                   1749: declarations of the element types which can be used in the external objects
                   1750: making up parts of the document or in objects of the class defined by the
1.37    ! cvs      1751: schema. These element types are defined just like other structured element
        !          1752: types. They can be used in the other element types of the schema, but they
        !          1753: can also be used in any other rule of the schema.</p>
1.30      cvs      1754: 
                   1755: <blockquote class="example">
                   1756:   <p><strong>Example:</strong></p>
1.1       cvs      1757: 
1.30      cvs      1758:   <p>If references to notes are declared as units:</p>
                   1759:   <pre>UNITS
1.18      cvs      1760:    Ref_note = REFERENCE (Note);</pre>
1.30      cvs      1761: 
1.37    ! cvs      1762:   <p>then it is possible to use references to notes in a cell of a table,
        !          1763:   even when <tt>Table</tt> is an external structure schema. The
        !          1764:   <tt>Table</tt> schema must declare a cell to be a sequence of units, which
        !          1765:   can then be base element types (text, for example) or references to notes
        !          1766:   in the document.</p>
1.30      cvs      1767:   <pre>Cell = LIST OF (UNITS);</pre>
1.18      cvs      1768: </blockquote>
                   1769: </div>
1.1       cvs      1770: 
1.18      cvs      1771: <div class="subsection">
1.37    ! cvs      1772: <h3><a name="sectc3213" id="sectc3213">Skeleton elements</a></h3>
1.1       cvs      1773: 
1.30      cvs      1774: <p>When editing a document which contains or must contain external references
                   1775: to several other documents, it may be necessary to load a large number of
1.1       cvs      1776: documents, simply to see the parts designated by the external references of
1.37    ! cvs      1777: the document while editing, or to access the source of included elements. In
        !          1778: this case, the external documents are not modified and it is only necessary
        !          1779: to see the elements of these documents which could be referenced. Because of
1.1       cvs      1780: this, the editor will suggest that the documents be loaded in ``skeleton''
1.37    ! cvs      1781: form. This form contains only the elements of the document explicitly
1.18      cvs      1782: mentioned in the <tt>EXPORT</tt> section of their structure schema and, for
1.1       cvs      1783: these elements, only the part of the contents specified in that section. This
                   1784: form has the advantage of being very compact, thus requiring very few
1.37    ! cvs      1785: resources from the editor. This is also the skeleton form which constitutes
1.18      cvs      1786: the expanded form of <a href="#inclusion">inclusions</a> with partial
                   1787: expansion.</p>
1.30      cvs      1788: 
                   1789: <p>Skeleton elements must be declared explicitly in the <tt>EXPORT</tt>
1.37    ! cvs      1790: section of the structure schema that defines them. This section begins with
1.30      cvs      1791: the keyword <tt>EXPORT</tt> followed by a comma-separated list of the element
1.1       cvs      1792: types which must appear in the skeleton form and ending with a semicolon.
1.18      cvs      1793: These types must have been previously declared in the schema.</p>
1.30      cvs      1794: 
1.37    ! cvs      1795: <p>For each skeleton element type, the part of the contents which is loaded
        !          1796: by the editor, and therefore displayable, can be specified by putting the
        !          1797: keyword <tt>WITH</tt> and the name of the contained element type to be loaded
        !          1798: after the name of the skeleton element type. In this case only that named
        !          1799: element, among all the elements contained in the exportable element type,
        !          1800: will be loaded. If the <tt>WITH</tt> is absent, the entire contents of the
        !          1801: skeleton element will be loaded by the editor. If instead, it is better that
        !          1802: the skeleton form not load the contents of a particular element type, the
        !          1803: keyword <tt>WITH</tt> must be followed by the word <tt>Nothing</tt>.</p>
1.18      cvs      1804: <pre>                [ 'EXPORT' SkeletonSeq ]
1.1       cvs      1805: 
1.30      cvs      1806:      SkeletonSeq = SkelElem &lt; ',' SkelElem &gt; ';' .
1.1       cvs      1807:      SkelElem    = ElemID [ 'WITH' Contents ] .
1.18      cvs      1808:      Contents    = 'Nothing' / ElemID [ ExtStruct ] .</pre>
1.30      cvs      1809: 
1.18      cvs      1810: <blockquote class="example">
1.30      cvs      1811:   <p><strong>Example:</strong></p>
                   1812: 
                   1813:   <p>Suppose that, in documents of the article class, the element types
                   1814:   Article_title, Figure, Section, Paragraph, and Biblio should appear in the
                   1815:   skeleton form in order to make it easier to create external references to
1.37    ! cvs      1816:   them from other documents. When loading an article in its skeleton form,
1.30      cvs      1817:   all of these element types will be loaded except for paragraphs, but only
1.37    ! cvs      1818:   the article title will be loaded in its entirety. For figures, the caption
1.30      cvs      1819:   will be loaded, while for sections, the title will be loaded, and for
1.37    ! cvs      1820:   bibliographic entries, only the title that they contain will be loaded.
        !          1821:   Note that bibliographic elements are defined in another structure schema,
        !          1822:   RefBib. To produce this result, the following declarations should be placed
        !          1823:   in the Article structure schema:</p>
1.30      cvs      1824:   <pre>EXPORT
1.1       cvs      1825:    Article_title,
1.5       cvs      1826:    Figure With Caption,
1.1       cvs      1827:    Section With Section_title,
                   1828:    Paragraph With Nothing,
1.18      cvs      1829:    Biblio With Biblio_title(RefBib);</pre>
                   1830: </blockquote>
                   1831: </div>
1.1       cvs      1832: 
1.18      cvs      1833: <div class="subsection">
1.37    ! cvs      1834: <h3><a name="sectc3214" id="sectc3214">Exceptions</a></h3>
1.1       cvs      1835: 
1.30      cvs      1836: <p>The behavior of the Thot editor and the actions that it performs are
1.37    ! cvs      1837: determined by the structure schemas. These actions are applied to all
        !          1838: document and object types in accordance with their generic structure. For
1.1       cvs      1839: certain object types, such as tables and graphics, these actions are not
                   1840: sufficient or are poorly adapted and some special actions must be added to or
1.37    ! cvs      1841: substituted for certain standard actions. These special actions are called
1.18      cvs      1842: <em>exceptions</em>.</p>
1.30      cvs      1843: 
1.37    ! cvs      1844: <p>Exceptions only inhibit or modify certain standard actions, but they can
        !          1845: be used freely in every structure schema.</p>
1.30      cvs      1846: 
1.37    ! cvs      1847: <p>Each structure schema can contain a section defining exceptions. It begins
1.18      cvs      1848: with the keyword <tt>EXCEPT</tt> and is composed of a sequence of exception
1.37    ! cvs      1849: declarations, separated by semicolons. Each declaration of an exception
        !          1850: begins with the name of an element type or attribute followed by a colon.
        !          1851: This indicates the element type or attribute to which the following
        !          1852: exceptions apply. When the given element type name is a <a
        !          1853: href="#sectd3285">mark pair</a>, and only in this case, the type name can be
        !          1854: preceded by the keyword <tt>First</tt> or <tt>Second</tt>, to indicate if the
        !          1855: exceptions which follow are associated with the first mark of the pair or the
        !          1856: second. In the absence of this keyword, the first mark is used.</p>
1.30      cvs      1857: 
                   1858: <p>When placed in an <a href="#sectc322">extension schema</a>, the keyword
1.18      cvs      1859: <tt>EXTERN</tt> indicates that the type name which follows is found in the
1.37    ! cvs      1860: principal schema (the schema being extended by the extension schema). The
        !          1861: exceptions are indicated by a name. They are separated by semicolons.</p>
1.18      cvs      1862: <pre>                  [ 'EXCEPT' ExceptSeq ]
1.1       cvs      1863: 
1.30      cvs      1864:      ExceptSeq     = Except ';' &lt; Except ';' &gt; .
1.1       cvs      1865:      Except        = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr
                   1866:                      ':' ExcValSeq .
                   1867:      ExcTypeOrAttr = ElemID / AttrID .
1.30      cvs      1868:      ExcValSeq     = ExcValue &lt; ',' ExcValue &gt; .
1.19      cvs      1869:      ExcValue      ='NoCut' / 'NoCreate' / 'NoHMove' / 
                   1870:                     'NoVMove' / 'NoHResize' / 'NoVResize' /
                   1871:                     'NoMove' / 'NoResize' / 'MoveResize' /
                   1872:                     'NewWidth' / 'NewHeight' / 'NewHPos' /
                   1873:                     'NewVPos' / 'Invisible' /
1.28      cvs      1874:                     'NoSelect' / 'NoSpellCheck' /
1.1       cvs      1875:                     'Hidden' / 'ActiveRef' /
                   1876:                     'ImportLine' / 'ImportParagraph' /
                   1877:                     'NoPaginate' / 'ParagraphBreak' /
1.19      cvs      1878:                     'PageBreak' / 'PageBreakAllowed' / 'PageBreakPlace' /
                   1879:                     'PageBreakRepetition' / 'PageBreakRepBefore' /
1.9       cvs      1880:                     'HighlightChildren' / 'ExtendedSelection' /
1.36      cvs      1881:                     'SelectParent' / 'ClickableSurface' /
1.29      cvs      1882:                     'ReturnCreateNL' / 'ReturnCreateWithin' /
                   1883:                     'IsDraw' / 'IsTable' /
1.19      cvs      1884:                     'IsRow' / 'IsColHead' / 'IsCell' /
                   1885:                     'NewPercentWidth' / 'ColRef' / 'ColSpan' /
                   1886:                     'RowSpan' / 'SaveDocument' / 'Shadow' .</pre>
1.30      cvs      1887: 
                   1888: <p>The following are the available exceptions:</p>
1.18      cvs      1889: <dl>
1.30      cvs      1890:   <dt><tt>NoCut</tt></dt>
1.37    ! cvs      1891:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1892:       type to which this exception is applied cannot be deleted by the
                   1893:     editor.</dd>
                   1894:   <dt><tt>NoCreate</tt></dt>
1.37    ! cvs      1895:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1896:       type to which this exception is applied cannot be created by ordinary
1.37    ! cvs      1897:       commands for creating new elements. These elements are usually created
1.30      cvs      1898:       by special actions associated with other exceptions.</dd>
                   1899:   <dt><tt>NoHMove</tt></dt>
1.37    ! cvs      1900:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1901:       type to which this exception is applied cannot be moved horizontally
                   1902:       with the mouse. Their children elements cannot be moved either.</dd>
                   1903:   <dt><tt>NoVMove</tt></dt>
1.37    ! cvs      1904:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1905:       type to which this exception is applied cannot be moved vertically with
                   1906:       the mouse. Their children elements cannot be moved either.</dd>
                   1907:   <dt><tt>NoMove</tt></dt>
1.37    ! cvs      1908:     <dd>This exception can only be applied to element types. Elements of a
        !          1909:       type to which this exception is applied cannot be moved in any
        !          1910:       direction with the mouse. Their children elements cannot be moved
        !          1911:       either.</dd>
1.30      cvs      1912:   <dt><tt>NoHResize</tt></dt>
1.37    ! cvs      1913:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1914:       type to which this exception is applied cannot be resized horizontally
                   1915:       with the mouse. Their children elements cannot be resized either.</dd>
                   1916:   <dt><tt>NoVResize</tt></dt>
1.37    ! cvs      1917:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1918:       type to which this exception is applied cannot be resized vertically
                   1919:       with the mouse. Their children elements cannot be resized either.</dd>
                   1920:   <dt><tt>NoResize</tt></dt>
1.37    ! cvs      1921:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1922:       type to which this exception is applied cannot be resized in any
1.37    ! cvs      1923:       direction with the mouse. Their children elements cannot be resized
1.30      cvs      1924:       either.</dd>
                   1925:   <dt><tt>MoveResize</tt></dt>
1.37    ! cvs      1926:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1927:       type to which this exception is applied can be moved and resized in any
                   1928:       direction with the mouse, even if one of their ancestor element has an
1.37    ! cvs      1929:       exception that prevents moving or resizing. Their children elements can
1.30      cvs      1930:       also be resized or moved.</dd>
                   1931:   <dt><tt>NewWidth</tt></dt>
1.37    ! cvs      1932:     <dd>This exception can only be applied to numeric attributes. If the
        !          1933:       width of an element which has this attribute is modified with the
        !          1934:       mouse, the value of the new width will be assigned to the
        !          1935:     attribute.</dd>
1.30      cvs      1936:   <dt><tt>NewHeight</tt></dt>
1.37    ! cvs      1937:     <dd>This exception can only be applied to numeric attributes. If the
1.30      cvs      1938:       height of an element which has this attribute is modified with the
                   1939:       mouse, the value of the new height will be assigned to the
                   1940:     attribute.</dd>
                   1941:   <dt><tt>NewHPos</tt></dt>
1.37    ! cvs      1942:     <dd>This exception can only be applied to numeric attributes. If the
1.30      cvs      1943:       horizontal position of an element which has this attribute is modified
                   1944:       with the mouse, the value of the new horizontal position will be
                   1945:       assigned to the attribute.</dd>
                   1946:   <dt><tt>NewVPos</tt></dt>
1.37    ! cvs      1947:     <dd>This exception can only be applied to numeric attributes. If the
1.30      cvs      1948:       vertical position of an element which has this attribute is modified
                   1949:       with the mouse, the value of the new vertical position will be assigned
                   1950:       to the attribute.</dd>
                   1951:   <dt><tt>Invisible</tt></dt>
                   1952:     <dd>This exception can only be applied to attributes, but can be applied
1.37    ! cvs      1953:       to all attribute types. It indicates that the attribute must not be
        !          1954:       seen by the user and that its value must not be changed directly. This
1.30      cvs      1955:       exception is usually used when another exception manipulates the value
                   1956:       of an attribute.</dd>
                   1957:   <dt><tt>NoSelect</tt></dt>
1.37    ! cvs      1958:     <dd>This exception can only be applied to element types. Elements of a
        !          1959:       type to which this exception is applied cannot be selected directly
1.30      cvs      1960:       with the mouse, but they can be selected by other methods provided by
                   1961:       the editor.</dd>
                   1962:   <dt>NoSpellCheck</dt>
1.37    ! cvs      1963:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      1964:       type to which this exception is applied are not taken into account by
                   1965:       the spell checker.</dd>
                   1966:   <dt><tt>Hidden</tt></dt>
1.37    ! cvs      1967:     <dd>This exception can only be applied to element types. It indicates
1.30      cvs      1968:       that elements of this type, although present in the document's
1.37    ! cvs      1969:       structure, must not be shown to the user of the editor. In particular,
1.30      cvs      1970:       the creation menus must not propose this type and the selection message
                   1971:       must not pick it.</dd>
                   1972:   <dt><tt>ActiveRef</tt></dt>
                   1973:     <dd>This exception can only be applied to attributes of the reference
1.37    ! cvs      1974:       type. It indicates that when the user of the editor makes a double
1.30      cvs      1975:       click on an element which possesses a reference attribute having this
                   1976:       exception, the element designated by the reference attribute will be
                   1977:       selected.</dd>
                   1978:   <dt><tt>ImportLine</tt></dt>
1.37    ! cvs      1979:     <dd>This exception can only be applied to element types. It indicates
1.30      cvs      1980:       that elements of this type should receive the content of imported text
1.37    ! cvs      1981:       files. An element is created for each line of the imported file. A
1.30      cvs      1982:       structure schema cannot contain several exceptions <tt>ImportLine</tt>
                   1983:       and, if it contains one, it should not contain any exception
                   1984:       <tt>ImportParagraph</tt>.</dd>
                   1985:   <dt><tt>ImportParagraph</tt></dt>
1.37    ! cvs      1986:     <dd>This exception can only be applied to element types. It indicates
1.30      cvs      1987:       that elements of this type should receive the content of imported text
1.37    ! cvs      1988:       files. An element is created for each paragraph of the imported file. A
        !          1989:       paragraph is a sequence of lines without any empty line. A structure
1.30      cvs      1990:       schema cannot contain several exceptions <tt>ImportParagraph</tt> and,
                   1991:       if it contains one, it should not contain any exception
                   1992:       <tt>ImportLine</tt>.</dd>
                   1993:   <dt><tt>NoPaginate</tt></dt>
                   1994:     <dd>This exception can only be applied to the root element, i.e. the name
1.37    ! cvs      1995:       that appear after the keyword <tt>STRUCTURE</tt> at the beginning of
        !          1996:       the structure schema. It indicates that the editor should not allow the
1.30      cvs      1997:       user to paginate documents of that type.</dd>
                   1998:   <dt><tt>ParagraphBreak</tt></dt>
1.37    ! cvs      1999:     <dd>This exception can only be applied to element types. When the caret
        !          2000:       is within an element of a type to which this exception is applied, it
        !          2001:       is that element that will be split when the user hits the Return
        !          2002:     key.</dd>
1.30      cvs      2003:   <dt><tt>ReturnCreateNL</tt></dt>
1.37    ! cvs      2004:     <dd>This exception can only be applied to element types. When the caret
1.30      cvs      2005:       is within an element of a type to which this exception is applied, the
                   2006:       Return key simply inserts a New line character (code \212) at the
                   2007:       current position. The Return key does not create a new element; it does
                   2008:       not split the current element either.</dd>
                   2009:   <dt><tt>ReturnCreateWithin</tt></dt>
1.37    ! cvs      2010:     <dd>This exception can only be applied to element types. When the caret
1.30      cvs      2011:       is within an element of a type to which this exception is applied, the
                   2012:       Return key will create a new element within that element, not a sibling
                   2013:       after that element.</dd>
                   2014:   <dt><tt>HighlightChildren</tt></dt>
1.37    ! cvs      2015:     <dd>This exception can only be applied to element types. Elements of a
1.30      cvs      2016:       type to which this exception is applied are not highlighted themselves
1.32      cvs      2017:       when they are selected in the main view, but all their children are
1.37    ! cvs      2018:       highlighted instead. If children have this exception too, the process
        !          2019:       is applied recursively. Only the main view defined in the presentation
1.32      cvs      2020:       schema is concerned. Tee exception is ignored for other views.</dd>
1.30      cvs      2021:   <dt><tt>ExtendedSelection</tt></dt>
1.37    ! cvs      2022:     <dd>This exception can only be applied to element types. The selection
1.30      cvs      2023:       extension command (middle button of the mouse) only add the clicked
                   2024:       element (if it has that exception) to the current selection, without
                   2025:       selecting other elements between the current selection and the clicked
                   2026:       element.</dd>
1.36      cvs      2027:   <dt><code>SelectParent</code></dt>
                   2028:     <dd>This exception can only be applied to element types. When the user
1.37    ! cvs      2029:       clicks on an element of that type, the parent of the element is
        !          2030:       selected instead of the element itself.</dd>
1.36      cvs      2031:   <dt><code>ClickableSurface</code></dt>
                   2032:     <dd>This exception can only be applied to element types. When the user
1.37    ! cvs      2033:       clicks within a child of an element of that type, this child is
        !          2034:       selected even if it is a graphic leaf that is not filled.</dd>
1.36      cvs      2035:   <dt><code>IsDraw</code>, <code>IsTable</code>, <code>IsColHead</code>,
                   2036:   <code>IsRow</code>, <code>IsCell</code></dt>
1.37    ! cvs      2037:     <dd>These exceptions can only be applied to element types. Elements of a
1.30      cvs      2038:       type to which these exceptions are applied are identified as Draws,
                   2039:       Tables, Colheads, Rows or Cells and specific processing are applied to
                   2040:       them.</dd>
1.36      cvs      2041:   <dt><code>ColRef</code></dt>
1.30      cvs      2042:     <dd>This exception can only be applied to attributes of the reference
                   2043:       type. It indicates that this attribute refers to the column head (see
                   2044:       exception IsColHead) which the element belongs to.</dd>
1.36      cvs      2045:   <dt><code>ColSpan</code>, <code>RowSpan</code></dt>
1.31      cvs      2046:     <dd>These exceptions can only be applied to numeric attributes of cells.
1.30      cvs      2047:       They indicate that attribute values give how many columns or rows the
                   2048:       element spans.</dd>
1.36      cvs      2049:   <dt><code>Shadow</code></dt>
1.37    ! cvs      2050:     <dd>This exception can only be applied to element types. Text of elements
1.30      cvs      2051:       of a type to which this exception is applied are displayed and printed
                   2052:       as a set of stars ('*').</dd>
1.18      cvs      2053: </dl>
1.30      cvs      2054: 
1.18      cvs      2055: <blockquote class="example">
1.30      cvs      2056:   <p><strong>Example:</strong></p>
                   2057: 
                   2058:   <p>Consider a structure schema for object-style graphics which defines the
                   2059:   Graphic_object element type with the associated Height and Weight numeric
1.37    ! cvs      2060:   attributes. Suppose that we want documents of this class to have the
1.30      cvs      2061:   following qualities:</p>
                   2062:   <ul>
                   2063:     <li>Whenever the width or height of an object is changed using the mouse,
                   2064:       the new values are stored in the object's Width and Height
                   2065:     attributes.</li>
                   2066:     <li>The user should not be able to change the values of the Width and
                   2067:       Height attributes via the Attributes menu of the Thot editor.</li>
                   2068:   </ul>
                   2069: 
                   2070:   <p>The following exceptions will produce this effect.</p>
                   2071:   <pre>STRUCT
1.1       cvs      2072: ...
1.5       cvs      2073:    Graphics_object (ATTR Height = Integer; Width = Integer)
1.1       cvs      2074:        = GRAPHICS with Height ?= 10, Width ?= 10;
                   2075: ...
                   2076: EXCEPT
                   2077:    Height: NewHeight, Invisible;
1.18      cvs      2078:    Width: NewWidth, Invisible;</pre>
                   2079: </blockquote>
                   2080: </div>
                   2081: </div>
1.1       cvs      2082: 
1.18      cvs      2083: <div class="section">
1.37    ! cvs      2084: <h2><a name="sectb33" id="sectb33">Some examples</a></h2>
1.1       cvs      2085: 
1.30      cvs      2086: <p>In order to illustrate the principles of the document model and the syntax
                   2087: of the S language, this section presents two examples of structure schemas.
                   2088: One defines a class of documents, the other defines a class of objects.</p>
1.1       cvs      2089: 
1.18      cvs      2090: <div class="subsection">
1.37    ! cvs      2091: <h3><a name="sectc331" id="sectc331">A class of documents: articles</a></h3>
1.1       cvs      2092: 
1.30      cvs      2093: <p>This example shows a possible structure for articles published in a
                   2094: journal. Text between braces is comments.</p>
1.18      cvs      2095: <pre>STRUCTURE Article;  { This schema defines the Article class }
1.1       cvs      2096: DEFPRES ArticleP;   { The default presentation schema is
                   2097:                       ArticleP }
                   2098: ATTR                { Global attribute definitions }
                   2099:    WordType = Definition, IndexWord, DocumentTitle;
                   2100:    { A single global attribute is defined, with three values }
                   2101: STRUCT              { Definition of the generic structure }
                   2102:    Article = BEGIN  { The Article class has an aggregate
                   2103:                       structure }
                   2104:              Title = BEGIN   { The title is an aggregate }
                   2105:                      French_title = 
                   2106:                          Text WITH Language='Fran\347ais';
                   2107:                      English_title =
                   2108:                          Text WITH Language='English';
                   2109:                      END;
                   2110:              Authors = 
                   2111:                LIST OF (Author
                   2112:                  (ATTR Author_type=principal,secondary)
                   2113:                  { The Author type has a local attribute }
                   2114:                  = BEGIN
                   2115:                    Author_name = Text;
                   2116:                    Info = Paragraphs ;
                   2117:                    { Paragraphs is defined later }
                   2118:                    Address    = Text;
                   2119:                    END
                   2120:                  );
                   2121:              Keywords = Text;
                   2122:              { The journal's editor introduces the article
                   2123:                with a short introduction, in French and
                   2124:                in English }
                   2125:              Introduction = 
                   2126:                  BEGIN
                   2127:                  French_intr  = Paragraphs WITH
                   2128:                                 Language='Fran\347ais';
                   2129:                  English_intr = Paragraphs WITH
                   2130:                                 Language='English';
                   2131:                  END;
                   2132:              Body = Sections; { Sections are defined later }
                   2133:                    { Appendixes are only created on demand }
                   2134:            ? Appendices = 
                   2135:                  LIST OF (Appendix =
                   2136:                           BEGIN
                   2137:                           Appendix_Title    = Text;
                   2138:                           Appendix_Contents = Paragraphs;
                   2139:                           END
                   2140:                          );
1.37    ! cvs      2141:            ? Figures = LIST OF (Figure);
        !          2142:            ? Bibliography = LIST OF (Biblio_citation);
        !          2143:            ? Notes = LIST OF (Note);
1.1       cvs      2144:              END;      { End of the Article aggregate }
                   2145: 
                   2146:     Sections = LIST [2..*] OF (
                   2147:                  Section = { At least 2 sections }
                   2148:                  BEGIN
                   2149:                  Section_title   = Text;
                   2150:                  Section_contents =
                   2151:                    BEGIN
                   2152:                    Paragraphs;
                   2153:                    Sections; { Sections at a lower level }
                   2154:                    END;
                   2155:                  END
                   2156:                  );
                   2157: 
                   2158:     Paragraphs = LIST OF (Paragraph = CASE OF
                   2159:                                Enumeration = 
                   2160:                                    LIST [2..*] OF
                   2161:                                        (Item = Paragraphs);
                   2162:                                Isolated_formula = Formula;
                   2163:                                LIST OF (UNIT);
                   2164:                                END
                   2165:                           );
                   2166: 
                   2167:    Figure = BEGIN
1.5       cvs      2168:             Figure_caption  = Text;
1.1       cvs      2169:             Illustration   = NATURE;
                   2170:             END;
                   2171: 
                   2172:    Biblio_citation = CASE OF
                   2173:                         Ref_Article =
                   2174:                            BEGIN
                   2175:                            Authors_Bib   = Text;
                   2176:                            Article_Title = Text;
                   2177:                            Journal       = Text;
                   2178:                            Page_Numbers  = Text;
                   2179:                            Date          = Text;
                   2180:                            END;
                   2181:                         Ref_Livre =
                   2182:                            BEGIN
                   2183:                            Authors_Bib; { Defined above }
                   2184:                            Book_Title   = Text;
                   2185:                            Editor       = Text;
                   2186:                            Date;        { Defined above }
                   2187:                            END;
                   2188:                        END;
                   2189: 
                   2190:    Note =  Paragraphs - (Ref_note);
                   2191: 
                   2192: UNITS      { Elements which can be used in objects }
                   2193: 
                   2194:    Ref_note    = REFERENCE (Note);
                   2195:    Ref_biblio  = REFERENCE (Biblio_citation);
                   2196:    Ref_figure  = REFERENCE (Figure);
                   2197:    Ref_formula = REFERENCE (Isolated_formula);
                   2198: 
                   2199: EXPORT     { Skeleton elements }
                   2200: 
                   2201:    Title,
1.5       cvs      2202:    Figure with Figure_caption,
1.1       cvs      2203:    Section With Section_title;
                   2204: 
1.18      cvs      2205: END           { End of the structure schema }</pre>
1.30      cvs      2206: 
                   2207: <p>This schema is very complete since it defines both paragraphs and
1.37    ! cvs      2208: bibliographic citations. These element types could just as well be defined in
        !          2209: other structure schemas, as is the case with the <tt>Formula</tt> class. All
        !          2210: sorts of other elements can be inserted into an article, since a paragraph
        !          2211: can contain any type of unit. Similarly, figures can be any class of document
        !          2212: or object that the user chooses.</p>
        !          2213: 
        !          2214: <p>Generally, an article doesn't contain appendices, but it is possible to
        !          2215: add them on explicit request: this is the effect of the question mark before
        !          2216: the word Appendices.</p>
1.30      cvs      2217: 
1.37    ! cvs      2218: <p>Various types of cross-references can be put in paragraphs. They can also
1.30      cvs      2219: be placed the objects which are part of the article, since the
                   2220: cross-references are defined as units (<tt>UNITS</tt>).</p>
                   2221: 
                   2222: <p>There is a single restriction to prevent the creation of Ref_note elements
1.18      cvs      2223: within notes.</p>
1.30      cvs      2224: 
                   2225: <p>It is worth noting that the S language permits the definition of recursive
1.37    ! cvs      2226: structures like sections: a section can contain other sections (which are
        !          2227: thus at the next lower level of the document tree). Paragraphs are also
        !          2228: recursive elements, since a paragraph can contain an enumeration in which
        !          2229: each element (<tt>Item</tt>) is composed of paragraphs.</p>
1.18      cvs      2230: </div>
1.1       cvs      2231: 
1.18      cvs      2232: <div class="subsection">
1.37    ! cvs      2233: <h3><a name="sectc332" id="sectc332">A class of objects: mathematical
        !          2234: formulas</a></h3>
1.1       cvs      2235: 
1.30      cvs      2236: <p>The example below defines the <tt>Formula</tt> class which is used in
1.37    ! cvs      2237: Article documents. This class represents mathematical formulas with a rather
1.30      cvs      2238: simple structure, but sufficient to produce a correct rendition on the screen
1.37    ! cvs      2239: or printer. To support more elaborate operations (formal or numeric
        !          2240: calculations), a finer structure should be defined. This class doesn't use
        !          2241: any other class and doesn't define any units.</p>
1.18      cvs      2242: <pre>STRUCTURE Formula;
1.1       cvs      2243: DEFPRES FormulaP;
                   2244: 
                   2245: ATTR
                   2246:    String_type = Function_name, Variable_name;
                   2247: 
                   2248: STRUCT
                   2249:    Formula      = Expression;
                   2250:    Expression   = LIST OF (Construction);
                   2251:    Construction = CASE OF
                   2252:                   TEXT;         { Simple character string }
                   2253:                   Index    = Expression;
                   2254:                   Exponent = Expression;
                   2255:                   Fraction =
                   2256:                         BEGIN
1.6       cvs      2257:                         Numerator   = Expression;
1.1       cvs      2258:                         Denominator = Expression;
                   2259:                         END;
                   2260:                   Root = 
                   2261:                         BEGIN
                   2262:                       ? Order = TEXT;
                   2263:                         Root_Contents = Expression;
                   2264:                         END;
                   2265:                   Integral =
                   2266:                         BEGIN
                   2267:                         Integration_Symbol = SYMBOL;
                   2268:                         Lower_Bound        = Expression;
                   2269:                         Upper_Bound        = Expression;
                   2270:                         END;
                   2271:                   Triple =
                   2272:                         BEGIN
                   2273:                         Princ_Expression = Expression;
                   2274:                         Lower_Expression = Expression;
                   2275:                         Upper_Expression = Expression;
                   2276:                         END;
                   2277:                   Column = LIST [2..*] OF 
                   2278:                               (Element = Expression);
                   2279:                   Parentheses_Block =
                   2280:                         BEGIN
                   2281:                         Opening  = SYMBOL;
                   2282:                         Contents = Expression;
                   2283:                         Closing  = SYMBOL;
                   2284:                         END;
                   2285:                   END;       { End of Choice Constructor }
1.18      cvs      2286: END                          { End of Structure Schema }</pre>
1.30      cvs      2287: 
                   2288: <p>This schema defines a single global attribute which allows functions and
1.37    ! cvs      2289: variables to be distinguished. In the presentation schema, this attribute can
1.1       cvs      2290: be used to choose between roman (for functions) and italic characters (for
1.18      cvs      2291: variables).</p>
1.30      cvs      2292: 
1.37    ! cvs      2293: <p>A formula's structure is that of a mathematical expression, which is
        !          2294: itself a sequence of mathematical constructions. A mathematical construction
        !          2295: can be either a simple character string, an index, an exponent, a fraction, a
        !          2296: root, etc. Each of these mathematical constructions has a sensible structure
        !          2297: which generally includes one or more expressions, thus making the formula
        !          2298: class's structure definition recursive.</p>
1.30      cvs      2299: 
                   2300: <p>In most cases, the roots which appear in the formulas are square roots and
1.37    ! cvs      2301: their order (2) is not specified. This is why the Order component is marked
        !          2302: optional by a question mark. When explicitly requested, it is possible to add
1.18      cvs      2303: an order to a root, for example for cube roots (order = 3).</p>
1.30      cvs      2304: 
                   2305: <p>An integral is formed by an integration symbol, chosen by the user (simple
1.37    ! cvs      2306: integral, double, curvilinear, etc.), and two bounds. A more fine-grained
1.1       cvs      2307: schema would add components for the integrand and the integration variable.
1.37    ! cvs      2308: Similarly, the Block_Parentheses construction leaves the choice of opening
        !          2309: and closing symbols to the user. They can be brackets, braces, parentheses,
1.18      cvs      2310: etc.</p>
                   2311: </div>
                   2312: </div>
1.37    ! cvs      2313: <hr />
1.18      cvs      2314: </div>
1.1       cvs      2315: 
1.18      cvs      2316: <div class="chapter">
1.37    ! cvs      2317: <h1><a name="sect4" id="sect4">The P Language</a></h1>
1.1       cvs      2318: 
1.18      cvs      2319: <div class="section">
1.37    ! cvs      2320: <h2><a name="sectb41" id="sectb41">Document presentation</a></h2>
1.1       cvs      2321: 
1.30      cvs      2322: <p>Because of the model adopted for Thot, the presentation of documents is
1.37    ! cvs      2323: clearly separated from their structure and content. After having presented
1.1       cvs      2324: the logical structure of documents, we now detail the principles implemented
1.37    ! cvs      2325: for their presentation. The concept of <em>presentation</em> encompasses what
        !          2326: is often called the page layout, the composition, or the document style. It
1.18      cvs      2327: is the set of operations which display the document on the screen or print it
1.37    ! cvs      2328: on paper. Like logical structure, document presentation is defined
1.18      cvs      2329: generically with the help of a language, called P.</p>
1.1       cvs      2330: 
1.18      cvs      2331: <div class="subsection">
1.37    ! cvs      2332: <h3><a name="sectc411" id="sectc411">Two levels of presentation</a></h3>
1.1       cvs      2333: 
1.30      cvs      2334: <p>The link between structure and presentation is clear: the logical
                   2335: organization of a document is used to carry out its presentation, since the
                   2336: purpose of the presentation is to make evident the organization of the
1.37    ! cvs      2337: document. But the presentation is equally dependent on the device used to
1.30      cvs      2338: render the document. Certain presentation effects, notably changes of font or
1.37    ! cvs      2339: character set, cannot be performed on all printers or on all screens. This is
1.30      cvs      2340: why Thot uses a two-level approach, where the presentation is first described
                   2341: in abstract terms, without taking into account each particular device, and
                   2342: then the presentation is realized within the constraints of a given
                   2343: device.</p>
                   2344: 
                   2345: <p>Thus, presentation is only described as a function of the structure of the
1.37    ! cvs      2346: documents and the image that would be produced on an idealized device. For
1.1       cvs      2347: this reason, presentation descriptions do not refer to any device
1.18      cvs      2348: characteristics: they describe <em>abstract presentations</em> which can be
                   2349: concretized on different devices.</p>
1.30      cvs      2350: 
                   2351: <p>A presentation description also defines a <em>generic presentation</em>,
                   2352: since it describes the appearance of a class of documents or objects. This
                   2353: generic presentation must also be applied to document and object instances,
                   2354: each conforming to its generic logical structure, but with all the allowances
                   2355: that were called to mind above: missing elements, constructed elements with
                   2356: other logical structures, etc.</p>
                   2357: 
                   2358: <p>In order to preserve the homogeneity between documents and objects,
1.1       cvs      2359: presentation is described with a single set of tools which support the layout
                   2360: of a large document as well as the composition of objects like a graphical
1.37    ! cvs      2361: figure or mathematical formula. This unity of presentation description tools
1.1       cvs      2362: contrasts with the traditional approach, which focuses more on documents than
                   2363: objects and thus is based on the usual typographic conventions, such as the
                   2364: placement of margins, indentations, vertical spaces, line lengths,
1.18      cvs      2365: justification, font changes, etc.</p>
                   2366: </div>
1.1       cvs      2367: 
1.18      cvs      2368: <div class="subsection">
1.37    ! cvs      2369: <h3><a name="sectc412" id="sectc412">Boxes</a></h3>
1.1       cvs      2370: 
1.37    ! cvs      2371: <p>To assure the homogeneity of tools, all presentation in Thot, for
        !          2372: documents as well as for the objects which they contain, is based on the
        !          2373: notion of the <em>box</em>, such as was implemented in
        !          2374: T<sub><big>E</big></sub>X.</p>
1.30      cvs      2375: 
1.37    ! cvs      2376: <p>Corresponding to each element of the document is a box, which is the
1.1       cvs      2377: rectangle enclosing the element on the display device (screen or sheet of
1.37    ! cvs      2378: paper); the outline of this rectangle is not visible, except when a <a
        !          2379: href="#sectc4230a"><tt>ShowBox</tt> rule</a> applies to the element. The
        !          2380: sides of the box are parallel to the sides of the screen or the sheet of
        !          2381: paper. By way of example, a box is associated with a character string, a line
        !          2382: of text, a page, a paragraph, a title, a mathematical formula, or a table
        !          2383: cell.</p>
1.30      cvs      2384: 
                   2385: <p>Whatever element it corresponds to, each box possesses four sides and four
1.18      cvs      2386: axes, which we designate as follows (<a href="#boxes">see figure</a>):</p>
                   2387: <dl>
1.30      cvs      2388:   <dt><tt>Top</tt></dt>
                   2389:     <dd>the upper side,</dd>
                   2390:   <dt><tt>Bottom</tt></dt>
                   2391:     <dd>the lower side,</dd>
                   2392:   <dt><tt>Left</tt></dt>
                   2393:     <dd>the left side,</dd>
                   2394:   <dt><tt>Right</tt></dt>
                   2395:     <dd>the right side,</dd>
                   2396:   <dt><tt>VMiddle</tt></dt>
                   2397:     <dd>the vertical axis passing through the center of the box,</dd>
                   2398:   <dt><tt>HMiddle</tt></dt>
                   2399:     <dd>the horizontal axis passing through the center of the box,</dd>
                   2400:   <dt><tt>VRef</tt></dt>
                   2401:     <dd>the vertical reference axis,</dd>
                   2402:   <dt><tt>HRef</tt></dt>
                   2403:     <dd>the horizontal reference axis.</dd>
1.18      cvs      2404: </dl>
                   2405: 
                   2406: <div class="figure">
1.37    ! cvs      2407: <hr />
1.18      cvs      2408: <pre>        Left   VRef  VMiddle        Right
1.1       cvs      2409:                  :      :
                   2410:     Top   -----------------------------
                   2411:           |      :      :             |
                   2412:           |      :      :             |
                   2413:           |      :      :             |
                   2414:           |      :      :             |
                   2415:           |      :      :             |
                   2416: HMiddle ..|...........................|..
                   2417:           |      :      :             |
                   2418:           |      :      :             |
                   2419:    HRef ..|...........................|..
                   2420:           |      :      :             |
                   2421:           |      :      :             |
                   2422:   Bottom  -----------------------------
1.18      cvs      2423:                  :      :</pre>
1.30      cvs      2424: 
1.37    ! cvs      2425: <p align="center"><em><a name="boxes" id="boxes">The sides and axes of
1.30      cvs      2426: boxes</a><em></em></em></p>
1.37    ! cvs      2427: <hr />
1.30      cvs      2428: </div>
1.19      cvs      2429: 
1.37    ! cvs      2430: <p>The principal role of boxes is to set the extent and position of the
        !          2431: images of the different elements of a document with respect to each other on
        !          2432: the reproduction device. This is done by defining relations between the boxes
        !          2433: of different elements which give relative extents and positions to these
1.18      cvs      2434: boxes.</p>
1.30      cvs      2435: 
                   2436: <p>There are three types of boxes:</p>
1.18      cvs      2437: <ul>
1.30      cvs      2438:   <li>boxes corresponding to structural elements of the document,</li>
                   2439:   <li>presentation boxes,</li>
                   2440:   <li>page layout boxes.</li>
1.18      cvs      2441: </ul>
1.30      cvs      2442: 
1.37    ! cvs      2443: <p><strong>Boxes corresponding to structural elements of the
        !          2444: document</strong> are those which linked to each of the elements (base or
        !          2445: structured) of the logical structure of the document. Such a box contains all
        !          2446: the contents of the element to which it corresponds (there is an exception:
        !          2447: see <a href="#sectc4220">rules <tt>VertOverflow</tt> and
        !          2448: <tt>HorizOverflow</tt></a>). These boxes form a tree-like structure,
        !          2449: identical to that of the structural elements to which they correspond. This
        !          2450: tree expresses the inclusion relationships between the boxes: a box includes
        !          2451: all the boxes of its subtree. On the other hand, there are no predefined
        !          2452: rules for the relative positions of the included boxes. If they are at the
        !          2453: same level, they can overlap, be contiguous, or be disjoint. The rules
        !          2454: expressed in the generic presentation specify their relative positions.</p>
1.30      cvs      2455: 
                   2456: <p><strong>Presentation boxes</strong> represent elements which are not found
1.37    ! cvs      2457: in the logical structure of the document but which are added to meet the
        !          2458: needs of presentation. These boxes are linked to the elements of the logical
1.30      cvs      2459: structure that are best suited to bringing them out. For example, they are
                   2460: used to add the character string ``Summary:'' before the summary in the
                   2461: presentation of a report or to represent the fraction bar in a formula, or
1.37    ! cvs      2462: also to make the title of a field in a form appear. These elements have no
1.30      cvs      2463: role in the logical structure of the document: the presence of a Summary
                   2464: element in the document does not require the creation of another structural
1.37    ! cvs      2465: object to hold the word ``Summary''. Similarly, if a Fraction element
        !          2466: contains both a Numerator element and a Denominator element, the fraction bar
        !          2467: has no purpose structurally. On the other hand, these elements of the
        !          2468: presentation are important for the reader of the reproduced document or for
        !          2469: the user of an editor. This is why they must appear in the document's image.
        !          2470: It is the generic presentation which specifies the presentation boxes to add
        !          2471: by indicating their content (a base element for which the value is specified)
        !          2472: and the position that they must take in the tree of boxes. During editing,
        !          2473: these boxes cannot be modified by the user.</p>
        !          2474: 
        !          2475: <p><strong>Page layout boxes</strong> are boxes created implicitly by the
        !          2476: page layout rules. These rules indicate how the contents of a structured
        !          2477: element must be broken into lines and pages. In contrast to presentation
        !          2478: boxes, these line and page boxes do not depend on the logical structure of
        !          2479: the document, but rather on the physical constraints of the output devices:
        !          2480: character size, height and width of the window on the screen or of the sheet
        !          2481: of paper.</p>
1.18      cvs      2482: </div>
1.1       cvs      2483: 
1.18      cvs      2484: <div class="subsection">
1.37    ! cvs      2485: <h3><a name="sectc413" id="sectc413">Views and visibility</a></h3>
1.1       cvs      2486: 
1.30      cvs      2487: <p>One of the operations that one might wish to perform on a document is to
1.37    ! cvs      2488: view it is different ways. For this reason, it is possible to define several
1.18      cvs      2489: <em>views</em> for the same document, or better yet, for all documents of the
1.37    ! cvs      2490: same class. A view is not a different presentation of the document, but
1.1       cvs      2491: rather a filter which only allows the display of certain parts of the
1.37    ! cvs      2492: document. For example, it might be desirable to see only the titles of
1.1       cvs      2493: chapters and sections in order to be able to move rapidly through the
1.37    ! cvs      2494: document. Such a view could be called a ``table of contents''. It might also
1.1       cvs      2495: be desirable to see only the mathematical formulas of a document in order to
1.37    ! cvs      2496: avoid being distracted by the non-mathematical aspects of the document. A
1.18      cvs      2497: ``mathematics'' view could provide this service.</p>
1.30      cvs      2498: 
                   2499: <p>Views, like presentation, are based on the generic logical structure. Each
1.1       cvs      2500: document class, and each generic presentation, can be provided with views
1.37    ! cvs      2501: which are particularly useful for that class or presentation. For each view,
1.18      cvs      2502: the <em>visibility</em> of elements is defined, indicated whether or not the
1.37    ! cvs      2503: elements must be presented to the user. The visibility is calculated as a
1.1       cvs      2504: function of the type of the elements or their hierarchical position in the
1.37    ! cvs      2505: structure of the document. Thus, for a table of contents, all the ``Chapter
        !          2506: Title'' and ``Section Title'' elements are made visible. However, the
1.1       cvs      2507: hierarchical level could be used to make the section titles invisible below a
1.37    ! cvs      2508: certain threshold level. By varying this threshold, the granularity of the
        !          2509: view can be varied. In the ``mathematics'' view, only Formula elements would
1.18      cvs      2510: be made visible, no matter what their hierarchical level.</p>
1.30      cvs      2511: 
                   2512: <p>Because views are especially useful for producing a synthetic image of the
1.1       cvs      2513: document, it is necessary to adapt the presentation of the elements to the
1.37    ! cvs      2514: view in which they appear. For example, it is inappropriate to have a page
        !          2515: break before every chapter title in the table of contents. Thus, generic
1.1       cvs      2516: presentations take into account the possible views and permit each element
1.18      cvs      2517: type's presentation to vary according the view in which its image appears.</p>
                   2518: </div>
1.1       cvs      2519: 
1.18      cvs      2520: <div class="subsection">
1.37    ! cvs      2521: <h3><a name="sectc414" id="sectc414">Pages</a></h3>
1.1       cvs      2522: 
1.30      cvs      2523: <p>Presentation schemas can be defined which display the document as a long
1.37    ! cvs      2524: scroll, without page breaks. This type of schema is particularly well-suited
1.1       cvs      2525: to the initial phase of work on a document, where jumps from page to page
1.37    ! cvs      2526: would hinder composing and reading the document on a screen. But, once the
        !          2527: document is written, it may be desirable to display the document on the
        !          2528: screen in the same manner in which it will be printed. So, the presentation
        !          2529: schema must define pages.</p>
        !          2530: 
        !          2531: <p>The P language permits the specification of the dimensions of pages as
        !          2532: well as their composition. It is possible to generate running titles, page
        !          2533: numbers, zones at the bottom of the page for notes, etc. The editor follows
1.30      cvs      2534: this model and inserts page break marks in the document which are used during
                   2535: printing, insuring that the pages on paper are the same as on the screen.</p>
                   2536: 
                   2537: <p>Once a document has been edited with a presentation schema defining pages,
1.37    ! cvs      2538: it contains page marks. But it is always possible to edit the document using
        !          2539: a schema without pages. In this case, the page marks are simply ignored by
        !          2540: the editor. They are considered again as soon as a schema with pages is used.
1.18      cvs      2541: Thus, the user is free to choose between schemas with and without pages.</p>
1.30      cvs      2542: 
                   2543: <p>Thot treats the page break, rather than the page itself, as a box. This
                   2544: page break box contains all the elements of one page's footer, a rule marking
1.37    ! cvs      2545: the edge of this page, and all the elements of the next page's header. The
        !          2546: elements of the header and footer can be running titles, page number, notes,
        !          2547: etc. All these elements, as well as their content and graphical appearance,
        !          2548: are defined by the generic presentation.</p>
1.18      cvs      2549: </div>
1.1       cvs      2550: 
1.18      cvs      2551: <div class="subsection">
1.37    ! cvs      2552: <h3><a name="sectc415" id="sectc415">Numbering</a></h3>
1.1       cvs      2553: 
1.30      cvs      2554: <p>Many elements are numbered in documents: pages, chapters, sections,
                   2555: formulas, theorems, notes, figures, bibliographic references, exercises,
1.37    ! cvs      2556: examples, lemmas, etc. Because Thot has a notion of logical structure, all of
1.30      cvs      2557: these numbers (with the exception of pages) are redundant with information
1.37    ! cvs      2558: implicit in the logical structure of the document. Such numbers are simply a
        !          2559: way to make the structure of the document more visible. So, they are part of
1.30      cvs      2560: the document's presentation and are calculated by the editor from the logical
1.37    ! cvs      2561: structure. The structure does not contain numbers as such; it only defines
1.1       cvs      2562: relative structural positions between elements, which serve as ordering
1.18      cvs      2563: relations on these elements.</p>
1.30      cvs      2564: 
                   2565: <p>If the structure schema defines the body of a document as a sequence of at
1.18      cvs      2566: least two chapters:</p>
                   2567: <pre>Body = LIST [2..*] OF Chapter;</pre>
1.30      cvs      2568: 
                   2569: <p>the sequence defined by the list constructor is ordered and each chapter
1.37    ! cvs      2570: can be assigned a number based on its rank in the Body list. Therefore, all
        !          2571: elements contained in lists a the structure of a document can be numbered,
        !          2572: but they are not the only ones. The tree structure induced by the aggregate,
1.18      cvs      2573: list, and choice constructors (excluding references) defines a total order on
1.37    ! cvs      2574: the elements of the document's primary structure. So, it is possible to
1.18      cvs      2575: define a numbering which uses this order, filtering elements according to
                   2576: their type so that only certain element types are taken into account in the
1.37    ! cvs      2577: numbering. In this way, it possible to number all the theorems and lemmas of
1.18      cvs      2578: a chapter in the same sequence of numbers, even when they are not part of the
                   2579: same list constructor and appear at different levels of the document's tree.
                   2580: By changing the filter, they can be numbered separately: one sequence of
                   2581: numbers for theorems, another for the lemmas.</p>
1.30      cvs      2582: 
                   2583: <p>Since they are calculated from the document's logical structure and only
                   2584: for the needs of the presentation, numbers are presentation elements,
                   2585: described by presentation boxes, just like the fraction bar or the word
1.37    ! cvs      2586: ``Summary''. Nevertheless, numbers differ from these other boxes because
        !          2587: their content varies from instance to instance, even though they are of the
        !          2588: same type, whereas all fraction bars are horizontal lines and the same word
1.30      cvs      2589: ``Summary'' appears at the head of every document's summary.</p>
1.18      cvs      2590: </div>
1.1       cvs      2591: 
1.18      cvs      2592: <div class="subsection">
1.37    ! cvs      2593: <h3><a name="sectc416" id="sectc416">Presentation properties</a></h3>
1.1       cvs      2594: 
1.34      cvs      2595: <p>The principal properties which determine document presentation are the
1.18      cvs      2596: <em>positions</em> and <em>dimensions</em> of boxes, the <em>font</em>, the
                   2597: <em>style</em>, the <em>size</em>, the <em>underlining</em> and the
1.37    ! cvs      2598: <em>color</em> of their content. From these properties, and some others of
1.34      cvs      2599: less importance, it is possible to represent the usual typographic properties
1.37    ! cvs      2600: for the textual parts of the document. These same properties can be used to
1.1       cvs      2601: describe the geometry of the non-textual elements, even though they are
1.18      cvs      2602: two-dimensional elements unlike the text, which is linear.</p>
1.30      cvs      2603: 
1.37    ! cvs      2604: <p>As we have already seen, the positions of the boxes always respect the
1.30      cvs      2605: rule of enclosure: a box in the tree encloses all the boxes of the next lower
1.37    ! cvs      2606: level which are attached to it. The positional properties permit the
1.30      cvs      2607: specification of the position of each box in relation to the enclosing box or
1.37    ! cvs      2608: to its sibling boxes (boxes directly attached to the same enclosing box in
        !          2609: the tree of boxes).</p>
1.30      cvs      2610: 
1.37    ! cvs      2611: <p>The presentation properties also provide control over the dimensions of
        !          2612: the boxes. The dimensions of a box can depend either on its content or on its
1.1       cvs      2613: context (its sibling boxes and the enclosing box). Each dimension (height or
1.18      cvs      2614: width) can be defined independently of the other.</p>
1.30      cvs      2615: 
1.34      cvs      2616: <p>Because of the position and dimension properties, it is possible to do the
1.1       cvs      2617: same things that are normally done in typography by changing margins, line
1.37    ! cvs      2618: lengths, and vertical or horizontal skips. This approach can also align or
1.18      cvs      2619: center elements and groups of elements.</p>
1.30      cvs      2620: 
1.34      cvs      2621: <p>In contrast to the position and dimension properties, the font, style,
1.30      cvs      2622: size, underlining, and color do not concern the box itself (the rectangle
1.37    ! cvs      2623: delimiting the element), but its content. These properties indicate the
        !          2624: typographic attributes which must be applied to the text contained in the
        !          2625: box, and by extension, to all base elements.</p>
1.30      cvs      2626: 
1.34      cvs      2627: <p>For text, the font property is used to change the family of characters
1.1       cvs      2628: (Times, Helvetica, Courier, etc.); the style is used to obtain italic or
1.37    ! cvs      2629: roman, bold or light characters; the size determines the point size of the
1.1       cvs      2630: characters; underlining defines the type and thickness of the lines drawn
1.18      cvs      2631: above, below, or through the characters.</p>
1.30      cvs      2632: 
1.34      cvs      2633: <p>For graphics, the line style property can be either solid, dotted, or
                   2634: dashed; the line thickness property controls the width of the lines; the fill
                   2635: pattern property determines how closed geometric figures must be filled.</p>
1.30      cvs      2636: 
1.34      cvs      2637: <p>While some of the properties which determine the appearance of a box's
1.1       cvs      2638: contents make sense only for one content type (text or graphic), other
1.34      cvs      2639: properties apply to all content types: these are the color properties. These
1.18      cvs      2640: indicate the color of lines and the background color.</p>
                   2641: </div>
                   2642: </div>
1.1       cvs      2643: 
1.18      cvs      2644: <div class="section">
1.37    ! cvs      2645: <h2><a name="sectb42" id="sectb42">Presentation description language</a></h2>
1.30      cvs      2646: 
1.34      cvs      2647: <p>A generic presentation defines the values of presentation properties (or
1.37    ! cvs      2648: the way to calculate those values) for a generic structure, or more
        !          2649: precisely, for all the element types and all the global and local attributes
        !          2650: defined in that generic structure. This definition of the presentation
        !          2651: properties is made with the P language. A program written in this language,
        !          2652: that is a generic presentation expressed in P, is call a <em>presentation
        !          2653: schema</em>. This section describes the syntax and semantics of the language,
        !          2654: using the same <a href="#sectc321">meta-language</a> as was used for the
        !          2655: definition of the S language.</p>
        !          2656: 
        !          2657: <p>Recall that it is possible to write many different presentation schemas
        !          2658: for the same class of documents or objects. This allows users to choose for a
        !          2659: document the graphical appearance which best suits their type of work or
1.18      cvs      2660: their personal taste.</p>
1.1       cvs      2661: 
1.18      cvs      2662: <div class="subsection">
1.37    ! cvs      2663: <h3><a name="sectc421" id="sectc421">The organization of a presentation
        !          2664: schema</a></h3>
1.1       cvs      2665: 
1.30      cvs      2666: <p>A presentation schema begins with the word <tt>PRESENTATION</tt> and ends
1.37    ! cvs      2667: with the word <tt>END</tt>. The word <tt>PRESENTATION</tt> is followed by the
        !          2668: name of the generic structure to which the presentation will be applied. This
1.30      cvs      2669: name must be the same as that which follows the keyword <tt>STRUCTURE</tt> in
                   2670: the structure schema associated with the presentation schema.</p>
                   2671: 
1.37    ! cvs      2672: <p>After this declaration of the name of the structure, the following
        !          2673: sections appear (in order):</p>
1.18      cvs      2674: <ul>
1.37    ! cvs      2675:   <li>Declarations of 
1.30      cvs      2676:     <ul>
                   2677:       <li>all views,</li>
                   2678:       <li>printed views,</li>
                   2679:       <li>counters,</li>
                   2680:       <li>presentation constants,</li>
                   2681:       <li>variables,</li>
                   2682:     </ul>
                   2683:   </li>
                   2684:   <li>default presentation rules,</li>
                   2685:   <li>presentation box and page layout box definitions,</li>
                   2686:   <li>presentation rules for structured elements,</li>
                   2687:   <li>presentation rules for attributes,</li>
                   2688:   <li>rules for transmitting values to attributes of included documents.</li>
1.18      cvs      2689: </ul>
1.30      cvs      2690: 
                   2691: <p>Each of these sections is introduced by a keyword which is followed by a
1.37    ! cvs      2692: sequence of declarations. Every section is optional.</p>
1.18      cvs      2693: <pre>     SchemaPres ='PRESENTATION' ElemID ';'
1.1       cvs      2694:                [ 'VIEWS' ViewSeq ]
                   2695:                [ 'PRINT' PrintViewSeq ]
                   2696:                [ 'COUNTERS' CounterSeq ]
                   2697:                [ 'CONST' ConstSeq ]
                   2698:                [ 'VAR' VarSeq ]
                   2699:                [ 'DEFAULT' ViewRuleSeq ]
                   2700:                [ 'BOXES' BoxSeq ]
                   2701:                [ 'RULES' PresentSeq ]
                   2702:                [ 'ATTRIBUTES' PresAttrSeq ]
                   2703:                [ 'TRANSMIT' TransmitSeq ]
                   2704:                  'END' .
1.18      cvs      2705:      ElemID     = NAME .</pre>
                   2706: </div>
1.1       cvs      2707: 
1.18      cvs      2708: <div class="subsection">
1.37    ! cvs      2709: <h3><a name="sectc422" id="sectc422">Views</a></h3>
1.1       cvs      2710: 
1.37    ! cvs      2711: <p>Each of the possible views must be declared in the presentation schema. As
        !          2712: has <a href="#views">already been described</a>, the presentation rules for
        !          2713: an element type can vary according to the view in which the element appears.
        !          2714: The name of the view is used to designate the view to which the presentation
        !          2715: rules apply (see the <a href="#inkeyword"><tt>IN</tt> instruction</a>). The
1.1       cvs      2716: definition of the view's contents are dispersed throughout the presentation
1.37    ! cvs      2717: rules attached to the different element types and attributes. The
1.18      cvs      2718: <tt>VIEWS</tt> section is simply a sequence of view names separated by commas
                   2719: and terminated by a semi-colon.</p>
1.30      cvs      2720: 
                   2721: <p>One of the view names (and only one) can be followed by the keyword
1.37    ! cvs      2722: <tt>EXPORT</tt>. This keyword identifies the view which presents the members
        !          2723: of the document class in <a href="#sectc3213">skeleton form</a>. The
        !          2724: graphical appearance and the content of this view is defined just as with
1.18      cvs      2725: other views, but it is useless to specify presentation rules concerning this
                   2726: view for the elements which are not loaded in the skeleton form.</p>
1.30      cvs      2727: 
                   2728: <p>It is not necessary to declare any views; in this case there is a single
1.37    ! cvs      2729: unnamed view. If many views are declared, the first view listed is considered
        !          2730: the principal view. The principal view is the one to which all rules that are
1.18      cvs      2731: not preceded by an indication of a view will apply (see the <a
                   2732: href="#inkeyword">instruction <tt>IN</tt></a>).</p>
1.30      cvs      2733: 
                   2734: <p>The principal view is the the one which the editor presents on the screen
1.37    ! cvs      2735: when the user asks to create or edit a document. Thus, it makes sense to put
        !          2736: the most frequently used view at the head of the list. But if the structure
1.18      cvs      2737: schema contains <a href="#sectc3213">skeleton elements</a> and is loaded in
                   2738: its skeleton form, the view whose name is followed by the keyword
                   2739: <tt>EXPORT</tt> will be opened and no other views can be opened.</p>
                   2740: <pre>                      'VIEWS' ViewSeq
1.1       cvs      2741:      ViewSeq         = ViewDeclaration
1.30      cvs      2742:                        &lt; ',' ViewDeclaration &gt; ';' .
1.1       cvs      2743:      ViewDeclaration = ViewID [ 'EXPORT' ] .
1.18      cvs      2744:      ViewID          = NAME .</pre>
1.30      cvs      2745: 
1.18      cvs      2746: <blockquote class="example">
1.30      cvs      2747:   <p><strong>Example:</strong></p>
                   2748: 
                   2749:   <p>When editing a report, it might be useful have views of the table of
1.37    ! cvs      2750:   contents and of the mathematical formulas, in addition to the principal
        !          2751:   view which shows the document in its entirety. To achieve this, a
        !          2752:   presentation schema for the Report class would have the following
        !          2753:   <tt>VIEWS</tt> section:</p>
1.30      cvs      2754:   <pre>VIEWS
1.18      cvs      2755:      Full_text, Table_of_contents, Formulas;</pre>
1.30      cvs      2756: 
                   2757:   <p>The contents of these views are specified in the presentation rules of
                   2758:   the schema.</p>
1.18      cvs      2759: </blockquote>
                   2760: </div>
1.1       cvs      2761: 
1.18      cvs      2762: <div class="subsection">
1.37    ! cvs      2763: <h3><a name="sectc423" id="sectc423">Print Views</a></h3>
1.1       cvs      2764: 
1.37    ! cvs      2765: <p>When editing a document, each view specified by the <tt>VIEWS</tt>
        !          2766: instruction is presented in a different window.</p>
1.30      cvs      2767: 
                   2768: <p>When printing a document, it is possible to print any number of views,
1.37    ! cvs      2769: chosen from among all the views which the editor can display. Print views, as
        !          2770: well as the order in which they must be printed, are indicated by the
        !          2771: <tt>PRINT</tt> instruction. It appears after the <tt>VIEWS</tt> instruction
        !          2772: and is formed of the keyword <tt>PRINT</tt> followed by the ordered list of
        !          2773: print view names. The print view names are separated by commas and followed
        !          2774: by a semi-colon. A print view name is a view name declared in the
        !          2775: <tt>VIEWS</tt> instruction.</p>
1.18      cvs      2776: <pre>                    'PRINT' PrintViewSeq
1.30      cvs      2777:      PrintViewSeq = PrintView &lt; ',' PrintView &gt; ';' .
1.37    ! cvs      2778:      PrintView    = ViewID .</pre>
1.30      cvs      2779: 
                   2780: <p>If the <tt>PRINT</tt> instruction is absent, the printing program will
                   2781: print only the principal view (the first view specified by the <tt>VIEWS</tt>
1.18      cvs      2782: instruction or the single, unnamed view when there is no <tt>VIEWS</tt>
                   2783: instruction).</p>
1.30      cvs      2784: 
1.18      cvs      2785: <blockquote class="example">
1.30      cvs      2786:   <p><strong>Example:</strong></p>
                   2787: 
                   2788:   <p>Consider a Report presentation using the view declarations from the
1.37    ! cvs      2789:   preceding example. Suppose we want to print the full text and table of
1.30      cvs      2790:   contents views, but not the Formulas view, which is only useful when
1.37    ! cvs      2791:   editing. A sensible printing order would be to print the full text followed
        !          2792:   by the table of contents. To obtain this result when printing, the
        !          2793:   presentation schema would say:</p>
1.30      cvs      2794:   <pre>PRINT
1.37    ! cvs      2795:      Full_text, Table_of_contents;</pre>
1.18      cvs      2796: </blockquote>
                   2797: </div>
                   2798: 
                   2799: <div class="subsection">
1.37    ! cvs      2800: <h3><a name="sectc424" id="sectc424">Counters</a></h3>
1.18      cvs      2801: 
1.30      cvs      2802: <p>A presentation has a <em>counter</em> for each type of number in the
1.37    ! cvs      2803: presentation. All counters, and therefore all types of numbers, used in the
1.18      cvs      2804: schema must be declared after the <tt>COUNTERS</tt> keyword.</p>
1.30      cvs      2805: 
                   2806: <p>Each counter declaration is composed of a name identifying the counter
1.1       cvs      2807: followed by a colon and the counting function to be applied to the counter.
1.18      cvs      2808: The counter declaration ends with a semi-colon.</p>
1.30      cvs      2809: 
                   2810: <p>The counting function indicates how the counter values will be calculated.
1.37    ! cvs      2811: Three types of counting functions are available. The first type is used to
1.16      cvs      2812: count the elements of a list or aggregate: it assigns to the counter the rank
1.37    ! cvs      2813: of the element in the list or aggregate. More precisely, the function</p>
1.18      cvs      2814: <pre>RANK OF ElemID [ LevelAsc ] [ INIT AttrID ]
                   2815:         [ 'REINIT' AttrID ]</pre>
1.30      cvs      2816: 
                   2817: <p>indicates that when an element creates, by a creation rule (see the <a
1.18      cvs      2818: href="#sectc4232"><tt>Create</tt> instructions</a>), a presentation box
1.37    ! cvs      2819: containing the counter value, this value is the rank of the creating element,
1.18      cvs      2820: if it is of type <tt>ElemID</tt>, otherwise the rank of the first element of
                   2821: type <tt>ElemID</tt> which encloses the creating element in the logical
                   2822: structure of the document.</p>
1.30      cvs      2823: 
                   2824: <p>The type name can be preceded by a star in the special case where the
1.18      cvs      2825: structure schema defines an element of whose <tt>ElemID</tt> is the same as
                   2826: that of an <a href="#sectd3284">inclusion</a> without expansion or with
1.37    ! cvs      2827: partial expansion. To resolve this ambiguity, the <tt>ElemID</tt> alone
1.18      cvs      2828: refers to the type defined in the structure schema while the <tt>ElemID</tt>
                   2829: preceded by a star refers to the included type.</p>
1.30      cvs      2830: 
1.37    ! cvs      2831: <p>The type name <tt>ElemID</tt> can be followed by an integer. That number
        !          2832: represents the relative level, among the ancestors of the creating element,
        !          2833: of the element whose rank is asked. If that relative level <i>n</i> is
        !          2834: unsigned, the <i>n</i><sup>th</sup> element of type <tt>ElemID</tt>
        !          2835: encountered when travelling the logical structure from the root to the
        !          2836: creating element is taken into account. If the relative level is negative,
        !          2837: the logical structure is travelled in the other direction, from the creating
        !          2838: element to the root.</p>
1.30      cvs      2839: 
1.37    ! cvs      2840: <p>The function can end with the keyword <tt>INIT</tt> followed by the name
        !          2841: of a numeric attribute (and only a numeric attribute). Then, the rank of the
1.30      cvs      2842: first element of the list or aggregate is considered to be the value of this
1.1       cvs      2843: attribute, rather than the default value of 1, and the rank of the other
1.37    ! cvs      2844: elements is shifted accordingly. The attribute which determines the initial
1.18      cvs      2845: value is searched on the element itself and on its ancestors.</p>
1.30      cvs      2846: 
                   2847: <p>The function can end with the keyword <tt>REINIT</tt> followed by the name
1.37    ! cvs      2848: of a numeric attribute (and only a numeric attribute). Then, if an element to
1.30      cvs      2849: be counted has this attribute, the counter value for this element is the
1.1       cvs      2850: attribute value and the following elements are numbered starting from this
1.18      cvs      2851: value.</p>
1.30      cvs      2852: 
                   2853: <p>When the <tt>RANK</tt> function is written</p>
1.18      cvs      2854: <pre>RANK OF Page [ ViewID ] [ INIT AttrID ]</pre>
1.30      cvs      2855: 
                   2856: <p>(<tt>Page</tt>is a keyword of the P language), the counter takes as its
                   2857: value the number of the page on which the element which creates the
1.37    ! cvs      2858: presentation box containing the number appears. This is done as if the pages
        !          2859: of the document form a list for each view. The counter only takes into
1.30      cvs      2860: account the pages of the relevant view, that is the view displaying the
1.37    ! cvs      2861: presentation box whose contents take the value of the number. However, if the
        !          2862: keyword <tt>Page</tt> is followed by the name of a view (between
        !          2863: parentheses), it is the pages of that view that are taken into account. As in
        !          2864: the preceding form, the <tt>RANK</tt> function applied to pages can end with
        !          2865: the <tt>INIT</tt> keyword followed by the name of a numeric attribute which
        !          2866: sets the value of the first page's number. This attribute must be a local
1.30      cvs      2867: attribute of the document itself, and not of one of its components.</p>
                   2868: 
                   2869: <p>The second counting function is used to count the occurrences of a certain
1.37    ! cvs      2870: element type in a specified context. The instruction</p>
1.18      cvs      2871: <pre>SET n ON Type1 ADD m ON Type2 [ INIT AttrID ]</pre>
1.30      cvs      2872: 
                   2873: <p>says that when the document is traversed from beginning to end (in the
                   2874: order induced by the logical structure), the counter is assigned the value
1.18      cvs      2875: <tt>n</tt> each time an element of type <tt>Type1</tt> is encountered, no
                   2876: matter what the current value of the counter, and the value <tt>m</tt> is
                   2877: added to the current value of the counter each time an element of type
                   2878: <tt>Type2</tt> is encountered.</p>
1.30      cvs      2879: 
                   2880: <p>As with the <tt>RANK</tt> function, the type names can be preceded by a
                   2881: star to resolve the ambiguity of included elements.</p>
                   2882: 
1.37    ! cvs      2883: <p>If the function ends with the keyword <tt>INIT</tt> followed by the name
        !          2884: of an attribute and if the document possesses this attribute, the value of
        !          2885: this attribute is used in place of <tt>n</tt>. The attribute must be numeric.
        !          2886: It is searched on the element itself and on its ancestors.</p>
1.30      cvs      2887: 
                   2888: <p>This function can also be used with the <tt>Page</tt> keyword in the place
1.37    ! cvs      2889: of <tt>Type1</tt> or <tt>Type2</tt>. In the first case, the counter is
1.18      cvs      2890: reinitialized on each page with the value <tt>n</tt>, while in the second
1.37    ! cvs      2891: case, it is incremented by <tt>m</tt> on each page. As with the preceding
1.18      cvs      2892: counting function, the word <tt>Page</tt> can be followed by a name between
1.37    ! cvs      2893: parentheses. In this case, the name specifies a view whose pages are taken
1.18      cvs      2894: into account.</p>
1.30      cvs      2895: 
                   2896: <p>The definition of a counter can contain several <tt>SET</tt> functions and
1.37    ! cvs      2897: several <tt>ADD</tt> functions, each with a different value. The total number
1.18      cvs      2898: of counting functions must not be greater than 6.</p>
1.30      cvs      2899: 
1.37    ! cvs      2900: <p>The third counting function is used to count the elements of a certain
        !          2901: type encountered when travelling from the creating element to the root of the
        !          2902: logical structure. The creating element is included if it is of that type.
1.18      cvs      2903: That function is written</p>
                   2904: <pre>RLEVEL OF Type</pre>
1.30      cvs      2905: 
                   2906: <p>where <tt>Type</tt> represents the type of the elements to be counted.</p>
                   2907: 
                   2908: <p>The formal definition of counter declarations is:</p>
1.18      cvs      2909: <pre>                    'COUNTERS' CounterSeq
1.30      cvs      2910:      CounterSeq   = Counter &lt; Counter &gt; .
1.1       cvs      2911:      Counter      = CounterID ':' CounterFunc ';' .
                   2912:      CounterID    = NAME .
                   2913:      CounterFunc  = 'RANK' 'OF' TypeOrPage [ SLevelAsc ]
1.16      cvs      2914:                     [ 'INIT' AttrID ] [ 'REINIT' AttrID ] /
1.30      cvs      2915:                     SetFunction &lt; SetFunction &gt;
                   2916:                     AddFunction &lt; AddFunction &gt;
1.16      cvs      2917:                     [ 'INIT' AttrID ] /
                   2918:                     'RLEVEL' 'OF' ElemID .
1.1       cvs      2919:      SLevelAsc    = [ '-' ] LevelAsc .
                   2920:      LevelAsc     =  NUMBER .
                   2921:      SetFunction  = 'SET' CounterValue 'ON' TypeOrPage .
                   2922:      AddFunction  = 'ADD' CounterValue 'ON' TypeOrPage .
                   2923:      TypeOrPage   = 'Page' [ '(' ViewID ')' ] / 
1.16      cvs      2924:                     [ '*' ] ElemID .
1.18      cvs      2925:      CounterValue = NUMBER .</pre>
1.30      cvs      2926: 
1.18      cvs      2927: <blockquote class="example">
1.30      cvs      2928:   <p><strong>Example:</strong></p>
                   2929: 
                   2930:   <p>If the body of a chapter is defined as a sequence of sections in the
                   2931:   structure schema:</p>
                   2932:   <pre>Chapter_body = LIST OF (Section = 
1.1       cvs      2933:                             BEGIN
                   2934:                             Section_Title = Text;
                   2935:                             Section_Body  = Paragraphs;
                   2936:                             END
1.18      cvs      2937:                          );</pre>
1.30      cvs      2938: 
                   2939:   <p>the section counter is declared:</p>
                   2940:   <pre>SectionCtr : RANK OF Section;</pre>
                   2941: 
                   2942:   <p>and the display of the section number before the section title is
                   2943:   obtained by a <a href="#sectc4232"><tt>CreateBefore</tt> rule</a> attached
                   2944:   the <tt>Section_Title</tt> type, which creates a presentation box whose
                   2945:   content is the value of the <tt>SectionCtr</tt> counter (see the <a
                   2946:   href="#sectc4231"><tt>Content</tt> instruction</a>).</p>
                   2947: 
                   2948:   <p>In order to number the formulas separately within each chapter, the
                   2949:   formula counter is declared:</p>
                   2950:   <pre>FormulaCtr : SET 0 ON Chapter ADD 1 ON Formula;</pre>
                   2951: 
1.37    ! cvs      2952:   <p>and the display of the formula number in the right margin, alongside
        !          2953:   each formula, is obtained by a <tt>CreateAfter</tt> instruction attached to
        !          2954:   the <tt>Formula</tt> type, which creates a presentation box whose content
        !          2955:   is the value of the <tt>FormulaCtr</tt> counter.</p>
1.30      cvs      2956: 
                   2957:   <p>To number the page chapter by chapter, with the first page of each
                   2958:   chapter having the number 1, the counter definition would be</p>
                   2959:   <pre>ChapterPageCtr : SET 0 ON Chapter ADD 1 ON Page;</pre>
                   2960: 
                   2961:   <p>If there is also a chapter counter</p>
                   2962:   <pre>ChapterCtr : RANK OF Chapter;</pre>
                   2963: 
1.37    ! cvs      2964:   <p>the <a href="#sectc4231">content</a> of a presentation box created at
        !          2965:   the top of each page could be defined as:</p>
1.30      cvs      2966:   <pre>Content : (VALUE(ChapterCtr, URoman) TEXT '-'
1.18      cvs      2967:            VALUE(ChapterPageCtr, Arabic));</pre>
1.30      cvs      2968: 
                   2969:   <p>Thus, the presentation box contains the number of the chapter in
                   2970:   upper-case roman numerals followed by a hyphen and the number of the page
                   2971:   within the chapter in arabic numerals.</p>
1.18      cvs      2972: </blockquote>
1.30      cvs      2973: 
1.18      cvs      2974: <blockquote class="example">
1.30      cvs      2975:   <p><strong>Example:</strong></p>
                   2976: 
1.37    ! cvs      2977:   <p>To count tables and figures together in a document of the chapter type,
        !          2978:   a counter could be defined using:</p>
1.30      cvs      2979:   <pre>CommonCtr : SET 0 ON Chapter ADD 1 ON Table
1.18      cvs      2980:             ADD 1 ON Figure;</pre>
                   2981: </blockquote>
                   2982: </div>
1.1       cvs      2983: 
1.18      cvs      2984: <div class="subsection">
1.37    ! cvs      2985: <h3><a name="sectc425" id="sectc425">Presentation constants</a></h3>
1.1       cvs      2986: 
1.30      cvs      2987: <p>Presentation constants are used in the definition of the content of
1.37    ! cvs      2988: presentation boxes. This content is used in <a href="#sectc426">variable
        !          2989: definitions</a> and in the <a href="#sectc4231"><tt>Content</tt> rule</a>.
        !          2990: The only presentation constants which can be used are character strings,
1.2       cvs      2991: mathematical symbols, graphical elements, and pictures, that is to say, base
1.18      cvs      2992: elements.</p>
1.30      cvs      2993: 
                   2994: <p>Constants can be defined directly in the variables or presentation boxes
1.37    ! cvs      2995: (<tt>Content</tt> rule) which use them. But it is only necessary them to
1.1       cvs      2996: declare once, in the constant declaration section, even though they are used
1.37    ! cvs      2997: in many variables or boxes. Thus, each declared constant has a name, which
1.1       cvs      2998: allows it to be designated whenever it is used, a type (one of the four base
                   2999: types) and a value (a character string or a single character for mathematical
1.18      cvs      3000: symbols and graphical elements).</p>
1.30      cvs      3001: 
1.37    ! cvs      3002: <p>The constant declarations appear after the keyword <tt>CONST</tt>. Each
        !          3003: declaration is composed of the name of the constant, an equals sign, a
        !          3004: keyword representing its type (<tt>Text</tt>, <tt>Symbol</tt>,
        !          3005: <tt>Graphics</tt> or <tt>Picture</tt>) and the string representing its value.
        !          3006: A semi-colon terminates each declaration.</p>
1.30      cvs      3007: 
                   3008: <p>In the case of a character string, the keyword <tt>Text</tt> can be
                   3009: followed by the name of an alphabet (for example, <tt>Greek</tt> or
1.37    ! cvs      3010: <tt>Latin</tt>) in which the constant's text should be expressed. If the
        !          3011: alphabet name is absent, the Latin alphabet is used. When the alphabet name
        !          3012: is present, only the first letter of the alphabet name is interpreted. Thus,
        !          3013: the words <tt>Greek</tt> and <tt>Grec</tt> designate the same alphabet. In
1.30      cvs      3014: current versions of Thot, only the Greek and Latin alphabets are
                   3015: available.</p>
1.18      cvs      3016: <pre>                 'CONST' ConstSeq
1.30      cvs      3017:      ConstSeq   = Const &lt; Const &gt; .
1.1       cvs      3018:      Const      = ConstID '=' ConstType ConstValue ';' .
                   3019:      ConstID    = NAME .
                   3020:      ConstType  ='Text' [ Alphabet ] / 'Symbol' /
                   3021:                  'Graphics' / 'Picture' .
                   3022:      ConstValue = STRING .
1.18      cvs      3023:      Alphabet   = NAME .</pre>
1.30      cvs      3024: 
                   3025: <p>For character strings in the Latin alphabet (ISO Latin-1 character set),
1.1       cvs      3026: characters having codes higher than 127 (decimal) are represented by their
1.18      cvs      3027: code in octal.</p>
1.30      cvs      3028: 
                   3029: <p>In the case of a symbol or graphical element, the value only contains a
1.37    ! cvs      3030: single character, between apostrophes, which indicates the form of the
        !          3031: element which must be drawn in the box whose content is the constant. The
        !          3032: symbol or graphical element takes the dimensions of the box, which are
        !          3033: determined by the <tt>Height</tt> and <tt>Width</tt> rules. See <a
        !          3034: href="#sectb72">table of codes</a> for the symbols and graphical elements.</p>
1.30      cvs      3035: 
1.18      cvs      3036: <blockquote class="example">
1.30      cvs      3037:   <p><strong>Example:</strong></p>
                   3038: 
                   3039:   <p>The constants ``Summary:'' and fraction bar, which were described
                   3040:   earlier, are declared:</p>
                   3041:   <pre>CONST
1.1       cvs      3042:      SummaryConst = Text 'Summary:';
1.18      cvs      3043:      Bar          = Graphics 'h';</pre>
                   3044: </blockquote>
                   3045: </div>
1.1       cvs      3046: 
1.18      cvs      3047: <div class="subsection">
1.37    ! cvs      3048: <h3><a name="sectc426" id="sectc426">Variables</a></h3>
1.1       cvs      3049: 
1.37    ! cvs      3050: <p>Variables permit the definition of computed content for presentation
        !          3051: boxes. A variable is associated with a presentation box by a <tt>Content</tt>
        !          3052: rule; but before being used in a <tt>Content</tt> rule, a variable can be
        !          3053: defined in the <tt>VAR</tt> section. It is also possible to define a variable
        !          3054: at the time of its use in a <tt>Content</tt> rule, as can be done with a
1.30      cvs      3055: constant.</p>
                   3056: 
                   3057: <p>A variable has a name and a value which is a character string resulting
1.37    ! cvs      3058: from the concatenation of the values of a sequence of functions. Each
1.30      cvs      3059: variable declaration is composed of the variable name followed by a colon and
1.37    ! cvs      3060: the sequence of functions which produces its value, separated by spaces. Each
1.18      cvs      3061: declaration is terminated by a semi-colon.</p>
                   3062: <pre>                  'VAR' VarSeq
1.30      cvs      3063:      VarSeq      = Variable &lt; Variable &gt; .
1.1       cvs      3064:      Variable    = VarID ':' FunctionSeq ';' .
                   3065:      VarID       = NAME .
1.30      cvs      3066:      FunctionSeq = Function &lt; Function &gt; .</pre>
                   3067: 
1.37    ! cvs      3068: <p>Several functions are available. The first two return, in the form of a
        !          3069: character string, the current date. <tt>DATE</tt> returns the date in
1.18      cvs      3070: English, while <tt>FDATE</tt> returns the date in french.</p>
1.30      cvs      3071: 
                   3072: <p>Two other functions, <tt>DocName</tt> and <tt>DirName</tt>, return the
1.18      cvs      3073: document name and the directory where the document is stored.</p>
1.30      cvs      3074: 
                   3075: <p>Function <tt>ElemName</tt> returns the type of the element which created
                   3076: the presentation box whose contents are the variable.</p>
                   3077: 
                   3078: <p>Another function simply returns the value of a presentation constant. For
                   3079: any constant declared in the <tt>CONST</tt> section, it is sufficient to give
1.37    ! cvs      3080: the name of the constant. Otherwise, the type and value of the constant must
1.30      cvs      3081: be given, using the same form as in a <a href="#sectc425">constant
1.18      cvs      3082: declaration</a>. If the constant is not of type text, (types <tt>Symbol</tt>,
                   3083: <tt>Graphics</tt> or <tt>Picture</tt>), it must be alone in the variable
                   3084: definition; only constants of type <tt>Text</tt> can be mixed with other
                   3085: functions.</p>
1.30      cvs      3086: 
                   3087: <p>It is also possible to obtain the value of an attribute, simply by
1.37    ! cvs      3088: mentioning the attribute's name. The value of this function is the value of
1.30      cvs      3089: the attribute for the element which created the presentation box whose
1.37    ! cvs      3090: contents are the variable. If the creating element does not have the
        !          3091: indicated attribute, the value is an empty string. In the case of a numeric
1.30      cvs      3092: attribute, the attribute is translated into a decimal number in arabic
1.37    ! cvs      3093: numerals. If another form is desired, the <tt>VALUE</tt> function must be
1.30      cvs      3094: used.</p>
                   3095: 
                   3096: <p>The last available function returns, as a character string, the value of a
1.1       cvs      3097: counter, an attribute or a page number. This value can be presented in
1.37    ! cvs      3098: different styles. The keyword <tt>VALUE</tt> is followed (between
1.1       cvs      3099: parentheses) by the name of the counter, the name of the attribute, or the
1.18      cvs      3100: keyword <tt>PageNumber</tt> and the desired style, the two parameters being
1.37    ! cvs      3101: separated by a comma. The style is a keyword which indicates whether the
1.18      cvs      3102: value should be presented in arabic numerals (<tt>Arabic</tt>), lower-case
                   3103: roman numerals (<tt>LRoman</tt>), or upper-case roman numerals
                   3104: (<tt>URoman</tt>), or by an upper-case letter (<tt>Uppercase</tt>) or
                   3105: lower-case letter (<tt>Lowercase</tt>).</p>
1.30      cvs      3106: 
                   3107: <p>For a page counter, the keyword <tt>PageNumber</tt> can be followed,
                   3108: between parentheses, by the name of the view from which to obtain the page
1.37    ! cvs      3109: number. By default, the first view declared in the <tt>VIEWS</tt> section is
        !          3110: used. The value obtained is the number of the page on which is found the
1.30      cvs      3111: element that is using the variable in a <tt>Content</tt> rule.</p>
                   3112: 
                   3113: <p>For an ordinary counter, the name of the counter can be preceded by the
1.37    ! cvs      3114: keyword <tt>MaxRangeVal</tt> or <tt>MinRangeVal</tt>. These keywords mean
1.1       cvs      3115: that the value returned by the function is the maximum (minimum resp.) value
                   3116: taken by the counter in the whole document, not the value for the element
1.18      cvs      3117: concerned by the function.</p>
                   3118: <pre>     Function     = 'DATE' / 'FDATE' /
1.1       cvs      3119:                     'DocName' / 'DirName' /
                   3120:                     'ElemName' / 'AttributeName' /
                   3121:                      ConstID / ConstType ConstValue /
                   3122:                      AttrID /
                   3123:                     'VALUE' '(' PageAttrCtr ','
                   3124:                                 CounterStyle ')' .
1.6       cvs      3125:      PageAttrCtr  = 'PageNumber' [ '(' ViewID ')' ] /
1.1       cvs      3126:                      [ MinMax ] CounterID / AttrID .
                   3127:      CounterStyle = 'Arabic' / 'LRoman' / 'URoman' /
                   3128:                     'Uppercase' / 'Lowercase' .
1.18      cvs      3129:      MinMax       = 'MaxRangeVal' / 'MinRangeVal' .</pre>
1.30      cvs      3130: 
1.18      cvs      3131: <blockquote class="example">
1.30      cvs      3132:   <p><strong>Example:</strong></p>
                   3133: 
                   3134:   <p>To make today's date appear at the top of the first page of a report, a
                   3135:   <a href="#sectc4232"><tt>CREATE</tt> rule</a> associated with the
                   3136:   Report_Title element type generates a presentation box whose content
                   3137:   (specified by the <tt>Content</tt> rule of that presentation box) is the
                   3138:   variable:</p>
                   3139:   <pre>VAR
1.18      cvs      3140:      Todays_date : TEXT 'Version of ' DATE;</pre>
1.30      cvs      3141: 
                   3142:   <p>To produce, before each section title, the chapter number (in upper-case
                   3143:   roman numerals) followed by the section number (in arabic numerals), two
                   3144:   counters must be defined:</p>
                   3145:   <pre>COUNTERS
1.1       cvs      3146:      ChapterCtr : RANK OF Chapter;
1.18      cvs      3147:      SectionCtr : RANK OF Section;</pre>
1.30      cvs      3148: 
                   3149:   <p>and the Section_Title element must create a presentation box whose
                   3150:   content is the variable</p>
                   3151:   <pre>VAR
1.1       cvs      3152:      SectionNum : VALUE (ChapterCtr, URoman) TEXT '-'
1.18      cvs      3153:                   VALUE (SectionCtr, Arabic);</pre>
1.30      cvs      3154: 
                   3155:   <p>In order to make the page number on which each section begins appear in
                   3156:   the table of contents view next to the section title, each Section_Title
                   3157:   element must create a presentation box, visible only in the table of
                   3158:   contents view, whose content is the variable:</p>
                   3159:   <pre>VAR
1.1       cvs      3160:      TitlePageNume :
1.18      cvs      3161:            VALUE (PageNumber(Full_text), Arabic);</pre>
                   3162: </blockquote>
                   3163: </div>
1.1       cvs      3164: 
1.18      cvs      3165: <div class="subsection">
1.37    ! cvs      3166: <h3><a name="sectc427" id="sectc427">Default presentation rules</a></h3>
1.1       cvs      3167: 
1.30      cvs      3168: <p>In order to avoid having to specify, for each element type defined in the
1.1       cvs      3169: structure schema, values for every one of the numerous presentation
1.34      cvs      3170: properties, the presentation schema allows the definition of a set of default
1.37    ! cvs      3171: presentation rules. These rules apply to all the boxes of the elements
1.1       cvs      3172: defined in the structure schema and to the presentation boxes and page layout
1.37    ! cvs      3173: boxes defined in the presentation schema. Only rules which differ from these
1.18      cvs      3174: default need to be specified in other sections of the presentation schema.</p>
1.30      cvs      3175: 
                   3176: <p>For the primary view, the default rules can define every presentation
1.34      cvs      3177: property, but not the <a href="#presfunct">presentation functions</a> or the
1.18      cvs      3178: <a href="#sectc4223">linebreaking conditions</a> (the <tt>NoBreak1</tt>,
                   3179: <tt>NoBreak2</tt>, and <tt>Gather</tt> rules).</p>
1.30      cvs      3180: 
                   3181: <p>In a presentation schema, the default presentation rules section is
                   3182: optional; in this case, the <tt>DEFAULT</tt> keyword is also absent and the
                   3183: following rules are considered to be the default rules:</p>
1.26      cvs      3184: <pre>   Visibility:        Enclosing =;
                   3185:    VertRef:           * . Left;
                   3186:    HorizRef:          Enclosed . HRef;
                   3187:    Height:            Enclosed . Height;
                   3188:    Width:             Enclosed . Width;
                   3189:    VertPos:           Top = Previous . Bottom;
                   3190:    HorizPos:          Left = Enclosing . Left;
                   3191:    MarginTop:         0;
                   3192:    MarginRight:       0;
                   3193:    MarginBottom:      0;
                   3194:    MarginLeft:        0;
                   3195:    PaddingTop:        0;
                   3196:    PaddingRight:      0;
                   3197:    PaddingBottom:     0;
                   3198:    PaddingLeft:       0;
                   3199:    BorderTopWidth:    0;
                   3200:    BorderRightWidth:  0;
                   3201:    BorderBottomWidth: 0;
                   3202:    BorderLeftWidth:   0;
                   3203:    BorderTopColor:    Foreground;
                   3204:    BorderRightColor:  Foreground;
                   3205:    BorderBottomColor: Foreground;
                   3206:    BorderLeftColor:   Foreground;
                   3207:    BorderTopStyle:    None;
                   3208:    BorderRightStyle:  None;
                   3209:    BorderBottomStyle: None;
                   3210:    BorderLeftStyle:   None;
                   3211:    VertOverflow:      No;
                   3212:    HorizOverflow:     No;
                   3213:    Size:              Enclosing =;
                   3214:    Style:             Enclosing =;
                   3215:    Weight:            Enclosing =;
                   3216:    Font:              Enclosing =;
                   3217:    Underline:         Enclosing =;
                   3218:    Thickness:         Enclosing =;
                   3219:    Indent:            Enclosing =;
                   3220:    LineSpacing:       Enclosing =;
                   3221:    Adjust:            Enclosing =;
                   3222:    Hyphenate:         Enclosing =;
                   3223:    PageBreak:         Yes;
                   3224:    LineBreak:         Yes;
                   3225:    InLine:            Yes;
                   3226:    Depth:             0;
                   3227:    LineStyle:         Enclosing =;
                   3228:    LineWeight:        Enclosing =;
                   3229:    FillPattern:       Enclosing =;
                   3230:    Background:        Enclosing =;
                   3231:    Foreground:        Enclosing =;</pre>
1.30      cvs      3232: 
                   3233: <p>If other values are desired for the default rules, they must be defined
1.37    ! cvs      3234: explicitly in the default rules section. In fact, it is only necessary to
1.1       cvs      3235: define those default rules which differ from the ones above, since the rules
1.18      cvs      3236: above will be used whenever a rule is not explicitly named.</p>
1.30      cvs      3237: 
1.37    ! cvs      3238: <p>Default rules for views other than the primary view can also be specified.
1.1       cvs      3239: Otherwise, the default rules for the primary views are applied to the other
1.18      cvs      3240: views.</p>
1.30      cvs      3241: 
                   3242: <p>Default rules are expressed in the same way as <a
                   3243: href="#sectc4215">explicit rules for document elements</a>.</p>
1.18      cvs      3244: </div>
1.1       cvs      3245: 
1.18      cvs      3246: <div class="subsection">
1.37    ! cvs      3247: <h3><a name="sectc428" id="sectc428">Presentation and page layout
        !          3248: boxes</a></h3>
1.1       cvs      3249: 
1.30      cvs      3250: <p>The presentation process uses elements which are not part of the logical
1.1       cvs      3251: structure of the document, such as pages (which are the page layout boxes) or
                   3252: alternatively, rules, numbers, or words introducing certain parts of the
                   3253: document, such as ``Summary'', ``Appendices'', ``Bibliography'', etc. (which
1.18      cvs      3254: are presentation boxes).</p>
1.30      cvs      3255: 
                   3256: <p>After the word <tt>BOXES</tt>, each presentation or page layout box is
                   3257: defined by its name and a sequence of presentation rules which indicate how
1.37    ! cvs      3258: they must be displayed. These rules are the same as those which define the
        !          3259: boxes associated with element of the logical structure of the document, with
        !          3260: a single exception, the <a href="#sectc4231"><tt>Content</tt> rule</a> which
        !          3261: is used only to specify the content of presentation boxes. The content of
        !          3262: boxes associated with elements of the document structure is defined in each
        !          3263: document or object and thus is not specified in the presentation schema,
        !          3264: which applies to all documents or objects of a class.</p>
1.30      cvs      3265: 
                   3266: <p>Among the rules which define a presentation box, certain ones can refer to
1.37    ! cvs      3267: another presentation box (for example, in their positional rules). If the
1.1       cvs      3268: designated box is defined after the box which designates it, a
1.18      cvs      3269: <tt>FORWARD</tt> instruction followed by the name of the designated box must
                   3270: appear before the designation.</p>
                   3271: <pre>             'BOXES' BoxSeq
1.30      cvs      3272:      BoxSeq = Box &lt; Box &gt; .
1.1       cvs      3273:      Box    ='FORWARD' BoxID ';' /
                   3274:               BoxID ':' ViewRuleSeq .
1.18      cvs      3275:      BoxID  = NAME .</pre>
                   3276: </div>
1.1       cvs      3277: 
1.18      cvs      3278: <div class="subsection">
1.37    ! cvs      3279: <h3><a name="sectc429" id="sectc429">Presentation of structured
        !          3280: elements</a></h3>
1.1       cvs      3281: 
1.30      cvs      3282: <p>After the words <tt>RULES</tt>, the presentation schema gives the
                   3283: presentation rules that apply to the elements whose types are defined in the
1.37    ! cvs      3284: structure schema. Only those rules which differ from the <a
1.18      cvs      3285: href="#sectc427">default</a> must be specified in the <tt>RULES</tt>
                   3286: section.</p>
1.30      cvs      3287: 
                   3288: <p>The rule definitions for each element type are composed of the name of the
1.1       cvs      3289: element type (as specified in the structure schema) followed by a colon and
1.18      cvs      3290: the set of rules specific to that type.</p>
1.30      cvs      3291: 
                   3292: <p>The type name can be preceded by a star in the special case where the
1.18      cvs      3293: structure schema defines an <a href="#sectd3284">inclusion</a> without
1.1       cvs      3294: expansion (or with partial expansion) of a type with the same name as an
1.18      cvs      3295: element of defined in the structure schema.</p>
1.30      cvs      3296: 
                   3297: <p>In the case where the element is a <a href="#sectd3285">mark pair</a>, but
1.18      cvs      3298: only in this case, the type name can be preceded by the keywords
1.37    ! cvs      3299: <tt>First</tt> or <tt>Second</tt>. These keywords indicate whether the rules
1.18      cvs      3300: that follow apply to the first or second mark of the pair.</p>
                   3301: <pre>                 'RULES' PresentSeq
1.30      cvs      3302:      PresentSeq = Present &lt; Present &gt; .
1.6       cvs      3303:      Present    = [ '*' ] [ FirstSec ] ElemID ':'
                   3304:                   ViewRuleSeq .
1.18      cvs      3305:      FirstSec   = 'First' / 'Second' .</pre>
1.30      cvs      3306: 
                   3307: <p>A presentation schema can define presentation rules for base elements,
1.37    ! cvs      3308: which are defined implicitly in the structure schemas. In the English version
1.30      cvs      3309: of the presentation schema compiler, the base type names are the same as in
                   3310: the S language, but they are terminated by the <tt>_UNIT</tt> suffix:
1.18      cvs      3311: <tt>TEXT_UNIT</tt>, <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>,
1.37    ! cvs      3312: <tt>GRAPHICS_UNIT</tt>. The base type names are written in upper-case
1.18      cvs      3313: letters.</p>
                   3314: </div>
                   3315: 
                   3316: <div class="subsection">
1.37    ! cvs      3317: <h3><a name="sectc4210" id="sectc4210">Logical attribute presentation</a></h3>
1.18      cvs      3318: 
1.30      cvs      3319: <p>After the keyword <tt>ATTRIBUTES</tt>, all attributes which are to have
1.37    ! cvs      3320: some effect on the presentation of the element to which they are attached
        !          3321: must be mentioned, along with the corresponding presentation rules. This is
        !          3322: true for both global attributes (which can be attached to all element types)
        !          3323: and local attributes (which can only be attached to certain element
        !          3324: types).</p>
1.30      cvs      3325: 
                   3326: <p>Also mentioned in this section are attributes which imply an effect on
1.1       cvs      3327: elements in the subtree of the element to which they are attached. The
1.37    ! cvs      3328: presentation of these descendants can be modified as a function of the value
1.1       cvs      3329: of the attribute which they inherit, just as if it was attached to them
1.18      cvs      3330: directly.</p>
1.30      cvs      3331: 
                   3332: <p>The specification for each attribute includes the attribute's name,
                   3333: followed by an optional value specification and, after a colon, a set of
1.37    ! cvs      3334: rules. The set of rules must contain at least one rule.</p>
1.30      cvs      3335: 
1.37    ! cvs      3336: <p>When there is no value specification, the rules are applied to all
        !          3337: elements which carry the attribute, no matter what their value. When the
        !          3338: rules must only apply when the attribute has certain values, these values
        !          3339: must be specified. Thus, the same attribute can appear in the
        !          3340: <tt>ATTRIBUTES</tt> section several times, with each appearance having a
        !          3341: different value specification. However, reference attributes never have a
        !          3342: value specification and, as a result, can only appear once in the
        !          3343: <tt>ATTRIBUTES</tt> section.</p>
1.30      cvs      3344: 
                   3345: <p>To specify that the presentation rules apply to some of the descendants of
                   3346: the element having the attribute, the name of the affected element type is
1.37    ! cvs      3347: given, between parentheses, after the attribute name. This way, the
        !          3348: presentation rules for the attribute will be applied to the element having
        !          3349: the attribute, if it is of the given type, and to all of its descendants of
        !          3350: the given type. In the case where this type is a <a href="#sectd3285">mark
        !          3351: pair</a>, but only in this case, the type name can be preceded by the
        !          3352: keywords <tt>First</tt> or <tt>Second</tt>. These keywords indicate whether
        !          3353: the rules that follow apply to the first or second mark of the pair. If the
        !          3354: rule must apply to several different element types, the specification must be
        !          3355: repeated for each element type.</p>
1.30      cvs      3356: 
                   3357: <p>The specification of values for which the presentation rules will be
                   3358: applied varies according to the type of the attribute:</p>
1.18      cvs      3359: <dl>
1.30      cvs      3360:   <dt>numeric attribute</dt>
                   3361:     <dd>If the rules are to apply for one value of the attribute, then the
1.37    ! cvs      3362:       attribute name is followed by an equals sign and this value. If the
1.30      cvs      3363:       rules are to apply for all values less than (or greater than) a
                   3364:       threshold value, non-inclusive, the attribute name followed by a '&lt;'
1.37    ! cvs      3365:       sign (or a '&gt;' sign, respectively) and the threshold value. If the
        !          3366:       rules must apply to a range of values, the attribute name is followed
        !          3367:       by the word '<tt>IN</tt>' and the two bounds of the range, enclosed in
        !          3368:       brackets and separated by two periods ('<tt>..</tt>'). In the case of
        !          3369:       ranges, the values of the bounds are included in the range. 
1.30      cvs      3370:       <p>The threshold value in the comparisons can be the value of an
1.37    ! cvs      3371:       attribute attached to an ancestor element. In this case, the attribute
1.30      cvs      3372:       name is given instead of a constant value.</p>
1.37    ! cvs      3373:       <p>It is also possible to write rules which apply only when a
        !          3374:       comparison between two different attributes of the element's ancestors
        !          3375:       is true. In this case, the first attribute name is followed by a
        !          3376:       comparison keyword and the name of the second attribute. The comparison
        !          3377:       keywords are <tt>EQUAL</tt> (simple equality), <tt>LESS</tt>
        !          3378:       (non-inclusive less than), and <tt>GREATER</tt> (non-inclusive greater
        !          3379:       than).</p>
1.30      cvs      3380:     </dd>
                   3381:   <dt>text attribute</dt>
                   3382:     <dd>If the rules are to apply for one value of the attribute, then the
                   3383:       attribute name is followed by an equals sign and this value.</dd>
                   3384:   <dt>reference attribute</dt>
                   3385:     <dd>There is never a value specification; the rules apply no matter what
                   3386:       element is designated by the attribute.</dd>
                   3387:   <dt>enumerated attribute</dt>
                   3388:     <dd>If the rules are to apply for one value of the attribute, then the
                   3389:       attribute name is followed by an equals sign and this value.</dd>
1.18      cvs      3390: </dl>
1.30      cvs      3391: 
                   3392: <p>The order in which the rules associated with a numeric attribute are
1.37    ! cvs      3393: defined is important. When multiple sets of rules can be applied, the first
1.30      cvs      3394: set declared is the one used.</p>
                   3395: 
                   3396: <p>Rules for attributes have priority over both default rules and rules
1.37    ! cvs      3397: associated with element types. The attribute rules apply to the element to
        !          3398: which the attribute is attached. It is the rules which apply to the
1.1       cvs      3399: surrounding elements (and especially to the descendants) which determine the
                   3400: effect of the attribute rules on the environment ( and especially on the
1.18      cvs      3401: terminal elements of the structure).</p>
                   3402: <pre>                    'ATTRIBUTES' PresAttrSeq
1.30      cvs      3403:      PresAttrSeq  = PresAttr &lt; PresAttr &gt; .
1.1       cvs      3404:      PresAttr     = AttrID [ '(' [ FirstSec ] ElemID ')' ]
                   3405:                     [ AttrRelation ] ':' ViewRuleSeq .
                   3406:      AttrID       = NAME .
                   3407:      AttrRelation ='=' AttrVal /
1.30      cvs      3408:                     '&gt;' [ '-' ] MinValue /
1.1       cvs      3409:                     '&lt;' [ '-' ] MaxValue /
                   3410:                     'IN' '[' [ '-' ] LowerBound '..'
                   3411:                     [ '-' ] UpperBound ']' /
                   3412:                     'GREATER' AttrID /
                   3413:                     'EQUAL' AttrID /
                   3414:                     'LESS' AttrID .
                   3415:      AttrVal      = [ '-' ] EqualNum / EqualText /
                   3416:                     AttrValue .
                   3417:      MinValue     = NUMBER .
                   3418:      MaxValue     = NUMBER .
                   3419:      LowerBound   = NUMBER .
                   3420:      UpperBound   = NUMBER.
                   3421:      EqualNum     = NUMBER .
                   3422:      EqualText    = STRING .
1.18      cvs      3423:      AttrValue    = NAME .</pre>
1.30      cvs      3424: 
1.37    ! cvs      3425: <p>In presentation rules associated with a numeric attribute (and only in
        !          3426: such rules), the attribute name can be used in place of a numeric value. In
        !          3427: this case, the value of the attribute is used in the application of the rule.
        !          3428: Thus, the attribute can represent a relation between the size of two boxes,
        !          3429: the height and width of a box, the height of an area where page breaks are
        !          3430: prohibited, the distance between two boxes, the position of the reference
        !          3431: axis of a box, the interline spacing, the indentation of the first line, the
1.18      cvs      3432: visibility, the depth (z-order), or the character set.</p>
1.30      cvs      3433: 
1.37    ! cvs      3434: <p>The presentation rules associated with reference attributes, it is
        !          3435: possible to use the element designated by the attribute as a reference box in
        !          3436: a positional or extent rule. This element is represented in the <a
1.18      cvs      3437: href="#sectc4218">position</a> or <a href="#sectc4219">extent</a> rule by the
                   3438: keyword <tt>Referred</tt>.</p>
1.30      cvs      3439: 
1.18      cvs      3440: <blockquote class="example">
1.30      cvs      3441:   <p><strong>Example:</strong></p>
                   3442: 
1.37    ! cvs      3443:   <p>In all structure schemas, there is a global Language attribute defined
        !          3444:   as follows:</p>
1.30      cvs      3445:   <pre>ATTR
1.18      cvs      3446:      Language = TEXT;</pre>
1.30      cvs      3447: 
                   3448:   <p>The following rules would make French text be displayed in roman
                   3449:   characters and English text be displayed in italics:</p>
                   3450:   <pre>ATTRIBUTES
1.1       cvs      3451:      Language = 'French' :
1.6       cvs      3452:                 Style : Roman;
1.1       cvs      3453:      Language = 'English' :
1.18      cvs      3454:                 Style : Italics;</pre>
1.30      cvs      3455: 
                   3456:   <p>Using these rules, when the user puts the Language attribute with the
                   3457:   value 'English' on the summary of a document, every character string
1.37    ! cvs      3458:   (terminal elements) contained in the summary are displayed in italics. See
1.30      cvs      3459:   the <a href="#sectd42252"><tt>Style</tt> rule</a>.</p>
1.18      cvs      3460: </blockquote>
1.30      cvs      3461: 
1.18      cvs      3462: <blockquote class="example">
1.30      cvs      3463:   <p><strong>Example:</strong></p>
                   3464: 
                   3465:   <p>A numeric attribute representing the importance of the part of the
                   3466:   document to which it is attached can be defined:</p>
                   3467:   <pre>ATTR
1.18      cvs      3468:      Importance = INTEGER;</pre>
1.30      cvs      3469: 
                   3470:   <p>In the presentation schema, the importance of an element is reflected in
                   3471:   the choice of character size, using the following rules.</p>
                   3472:   <pre>ATTRIBUTES
1.1       cvs      3473:      Importance &lt; 2 :
                   3474:               Size : 1;
                   3475:      Importance IN [2..4] :
                   3476:               Size : Importance;
                   3477:      Importance = 10 :
                   3478:               Size : 5;
1.30      cvs      3479:      Importance &gt; 4 :
1.18      cvs      3480:               Size : 4;</pre>
1.30      cvs      3481: 
                   3482:   <p>Thus, the character size corresponds to the value of the Importance
                   3483:   attribute; its value is</p>
                   3484:   <ul>
                   3485:     <li>the value of the Importance attribute when the value is between 2 and
                   3486:       4 (inclusive),</li>
                   3487:     <li>1, when the value of the Importance attribute is less than 2,</li>
                   3488:     <li>4, when the value of the Importance attribute is greater than 4,</li>
                   3489:     <li>5, when the value of the Importance attribute is 10.</li>
                   3490:   </ul>
                   3491: 
1.37    ! cvs      3492:   <p>The last case (value 5) must be defined before the case which handles
        !          3493:   all Importance values greater than 4, because the two rules are not
        !          3494:   disjoint and the first one defined will have priority. Otherwise, when the
        !          3495:   Importance attribute has value 10, the font size will be 4.</p>
1.18      cvs      3496: </blockquote>
1.30      cvs      3497: 
1.18      cvs      3498: <blockquote class="example">
1.30      cvs      3499:   <p><strong>Example:</strong></p>
                   3500: 
                   3501:   <p>Suppose the structure defines a list element which can have an attribute
                   3502:   defining the type of list (numbered or not):</p>
                   3503:   <pre>STRUCT
1.1       cvs      3504:     list (ATTR list_type = enumeration, dash)
1.18      cvs      3505:          = LIST OF (list_item = TEXT);</pre>
1.30      cvs      3506: 
                   3507:   <p>Then, the presentation schema could use the attribute placed on the list
                   3508:   element to put either a dash or a number before the each element of the
                   3509:   list:</p>
                   3510:   <pre>ATTRIBUTES
1.1       cvs      3511:    list_type (list_item) = enumeration :
                   3512:         CreateBefore (NumberBox);
                   3513:    list_type (list_item) = dash :
1.18      cvs      3514:         CreateBefore (DashBox);</pre>
                   3515: </blockquote>
1.30      cvs      3516: 
1.18      cvs      3517: <blockquote class="example">
1.30      cvs      3518:   <p><strong>Example:</strong></p>
                   3519: 
1.37    ! cvs      3520:   <p>Suppose that two attributes are defined in the structure schema. The
        !          3521:   first is a numeric global attribute called ``version''. The other is a
1.30      cvs      3522:   local attribute defined on the root of the document called
                   3523:   ``Document_version'':</p>
                   3524:   <pre>STRUCTURE Document
1.1       cvs      3525: ATTR
                   3526:     version = INTEGER;
                   3527: STRUCT
                   3528:     Document (ATTR Document_version = INTEGER) =
                   3529:         BEGIN
                   3530:         SomeElement ;
                   3531:         ...
                   3532:         SomeOtherElement ;
                   3533:         END ;
1.18      cvs      3534: ...</pre>
1.30      cvs      3535: 
                   3536:   <p>These attributes can be used in the presentation schema to place change
                   3537:   bars in the margin next to elements whose version attribute has a value
                   3538:   equal to the Document_version attribute of the root and to place a star in
                   3539:   margin of elements whose version attribute is less than the value of the
                   3540:   root's Document_version attribute:</p>
                   3541:   <pre>ATTRIBUTES
1.1       cvs      3542:     version EQUAL Document_version :
                   3543:         CreateBefore (ChangeBarBox) ;
                   3544:     version LESS Document_version :
1.18      cvs      3545:         CreateBefore (StarBox) ;</pre>
                   3546: </blockquote>
                   3547: </div>
1.1       cvs      3548: 
1.18      cvs      3549: <div class="subsection">
1.37    ! cvs      3550: <h3><a name="sectc4212" id="sectc4212">Value transmission rules</a></h3>
1.1       cvs      3551: 
1.30      cvs      3552: <p>The last section of a presentation schema, which is optional, serves to
1.1       cvs      3553: defines the way in which a document transmits certain values to its
1.37    ! cvs      3554: sub-documents. A sub-document is an document <a
1.18      cvs      3555: href="#inclusion">included</a> without expansion or with partial expansion.
1.1       cvs      3556: The primary document can transmit to its sub-documents the values of certain
                   3557: counters or the textual content of certain of its elements, as a function of
1.18      cvs      3558: their type.</p>
1.30      cvs      3559: 
                   3560: <p>The sub-documents receive these values in attributes which must be defined
1.37    ! cvs      3561: in their structure schema as local attributes of the root element. The types
1.30      cvs      3562: of these attributes must correspond to the type of the value which they
                   3563: receive: numeric attributes for receiving the value of a counter, textual
                   3564: attributes for receiving the content of an element.</p>
                   3565: 
                   3566: <p>In the structure schema of the primary document, there appears at the end,
1.37    ! cvs      3567: after the <tt>TRANSMIT</tt> keyword, a sequence of transmission rules. Each
1.1       cvs      3568: rule begins with the name of the counter to transmit or of the element type
1.37    ! cvs      3569: whose textual content will be transmitted. This name is followed by the
        !          3570: keyword <tt>To</tt> and the name of the attribute of the sub-document to
        !          3571: which the value is transmitted. The sub-document class is indicated between
        !          3572: parentheses after the name of the attribute. The transmission rule ends with
1.18      cvs      3573: a semicolon.</p>
1.30      cvs      3574: <pre>     TransmitSeq   =  Transmit &lt; Transmit &gt; .
1.1       cvs      3575:      Transmit      =  TypeOrCounter 'To' ExternAttr
                   3576:                       '(' ElemID ')' ';' .
                   3577:      TypeOrCounter =  CounterID / ElemID .
1.18      cvs      3578:      ExternAttr    =  NAME .</pre>
1.30      cvs      3579: 
1.18      cvs      3580: <blockquote class="example">
1.30      cvs      3581:   <p><strong>Example:</strong></p>
                   3582: 
                   3583:   <p>Consider a Book document class which includes instances of the Chapter
1.37    ! cvs      3584:   document class. These classes might have the following schemas:</p>
1.30      cvs      3585:   <pre>STRUCTURE Book
1.1       cvs      3586: STRUCT
                   3587:    Book = BEGIN
                   3588:           Title = Text;
                   3589:           Body  = LIST OF (Chapter INCLUDED);
                   3590:           END;
                   3591:    ...
                   3592: 
                   3593: STRUCTURE Chapter
                   3594: STRUCT
                   3595:    Chapter (ATTR FirstPageNum = Integer;
                   3596:                  ChapterNum = Integer;
                   3597:                  CurrentTitle   = Text) =
1.6       cvs      3598:           BEGIN
                   3599:           ChapterTitle = Text;
                   3600:           ...
                   3601:           END;
1.18      cvs      3602:    ...</pre>
1.30      cvs      3603: 
                   3604:   <p>Then the presentation schema for books could define chapter and page
                   3605:   counters. The following transmission rules in the book presentation schema
                   3606:   would transmit values for the three attributes defined at the root of each
                   3607:   chapter sub-document.</p>
                   3608:   <pre>PRESENTATION Book;
1.1       cvs      3609: VIEWS
                   3610:    Full_text;
                   3611: COUNTERS
                   3612:    ChapterCtr: Rank of Chapter;
                   3613:    PageCtr: Rank of Page(Full_text);
                   3614: ...
                   3615: TRANSMIT
                   3616:    PageCtr TO FirstPageNum(Chapter);
                   3617:    ChapterCtr TO ChapterNum(Chapter);
                   3618:    Title TO CurrentTitle(Chapter);
1.18      cvs      3619: END</pre>
1.30      cvs      3620: 
                   3621:   <p>Thus, each chapter included in a book can number its pages as a function
                   3622:   of the number of pages preceding it in the book, can make the chapter's
                   3623:   number appear before the number of each of its sections, or can place the
                   3624:   title of the book at the top of each page.</p>
1.18      cvs      3625: </blockquote>
                   3626: </div>
1.1       cvs      3627: 
1.18      cvs      3628: <div class="subsection">
1.37    ! cvs      3629: <h3><a name="sectc4213" id="sectc4213">Presentation rules</a></h3>
1.1       cvs      3630: 
1.30      cvs      3631: <p>Whether defining the appearance of a presentation or page layout box, an
1.1       cvs      3632: element type, or an attribute value, the set of presentation rules that apply
1.18      cvs      3633: is always defined in the same way.</p>
1.30      cvs      3634: 
                   3635: <p>Normally, a set of presentation rules is placed between the keywords
1.18      cvs      3636: <tt>BEGIN</tt> and <tt>END</tt>, the keyword <tt>END</tt> being followed by a
1.37    ! cvs      3637: semicolon. The first section of this block defines the rules that apply to
1.18      cvs      3638: the primary view, if the <a href="#sectc427">default rules</a> are not
1.37    ! cvs      3639: completely suitable. Next comes the rules which apply to specific other
1.1       cvs      3640: views, with a rule sequence for each view for which the default rules are not
1.37    ! cvs      3641: satisfactory. If the default rules are suitable for the non-primary views,
        !          3642: there will not be any specific rules for these views. If there is only one
1.18      cvs      3643: rule which applies to all views then the keywords <tt>BEGIN</tt> and
                   3644: <tt>END</tt> need not appear.</p>
1.30      cvs      3645: 
                   3646: <p>For each view, it is only necessary to specify those rules which differ
                   3647: from the default rules for the view, so that for certain views (or even all
                   3648: views), there may be no specific rules.</p>
                   3649: 
                   3650: <p>The specific rules for a non-primary view are introduced by the <a
1.37    ! cvs      3651: name="inkeyword" id="inkeyword"><tt>IN</tt> keyword</a>, followed by the view
        !          3652: name. The rules for that view follow, delimited by the keywords
        !          3653: <tt>BEGIN</tt> and <tt>END</tt>, or without these two keywords when there is
        !          3654: only one rule.</p>
1.30      cvs      3655: 
                   3656: <p><strong>Note:</strong> the view name which follows the <tt>IN</tt> keyword
1.1       cvs      3657: must not be the name of the primary view, since the rules for that view are
1.18      cvs      3658: found before the rules for the other views.</p>
1.30      cvs      3659: 
                   3660: <p>Within each block concerning a view, other blocks can appear, delimited by
1.37    ! cvs      3661: the same keywords <tt>BEGIN</tt> and <tt>END</tt>. Each of these blocks
        !          3662: gathers the presentation rules that apply, for a given view, only when a
        !          3663: given condition is satisfied. Each block is preceded by a condition
        !          3664: introduced by the <tt>IF</tt> keyword. If such a conditional block contains
        !          3665: only one rule, the keywords <tt>BEGIN</tt> and <tt>END</tt> can be
        !          3666: omitted.</p>
        !          3667: 
        !          3668: <p>Although the syntax allows any presentation rule to appear in a
        !          3669: conditional block, only <a href="#sectc4232">creation rules</a> are allowed
        !          3670: after any condition; other rules are allowed only after conditions
        !          3671: <tt>Within</tt> and ElemID. In addition, the following rules cannot be
        !          3672: conditional: <tt>PageBreak, LineBreak, Inline, Gather</tt>.</p>
1.30      cvs      3673: 
                   3674: <p>For a given view, the rules that apply without any condition must appear
1.37    ! cvs      3675: before the first conditional block. If some rules apply only when none of the
        !          3676: specified condition holds, they are grouped in a block preceded by the
        !          3677: keyword <tt>Otherwise</tt>, and that block must appear after the last
        !          3678: conditionnal block concerning the same view.</p>
1.30      cvs      3679: <pre>     ViewRuleSeq  = 'BEGIN' &lt; RulesAndCond &gt; &lt; ViewRules &gt;
1.1       cvs      3680:                     'END' ';' /
                   3681:                     ViewRules / CondRules / Rule .
                   3682:      RulesAndCond = CondRules / Rule .
                   3683:      ViewRules    = 'IN' ViewID CondRuleSeq .
1.30      cvs      3684:      CondRuleSeq  = 'BEGIN' &lt; RulesAndCond &gt; 'END' ';' /
1.1       cvs      3685:                     CondRules / Rule .
1.30      cvs      3686:      CondRules    = CondRule &lt; CondRule &gt;
1.1       cvs      3687:                     [ 'Otherwise' RuleSeq ] .
                   3688:      CondRule     = 'IF' ConditionSeq RuleSeq .
1.30      cvs      3689:      RulesSeq     = 'BEGIN' Rule &lt; Rule &gt; 'END' ';' /
1.18      cvs      3690:                     Rule .</pre>
1.30      cvs      3691: 
1.18      cvs      3692: <blockquote class="example">
1.30      cvs      3693:   <p><strong>Example:</strong></p>
                   3694: 
                   3695:   <p>The following rules for a report's title make the title visible in the
1.37    ! cvs      3696:   primary view and invisible in the table of contents and in the formula
        !          3697:   views (see the <a href="#sectc4224"><tt>Visibility</tt> rule</a>).</p>
1.30      cvs      3698:   <pre>Title : BEGIN
1.1       cvs      3699:         Visibility : 1;
                   3700:         ...    {Other rules for the primary view}
                   3701:         IN Table_of_contents
                   3702:            Visibility : 0;
                   3703:         IN Formulas
                   3704:            Visibility : 0;
1.18      cvs      3705:         END;</pre>
                   3706: </blockquote>
                   3707: </div>
1.1       cvs      3708: 
1.18      cvs      3709: <div class="subsection">
1.37    ! cvs      3710: <h3><a name="sectc4214" id="sectc4214">Conditions applying to presentation
        !          3711: rules</a></h3>
1.1       cvs      3712: 
1.37    ! cvs      3713: <p>Many conditions can be applied to presentation rules. Conditions allow
        !          3714: certain presentation rules to apply only in certain cases. These conditions
        !          3715: can be based on the structural position of the element. They can be based on
1.1       cvs      3716: whether the element has references, and what type of references, whether the
1.33      cvs      3717: element has attributes, whether the element is empty or not, whether the
                   3718: element is the root of its document or not. They can also be based on the
                   3719: value of a counter.</p>
1.30      cvs      3720: 
1.37    ! cvs      3721: <p>It is possible to specify several conditions which must all be true for
        !          3722: the rules to apply.</p>
1.30      cvs      3723: 
1.37    ! cvs      3724: <p>A set of conditions is specified by the <tt>IF</tt> keyword. This keyword
1.30      cvs      3725: is followed by the sequence of conditions, separated by the <tt>AND</tt>
                   3726: keyword. Each condition is specified by a keyword which defines the condition
                   3727: type. In some cases, the keyword is followed by other data, which specify the
                   3728: condition more precisely.</p>
                   3729: 
                   3730: <p>An elementary condition can be negative; it is then preceded by the
1.18      cvs      3731: <tt>NOT</tt> keyword.</p>
1.30      cvs      3732: 
                   3733: <p>When the presentation rule(s) controlled by the condition apply to a
                   3734: reference element or a reference attribute, an elementary condition can also
1.37    ! cvs      3735: apply to element referred by this reference. The <tt>Target</tt> keyword is
        !          3736: used for that purpose. It must appear before the keyword defining the
1.30      cvs      3737: condition type.</p>
1.18      cvs      3738: <pre>     CondRule      ='IF' ConditionSeq RuleSeq .
1.30      cvs      3739:      ConditionSeq  = Condition &lt; 'AND' Condition &gt; .
1.1       cvs      3740:      Condition     = [ 'NOT' ] [ 'Target' ] ConditionElem .
                   3741:      ConditionElem ='First' / 'Last' /
                   3742:                      [ 'Immediately' ] 'Within' [ NumParent ]
                   3743:                                        ElemID [ ExtStruct ] /
                   3744:                      ElemID /
                   3745:                     'Referred' / 'FirstRef' / 'LastRef' /
                   3746:                     'ExternalRef' / 'InternalRef' / 'CopyRef' /
                   3747:                     'AnyAttributes' / 'FirstAttr' / 'LastAttr' /
                   3748:                     'UserPage' / 'StartPage' / 'ComputedPage' /
1.33      cvs      3749:                     'Empty' / 'Root' /
1.1       cvs      3750:                     '(' [ MinMax ] CounterName CounterCond ')' /
                   3751:                      CondPage '(' CounterID ')' .
                   3752:      NumParent     = [ GreaterLess ] NParent .
1.30      cvs      3753:      GreaterLess   ='&gt;' / '&lt;' .
1.1       cvs      3754:      NParent       = NUMBER.
1.6       cvs      3755:      ExtStruct     ='(' ElemID ')' .
1.30      cvs      3756:      CounterCond   ='&lt;' MaxCtrVal / '&gt;' MinCtrVal /
1.1       cvs      3757:                     '=' EqCtrVal / 
                   3758:                     'IN' '[' ['-'] MinCtrBound '.' '.'
                   3759:                      ['-'] MaxCtrBound ']' .
                   3760:      PageCond      ='Even' / 'Odd' / 'One' .
                   3761:      MaxCtrVal     = NUMBER .
                   3762:      MinCtrVal     = NUMBER .
                   3763:      EqCtrVal      = NUMBER .
                   3764:      MaxCtrBound   = NUMBER .
1.18      cvs      3765:      MinCtrBound   = NUMBER .</pre>
1.1       cvs      3766: 
1.18      cvs      3767: <div class="subsubsection">
1.37    ! cvs      3768: <h4><a name="sectd42141" id="sectd42141">Conditions based on the logical
        !          3769: position of the element</a></h4>
1.30      cvs      3770: 
                   3771: <p>The condition can be on the position of the element in the document's
1.37    ! cvs      3772: logical structure tree. It is possible to test whether the element is the
1.30      cvs      3773: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is
                   3774: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>). These
1.18      cvs      3775: conditions can be associated only with <a href="#sectc4232">creation
                   3776: rules</a>.</p>
1.30      cvs      3777: 
1.33      cvs      3778: <p>It is possible to test if the element is the root of its document (keyword
                   3779: <code>Root</code>).</p>
                   3780: 
1.30      cvs      3781: <p>It is also possible to test if the element is contained in an element of a
1.18      cvs      3782: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). The type
                   3783: is indicated after the keyword <tt>Within</tt>. If that element type is
1.1       cvs      3784: defined in a structure schema which is not the one which corresponds to the
                   3785: presentation schema, the type name of this element must be followed, between
1.18      cvs      3786: parentheses, by the name of the structure schema which defines it.</p>
1.30      cvs      3787: 
                   3788: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the
1.18      cvs      3789: condition is satisfied only if the <em>parent</em> element has the type
                   3790: indicated. If the word <tt>Immediately</tt> is missing, the condition is
                   3791: satisfied if any <em>ancestor</em> has the type indicated.</p>
1.30      cvs      3792: 
                   3793: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the
1.37    ! cvs      3794: type. It specifies the number of ancestors of the indicated type that must be
        !          3795: present for the condition to be satisfied. If the keyword
1.18      cvs      3796: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the
1.37    ! cvs      3797: element must have the indicated type. The integer <i>n</i> must be positive
        !          3798: or zero. It can be preceded by <tt>&lt;</tt> or <tt>&gt;</tt> to indicate a
        !          3799: maximum or minimum number of ancestors. If these symbols are missing, the
        !          3800: condition is satisfied only if it exists exactly <i>n</i> ancestors. When
1.30      cvs      3801: this number is missing, it is equivalent to &gt; 0.</p>
                   3802: 
                   3803: <p>If the condition applies to presentation rules associated with an
                   3804: attribute, in the <tt>ATTRIBUTES</tt> section of the presentation schema, the
                   3805: condition can be simply an element name. Presentation rules are then executed
                   3806: only if the attribute is attached to an element of that type. The keyword
                   3807: <tt>NOT</tt> before the element name indicates that the presentation rules
                   3808: must be executed only if the element is not of the type indicated.</p>
1.18      cvs      3809: </div>
1.1       cvs      3810: 
1.18      cvs      3811: <div class="subsubsection">
1.37    ! cvs      3812: <h4><a name="sectd42142" id="sectd42142">Conditions on references</a></h4>
1.30      cvs      3813: 
                   3814: <p>References may be taken into account in conditions, which can be based on
                   3815: the fact that the element, or one of its ancestors, is designated by a at
                   3816: least one reference (<tt>Referred</tt>) or by none (<tt>NOT
                   3817: Referred</tt>).</p>
                   3818: 
                   3819: <p>If the element or attribute to which the condition is attached is a
                   3820: reference, the condition can be based on the fact that it acts as the first
                   3821: reference to the designated element (<tt>FirstRef</tt>), or as the last
                   3822: (<tt>LastRef</tt>), or as a reference to an element located in another
                   3823: document (<tt>ExternalRef</tt>) or in the same document
                   3824: (<tt>InternalRef</tt>).</p>
1.1       cvs      3825: 
1.30      cvs      3826: <p>The condition can also be based on the fact that the element is an <a
1.37    ! cvs      3827: href="#inclusion">inclusion</a>. This is noted (<tt>CopyRef</tt>).</p>
1.30      cvs      3828: 
                   3829: <p>Like all conditions, conditions on references can be inverted by the
1.18      cvs      3830: <tt>NOT</tt> keyword. These conditions can be associated only with <a
                   3831: href="#sectc4232">creation rules</a>.</p>
                   3832: </div>
1.1       cvs      3833: 
1.18      cvs      3834: <div class="subsubsection">
1.37    ! cvs      3835: <h4><a name="sectd42143" id="sectd42143">Conditions on logical
        !          3836: attributes</a></h4>
1.30      cvs      3837: 
                   3838: <p>The condition can be based on the presence or absence of attributes
                   3839: associated with the element, no matter what the attributes or their values.
                   3840: The <tt>AnyAttributes</tt> keyword expresses this condition.</p>
1.1       cvs      3841: 
1.30      cvs      3842: <p>If the condition appears in the presentation rules of an attribute, the
1.37    ! cvs      3843: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate
        !          3844: that the rules must only be applied if this attribute is the first attribute
        !          3845: for the element or if it is the last (respectively). These conditions can
        !          3846: also be inverted by the <tt>NOT</tt> keyword. These conditions can be
        !          3847: associated only with <a href="#sectc4232">creation rules</a>.</p>
1.30      cvs      3848: 
                   3849: <p>It is also possible to apply certain presentation rules only when the
                   3850: element being processed or one of its ancestors has a certain attribute,
1.37    ! cvs      3851: perhaps with a certain value. This can be done in the <a
1.18      cvs      3852: href="#sectc4210"><tt>ATTRIBUTES</tt> section</a>.</p>
                   3853: </div>
1.1       cvs      3854: 
1.18      cvs      3855: <div class="subsubsection">
1.37    ! cvs      3856: <h4><a name="sectd42144" id="sectd42144">Conditions on page breaks</a></h4>
1.1       cvs      3857: 
1.30      cvs      3858: <p>The page break base type (and only this type) can use the following
1.18      cvs      3859: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, and <tt>UserPage</tt>.
                   3860: The <tt>ComputedPage</tt> condition indicates that the presentation rule(s)
1.37    ! cvs      3861: should apply if the page break was created automatically by Thot; the
        !          3862: <tt>StartPage</tt> condition is true if the page break is generated before
        !          3863: the element by the <tt>Page</tt> rule; and the <tt>UserPage</tt> condition
        !          3864: applies if the page break was inserted by the user.</p>
1.30      cvs      3865: 
                   3866: <p>These conditions can be associated only with <a href="#sectc4232">creation
1.18      cvs      3867: rules</a>.</p>
                   3868: </div>
1.1       cvs      3869: 
1.18      cvs      3870: <div class="subsubsection">
1.37    ! cvs      3871: <h4><a name="sectd42145" id="sectd42145">Conditions on the element's
        !          3872: content</a></h4>
1.1       cvs      3873: 
1.37    ! cvs      3874: <p>The condition can be based on whether or not the element is empty. An
1.30      cvs      3875: element which has no children or whose leaves are all empty is considered to
1.37    ! cvs      3876: be empty itself. This condition is expressed by the <tt>Empty</tt> keyword,
1.30      cvs      3877: optionally preceded by the <tt>NOT</tt> keyword. This condition can be
                   3878: associated only with <a href="#sectc4232">creation rules</a>.</p>
1.18      cvs      3879: </div>
1.1       cvs      3880: 
1.18      cvs      3881: <div class="subsubsection">
1.37    ! cvs      3882: <h4><a name="sectd42146" id="sectd42146">Conditions on counters</a></h4>
1.1       cvs      3883: 
1.30      cvs      3884: <p>Presentation rules can apply when the counter's value is one, is even or
                   3885: odd, is equal, greater than or less than a given value or falls in a range of
1.37    ! cvs      3886: values. This is particularly useful for creating header and footer boxes.
1.18      cvs      3887: These conditions can be associated only with <a href="#sectc4232">creation
                   3888: rules</a>.</p>
1.30      cvs      3889: 
                   3890: <p>To compare the value of a counter to a given value, a comparison is given
1.1       cvs      3891: between parentheses. The comparison is composed of the counter name followed
                   3892: by an equals, greater than, or less than sign and the value to which the
1.37    ! cvs      3893: counter will be compared. A test for whether or not a counter's value falls
        !          3894: in a range also appears within parentheses. In this case, the counter name is
1.18      cvs      3895: followed by the <tt>IN</tt> keyword and the range definition within brackets.
                   3896: The <tt>Even</tt>, <tt>Odd</tt> and <tt>One</tt> are used to test a counter's
                   3897: value and are followed by the counter name between parentheses.</p>
1.30      cvs      3898: 
                   3899: <p>The list of possible conditions on counters is:</p>
1.18      cvs      3900: <dl>
1.30      cvs      3901:   <dt><tt>Even (Counter)</tt></dt>
                   3902:     <dd>the box is created only if the counter has an even value.</dd>
                   3903:   <dt><tt>Odd (Counter)</tt></dt>
                   3904:     <dd>the box is created only if the counter has an odd value.</dd>
                   3905:   <dt><tt>One (Counter)</tt></dt>
                   3906:     <dd>the box is created only the counter's value is 1.</dd>
                   3907:   <dt><tt>NOT One (Counter)</tt></dt>
                   3908:     <dd>the box is created, unless the counter's value is 1.</dd>
                   3909:   <dt><tt>(Counter &lt; Value)</tt></dt>
                   3910:     <dd>the box is created only if the counter's value is less than
                   3911:     Value.</dd>
                   3912:   <dt><tt>(Counter &gt; Value)</tt></dt>
                   3913:     <dd>the box is created only if the counter's value is greater than
                   3914:     Value.</dd>
                   3915:   <dt><tt>(Counter = Value)</tt></dt>
                   3916:     <dd>the box is created only if the counter's value is equal to Value.</dd>
                   3917:   <dt><tt>NOT (Counter = Value)</tt></dt>
                   3918:     <dd>the is created only if the counter's value is different than
                   3919:     Value.</dd>
                   3920:   <dt><tt>(Counter IN [MinValue..MaxValue])</tt></dt>
                   3921:     <dd>the box is created only if the counter's value falls in the range
                   3922:       bounded by MinValue and MaxValue (inclusive).</dd>
                   3923:   <dt><tt>NOT (Counter IN [MinValue..MaxValue])</tt></dt>
                   3924:     <dd>the box is created only if the value of the counter does not fall in
                   3925:       the range bounded by MinValue and MaxValue (inclusive).</dd>
1.18      cvs      3926: </dl>
1.30      cvs      3927: 
                   3928: <p><strong>Note:</strong> the <tt>NOT Even</tt> and <tt>NOT Odd</tt>
                   3929: conditions are syntactically correct but can be expressed more simply by
                   3930: <tt>Odd</tt> and <tt>Even</tt>, respectively.</p>
1.18      cvs      3931: </div>
                   3932: </div>
1.1       cvs      3933: 
1.18      cvs      3934: <div class="subsection">
1.37    ! cvs      3935: <h3><a name="sectc4215" id="sectc4215">A presentation rule</a></h3>
1.1       cvs      3936: 
1.34      cvs      3937: <p>A presentation rule defines either a presentation property or presentation
1.37    ! cvs      3938: function. The properties are:</p>
1.18      cvs      3939: <ul>
1.30      cvs      3940:   <li>the position of the vertical and horizontal reference axes of the
                   3941:   box,</li>
                   3942:   <li>the position of the box in relation to other boxes,</li>
                   3943:   <li>the height or width of the box, with overflow exceptions,</li>
                   3944:   <li>the margins, padding and borders of the box,</li>
                   3945:   <li>the characteristics of the lines contained in the box: linespacing,
1.35      cvs      3946:     indentation of the first line, hyphenation,</li>
1.30      cvs      3947:   <li>the conditions for breaking the box across pages,</li>
                   3948:   <li>the characteristics of the characters contained in the box: size, font,
                   3949:     style, underlining,</li>
                   3950:   <li>the depth of the box among overlapping boxes (often called stacking
                   3951:     order),</li>
                   3952:   <li>the characteristics of graphic elements contained in the box: style and
                   3953:     thickness of lines, fill pattern for closed objects,</li>
1.37    ! cvs      3954:   <li>the colors in text, graphics, pictures, and symbols contained in the
        !          3955:     box are displayed or printed,</li>
1.30      cvs      3956:   <li>for presentation boxes only, the contents of the box.</li>
                   3957: </ul>
                   3958: 
1.37    ! cvs      3959: <p>The <a name="presfunct" id="presfunct">presentation functions</a> are:</p>
1.30      cvs      3960: <ul>
                   3961:   <li>the creation of a presentation box</li>
                   3962:   <li>the line-breaking or page-breaking style,</li>
                   3963:   <li>the copying of another box,</li>
                   3964:   <li>the display of the box background and border,</li>
                   3965:   <li>the display of a background picture and its aspect.</li>
                   3966: </ul>
                   3967: 
1.37    ! cvs      3968: <p>For each box and each view, every presentation property is defined once
        !          3969: and only once, either explicitly or by the <a href="#sectc427">default
        !          3970: rules</a>. In contrast, presentation functions are not obligatory and can
        !          3971: appear many times for the same element. for example an element can create
        !          3972: many presentation boxes. Another element may not use any presentation
1.18      cvs      3973: functions.</p>
1.30      cvs      3974: 
1.34      cvs      3975: <p>Each rule defining a presentation property begins with a keyword followed
1.37    ! cvs      3976: by a colon. The keyword indicates the property which is the subject of the
        !          3977: rule. After the keyword and the colon, the remainder of the rule varies. All
1.18      cvs      3978: rules are terminated by a semicolon.</p>
1.34      cvs      3979: <pre>     Rule      = Property ';' / PresFunc ';' .
                   3980:      Property  ='VertRef' ':'       PositionHoriz /
1.6       cvs      3981:                 'HorizRef' ':'      PositionVert /
                   3982:                 'VertPos' ':'       VPos /
                   3983:                 'HorizPos' ':'      HPos /
                   3984:                 'Height' ':'        Dimension /
                   3985:                 'Width' ':'         Dimension /
                   3986:                 'VertOverflow' ':'  Boolean /
1.1       cvs      3987:                 'HorizOverflow' ':' Boolean /
1.26      cvs      3988:                 'MarginTop' ':'     MarginWidth /
                   3989:                 'MarginRight' ':'   MarginWidth /
                   3990:                 'MarginBottom' ':'  MarginWidth /
                   3991:                 'MarginLeft' ':'    MarginWidth /
                   3992:                 'PaddingTop' ':'    PaddingWidth /
                   3993:                 'PaddingRight' ':'  PaddingWidth /
                   3994:                 'PaddingBottom' ':' PaddingWidth /
                   3995:                 'PaddingLeft' ':'   PaddingWidth /
                   3996:                 'BorderTopWidth' ':' BorderWidth /
                   3997:                 'BorderRightWidth' ':' BorderWidth /
                   3998:                 'BorderBottomWidth' ':' BorderWidth /
                   3999:                 'BorderLeftWidth' ':' BorderWidth /
                   4000:                 'BorderTopColor' ':' BorderColor /
                   4001:                 'BorderRightColor' ':' BorderColor /
                   4002:                 'BorderBottomColor' ':' BorderColor /
                   4003:                 'BorderLeftColor' ':' BorderColor /
                   4004:                 'BorderTopStyle' ':' BorderStyle /
                   4005:                 'BorderRightStyle' ':' BorderStyle /
                   4006:                 'BorderBottomStyle' ':' BorderStyle /
                   4007:                 'BorderLeftStyle' ':' BorderStyle .
1.6       cvs      4008:                 'LineSpacing' ':'   DistanceInherit /
                   4009:                 'Indent' ':'        DistanceInherit /
                   4010:                 'Adjust' ':'        AdjustInherit /
                   4011:                 'Hyphenate' ':'     BoolInherit /
                   4012:                 'PageBreak' ':'     Boolean /
                   4013:                 'LineBreak' ':'     Boolean /
                   4014:                 'InLine' ':'        Boolean /
                   4015:                 'NoBreak1' ':'      AbsDist /
                   4016:                 'NoBreak2' ':'      AbsDist /
                   4017:                 'Gather' ':'        Boolean /
                   4018:                 'Visibility' ':'    NumberInherit /
                   4019:                 'Size'  ':'         SizeInherit /
                   4020:                 'Font' ':'          NameInherit /
                   4021:                 'Style' ':'         StyleInherit /
1.23      cvs      4022:                 'Weight' ':'        WeightInherit /
1.6       cvs      4023:                 'Underline' ':'     UnderLineInherit /
                   4024:                 'Thickness' ':'     ThicknessInherit /
                   4025:                 'Depth' ':'         NumberInherit /
                   4026:                 'LineStyle' ':'     LineStyleInherit /
                   4027:                 'LineWeight' ':'    DistanceInherit /
                   4028:                 'FillPattern' ':'   NameInherit /
                   4029:                 'Background' ':'    NameInherit /
1.13      cvs      4030:                 'Foreground' ':'    NameInherit /
1.6       cvs      4031:                 'Content' ':'       VarConst .
1.1       cvs      4032:      PresFunc = Creation '(' BoxID ')' /
                   4033:                 'Line' /
                   4034:                 'NoLine' /
                   4035:                 'Page' '(' BoxID ')' /
1.13      cvs      4036:                 'Copy' '(' BoxTypeToCopy ')' /
                   4037:                 'ShowBox' /
1.18      cvs      4038:                 'BackgroundPicture' ':' FileName /
                   4039:                 'PictureMode' ':'   PictMode /</pre>
                   4040: </div>
                   4041: 
                   4042: <div class="subsection">
1.37    ! cvs      4043: <h3><a name="sectc4216" id="sectc4216">Box axes</a></h3>
1.18      cvs      4044: 
1.30      cvs      4045: <p>The position of the middle axes <tt>VMiddle</tt> and <tt>HMiddle</tt> in
1.1       cvs      4046: relation to their box is always calculated automatically as a function of the
1.37    ! cvs      4047: height and width of the box and is not specified by the presentation rules.
        !          4048: In the presentation schema, these middle axes are used only to position their
        !          4049: box with respect to another by specifying the distance between the middle
        !          4050: axis and an axis or a side of another box (see the <a
        !          4051: href="#sectc4218">relative position</a>).</p>
        !          4052: 
        !          4053: <p>The reference axes of a box are also used to position their box in
        !          4054: relation to another, but in contrast to the middle axes, the presentation
        !          4055: schema must make their position explicit, either in relation to a side or the
        !          4056: middle axis of the box itself, or in relation to an axis of an enclosed
        !          4057: box.</p>
1.30      cvs      4058: 
1.37    ! cvs      4059: <p>Only boxes of base elements have predefined reference axes. For character
1.1       cvs      4060: string boxes, the horizontal reference axis is the baseline of the characters
                   4061: (the line which passes immediately under the upper-case letters, ignoring the
                   4062: letter Q) and the vertical reference axis is at the left edge of the first
1.18      cvs      4063: character of the string.</p>
1.30      cvs      4064: 
1.37    ! cvs      4065: <p>The positions of a box's reference axes are defined by the
        !          4066: <tt>VertRef</tt> and <tt>HorizRef</tt> rules which specify the <a
        !          4067: href="#distance">distance</a> between the reference axis and an axis or
        !          4068: parallel side of the same box or of an enclosed box.</p>
1.18      cvs      4069: <pre>               'VertRef'  ':' PositionHoriz
                   4070:                'HorizRef' ':' PositionVert</pre>
1.30      cvs      4071: 
1.18      cvs      4072: <blockquote class="example">
1.30      cvs      4073:   <p><strong>Example:</strong></p>
                   4074: 
                   4075:   <p>If, in the structure schema for mathematical formulas, the fraction
                   4076:   element is defined by</p>
                   4077:   <pre>Fraction = BEGIN
1.1       cvs      4078:            Numerator   = Expression;
                   4079:            Denominator = Expression;
1.18      cvs      4080:            END;</pre>
1.30      cvs      4081: 
                   4082:   <p>then the horizontal reference axis of the fraction can be positioned on
                   4083:   top of the denominator by the rule:</p>
                   4084:   <pre>Fraction :
1.1       cvs      4085:      BEGIN
                   4086:      HorizRef : Enclosed Denominator . Top;
                   4087:      ...
1.18      cvs      4088:      END;</pre>
1.30      cvs      4089: 
                   4090:   <p>To put the horizontal reference axis of a column at its middle:</p>
                   4091:   <pre>Column :
1.1       cvs      4092:      BEGIN
                   4093:      HorizRef : * . HMiddle;
                   4094:      ...
1.18      cvs      4095:      END;</pre>
                   4096: </blockquote>
                   4097: </div>
1.1       cvs      4098: 
1.18      cvs      4099: <div class="subsection">
1.37    ! cvs      4100: <h3><a name="sectc4217" id="sectc4217">Distance units</a></h3>
1.1       cvs      4101: 
1.30      cvs      4102: <p>Some distances and dimensions appear in many rules of a presentation
                   4103: schema, especially in position rules (<tt>VertPos, HorizPos</tt>), in extent
                   4104: rules for boxes (<tt>Height, Width</tt>), in rules defining lines
1.37    ! cvs      4105: (<tt>LineSpacing, Indent</tt>), in rules controlling pagination
        !          4106: (<tt>NoBreak1, NoBreak2</tt>) and in rules specifying the thickness of
        !          4107: strokes (<tt>LineWeight</tt>).</p>
1.30      cvs      4108: 
                   4109: <p>In all these rules, the distance or extent can be expressed</p>
                   4110: <ul>
                   4111:   <li>either in relative units, which depend on the size of the characters in
                   4112:     the current font: height of the element's font or height of the letter
                   4113:     'x',</li>
1.37    ! cvs      4114:   <li>or in absolute units: centimeter, millimeter, inch, typographer's
        !          4115:     point, pica or pixel.</li>
1.30      cvs      4116: </ul>
                   4117: 
1.37    ! cvs      4118: <p>Units can be chosen freely. Thus, it is possible to use relative units in
1.30      cvs      4119: one rule, centimeters in the next rule, and typographer's points in
                   4120: another.</p>
                   4121: 
1.37    ! cvs      4122: <p>Absolute units are used to set rigid rules for the appearance of
        !          4123: documents. In contrast, relative units allow changes of scale. The editor
        !          4124: lets the value of relative units be changed dynamically. Such changes affect
        !          4125: every box using relative units simultaneously and in the same proportion.
        !          4126: Changing the value of the relative units affects the size of the characters
        !          4127: and graphical elements, and the size of the boxes and the distances between
        !          4128: them.</p>
        !          4129: 
        !          4130: <p>A <a name="distance" id="distance">distance</a> or extent is specified by
        !          4131: a number, which may be followed by one or more spaces and a units keyword.
        !          4132: When there is no units keyword, the number specifies the number of relative
        !          4133: units, where a relative unit is the height of a character in the current font
        !          4134: (an em). When the number is followed by a units keyword, the keyword
        !          4135: indicates the type of absolute units:</p>
1.18      cvs      4136: <ul>
1.30      cvs      4137:   <li><tt>em</tt>: height of the element's font,</li>
                   4138:   <li><tt>ex</tt>: height of the letter 'x',</li>
                   4139:   <li><tt>cm</tt>: centimeter,</li>
                   4140:   <li><tt>mm</tt>: millimeter,</li>
                   4141:   <li><tt>in</tt>: inch (1 in = 2.54 cm),</li>
                   4142:   <li><tt>pt</tt>: point (1 pt = 1/72 in),</li>
                   4143:   <li><tt>pc</tt>: pica (1 pc = 12 pt),</li>
                   4144:   <li><tt>px</tt>: pixel.</li>
1.18      cvs      4145: </ul>
1.30      cvs      4146: 
                   4147: <p>Whatever the chosen unit, relative or absolute, the number is not
1.37    ! cvs      4148: necessarily an integer and may be expressed in fixed point notation (using
        !          4149: the American convention of a period to express the decimal point).</p>
1.30      cvs      4150: 
1.37    ! cvs      4151: <p>If the distance appears in a presentation rule for a numeric attribute,
        !          4152: the number can be replaced by the name of an attribute. In this case, the
        !          4153: value of the attribute is used. Obviously, the attribute name cannot be
        !          4154: followed by a decimal point and a fractional part, but it can be followed a
        !          4155: units keyword. However, the choice of units is limited to em, ex, pt and
        !          4156: px.</p>
1.18      cvs      4157: <pre>     Distance      = [ Sign ] AbsDist .
1.1       cvs      4158:      Sign          ='+' / '-' .
                   4159:      AbsDist       = IntegerOrAttr [ '.' DecimalPart ]
                   4160:                      [ Unit ].
                   4161:      IntegerOrAttr = IntegerPart / AttrID .
                   4162:      IntegerPart   = NUMBER .
                   4163:      DecimalPart   = NUMBER .
                   4164:      Unit          ='em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' /
1.18      cvs      4165:                     'pc' / 'px' / '%' .</pre>
1.30      cvs      4166: 
1.18      cvs      4167: <blockquote class="example">
1.30      cvs      4168:   <p><strong>Example:</strong></p>
                   4169: 
                   4170:   <p>The following rules specify that a box has a height of 10.5 centimeters
                   4171:   and a width of 5.3 ems:</p>
                   4172:   <pre>Height : 10.5 cm;
1.18      cvs      4173: Width  : 5.3;</pre>
                   4174: </blockquote>
                   4175: </div>
1.1       cvs      4176: 
1.18      cvs      4177: <div class="subsection">
1.37    ! cvs      4178: <h3><a name="sectc4218" id="sectc4218">Relative positions</a></h3>
1.1       cvs      4179: 
1.37    ! cvs      4180: <p>The positioning of boxes uses the eight axes and sides, the sides
        !          4181: generally being used to define the juxtapositioning (vertical or horizontal)
        !          4182: of boxes, the middle axes being used to define centering, and the reference
        !          4183: axes being used for alignment.</p>
        !          4184: 
        !          4185: <p>Two rules allow a box to be placed relative to other boxes. The
        !          4186: <tt>VertPos</tt> rule positions the box vertically. The <tt>HorizPos</tt>
        !          4187: rule positions the box horizontally. It is possible that a box's position
        !          4188: could be entirely determined by other boxes positioned relative to it. In
        !          4189: this case, the position is implicit and the word <tt>nil</tt> can be used to
        !          4190: specify that no position rule is needed. Otherwise, an explicit rule must be
1.18      cvs      4191: given by indicating the axis or side which defines the position of the box,
                   4192: followed by an equals sign and the distance between between this axis or side
1.37    ! cvs      4193: and a parallel axis or side of another box, called the reference box. The box
1.18      cvs      4194: for which the rule is written will be positioned relative to the reference
                   4195: box.</p>
                   4196: <pre>                 'VertPos' ':' VPos
1.6       cvs      4197:                  'HorizPos' ':' HPos
                   4198:      HPos      = 'nil' / VertAxis '=' HorizPosition
                   4199:                  [ 'UserSpecified' ].
                   4200:      VPos      = 'nil' / HorizAxis '=' VertPosition
                   4201:                  [ 'UserSpecified' ].
1.1       cvs      4202:      VertAxis  = 'Left' / 'VMiddle' / 'VRef' / 'Right' .
1.18      cvs      4203:      HorizAxis = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' .</pre>
1.30      cvs      4204: 
1.37    ! cvs      4205: <p>The reference box is an adjacent box: enclosing, enclosed or adjacent.
        !          4206: When a rule is associated with a reference type attribute (and only in this
        !          4207: case), it can be a box of the element designated by the attribute. The
        !          4208: reference box can be either a presentation box previously defined in the
        !          4209: <tt>BOXES</tt> section of the schema and created by a creation function, or
        !          4210: the box associated with a structured element.</p>
        !          4211: 
        !          4212: <p>The structural position of the reference box (relative to the box for
        !          4213: which the rule is being written) is indicated by a keyword:
        !          4214: <tt>Enclosing</tt>, <tt>Enclosed</tt>, or, for sibling boxes,
        !          4215: <tt>Previous</tt> or <tt>Next</tt>. The reference attributes, or presentation
        !          4216: boxes created by a reference attribute, the <tt>Referred</tt> keyword may be
        !          4217: used to designate the element which the reference points to. The keyword
        !          4218: <tt>Creator</tt> can be used in rules for presentation boxes to designate the
        !          4219: box of the element which created the presentation box. Finally, the
        !          4220: <tt>Root</tt> keyword can be used to designate the root of the document.</p>
1.30      cvs      4221: 
                   4222: <p>When the keyword is ambiguous, it is followed by the name of an element
                   4223: type or presentation box which resolves the ambiguity (the <tt>Creator</tt>
1.37    ! cvs      4224: and <tt>Root</tt> keywords are never ambiguous). If this name is not given,
1.30      cvs      4225: then the first box encountered is used as the reference box. It is also
                   4226: possible to use just the name of an element type or presentation box without
1.37    ! cvs      4227: an initial keyword. In this case, a sibling having that name will be used. If
1.30      cvs      4228: the name is preceded by the keyword <tt>NOT</tt>, then the reference box will
                   4229: be the first box whose type is not the named one.</p>
                   4230: 
                   4231: <p>In place of the box or type name, the keywords <tt>AnyElem</tt>,
1.18      cvs      4232: <tt>AnyBox</tt> and <tt>ElemWithAttr</tt> can be used, representing
1.17      cvs      4233: respectively, any structured element box, any presentation box, and the box
                   4234: corresponding to any structured element having a particular attribute,
                   4235: whatever its value; the name of this attribute must follow the keyword
1.18      cvs      4236: <tt>ElemWithAttr</tt>.</p>
1.30      cvs      4237: 
                   4238: <p>A type name may be preceded by a star in order to resolve the ambiguity in
                   4239: the special case where the structure schema defines an <a
1.18      cvs      4240: href="#sectd3284">inclusion</a> without expansion (or with partial expansion)
1.37    ! cvs      4241: of the same type as an element of the scheme. For mark pairs (and only for <a
1.18      cvs      4242: href="#sectd3285">mark pairs</a>) the type name <em>must</em> be preceded by
                   4243: the <tt>First</tt> or <tt>Second</tt> keyword, which indicates which of the
1.37    ! cvs      4244: two marks of the pair should be used as the reference box.</p>
1.30      cvs      4245: 
                   4246: <p>The star character ('<tt>*</tt>') used alone designates the box to which
1.37    ! cvs      4247: the rule applies (in this case, it is obviously useless to specify the type
        !          4248: of the reference box).</p>
1.30      cvs      4249: 
1.37    ! cvs      4250: <p>The keywords <tt>Enclosing</tt> and <tt>Enclosed</tt> can be used no
        !          4251: matter what constructor defines the type to which the rule applies. When
        !          4252: applied to the element which represents the entire document,
        !          4253: <tt>Enclosing</tt> designates the window or page in which the document's
        !          4254: image is displayed for the view to which the rule applies. A box or type name
        !          4255: without a keyword is used for aggregate elements and designates another
        !          4256: element of the same aggregate. It can also be used to designate a
        !          4257: presentation or page layout box. The keywords <tt>Previous</tt> and
        !          4258: <tt>Next</tt> are primarily used to denote list elements, but can also be
        !          4259: used to denote elements of an aggregate.</p>
        !          4260: 
        !          4261: <p>In the position rule, the structural position relative to the reference
        !          4262: box is followed, after a period, by the name of an axis or side. The rule
        !          4263: specifies its node's position as being some distance from this axis or side
        !          4264: of the reference box. If this distance is zero, then the distance does not
        !          4265: appear in the rule. Otherwise, it does appear as a positive or negative
1.30      cvs      4266: number (the sign is required for negative numbers). The sign takes into
                   4267: account the orientation of the coordinate axes: for top to bottom for the
1.37    ! cvs      4268: vertical axis and from left to right for the horizontal axis. Thus, a
1.30      cvs      4269: negative distance in a vertical position indicates that the side or axis
                   4270: specified in the rule is above the side or axis of the reference box.</p>
                   4271: 
1.37    ! cvs      4272: <p>The distance can be followed by the <tt>UserSpecified</tt> keyword (even
        !          4273: if the distance is nil and does not appear, the <tt>UserSpecified</tt>
        !          4274: keyword can be used). It indicates that when the element to which the rule
        !          4275: applies is being created, the editor will ask the user to specify the
        !          4276: distance himself, using the mouse. In this case, the distance specified in
        !          4277: the rule is a default distance which is suggested to the user but can be
        !          4278: modified. The <tt>UserSpecified</tt> keyword can be used either in the
        !          4279: vertical position rule, the horizontal position rule, or both.</p>
1.18      cvs      4280: <pre>     VertPosition  = Reference '.' HorizAxis [ Distance ] .
1.1       cvs      4281:      HorizPosition = Reference '.' VertAxis [ Distance ] .
                   4282:      Reference     ='Enclosing' [ BoxTypeNot ] /
                   4283:                     'Enclosed' [ BoxTypeNot ] /
                   4284:                     'Previous' [ BoxTypeNot ] /
                   4285:                     'Next' [ BoxTypeNot ] /
                   4286:                     'Referred' [ BoxTypeNot ] /
                   4287:                     'Creator' /
                   4288:                     'Root' /
                   4289:                     '*' /
                   4290:                      BoxOrType .
                   4291:      BoxOrType     = BoxID /
                   4292:                      [ '*' ] [ FirstSec ] ElemID /
1.17      cvs      4293:                     'AnyElem' / 'AnyBox' /
                   4294:                     'ElemWithAttr' AttrID .
1.18      cvs      4295:      BoxTypeNot    = [ 'NOT' ] BoxOrType .</pre>
1.30      cvs      4296: 
1.18      cvs      4297: <blockquote class="example">
1.30      cvs      4298:   <p><strong>Example:</strong></p>
                   4299: 
1.37    ! cvs      4300:   <p>If a <a name="expos1" id="expos1">report</a> is defined by the following
        !          4301:   structure schema:</p>
1.30      cvs      4302:   <pre>Report = BEGIN
1.6       cvs      4303:          Title  = Text;
                   4304:          Summary = Text;
                   4305:          Keywords = Text;
                   4306:          ...
1.18      cvs      4307:          END;</pre>
1.30      cvs      4308: 
                   4309:   <p>then the presentation schema could contain the rules:</p>
                   4310:   <pre>Report : BEGIN
1.6       cvs      4311:          VertPos  : Top = Enclosing . Top;
                   4312:          HorizPos : Left = Enclosing . Left;
                   4313:          ...
1.18      cvs      4314:          END;</pre>
1.30      cvs      4315: 
1.37    ! cvs      4316:   <p>These rules place the <a name="reportexample"
        !          4317:   id="reportexample">report</a> in the upper left corner of the enclosing
        !          4318:   box, which is the window in which the document is being edited.</p>
1.30      cvs      4319:   <pre>Title :  BEGIN
1.6       cvs      4320:          VertPos  : Top = Enclosing . Top + 1;
                   4321:          HorizPos : VMiddle = Enclosing . VMiddle;
                   4322:          ...
1.18      cvs      4323:          END;</pre>
1.30      cvs      4324: 
1.37    ! cvs      4325:   <p>The top of the title is one line (a line has the height of the
        !          4326:   characters of the title) from the top of the report, which is also the top
        !          4327:   of the editing window. The title is centered horizontally in the window
        !          4328:   (see <a href="#posdim">figure</a>).</p>
1.30      cvs      4329:   <pre>Summary : BEGIN
1.1       cvs      4330:           VertPos  : Top = Title . Bottom + 1.5;
                   4331:           HorizPos : Left = Enclosing . Left + 2 cm;
                   4332:           ...
1.18      cvs      4333:           END;</pre>
1.30      cvs      4334: 
1.37    ! cvs      4335:   <p>The top of the summary is place a line and a half below the bottom of
        !          4336:   the title and is shifted two centimeters from the side of the window.</p>
1.18      cvs      4337: </blockquote>
1.30      cvs      4338: 
1.18      cvs      4339: <blockquote class="example">
1.30      cvs      4340:   <p><strong>Example:</strong></p>
                   4341: 
1.37    ! cvs      4342:   <p>Suppose there is a <a name="expos2" id="expos2">Design</a> logical
        !          4343:   structure which contains graphical elements:</p>
1.30      cvs      4344:   <pre>Design = LIST OF (ElemGraph = GRAPHICS);</pre>
                   4345: 
                   4346:   <p>The following rules allow the user to freely choose the position of each
                   4347:   element when it is created:</p>
                   4348:   <pre>ElemGraph =
1.1       cvs      4349:    BEGIN
                   4350:    VertPos : Top = Enclosing . Top + 1 cm UserSpecified;
                   4351:    HorizPos: Left = Enclosing . Left UserSpecified;
                   4352:    ...
1.18      cvs      4353:    END;</pre>
1.30      cvs      4354: 
                   4355:   <p>Thus, when a graphical element is created, its default placement is at
                   4356:   the left of the window and 1 cm from the top, but the user can move it
                   4357:   immediately, simply by moving the mouse.</p>
1.18      cvs      4358: </blockquote>
                   4359: </div>
1.1       cvs      4360: 
1.18      cvs      4361: <div class="subsection">
1.37    ! cvs      4362: <h3><a name="sectc4219" id="sectc4219">Box extents</a></h3>
1.1       cvs      4363: 
1.30      cvs      4364: <p>The extents (height and width) of each box are defined by the two rules
1.37    ! cvs      4365: <tt>Height</tt> and <tt>Width</tt>. There are three types of extents: fixed,
1.18      cvs      4366: relative, and elastic.</p>
1.1       cvs      4367: 
1.18      cvs      4368: <div class="subsubsection">
1.37    ! cvs      4369: <h4><a name="sectd42191" id="sectd42191">Fixed extents</a></h4>
1.1       cvs      4370: 
1.30      cvs      4371: <p>A fixed dimension sets the height or width of the box independently of all
1.37    ! cvs      4372: other boxes. It is expressed in <a href="#sectc4217">distance units</a>. The
1.18      cvs      4373: extent can be followed by the <tt>UserSpecified</tt> keyword which indicates
1.1       cvs      4374: that when the element to which the rule applies is being created, the editor
1.37    ! cvs      4375: will ask the user to specify the extent himself, using the mouse. In this
1.1       cvs      4376: case, the extent specified in the rule is a default extent which is suggested
1.37    ! cvs      4377: to the user but can be modified. The <tt>UserSpecified</tt> keyword can be
1.18      cvs      4378: used either in the <tt>Height</tt> rule, the <tt>Width</tt> rule, or both.</p>
1.30      cvs      4379: 
                   4380: <p>A fixed extent rule can be ended by the <tt>Min</tt> keyword, which
                   4381: signifies that the indicated value is a minimum, and that, if the contents of
                   4382: the box require it, a larger extent is possible.</p>
1.18      cvs      4383: <pre>                'Height' ':' Dimension
1.1       cvs      4384:                 'Width' ':' Dimension
                   4385:      Dimension = AbsDist [ 'UserSpecified' ]  [ 'Min' ] /
1.18      cvs      4386:                  ...</pre>
1.30      cvs      4387: 
1.18      cvs      4388: <blockquote class="example">
1.30      cvs      4389:   <p><strong>Example:</strong></p>
                   4390: 
                   4391:   <p>Continuing with the <a href="#expos2">previous example</a>, it is
                   4392:   possible to allow the user to choose the size of each graphical element as
                   4393:   it is created:</p>
                   4394:   <pre>ElemGraph : BEGIN
1.6       cvs      4395:             Width :  2 cm UserSpecified;
1.1       cvs      4396:             Height : 1 cm UserSpecified;
                   4397:             ...
1.18      cvs      4398:             END;</pre>
1.30      cvs      4399: 
                   4400:   <p>Thus, when a graphical element is create, it is drawn by default with a
                   4401:   width of 2 cm and a height of 1 cm, but the user is free to resize it
                   4402:   immediately with the mouse.</p>
                   4403:   <pre>Summary :  BEGIN
1.1       cvs      4404:            Height : 5 cm Min;
                   4405:            ...
                   4406:            END;
                   4407: Keywords : BEGIN
                   4408:            VertPos : Top = Summary . Bottom;
                   4409:            ...
1.18      cvs      4410:            END;</pre>
                   4411: </blockquote>
                   4412: </div>
1.1       cvs      4413: 
1.18      cvs      4414: <div class="subsubsection">
1.37    ! cvs      4415: <h4><a name="sectd42192" id="sectd42192">Relative extents</a></h4>
1.30      cvs      4416: 
                   4417: <p>A relative extent determines the extent as a function of the extent of
                   4418: another box, just as a relative position places a box in relation to another.
                   4419: The reference box in an extent rule is designated using the same syntax as is
1.37    ! cvs      4420: used in a relative position rule. It is followed by a period and a
1.30      cvs      4421: <tt>Height</tt> or <tt>Width</tt> keyword, depending on the extent being
1.37    ! cvs      4422: referred to. Next comes the relation between the extent being defined and the
        !          4423: extent of the reference box. This relation can be either a percentage or a
1.30      cvs      4424: difference.</p>
1.1       cvs      4425: 
1.37    ! cvs      4426: <p>A percentage is indicated by a star (the multiplication symbol) followed
        !          4427: by the numeric percentage value (which may be greater than or less than 100)
        !          4428: and the percent (`%') character. A difference is simply indicated by a signed
1.18      cvs      4429: difference.</p>
1.30      cvs      4430: 
                   4431: <p>If the rule appears in the presentation rules of a numeric attribute, the
1.1       cvs      4432: percentage value can be replaced by the name of the attribute. This attribute
1.37    ! cvs      4433: is then used as a percentage. The attribute can also be used as part of a <a
1.18      cvs      4434: href="#distance">difference</a>.</p>
1.30      cvs      4435: 
                   4436: <p>Just as with a fixed extent, a relative extent rule can end with the
1.18      cvs      4437: <tt>Min</tt> keyword, which signifies that the extent is a minimum and that,
                   4438: if the contents of the box require it, a larger extent is possible.</p>
1.30      cvs      4439: 
                   4440: <p>A special case of relative extent rules is:</p>
1.18      cvs      4441: <pre>Height : Enclosed . Height;</pre>
1.30      cvs      4442: 
                   4443: <p>or</p>
1.18      cvs      4444: <pre>Width  : Enclosed . Width;</pre>
1.30      cvs      4445: 
                   4446: <p>which specifies that the box has a height (or width) such that it encloses
                   4447: all the boxes which it contains, excluding boxes having a rule
                   4448: <tt>VertOverflow: Yes;</tt> or <tt>HorizOverflow: Yes;</tt>.</p>
                   4449: 
                   4450: <p><strong>Note:</strong> character strings (type <tt>TEXT_UNIT</tt>)
                   4451: generally must use the sum of the widths of the characters which compose them
                   4452: as their width, which is expressed by the rule:</p>
1.18      cvs      4453: <pre>TEXT_UNIT :
                   4454:      Width : Enclosed . Width;</pre>
1.30      cvs      4455: 
                   4456: <p>If this rule is not the default <tt>Width</tt> rule, it must be given
1.18      cvs      4457: explicitly in the <tt>RULES</tt> section which defines the presentation rules
                   4458: of the logical elements.</p>
                   4459: <pre>                  'Height' ':' Extent
1.1       cvs      4460:                   'Width' ':' Extent
                   4461:      Extent      = Reference '.' HeightWidth [ Relation ]
                   4462:                    [ 'Min' ] / ...
                   4463:      HeightWidth ='Height' / 'Width' .
                   4464:      Relation    ='*' ExtentAttr '%' / Distance .
                   4465:      ExtentAttr  = ExtentVal / AttrID .
1.18      cvs      4466:      ExtentVal   = NUMBER .</pre>
1.30      cvs      4467: 
1.18      cvs      4468: <blockquote class="example">
1.30      cvs      4469:   <p><strong>Example:</strong></p>
                   4470: 
                   4471:   <p>Completing the <a href="#expos1">above example</a>, it is possible to
                   4472:   specify that the report takes its width from the editing window and its
                   4473:   height from the size of its contents (this can obviously be greater than
                   4474:   that of the window):</p>
                   4475:   <pre>Report :  BEGIN
1.1       cvs      4476:           Width : Enclosing . Width;
                   4477:           Height : Enclosed . Height;
                   4478:           ...
1.18      cvs      4479:           END;</pre>
1.30      cvs      4480: 
                   4481:   <p>Then, the following rules make the title occupy 60% of the width of the
                   4482:   report (which is that of the window) and is broken into centered lines of
                   4483:   this width (see the <a href="#sectc4222"><tt>Line</tt> rule</a>).</p>
                   4484:   <pre>Title :   BEGIN
1.1       cvs      4485:           Width : Enclosing . Width * 60%;
                   4486:           Height : Enclosed . Height;
                   4487:           Line;
                   4488:           Adjust : VMiddle;
                   4489:           ...
1.18      cvs      4490:           END;</pre>
1.30      cvs      4491: 
                   4492:   <p>The summary occupy the entire width of the window, with the exception of
                   4493:   a 2 cm margin reserved by the horizontal position rule:</p>
                   4494:   <pre>Summary : BEGIN
1.1       cvs      4495:           Width : Enclosing . Width - 2 cm;
                   4496:           Height : Enclosed . Height;
                   4497:           ...
1.18      cvs      4498:           END;</pre>
                   4499: 
1.37    ! cvs      4500:   <p>This set of rules, plus the <a href="#reportexample">position rules
        !          4501:   given above</a>, produce the layout of boxes shown in the following<a
1.30      cvs      4502:   href="#posdim">figure</a>.</p>
                   4503: 
                   4504:   <div class="figure">
1.37    ! cvs      4505:   <hr />
1.30      cvs      4506:   <pre>-------------------------------------------------------------
1.1       cvs      4507: | Window and Report           ^                             |
                   4508: |                             | 1 line                      |
                   4509: |                             v                             |
                   4510: |           -------------------------------------           |
                   4511: |           |                                   |           |
                   4512: :    20%    :               Title               :    20%    :
1.30      cvs      4513: :&lt;---------&gt;:                                   :&lt;---------&gt;:
1.1       cvs      4514: :           :                60%                :           :
1.30      cvs      4515: :           :&lt;---------------------------------&gt;:           :
1.1       cvs      4516: |           |                                   |           |
                   4517: |           -------------------------------------           |
                   4518: |                             ^                             |
                   4519: |                             | 1.5 line                    |
                   4520: |                             |                             |
                   4521: |                             v                             |
                   4522: |        ---------------------------------------------------|
                   4523: |  2 cm  |                                                  |
1.30      cvs      4524: |&lt;------&gt;|                    Summary                       |
1.18      cvs      4525: :        :                                                  :</pre>
1.19      cvs      4526: 
1.37    ! cvs      4527:   <p align="center"><em><a name="posdim" id="posdim">Box position and
1.30      cvs      4528:   extent</a><em></em></em></p>
1.37    ! cvs      4529:   <hr />
1.30      cvs      4530:   </div>
1.18      cvs      4531: </blockquote>
                   4532: </div>
1.1       cvs      4533: 
1.18      cvs      4534: <div class="subsubsection">
1.37    ! cvs      4535: <h4><a name="sectd42193" id="sectd42193">Elastic extents</a></h4>
1.1       cvs      4536: 
1.37    ! cvs      4537: <p>The last type of extent is the elastic extent. Either one or both extents
        !          4538: can be elastic. A box has an elastic extent when two opposite sides are
1.30      cvs      4539: linked by distance constraints to two sides or axes of other boxes.</p>
                   4540: 
                   4541: <p>One of the sides of the elastic box is linked by a position rule
1.37    ! cvs      4542: (<tt>VertPos</tt> or <tt>HorizPos</tt>) to a neighboring box. The other side
1.18      cvs      4543: is link to another box by a <tt>Height</tt> or <tt>Width</tt> rule, which
1.37    ! cvs      4544: takes the same form as the position rule. For the elastic box itself, the
1.1       cvs      4545: notions of sides (left or right, top or bottom) are fuzzy, since the movement
                   4546: of either one of the two reference boxes can, for example, make the left side
1.37    ! cvs      4547: of the elastic box move to the right of its right side. This is not
        !          4548: important. The only requirement is that the two sides of the elastic box used
1.18      cvs      4549: in the position and extent rule are opposite sides of the box.</p>
                   4550: <pre>             'Height' ':' Extent
1.6       cvs      4551:              'Width' ':' Extent
1.18      cvs      4552:      Extent = HPos / VPos / ...</pre>
1.30      cvs      4553: 
1.18      cvs      4554: <blockquote class="example">
1.30      cvs      4555:   <p><strong>Example:</strong></p>
                   4556: 
                   4557:   <p>Suppose we want to draw an elastic arrow or line between the middle of
1.37    ! cvs      4558:   the bottom side of box A and the upper left corner of box B. To do this, we
1.30      cvs      4559:   would define a graphics box whose upper left corner coincides with the
                   4560:   middle of the bottom side of A (a position rule) and whose lower right
                   4561:   corner coincides with with the upper left corner of B (dimension rules):</p>
                   4562:   <pre>LinkedBox :
1.1       cvs      4563:    BEGIN
1.6       cvs      4564:    VertPos  : Top = A .Bottom;
1.1       cvs      4565:    HorizPos : Left = A . VMiddle;
1.6       cvs      4566:    Height   : Bottom = B . Top;
                   4567:    Width    : Right = B . Left;
1.18      cvs      4568:    END;</pre>
                   4569: </blockquote>
1.30      cvs      4570: 
1.18      cvs      4571: <blockquote class="example">
1.30      cvs      4572:   <p><strong>Example:</strong></p>
                   4573: 
                   4574:   <p>The element SectionTitle creates a presentation box called SectionNum
1.37    ! cvs      4575:   which contains the number of the section. Suppose we want to align the
        !          4576:   SectionNum and SectionTitle horizontally, have the SectionNum take its
        !          4577:   width from its contents (the section number), have the SectionTitle box
        !          4578:   begin 0.5 cm to the right of the SectionNum box and end at the right edge
        !          4579:   of its enclosing box. This would make the SectionTitle box elastic, since
        !          4580:   its width is defined by the position of its left and right sides. The
        !          4581:   following rules produce this effect:</p>
1.30      cvs      4582:   <pre>SectionNum :
1.1       cvs      4583:    BEGIN
                   4584:    HorizPos : Left = Enclosing . Left;
                   4585:    Width : Enclosed . Width;
                   4586:    ...
                   4587:    END;
                   4588: 
                   4589: SectionTitle :
                   4590:    BEGIN
                   4591:    HorizPos : Left = SectionNum . Right + 0.5 cm;
                   4592:    Width : Right = Enclosing . Right;
                   4593:    ...
1.18      cvs      4594:    END;</pre>
                   4595: </blockquote>
                   4596: </div>
                   4597: </div>
1.1       cvs      4598: 
1.18      cvs      4599: <div class="subsection">
1.37    ! cvs      4600: <h3><a name="sectc4220" id="sectc4220">Overflow</a></h3>
1.1       cvs      4601: 
1.30      cvs      4602: <p>A boxes corresponding to a structural element normally contain all boxes
1.37    ! cvs      4603: corresponding to the elements of its subtree. However, in some cases, it
1.1       cvs      4604: could be necessary to allow a box to jut out from its parent box. Two
                   4605: presentation rules indicate that such an overflow is allowed, one for
1.18      cvs      4606: horizontal overflow, one for vertical overflow.</p>
1.30      cvs      4607: 
                   4608: <p>Each of these rules is expressed by a keyword followed by a colon and the
1.18      cvs      4609: keyword <tt>Yes</tt> or <tt>No</tt>.</p>
                   4610: <pre>               'VertOverflow' ':' Boolean /
1.1       cvs      4611:                'HorizOverflow' ':' Boolean .
1.18      cvs      4612:      Boolean = 'Yes' / 'No' .</pre>
                   4613: </div>
1.1       cvs      4614: 
1.30      cvs      4615: <p>@@@@@ ******</p>
                   4616: 
1.26      cvs      4617: <p>Explain Margin, Padding and Border. Refer to CSS2.</p>
                   4618: <pre>                'MarginTop' ':' MarginWidth /
                   4619:                 'MarginRight' ':' MarginWidth /
                   4620:                 'MarginBottom' ':' MarginWidth /
                   4621:                 'MarginLeft' ':' MarginWidth /
                   4622:                 'PaddingTop' ':' PaddingWidth /
                   4623:                 'PaddingRight' ':' PaddingWidth /
                   4624:                 'PaddingBottom' ':' PaddingWidth /
                   4625:                 'PaddingLeft' ':' PaddingWidth /
                   4626:                 'BorderTopWidth' ':' BorderWidth /
                   4627:                 'BorderRightWidth' ':' BorderWidth /
                   4628:                 'BorderBottomWidth' ':' BorderWidth /
                   4629:                 'BorderLeftWidth' ':' BorderWidth /
                   4630:                 'BorderTopColor' ':' BorderColor /
                   4631:                 'BorderRightColor' ':' BorderColor /
                   4632:                 'BorderBottomColor' ':' BorderColor /
                   4633:                 'BorderLeftColor' ':' BorderColor /
                   4634:                 'BorderTopStyle' ':' BorderStyle /
                   4635:                 'BorderRightStyle' ':' BorderStyle /
                   4636:                 'BorderBottomStyle' ':' BorderStyle /
                   4637:                 'BorderLeftStyle' ':' BorderStyle .
                   4638: 
                   4639: MarginWidth   = InheritParent / 'Auto' / Distance .
                   4640: PaddingWidth  = InheritParent / Distance .
                   4641: BorderWidth   = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance .
                   4642: BorderColor   = InheritParent / 'Transparent' / 'Foreground' /
                   4643:                 ColorName .
                   4644: BorderStyle   = InheritParent /
                   4645:                 'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' /
                   4646:                 'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' .
1.27      cvs      4647: InheritParent = 'Enclosing' '=' / 'Creator' '=' .
1.26      cvs      4648: ColorName     =  NAME .</pre>
1.30      cvs      4649: 
                   4650: <p>@@@@@ ******</p>
1.26      cvs      4651: 
1.18      cvs      4652: <div class="subsection">
1.37    ! cvs      4653: <h3><a name="sectc4221" id="sectc4221">Inheritance</a></h3>
1.1       cvs      4654: 
1.37    ! cvs      4655: <p>A presentation property can be defined by reference to the same property
        !          4656: of another box in the tree of boxes. These structural links are expressed by
        !          4657: kinship. The reference box can be that of the element immediately above in
1.18      cvs      4658: the structure (<tt>Enclosing</tt>), two levels above (<tt>GrandFather</tt>),
                   4659: immediately below (<tt>Enclosed</tt>) or immediately before
1.37    ! cvs      4660: (<tt>Previous</tt>). In the case of a presentation box, and only in that
1.1       cvs      4661: case, the reference box may be the element which created the presentation box
1.18      cvs      4662: (<tt>Creator</tt>).</p>
1.30      cvs      4663: 
                   4664: <p>Kinship is expressed in terms of the logical structure of the document and
1.37    ! cvs      4665: not in terms of the tree of boxes. The presentation box cannot transmit any
1.34      cvs      4666: of their properties by inheritance; only structured element boxes can do so.
1.37    ! cvs      4667: As an example, consider an element B which follows an element A in the
        !          4668: logical structure. The element B creates a presentation box P in front of
        !          4669: itself, using the <tt>CreateBefore</tt> rule (see the <a
        !          4670: href="#sectc4232">creation rules</a>). If element B's box inherits its
        !          4671: character style using the <tt>Previous</tt> kinship operation, it gets its
        !          4672: character style from A's box, not from P's box. Inheritance works differently
        !          4673: for positions and extents, which can refer to presentation boxes.</p>
1.30      cvs      4674: 
1.34      cvs      4675: <p>The inherited property value can be the same as that of the reference box.
1.37    ! cvs      4676: This is indicated by an equals sign. However, for numeric properties, a
1.1       cvs      4677: different value can be obtained by adding or subtracting a number from the
1.37    ! cvs      4678: reference box's property value. Addition is indicated by a plus sign before
        !          4679: the number, while subtraction is specified with a minus sign. The value of a
1.34      cvs      4680: property can also be given a maximum (if the sign is a plus) or minimum (if
1.18      cvs      4681: the sign is a minus).</p>
1.30      cvs      4682: 
                   4683: <p>If the rule is being applied to a numeric attribute, the number to add or
1.37    ! cvs      4684: subtract can be replaced by the attribute name. The value of a maximum or
        !          4685: minimum may also be replaced by an attribute name. In these cases, the value
1.18      cvs      4686: of the attribute is used.</p>
                   4687: <pre>  Inheritance    = Kinship  InheritedValue .
1.6       cvs      4688:   Kinship        ='Enclosing' / 'GrandFather' / 'Enclosed' /
                   4689:                   'Previous' / 'Creator' .
1.1       cvs      4690:   InheritedValue ='+' PosIntAttr [ 'Max' maximumA ] /
1.6       cvs      4691:                   '-' NegIntAttr [ 'Min' minimumA ] /
                   4692:                   '=' .
                   4693:   PosIntAttr     = PosInt / AttrID .
                   4694:   PosInt         = NUMBER .
                   4695:   NegIntAttr     = NegInt / AttrID .
                   4696:   NegInt         = NUMBER .
                   4697:   maximumA       = maximum / AttrID .
                   4698:   maximum        = NUMBER .
                   4699:   minimumA       = minimum / AttrID .
1.18      cvs      4700:   minimum        = NUMBER .</pre>
1.30      cvs      4701: 
1.36      cvs      4702: <p>The properties which can be obtained by inheritance are hyphenation,
                   4703: interline spacing, character font (font family), font style, font size,
                   4704: visibility, indentation, underlining, alignment of text, stacking order of
                   4705: objects, the style and thickness of lines, fill pattern and the colors of
1.18      cvs      4706: lines and characters.</p>
                   4707: </div>
1.1       cvs      4708: 
1.18      cvs      4709: <div class="subsection">
1.37    ! cvs      4710: <h3><a name="sectc4222" id="sectc4222">Line breaking</a></h3>
1.1       cvs      4711: 
1.30      cvs      4712: <p>The <tt>Line</tt> rule specifies that the contents of the box should be
                   4713: broken into lines: the boxes included in the box to which this rule is
                   4714: attached are displayed one after the other, from left to right, with their
1.37    ! cvs      4715: horizontal reference axes aligned so that they form a series of lines. The
1.30      cvs      4716: length of these lines is equal to the width of the box to which the
                   4717: <tt>Line</tt> rule is attached.</p>
                   4718: 
                   4719: <p>When an included box overflows the current line, it is either carried
1.37    ! cvs      4720: forward to the next line, cur, or left the way it is. The <a
1.18      cvs      4721: href="#sectc4223"><tt>LineBreak</tt> rule</a> is used to allow or prevent the
1.37    ! cvs      4722: breaking of included boxes. If the included box is not breakable but is
        !          4723: longer than the space remaining on the line, it is left as is. When a
1.1       cvs      4724: character string box is breakable, the line is broken between words or, if
1.37    ! cvs      4725: necessary, by <a href="#sectd42225">hyphenating a word</a>. When a compound
        !          4726: box is breakable, the box is transparent in regard to line breaking. The
        !          4727: boxes included in the compound box are treated just like included boxes which
        !          4728: have the <tt>LineBreak</tt> rule. Thus, it is possible to traverse a complete
1.18      cvs      4729: subtree of boxes to line break the text leaves of a complex structure.</p>
1.30      cvs      4730: 
                   4731: <p>The relative position rules of the included boxes are ignored, since the
                   4732: boxes will be placed according to the line breaking rules.</p>
                   4733: 
1.37    ! cvs      4734: <p>The <tt>Line</tt> rule does not have a parameter. The characteristics of
        !          4735: the lines that will be constructed are determined by the
        !          4736: <tt>LineSpacing</tt>, <tt>Indent</tt>, <tt>Adjust</tt>, and
        !          4737: <tt>Hyphenate</tt> rules. Moreover, the <a
        !          4738: href="#insectd42226"><tt>Inline</tt> rule</a> permits the exclusion of
1.36      cvs      4739: certain elements from the line breaking process.</p>
1.30      cvs      4740: 
                   4741: <p>When the <tt>Line</tt> rule appears in the rules sequence of a non-primary
1.37    ! cvs      4742: view, it applies only to that view, but when the <tt>Line</tt> rule appears
        !          4743: in the rules sequence of the primary view, it also applies to the other views
        !          4744: by default, except for those views which explicitly invoke the
        !          4745: <tt>NoLine</tt> rule. Thus, the <tt>NoLine</tt> rule can be used in a
        !          4746: non-primary view to override the primary view's <tt>Line</tt> rule. The
        !          4747: <tt>NoLine</tt> rule must not be used with the primary view because the
        !          4748: absence of the <tt>Line</tt> rule has the same effect. Like the <tt>Line</tt>
        !          4749: rule, the <tt>NoLine</tt> rule does not take any parameters.</p>
1.18      cvs      4750: <pre>              'Line'
                   4751:               'NoLine'</pre>
                   4752: 
                   4753: <div class="subsubsection">
1.37    ! cvs      4754: <h4><a name="sectd42221" id="sectd42221">Line spacing</a></h4>
1.18      cvs      4755: 
1.30      cvs      4756: <p>The <tt>LineSpacing</tt> rule defines the line spacing to be used in the
1.37    ! cvs      4757: line breaking process. The line spacing is the distance between the baselines
1.1       cvs      4758: (horizontal reference axis) of the successive lines produced by the
1.37    ! cvs      4759: <tt>Line</tt> rule. The value of the line spacing can be specified as a
        !          4760: constant or by inheritance. It is expressed in any of the available <a
1.18      cvs      4761: href="#sectc4217">distance units</a>.</p>
1.30      cvs      4762: 
                   4763: <p>Inheritance allows the value to be obtained from a relative in the
                   4764: structure tree, either without change (an equals sign appears after the
                   4765: inheritance keyword), with a positive difference (a plus sign), or a negative
1.37    ! cvs      4766: difference (a minus sign). When the rule uses a difference, the value of the
1.30      cvs      4767: difference follows the sign and is expressed as a <a
                   4768: href="#sectc4217">distance</a>.</p>
1.18      cvs      4769: <pre>                     'LineSpacing' ':' DistOrInherit
1.6       cvs      4770:      DistOrInherit =  Kinship InheritedDist / Distance .
1.18      cvs      4771:      InheritedDist = '=' / '+' AbsDist / '-' AbsDist .</pre>
1.30      cvs      4772: 
                   4773: <p>When the line spacing value (or its difference from another element) is
1.37    ! cvs      4774: expressed in relative units, it changes with the size of the characters.
        !          4775: Thus, when a larger font is chosen for a part of the document, the line
        !          4776: spacing of that part expands proportionally. In contrast, when the line
        !          4777: spacing value is expressed in absolute units (centimeters, inches,
        !          4778: typographer's points), it is independent of the characters, which permits the
        !          4779: maintenance of a consistent line spacing, whatever the character font. Either
        !          4780: approach can be taken, depending on the desired effect.</p>
1.18      cvs      4781: </div>
1.1       cvs      4782: 
1.18      cvs      4783: <div class="subsubsection">
1.37    ! cvs      4784: <h4><a name="sectd42222" id="sectd42222">First line indentation</a></h4>
1.1       cvs      4785: 
1.30      cvs      4786: <p>The <tt>Indent</tt> rule is used to specify the indentation of the first
                   4787: line of the elements broken into lines by the <tt>Line</tt> function. The
1.1       cvs      4788: indentation determines how far the first line of the element is shifted with
1.37    ! cvs      4789: respect to the other lines of the same element. It can be specified as a
        !          4790: constant or by inheritance. The constant value is a positive integer (shifted
1.1       cvs      4791: to the right; the sign is optional), a negative integer (shifted to the left)
1.37    ! cvs      4792: or zero (no shift). All available <a href="#sectc4217">units</a> can be
1.18      cvs      4793: used.</p>
1.30      cvs      4794: 
                   4795: <p>Indentation can be defined for any box, regardless of whether the box is
                   4796: line broken, and transmitted by inheritance to elements that are line broken.
                   4797: The size of the indentation is specified in the same manner as the <a
1.18      cvs      4798: href="#sectd42221">line spacing</a>.</p>
                   4799: <pre>              'Indent' ':' DistOrInherit</pre>
                   4800: </div>
1.1       cvs      4801: 
1.18      cvs      4802: <div class="subsubsection">
1.37    ! cvs      4803: <h4><a name="sectd42223" id="sectd42223">Alignment</a></h4>
1.1       cvs      4804: 
1.30      cvs      4805: <p>The alignment style of the lines constructed during line breaking is
1.37    ! cvs      4806: defined by the <tt>Adjust</tt> rule. The alignment value can be a constant or
        !          4807: inherited. A constant value is specified by a keyword:</p>
1.18      cvs      4808: <ul>
1.30      cvs      4809:   <li><tt>Left</tt>: at the left edge,</li>
                   4810:   <li><tt>Right</tt>: at the right edge,</li>
                   4811:   <li><tt>VMiddle</tt>: centered</li>
1.35      cvs      4812:   <li><tt>Justify</tt>: justified</li>
1.30      cvs      4813:   <li><tt>LeftWithDots</tt>: at the left edge with a dotted line filling out
                   4814:     the last line up to the right edge of the line breaking box.</li>
1.18      cvs      4815: </ul>
1.30      cvs      4816: 
1.37    ! cvs      4817: <p>An inherited value can only be the same as that of the reference box and
        !          4818: is specified by a kinship keyword followed by an equals sign.</p>
1.18      cvs      4819: <pre>                      'Adjust' ':' AlignOrInherit
1.1       cvs      4820:      AlignOrInherit = Kinship '=' / Alignment .
1.35      cvs      4821:      Alignment      = 'Left' / 'Right' / 'VMiddle' / 'Justify' /
1.18      cvs      4822:                       'LeftWithDots' .</pre>
                   4823: </div>
1.1       cvs      4824: 
1.18      cvs      4825: <div class="subsubsection">
1.37    ! cvs      4826: <h4><a name="sectd42225" id="sectd42225">Hyphenation</a></h4>
1.18      cvs      4827: 
1.37    ! cvs      4828: <p>The <tt>Hyphenate</tt> rule indicates whether or not words should be
        !          4829: broken by hyphenation at the end of lines. It affects the lines produced by
        !          4830: the <tt>Line</tt> rule and contained in the box carrying the
        !          4831: <tt>Hyphenate</tt> rule.</p>
1.30      cvs      4832: 
1.34      cvs      4833: <p>The hyphenation property takes a boolean value, which can be either
1.37    ! cvs      4834: constant or inherited. A constant boolean value is expressed by either the
        !          4835: <tt>Yes</tt> or the <tt>No</tt> keyword. An inherited value can only be the
1.1       cvs      4836: same as that of the reference box and is specified by a kinship keyword
1.18      cvs      4837: followed by an equals sign.</p>
                   4838: <pre>                   'Hyphenate' ':' BoolInherit
1.1       cvs      4839:      BoolInherit = Boolean / Kinship '=' .
1.18      cvs      4840:      Boolean     = 'Yes' / 'No' .</pre>
                   4841: </div>
                   4842: 
                   4843: <div class="subsubsection">
1.37    ! cvs      4844: <h4><a name="sectd42226" id="sectd42226">Avoiding line breaking</a></h4>
1.18      cvs      4845: 
1.37    ! cvs      4846: <p>The <tt>InLine</tt> rule is used to specify that a box that would
        !          4847: otherwise participate in line breaking asked for by the <tt>Line</tt> rule of
        !          4848: an enclosing box, instead avoids the line breaking process and positions
        !          4849: itself according to the <tt>HorizPos</tt> and <tt>VertPos</tt> rules that
        !          4850: apply to it. When the <tt>InLine</tt> rule applies to a box which would not
        !          4851: be line broken, it has no effect.</p>
1.30      cvs      4852: 
                   4853: <p>The rule is expressed by the <tt>InLine</tt> keyword followed by a colon
                   4854: and the keyword <tt>Yes</tt>, if the box should participate in line breaking,
1.37    ! cvs      4855: or the keyword <tt>No</tt>, if it should not. This is the only form possible:
        !          4856: this rule cannot be inherited. Moreover, it can only appear in the rules of
1.1       cvs      4857: the primary view and applies to all views defined in the presentation
1.18      cvs      4858: schema.</p>
                   4859: <pre>               'InLine' ':' Boolean .
                   4860:      Boolean = 'Yes' / 'No' .</pre>
1.30      cvs      4861: 
1.18      cvs      4862: <blockquote class="example">
1.30      cvs      4863:   <p><strong>Example:</strong></p>
                   4864: 
                   4865:   <p>Suppose the structure schema defines a logical attribute called
1.37    ! cvs      4866:   <tt>New</tt> which is used to identify the passages in a document which
        !          4867:   were recently modified. It would be nice to have the presentation schema
        !          4868:   make a bar appear in the left margin next to each passage having the
        !          4869:   <tt>New</tt> attribute. A new passage can be an entire element, such as a
        !          4870:   paragraph or section, or it can be some words in the middle of a paragraph.
        !          4871:   To produce the desired effect, the <tt>New</tt> attribute is given a
        !          4872:   creation rule which generates a <tt>VerticalBar</tt> presentation box.</p>
1.30      cvs      4873: 
                   4874:   <p>When the <tt>New</tt> attribute is attached to a character string which
                   4875:   is inside a line broken element (inside a paragraph, for example), the bar
                   4876:   is one of the elements which participates in line breaking and it is placed
                   4877:   normally in the current line, at the end of the character string which has
1.37    ! cvs      4878:   the attribute. To avoid this, the <tt>InLine</tt> rule is used in the
1.30      cvs      4879:   following way:</p>
                   4880:   <pre>BOXES
1.1       cvs      4881:   VerticalBar:
                   4882:      BEGIN
                   4883:      Content: Graphics 'l';
                   4884:      HorizPos: Left = Root . Left;
                   4885:      VertPos: Top = Creator . Top;
                   4886:      Height: Bottom = Creator . Bottom;
                   4887:      Width: 1 pt;
                   4888:      InLine: No;
                   4889:      ...
                   4890:      END;
                   4891: ...
                   4892: ATTRIBUTES
                   4893:   Nouveau:
                   4894:      BEGIN
                   4895:      CreateAfter(VerticalBar);
1.18      cvs      4896:      END;</pre>
                   4897: </blockquote>
                   4898: </div>
                   4899: </div>
1.1       cvs      4900: 
1.18      cvs      4901: <div class="subsection">
1.37    ! cvs      4902: <h3><a name="sectc4223" id="sectc4223">Page breaking and line breaking
        !          4903: conditions</a></h3>
1.1       cvs      4904: 
1.30      cvs      4905: <p>Pages are constructed by the editor in accordance with the model specified
1.37    ! cvs      4906: by a <a href="#sectc4233"><tt>Page</tt> rule</a>. The page model describes
1.30      cvs      4907: only the composition of the pages but does not give any rules for breaking
1.37    ! cvs      4908: different element types across pages. Now, it is possible that certain
        !          4909: elements must not be cut by page breaks, while others can be cut anywhere.
        !          4910: The <tt>PageBreak</tt>, <tt>NoBreak1</tt>, and <tt>NoBreak2</tt> rules are
        !          4911: used to specify the conditions under which each element type can be cut.</p>
1.30      cvs      4912: 
                   4913: <p>The <tt>PageBreak</tt> rule is used to indicate whether or not the box can
1.37    ! cvs      4914: be cut during the construction of pages. If cutting is authorized, the box
        !          4915: can be cut, with one part appearing at the bottom of a page and the other
        !          4916: part appearing at the top of the next page. The rule is formed by the
1.18      cvs      4917: <tt>PageBreak</tt> keyword followed by a colon and a constant boolean value
1.37    ! cvs      4918: (<tt>Yes</tt> or <tt>No</tt>). This is the only form possible: this rule
        !          4919: cannot be inherited. Moreover, it can only appear in the rules of the primary
1.18      cvs      4920: view and applies to all views defined in the presentation schema.</p>
1.30      cvs      4921: 
                   4922: <p>Whether objects can be cut by line breaks can be controlled in a similar
1.37    ! cvs      4923: way using the <tt>LineBreak</tt> rule. This rule allows the specification of
        !          4924: whether or not the box can be cut during the construction of lines. If
1.1       cvs      4925: cutting is authorized, the box can be cut, with one part appearing at the end
1.37    ! cvs      4926: of a line and the other part appearing at the beginning of the next line. The
1.18      cvs      4927: rule is formed by the <tt>LineBreak</tt> keyword followed by a colon and a
1.37    ! cvs      4928: constant boolean value (<tt>Yes</tt> or <tt>No</tt>). This is the only form
        !          4929: possible: this rule cannot be inherited. Moreover, it can only appear in the
        !          4930: rules of the primary view and applies to all views defined in the
        !          4931: presentation schema.</p>
1.18      cvs      4932: <pre>               'PageBreak' ':' Boolean .
1.1       cvs      4933:                'LineBreak' ':' Boolean .
1.18      cvs      4934:      Boolean = 'Yes' / 'No' .</pre>
1.30      cvs      4935: 
                   4936: <p>When a box can be cut by a page break, it is possible that a page break
                   4937: will fall an inappropriate spot, creating, for example, a widow or orphan, or
1.37    ! cvs      4938: separating the title of a section from the first paragraph of the section.
        !          4939: The <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules are used to avoid this.
        !          4940: They specify that the box of the element to which they apply cannot be cut
        !          4941: within a certain zone at the top (<tt>NoBreak1</tt> rule) or at the bottom
        !          4942: (<tt>NoBreak2</tt> rule). These two rules specify the height of the zones in
1.18      cvs      4943: which page breaks are prohibited.</p>
1.30      cvs      4944: 
                   4945: <p>The <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules give the height of the
1.37    ! cvs      4946: zone in which page breaking is prohibited. The height is given as a constant
1.30      cvs      4947: value using any of the <a href="#sectc4217">available units</a>, absolute or
1.37    ! cvs      4948: relative. The value may not be inherited.</p>
1.18      cvs      4949: <pre>                   'NoBreak1' ':' AbsDist .
                   4950:                    'NoBreak2' ':' AbsDist .</pre>
1.30      cvs      4951: 
1.18      cvs      4952: <blockquote class="example">
1.30      cvs      4953:   <p><strong>Example:</strong></p>
                   4954: 
                   4955:   <p>The following rules prevent widows and orphans in a paragraph:</p>
                   4956:   <pre>Paragraph :
1.1       cvs      4957:    BEGIN
                   4958:    NoBreak1 : 2;
                   4959:    NoBreak2 : 2;
1.18      cvs      4960:    END;</pre>
1.30      cvs      4961: 
1.37    ! cvs      4962:   <p>This rule prevents a section title from becoming separated from the
        !          4963:   first paragraph of the section by prohibiting page breaks at the beginning
        !          4964:   of the section rule:</p>
1.30      cvs      4965:   <pre>Section :
1.18      cvs      4966:    NoBreak1 : 1.5 cm;</pre>
1.30      cvs      4967: 
                   4968:   <p>Finally, this rule prevents a figure from being page broken in any
                   4969:   way:</p>
                   4970:   <pre>Figure :
1.18      cvs      4971:    PageBreak : No;</pre>
                   4972: </blockquote>
1.30      cvs      4973: 
                   4974: <p>The Thot editor constructs the document images displayed on the screen
1.37    ! cvs      4975: dynamically. As the user moves in the document or makes the document scroll
1.1       cvs      4976: in a window, the editor constructs the image to be displayed in little bits,
1.37    ! cvs      4977: filling the gaps which are produced in the course of these operations. It
1.1       cvs      4978: stops filling in the image when an element reaches the edge of the window in
1.37    ! cvs      4979: which the gap appears. If the appearance of the document is complex, it is
1.1       cvs      4980: possible that the image in incomplete, even though the edge of the window was
1.37    ! cvs      4981: reached. For example, an element might need to be presented to the side of
        !          4982: the last element displayed, but its image was not constructed. The user will
1.1       cvs      4983: not know whether the element is really absent or if its image has simply not
1.18      cvs      4984: been constructed.</p>
1.30      cvs      4985: 
1.37    ! cvs      4986: <p>The <tt>Gather</tt> rule is used to remedy this problem. When the rule
1.18      cvs      4987: <tt>Gather : Yes;</tt> is associated with an element type, the image of such
                   4988: elements is constructed as a block by the editor: it is never split up.</p>
1.30      cvs      4989: 
                   4990: <p>The <tt>Gather</tt> rule may not appear in the <a href="#sectc427">default
1.37    ! cvs      4991: rules</a>. Elements which do not have the <tt>Gather</tt> rule are considered
        !          4992: susceptible to being split up during display. Thus, it is not necessary to
1.18      cvs      4993: use the <tt>Gather : No;</tt> form. This rule must be used prudently and only
1.37    ! cvs      4994: for those elements which truly need it. If used incorrectly, it can
1.18      cvs      4995: pointlessly increase the size of the image constructed by the editor and lead
                   4996: to excessive memory consumption by the editor.</p>
1.30      cvs      4997: 
                   4998: <p>Like the <tt>PageBreak</tt> and <tt>LineBreak</tt> rules, the
                   4999: <tt>Gather</tt> rule can only appear in rules of the primary view and applies
                   5000: to all views defined in the presentation schema.</p>
1.18      cvs      5001: <pre>                   'Gather' ':' Boolean .</pre>
                   5002: </div>
1.1       cvs      5003: 
1.18      cvs      5004: <div class="subsection">
1.37    ! cvs      5005: <h3><a name="sectc4224" id="sectc4224">Visibility</a></h3>
1.1       cvs      5006: 
1.34      cvs      5007: <p>The visibility property is used to control which elements should or should
1.37    ! cvs      5008: not be displayed, based on context. An element can have different
        !          5009: visibilities in different views. If an element's visibility is zero for a
        !          5010: view, that element is not displayed in that view and does not occupy any
        !          5011: space (its extents are zero).</p>
1.30      cvs      5012: 
1.37    ! cvs      5013: <p>Visibility takes non-negative integer values (positive or zero). If values
1.1       cvs      5014: greater than 1 are used, they allow the user to choose a degree of visibility
1.37    ! cvs      5015: and, thus, to see only those boxes whose visibility property exceeds a
        !          5016: certain threshold. This gives the user control over the granularity of the
        !          5017: displayed pictures.</p>
1.30      cvs      5018: 
1.34      cvs      5019: <p>The visibility property can be defined as a constant or by inheritance. If
1.1       cvs      5020: defined by inheritance, it cannot be based on the value of the next or
1.37    ! cvs      5021: previous box. Visibility can only be inherited from above.</p>
1.30      cvs      5022: 
                   5023: <p>If it is a numeric attribute's presentation rule, the visibility can be
1.37    ! cvs      5024: specified by the attribute's name, in which case the value of the attribute
        !          5025: is used.</p>
1.18      cvs      5026: <pre>                   'Visibility' ':' NumberInherit
1.1       cvs      5027:      NumberInherit = Integer / AttrID / Inheritance .
1.18      cvs      5028:      Integer       = NUMBER .</pre>
1.30      cvs      5029: 
1.18      cvs      5030: <blockquote class="example">
1.30      cvs      5031:   <p><strong>Example:</strong></p>
                   5032: 
                   5033:   <p>Suppose that only <tt>Formula</tt> elements should be displayed in the
1.37    ! cvs      5034:   <tt>MathView</tt> view. Then, the default rules should include:</p>
1.30      cvs      5035:   <pre>DEFAULT
1.18      cvs      5036:      IN MathView Visibility:0;</pre>
1.30      cvs      5037: 
1.31      cvs      5038:   <p>which makes all elements invisible in the <tt>MathView</tt> view.
1.30      cvs      5039:   However, the <tt>Formula</tt> element also has a <tt>Visibility</tt>
                   5040:   rule:</p>
                   5041:   <pre>Formula :
1.18      cvs      5042:      IN MathView Visibility:5;</pre>
1.30      cvs      5043: 
                   5044:   <p>which makes formulas, and only formulas, visible.</p>
1.18      cvs      5045: </blockquote>
                   5046: </div>
1.1       cvs      5047: 
1.18      cvs      5048: <div class="subsection">
1.37    ! cvs      5049: <h3><a name="sectc4225" id="sectc4225">Character style properties</a></h3>
1.1       cvs      5050: 
1.34      cvs      5051: <p>Four properties are used to determine which characters are used to display
1.37    ! cvs      5052: text. They are size, font, style, and underlining.</p>
1.1       cvs      5053: 
1.18      cvs      5054: <div class="subsubsection">
1.37    ! cvs      5055: <h4><a name="sectd42251" id="sectd42251">Character size</a></h4>
1.30      cvs      5056: 
1.37    ! cvs      5057: <p>The size property has two effects. First, it is used to specify the actual
1.34      cvs      5058: size and distance units for boxes defined in <a href="#sectc4217">relative
1.37    ! cvs      5059: units</a>. Second, it defines the size of the characters contained in the
1.34      cvs      5060: box.</p>
1.1       cvs      5061: 
1.30      cvs      5062: <p>As a distance or length, the size can be expressed in abstract or absolute
1.37    ! cvs      5063: units. It can also be inherited. If it is not inherited, it is expressed
        !          5064: simply as an integer followed by the <tt>pt</tt> keyword, which indicates
        !          5065: that the size is expressed in typographer's points. The absence of the
        !          5066: <tt>pt</tt> keyword indicates that it is in abstract units in which the value
        !          5067: 1 represents the smallest size while the value 16 is the largest size. The
        !          5068: relationship between these abstract sizes and the real character sizes is
        !          5069: controlled by a table which can be modified statically or even dynamically
        !          5070: during the execution of the Thot editor.</p>
1.30      cvs      5071: 
                   5072: <p>If the <tt>Size</tt> rule is a numeric attribute's presentation rule, the
1.34      cvs      5073: value of the size property can be specified by the attribute's name, in which
1.30      cvs      5074: case the value of the attribute is used.</p>
                   5075: 
1.37    ! cvs      5076: <p><strong>Note:</strong> the only unit available for defining an absolute
        !          5077: size is the typographer's point. Centimeters and inches may not be used.</p>
1.30      cvs      5078: 
                   5079: <p>If the size is inherited, the rule must specify the relative from which to
                   5080: inherit and any percentage or difference from that relative's value. A
                   5081: percentage is indicated by a <tt>*</tt> followed by the value of the
                   5082: percentage and a <tt>%</tt>. A difference can be expressed in either
                   5083: typographer's points or in abstract units and the maximum or minimum size can
1.37    ! cvs      5084: be specified, but without specifying the unit: it is the same as was
        !          5085: specified for the difference.</p>
1.30      cvs      5086: 
                   5087: <p>In a numeric attribute's presentation rule, the difference in size or the
1.22      cvs      5088: percentage can be indicated by the attribute's name instead of the numeric
1.37    ! cvs      5089: value, which means that the attribute's value should be used as the
        !          5090: difference or percentage. The attribute can also be used as the minimum or
        !          5091: maximum size for a difference.</p>
1.22      cvs      5092: <pre>                      'Size' ':' SizeInherit
                   5093:      SizeInherit     = SizeAttr [ 'pt' ] /
                   5094:                        Kinship InheritedSize .
                   5095:      InheritedSize   ='+' SizeAttr [ 'pt' ]
                   5096:                        [ 'Max' MaxSizeAttr ] /
                   5097:                       '-' SizeAttr [ 'pt' ]
                   5098:                        [ 'Min' MinSizeAttr ] /
                   5099:                       '*' PercentSizeAttr '%' /
                   5100:                       '=' .
                   5101:      SizeAttr        = Size / AttrID .
                   5102:      Size            = NUMBER .
                   5103:      MaxSizeAttr     = MaxSize / AttrID .
                   5104:      MaxSize         = NUMBER .
                   5105:      MinSizeAttr     = MinSize / AttrID .
                   5106:      MinSize         = NUMBER .
                   5107:      PercentSizeAttr = PercentSize / AttrID .
                   5108:      PercentSize     = NUMBER .</pre>
1.30      cvs      5109: 
1.18      cvs      5110: <blockquote class="example">
1.30      cvs      5111:   <p><strong>Example:</strong></p>
                   5112: 
                   5113:   <p>The rule</p>
                   5114:   <pre>Size : Enclosing - 2 pt Min 7;</pre>
                   5115: 
                   5116:   <p>states that the character size is 2 points less than that of the
                   5117:   enclosing box, but that it may not be less than 7 points, whatever the
                   5118:   enclosing box's value.</p>
                   5119: 
                   5120:   <p>The following rules make the text of a report be displayed with
                   5121:   medium-sized characters (for example, size 5), while the title is displayed
                   5122:   with larger characters and the summary is displayed with smaller
                   5123:   characters:</p>
                   5124:   <pre>Report :
1.1       cvs      5125:      Size : 5;
                   5126: Title :
                   5127:      Size : Enclosing + 2;
                   5128: Summary :
1.18      cvs      5129:      Size : Enclosing - 1;</pre>
1.30      cvs      5130: 
                   5131:   <p>Thus, the character sizes in the entire document can be changed by
1.34      cvs      5132:   changing the size property of the Report element, while preserving the
1.30      cvs      5133:   relationships between the sizes of the different elements.</p>
1.18      cvs      5134: </blockquote>
                   5135: </div>
                   5136: 
                   5137: <div class="subsubsection">
1.37    ! cvs      5138: <h4><a name="sectd42252" id="sectd42252">Font and character style</a></h4>
1.18      cvs      5139: 
1.37    ! cvs      5140: <p>The <tt>Font</tt> rule determines the font family to be used to display
        !          5141: the characters contained in the box, while the <tt>Style</tt> rule determines
        !          5142: their style and the <tt>Weight</tt> rule determines their weight. Thot
1.23      cvs      5143: recognizes three character fonts (Times, Helvetica, and Courier), three
                   5144: styles: Roman, Italics, and Oblique, and two weights: Normal and Bold.</p>
1.30      cvs      5145: 
                   5146: <p>The font family, style and weight can be specified by a named constant or
1.37    ! cvs      5147: can be inherited. For the name of the font family only the first character is
1.30      cvs      5148: used.</p>
                   5149: 
                   5150: <p>Only identical inheritance is allowed: the box takes the same font, style
1.37    ! cvs      5151: or weight as the box from which it inherits. This is indicated by an equals
1.23      cvs      5152: sign after the kinship specification.</p>
                   5153: <pre>               'Font' ':'          NameInherit /
                   5154:                'Style' ':'         StyleInherit /
                   5155:                'Weight' ':'        WeightInherit /
                   5156: 
                   5157: NameInherit   = Kinship '=' / FontName .
                   5158: FontName      = NAME .
                   5159: StyleInherit  = Kinship '=' /
                   5160:                 'Roman' / 'Italics' / 'Oblique' .
                   5161: WeightInherit = Kinship '=' /
                   5162:                 'Normal' / 'Bold' .</pre>
1.30      cvs      5163: 
1.18      cvs      5164: <blockquote class="example">
1.30      cvs      5165:   <p><strong>Example:</strong></p>
                   5166: 
                   5167:   <p>To specify that the summary uses the font family of the rest of the
                   5168:   document, but in the italic style, the following rules are used:</p>
                   5169:   <pre>Summary :
1.1       cvs      5170:    BEGIN
                   5171:    Font : Enclosing =;
                   5172:    Style : Italics;
1.18      cvs      5173:    END;</pre>
                   5174: </blockquote>
                   5175: </div>
                   5176: 
                   5177: <div class="subsubsection">
1.37    ! cvs      5178: <h4><a name="sectd42253" id="sectd42253">Underlining</a></h4>
1.18      cvs      5179: 
1.30      cvs      5180: <p>The <tt>Underline</tt> rule is used to specify if the characters contained
1.37    ! cvs      5181: in a box should have lines drawn on or near them. There are four underlining
1.18      cvs      5182: styles: <tt>Underlined</tt>, <tt>Overlined</tt>, <tt>CrossedOut</tt>, and
1.37    ! cvs      5183: <tt>NoUnderline</tt>. The <tt>Thickness</tt> rule specifies the thickness of
1.18      cvs      5184: the line, <tt>Thin</tt> or <tt>Thick</tt>.</p>
1.30      cvs      5185: 
                   5186: <p>As with font family and style, only identical inheritance is allowed: the
1.37    ! cvs      5187: box has the same underlining type as the box from which it inherits the
        !          5188: value. This is indicated by an equals sign after the kinship
        !          5189: specification.</p>
1.18      cvs      5190: <pre>                   'Underline' ':' UnderLineInherit /
1.1       cvs      5191:                    'Thickness' ':' ThicknessInherit /
                   5192: 
                   5193: UnderLineInherit = Kinship '=' / 'NoUnderline' /
                   5194:                    'Underlined' / 
                   5195:                    'Overlined' / 'CrossedOut' .
1.18      cvs      5196: ThicknessInherit = Kinship '=' / 'Thick' / 'Thin' .</pre>
                   5197: </div>
                   5198: </div>
                   5199: 
                   5200: <div class="subsection">
1.37    ! cvs      5201: <h3><a name="sectc4226" id="sectc4226">Stacking order</a></h3>
1.18      cvs      5202: 
1.30      cvs      5203: <p>The <tt>Depth</tt> rule is used to define the stacking order of terminal
1.37    ! cvs      5204: boxes when multiple boxes at least partially overlap. This rule defines how
        !          5205: the depth property, which is zero or a positive integer, is calculated. The
        !          5206: depth property has a value for all boxes. For terminal boxes in the structure
1.34      cvs      5207: and for presentation boxes, the depth value is used during display and
                   5208: printing: the boxes with the lowest value overlap those with higher depths.
1.37    ! cvs      5209: For non-terminal boxes, the depth is not interpreted during display, but it
        !          5210: is used to calculate the depth of terminal boxes by inheritance.</p>
1.30      cvs      5211: 
                   5212: <p>Like most other rules, the depth rule is defined in the <a
1.37    ! cvs      5213: href="#sectc427">default rules</a> of each presentation schema. Thus, there
1.18      cvs      5214: is always a depth value, even when it is not necessary because there is no
1.37    ! cvs      5215: overlapping. To avoid useless operations, a zero value can be given to the
1.34      cvs      5216: depth property, which signifies that overlapping is never a problem.</p>
1.30      cvs      5217: 
                   5218: <p>The depth rule has the same form as the <a href="#sectc4224">visibility
1.18      cvs      5219: rule</a>. It can be defined by inheritance or by a constant numeric value.
                   5220: When the rule is attached to a numeric attribute, it can take the value of
                   5221: that attribute.</p>
                   5222: <pre>                'Depth' ':' NumberInherit</pre>
1.30      cvs      5223: 
1.18      cvs      5224: <blockquote class="example">
1.30      cvs      5225:   <p><strong>Example:</strong></p>
                   5226: 
                   5227:   <p>For a purely textual document, in which overlapping never poses a
                   5228:   problem, a single default <tt>Depth</tt> rule in the presentation schema is
                   5229:   sufficient:</p>
                   5230:   <pre>DEFAULT
1.1       cvs      5231:     Depth : 0;
1.18      cvs      5232:     ...</pre>
1.30      cvs      5233: 
                   5234:   <p>To make the text of examples appear on a light blue background, a
                   5235:   presentation box is defined:</p>
                   5236:   <pre>BOXES
1.1       cvs      5237:    BlueBG :
                   5238:       BEGIN
                   5239:       Content : Graphics 'R';
                   5240:       Background : LightBlue3;
                   5241:       FillPattern: backgroundcolor;
                   5242:       Depth : 2;
                   5243:       ...
1.18      cvs      5244:       END;</pre>
1.30      cvs      5245: 
                   5246:   <p>and is created by the <tt>Example</tt> element, which has the rules:</p>
                   5247:   <pre>RULES
1.1       cvs      5248:    Example :
                   5249:       BEGIN
                   5250:       CreateFirst (BlueBG);
                   5251:       Depth : 1;
                   5252:       ...
1.18      cvs      5253:       END;</pre>
1.30      cvs      5254: 
                   5255:   <p>In this way, the text of an example (if it inherits its depth from its
                   5256:   ancestor) will be superimposed on a light blue background, and not the
                   5257:   reverse).</p>
1.18      cvs      5258: </blockquote>
                   5259: </div>
                   5260: 
                   5261: <div class="subsection">
1.37    ! cvs      5262: <h3><a name="sectc4227" id="sectc4227">Line style</a></h3>
1.18      cvs      5263: 
1.30      cvs      5264: <p>The <tt>LineStyle</tt> rule determines the style of line which should be
                   5265: used to draw all the elements contained in the box and the box itself, if it
1.37    ! cvs      5266: has a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>. The line style can be
1.18      cvs      5267: indicated by a name (<tt>Solid</tt>, <tt>Dashed</tt>, <tt>Dotted</tt>) or it
1.37    ! cvs      5268: can be inherited. All elements of the graphic base type are affected by this
1.1       cvs      5269: rule, but it can be attached to any box and transmitted by inheritance to the
1.37    ! cvs      5270: graphic elements. The border of elements having a <a
1.18      cvs      5271: href="#sectc4230a"><tt>ShowBox</tt> rule</a> is drawn according to the line
                   5272: style specified by this rule.</p>
1.30      cvs      5273: 
1.37    ! cvs      5274: <p>Only identical inheritance is allowed: the box takes the same line style
        !          5275: as the box from which it inherits. This is indicated by an equals sign after
        !          5276: the kinship specification.</p>
1.18      cvs      5277: <pre>                      'LineStyle' ':' LineStyleInherit
1.1       cvs      5278:      LineStyleInherit = Kinship '=' /
1.18      cvs      5279:                       'Solid' / 'Dashed' / 'Dotted' .</pre>
1.30      cvs      5280: 
1.18      cvs      5281: <blockquote class="example">
1.30      cvs      5282:   <p><strong>Example:</strong></p>
                   5283: 
1.37    ! cvs      5284:   <p>To specify that, in Figures, the graphical parts should be drawn in
        !          5285:   solid lines, the Figure element is given a rule using the <tt>Solid</tt>
        !          5286:   name:</p>
1.30      cvs      5287:   <pre>Figure :
1.18      cvs      5288:    LineStyle : Solid;</pre>
1.30      cvs      5289: 
                   5290:   <p>and the elements composing figures are given an inheritance rule:</p>
                   5291:   <pre>   LineStyle : Enclosing =;</pre>
1.18      cvs      5292: </blockquote>
                   5293: </div>
                   5294: 
                   5295: <div class="subsection">
1.37    ! cvs      5296: <h3><a name="sectc4228" id="sectc4228">Line thickness</a></h3>
1.18      cvs      5297: 
1.37    ! cvs      5298: <p>The <tt>LineWeight</tt> rule determines the thickness of the lines of all
1.1       cvs      5299: graphical elements which appear in the box, no matter what their line style.
1.37    ! cvs      5300: Line thickness can be specified by a constant value or by inheritance. A
        !          5301: constant value is a positive number followed by an optional unit
        !          5302: specification (which is absent when using relative units). All available <a
        !          5303: href="#sectc4217">distance units</a> can be used. Line thickness is expressed
1.18      cvs      5304: in the same way as <a href="#sectd42221">line spacing</a>.</p>
                   5305: <pre>                 'LineWeight' ':' DistOrInherit</pre>
1.30      cvs      5306: 
1.37    ! cvs      5307: <p>All elements of the graphic base type are affected by this rule, but it
        !          5308: can be attached to any box and transmitted by inheritance to the graphic
        !          5309: elements. The border of element having a <a
        !          5310: href="#sectc4230a"><tt>ShowBox</tt> rule</a> is also drawn according to the
        !          5311: thickness specified by this rule.</p>
1.30      cvs      5312: 
1.18      cvs      5313: <blockquote class="example">
1.30      cvs      5314:   <p><strong>Example:</strong></p>
                   5315: 
                   5316:   <p>To specify that, in Figures, the graphical parts should be drawn with
                   5317:   lines 0.3 pt thick, the Figure element is given this rule:</p>
                   5318:   <pre>Figure :
1.18      cvs      5319:    LineWeight : 0.3 pt;</pre>
1.30      cvs      5320: 
                   5321:   <p>and the elements composing figures are given an inheritance rule:</p>
                   5322:   <pre>   LineWeight : Enclosing =;</pre>
1.18      cvs      5323: </blockquote>
                   5324: </div>
                   5325: 
                   5326: <div class="subsection">
1.37    ! cvs      5327: <h3><a name="sectc4229" id="sectc4229">Fill pattern</a></h3>
1.18      cvs      5328: 
1.30      cvs      5329: <p>The <tt>FillPattern</tt> rule determines the pattern used to fill closed
1.37    ! cvs      5330: graphical elements (circles, rectangles, etc.) which appear in the box. This
1.18      cvs      5331: rule also specifies the pattern used to fill the box associated with elements
1.37    ! cvs      5332: having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a><a>. This pattern can
        !          5333: be indicated by a named constant or by inheritance. The named constant
        !          5334: identifies one of the patterns available in Thot. The names of the available
1.18      cvs      5335: patterns are: nopattern, foregroundcolor, backgroundcolor, gray1, gray2,
                   5336: gray3, gray4, gray5, gray6, gray7, horiz1, horiz2, horiz3, vert1, vert2,
1.37    ! cvs      5337: vert3, left1, left2, left3, right1, right2, right3, square1, square2,
        !          5338: square3, lozenge, brick, tile, sea, basket.</a></p>
1.30      cvs      5339: 
                   5340: <p>Like the other rules peculiar to graphics, <tt>LineStyle</tt> and
1.18      cvs      5341: <tt>LineWeight</tt>, only elements of the graphic base type are affected by
                   5342: the <tt>FillPattern</tt> rule, but the rule can be attached to any box and
1.37    ! cvs      5343: transmitted by inheritance to the graphic elements. As with the other rules
1.18      cvs      5344: specific to graphics, only identical inheritance is allowed.</p>
1.30      cvs      5345: 
                   5346: <p>The <tt>FillPattern</tt> rule can also be used to determine whether or not
1.37    ! cvs      5347: text characters, symbols and pictures should be colored. For these element
1.12      cvs      5348: types (text, symbols, and pictures), the only valid values are
1.18      cvs      5349: <tt>nopattern</tt>, <tt>foregroundcolor</tt>, and <tt>backgroundcolor</tt>.
                   5350: When <tt>FillPattern</tt> has the value <tt>backgroundcolor</tt>, text
                   5351: characters, symbols, and bitmaps are given the color specified by the <a
                   5352: href="#sectc4230"><tt>Background</tt> rule</a> which applies to these
1.37    ! cvs      5353: elements. When <tt>FillPattern</tt> has the value <tt>foregroundcolor</tt>,
1.18      cvs      5354: these same elements are given the color specified by the <a
                   5355: href="#sectc4230"><tt>Foreground</tt> rule</a> which applies to these
1.37    ! cvs      5356: elements. In all other case, text characters are not colored.</p>
1.18      cvs      5357: <pre>                 'FillPattern' ':' NameInherit</pre>
1.30      cvs      5358: 
1.18      cvs      5359: <blockquote class="example">
1.30      cvs      5360:   <p><strong>Example:</strong></p>
                   5361: 
                   5362:   <p>To specify that, in Figures, the closed graphical elements should be
                   5363:   filled with a pattern resembling a brick wall, the Figure element is given
                   5364:   this rule:</p>
                   5365:   <pre>Figure :
1.18      cvs      5366:    FillPattern : brick;</pre>
1.30      cvs      5367: 
                   5368:   <p>and the elements composing figures are given an inheritance rule:</p>
                   5369:   <pre>   FillPattern : Enclosing =;</pre>
1.18      cvs      5370: </blockquote>
                   5371: </div>
                   5372: 
                   5373: <div class="subsection">
1.37    ! cvs      5374: <h3><a name="sectc4230" id="sectc4230">Colors</a></h3>
1.18      cvs      5375: 
1.30      cvs      5376: <p>The <tt>Foreground</tt> and <tt>Background</tt> rules determine the
1.37    ! cvs      5377: foreground and background colors of the base elements which appear in the
        !          5378: box. They also control the color of boxes associated with elements having a
        !          5379: <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>. These colors can be
        !          5380: specified with a named constant or by inheritance. The named constants
        !          5381: specify one of the available colors in Thot. The available color names can be
        !          5382: found in the file <tt>thot.color</tt>. In addition to those names, you can
        !          5383: use the keyword <code>Transparent</code>, to not draw anything.</p>
        !          5384: 
        !          5385: <p>The color rules affect the same way all base elements and elements having
        !          5386: a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>, no matter what their type
        !          5387: (text, graphics, pictures, symbols). The color rules can be associated with
1.30      cvs      5388: any box and can be transmitted by inheritance to the base elements or the
1.37    ! cvs      5389: elements having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>. Like the
1.30      cvs      5390: preceding rules, only inheritance of the same value is allowed.</p>
                   5391: <pre>                 'Foreground' ':' Color
                   5392:                  'Background' ':' Color
                   5393:       Color = 'Transparent' / Link '=' / FontColorName .</pre>
                   5394: 
                   5395: <p><strong>Note:</strong> text colors only appear for text elements whose <a
1.18      cvs      5396: href="#sectc4229">fill pattern</a> does not prevent the use of color.</p>
1.30      cvs      5397: 
1.18      cvs      5398: <blockquote class="example">
1.30      cvs      5399:   <p><strong>Example:</strong></p>
                   5400: 
                   5401:   <p>To specify that, in Figures, everything must be drawn in blue on a
                   5402:   background of yellow, the Figure element is given these rules:</p>
                   5403:   <pre>Figure :
1.1       cvs      5404:    BEGIN
                   5405:    Foreground : Blue;
                   5406:    Background : Yellow;
                   5407:    Fillpattern : backgroundcolor;
1.18      cvs      5408:    END;</pre>
1.30      cvs      5409: 
                   5410:   <p>and the elements composing figures are given inheritance rules:</p>
                   5411:   <pre>   Foreground : Enclosing =;
1.1       cvs      5412:    Background : Enclosing =;
1.18      cvs      5413:    FillPattern : Enclosing =;</pre>
                   5414: </blockquote>
                   5415: </div>
                   5416: 
                   5417: <div class="subsection">
1.37    ! cvs      5418: <h3><a name="sectc4230a" id="sectc4230a">Background color and border</a></h3>
1.18      cvs      5419: 
1.30      cvs      5420: <p>Boxes associated with structural elements are normally not visible, but it
1.37    ! cvs      5421: is possible to draw their border and/or to paint their area when it is
        !          5422: needed. This is achieved by associating the <tt>ShowBox</tt> rule with the
        !          5423: concerned element. This rule has no parameter and no value. It is simply
        !          5424: written <tt>Showbox;</tt>. It is not inherited nor transmitted to any other
        !          5425: element. It applies only to the element with which it is associated.</p>
1.18      cvs      5426: <pre>                 'ShowBox'</pre>
1.30      cvs      5427: 
                   5428: <p>When an element has a <tt>ShowBox</tt> rule, the border is drawn only if
1.37    ! cvs      5429: the <tt>LineWeight</tt> rule that applies to that element has a non-zero
        !          5430: value (this value can be inherited). The color, style and thickness of the
        !          5431: border are defined by the <tt>Foreground</tt>, <tt>LineStyle</tt>, and
1.18      cvs      5432: <tt>LineWeight</tt> rules that apply to the element.</p>
1.30      cvs      5433: 
1.37    ! cvs      5434: <p>When an element has a <tt>ShowBox</tt> rule, the background of this
        !          5435: element is paint only if the value of the <tt>FillPattern</tt> rule that
        !          5436: applies to that element is not <tt>nopattern</tt>. The pattern and color(s)
        !          5437: of the background are defined by the <tt>FillPattern</tt>,
        !          5438: <tt>Background</tt>, and <tt>Foreground</tt> rules that apply to the
        !          5439: element.</p>
1.18      cvs      5440: </div>
                   5441: 
                   5442: <div class="subsection">
1.37    ! cvs      5443: <h3><a name="sectc4230b" id="sectc4230b">Background pictures</a></h3>
1.18      cvs      5444: 
1.30      cvs      5445: <p>The <tt>BackgroundPicture</tt> rule allows to display a picture as the
1.37    ! cvs      5446: background of an element. It has a single parameter, the file name of the
        !          5447: picture. This is a string delimited by single quotes. If the first character
1.18      cvs      5448: in this string is '/', it is considered as an absolute path, otherwise the
1.37    ! cvs      5449: file is searched for along the schema directory path. This file may contain a
1.18      cvs      5450: picture in any format accepted by Thot (xbm, xpm, gif, jpeg, png, etc.)</p>
1.30      cvs      5451: 
1.37    ! cvs      5452: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only
        !          5453: to the element with which they are associated. They are not inherited nor
1.18      cvs      5454: transmitted to children elements.</p>
1.30      cvs      5455: 
                   5456: <p>The background picture has not always the same size as the element's box.
1.37    ! cvs      5457: There are diffrent ways to fill the element box with the picture. This is
1.18      cvs      5458: specified by the <tt>PictureMode</tt> rule, which should be associated to the
1.37    ! cvs      5459: same element. This rule may take one of the following values:</p>
1.18      cvs      5460: <dl>
1.30      cvs      5461:   <dt><tt>NormalSize</tt></dt>
                   5462:     <dd>The picture is centered in the box, and clipped if it is too
                   5463:     large.</dd>
                   5464:   <dt><tt>Scale</tt></dt>
                   5465:     <dd>The picture is zoomed to fit the box size.</dd>
                   5466:   <dt><tt>RepeatX</tt></dt>
                   5467:     <dd>The picture is repeated horizontally to fit the box width.</dd>
                   5468:   <dt><tt>RepeatY</tt></dt>
                   5469:     <dd>The picture is repeated vertically to fit the box height.</dd>
                   5470:   <dt><tt>RepeatXY</tt></dt>
                   5471:     <dd>The picture is repeated both horizontally and vertically to fill the
                   5472:       box.</dd>
1.18      cvs      5473: </dl>
1.30      cvs      5474: 
                   5475: <p>If an element has a <tt>BackgroundPicture</tt> rule and no
1.18      cvs      5476: <tt>PictureMode</tt> rule, the <tt>NormalSize</tt> value is assumed.</p>
                   5477: <pre>                 'BackgroundPicture' ':' FileName /
1.13      cvs      5478:                  'PictureMode' ':' PictMode .
                   5479:  
                   5480:       FileName = STRING .
1.18      cvs      5481:       PictMode = 'NormalSize' / 'Scale' / 'RepeatXY' / 'RepeatX' / 'RepeatY' .</pre>
1.30      cvs      5482: 
1.37    ! cvs      5483: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only
        !          5484: to the element with which they are associated. They are not inherited nor
1.18      cvs      5485: transmitted to children elements.</p>
                   5486: </div>
1.13      cvs      5487: 
1.18      cvs      5488: <div class="subsection">
1.37    ! cvs      5489: <h3><a name="sectc4231" id="sectc4231">Presentation box content</a></h3>
1.1       cvs      5490: 
1.37    ! cvs      5491: <p>The <tt>Content</tt> rule applies to presentation boxes. It indicates the
        !          5492: content given to a box. This content is either a variable's value or a
        !          5493: constant value.</p>
1.30      cvs      5494: 
                   5495: <p>If the content is a constant, it can be specified, as in a variable
1.18      cvs      5496: declaration, either by the name of a constant declared in the <tt>CONST</tt>
1.1       cvs      5497: section or by direct specification of the type and value of the box's
1.18      cvs      5498: content.</p>
1.30      cvs      5499: 
                   5500: <p>Similarly, if it is a variable, the name of a variable declared in
1.18      cvs      5501: <tt>VAR</tt> section can be given or the variable may be defined within
1.37    ! cvs      5502: parentheses. The content inside the parentheses has the same syntax as a <a
1.18      cvs      5503: href="#sectc426">variable declaration</a>.</p>
                   5504: <pre>               'Content' ':' VarConst
1.1       cvs      5505:      VarConst = ConstID / ConstType ConstValue /
1.37    ! cvs      5506:                 VarID / '(' FunctionSeq ')' .
        !          5507: </pre>
1.30      cvs      5508: 
                   5509: <p>A presentation box can have only one <tt>Content</tt> rule, which means
1.37    ! cvs      5510: that the content of a presentation box cannot vary from view to view.
        !          5511: However, such an effect can be achieved by creating several presentation
        !          5512: boxes, each with different content and visible in different views.</p>
        !          5513: 
        !          5514: <p>The <tt>Content</tt> rule also applies to elements defined as references
        !          5515: in the structure schema. In this case, the content defined by the rule must
        !          5516: be a constant. It is this content which appears on the screen or paper to
        !          5517: represent references of the type to which the rule applies. A reference can
1.18      cvs      5518: have a <tt>Content</tt> rule or a <a href="#sectc4234"><tt>Copy</tt> rule</a>
1.37    ! cvs      5519: for each view. If neither of these rules appears, the reference is displayed
1.18      cvs      5520: as <tt>[*]</tt>, which is equivalent to the rule:</p>
                   5521: <pre>     Content: Text '[*]';</pre>
1.30      cvs      5522: 
1.18      cvs      5523: <blockquote class="example">
1.30      cvs      5524:   <p><strong>Example:</strong></p>
                   5525: 
                   5526:   <p>The content of the presentation box created to make the chapter number
                   5527:   and section number appear before each section title can be defined by:</p>
                   5528:   <pre>BOXES
1.1       cvs      5529:      SectionNumBox :
                   5530:           BEGIN
                   5531:           Content : NumSection;
                   5532:           ...
1.18      cvs      5533:           END;</pre>
1.30      cvs      5534: 
                   5535:   <p>if the <tt>NumSection</tt> variable has been defined in the variable
1.37    ! cvs      5536:   definition section of the presentation schema. Otherwise the
1.30      cvs      5537:   <tt>Content</tt> would be written:</p>
                   5538:   <pre>BOXES
1.1       cvs      5539:      SectionNumBox :
                   5540:           BEGIN
                   5541:           Content : (VALUE (ChapterCtr, Roman) TEXT '.'
                   5542:                      VALUE (SectionCtr, Arabic));
                   5543:           ...
1.18      cvs      5544:           END;</pre>
                   5545: </blockquote>
                   5546: </div>
1.1       cvs      5547: 
1.18      cvs      5548: <div class="subsection">
1.37    ! cvs      5549: <h3><a name="sectc4232" id="sectc4232">Presentation box creation</a></h3>
1.1       cvs      5550: 
1.37    ! cvs      5551: <p>A creation rule specifies that a presentation box should be created when
        !          5552: an element of the type to which the rule is attached appears in the
        !          5553: document.</p>
1.30      cvs      5554: 
                   5555: <p>A keyword specifies the position, relative to the creating box, at which
                   5556: the created box will be placed in the structure:</p>
1.18      cvs      5557: <dl>
1.30      cvs      5558:   <dt><tt>CreateFirst</tt></dt>
                   5559:     <dd>specifies that the box should be created as the first box of the next
                   5560:       lower level, before any already existing boxes, and only if the
                   5561:       beginning of the creating element is visible;</dd>
                   5562:   <dt><tt>CreateLast</tt></dt>
                   5563:     <dd>specifies that the box should be created as the last box of the next
                   5564:       lower level, after any existing boxes, and only if the end of the
                   5565:       creating element is visible;</dd>
                   5566:   <dt><tt>CreateBefore</tt></dt>
                   5567:     <dd>specifies that the box should be created before the creating box, on
                   5568:       the same level as the creating box, and only if the beginning of the
                   5569:       creating element is visible;</dd>
                   5570:   <dt><tt>CreateAfter</tt></dt>
                   5571:     <dd>specifies that the box should be created after the creating box, on
                   5572:       the same level as the creating box, and only if the beginning of the
                   5573:       creating element is visible;</dd>
                   5574:   <dt><tt>CreateEnclosing</tt></dt>
1.37    ! cvs      5575:     <dd>specifies that the box should be created at the upper level
        !          5576:       relatively to the creating box, and that it must contain that creating
        !          5577:       box and all presentation boxes created by the same creating box.</dd>
1.18      cvs      5578: </dl>
1.30      cvs      5579: 
                   5580: <p>This keyword can be followed by the <tt>Repeated</tt> keyword to indicate
                   5581: that the box must be created for each part of the creating element. These
                   5582: parts result from the division of the element by page breaks or column
1.37    ! cvs      5583: changes. If the <tt>Repeated</tt> keyword is missing, the box is only created
1.30      cvs      5584: for the first part of the creating element (<tt>CreateFirst</tt> and
1.18      cvs      5585: <tt>CreateBefore</tt> rules) or for the last part (<tt>CreateLast</tt> and
                   5586: <tt>CreateAfter</tt> rules).</p>
1.30      cvs      5587: 
                   5588: <p>The type of presentation to be created is specified at the end of the rule
1.18      cvs      5589: between parentheses.</p>
1.30      cvs      5590: 
                   5591: <p>Creation rules cannot appear in the <a href="#sectc427">default
1.37    ! cvs      5592: presentation rules</a>. The boxes being created should have a
1.30      cvs      5593: <tt>Content</tt> rule which indicates their <a
                   5594: href="#sectc4231">content</a>.</p>
                   5595: 
                   5596: <p>Creation rules can only appear in the block of rules for the primary view;
1.1       cvs      5597: creation is provoked by a document element for all views. However, for each
1.37    ! cvs      5598: view, the presentation box is only created if the creating element is itself
        !          5599: a box in the view. Moreover, the visibility property of the presentation box
        !          5600: can be adjusted to control the creation of the box on a view-by-view
        !          5601: basis.</p>
1.18      cvs      5602: <pre>                     Creation '(' BoxID ')'
1.1       cvs      5603:      Creation      = Create [ 'Repeated' ] .
                   5604:      Create        ='CreateFirst' / 'CreateLast' /
                   5605:                     'CreateBefore' / 'CreateAfter' /
1.18      cvs      5606:                     'CreateEnclosing' .</pre>
1.30      cvs      5607: 
1.18      cvs      5608: <blockquote class="example">
1.30      cvs      5609:   <p><strong>Example:</strong></p>
                   5610: 
                   5611:   <p>Let us define an object type, called Table, which is composed of a
                   5612:   sequence of columns, all having the same fixed width, where the columns are
1.37    ! cvs      5613:   separated by vertical lines. There is a line to the left of the first
        !          5614:   column and one to the right of the last. Each column has a variable number
1.31      cvs      5615:   of cells, placed one on top of the other and separated by horizontal lines.
                   5616:   There are no horizontal lines above the first cell or below the last cell.
1.37    ! cvs      5617:   The text contained in each cell is broken into lines and these lines are
1.30      cvs      5618:   centered horizontally in the cell. The logical structure of this object is
                   5619:   defined by:</p>
                   5620:   <pre>Table   = LIST OF (Column);
1.18      cvs      5621: Column  = LIST OF (Cell = Text);</pre>
                   5622: 
1.30      cvs      5623:   <div class="figure">
1.37    ! cvs      5624:   <hr />
1.30      cvs      5625:   <pre>|                |                |               |
1.1       cvs      5626: |  xx xxxx xxxx  |x xxxx xxx xxxxx|  x xxx x xxx  |
                   5627: | xxx xxx xxxx x |   x xx x xxx   | xxxxx xxxx xx |
                   5628: |   xxxxx xxxx   |----------------|  xxx xxxxx x  |
                   5629: | xxxxx xxx xxxx | xxxx xx xx xxx |     xx xx     |
                   5630: | xxx xxxx x xxx |  xxxx x xxx x  |---------------|
                   5631: |----------------| xxx xxxx xxxxx |  xxxxx xxxxx  |
                   5632: | xxx xxx xxxxxx |----------------| xxx xxxx xxxx |
                   5633: |  xxxx xxxx xx  |  xxxx xx x xx  |  xxx xx x xx  |
                   5634: |----------------| xxx xxxxx xxxx | xxxx xxxx xxx |
                   5635: | xxxxx xxx xxxx |  xxxx xx x xx  |   xxxxx xxx   |
1.18      cvs      5636: |xxxx xx x xxxxxx| xxxx xx xxxxxx |  xxxxx xxxxx  |</pre>
1.19      cvs      5637: 
1.37    ! cvs      5638:   <p align="center"><em><a name="table" id="table">The design of a
        !          5639:   table</a></em></p>
        !          5640:   <hr />
1.30      cvs      5641:   </div>
                   5642: 
                   5643:   <p>The presentation of the table should resemble the design of the above <a
1.37    ! cvs      5644:   href="#table">figure</a>. It is defined by the following presentation
1.30      cvs      5645:   schema fragment:</p>
                   5646:   <pre>BOXES
1.1       cvs      5647:      VertLine : BEGIN
                   5648:                 Width : 0.3 cm;
                   5649:                 Height : Enclosing . Height;
                   5650:                 VertPos : Top = Enclosing . Top;
                   5651:                 HorizPos : Left = Previous . Right;
                   5652:                 Content : Graphics 'v';
                   5653:                 END;
                   5654: 
                   5655:      HorizLine: BEGIN
                   5656:                 Width : Enclosing . Width;
                   5657:                 Height : 0.3 cm;
                   5658:                 VertPos : Top = Previous . Bottom;
                   5659:                 HorizPos : Left = Enclosing . Left;
                   5660:                 Content : Graphics 'h';
                   5661:                 END;
                   5662: 
                   5663: RULES
1.6       cvs      5664:      Column   : BEGIN
                   5665:                 CreateBefore (VertLine);
                   5666:                 IF LAST CreateAfter (VertLine);
                   5667:                 Width : 2.8 cm;
                   5668:                 Height : Enclosed . Height;
                   5669:                 VertPos : Top = Enclosing . Top;
                   5670:                 HorizPos : Left = Previous . Right;
                   5671:                 END;
                   5672: 
                   5673:      Cell     : BEGIN
                   5674:                 IF NOT FIRST CreateBefore (HorizLine);
                   5675:                 Width : Enclosing . Width;
                   5676:                 Height : Enclosed . Height;
                   5677:                 VertPos : Top = Previous . Bottom;
                   5678:                 HorizPos : Left = Enclosing . Left;
                   5679:                 Line;
                   5680:                 Adjust : VMiddle;
1.18      cvs      5681:                 END;</pre>
1.30      cvs      5682: 
                   5683:   <p>It is useful to note that the horizontal position rule of the first
                   5684:   vertical line will not be applied, since there is no preceding box. In this
                   5685:   case, the box is simply placed on the left side of the enclosing box.</p>
1.18      cvs      5686: </blockquote>
                   5687: </div>
                   5688: 
                   5689: <div class="subsection">
1.37    ! cvs      5690: <h3><a name="sectc4233" id="sectc4233">Page layout</a></h3>
1.18      cvs      5691: 
1.30      cvs      5692: <p>The page models specified in the <tt>Page</tt> rule are defined by boxes
1.37    ! cvs      5693: declared in the <tt>BOXES</tt> section of the presentation schema. Pages are
1.1       cvs      5694: not described as frames which will be filled by the document's text, but as
                   5695: element are inserted in the flow of the document and which mark the page
1.37    ! cvs      5696: breaks. Each of these page break elements contains presentation boxes which
1.1       cvs      5697: represent the footer boxes of a page followed by header boxes of the next
1.37    ! cvs      5698: page. The page box itself is the simple line which separates two pages on the
        !          5699: screen. Both the footer and header boxes placed themselves with respect to
1.1       cvs      5700: this page box, with the footer being placed above it and the header boxes
1.18      cvs      5701: being placed above it.</p>
1.30      cvs      5702: 
                   5703: <p>The boxes created by a page box are headers and footers and can only place
1.1       cvs      5704: themselves vertically with respect to the page box itself (which is in fact
1.37    ! cvs      5705: the separation between two pages). Besides, it is their vertical position
        !          5706: rule which determines whether they are header or footer boxes. Header and
1.1       cvs      5707: footer boxes must have an explicit vertical position rule (they must not use
1.18      cvs      5708: the default rule).</p>
1.30      cvs      5709: 
                   5710: <p>Footer boxes must have an absolute height or inherit the height of their
1.18      cvs      5711: contents:</p>
                   5712: <pre>Height : Enclosed . Height;</pre>
1.30      cvs      5713: 
                   5714: <p>A page box must have height and width rules and these two rules must be
1.1       cvs      5715: specified with constant values, expressed in centimeters, inches, or
1.37    ! cvs      5716: typographer's points. These two rules are interpreted in a special way for
        !          5717: page boxes: they determine the width of the page and the vertical distance
1.1       cvs      5718: between two page separators, which is the height of the page and its header
1.18      cvs      5719: and footer together.</p>
1.30      cvs      5720: 
                   5721: <p>A page box should also have vertical and horizontal position rules and
                   5722: these two rules should specify the position on the sheet of paper of the
1.37    ! cvs      5723: rectangle enclosing the page's contents. These two rules must position the
1.30      cvs      5724: upper left corner of the enclosing rectangle in relation to the upper left
1.37    ! cvs      5725: corner of the sheet of paper, considered to be the enclosing element. In both
1.30      cvs      5726: rules, distances must be expressed in fixed units: centimeters (<tt>cm</tt>),
1.37    ! cvs      5727: inches (<tt>in</tt>), or typographer's points (<tt>pt</tt>). Thus, rules
1.30      cvs      5728: similar to the following should be found in the rules for a page box:</p>
1.18      cvs      5729: <pre>BOXES
1.1       cvs      5730:    ThePage :
                   5731:       BEGIN
                   5732:       VertPos : Top = Enclosing . Top + 3 cm;
                   5733:       HorizPos : Left = Enclosing . Left + 2.5 cm;
                   5734:       Width : 16 cm;
                   5735:       Height : 22.5 cm;
1.18      cvs      5736:       END;</pre>
1.30      cvs      5737: 
                   5738: <p>When a document must be page broken, the page models to be constructed are
1.18      cvs      5739: defined in the <tt>BOXES</tt> section of the presentation schema by declaring
1.37    ! cvs      5740: page boxes and header and footer boxes. Also, the <tt>Page</tt> rule is used
        !          5741: to specify to which parts of the document and to which views each model
        !          5742: should be applied.</p>
1.30      cvs      5743: 
                   5744: <p>The <tt>Page</tt> rule has only one parameter, given between parentheses
1.37    ! cvs      5745: after the <tt>Page</tt> keyword. This parameter is the name of the box which
        !          5746: must serve as the model for page construction. When a <tt>Page</tt> rule is
1.1       cvs      5747: attached to an element type, each time such an element appears in a document,
                   5748: a page break takes place and the page model indicated in the rule is applied
                   5749: to all following pages, until reaching the next element which has a
1.18      cvs      5750: <tt>Page</tt> rule.</p>
1.30      cvs      5751: 
                   5752: <p>The <tt>Page</tt> rule applies to only one view; if it appears in the
1.37    ! cvs      5753: primary view's block of rules, a <tt>Page</tt> rule applies only to that
        !          5754: view. Thus, different page models can be defined for the full document and
        !          5755: for its table of contents, which is another view of the same document. Some
        !          5756: views can be specified with pages, and other views of the same document can
        !          5757: be specified without pages.</p>
1.18      cvs      5758: <pre>                   'Page' '(' BoxID ')'</pre>
                   5759: </div>
                   5760: 
                   5761: <div class="subsection">
1.37    ! cvs      5762: <h3><a name="sectc4234" id="sectc4234">Box copies</a></h3>
1.18      cvs      5763: 
1.30      cvs      5764: <p>The <tt>Copy</tt> rule can be used for an element which is defined as a
1.37    ! cvs      5765: reference in the structure schema. In this case, the rule specifies, between
1.18      cvs      5766: parenthesis, the name of the box (declared in the <tt>BOXES</tt> section)
1.1       cvs      5767: which must be produced when this reference appears in the structure of a
1.37    ! cvs      5768: document. The box produced is a copy (same contents, but possible different
1.1       cvs      5769: presentation) of the box type indicated by the parameter between parentheses,
1.37    ! cvs      5770: and which is in the element designated by the reference. The name of a box
1.1       cvs      5771: can be replaced by type name. Then what is copied is the contents of the
1.18      cvs      5772: element of this type which is inside the referenced element.</p>
1.30      cvs      5773: 
1.37    ! cvs      5774: <p>Whether a box name or type name is given, it may be followed by the name
        !          5775: of a structure schema between parentheses. This signifies that the box or
        !          5776: type is defined in the indicated structure schema and not in the structure
        !          5777: schema with which the rule's presentation schema is associated.</p>
1.30      cvs      5778: 
1.37    ! cvs      5779: <p>The <tt>Copy</tt> rule can also be applied to a presentation box. If the
1.1       cvs      5780: presentation box was created by a reference attribute, the rule is applied as
                   5781: in the case of a reference element: the contents of the box having the
1.18      cvs      5782: <tt>Copy</tt> rule are based on the element designated by the reference
1.37    ! cvs      5783: attribute. For other presentation boxes, the <tt>Copy</tt> rule takes a type
1.1       cvs      5784: name parameter which can be followed, between parentheses, by the name of the
                   5785: structure schema in which the type is defined, if it is not defined in the
1.37    ! cvs      5786: same schema. The contents of the box which has this rule are a copy of the
        !          5787: element of this type which is in the element creating the presentation box,
        !          5788: or by default, the box of this type which precedes the presentation box. This
        !          5789: last facility is used, for example, to define the running titles in headers
        !          5790: or footers.</p>
1.18      cvs      5791: <pre>                  'Copy' '(' BoxTypeToCopy ')' .
1.1       cvs      5792:   BoxTypeToCopy = BoxID [ ExtStruct ] /
1.6       cvs      5793:                   ElemID [ ExtStruct ] .
1.18      cvs      5794:   ExtStruct     = '(' ElemID ')' .</pre>
1.30      cvs      5795: 
                   5796: <p>Like the creation rules, the <tt>Copy</tt> rule cannot appear in the <a
1.37    ! cvs      5797: href="#sectc427">default presentation rules</a>. Moreover, this rule can only
1.18      cvs      5798: appear in the primary view's block of rules; the copy rule is applied to all
                   5799: views.</p>
1.30      cvs      5800: 
1.18      cvs      5801: <blockquote class="example">
1.30      cvs      5802:   <p><strong>Example:</strong></p>
                   5803: 
                   5804:   <p>If the following definitions are in the structure schema:</p>
                   5805:   <pre>Body = LIST OF (Chapter =
1.1       cvs      5806:                      BEGIN
                   5807:                      ChapterTitle = Text;
                   5808:                      ChapterBody = SectionSeq;
                   5809:                      END);
1.18      cvs      5810: RefChapter = REFERENCE (Chapter);</pre>
1.30      cvs      5811: 
                   5812:   <p>then the following presentation rules (among many other rules in the
                   5813:   presentation schema) can be specified:</p>
                   5814:   <pre>COUNTERS
1.1       cvs      5815:    ChapterCtr : RANK OF Chapter;
                   5816: BOXES
                   5817:    ChapterNumber :
                   5818:       BEGIN
                   5819:       Content : (VALUE (ChapterCtr, URoman));
                   5820:       ...
                   5821:       END;
                   5822: RULES
                   5823:    Chapter :
                   5824:       BEGIN
                   5825:       CreateFirst (ChapterNumber);
                   5826:       ...
                   5827:       END;
                   5828:    RefChapter :
                   5829:       BEGIN
                   5830:       Copy (ChapterNumber);
                   5831:       ...
1.18      cvs      5832:       END;</pre>
1.30      cvs      5833: 
                   5834:   <p>which makes the number of the chapter designated by the reference appear
                   5835:   in uppercase roman numerals, in place of the reference to a chapter itself.
                   5836:   Alternatively, the chapter title can be made to appear in place of the
                   5837:   reference by writing this <tt>Copy</tt>rule:</p>
                   5838:   <pre>      Copy (ChapterTitle);</pre>
                   5839: 
                   5840:   <p>To define a header box, named <tt>RunningTitle</tt>, which contains the
                   5841:   title of the current chapter, the box's contents are defined in this
                   5842:   way:</p>
                   5843:   <pre>BOXES
1.1       cvs      5844:    RunningTitle :
1.18      cvs      5845:       Copy (ChapterTitle);</pre>
                   5846: </blockquote>
                   5847: </div>
                   5848: </div>
1.37    ! cvs      5849: <hr />
1.18      cvs      5850: </div>
1.1       cvs      5851: 
1.18      cvs      5852: <div class="chapter">
1.37    ! cvs      5853: <h1><a name="sect5" id="sect5">The T language</a></h1>
1.1       cvs      5854: 
1.18      cvs      5855: <div class="section">
1.37    ! cvs      5856: <h2><a name="sectb51" id="sectb51">Document translation</a></h2>
1.1       cvs      5857: 
1.30      cvs      5858: <p>Because of its document model, Thot can produce documents in a high-level
1.37    ! cvs      5859: abstract form. This form, called the <em>canonical form</em> is specific to
1.1       cvs      5860: Thot; it is well suited to the editor's manipulations, but it does not
1.37    ! cvs      5861: necessarily suit other operations which might be applied to documents.
        !          5862: Because of this, the Thot editor offers the choice of saving documents in its
        !          5863: own form (the canonical form) or a format defined by the user. In the latter
        !          5864: case, the Thot document is transformed by the translation program. This
        !          5865: facility can also be used to export documents from Thot to systems using
        !          5866: other formalisms.</p>
1.1       cvs      5867: 
1.18      cvs      5868: <div class="subsection">
1.37    ! cvs      5869: <h3><a name="sectc511" id="sectc511">Translation principles</a></h3>
1.1       cvs      5870: 
1.30      cvs      5871: <p>Document translation allows the export of documents to other systems which
1.37    ! cvs      5872: do not accept Thot's canonical form. Translation can be used to export
1.30      cvs      5873: document to source-based formatters like T<sub><big>E</big></sub>X,
1.37    ! cvs      5874: L<sup>A</sup>T<sub><big>E</big></sub>X, and <tt>troff</tt>. It can also be
        !          5875: used to translate documents into interchange formats like SGML or HTML. To
1.1       cvs      5876: allow the widest range of possible exports, Thot does not limit the choice of
                   5877: translations, but rather allows the user to define the formalisms into which
1.18      cvs      5878: documents can be translated.</p>
1.30      cvs      5879: 
                   5880: <p>For each document or object class, a set of translation rules can be
                   5881: defined, specifying how the canonical form should be transformed into a given
1.37    ! cvs      5882: formalism. These translation rules are grouped into <em>translation
1.18      cvs      5883: schemas</em>, each schema containing the rules necessary to translate a
1.1       cvs      5884: generic logical structure (document or object structure) into a particular
1.37    ! cvs      5885: formalism. The same generic logical structure can have several different
1.1       cvs      5886: translation schemas, each defining translation rules for a different
1.18      cvs      5887: formalism.</p>
1.30      cvs      5888: 
1.37    ! cvs      5889: <p>Like presentation schemas, translation schemas are generic. Thus, they
1.30      cvs      5890: apply to an entire object or document class and permit translation of all
                   5891: documents or objects of that class.</p>
1.18      cvs      5892: </div>
1.1       cvs      5893: 
1.18      cvs      5894: <div class="subsection">
1.37    ! cvs      5895: <h3><a name="sectc512" id="sectc512">Translation procedure</a></h3>
1.1       cvs      5896: 
1.30      cvs      5897: <p>The translator works on the specific logical structure of the document
1.37    ! cvs      5898: being translated. It traverses the primary tree of this logical structure in
1.1       cvs      5899: pre-order and, at each node encountered, it applies the corresponding
                   5900: translation rules defined in the translation schema. Translation can be
1.18      cvs      5901: associated:</p>
                   5902: <ul>
1.30      cvs      5903:   <li>with element types defined in the structure schema,</li>
                   5904:   <li>with global or local attributes defined in the structure schema,</li>
                   5905:   <li>with specific presentation rules,</li>
1.37    ! cvs      5906:   <li>with the content of the leaves of the structure (characters, symbols
1.30      cvs      5907:     and graphical elements)</li>
1.18      cvs      5908: </ul>
1.30      cvs      5909: 
                   5910: <p>Thus, for each node, the translator applies all rules associated with the
1.1       cvs      5911: element type, all rules associated with each attribute (local or global)
                   5912: carried by the element, and if the element is a leaf of the tree, it also
1.10      cvs      5913: applies translation rules for characters, symbols, or graphical elements,
1.18      cvs      5914: depending on the type of the leaf.</p>
1.30      cvs      5915: 
                   5916: <p>Rules associated with the content of leaves are different from all other
1.1       cvs      5917: rules: they specify only how to translate character strings, symbols, and
1.37    ! cvs      5918: graphical elements. All other rules, whether associated with element types,
1.1       cvs      5919: with specific presentation rules or with attributes, are treated similarly.
1.18      cvs      5920: These rules primarily allow:</p>
                   5921: <ul>
1.30      cvs      5922:   <li>generation of a text constant or variable before or after the contents
                   5923:     of an element,</li>
                   5924:   <li>modification of the order in which elements appear after
                   5925:   translation,</li>
                   5926:   <li>removal of an element in the translated document,</li>
                   5927:   <li>and writing messages on the user's terminal during translation.</li>
1.18      cvs      5928: </ul>
                   5929: </div>
                   5930: </div>
1.1       cvs      5931: 
1.18      cvs      5932: <div class="section">
1.37    ! cvs      5933: <h2><a name="sectb52" id="sectb52">Translation definition language</a></h2>
1.1       cvs      5934: 
1.30      cvs      5935: <p>Translation schemas are written in a custom language, called T, which is
1.37    ! cvs      5936: described in the rest of this chapter. The grammar of T is specified using
1.18      cvs      5937: the same <a href="#sectc321">meta-language</a> as was used for the S and P
1.1       cvs      5938: languages and the translation schemas are written using the same conventions
1.37    ! cvs      5939: as the structure and presentation schemas. In particular, the keywords of the
1.1       cvs      5940: T language (the stings between apostrophes in the following syntax rules) can
                   5941: be written in any combination of upper-case and lower-case letters, but
                   5942: identifiers created by the programmer must always be written in the same
1.18      cvs      5943: way.</p>
1.1       cvs      5944: 
1.18      cvs      5945: <div class="subsection">
1.37    ! cvs      5946: <h3><a name="sectc521" id="sectc521">Organization of a translation
        !          5947: schema</a></h3>
1.1       cvs      5948: 
1.30      cvs      5949: <p>A translation schema is begun by the <tt>TRANSLATION</tt> keyword and is
1.37    ! cvs      5950: terminated by the <tt>END</tt> keyword. The <tt>TRANSLATION</tt> keyword is
        !          5951: followed by the name of the generic structure for which a translation is
        !          5952: being defined and a semicolon. This name must be identical to the name which
1.18      cvs      5953: appears after the <tt>STRUCTURE</tt> keyword in the corresponding structure
                   5954: schema.</p>
1.30      cvs      5955: 
                   5956: <p>After this declaration of the structure, the following material appears in
1.18      cvs      5957: order:</p>
                   5958: <ul>
1.30      cvs      5959:   <li>the length of lines produced by the translation,</li>
                   5960:   <li>the character delimiting the end of the line,</li>
                   5961:   <li>the character string which the translator will insert if it must
                   5962:     line-break the translated text,</li>
1.37    ! cvs      5963:   <li>declarations of 
1.30      cvs      5964:     <ul>
                   5965:       <li>buffers,</li>
                   5966:       <li>counters,</li>
                   5967:       <li>constants,</li>
                   5968:       <li>variables,</li>
                   5969:     </ul>
                   5970:   </li>
                   5971:   <li>translation rules associated with element types,</li>
                   5972:   <li>translation rules associated with attributes,</li>
                   5973:   <li>translation rules associated with specific presentation rules,</li>
                   5974:   <li>translation rules associated with characters strings, symbols and
                   5975:     graphical elements.</li>
1.18      cvs      5976: </ul>
1.30      cvs      5977: 
1.37    ! cvs      5978: <p>Each of these sections is introduced by a keyword followed by a sequence
        !          5979: of declarations. All of these sections are optional, expect for the
        !          5980: translation rules associated with element types. Many <tt>TEXTTRANSLATE</tt>
        !          5981: sections can appear, each defining the rules for translating character
        !          5982: strings of a particular alphabet.</p>
1.18      cvs      5983: <pre>     TransSchema ='TRANSLATION' ElemID ';'
1.1       cvs      5984:                 [ 'LINELENGTH' LineLength ';' ]
                   5985:                 [ 'LINEEND' CHARACTER ';' ]
                   5986:                 [ 'LINEENDINSERT' STRING ';' ]
                   5987:                 [ 'BUFFERS' BufferSeq ]
                   5988:                 [ 'COUNTERS' CounterSeq ]
                   5989:                 [ 'CONST' ConstSeq ]
                   5990:                 [ 'VAR' VariableSeq ]
                   5991:                   'RULES' ElemSeq
                   5992:                 [ 'ATTRIBUTES' AttrSeq ]
                   5993:                 [ 'PRESENTATION' PresSeq ]
1.30      cvs      5994:                 &lt; 'TEXTTRANSLATE' TextTransSeq &gt;
1.1       cvs      5995:                 [ 'SYMBTRANSLATE' TransSeq ]
                   5996:                 [ 'GRAPHTRANSLATE' TransSeq ]
1.18      cvs      5997:                   'END' .</pre>
                   5998: </div>
1.1       cvs      5999: 
1.18      cvs      6000: <div class="subsection">
1.37    ! cvs      6001: <h3><a name="sectc522" id="sectc522">Line length</a></h3>
1.1       cvs      6002: 
1.30      cvs      6003: <p>If a <tt>LINELENGTH</tt> instruction is present after the structure
1.37    ! cvs      6004: declaration, the translator divides the text it produces into lines, each
        !          6005: line having a length less than or equal to the integer which follows the
        !          6006: <tt>LINELENGTH</tt> keyword. This maximum line length is expressed as a
        !          6007: number of characters. The end of the line is marked by the character defined
        !          6008: by the <tt>LINEEND</tt> instruction. When the translator breaks the lines on
1.1       cvs      6009: a space character in generated text, this space will be replaced by the
1.18      cvs      6010: character string defined by the <tt>LINEENDINSERT</tt> instruction.</p>
1.30      cvs      6011: 
                   6012: <p>If the <tt>LINEEND</tt> instruction is not defined then the linefeed
                   6013: character (octal code 12) is used as the default line end character. If the
1.18      cvs      6014: <tt>LINEENDINSERT</tt> instruction is not defined, the linefeed character is
1.37    ! cvs      6015: inserted at the end of the produced lines. If there is no <tt>LINELENGTH</tt>
        !          6016: instruction, the translated text is not divided into lines. Otherwise, if the
1.1       cvs      6017: translation rules generate line end marks, these marks remain in the
                   6018: translated text, but the length of the lines is not controlled by the
1.18      cvs      6019: translator.</p>
                   6020: <pre>     LineLength = NUMBER .</pre>
1.30      cvs      6021: 
1.18      cvs      6022: <blockquote class="example">
1.30      cvs      6023:   <p><strong>Example:</strong></p>
                   6024: 
                   6025:   <p>To limit the lines produced by the translator to a length of 80
                   6026:   characters, the following rule is written at the beginning of the
                   6027:   translation schema.</p>
                   6028:   <pre>LineLength 80;</pre>
1.18      cvs      6029: </blockquote>
                   6030: </div>
1.1       cvs      6031: 
1.18      cvs      6032: <div class="subsection">
1.37    ! cvs      6033: <h3><a name="sectc523" id="sectc523">Buffers</a></h3>
1.1       cvs      6034: 
1.37    ! cvs      6035: <p>A buffer is a unit of memory managed by the translator, which can either
1.18      cvs      6036: contain text read from the terminal during the translation (see the <a
                   6037: href="#sectc5212"><tt>Read</tt> rule</a>), or the name of the last picture
1.1       cvs      6038: (bit-map) encountered by the translator in its traversal of the document.
1.2       cvs      6039: Remember the pictures are stored in files that are separate for the document
1.1       cvs      6040: files and that the canonical form contains only the names of the files in
1.18      cvs      6041: which the pictures are found.</p>
1.30      cvs      6042: 
1.37    ! cvs      6043: <p>Thus, there are two types of buffers: buffers for reading from the
1.30      cvs      6044: terminal (filled by the <tt>Read</tt> rule) and the buffer of picture names
1.37    ! cvs      6045: (containing the name of the last picture encountered). A translation schema
1.30      cvs      6046: can use either type, one or several read buffers and one (and only one)
                   6047: picture name buffer.</p>
                   6048: 
                   6049: <p>If any buffers are used, the <tt>BUFFERS</tt> keyword must be present,
1.37    ! cvs      6050: followed by declarations of every buffer used in the translation schema. Each
        !          6051: buffer declaration is composed only of the name of the buffer, chosen freely
        !          6052: by the programmer. The picture name buffer is identified by the
        !          6053: <tt>Picture</tt> keyword, between parentheses, following the buffer name. The
        !          6054: <tt>Picture</tt> keyword may only appear once. Each buffer declaration is
1.18      cvs      6055: terminated by a semicolon.</p>
1.30      cvs      6056: <pre>     BufferSeq = Buffer &lt; Buffer &gt; .
1.1       cvs      6057:      Buffer    = BufferID [ '(' 'Picture' ')' ] ';' .
1.18      cvs      6058:      BufferID  = NAME .</pre>
1.30      cvs      6059: 
1.18      cvs      6060: <blockquote class="example">
1.30      cvs      6061:   <p><strong>Example:</strong></p>
                   6062: 
                   6063:   <p>The following buffer declarations create a picture name buffer named
1.37    ! cvs      6064:   <tt>pictureName</tt> and a read buffer named <a name="destname"
        !          6065:   id="destname"><tt>DestName</tt></a>:</p>
1.30      cvs      6066:   <pre>BUFFERS
1.18      cvs      6067:      pictureName (Picture); DestName;</pre>
                   6068: </blockquote>
                   6069: </div>
1.1       cvs      6070: 
1.18      cvs      6071: <div class="subsection">
1.37    ! cvs      6072: <h3><a name="sectc524" id="sectc524">Counters</a></h3>
1.30      cvs      6073: 
                   6074: <p>Certain translation rules generate text that varies according to the
1.37    ! cvs      6075: context of the element to which the rules apply. Variable text is defined
1.30      cvs      6076: either in the <a href="#sectc526"><tt>VAR</tt> section</a> of the translation
                   6077: schema or in the rule itself (see the <tt>Create</tt> and <tt>Write</tt>
1.37    ! cvs      6078: rules). Both types of definition rely on counters for the calculation of
1.30      cvs      6079: variable material.</p>
                   6080: 
                   6081: <p>There are two types of counter: counters whose value is explicitely
                   6082: computed by applying <a href="#sectc5221"><tt>Set</tt> and <tt>Add</tt>
                   6083: rules</a>, and counters whose value is computed by a function associated with
                   6084: the counter. Those functions allow the same calculations as can be used in
1.37    ! cvs      6085: presentation schemas. As in a presentation schema, counters must be defined
        !          6086: in the <tt>COUNTERS</tt> section of the translation schema before they are
1.30      cvs      6087: used.</p>
                   6088: 
                   6089: <p>When counters are used in a translation schema, the <tt>COUNTERS</tt>
1.37    ! cvs      6090: keyword is followed by the declarations of every counter used. Each
        !          6091: declaration is composed of the counter's name possibly followed by a colon
        !          6092: and the counting function to be used for the counter. The declaration is
1.30      cvs      6093: terminated by a semi-colon. If the counter is explicitely computed by
                   6094: <tt>Set</tt> and <tt>Add</tt> rules, no counting function is indicated. If a
                   6095: counting function is indicated, <tt>Set</tt> and <tt>Add</tt> rules cannot be
                   6096: applied to that counter.</p>
1.1       cvs      6097: 
1.30      cvs      6098: <p>The counting function indicates how the counter's value will be computed.
1.18      cvs      6099: Three functions are available: <tt>Rank</tt>, <tt>Rlevel</tt>, and
                   6100: <tt>Set</tt>.</p>
                   6101: <ul>
1.30      cvs      6102:   <li><tt>Rank of ElemID</tt> indicates that the counter's value is the rank
                   6103:     of the element of type <tt>ElemID</tt> which encloses the element for
1.37    ! cvs      6104:     which the counter is being evaluated. For the purposes of this function,
        !          6105:     an element of type <tt>ElemID</tt> is considered to enclose itself. This
        !          6106:     function is primarily used when the element of type <tt>ElemID</tt> is
1.30      cvs      6107:     part of an aggregate or list, in which case the counter's value is the
1.37    ! cvs      6108:     element's rank in its list or aggregate. Note that, unlike the
        !          6109:     <tt>Rank</tt> function for presentation schemas, the <tt>Page</tt>
        !          6110:     keyword cannot be used in place of the <tt>ElemID</tt>. 
        !          6111:     <p>The type name <tt>ElemID</tt> can be followed by an integer. That
        !          6112:     number represents the relative level, among the ancestors of the
        !          6113:     concerned element, of the element whose rank is asked. If that relative
        !          6114:     level <i>n</i> is unsigned, the <i>n<sup>th</sup></i> element of type
        !          6115:     <tt>ElemID</tt> encountered when travelling the logical structure from
        !          6116:     the root to the concerned element is taken into account. If the relative
1.30      cvs      6117:     level is negative, the logical structure is travelled in the other
                   6118:     direction, from the concerned element to the root.</p>
                   6119:   </li>
                   6120:   <li><tt>Rlevel of ElemID</tt> indicates that the counter's values is the
                   6121:     relative level in the tree of the element for which the counter is being
                   6122:     evaluated. The counter counts the number of elements of type
                   6123:     <tt>ElemID</tt> which are found on the path between the root of the
                   6124:     document's logical structure tree and the element (inclusive).</li>
                   6125:   <li><tt>Set n on Type1 Add m on Type2</tt> indicates that the counter's
1.37    ! cvs      6126:     value is calculated as follows: in traversing the document from the
1.30      cvs      6127:     beginning to the element for which the counter is being evaluated, the
                   6128:     counter is set to the value <tt>n</tt> each time a <tt>Type1</tt> element
                   6129:     is encountered and is incremented by the amount <tt>m</tt> each time a
1.37    ! cvs      6130:     <tt>Type2</tt> element is encountered. The initial value <tt>n</tt> and
1.30      cvs      6131:     the increment <tt>m</tt> are integers.</li>
                   6132: </ul>
                   6133: 
                   6134: <p>As in a presentation schema, the <tt>Rank</tt> and <tt>Set</tt> functions
1.37    ! cvs      6135: can be modified by a numeric attribute which changes their initial value.
        !          6136: This is indicated by the <tt>Init</tt> keyword followed by the numeric
        !          6137: attribute's name. The <tt>Set</tt> function takes the value of the attribute
        !          6138: instead of the <tt>InitValue</tt> (<tt>n</tt>). For the <tt>Rank</tt>
        !          6139: function, the value of the attribute is considered to be the rank of the
        !          6140: first element of the list (rather than the normal value of 1). Subsequent
        !          6141: items in the list have their ranks shifted accordingly. In both cases, the
        !          6142: attribute must be numeric and must be a local attribute of the root of the
        !          6143: document itself.</p>
1.30      cvs      6144: <pre>     CounterSeq  = Counter &lt; Counter &gt; .
1.1       cvs      6145:      Counter     = CounterID [ ':' CounterFunc ] ';' .
                   6146:      CounterID   = NAME .
                   6147:      CounterFunc = 'Rank' 'of' ElemID [ SLevelAsc ]
                   6148:                    [ 'Init' AttrID ] /
                   6149:                    'Rlevel' 'of' ElemID /
                   6150:                    'Set' InitValue 'On' ElemID
                   6151:                          'Add' Increment 'On' ElemID
                   6152:                          [ 'Init' AttrID ] .
                   6153:      SLevelAsc   = [ '-' ] LevelAsc .
                   6154:      LevelAsc    =  NUMBER .
                   6155:      InitValue   = NUMBER .
                   6156:      Increment   = NUMBER .
                   6157:      ElemID      = NAME .
1.18      cvs      6158:      AttrID      = NAME .</pre>
1.30      cvs      6159: 
1.18      cvs      6160: <blockquote class="example">
1.30      cvs      6161:   <p><strong>Example:</strong></p>
                   6162: 
                   6163:   <p>If the body of a chapter is defined in the structure schema by:</p>
                   6164:   <pre>Chapter_Body = LIST OF
1.1       cvs      6165:          (Section = BEGIN
                   6166:                     Section_Title = Text;
                   6167:                     Section_Body  = BEGIN
                   6168:                                     Paragraphs;
                   6169:                                     Section;
                   6170:                                     END;
                   6171:                     END
1.18      cvs      6172:          );</pre>
1.30      cvs      6173: 
                   6174:   <p>(sections are defined recursively), a counter can be defined giving the
1.37    ! cvs      6175:   <a name="sectnum" id="sectnum">number of a section</a> within its level in
        !          6176:   the hierarchy:</p>
1.30      cvs      6177:   <pre>COUNTERS
1.18      cvs      6178:    SectionNumber : Rank of Section;</pre>
1.30      cvs      6179: 
                   6180:   <p>A counter holding the hierarchic level of a section:</p>
                   6181:   <pre>   SectionLevel : Rlevel of Section;</pre>
                   6182: 
1.37    ! cvs      6183:   <p>A <a name="uniquenum" id="uniquenum">counter</a> which sequentially
        !          6184:   numbers all the document's sections, whatever their hierarchic level:</p>
1.30      cvs      6185:   <pre>   UniqueSectNum : Set 0 on Document Add 1 on Section;</pre>
1.18      cvs      6186: </blockquote>
                   6187: </div>
1.1       cvs      6188: 
1.18      cvs      6189: <div class="subsection">
1.37    ! cvs      6190: <h3><a name="sectc525" id="sectc525">Constants</a></h3>
1.1       cvs      6191: 
1.30      cvs      6192: <p>A common feature of translation rules is the generation of constant text.
1.37    ! cvs      6193: This text can be defined in the rule that generates it (see for example the
        !          6194: <a href="#sectc5210"><tt>Create</tt></a> and <a
1.18      cvs      6195: href="#sectc5211"><tt>Write</tt></a> rules); but it can also be defined once
                   6196: in the constant declaration section and used many times in different rules.
1.37    ! cvs      6197: The latter option is preferable when the same text is used in several rules
        !          6198: or several <a href="#sectc526">variables</a>.</p>
1.30      cvs      6199: 
                   6200: <p>The <tt>CONST</tt> keyword begins the constant declaration section of the
1.37    ! cvs      6201: translation schema. It must be omitted if no constants are declared. Each
        !          6202: constant declaration is composed of the constant name, an equals sign, and
        !          6203: the constant's value, which is a character string between apostrophes. A
        !          6204: constant declaration is terminated by a semicolon.</p>
1.30      cvs      6205: <pre>     ConstSeq   = Const &lt; Const &gt; .
1.1       cvs      6206:      Const      = ConstID '=' ConstValue ';' .
                   6207:      ConstID    = NAME .
1.18      cvs      6208:      ConstValue = STRING .</pre>
1.30      cvs      6209: 
1.18      cvs      6210: <blockquote class="example">
1.37    ! cvs      6211:   <p><strong><a name="levelexample"
        !          6212:   id="levelexample">Example:</a></strong></p>
1.30      cvs      6213: 
                   6214:   <p>The following rule assigns the name <tt>TxtLevel</tt> to the character
                   6215:   string ``Level'':</p>
                   6216:   <pre>CONST
1.18      cvs      6217:      TxtLevel = 'Level';</pre>
                   6218: </blockquote>
                   6219: </div>
1.1       cvs      6220: 
1.18      cvs      6221: <div class="subsection">
1.37    ! cvs      6222: <h3><a name="sectc526" id="sectc526">Variables</a></h3>
1.1       cvs      6223: 
1.30      cvs      6224: <p>Variables allow to define variable text which is generated by the
1.37    ! cvs      6225: <tt>Create</tt> and <tt>Write</tt> rules. They are also used to define file
1.18      cvs      6226: names which are used in the <tt>Create</tt>, <tt>ChangeMainFile</tt>,
1.37    ! cvs      6227: <tt>RemoveFile</tt>, and <tt>Indent</tt> rules. Variables can be defined
1.18      cvs      6228: either in the <tt>VAR</tt> section of the translation schema or directly in
1.37    ! cvs      6229: the rules which use them. Variables that define file names must be declared
1.18      cvs      6230: in the <tt>VAR</tt> section, and when the same variable is used several times
                   6231: in the translation schema, it makes sense to define it globally in the
1.37    ! cvs      6232: <tt>VAR</tt> section. This section is only present if at least one variable
1.18      cvs      6233: is defined globally.</p>
1.30      cvs      6234: 
                   6235: <p>After the <tt>VAR</tt> keyword, each global variable is defined by its
                   6236: name, a colon separator and a sequence of functions (at least one function).
1.37    ! cvs      6237: Each variable definition is terminated by a semicolon. Functions determine
        !          6238: the different parts which together give the value of the variable. The value
        !          6239: is obtained by concatenating the strings produced by each of the functions.
        !          6240: Seven types of functions are available. Each variable definition may use any
        !          6241: number of functions of each type.</p>
1.18      cvs      6242: <ul>
1.30      cvs      6243:   <li>The function <tt>Value(Counter)</tt>returns a string representing the
                   6244:     value taken by the counter when it is evaluated for the element in whose
1.37    ! cvs      6245:     rule the variable is used. The counter must have been declared in the
        !          6246:     <tt>COUNTERS</tt> section of the translation schema. When the counter is
1.30      cvs      6247:     expressed in arabic numerals, the counter name can be followed by a colon
                   6248:     and an integer indicating a minimum length (number of characters) for the
1.37    ! cvs      6249:     string; if the counter's value is normally expressed with fewer
        !          6250:     characters than the required minimum, zeroes are added to the front of
        !          6251:     the string to achieve the minimum length. 
1.30      cvs      6252:     <p>By default, the counter value is written in arabic digits. If another
                   6253:     representation of that value is needed, the counter name must be followed
                   6254:     by a comma and one of the following keywords:</p>
                   6255:     <ul>
                   6256:       <li><tt>Arabic</tt>: arabic numerals (default value),</li>
                   6257:       <li><tt>LRoman</tt>: lower-case roman numerals,</li>
                   6258:       <li><tt>URoman</tt>: upper-case roman numerals,</li>
                   6259:       <li><tt>Uppercase</tt>: upper-case letter,</li>
                   6260:       <li><tt>Lowercase</tt>: lower-case letter.</li>
                   6261:     </ul>
                   6262:   </li>
                   6263:   <li>The function <tt>FileDir</tt>, without parameter, returns a string
                   6264:     representing the name of the directory of the output file that has been
                   6265:     given as a parameter to the translation program. The string includes a
                   6266:     character '/' at the end.</li>
                   6267:   <li>The function <tt>FileName</tt>, without parameter, returns a string
                   6268:     representing the name of the output file that has been given as a
                   6269:     parameter to the translation program. The file extension (the character
                   6270:     string that terminate the file name, after a dot) is not part of that
                   6271:     string.</li>
                   6272:   <li>The function <tt>Extension</tt>, without parameter, returns a string
                   6273:     representing the extension of the file name. That string is empty if the
                   6274:     file name that has been given as a parameter to the translation program
                   6275:     has no extension. If there is an extension, its first character is a
                   6276:   dot.</li>
                   6277:   <li>The function <tt>DocumentName</tt>, without parameter, returns a string
                   6278:     representing the name of the document being translated.</li>
                   6279:   <li>The function <tt>DocumentDir</tt>, without parameter, returns a string
                   6280:     representing the directory containing the document being translated.</li>
                   6281:   <li>The function formed by the name of a constant returns that constant's
                   6282:     value.</li>
                   6283:   <li>The function formed by a character string between apostrophes returns
                   6284:     that string.</li>
1.37    ! cvs      6285:   <li>The function formed by the name of a buffer returns the contents of
        !          6286:     that buffer. If the named buffer is the picture buffer, then the name of
        !          6287:     the last picture encountered is returned. Otherwise, the buffer is a read
1.31      cvs      6288:     buffer and the value returned is text previously read from the terminal.
1.30      cvs      6289:     If the buffer is empty (no picture has been encountered or the
                   6290:     <tt>Read</tt> rule has not been executed for the buffer), then the empty
                   6291:     string is returned.</li>
                   6292:   <li>The function formed by an attribute name takes the value of the
1.37    ! cvs      6293:     indicated attribute for the element to which the variable applies. If the
1.30      cvs      6294:     element does not have that attribute, then the element's ancestor are
1.37    ! cvs      6295:     searched toward the root of the tree. If one of the ancestors does have
        !          6296:     the attribute then its value is used. If no ancestors have the attribute,
1.30      cvs      6297:     then the value of the function is the empty string.</li>
1.18      cvs      6298: </ul>
1.30      cvs      6299: <pre>     VariableSeq = Variable &lt; Variable &gt; .
                   6300:      Variable    = VarID ':' Function &lt; Function &gt; ';' .
1.1       cvs      6301:      VarID       = NAME .
                   6302:      Function    ='Value' '(' CounterID [ ':' Length ]
                   6303:                             [ ',' CounterStyle ] ')' /
                   6304:                   'FileDir' / 'FileName' / 'Extension' /
                   6305:                   'DocumentName' / 'DocumentDir' /
                   6306:                    ConstID / CharString / 
                   6307:                    BufferID / AttrID .
                   6308:      Length      = NUMBER .
                   6309:      CounterStyle= 'Arabic' / 'LRoman' / 'URoman' /
                   6310:                    'Uppercase' / 'Lowercase' .
1.18      cvs      6311:      CharString  = STRING .</pre>
1.30      cvs      6312: 
1.18      cvs      6313: <blockquote class="example">
1.30      cvs      6314:   <p><strong>Example:</strong></p>
                   6315: 
                   6316:   <p>To create, at the beginning of each section of the translated document,
                   6317:   text composed of the string ``Section'' followed by the section number, the
1.37    ! cvs      6318:   following <a name="varsectexample" id="varsectexample">variable
        !          6319:   definition</a> might be used:</p>
1.30      cvs      6320:   <pre>VAR
1.18      cvs      6321:      SectionVar : 'Section' Value(SectionNumber);</pre>
1.30      cvs      6322: 
                   6323:   <p>(see the definition of <a
                   6324:   href="#sectnum"><tt>SectionNumber</tt></a>).</p>
                   6325: 
1.37    ! cvs      6326:   <p>The following variable definition can be used to create, at the
        !          6327:   beginning of each section, the text ``Level'' followed by the hierarchical
        !          6328:   level of the section. It used the constant defined above.</p>
1.30      cvs      6329:   <pre>     LevelVar : TxtLevel Value(SectionLevel);</pre>
                   6330: 
                   6331:   <p>(see the definitions of <a href="#sectnum"><tt>SectionLevel</tt></a> and
                   6332:   of <a href="#levelexample"><tt>TxtLevel</tt></a>).</p>
                   6333: 
                   6334:   <p>To generate the translation of each section in a different file (see <a
1.37    ! cvs      6335:   href="#sectc5220">rule <tt>ChangeMainFile</tt></a>), the name of these
        !          6336:   files might be defined by the following variable:</p>
1.30      cvs      6337:   <pre>     VarOutpuFile : FileName Value(SectionNumber)
1.18      cvs      6338:                     Extension;</pre>
1.30      cvs      6339: 
1.37    ! cvs      6340:   <p>If <tt>output.txt</tt> is the name of the <a name="varoutputfile"
        !          6341:   id="varoutputfile">output file</a> specified when starting the translation
        !          6342:   program, translated sections are written in files <tt>output1.txt</tt>,
        !          6343:   <tt>output2.txt</tt>, etc.</p>
1.18      cvs      6344: </blockquote>
                   6345: </div>
                   6346: 
                   6347: <div class="subsection">
1.37    ! cvs      6348: <h3><a name="sectc527" id="sectc527">Translating structure elements</a></h3>
1.18      cvs      6349: 
1.30      cvs      6350: <p>The <tt>RULES</tt> keyword introduces the translation rules which will be
1.37    ! cvs      6351: applied to the various structured element types. Translation rules can be
        !          6352: specified for each element type defined in the structure schema, including
        !          6353: the base types defined implicitly, whose names are <tt>TEXT_UNIT</tt>,
1.18      cvs      6354: <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>, <tt>GRAPHIC_UNIT</tt> and
1.37    ! cvs      6355: <tt>PAGE_UNIT</tt>. But it is not necessary to specify rules for every
1.18      cvs      6356: defined type.</p>
1.30      cvs      6357: 
1.37    ! cvs      6358: <p>If there are no translation rules for an element type, the elements that
        !          6359: it contains (and which may have rules themselves) will still be translated,
        !          6360: but the translator will produce nothing for the element itself. To make the
1.18      cvs      6361: translator completely ignore the content of an element the <a
                   6362: href="#sectc5217"><tt>Remove</tt> rule</a> must be used.</p>
1.30      cvs      6363: 
                   6364: <p>The translation rules for an element type defined in the structure schema
                   6365: are written using the name of the type followed by a colon and the list of
1.37    ! cvs      6366: applicable rules. When the element type is a <a href="#sectd3285">mark
1.18      cvs      6367: pair</a>, but only in this case, the type name must be preceded by the
1.37    ! cvs      6368: <tt>First</tt> or <tt>Second</tt> keyword. This keyword indicates whether the
1.18      cvs      6369: rules that follow apply to the first or second mark of the pair.</p>
1.30      cvs      6370: 
1.37    ! cvs      6371: <p>The list of rules can take several forms. It may be a simple
        !          6372: non-conditional rule. It can also be formed by a condition followed by one or
        !          6373: more simple rules. Or it can be a block of rules beginning with the
1.30      cvs      6374: <tt>BEGIN</tt> keyword and ending with the <tt>END</tt> keyword and a
1.37    ! cvs      6375: semicolon. This block of rules can contain one or more simple rules and/or
1.30      cvs      6376: one or more conditions, each followed by one or more simple rules.</p>
                   6377: <pre>     ElemSeq        = TransType &lt; TransType &gt; .
1.1       cvs      6378:      TransType      = [ FirstSec ] ElemID ':' RuleSeq .
                   6379:      FirstSec       = 'First' / 'Second' .
1.30      cvs      6380:      RuleSeq        = Rule / 'BEGIN' &lt; Rule &gt; 'END' ';' .
1.1       cvs      6381:      Rule           = SimpleRule / ConditionBlock .
                   6382:      ConditionBlock = 'IF' ConditionSeq SimpleRuleSeq .
1.30      cvs      6383:      SimpleRuleSeq  = 'BEGIN' &lt; SimpleRule &gt; 'END' ';' / 
1.18      cvs      6384:                       SimpleRule .</pre>
                   6385: </div>
1.1       cvs      6386: 
1.18      cvs      6387: <div class="subsection">
1.37    ! cvs      6388: <h3><a name="sectc528" id="sectc528">Conditional rules</a></h3>
1.1       cvs      6389: 
1.30      cvs      6390: <p>In a translation schema, the translation rules are either associated with
1.37    ! cvs      6391: element types or with attribute values or with a specific presentation. They
1.1       cvs      6392: are applied by the translator each time an element of the corresponding type
                   6393: is encountered in the translated document or each time the attribute value is
                   6394: carried by an element or also, each time the specific translation is attached
1.37    ! cvs      6395: to an element. This systematic application of the rules can be relaxed: it is
        !          6396: possible to add a condition to one or more rules, so that these rules are
        !          6397: only applied when the condition is true.</p>
1.30      cvs      6398: 
                   6399: <p>A condition begins with the keyword <tt>IF</tt>, followed by a sequence of
1.37    ! cvs      6400: elementary conditions. Elementary conditions are separated from each other by
        !          6401: the <tt>AND</tt> keyword. If there is only one elementary condition, this
        !          6402: keyword is absent. The rules are only applied if all the elementary
        !          6403: conditions are true. The elementary condition can be negative; it is then
1.18      cvs      6404: preceded by the <tt>NOT</tt> keyword.</p>
1.30      cvs      6405: 
                   6406: <p>When the translation rule(s) controlled by the condition apply to a
                   6407: reference element or a reference attribute, an elementary condition can also
1.37    ! cvs      6408: apply to element referred by this reference. The <tt>Target</tt> keyword is
        !          6409: used for that purpose. It must appear before the keyword defining the
1.30      cvs      6410: condition type.</p>
                   6411: 
                   6412: <p>Depending on their type, some conditions may apply either to the element
1.37    ! cvs      6413: with which they are associated, or to one of its ancestor. In the case of an
1.18      cvs      6414: ancestor, the key word <tt>Ancestor</tt> must be used, followed by</p>
                   6415: <ul>
1.30      cvs      6416:   <li>either an integer which represents the number of levels in the tree
                   6417:     between the element and the ancestor of interest,</li>
1.37    ! cvs      6418:   <li>or the type name of the ancestor of interest. If that type is defined
1.30      cvs      6419:     in a separate structure schema, the name of that schema must follow
                   6420:     between parentheses.</li>
1.18      cvs      6421: </ul>
1.30      cvs      6422: 
1.37    ! cvs      6423: <p>There is a special case for the parent element, which can be simply
        !          6424: written <tt>Parent</tt> instead of <tt>Ancestor 1</tt>.</p>
1.30      cvs      6425: 
                   6426: <p>Only conditions <tt>First</tt>, <tt>Last</tt>, <tt>Referred</tt>,
1.34      cvs      6427: <tt>Within</tt>, <tt>Attributes</tt>, <tt>Presentation</tt>, and those
                   6428: concerning an attribute or a specific presentation can apply to an ancestor.
                   6429: Conditions <tt>FirstRef</tt>, <tt>LastRef</tt>, <tt>ExternalRef</tt>,
                   6430: <tt>Alphabet</tt>, <tt>FirstAttr</tt>, <tt>LastAttr</tt>,
                   6431: <tt>ComputedPage</tt>, <tt>StartPage</tt>, <tt>UserPage</tt>,
                   6432: <tt>ReminderPage</tt>, <tt>Empty</tt> cannot be preceded by keywords
                   6433: <tt>Parent</tt> or <tt>Ancestor</tt>.</p>
1.30      cvs      6434: 
1.37    ! cvs      6435: <p>In condition <tt>Referred</tt> and in the condition that applies to a
        !          6436: named attribute, a symbol '<tt>*</tt>' can indicate that the condition is
        !          6437: related only to the element itself. If this symbol is not present, not only
        !          6438: the element is considered, but also its ancestor, at any level.</p>
1.30      cvs      6439: 
                   6440: <p>The form of an elementary condition varies according to the type of
1.18      cvs      6441: condition.</p>
1.1       cvs      6442: 
1.18      cvs      6443: <div class="subsubsection">
1.37    ! cvs      6444: <h4><a name="sectd5281" id="sectd5281">Conditions based on the logical
        !          6445: position of the element</a></h4>
1.30      cvs      6446: 
                   6447: <p>The condition can be on the position of the element in the document's
1.37    ! cvs      6448: logical structure tree. It is possible to test whether the element is the
1.30      cvs      6449: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is
                   6450: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>).</p>
                   6451: 
                   6452: <p>It is also possible to test if the element is contained in an element of a
1.18      cvs      6453: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). If that
1.1       cvs      6454: element type is defined in a structure schema which is not the one which
                   6455: corresponds to the translation schema, the type name of this element must be
                   6456: followed, between parentheses, by the name of the structure schema which
1.18      cvs      6457: defines it.</p>
1.30      cvs      6458: 
                   6459: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the
1.18      cvs      6460: condition is satisfied only if the <em>parent</em> element has the type
                   6461: indicated. If the word <tt>Immediately</tt> is missing, the condition is
                   6462: satisfied if any <em>ancestor</em> has the type indicated.</p>
1.30      cvs      6463: 
                   6464: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the
1.37    ! cvs      6465: type. It specifies the number of ancestors of the indicated type that must be
        !          6466: present for the condition to be satisfied. If the keyword
1.18      cvs      6467: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the
1.37    ! cvs      6468: element must have the indicated type. The integer <i>n</i> must be positive
        !          6469: or zero. It can be preceded by <tt>&lt;</tt> or <tt>&gt;</tt> to indicate a
        !          6470: maximum or minimum number of ancestors. If these symbols are missing, the
        !          6471: condition is satisfied only if it exists exactly <i>n</i> ancestors. When
1.30      cvs      6472: this number is missing, it is equivalent to &gt; 0.</p>
                   6473: 
1.37    ! cvs      6474: <p>If the condition applies to translation rules associated with an
        !          6475: attribute, i.e. if it is in the <tt>ATTRIBUTES</tt> section of the
        !          6476: presentation schema, the condition can be simply an element name. Translation
        !          6477: rules are then executed only if the attribute is attached to an element of
        !          6478: that type. The keyword <tt>NOT</tt> before the element name indicates that
        !          6479: the translation rules must be executed only if the element is not of the type
        !          6480: indicated.</p>
1.18      cvs      6481: </div>
1.1       cvs      6482: 
1.18      cvs      6483: <div class="subsubsection">
1.37    ! cvs      6484: <h4><a name="sectd5282" id="sectd5282">Conditions on references</a></h4>
1.1       cvs      6485: 
1.30      cvs      6486: <p>References may be taken into account in conditions, which can be based on
                   6487: the fact that the element, or one of its ancestors (unless symbol <tt>*</tt>
                   6488: is present), is designated by a at least one reference (<tt>Referred</tt>) or
1.37    ! cvs      6489: by none (<tt>NOT Referred</tt>). If the element or attribute to which the
1.1       cvs      6490: condition is attached is a reference, the condition can be based on the fact
                   6491: that it acts as the first reference to the designated element
1.18      cvs      6492: (<tt>FirstRef</tt>), or as the last (<tt>LastRef</tt>), or as a reference to
1.37    ! cvs      6493: an element located in another document (<tt>ExternalRef</tt>). Like all
1.18      cvs      6494: conditions, conditions on references can be inverted by the <tt>NOT</tt>
                   6495: keyword.</p>
                   6496: </div>
                   6497: 
                   6498: <div class="subsubsection">
1.37    ! cvs      6499: <h4><a name="sectd5284" id="sectd5284">Conditions on the alphabets</a></h4>
1.1       cvs      6500: 
1.30      cvs      6501: <p>The character string base type (and only this type) can use the condition
1.37    ! cvs      6502: <tt>Alphabet = a</tt> which indicates that the translation rule(s) should
        !          6503: only apply if the alphabet of the character string is the one whose name
        !          6504: appears after the equals sign (or is not, if there is a preceding
        !          6505: <tt>NOT</tt> keyword). This condition cannot be applied to translation rules
        !          6506: of an attribute.</p>
1.30      cvs      6507: 
                   6508: <p>In the current implementation of Thot, the available alphabets are the
1.18      cvs      6509: <tt>Latin</tt> alphabet and the <tt>Greek</tt> alphabet.</p>
                   6510: </div>
1.1       cvs      6511: 
1.18      cvs      6512: <div class="subsubsection">
1.37    ! cvs      6513: <h4><a name="sectd5285" id="sectd5285">Conditions on page breaks</a></h4>
1.1       cvs      6514: 
1.30      cvs      6515: <p>The page break base type (and only this type) can use the following
1.18      cvs      6516: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, <tt>UserPage</tt>, and
1.37    ! cvs      6517: <tt>ReminderPage</tt>. The <tt>ComputedPage</tt> condition indicates that the
1.1       cvs      6518: translation rule(s) should apply if the page break was created automatically
1.37    ! cvs      6519: by Thot; the <tt>StartPage</tt> condition is true if the page break is
1.18      cvs      6520: generated before the element by the <tt>Page</tt> rule of the P language; the
                   6521: <tt>UserPage</tt> condition applies if the page break was inserted by the
1.37    ! cvs      6522: user; and the <tt>ReminderPage</tt> is applied if the page break is a
        !          6523: reminder of page breaking.</p>
1.18      cvs      6524: </div>
1.1       cvs      6525: 
1.18      cvs      6526: <div class="subsubsection">
1.37    ! cvs      6527: <h4><a name="sectd5286" id="sectd5286">Conditions on the element's
        !          6528: content</a></h4>
1.1       cvs      6529: 
1.37    ! cvs      6530: <p>The condition can be based on whether or not the element is empty. An
1.30      cvs      6531: element which has no children or whose leaves are all empty is considered to
1.37    ! cvs      6532: be empty itself. This condition is expressed by the <tt>Empty</tt> keyword,
1.30      cvs      6533: optionally preceded by the <tt>NOT</tt> keyword.</p>
1.18      cvs      6534: </div>
1.1       cvs      6535: 
1.18      cvs      6536: <div class="subsubsection">
1.37    ! cvs      6537: <h4><a name="sectd5288" id="sectd5288">Conditions on the presence of specific
        !          6538: presentation rules</a></h4>
1.30      cvs      6539: 
                   6540: <p>The condition can be based on the presence or absence of specific
1.37    ! cvs      6541: presentation rules associated with the translated element, whatever the
        !          6542: rules, their value or their number. This condition is expressed by the
        !          6543: keyword <tt>Presentation</tt>, optionally preceded by the <tt>NOT</tt>
        !          6544: keyword.</p>
1.18      cvs      6545: </div>
1.1       cvs      6546: 
1.18      cvs      6547: <div class="subsubsection">
1.37    ! cvs      6548: <h4><a name="sectd5289" id="sectd5289">Conditions on the presence of logical
1.18      cvs      6549: attributes</a></h4>
1.30      cvs      6550: 
                   6551: <p>In the same way, the condition can be based on the presence or absence of
1.1       cvs      6552: attributes associated with the translated elements, no matter what the
1.37    ! cvs      6553: attributes or their values. The <tt>Attributes</tt> keyword expresses this
1.18      cvs      6554: condition.</p>
                   6555: </div>
1.1       cvs      6556: 
1.18      cvs      6557: <div class="subsubsection">
1.37    ! cvs      6558: <h4><a name="sectd52810" id="sectd52810">Conditions on logical
        !          6559: attributes</a></h4>
1.1       cvs      6560: 
1.30      cvs      6561: <p>If the condition appears in the translation rules of an attribute, the
1.37    ! cvs      6562: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate
        !          6563: that the rules must only be applied if this attribute is the first attribute
        !          6564: for the translated element or if it is the last (respectively). These
        !          6565: conditions can also be inverted by the <tt>NOT</tt> keyword.</p>
        !          6566: 
        !          6567: <p>Another type of condition can only be applied to the translation rules
        !          6568: when the element being processed (or one of its ancestors if symbol
        !          6569: <tt>*</tt> is missing) has a certain attribute, perhaps with a certain value
        !          6570: or, in contrast, when the element does not have this attribute with this
        !          6571: value. The condition is specified by writing the name of the attribute after
        !          6572: the keyword <tt>IF</tt> or <tt>AND</tt>. The <tt>NOT</tt> keyword can be used
        !          6573: to invert the condition. If the translation rules must be applied to any
        !          6574: element which has this attribute (or does not have it, if the condition is
        !          6575: inverted) no matter what the attribute's value, the condition is complete.
        !          6576: If, in contrast, the condition applies to one or more values of the
        !          6577: attribute, these are indicated after the name of the attribute, except for
        !          6578: reference attributes which do not have values.</p>
        !          6579: 
        !          6580: <p>The representation of the values of an <a name="relattr"
        !          6581: id="relattr">attribute</a> in a condition depends on the attribute's type.
        !          6582: For attributes with enumerated or textual types, the value (a name or
        !          6583: character string between apostrophes, respectively) is simply preceded by an
        !          6584: equals sign. For numeric attributes, the condition can be based on a single
        !          6585: value or on a range of values. In the case of a unique value, this value (an
        !          6586: integer) is simply preceded by an equals sign. Conditions based on ranges of
        !          6587: values have several forms:</p>
1.18      cvs      6588: <ul>
1.30      cvs      6589:   <li>all values less than a given value (the value is preceded by a ``less
                   6590:     than'' sign).</li>
                   6591:   <li>all values greater than a given value (the value is preceded by a
                   6592:     ``greater than'' sign).</li>
1.37    ! cvs      6593:   <li>all values falling in an interval, bounds included. The range of values
        !          6594:     is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>,
        !          6595:     where Minimum and Maximum are integers.</li>
1.18      cvs      6596: </ul>
1.30      cvs      6597: 
1.37    ! cvs      6598: <p>All numeric values may be negative. The integer is simply preceded by a
1.30      cvs      6599: minus sign.</p>
                   6600: 
                   6601: <p>Both local and global attributes can be used in conditions.</p>
1.18      cvs      6602: </div>
1.1       cvs      6603: 
1.18      cvs      6604: <div class="subsubsection">
1.37    ! cvs      6605: <h4><a name="sectd52811" id="sectd52811">Conditions on specific presentation
        !          6606: rules</a></h4>
1.1       cvs      6607: 
1.30      cvs      6608: <p>It is possible to apply translation rules only when the element being
1.1       cvs      6609: processed has or does not have a specific presentation rule, possibly with a
1.37    ! cvs      6610: certain value. The condition is specified by writing the name of the
        !          6611: presentation rule after the keyword <tt>IF</tt> or <tt>AND</tt>. The
        !          6612: <tt>NOT</tt> keyword can be used to invert the condition. If the translation
        !          6613: rules must be applied to any element which has this presentation rule (or
        !          6614: does not have it, if the condition is inverted) no matter what the rule's
        !          6615: value, the condition is complete. If, in contrast, the condition applies to
        !          6616: one or more values of the rule, these are indicated after the name of the
1.18      cvs      6617: attribute.</p>
1.30      cvs      6618: 
1.37    ! cvs      6619: <p>The representation of presentation rule values in a condition is similar
        !          6620: to that for attribute values. The representation of these values depend on
        !          6621: the type of the presentation rule. There are three categories of presentation
1.18      cvs      6622: rules:</p>
                   6623: <ul>
1.30      cvs      6624:   <li>those taking numeric values (<tt>Size, Indent, LineSpacing,
                   6625:     LineWeight</tt>),</li>
1.36      cvs      6626:   <li>those with values taken from a predefined list (<tt>Adjust, Hyphenate,
                   6627:     Style, Weight, Font, UnderLine, Thickness, LineStyle</tt>),</li>
1.30      cvs      6628:   <li>those whose value is a name (<tt>FillPattern, Background,
                   6629:     Foreground</tt>).</li>
1.18      cvs      6630: </ul>
1.30      cvs      6631: 
                   6632: <p>For presentation rules which take numeric values, the condition can take a
1.37    ! cvs      6633: unique value or a range of values. In the case of a unique value, this value
1.1       cvs      6634: (an integer) is simply preceded by an equals sign. Conditions based on ranges
1.18      cvs      6635: of values have several forms:</p>
                   6636: <ul>
1.30      cvs      6637:   <li>all values less than a given value (the value is preceded by a ``less
                   6638:     than'' sign).</li>
                   6639:   <li>all values greater than a given value (the value is preceded by a
                   6640:     ``greater than'' sign).</li>
1.37    ! cvs      6641:   <li>all values falling in an interval, bounds included. The range of values
        !          6642:     is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>,
        !          6643:     where Minimum and Maximum are integers.</li>
1.18      cvs      6644: </ul>
1.30      cvs      6645: 
1.37    ! cvs      6646: <p>Values for the <tt>Indent</tt>rule may be negative. The integer is then
1.2       cvs      6647: simply preceded by a minus sign and represents how far the first line starts
1.18      cvs      6648: to the left of the other lines.</p>
1.30      cvs      6649: 
                   6650: <p>For presentation rules whose values are taken from predefined lists, the
1.37    ! cvs      6651: value which satisfies the condition is indicated by an equals sign followed
        !          6652: by the name of the value.</p>
1.30      cvs      6653: 
1.37    ! cvs      6654: <p>For presentation rule whose values are names, the value which satisfies
        !          6655: the condition is indicated by the equals sign followed by the value's name.
        !          6656: The names of fill patterns (the <tt>FillPattern</tt> rule) and of colors (the
1.18      cvs      6657: <tt>Foreground</tt> and <tt>Background</tt> rules) known to Thot are the same
                   6658: as in the P language.</p>
1.30      cvs      6659: 
                   6660: <p>The syntax of conditions based on the specific presentation is the same as
                   6661: the syntax used to express the <a href="#sectc5224">translation of specific
1.18      cvs      6662: presentation rules</a>.</p>
1.30      cvs      6663: 
                   6664: <p>When a condition has only one rule, the condition is simply followed by
1.37    ! cvs      6665: that rule. If it has several rules, they are placed after the condition
1.30      cvs      6666: between the keywords <tt>BEGIN</tt> and <tt>END</tt>.</p>
1.18      cvs      6667: <pre>   ConditionSeq = Condition [ 'AND' Condition ] .
1.1       cvs      6668:    Condition    = [ 'NOT' ] [ 'Target' ] Cond .
                   6669:    Cond         = CondElem / CondAscend .
                   6670:    CondElem     ='FirstRef' / 'LastRef' /
                   6671:                  'ExternalRef' /
                   6672:                  'Alphabet' '=' Alphabet /
                   6673:                  'ComputedPage' / 'StartPage' / 
                   6674:                  'UserPage' / 'ReminderPage' /
                   6675:                  'Empty' /
1.11      cvs      6676:                   ElemID /
1.1       cvs      6677:                  'FirstAttr' / 'LastAttr' .
                   6678:    CondAscend   = [ Ascend ] CondOnAscend .
                   6679:    Ascend       = '*' / 'Parent' / 'Ancestor' LevelOrType .
                   6680:    LevelOrType  = CondRelLevel / ElemID [ ExtStruct ] .
                   6681:    CondRelLevel = NUMBER .
                   6682:    CondOnAscend ='First' / 'Last' /
                   6683:                  'Referred' / 
                   6684:                   [ 'Immediately' ] 'Within' [ NumParent ]
                   6685:                                     ElemID [ ExtStruct ] /
                   6686:                  'Attributes' /
                   6687:                   AttrID [ RelatAttr ] /
                   6688:                  'Presentation' /
1.34      cvs      6689:                   PresRule .
1.1       cvs      6690:    NumParent    = [ GreaterLess ] NParent .
1.30      cvs      6691:    GreaterLess  = '&gt;' / '&lt;' .
1.1       cvs      6692:    NParent      = NUMBER.
                   6693:    ExtStruct    = '(' ElemID ')' .
                   6694:    Alphabet     = NAME .
                   6695:    RelatAttr    ='=' Value /
1.30      cvs      6696:                  '&gt;' [ '-' ] Minimum /
1.1       cvs      6697:                  '&lt;' [ '-' ] Maximum /
                   6698:                  'IN' '[' [ '-' ] MinInterval '..'
                   6699:                           [ '-' ] MaxInterval ']' .
                   6700:    Value        = [ '-' ] IntegerVal / TextVal / AttrValue .
                   6701:    Minimum      = NUMBER .
                   6702:    Maximum      = NUMBER .
                   6703:    MinInterval  = NUMBER .
                   6704:    MaxInterval  = NUMBER .
                   6705:    IntegerVal   = NUMBER .
                   6706:    TextVal      = STRING .
1.18      cvs      6707:    AttrValue    = NAME .</pre>
1.30      cvs      6708: 
1.18      cvs      6709: <blockquote class="example">
1.30      cvs      6710:   <p><strong>Example:</strong></p>
                   6711: 
                   6712:   <p>Suppose that after each element of type Section_Title it is useful to
                   6713:   produce the text <tt>\label{SectX}</tt> where <tt>X</tt> represents the
                   6714:   section number, but only if the section is designated by one or more
1.37    ! cvs      6715:   references in the document. The following conditional rule produces this
1.30      cvs      6716:   effect:</p>
                   6717:   <pre>RULES
1.1       cvs      6718:   Section_Title :
                   6719:     IF Referred
1.18      cvs      6720:       Create ('\label{Sect' Value(UniqueSectNum) '}\12') After;</pre>
1.30      cvs      6721: 
                   6722:   <p>(the declaration of the <a href="#sectc5224"><tt>UniqueSectNum</tt>
1.37    ! cvs      6723:   counter</a> is given above). The string <tt>\12</tt> represents a line
1.30      cvs      6724:   break.</p>
1.18      cvs      6725: </blockquote>
1.30      cvs      6726: 
1.18      cvs      6727: <blockquote class="example">
1.30      cvs      6728:   <p><strong>Example:</strong></p>
                   6729: 
1.37    ! cvs      6730:   <p>Suppose that for elements of the Elmnt type it would be useful to
        !          6731:   produce a character indicating the value of the numeric attribute Level
        !          6732:   associated with the element: an ``A'' for all values of Level less than 3,
        !          6733:   a ``B'' for values between 3 and 10 and a ``C'' for values greater than 10.
        !          6734:   This can be achieved by writing the following rules for the Elmnt type:</p>
1.30      cvs      6735:   <pre>RULES
1.1       cvs      6736:   Elmnt :
                   6737:     BEGIN
                   6738:     IF Level &lt; 3
                   6739:       Create 'A';
                   6740:     IF Level IN [3..10]
                   6741:       Create 'B';
1.30      cvs      6742:     IF Level &gt; 10
1.1       cvs      6743:       Create 'C';
1.18      cvs      6744:     END;</pre>
                   6745: </blockquote>
                   6746: </div>
                   6747: </div>
1.1       cvs      6748: 
1.18      cvs      6749: <div class="subsection">
1.37    ! cvs      6750: <h3><a name="sectc529" id="sectc529">Translation rules</a></h3>
1.1       cvs      6751: 
1.37    ! cvs      6752: <p>Fifteen types of translation rules can be associated with element types
        !          6753: and attribute values. They are the <tt>Create</tt>, <tt>Write</tt>,
1.18      cvs      6754: <tt>Read</tt>, <tt>Include</tt>, <tt>Get</tt>, <tt>Copy</tt>, <tt>Use</tt>,
1.31      cvs      6755: <tt>Remove</tt>, <tt>Ignore</tt>, <tt>NoTranslation</tt>,
                   6756: <tt>NoLineBreak</tt>, <tt>ChangeMainFile</tt>, <tt>RemoveFile</tt>,
1.37    ! cvs      6757: <tt>Set</tt>, <tt>Add</tt>, <tt>Indent</tt>, rules. Each rule has its own
1.31      cvs      6758: syntax, although they are all based on very similar models.</p>
1.18      cvs      6759: <pre>     SimpleRule = 'Create' [ 'IN' VarID ] Object
1.1       cvs      6760:                         [ Position ] ';' /
                   6761:                   'Write' Object [ Position ] ';' /
                   6762:                   'Read' BufferID [ Position ] ';' /
                   6763:                   'Include' File [ Position ] ';' /
                   6764:                   'Get' [ RelPosition ] ElemID 
                   6765:                         [ ExtStruct ] 
                   6766:                         [ Position ] ';' /
                   6767:                   'Copy' [ RelPosition ] ElemID 
                   6768:                         [ ExtStruct ] 
                   6769:                         [ Position ] ';' /
                   6770:                   'Use' TrSchema [ 'For' ElemID ] ';' /
                   6771:                   'Remove' ';' /
1.31      cvs      6772:                   'Ignore' ';' /
1.1       cvs      6773:                   'NoTranslation' ';' /
                   6774:                   'NoLineBreak' ';' /
                   6775:                   'ChangeMainFile' VarID [ Position ] ';' /
1.14      cvs      6776:                   'RemoveFile' VarID [ Position ] ';' /
1.10      cvs      6777:                   'Set' CounterID InitValue [ Position ] ';' /
                   6778:                   'Add' CounterID Increment [ Position ] ';' /
1.25      cvs      6779:                   'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .</pre>
1.18      cvs      6780: </div>
                   6781: 
                   6782: <div class="subsection">
1.37    ! cvs      6783: <h3><a name="sectc5210" id="sectc5210">The <tt>Create</tt> rule</a></h3>
1.18      cvs      6784: 
1.30      cvs      6785: <p>The most frequently used rule is undoubtedly the <tt>Create</tt> rule,
                   6786: which generates fixed or variable text (called an <em>object</em>) in the
1.37    ! cvs      6787: output file. The generated text can be made to appear either before or after
        !          6788: the content of the element to which the rule applies. The rule begins with
        !          6789: the <tt>Create</tt> keyword, followed by a specifier for the object and a
        !          6790: keyword (<tt>Before</tt> or <tt>After</tt>) indicating the position of the
        !          6791: generated text (<a href="#sectc5222">before or after</a> the element's
        !          6792: content). If the position is not indicated, the object will be generated
        !          6793: before the element's content. This rule, like all translation rules, is
        !          6794: terminated by a semicolon.</p>
1.30      cvs      6795: 
                   6796: <p>The <tt>Create</tt> keyword can be followed by the <tt>IN</tt> keyword and
1.37    ! cvs      6797: by the name of a variable. This means that the text generated by the rule
1.30      cvs      6798: must not be written in the main output file, but in the file whose name is
1.18      cvs      6799: specified by the variable.</p>
1.30      cvs      6800: 
                   6801: <p>This allows the translation program to generate text in different files
                   6802: during the same run. These files do not need to be explicitely declared or
                   6803: opened. They do not need to be closed either, but if they contain temporary
                   6804: data, they can be removed (see the <a href="#sectc5220a"><tt>RemoveFile</tt>
                   6805: rule</a>). As soon as the translation program executes a <tt>Create</tt> rule
                   6806: for a file that is not yet open, it opens the file. These files are closed
                   6807: when the translation is finished.</p>
1.18      cvs      6808: <pre>               'Create' [ 'IN' VarID ] Object
1.1       cvs      6809:                         [ Position ] ';'
                   6810:      Object   = ConstID / CharString /
                   6811:                 BufferID /
                   6812:                 VarID /
1.30      cvs      6813:                '(' Function &lt; Function &gt; ')' /
1.21      cvs      6814:                 [ 'Translated' ] AttrID /
1.1       cvs      6815:                'Value' /
                   6816:                'Content' /
                   6817:                'Attributes' /
                   6818:                'Presentation' /
                   6819:                'RefId' /
                   6820:                'PairId' /
                   6821:                'FileDir' /
                   6822:                'FileName' /
                   6823:                'Extension' /
                   6824:                'DocumentName' /
                   6825:                'DocumentDir' /
                   6826:                 [ 'Referred' ] ReferredObject .
                   6827:      Position ='After' / 'Before' .
                   6828: 
                   6829:      ReferredObject = VarID /
                   6830:                 ElemID [ ExtStruct ] /
                   6831:                'RefId' /
                   6832:                'DocumentName' /
1.18      cvs      6833:                'DocumentDir' .</pre>
1.30      cvs      6834: 
                   6835: <p>The object to be generated can be:</p>
1.18      cvs      6836: <ul>
1.30      cvs      6837:   <li>a constant string, specified by its name if it is declared in the
                   6838:     schema's <tt>CONST</tt> section, or given directly as a value between
                   6839:     apostrophes;</li>
                   6840:   <li>the contents of a buffer, designated by the name of the buffer;</li>
                   6841:   <li>a variable, designated by its name if it is declared in the translation
1.37    ! cvs      6842:     schema's <tt>VAR</tt> section, or given directly between parentheses. The
1.30      cvs      6843:     text generated is the value of that variable evaluated for the element to
                   6844:     which the rule applies.</li>
                   6845:   <li>the value of an attribute, if the element being translated has this
                   6846:     attribute. The attribute is specified by its name. If it's a text
                   6847:     attribute, it can be preceded by the <code>Translated</code> keyword,
                   6848:     which causes the attribute value to be recoded using the text translation
                   6849:     table defined by section <code><a
                   6850:     href="#sectc5225">TEXTTRANSLATE</a></code>;</li>
1.37    ! cvs      6851:   <li>the value of a specific presentation rule. This object can only be
1.30      cvs      6852:     generated if the translation rule is for a <a href="#prestransl">specific
1.37    ! cvs      6853:     presentation rule</a>. It is specified by the <tt>Value</tt> keyword;</li>
        !          6854:   <li>the element's content. That is, the content of the leaves of the
        !          6855:     subtree of the translated element. This is specified by the
1.30      cvs      6856:     <tt>Content</tt> keyword;</li>
                   6857:   <li>the translation of all attributes of the element (which is primarily
                   6858:     used to apply the attribute translation rules <a
1.37    ! cvs      6859:     href="#sectc5222">before</a> those of the element type). This is
1.30      cvs      6860:     specified by the <tt>Attributes</tt> keyword.</li>
                   6861:   <li>the translation of all of the element's specific presentation rules
                   6862:     (which is primarily used to apply the translation rules for the specific
1.37    ! cvs      6863:     presentation rules <a href="#sectc5222">before</a> those of the element
        !          6864:     or its attributes). This option is specified by the <tt>Presentation</tt>
1.30      cvs      6865:     keyword;</li>
1.37    ! cvs      6866:   <li>The value of the reference's identifier.<br />
        !          6867:     Thot associates a unique identifier with each element in a document. This
        !          6868:     identifier (called <em>reference's identifier</em> or <em>label</em>) is
        !          6869:     a character string containing the letter `L' followed by digits. Thot
        !          6870:     uses it in references for identifying the referred element.<br />
1.30      cvs      6871:     The <tt>RefId</tt> keyword produces the reference's identifier of the
                   6872:     element to which the translation rule is applied, or the reference's
                   6873:     identifier of its first ancestor that is referred by a reference or that
                   6874:     can be referred by a reference.</li>
1.37    ! cvs      6875:   <li>the value of a mark pair's unique identifier. This may only be used for
1.30      cvs      6876:     <a href="#sectd3285">mark pairs</a> and is indicated by the
                   6877:     <tt>PairId</tt> keyword.</li>
                   6878:   <li>the directory containing the file being generated (this string includes
1.37    ! cvs      6879:     an ending '/', if it is not empty). This is indicated by the
1.30      cvs      6880:     <tt>FileDir</tt> keyword.</li>
                   6881:   <li>the name of the file being generated (only the name, without the
                   6882:     directory and without the extension). This is indicated by the
                   6883:     <tt>FileName</tt> keyword.</li>
                   6884:   <li>the extension of the file being generated (this string starts with a
1.37    ! cvs      6885:     dot, if it is not empty). This is indicated by the <tt>Extension</tt>
1.30      cvs      6886:     keyword.</li>
1.37    ! cvs      6887:   <li>the name of the document being translated. This is indicated by the
1.30      cvs      6888:     <tt>DocumentName</tt> keyword.</li>
1.37    ! cvs      6889:   <li>the directory containing the document being translated. This is
1.30      cvs      6890:     indicated by the <tt>DocumentDir</tt> keyword.</li>
1.18      cvs      6891: </ul>
1.30      cvs      6892: 
1.37    ! cvs      6893: <p>When the rule applies to a reference (an element or an attribute defined
        !          6894: as a reference in the structure schema), it can generate a text related to
        !          6895: the element referred by that reference. The rule name is then followed by the
1.18      cvs      6896: <tt>Referred</tt> keyword and a specification of the object to be generated
1.37    ! cvs      6897: for the referred element. This specification can be:</p>
1.18      cvs      6898: <ul>
1.37    ! cvs      6899:   <li>the name of a variable. The rule generates the value of that variable,
1.30      cvs      6900:     computed for the referred element.</li>
1.37    ! cvs      6901:   <li>an element type. The rule generates the translation of the element of
        !          6902:     that type, which is in the subtree of the referred element. If this
1.30      cvs      6903:     element is not defined in the structure schema which corresponds to the
                   6904:     translation schema (that is, an object defined in another schema), the
                   6905:     element's type name must be followed by the name of its structure schema
                   6906:     between parentheses.</li>
1.37    ! cvs      6907:   <li>the <tt>RefId</tt> keyword. The rule generates the reference's
1.30      cvs      6908:     identifier of the referred element.</li>
1.37    ! cvs      6909:   <li>the <tt>DocumentName</tt> keyword. The rule generates the name of the
1.30      cvs      6910:     document to which the referred element belongs.</li>
1.37    ! cvs      6911:   <li>the <tt>DocumentDir</tt> keyword. The rule generates the name of the
1.30      cvs      6912:     directory that contains the document of the referred element.</li>
1.18      cvs      6913: </ul>
                   6914: </div>
1.1       cvs      6915: 
1.18      cvs      6916: <div class="subsection">
1.37    ! cvs      6917: <h3><a name="sectc5211" id="sectc5211">The <tt>Write</tt> rule</a></h3>
1.1       cvs      6918: 
1.37    ! cvs      6919: <p>The <tt>Write</tt> has the same syntax as the <tt>Create</tt> rule. It
1.30      cvs      6920: also produces the same effect, but the generated text is displayed on the
                   6921: user's terminal during the translation of the document, instead of being
1.37    ! cvs      6922: produced in the translated document. This is useful for helping the user keep
1.30      cvs      6923: track of the progress of the translation and for prompting the user on the
                   6924: terminal for input required by the <tt>Read</tt> rule.</p>
1.18      cvs      6925: <pre>               'Write' Object [ Position ] ';'</pre>
1.30      cvs      6926: 
                   6927: <p>Notice: if the translator is launched by the editor (by the ``Save as''
1.18      cvs      6928: command), messages produced by the <tt>Write</tt> rule are not displayed.</p>
1.30      cvs      6929: 
1.18      cvs      6930: <blockquote class="example">
1.30      cvs      6931:   <p><strong>Example:</strong></p>
                   6932: 
                   6933:   <p>To make the translator display the number of each section being
                   6934:   translated on the user's terminal, the following rule is specified for the
                   6935:   <tt>Section</tt> element type:</p>
                   6936:   <pre>Section : BEGIN
1.1       cvs      6937:           Write VarSection;
                   6938:           ...
1.18      cvs      6939:           END;</pre>
1.30      cvs      6940: 
                   6941:   <p>(see <a href="#varsectexample">above</a> for the definition of the
                   6942:   <tt>VarSection</tt> variable).</p>
                   6943: 
                   6944:   <p>To display text on the terminal before issuing a read operation with the
                   6945:   <tt>Read</tt> rule, the following rule is used:</p>
                   6946:   <pre>BEGIN
1.1       cvs      6947: Write 'Enter the name of the destination: ';
                   6948: ...
1.18      cvs      6949: END;</pre>
                   6950: </blockquote>
                   6951: </div>
                   6952: 
                   6953: <div class="subsection">
1.37    ! cvs      6954: <h3><a name="sectc5212" id="sectc5212">The <tt>Read</tt> rule</a></h3>
1.18      cvs      6955: 
1.30      cvs      6956: <p>The <tt>Read</tt> rule reads text from the terminal during the translation
                   6957: of the document and saves the text read in one of the buffers declared in the
1.37    ! cvs      6958: <tt>BUFFERS</tt> section of the schema. The buffer to be used is indicated by
        !          6959: its name, after the <tt>READ</tt> keyword. This name can be followed, as in
1.18      cvs      6960: the <tt>Create</tt> and <tt>Write</tt> rules, by a keyword indicating if the
                   6961: read operation must be performed <tt>Before</tt> or <tt>After</tt> the
1.37    ! cvs      6962: translation of the element's content. If this keyword is absent, the read
        !          6963: operation is done beforehand. The text is read into the buffer and remains
1.5       cvs      6964: there until a rule using the same buffer - possibly the same rule - is
1.18      cvs      6965: applied.</p>
                   6966: <pre>               'Read' BufferID [ Position ] ';'</pre>
1.30      cvs      6967: 
1.18      cvs      6968: <blockquote class="example">
1.30      cvs      6969:   <p><strong>Example:</strong></p>
                   6970: 
                   6971:   <p>The following set of rules tells the user that the translator is waiting
                   6972:   for the entry of some text, reads this text into a buffer and copies the
                   6973:   text into the translated document.</p>
                   6974:   <pre>BEGIN
1.1       cvs      6975: Write 'Enter the name of the destination: ';
                   6976: Read DestName;
                   6977: Create DestName;
                   6978: ...
1.18      cvs      6979: END;</pre>
1.30      cvs      6980: 
                   6981:   <p>(see <a href="#destname">above</a> the definition of
                   6982:   <tt>DestName</tt>).</p>
1.18      cvs      6983: </blockquote>
                   6984: </div>
                   6985: 
                   6986: <div class="subsection">
1.37    ! cvs      6987: <h3><a name="sectc5213" id="sectc5213">The <tt>Include</tt> rule</a></h3>
1.18      cvs      6988: 
1.30      cvs      6989: <p>The <tt>Include</tt> rule, like the <tt>Create</tt> rule, is used to
1.37    ! cvs      6990: produce text in the translated document. It inserts constant text which is
        !          6991: not defined in the translation schema, but is instead taken from a file. The
        !          6992: file's name is specified after the <tt>Include</tt> keyword, either directly
        !          6993: as a character string between apostrophes or as the name of one of the
        !          6994: buffers declared in the <tt>BUFFERS</tt> section of the schema. In the latter
        !          6995: case, the buffer is assumed to contain the file's name. This can be used when
        !          6996: the included file's name is known only at the moment of translation. This
        !          6997: only requires that the <tt>Include</tt> rule is preceded by a <tt>Read</tt>
        !          6998: rule which puts the name of the file desired by the user into the buffer.</p>
1.30      cvs      6999: 
                   7000: <p>Like the other rules, it is possible to specify whether the inclusion will
1.1       cvs      7001: occur before or after the element's content, with the default being before.
                   7002: The file inclusion is only done at the moment of translation, not during the
                   7003: compilation of the translation schema. Thus, the file to be included need not
                   7004: exist during the compilation, but it must be accessible at the time of
1.37    ! cvs      7005: translation. Its contents can also be modified between two translations, thus
1.1       cvs      7006: producing different results, even if neither the document or the translation
1.18      cvs      7007: schema are modified.</p>
1.30      cvs      7008: 
                   7009: <p>During translation, the file to be included is searched for along the
                   7010: schema directory path (indicated by the environment variable
1.37    ! cvs      7011: <tt>THOTSCH</tt>). The file name is normally only composed of a simple name,
        !          7012: without specification of a complete file path. However, if the filename
1.30      cvs      7013: starts with a '/', it is considered as an absolute path.</p>
1.18      cvs      7014: <pre>                'Include' File [ Position ] ';'
1.6       cvs      7015:      File     = FileName / BufferID .
1.18      cvs      7016:      FileName = STRING .</pre>
1.30      cvs      7017: 
1.18      cvs      7018: <blockquote class="example">
1.30      cvs      7019:   <p><strong>Example:</strong></p>
                   7020: 
1.37    ! cvs      7021:   <p>Suppose that it is desirable to print documents of the Article class
        !          7022:   with a formatter which requires a number of declarations and definitions at
        !          7023:   the beginning of the file. The <tt>Include</tt>rule can be used to achieve
1.30      cvs      7024:   this. All the declarations and definitions a replaced in a file called
                   7025:   <tt>DeclarArt</tt> and then the <tt>Article</tt> element type is given the
                   7026:   following rule:</p>
                   7027:   <pre>Article : BEGIN
1.1       cvs      7028:           Include 'DeclarArt' Before;
                   7029:           ...
1.18      cvs      7030:           END;</pre>
                   7031: </blockquote>
                   7032: </div>
                   7033: 
                   7034: <div class="subsection">
1.37    ! cvs      7035: <h3><a name="sectc5214" id="sectc5214">The <tt>Get</tt> rule</a></h3>
1.18      cvs      7036: 
1.30      cvs      7037: <p>The <tt>Get</tt> rule is used to change the order in which the elements
1.37    ! cvs      7038: appear in the translated document. More precisely, it produces the
1.30      cvs      7039: translation of a specified element before or after the translation of the
1.37    ! cvs      7040: content of the element to which the rule applies. The <tt>Before</tt> and
1.30      cvs      7041: <tt>After</tt> keywords are placed at the end of the rule to specify whether
                   7042: the operation should be performed before or after translation of the rule's
                   7043: element (the default is before). The type of the element to be moved must be
                   7044: specified after the <tt>Get</tt> keyword, optionally preceded by a keyword
                   7045: indicating where the element will be found in the logical structure of the
                   7046: document:</p>
1.18      cvs      7047: <dl>
1.30      cvs      7048:   <dt><tt>Included</tt></dt>
                   7049:     <dd>The element to be moved is the first element of the indicated type
                   7050:       which is found inside the element to which the rule applies.</dd>
                   7051:   <dt><tt>Referred</tt></dt>
                   7052:     <dd>This keyword can only be used if the rule applies to a reference
1.37    ! cvs      7053:       element. The element to be moved is either the element designated by
        !          7054:       the reference (if that element is of the specified type), or the first
1.30      cvs      7055:       element of the desired type contained within the element designated by
                   7056:       the reference.</dd>
                   7057:   <dt>no keyword</dt>
1.37    ! cvs      7058:     <dd><p>The translator takes the first element of the indicated type from
        !          7059:       among the siblings of the rule's element. This is primarily used to
        !          7060:       change the order of the components of an aggregate.</p>
1.30      cvs      7061:     </dd>
1.18      cvs      7062: </dl>
1.30      cvs      7063: 
                   7064: <p>If the element to be moved is defined in a structure schema which is not
                   7065: the one which corresponds to the translation schema (in the case of an
                   7066: included object with a different schema), the type name of this element must
                   7067: be followed, between parentheses, by the name of the structure schema which
1.18      cvs      7068: defines it.</p>
                   7069: <pre>                   'Get' [ RelPosition ] ElemID 
1.6       cvs      7070:                          [ ExtStruct ]
                   7071:                          [ Position ] ';' /
                   7072:      RelPosition = 'Included' / 'Referred' .
1.18      cvs      7073:      ExtStruct   = '(' ElemID ')' .</pre>
1.30      cvs      7074: 
                   7075: <p>The <tt>Get</tt> rule has no effect if the element which it is supposed to
1.37    ! cvs      7076: move has already been translated. Thus, the element will not be duplicated.
1.1       cvs      7077: It is generally best to associate the rule with the first element which will
1.37    ! cvs      7078: be encountered by the translator in its traversal of the document. Suppose an
1.18      cvs      7079: aggregate has two elements <tt>A</tt> and <tt>B</tt>, with <tt>A</tt>
1.37    ! cvs      7080: appearing first in the logical structure. To permute these two elements, a
1.18      cvs      7081: <tt>Get B before</tt> rule should be associated with the <tt>A</tt> element
1.37    ! cvs      7082: type, not the inverse. Similarly, a rule of the form <tt>Get Included X
1.18      cvs      7083: After</tt>, even though syntactically correct, makes no sense since, by the
1.1       cvs      7084: time it will be applied, after the translation of the contents of the element
1.18      cvs      7085: to which it is attached, the <tt>X</tt> element will already have been
                   7086: translated.</p>
                   7087: </div>
                   7088: 
                   7089: <div class="subsection">
1.37    ! cvs      7090: <h3><a name="sectc5215" id="sectc5215">The <tt>Copy</tt> rule</a></h3>
1.18      cvs      7091: 
1.30      cvs      7092: <p>Like the <tt>Get</tt> rule, the <tt>Copy</tt> rule generates the
                   7093: translation of a specified element, but it acts even if the element has
                   7094: already been translated and it allows to copy it or to translate it later.
                   7095: Both rules have the same syntax.</p>
1.18      cvs      7096: <pre>              'Copy' [ RelPosition ] ElemID 
                   7097:                      [ ExtStruct ] [ Position ] ';'</pre>
                   7098: </div>
                   7099: 
                   7100: <div class="subsection">
1.37    ! cvs      7101: <h3><a name="sectc5216" id="sectc5216">The <tt>Use</tt> rule</a></h3>
1.18      cvs      7102: 
1.30      cvs      7103: <p>The <tt>Use</tt> rule specifies the translation schema to be applied to
1.37    ! cvs      7104: objects of a certain class that are part of the document. This rule only
1.1       cvs      7105: appears in the rules for the root element of the document (the first type
1.18      cvs      7106: defined after the <tt>STRUCT</tt> keyword in the structure schema) or the
1.1       cvs      7107: rules of an element defined by an external structure (by another structure
1.37    ! cvs      7108: schema). Also, the <tt>Use</tt> rule cannot be conditional.</p>
1.30      cvs      7109: 
                   7110: <p>If the rule is applied to an element defined by an external structure, the
1.18      cvs      7111: <tt>Use</tt> keyword is simply followed by the name of the translation schema
1.37    ! cvs      7112: to be used for element constructed according to that external structure. If
1.1       cvs      7113: the rule is applied to the document's root element, it is formed by the
1.18      cvs      7114: <tt>Use</tt> keyword followed by the translation schema's name, the
                   7115: <tt>For</tt> keyword and the name of the external structure to which the
                   7116: indicated translation schema should be applied.</p>
                   7117: <pre>               'Use' TrSchema [ 'For' ElemID ] ';'
                   7118:      TrSchema = NAME .</pre>
1.30      cvs      7119: 
                   7120: <p>If no <tt>Use</tt> rule defines the translation schema to be used for an
1.1       cvs      7121: external structure which appears in a document, the translator asks the user,
                   7122: during the translation process, which schema should be used. Thus, it is not
1.18      cvs      7123: necessary to give the translation schema a <tt>Use</tt> rule for every
1.1       cvs      7124: external structure used, especially when the choice of translation schemas is
1.18      cvs      7125: to be left to the user.</p>
1.30      cvs      7126: 
                   7127: <p>Notice: if the translator is launched by the editor (by the ``Save as''
1.18      cvs      7128: command), prompts are not displayed.</p>
1.30      cvs      7129: 
1.18      cvs      7130: <blockquote class="example">
1.30      cvs      7131:   <p><strong>Example:</strong></p>
                   7132: 
                   7133:   <p>The <tt>Article</tt> structure schema uses the <tt>Formula</tt> external
                   7134:   structure, defined by another structure schema, for mathematical
                   7135:   formulas:</p>
                   7136:   <pre>STRUCTURE Article;
1.1       cvs      7137:    ...
                   7138: STRUCT
                   7139:    Article = ...
                   7140:    ...
                   7141:    Formula_in_text  = Formula;
                   7142:    Isolated_formula = Formula;
                   7143:    ...
1.18      cvs      7144: END</pre>
1.30      cvs      7145: 
                   7146:   <p>Suppose that it would be useful to use the <tt>FormulaT</tt> translation
1.37    ! cvs      7147:   schema for the formulas of an article. This can be expressed in two
1.30      cvs      7148:   different ways in the <tt>Article</tt> class translation schema, using the
                   7149:   rules:</p>
                   7150:   <pre>RULES
1.1       cvs      7151:     Article :
1.18      cvs      7152:        Use FormulaT for Formula;</pre>
1.30      cvs      7153: 
                   7154:   <p>or:</p>
                   7155:   <pre>RULES
1.1       cvs      7156:     ...
                   7157:     Formula :
1.18      cvs      7158:        Use FormulaT;</pre>
                   7159: </blockquote>
                   7160: </div>
                   7161: 
                   7162: <div class="subsection">
1.37    ! cvs      7163: <h3><a name="sectc5217" id="sectc5217">The <tt>Remove</tt> rule</a></h3>
1.18      cvs      7164: 
1.37    ! cvs      7165: <p>The <tt>Remove</tt> rule indicates that nothing should be generated, in
        !          7166: the translated document, for the content of the element to which the rule
        !          7167: applies. The content of that element is simply ignored by the translator.
        !          7168: This does not prevent the generation of text for the element itself, using
        !          7169: the <tt>Create</tt> or <tt>Include</tt> rules, for example.</p>
1.30      cvs      7170: 
                   7171: <p>The <tt>Remove</tt> rule is simply written with the <tt>Remove</tt>
                   7172: keyword. It is terminated, like all rules, by a semicolon.</p>
1.18      cvs      7173: <pre>               'Remove' ';'</pre>
                   7174: </div>
                   7175: 
                   7176: <div class="subsection">
1.37    ! cvs      7177: <h3><a name="sectc5217a" id="sectc5217a">The <tt>Ignore</tt> rule</a></h3>
1.31      cvs      7178: 
1.37    ! cvs      7179: <p>The <tt>Ignore</tt> rule indicates that nothing should be generated, in
        !          7180: the translated document, for the element to which the rule applies. The whole
1.32      cvs      7181: element is simply ignored by the translator.</p>
1.31      cvs      7182: 
                   7183: <p>The <tt>Ignore</tt> rule is simply written with the <tt>Ignore</tt>
                   7184: keyword. It is terminated, like all rules, by a semicolon.</p>
                   7185: <pre>               'Ignore' ';'</pre>
                   7186: </div>
                   7187: 
                   7188: <div class="subsection">
1.37    ! cvs      7189: <h3><a name="sectc5218" id="sectc5218">The <tt>NoTranslation</tt>
        !          7190: rule</a></h3>
1.18      cvs      7191: 
1.30      cvs      7192: <p>The <tt>NoTranslation</tt> rule indicates to the translator that it must
1.37    ! cvs      7193: not translate the content of the leaves of the element to which it applies.
        !          7194: In contrast to the <tt>Remove</tt> rule, it does not suppress the content of
        !          7195: the element, but it inhibits the translation of character strings, symbols,
        !          7196: and graphical elements contained in the element. These are retrieved so that
1.18      cvs      7197: after the translation of the document, the rules of the <a
                   7198: href="#sectc5225"><tt>TEXTTRANSLATE</tt>, <tt>SYMBTRANSLATE</tt> and
                   7199: <tt>GRAPHTRANSLATE</tt> sections</a> will not be applied to them.</p>
1.30      cvs      7200: 
                   7201: <p>The <tt>NoTranslation</tt> rule is written with the <tt>NoTranslation</tt>
1.18      cvs      7202: keyword followed by a semicolon.</p>
                   7203: <pre>               'NoTranslation' ';'</pre>
                   7204: </div>
                   7205: 
                   7206: <div class="subsection">
1.37    ! cvs      7207: <h3><a name="sectc5219" id="sectc5219">The <tt>NoLineBreak</tt> rule</a></h3>
1.18      cvs      7208: 
1.30      cvs      7209: <p>The <tt>NoLineBreak</tt> rule indicates to the translator that it must not
1.1       cvs      7210: generate additional line breaks in the output produced for the element to
1.37    ! cvs      7211: which it applies. This is as if it was an <a href="#sectc522">instruction
1.18      cvs      7212: <tt>LINELENGTH 0;</tt></a> at the beginning of the translation schema, but
                   7213: only for the current element.</p>
1.30      cvs      7214: 
                   7215: <p>The <tt>NoLineBreak</tt> rule is written with the <tt>NoLineBreak</tt>
                   7216: keyword followed by a semicolon.</p>
1.18      cvs      7217: <pre>               'NoLineBreak' ';'</pre>
                   7218: </div>
1.1       cvs      7219: 
1.18      cvs      7220: <div class="subsection">
1.37    ! cvs      7221: <h3><a name="sectc5220" id="sectc5220">The <tt>ChangeMainFile</tt>
        !          7222: rule</a></h3>
1.1       cvs      7223: 
1.30      cvs      7224: <p>When the translation program starts, it opens a main output file, whose
1.37    ! cvs      7225: name is given as a parameter of the translator. All <a
        !          7226: href="#sectc5210"><tt>Create</tt> rules</a> without explicit indication of
        !          7227: the output file write sequentially in this file. When a
        !          7228: <tt>ChangeMainFile</tt> rule is executed, the main output file is closed and
        !          7229: it is replaced by a new one, whose name is specified in the
        !          7230: <tt>ChangeMainFile</tt> rule. The <tt>Create</tt> rules without indication of
        !          7231: the output file that are then executed write in this new file. Several
        !          7232: <tt>ChangeMainFile</tt> rules can be executed during the same translation,
        !          7233: for dividing the main output into several files.</p>
1.30      cvs      7234: 
                   7235: <p>This rule is written with the <tt>ChangeMainFile</tt> keyword followed by
                   7236: the name of a variable that specifies the name of the new main file. The
1.37    ! cvs      7237: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the
        !          7238: rule to specify whether the operation should be performed before or after
        !          7239: translation of the rule's element (the default is before). This rule, like
        !          7240: all translation rules, is terminated by a semicolon.</p>
1.18      cvs      7241: <pre>               'ChangeMainFile' VarID [ Position ] ';'</pre>
1.30      cvs      7242: 
1.18      cvs      7243: <blockquote class="example">
1.30      cvs      7244:   <p><strong>Example:</strong></p>
                   7245: 
                   7246:   <p>To generate the translation of each section in a different file, the
1.37    ! cvs      7247:   following rule can be associated with type <tt>Section</tt>. That rule uses
1.30      cvs      7248:   the <a href="#varoutputfile"><tt>VarOutpuFile</tt> variable</a> defined
                   7249:   above.</p>
                   7250:   <pre>     Section:
1.18      cvs      7251:          ChangeMainFile VarOutpuFile Before;</pre>
1.30      cvs      7252: 
                   7253:   <p>If <tt>output.txt</tt> is the name of the output file specified when
                   7254:   starting the translation program, translated sections are written in files
                   7255:   <tt>output1.txt</tt>, <tt>output2.txt</tt>, etc.</p>
1.18      cvs      7256: </blockquote>
                   7257: </div>
1.1       cvs      7258: 
1.18      cvs      7259: <div class="subsection">
1.37    ! cvs      7260: <h3><a name="sectc5220a" id="sectc5220a">The <tt>RemoveFile</tt> rule</a></h3>
1.14      cvs      7261: 
1.37    ! cvs      7262: <p>Files may be used for storing temporary data that are no longer needed
        !          7263: when the translation of a document is complete. These files may be removed by
        !          7264: the <tt>RemoveFile</tt> rule.</p>
1.30      cvs      7265: 
                   7266: <p>This rule is written with the <tt>RemoveFile</tt> keyword followed by the
1.37    ! cvs      7267: name of a variable that specifies the name of the file to be removed. The
        !          7268: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the
        !          7269: rule to specify whether the operation should be performed before or after
        !          7270: translation of the rule's element (the default is before). This rule, like
1.30      cvs      7271: all translation rules, is terminated by a semicolon.</p>
1.18      cvs      7272: <pre>               'RemoveFile' VarID [ Position ] ';'</pre>
                   7273: </div>
                   7274: 
                   7275: <div class="subsection">
1.37    ! cvs      7276: <h3><a name="sectc5221" id="sectc5221">The <tt>Set</tt> and <tt>Add</tt>
        !          7277: rules</a></h3>
1.18      cvs      7278: 
1.37    ! cvs      7279: <p>The <tt>Set</tt> and <tt>Add</tt> rules are used for modifying the value
        !          7280: of counters that have no <a href="#sectc524">counting function</a>. Only this
1.18      cvs      7281: type of counter can be used in the <tt>Set</tt> and <tt>Add</tt> rules.</p>
1.30      cvs      7282: 
                   7283: <p>Both rules have the same syntax: after the keyword <tt>Set</tt> or
1.18      cvs      7284: <tt>Add</tt> appear the counter name and the value to assign to the counter
                   7285: (<tt>Set</tt> rule) or the value to be added to the counter (<tt>Add</tt>
1.37    ! cvs      7286: rule). The keyword <tt>Before</tt> or <tt>After</tt> can follow that value to
1.1       cvs      7287: indicate when the rule must be applied: before or after the element's content
1.37    ! cvs      7288: is translated. By default, <tt>Before</tt> is assumed. A semicolon terminates
1.18      cvs      7289: the rule.</p>
                   7290: <pre>               'Set' CounterID InitValue [ Position ] ';' /
                   7291:                'Add' CounterID Increment [ Position ] ';'</pre>
                   7292: </div>
                   7293: 
                   7294: <div class="subsection">
1.37    ! cvs      7295: <h3><a name="sectc5221a" id="sectc5221a">The <tt>Indent</tt> rule</a></h3>
1.18      cvs      7296: 
1.37    ! cvs      7297: <p>The <tt>Indent</tt> rule is used to modify the value of text indentation
        !          7298: in the output files.</p>
1.30      cvs      7299: 
1.37    ! cvs      7300: <p>Each time the translator creates a new line in an output file, it
        !          7301: generates a variable number of space characters at the beginning of the new
        !          7302: line. By default, the number of these characters (the indentation value) is
        !          7303: 0. It can be changed with the <tt>Indent</tt> rule.</p>
1.30      cvs      7304: 
                   7305: <p>In its simple form, the rule begins with the <tt>Indent</tt> keyword,
1.25      cvs      7306: followed by the indentation sign (optional) and value and a keyword
1.30      cvs      7307: <tt>Before</tt> or <tt>After</tt> indicating that the indentation should be
                   7308: changed <a href="#sectc5222">before or after</a> the element's content is
1.37    ! cvs      7309: generated. If the position is not indicated, the indentation is changed
        !          7310: before the element's content is generated. This rule, like all translation
1.25      cvs      7311: rules, is terminated by a semicolon.</p>
1.30      cvs      7312: 
                   7313: <p>The indentation value is indicated by an integer, which is the number of
                   7314: space characters to be generated at the beginning of each new line. A sign
1.18      cvs      7315: (<tt>+</tt> or <tt>-</tt>) can appear before the integer to indicate that the
1.37    ! cvs      7316: value is relative: the current value of indentation is incremented (if sign
        !          7317: is <tt>+</tt>) or decremented (if sign is <tt>-</tt>) by the specified
        !          7318: value.</p>
1.30      cvs      7319: 
                   7320: <p>Keyword <tt>Suspend</tt> or <tt>Resume</tt> can appear instead of the
1.37    ! cvs      7321: (possibly signed) identation value. <tt>Suspend</tt> means that the new
1.30      cvs      7322: indentation value to be used is zero until another <tt>Indent</tt> rule is
                   7323: executed and changes the indentation value. <tt>Resume</tt> means that the
                   7324: indentation value that was used before the last <tt>Indent Suspend</tt> was
1.37    ! cvs      7325: executed becomes the new value. Only one <tt>Suspend</tt> can be used before
1.30      cvs      7326: a <tt>Resume</tt>; <tt>Supend</tt>-<tt>Resume</tt> pairs can not be
                   7327: nested.</p>
                   7328: 
1.37    ! cvs      7329: <p>Like the <a href="#sectc5210"><tt>Create</tt> rule</a>, the
        !          7330: <tt>Indent</tt> keyword can be followed by the <tt>IN</tt> keyword and by the
        !          7331: name of a <a href="#sectc526">variable</a>. This means that the rule must not
        !          7332: change indentation in the main output file, but in the file whose name is
        !          7333: specified by the variable (by default, indentation is changed in the main
        !          7334: output file).</p>
1.25      cvs      7335: <pre>               'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .
1.10      cvs      7336: 
1.25      cvs      7337: Indent        = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue .
1.10      cvs      7338: IndentSign    = '+' / '-' .
1.18      cvs      7339: IndentValue   = NUMBER .</pre>
                   7340: </div>
1.10      cvs      7341: 
1.18      cvs      7342: <div class="subsection">
1.37    ! cvs      7343: <h3><a name="sectc5222" id="sectc5222">Rule application order</a></h3>
1.1       cvs      7344: 
1.30      cvs      7345: <p>The translator translates the elements which comprise the document in the
1.37    ! cvs      7346: order induced by the tree structure, except when the <tt>Get</tt> rule is
        !          7347: used to change the order of translation. For each element, the translator
        !          7348: first applies the rules specified for the element's type that must be applied
        !          7349: before translation of the element's content (rules ending with the
        !          7350: <tt>Before</tt> keyword or which have no position keyword). If several rules
        !          7351: meet these criteria, the translator applies them in the order in where they
        !          7352: appear in the translation schema.</p>
        !          7353: 
        !          7354: <p>It then applies all <a href="#sectc5223">rules for the attributes</a>
        !          7355: which the element has and which must be applied before the translation of the
        !          7356: element's content (rules ending with the <tt>Before</tt> keyword or which
        !          7357: have no position keyword). For one attribute value, the translator applies
        !          7358: the rules in the order in which they are defined in the translation
        !          7359: schema.</p>
1.30      cvs      7360: 
                   7361: <p>The same procedure is followed with translation rules for specific
1.18      cvs      7362: presentations.</p>
1.30      cvs      7363: 
1.31      cvs      7364: <p>Next, the element's content is translated, as long as a <tt>Remove</tt> or
                   7365: <code>Ignore</code> rule does not apply.</p>
1.30      cvs      7366: 
                   7367: <p>In the next step, the translator applies rules for the specific
                   7368: presentation of the element that are to be applied after translation of the
1.37    ! cvs      7369: content (rules which end with the <tt>After</tt> keyword). The rules for each
1.30      cvs      7370: type of presentation rule or each value are applied in the order in which the
1.18      cvs      7371: translation appear in the schema.</p>
1.30      cvs      7372: 
                   7373: <p>Then, the same procedure is followed for translation rules for attributes
                   7374: of the element.</p>
                   7375: 
1.37    ! cvs      7376: <p>Finally, the translator applies rules for the element which must be
        !          7377: applied after translation of the element's content. These rules are applied
        !          7378: in the order that they appear in the translation schema. When the translation
        !          7379: of an element is done, the translator procedes to translate the following
1.18      cvs      7380: element.</p>
1.30      cvs      7381: 
                   7382: <p>This order can be changed with the <tt>Attributes</tt> and
1.18      cvs      7383: <tt>Presentation</tt> options of the <a href="#sectc5210"><tt>Create</tt>
                   7384: rule</a>.</p>
                   7385: </div>
1.1       cvs      7386: 
1.18      cvs      7387: <div class="subsection">
1.37    ! cvs      7388: <h3><a name="sectc5223" id="sectc5223">Translation of logical
        !          7389: attributes</a></h3>
1.1       cvs      7390: 
1.37    ! cvs      7391: <p>After the rules for the element types, the translation schema defines
        !          7392: rules for attribute values. This section begins with the <tt>ATTRIBUTES</tt>
1.1       cvs      7393: keyword and is composed of a sequence of rule blocks each preceded by an
1.18      cvs      7394: attribute name and an optional value or value range.</p>
1.30      cvs      7395: 
                   7396: <p>If the attribute's name appears alone before the rule block, the rule are
1.1       cvs      7397: applied to all element which have the attribute, no matter what value the
1.37    ! cvs      7398: attribute has. In this case, the attribute name is followed by a colon before
1.18      cvs      7399: the beginning of the rule block.</p>
1.30      cvs      7400: 
1.37    ! cvs      7401: <p>The attribute's name can be followed by the name of an element type
        !          7402: between parentheses. This says, as in presentation schemas, that the rule
        !          7403: block which follows applies not to the element which has the attribute, but
        !          7404: to its descendants of the type indicated between the parentheses.</p>
1.30      cvs      7405: 
                   7406: <p>If values are given after the attribute name (or after the name of the
1.37    ! cvs      7407: element type), the rules are applied only when the attribute has the
        !          7408: indicated values. The same attribute can appear several times, with different
        !          7409: values and different translation rules. Attribute values are indicated in the
        !          7410: same way as in <a href="#sectc528">conditions</a> and are followed by a colon
        !          7411: before the block of rules.</p>
1.30      cvs      7412: 
                   7413: <p>The rule block associated with an attribute is either a simple rule or a
1.18      cvs      7414: sequence of rules delimited by the <tt>BEGIN</tt> and <tt>END</tt> keywords.
                   7415: Note that rules associated with attribute values cannot be conditional.</p>
1.30      cvs      7416: 
                   7417: <p>Translation rules are not required for all attributes (or their values)
1.37    ! cvs      7418: defined in a structure schema. Only those attributes for which a particular
        !          7419: action must be performed by the translator must have such rules. The rules
1.18      cvs      7420: that can be used are those described above, from <a
                   7421: href="#sectc5210"><tt>Create</tt></a> to <a
                   7422: href="#sectc5218"><tt>NoTranslation</tt></a>.</p>
1.30      cvs      7423: <pre>     AttrSeq       = TransAttr &lt; TransAttr &gt; .
1.1       cvs      7424:      TransAttr     = AttrID [ '(' ElemID ')' ] 
                   7425:                      [ RelatAttr ] ':' RuleSeq .
                   7426:      AttrID        = NAME .
1.18      cvs      7427:      ElemID        = NAME .</pre>
1.30      cvs      7428: 
1.18      cvs      7429: <blockquote class="example">
1.30      cvs      7430:   <p><strong>Example:</strong></p>
                   7431: 
                   7432:   <p>The structure defined the ``Language'' attribute which can take the
1.37    ! cvs      7433:   values ``French'' and ``English''. To have the French parts of the original
1.30      cvs      7434:   document removed and prevent the translation of the leaves of the English
                   7435:   parts, the following rules would be used:</p>
                   7436:   <pre>ATTRIBUTES
1.1       cvs      7437:    Language=French :
                   7438:       Remove;
                   7439:    Language=English :
1.18      cvs      7440:       NoTranslation;</pre>
                   7441: </blockquote>
                   7442: </div>
1.1       cvs      7443: 
1.18      cvs      7444: <div class="subsection">
1.37    ! cvs      7445: <h3><a name="sectc5224" id="sectc5224">Translation of specific
        !          7446: presentations</a></h3>
1.1       cvs      7447: 
1.30      cvs      7448: <p>After the rules for attributes, the translation schema defines rules for
1.37    ! cvs      7449: the specific presentation. This section begins with the <tt>PRESENTATION</tt>
        !          7450: keyword and is composed of a sequence of translation rule blocks each
        !          7451: preceded by a presentation rule name, optionally accompanied by a part which
        !          7452: depends on the particular presentation rule.</p>
1.30      cvs      7453: 
                   7454: <p>Each of these translation rule blocks is applied when the translator
                   7455: operates on an element which has a specific presentation rule of the type
1.37    ! cvs      7456: indicated at the head of the block. Depending on the type of the specific
1.30      cvs      7457: presentation rule, it is possible to specify values of the presentation rule
                   7458: for which the translation rule block should be applied.</p>
                   7459: 
                   7460: <p>There are three categories of the presentation rules:</p>
                   7461: <ul>
                   7462:   <li>rules taking numeric values: <tt>Size</tt>, <tt>Indent</tt>,
                   7463:     <tt>LineSpacing</tt>, <tt>LineWeight</tt>,</li>
                   7464:   <li>rules whose values are taken from a predefined list (i.e. whose type is
1.36      cvs      7465:     an enumeration): <tt>Adjust</tt>, <tt>Hyphenate,/TT&gt;, <tt>Style</tt>,
                   7466:     <tt>Weight</tt>, <tt>Font</tt>, <tt>UnderLine</tt>, <tt>Thickness</tt>,
                   7467:     <tt>LineStyle</tt>,</tt></li>
1.30      cvs      7468:   <li>rules whose value is a name: <tt>FillPattern</tt>, <tt>Background</tt>,
                   7469:     <tt>Foreground</tt>.</li>
1.18      cvs      7470: </ul>
1.30      cvs      7471: 
                   7472: <p>For presentation rules of the first category, the values which provoke
1.1       cvs      7473: application of the translation rules are indicated in the same manner as for
1.37    ! cvs      7474: <a href="#relattr">numeric attributes</a>. This can be either a unique value
        !          7475: or range of values. For a unique value, the value (an integer) is simply
        !          7476: preceded by an equals sign. Value ranges can be specified in one of three
1.18      cvs      7477: ways:</p>
                   7478: <ul>
1.30      cvs      7479:   <li>all values less than a given value (this value is preceded by a ``less
                   7480:     than'' sign '<tt>&lt;</tt>'),</li>
                   7481:   <li>all values greater than a given value (this value is preceded by a`
                   7482:     `greater than'' sign '<tt>&gt;</tt>'),</li>
1.37    ! cvs      7483:   <li>all values falling in an interval, bounds included. The range of values
1.30      cvs      7484:     is then specified <tt>IN [</tt>Minimum<tt>..</tt>Maximum<tt>]</tt>, where
                   7485:     Minimum and Maximum are integers.</li>
1.18      cvs      7486: </ul>
1.30      cvs      7487: 
                   7488: <p>All numeric values can be negative, in which case the integer is preceded
1.37    ! cvs      7489: by a minus sign. All values must be given in typographers points.</p>
1.30      cvs      7490: 
                   7491: <p>For presentation rules whose values are taken from a predefined list, the
1.1       cvs      7492: value which provokes application of the translation rules is simply indicated
1.18      cvs      7493: by the equals sign followed by the name of the value.</p>
1.30      cvs      7494: 
1.37    ! cvs      7495: <p>For presentation rules whose values are names, the value which provokes
        !          7496: the application of translation rules is simply indicated by the equals sign
        !          7497: followed by the name of the value. The names of the fill patterns (the
1.18      cvs      7498: <tt>FillPattern</tt> rule) and of the colors (the <tt>Foreground</tt> and
                   7499: <tt>Background</tt> rules) used in Thot are the same as in the P language.</p>
1.30      cvs      7500: <pre>     PresSeq        = PresTrans &lt; PresTrans &gt; .
1.1       cvs      7501:      PresTrans      = PresRule ':' RuleSeq .
                   7502:      PresRule       = 'Size' [ PresRelation ] /
                   7503:                       'Indent' [ PresRelation ] /
                   7504:                       'LineSpacing' [ PresRelation ] /
                   7505:                       'Adjust' [ '=' AdjustVal ] /
                   7506:                       'Hyphenate' [ '=' BoolVal ] /
                   7507:                       'Style' [ '=' StyleVal ] /
1.24      cvs      7508:                       'Weight' [ '=' WeightVal ] /
1.1       cvs      7509:                       'Font' [ '=' FontVal ] /
                   7510:                       'UnderLine' [ '=' UnderLineVal ] /
                   7511:                       'Thickness' [ '=' ThicknessVal ] /
                   7512:                       'LineStyle' [ '=' LineStyleVal ] /
                   7513:                       'LineWeight' [ PresRelation ] /
                   7514:                       'FillPattern' [ '=' Pattern ] /
                   7515:                       'Background' [ '=' Color ] /
                   7516:                       'Foreground' [ '=' Color ] .
                   7517: 
                   7518:      PresRelation   = '=' PresValue /
1.30      cvs      7519:                       '&gt;' [ '-' ] PresMinimum /
1.1       cvs      7520:                       '&lt;' [ '-' ] PresMaximum /
                   7521:                       'IN' '[' [ '-' ] PresIntervalMin '..'
                   7522:                               [ '-' ] PresIntervalMax ']' .
1.35      cvs      7523:      AdjustVal      = 'Left' / 'Right' / 'VMiddle' / 'Justify' /
1.1       cvs      7524:                       'LeftWithDots' .
                   7525:      BoolVal        = 'Yes' / 'No' .
1.24      cvs      7526:      StyleVal       = 'Roman' / 'Italics' / 'Oblique' .
                   7527:      WeightVal      = 'Normal' / 'Bold' .
1.1       cvs      7528:      FontVal        = 'Times' / 'Helvetica' / 'Courier' .
                   7529:      UnderLineVal   = 'NoUnderline' / 'UnderLined' /
                   7530:                       'OverLined' / 'CrossedOut' .
                   7531:      ThicknessVal   = 'Thick' / 'Thin' .
1.6       cvs      7532:      LineStyleVal   = 'Solid' / 'Dashed' / 'Dotted' .
1.1       cvs      7533:      Pattern        = NAME .
                   7534:      Color          = NAME .
                   7535:      PresMinimum    = NUMBER .
                   7536:      PresMaximum    = NUMBER .
                   7537:      PresIntervalMin= NUMBER .
                   7538:      PresIntervalMax= NUMBER .
                   7539:      PresValue      = [ '-' ] PresVal .
1.18      cvs      7540:      PresVal        = NUMBER .</pre>
1.30      cvs      7541: 
1.37    ! cvs      7542: <p>The <a name="prestransl" id="prestransl">translation rules associated with
        !          7543: specific presentation rules</a> can use the value of the specific
        !          7544: presentation rule that causes them to be applied. This behavior is designated
        !          7545: by the keyword <tt>Value</tt>. For numerically-valued presentation rules, the
        !          7546: numeric value is produced. For other presentation rules, the name of the
        !          7547: value is produced.</p>
1.30      cvs      7548: 
                   7549: <p>It should be noted that modifications to the layout of the document's
                   7550: elements that are made using the combination of the control key and a mouse
                   7551: button will have no effect on the translation of the document.</p>
                   7552: 
                   7553: <blockquote class="example">
                   7554:   <p><strong>Example:</strong></p>
                   7555: 
                   7556:   <p>Suppose that it is desirable to use the same font sizes as in the
                   7557:   specific presentation, but the font size must be between 10 and 18
                   7558:   typographer's points. If font size is set in the translated document by the
                   7559:   string <tt>pointsize=n</tt> where <tt>n</tt> is the font size in
                   7560:   typographer's points then the following rules will suffice:</p>
                   7561:   <pre>PRESENTATION
1.1       cvs      7562:    Size &lt; 10 :
                   7563:         Create 'pointsize=10';
                   7564:    Size in [10..18] :
                   7565:         BEGIN
                   7566:         Create 'pointsize=';
                   7567:         Create Value;
                   7568:         END;
1.30      cvs      7569:    Size &gt; 18 :
1.18      cvs      7570:         Create 'pointsize=18';</pre>
                   7571: </blockquote>
                   7572: </div>
1.1       cvs      7573: 
1.18      cvs      7574: <div class="subsection">
1.37    ! cvs      7575: <h3><a name="sectc5225" id="sectc5225">Recoding of characters, symbols and
        !          7576: graphics</a></h3>
1.1       cvs      7577: 
1.37    ! cvs      7578: <p>The coding of characters, graphical elements and symbols as defined in
        !          7579: Thot does not necessarily correspond to what is required by an application to
        !          7580: which a Thot document must be exported. Because of this the translator can
        !          7581: recode these terminal elements of the documents structure. The last sections
        !          7582: of a translation schema are intended for this purpose, each specifying the
        !          7583: recoding rules for one type of terminal element.</p>
1.30      cvs      7584: 
1.37    ! cvs      7585: <p>The recoding rules for character strings are grouped by alphabets. There
        !          7586: is a group of rules for each alphabet of the Thot document that must be
1.30      cvs      7587: translated. Each such group of rules begins with the <tt>TEXTTRANSLATE</tt>
                   7588: keyword, followed by the specification of the alphabet to translate and the
                   7589: recoding rules, between the <tt>BEGIN</tt> and <tt>END</tt> keywords unless
                   7590: there is only one recoding rule for the alphabet. The specification of the
                   7591: alphabet is not required: by default it is assumed to the Latin alphabet (the
                   7592: ISO Latin-1 character set).</p>
                   7593: 
                   7594: <p>Each recoding rule is formed by a source string between apostrophes and a
1.1       cvs      7595: target string, also between apostrophes, the two strings being separated by
1.30      cvs      7596: the arrow symbol (<tt>-&gt;</tt>), formed by the ``minus'' and ``greater
1.37    ! cvs      7597: than'' characters. The rule is terminated by a semi-colon.</p>
1.18      cvs      7598: <pre>     TextTransSeq = [ Alphabet ] TransSeq .
1.1       cvs      7599:      Alphabet     = NAME .
1.30      cvs      7600:      TransSeq     ='BEGIN' &lt; Translation &gt; 'END' ';' /
1.1       cvs      7601:                     Translation .
1.30      cvs      7602:      Translation  = Source [ '-&gt;' Target ] ';' .
1.1       cvs      7603:      Source       = STRING .
1.18      cvs      7604:      Target       = STRING .</pre>
1.30      cvs      7605: 
                   7606: <p>One such rule signifies that when the source string appears in a text leaf
                   7607: of the document being translated, the translator must replace it, in the
1.37    ! cvs      7608: translated document, with the target string. The source string and the target
        !          7609: string can have different lengths and the target string can be empty. In this
1.1       cvs      7610: last case, the translator simply suppresses every occurrence of the source
1.18      cvs      7611: string in the translated document.</p>
1.30      cvs      7612: 
                   7613: <p>For a given alphabet, the order of the rules is not important and has no
1.1       cvs      7614: significance because the T language compiler reorders the rules in ways that
1.37    ! cvs      7615: speed up the translator's work. The total number of recoding rules is limited
1.18      cvs      7616: by the compiler as is the maximum length of the source and target strings.</p>
1.30      cvs      7617: 
                   7618: <p>The recoding rules for symbols and graphical elements are written in the
1.37    ! cvs      7619: same manner as the recoding rules for character strings. They are preceded,
        !          7620: respectively, by the <tt>SYMBTRANSLATE</tt> and <tt>GRAPHTRANSLATE</tt> and
        !          7621: so not require a specification of the alphabet. Their source string is
        !          7622: limited to one character, since, in Thot, each symbol and each graphical
        !          7623: element is represented by a single character. The symbol and graphical
        !          7624: element codes are defined along with the <a href="#sect7">non-standard
        !          7625: character codes</a>.</p>
1.30      cvs      7626: 
1.18      cvs      7627: <blockquote class="example">
1.30      cvs      7628:   <p><strong>Example:</strong></p>
                   7629: 
                   7630:   <p>In a translation schema producing documents destined for use with the
                   7631:   L<sup>A</sup>T<sub><big>E</big></sub>X formatter, the Latin characters``é''
1.37    ! cvs      7632:   (octal code 351 in Thot) and ``č'' (octal code 350 in Thot) must be
1.30      cvs      7633:   converted to their representation in
                   7634:   L<sup>A</sup>T<sub><big>E</big></sub>X:</p>
                   7635:   <pre>TEXTTRANSLATE Latin
1.1       cvs      7636:      BEGIN
1.30      cvs      7637:      '\350' -&gt; '\`{e}';    { e grave }
                   7638:      '\351' -&gt; '\''{e}';   { e acute }
1.18      cvs      7639:      END;</pre>
                   7640: </blockquote>
                   7641: </div>
                   7642: </div>
1.37    ! cvs      7643: <hr />
1.18      cvs      7644: </div>
1.1       cvs      7645: 
1.18      cvs      7646: <div class="chapter">
1.37    ! cvs      7647: <h1><a name="sect6" id="sect6">Language grammars</a></h1>
1.1       cvs      7648: 
1.30      cvs      7649: <p>This chapter gives the complete grammars of the languages of Thot. The
1.1       cvs      7650: grammars were presented and described in the preceding chapters, which also
1.37    ! cvs      7651: specify the semantics of the languages. This section gives only the
1.18      cvs      7652: syntax.</p>
1.1       cvs      7653: 
1.18      cvs      7654: <div class="section">
1.37    ! cvs      7655: <h2><a name="sectb61" id="sectb61">The M meta-language</a></h2>
1.1       cvs      7656: 
1.30      cvs      7657: <p>The language grammars are all expressed in the same formalism, the M
1.18      cvs      7658: meta-language, which is defined in this section.</p>
                   7659: <pre>{ Any text between braces is a comment. }
1.30      cvs      7660: Grammar      = Rule &lt; Rule &gt; 'END' .
                   7661:                { The &lt; and &gt; signs indicate zero }
1.1       cvs      7662:                { or more repetitions. }
                   7663:                { END marks the end of the grammar. }
                   7664: Rule         = Ident '=' RightPart '.' .
                   7665:                { The period indicates the end of a rule }
                   7666: RightPart    = RtTerminal / RtIntermed .
                   7667:                { The slash indicates a choice }
                   7668: RtTerminal   ='NAME' / 'STRING' / 'NUMBER' .
                   7669:                { Right part of a terminal rule }
1.30      cvs      7670: RtIntermed   = Possibility &lt; '/' Possibility &gt; .
1.1       cvs      7671:                { Right part of an intermediate rule }
1.30      cvs      7672: Possibility  = ElemOpt &lt; ElemOpt &gt; .
                   7673: ElemOpt      = Element / '[' Element &lt; Element &gt; ']' /
                   7674:               '&lt;' Element &lt; Element &gt; '&gt;'  .
1.1       cvs      7675:                { Brackets delimit optional parts }
                   7676: Element      = Ident / KeyWord .
                   7677: Ident        = NAME .
                   7678:                { Identifier, sequence of characters
                   7679: KeyWord      = STRING .
                   7680:                { Character string delimited by apostrophes }
1.18      cvs      7681: END</pre>
                   7682: </div>
1.1       cvs      7683: 
1.18      cvs      7684: <div class="section">
1.37    ! cvs      7685: <h2><a name="sectb62" id="sectb62">The S language</a></h2>
1.1       cvs      7686: 
1.30      cvs      7687: <p>The S language is used to write structure schemas, which contain the
1.37    ! cvs      7688: generic logical structures of document and object classes. It is described
1.30      cvs      7689: here in the M meta-language.</p>
1.18      cvs      7690: <pre>StructSchema   = 'STRUCTURE' [ 'EXTENSION' ] ElemID ';'
1.1       cvs      7691:                  'DEFPRES' PresID ';'
                   7692:                [ 'ATTR' AttrSeq ]
                   7693:                [ 'STRUCT' RulesSeq ]
                   7694:                [ 'EXTENS' ExtensRuleSeq ]
                   7695:                [ 'UNITS' RulesSeq ]
                   7696:                [ 'EXPORT' SkeletonSeq ]
                   7697:                [ 'EXCEPT' ExceptSeq ]
                   7698:                  'END' .
                   7699: 
                   7700: ElemID         = NAME .
                   7701: PresID         = NAME .
                   7702: 
1.30      cvs      7703: AttrSeq        = Attribute &lt; Attribute &gt; .
1.1       cvs      7704: Attribute      = AttrID '=' AttrType ';' .
                   7705: AttrType       = 'INTEGER' / 'TEXT' /
                   7706:                  'REFERENCE' '(' RefType ')' /
                   7707:                  ValueSeq .
                   7708: RefType        = 'ANY' /
                   7709:                  [ FirstSec ] ElemID [ ExtStruct ] .
1.30      cvs      7710: ValueSeq       = AttrVal &lt; ',' AttrVal &gt; .
1.1       cvs      7711: AttrID         = NAME .
                   7712: FirstSec       = 'First' / 'Second' .
                   7713: ExtStruct      = '(' ElemID ')' .
                   7714: AttrVal        = NAME .
                   7715: 
1.30      cvs      7716: RulesSeq       = Rule &lt; Rule &gt; .
1.1       cvs      7717: Rule           = ElemID [ LocAttrSeq ] '='
                   7718:                  DefWithAttr ';' .
                   7719: LocAttrSeq     = '(' 'ATTR' LocalAttr
1.30      cvs      7720:                       &lt; ';' LocalAttr &gt; ')' .
1.1       cvs      7721: LocalAttr      = [ '!' ] AttrID [ '=' AttrType ] .
                   7722: DefWithAttr    = Definition
                   7723:                  [ '+' '(' ExtensionSeq ')' ]
                   7724:                  [ '-' '(' RestrictSeq ')' ]
                   7725:                  [ 'WITH' FixedAttrSeq ] .
1.30      cvs      7726: ExtensionSeq   = ExtensionElem &lt; ',' ExtensionElem &gt; .
1.1       cvs      7727: ExtensionElem  = ElemID / 'TEXT' / 'GRAPHICS' /
                   7728:                  'SYMBOL' / 'PICTURE' .
1.30      cvs      7729: RestrictSeq    = RestrictElem &lt; ',' RestrictElem &gt; .
1.1       cvs      7730: RestrictElem   = ElemID / 'TEXT' / 'GRAPHICS' /
                   7731:                  'SYMBOL' / 'PICTURE' .
1.30      cvs      7732: FixedAttrSeq   = FixedAttr &lt; ',' FixedAttr &gt; .
1.1       cvs      7733: FixedAttr      = AttrID [ FixedOrModifVal ] .
                   7734: FixedOrModifVal= [ '?' ] '=' FixedValue .
                   7735: FixedValue     = [ '-' ] NumValue / TextValue / AttrVal .
                   7736: NumValue       = NUMBER .
                   7737: TextValue      = STRING .
                   7738: 
                   7739: Definition     = BaseType [ LocAttrSeq ] / Constr /
                   7740:                  Element .
                   7741: BaseType       = 'TEXT' / 'GRAPHICS' / 'SYMBOL' /
                   7742:                  'PICTURE' / 'UNIT' / 'NATURE' .
                   7743: Element        = ElemID [ ExtOrDef ] .
                   7744: ExtOrDef       = 'EXTERN' / 'INCLUDED' /
                   7745:                  [ LocAttrSeq ] '=' Definition .
                   7746: 
                   7747: Constr         = 'LIST' [ '[' min '..' max ']' ] 'OF'
                   7748:                         '(' DefWithAttr ')' /
                   7749:                  'BEGIN' DefOptSeq 'END' /
                   7750:                  'AGGREGATE' DefOptSeq 'END' /
                   7751:                  'CASE' 'OF' DefSeq 'END' /
                   7752:                  'REFERENCE' '(' RefType ')' /
                   7753:                  'PAIR' .
                   7754: 
                   7755: min            = Integer / '*' .
                   7756: max            = Integer / '*' .
                   7757: Integer        = NUMBER .
                   7758: 
1.30      cvs      7759: DefOptSeq      = DefOpt ';' &lt; DefOpt ';' &gt; .
1.1       cvs      7760: DefOpt         = [ '?' ] DefWithAttr .
                   7761: 
1.30      cvs      7762: DefSeq         = DefWithAttr ';' &lt; DefWithAttr ';' &gt; .
1.1       cvs      7763: 
1.30      cvs      7764: SkeletonSeq    = SkeletonElem &lt; ',' SkeletonElem &gt; ';' .
1.1       cvs      7765: SkeletonElem   = ElemID [ 'WITH' Contents ] .
                   7766: Contents       = 'Nothing' / ElemID [ ExtStruct ] .
                   7767: 
1.30      cvs      7768: ExceptSeq      = Except ';' &lt; Except ';' &gt; .
1.1       cvs      7769: Except         = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr ':'
                   7770:                  ExcValSeq .
                   7771: ExcTypeOrAttr  = ElemID / AttrID .
1.30      cvs      7772: ExcValSeq      = ExcValue &lt; ',' ExcValue &gt; .
1.1       cvs      7773: ExcValue       = 'NoCut' / 'NoCreate' /
                   7774:                  'NoHMove' / 'NoVMove' / 'NoMove' /
                   7775:                  'NoHResize' / 'NoVResize' / 'NoResize' /
1.18      cvs      7776:                  'MoveResize' /
1.1       cvs      7777:                  'NewWidth' / 'NewHeight' /
                   7778:                  'NewHPos' / 'NewVPos' /
                   7779:                  'Invisible' / 'NoSelect' /
                   7780:                  'Hidden' / 'ActiveRef' /
                   7781:                  'ImportLine' / 'ImportParagraph' /
1.9       cvs      7782:                  'NoPaginate' / 'ParagraphBreak' /
                   7783:                  'HighlightChildren' / 'ExtendedSelection' /
1.36      cvs      7784:                  'SelectParent' / 'ClickableSurface' /
1.29      cvs      7785:                  'ReturnCreateNL' / 'ReturnCreateWithin' .
1.1       cvs      7786: 
1.30      cvs      7787: ExtensRuleSeq  = ExtensRule ';' &lt; ExtensRule ';' &gt; .
1.1       cvs      7788: ExtensRule     = RootOrElem [ LocAttrSeq ]
                   7789:                  [ '+' '(' ExtensionSeq ')' ]
                   7790:                  [ '-' '(' RestrictSeq ')' ]
                   7791:                  [ 'WITH' FixedAttrSeq ] .
                   7792: RootOrElem     = 'Root' / ElemID .
                   7793: 
1.18      cvs      7794: END</pre>
                   7795: </div>
1.1       cvs      7796: 
1.18      cvs      7797: <div class="section">
1.37    ! cvs      7798: <h2><a name="sectb63" id="sectb63">The P language</a></h2>
1.1       cvs      7799: 
1.30      cvs      7800: <p>The P language is used to write presentation schemas, which define the
1.1       cvs      7801: graphical presentation rules to be applied to different classes of documents
1.37    ! cvs      7802: and objects. It is described here in the M meta-language.</p>
1.18      cvs      7803: <pre>PresSchema      = 'PRESENTATION' ElemID ';'
1.1       cvs      7804:                 [ 'VIEWS' ViewSeq ]
                   7805:                 [ 'PRINT' PrintViewSeq ]
                   7806:                 [ 'COUNTERS' CounterSeq ]
                   7807:                 [ 'CONST' ConstSeq ]
                   7808:                 [ 'VAR' VarSeq ]
                   7809:                 [ 'DEFAULT' ViewRuleSeq ]
                   7810:                 [ 'BOXES' BoxSeq ]
                   7811:                 [ 'RULES' PresentSeq ]
                   7812:                 [ 'ATTRIBUTES' PresAttrSeq ]
                   7813:                 [ 'TRANSMIT' TransmitSeq ]
                   7814:                   'END' .
                   7815: 
                   7816: ElemID          = NAME .
                   7817: 
                   7818: ViewSeq         = ViewDeclaration
1.30      cvs      7819:                   &lt; ',' ViewDeclaration &gt; ';' .
1.1       cvs      7820: ViewDeclaration = ViewID [ 'EXPORT' ] .
                   7821: ViewID          = NAME .
                   7822: 
1.30      cvs      7823: PrintViewSeq    = PrintView &lt; ',' PrintView &gt; ';' .
1.37    ! cvs      7824: PrintView       = ViewID .
1.1       cvs      7825: 
1.30      cvs      7826: CounterSeq      = Counter &lt; Counter &gt; .
1.1       cvs      7827: Counter         = CounterID ':' CounterFunc ';' .
                   7828: CounterID       = NAME .
                   7829: CounterFunc     = 'RANK' 'OF' TypeOrPage [ SLevelAsc ]
                   7830:                   [ 'INIT' AttrID ] [ 'REINIT' AttrID ] /
1.30      cvs      7831:                   SetFunction &lt; SetFunction &gt;
                   7832:                   AddFunction &lt; AddFunction &gt;
1.1       cvs      7833:                   [ 'INIT' AttrID ] /
1.16      cvs      7834:                   'RLEVEL' 'OF' ElemID .
1.1       cvs      7835: SLevelAsc       = [ '-' ] LevelAsc .
                   7836: LevelAsc        = NUMBER .
                   7837: SetFunction     = 'SET' CounterValue 'ON' TypeOrPage .
                   7838: AddFunction     = 'ADD' CounterValue 'ON' TypeOrPage .
                   7839: TypeOrPage      = 'Page' [ '(' ViewID ')' ] /
1.16      cvs      7840:                   [ '*' ] ElemID .
1.1       cvs      7841: CounterValue    = NUMBER .
                   7842: 
1.30      cvs      7843: ConstSeq        = Const &lt; Const &gt; .
1.1       cvs      7844: Const           = ConstID '=' ConstType ConstValue ';' .
                   7845: ConstID         = NAME .
                   7846: ConstType       = 'Text' [ Alphabet ] / 'Symbol' /
                   7847:                   'Graphics' / 'Picture' .
                   7848: ConstValue      = STRING .
                   7849: Alphabet        = NAME .
                   7850: 
1.30      cvs      7851: VarSeq          = Variable &lt; Variable &gt; .
1.1       cvs      7852: Variable        = VarID ':' FunctionSeq ';' .
                   7853: VarID           = NAME .
1.30      cvs      7854: FunctionSeq     = Function &lt; Function &gt; .
1.1       cvs      7855: Function        = 'DATE' / 'FDATE' /
                   7856:                   'DocName' / 'DirName' /
                   7857:                   'ElemName' / 'AttributeName' /
                   7858:                   ConstID / ConstType ConstValue /
                   7859:                   AttrID /
                   7860:                   'VALUE' '(' PageAttrCtr ','
                   7861:                   CounterStyle ')' .
                   7862: PageAttrCtr     = 'PageNumber' [ '(' ViewID ')' ] /
                   7863:                   [ MinMax ] CounterID / AttrID .
                   7864: CounterStyle    = 'Arabic' / 'LRoman' / 'URoman' /
                   7865:                   'Uppercase' / 'Lowercase' .
                   7866: MinMax          = 'MaxRangeVal' / 'MinRangeVal' .
                   7867: 
1.30      cvs      7868: BoxSeq          = Box &lt; Box &gt; .
1.1       cvs      7869: Box             = 'FORWARD' BoxID ';' /
                   7870:                   BoxID ':' ViewRuleSeq .
                   7871: BoxID           = NAME .
                   7872: 
1.30      cvs      7873: PresentSeq      = Present &lt; Present &gt; .
1.1       cvs      7874: Present         = [ '*' ] [ FirstSec ] ElemID ':'
                   7875:                   ViewRuleSeq .
                   7876: FirstSec        = 'First' / 'Second' .
                   7877: 
1.30      cvs      7878: PresAttrSeq     = PresAttr &lt; PresAttr &gt; .
1.1       cvs      7879: PresAttr        = AttrID [ '(' [ FirstSec ] ElemID ')' ] 
                   7880:                   [ AttrRelation ] ':' ViewRuleSeq .
                   7881: AttrID          = NAME .
                   7882: AttrRelation    = '=' AttrVal /
1.30      cvs      7883:                   '&gt;' [ '-' ] MinValue /
1.1       cvs      7884:                   '&lt;' [ '-' ] MaxValue /
                   7885:                   'IN' '[' [ '-' ] LowerBound '..' 
                   7886:                   [ '-' ] UpperBound ']' /
                   7887:                   'GREATER' AttrID /
                   7888:                   'EQUAL' AttrID /
                   7889:                   'LESS' AttrID .
                   7890: AttrVal         = [ '-' ] EqualNum / EqualText / AttrValue .
                   7891: MinValue        = NUMBER .
                   7892: MaxValue        = NUMBER .
                   7893: LowerBound      = NUMBER .
                   7894: UpperBound      = NUMBER.
                   7895: EqualNum        = NUMBER .
                   7896: EqualText       = STRING .
                   7897: AttrValue       = NAME .
                   7898: 
1.30      cvs      7899: ViewRuleSeq     = 'BEGIN' &lt; RulesAndCond &gt; &lt; ViewRules &gt;
1.1       cvs      7900:                   'END' ';' /
                   7901:                   ViewRules / CondRules / Rule .
                   7902: RulesAndCond    = CondRules / Rule .
                   7903: ViewRules       = 'IN' ViewID CondRuleSeq .
1.30      cvs      7904: CondRuleSeq     = 'BEGIN' &lt; RulesAndCond &gt; 'END' ';' /
1.1       cvs      7905:                   CondRules / Rule .
1.30      cvs      7906: CondRules       = CondRule &lt; CondRule &gt;
1.1       cvs      7907:                   [ 'Otherwise' RuleSeq ] .
                   7908: CondRule        = 'IF' ConditionSeq RuleSeq .
1.30      cvs      7909: RulesSeq        = 'BEGIN' Rule &lt; Rule &gt; 'END' ';' / Rule .
1.1       cvs      7910: 
1.30      cvs      7911: ConditionSeq    = Condition &lt; 'AND' Condition &gt; .
1.6       cvs      7912: Condition       = [ 'NOT' ] [ 'Target' ] ConditionElem .
                   7913: ConditionElem   = 'First' / 'Last' /
                   7914:                   [ 'Immediately' ] 'Within' [ NumParent ]
                   7915:                                      ElemID [ ExtStruct ] /
                   7916:                    ElemID /
                   7917:                   'Referred' / 'FirstRef' / 'LastRef' /
                   7918:                   'ExternalRef' / 'InternalRef' / 'CopyRef' /
                   7919:                   'AnyAttributes' / 'FirstAttr' / 'LastAttr' /
                   7920:                   'UserPage' / 'StartPage' / 'ComputedPage' /
1.33      cvs      7921:                   'Empty' / 'Root' /
1.6       cvs      7922:                   '(' [ MinMax ] CounterName CounterCond ')' /
                   7923:                   CondPage '(' CounterID ')' .
                   7924: NumParent       = [ GreaterLess ] NParent .
1.30      cvs      7925: GreaterLess     = '&gt;' / '&lt;' .
1.6       cvs      7926: NParent         = NUMBER.
1.30      cvs      7927: CounterCond     = '&lt;' MaxCtrVal / '&gt;' MinCtrVal /
1.6       cvs      7928:                   '=' EqCtrVal / 
                   7929:                   'IN' '[' ['-'] MinCtrBound '..' 
                   7930:                   ['-'] MaxCtrBound ']' .
                   7931: PageCond        = 'Even' / 'Odd' / 'One' .
                   7932: MaxCtrVal       = NUMBER .
                   7933: MinCtrVal       = NUMBER .
                   7934: EqCtrVal        = NUMBER .
                   7935: MaxCtrBound     = NUMBER .
                   7936: MinCtrBound     = NUMBER .
1.1       cvs      7937: 
1.34      cvs      7938: Rule            = Property ';' / PresFunc ';' .
                   7939: Property        = 'VertRef' ':' HorizPosition /
1.1       cvs      7940:                   'HorizRef' ':' VertPosition /
                   7941:                   'VertPos' ':' VPos /
                   7942:                   'HorizPos' ':' HPos /
                   7943:                   'Height' ':' Extent /
                   7944:                   'Width' ':' Extent /
                   7945:                   'VertOverflow' ':' Boolean /
                   7946:                   'HorizOverflow' ':' Boolean /
1.26      cvs      7947:                   'MarginTop' ':' MarginWidth /
                   7948:                   'MarginRight' ':' MarginWidth /
                   7949:                   'MarginBottom' ':' MarginWidth /
                   7950:                   'MarginLeft' ':' MarginWidth /
                   7951:                   'PaddingTop' ':' PaddingWidth /
                   7952:                   'PaddingRight' ':' PaddingWidth /
                   7953:                   'PaddingBottom' ':' PaddingWidth /
                   7954:                   'PaddingLeft' ':' PaddingWidth /
                   7955:                   'BorderTopWidth' ':' BorderWidth /
                   7956:                   'BorderRightWidth' ':' BorderWidth /
                   7957:                   'BorderBottomWidth' ':' BorderWidth /
                   7958:                   'BorderLeftWidth' ':' BorderWidth /
                   7959:                   'BorderTopColor' ':' BorderColor /
                   7960:                   'BorderRightColor' ':' BorderColor /
                   7961:                   'BorderBottomColor' ':' BorderColor /
                   7962:                   'BorderLeftColor' ':' BorderColor /
                   7963:                   'BorderTopStyle' ':' BorderStyle /
                   7964:                   'BorderRightStyle' ':' BorderStyle /
                   7965:                   'BorderBottomStyle' ':' BorderStyle /
                   7966:                   'BorderLeftStyle' ':' BorderStyle .
1.1       cvs      7967:                   'LineSpacing' ':' DistOrInherit /
                   7968:                   'Indent' ':' DistOrInherit /
                   7969:                   'Adjust' ':' AlignOrInherit /
                   7970:                   'Hyphenate' ':' BoolInherit /
                   7971:                   'PageBreak' ':' Boolean /
                   7972:                   'LineBreak' ':' Boolean /
                   7973:                   'InLine' ':' Boolean /
                   7974:                   'NoBreak1' ':' AbsDist /
                   7975:                   'NoBreak2' ':' AbsDist /
                   7976:                   'Gather' ':' Boolean /
                   7977:                   'Visibility' ':' NumberInherit /
                   7978:                   'Size'  ':' SizeInherit /
                   7979:                   'Font' ':' NameInherit /
                   7980:                   'Style' ':' StyleInherit /
1.23      cvs      7981:                   'Weight' ':' WeightInherit /
1.1       cvs      7982:                   'Underline' ':' UnderLineInherit /
                   7983:                   'Thickness' ':' ThicknessInherit /
                   7984:                   'Depth' ':' NumberInherit /
                   7985:                   'LineStyle' ':' LineStyleInherit /
                   7986:                   'LineWeight' ':' DistOrInherit /
                   7987:                   'FillPattern' ':' NameInherit /
1.30      cvs      7988:                   'Background' ':' Color /
                   7989:                   'Foreground' ':' Color /
1.1       cvs      7990:                   'Content' ':' VarConst .
                   7991: PresFunc        = Creation '(' BoxID ')' /
                   7992:                   'Line' /
                   7993:                   'NoLine' /
                   7994:                   'Page' '(' BoxID ')' /
1.13      cvs      7995:                   'Copy' '(' BoxTypeToCopy ')' /
                   7996:                   'ShowBox' /
1.18      cvs      7997:                   'BackgroundPicture' ':' FileName /
                   7998:                   'PictureMode' ':' PictMode .
1.1       cvs      7999: 
                   8000: BoxTypeToCopy   = BoxID [ ExtStruct ] /
                   8001:                    ElemID [ ExtStruct ] .
                   8002: ExtStruct       = '(' ElemID ')' .
                   8003: 
                   8004: Distance        = [ Sign ] AbsDist .
                   8005: Sign            = '+' / '-' .
                   8006: AbsDist         = IntegerOrAttr [ '.' DecimalPart ]
                   8007:                   [ Unit ] .
                   8008: IntegerOrAttr   = IntegerPart / AttrID .
                   8009: IntegerPart     = NUMBER .
                   8010: DecimalPart     = NUMBER .
                   8011: Unit            = 'em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' /
                   8012:                   'pc' / 'px' / '%' .
                   8013: 
                   8014: HPos            = 'nil' / VertAxis '=' HorizPosition 
                   8015:                   [ 'UserSpecified' ] .
                   8016: VPos            = 'nil' / HorizAxis '=' VertPosition 
                   8017:                   [ 'UserSpecified' ] .
                   8018: VertAxis        = 'Left' / 'VMiddle' / 'VRef' / 'Right' .
                   8019: HorizAxis       = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' .
                   8020: 
1.6       cvs      8021: VertPosition    = Reference '.' HorizAxis [ Distance ] .
                   8022: HorizPosition   = Reference '.' VertAxis [ Distance ] .
                   8023: Reference       = 'Enclosing' [ BoxTypeNot ] /
                   8024:                   'Enclosed' [ BoxTypeNot ] /
                   8025:                   'Previous' [ BoxTypeNot ] /
                   8026:                   'Next' [ BoxTypeNot ] /
                   8027:                   'Referred' [ BoxTypeNot ] /
                   8028:                   'Creator' /
                   8029:                   'Root' /
                   8030:                   '*' /
                   8031:                   BoxOrType .
                   8032: BoxOrType       = BoxID /
                   8033:                   [ '*' ] [ FirstSec ] ElemID /
1.17      cvs      8034:                   'AnyElem' / 'AnyBox' /
                   8035:                   'ElemWithAttr' AttrID .
1.6       cvs      8036: BoxTypeNot      = [ 'NOT' ] BoxOrType .
                   8037: 
                   8038: Extent          = Reference '.' HeightWidth
                   8039:                   [ Relation ] [ 'Min' ] /
                   8040:                   AbsDist [ 'UserSpecified' ] [ 'Min' ] /
                   8041:                   HPos / VPos .
                   8042: HeightWidth     = 'Height' / 'Width' .
                   8043: Relation        = '*' ExtentAttr '%' / Distance .
                   8044: ExtentAttr      = ExtentVal / AttrID .
                   8045: ExtentVal       = NUMBER .
1.26      cvs      8046: 
                   8047: MarginWidth     = InheritParent / 'Auto' / Distance .
                   8048: PaddingWidth    = InheritParent / Distance .
                   8049: BorderWidth     = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance .
                   8050: BorderColor     = InheritParent / 'Transparent' / 'Foreground' /
                   8051:                   ColorName .
                   8052: BorderStyle     = InheritParent /
                   8053:                   'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' /
                   8054:                   'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' .
1.27      cvs      8055: InheritParent   = 'Enclosing' '=' / 'Creator' '=' .
1.26      cvs      8056: ColorName       = NAME .
1.6       cvs      8057: 
                   8058: Inheritance     = Kinship  InheritedValue .
                   8059: Kinship         = 'Enclosing' / 'GrandFather'/ 'Enclosed' /
                   8060:                   'Previous' / 'Creator' .
                   8061: InheritedValue  = '+' PosIntAttr [ 'Max' maximumA ] /
                   8062:                   '-' NegIntAttr [ 'Min' minimumA ] /
                   8063:                   '=' .
                   8064: PosIntAttr      = PosInt / AttrID .
                   8065: PosInt          = NUMBER .
                   8066: NegIntAttr      = NegInt / AttrID .
                   8067: NegInt          = NUMBER .
                   8068: maximumA        = maximum / AttrID .
                   8069: maximum         = NUMBER .
                   8070: minimumA        = minimum / AttrID .
                   8071: minimum         = NUMBER .
                   8072: 
                   8073: AlignOrInherit  = Kinship '=' / Alignment .
                   8074: Alignment       = 'Left' / 'Right' / 'VMiddle' /
                   8075:                   'LeftWithDots' .
1.1       cvs      8076: 
1.6       cvs      8077: DistOrInherit   = Kinship InheritedDist / Distance .
                   8078: InheritedDist   = '=' / '+' AbsDist / '-' AbsDist .
1.1       cvs      8079: 
1.6       cvs      8080: BoolInherit     = Boolean / Kinship '=' .
                   8081: Boolean         = 'Yes' / 'No' .
1.1       cvs      8082: 
1.6       cvs      8083: NumberInherit   = Integer / AttrID / Inheritance .
                   8084: Integer         = NUMBER .
1.1       cvs      8085: 
                   8086: LineStyleInherit= Kinship '=' / 'Solid' / 'Dashed' /
                   8087:                   'Dotted' .
                   8088: 
1.6       cvs      8089: SizeInherit     = SizeAttr [ 'pt' ] / Kinship InheritedSize .
                   8090: InheritedSize   = '+' SizeAttr [ 'pt' ]
                   8091:                       [ 'Max' MaxSizeAttr ] /
                   8092:                   '-' SizeAttr [ 'pt' ]
                   8093:                       [ 'Min' MinSizeAttr ] /
1.22      cvs      8094:                   '*' PercentSizeAttr '%' /
1.6       cvs      8095:                   '=' .
                   8096: SizeAttr        = Size / AttrID .
                   8097: Size            = NUMBER .
                   8098: MaxSizeAttr     = MaxSize / AttrID .
                   8099: MaxSize         = NUMBER .
                   8100: MinSizeAttr     = MinSize / AttrID .
                   8101: MinSize         = NUMBER .
1.22      cvs      8102: PercentSizeAttr = PercentSize / AttrID .
                   8103: PercentSize     = NUMBER .
1.6       cvs      8104: 
                   8105: NameInherit     = Kinship '=' / FontName .
                   8106: FontName        = NAME .
1.30      cvs      8107: Color           = 'Transparent' / Kinship '=' / FontName .
1.6       cvs      8108: StyleInherit    = Kinship '=' /
1.23      cvs      8109:                   'Roman' / 'Italics' / 'Oblique' .
                   8110: WeightInherit   = Kinship '=' /
                   8111:                   'Normal' / 'Bold' .
1.1       cvs      8112: UnderLineInherit= Kinship '=' /
1.6       cvs      8113:                   'NoUnderline' / 'Underlined' / 
                   8114:                   'Overlined' / 'CrossedOut' .
1.1       cvs      8115: ThicknessInherit= Kinship '=' / 'Thick' / 'Thin' .
1.13      cvs      8116: 
                   8117: FileName =        STRING .
                   8118: PictMode =        'NormalSize' / 'Scale' /
                   8119:                   'RepeatXY' / 'RepeatX' / 'RepeatY' .
1.1       cvs      8120: 
1.6       cvs      8121: VarConst        = ConstID / ConstType ConstValue /
                   8122:                   VarID / '(' FunctionSeq ')' /
                   8123:                   ElemID .
                   8124: 
                   8125: Creation        = Create [ 'Repeated' ] .
                   8126: Create          = 'CreateFirst' / 'CreateLast' /
                   8127:                   'CreateBefore' / 'CreateAfter' /
                   8128:                   'CreateEnclosing' .
                   8129: 
1.30      cvs      8130: TransmitSeq     = Transmit &lt; Transmit &gt; .
1.6       cvs      8131: Transmit        = TypeOrCounter 'To' ExternAttr
                   8132:                   '(' ElemID ')' ';' .
                   8133: TypeOrCounter   = CounterID / ElemID .
                   8134: ExternAttr      = NAME .
1.1       cvs      8135: 
1.18      cvs      8136: END</pre>
                   8137: </div>
1.1       cvs      8138: 
1.18      cvs      8139: <div class="section">
1.37    ! cvs      8140: <h2><a name="sectb64" id="sectb64">The T language</a></h2>
1.18      cvs      8141: <pre>TransSchema   = 'TRANSLATION' ElemID ';'
1.1       cvs      8142:               [ 'LINELENGTH' LineLength ';' ]
                   8143:               [ 'LINEEND' CHARACTER ';' ]
                   8144:               [ 'LINEENDINSERT' STRING ';' ]
                   8145:               [ 'BUFFERS' BufferSeq ]
                   8146:               [ 'COUNTERS' CounterSeq ]
                   8147:               [ 'CONST' ConstSeq ]
                   8148:               [ 'VAR' VariableSeq ]
                   8149:                 'RULES' ElemSeq
                   8150:               [ 'ATTRIBUTES' AttrSeq ]
                   8151:               [ 'PRESENTATION' PresSeq ]
1.30      cvs      8152:               &lt; 'TEXTTRANSLATE' TextTransSeq &gt;
1.1       cvs      8153:               [ 'SYMBTRANSLATE' TransSeq ]
                   8154:               [ 'GRAPHTRANSLATE' TransSeq ]
                   8155:                 'END' .
                   8156: 
                   8157: LineLength    = NUMBER .
                   8158: 
1.30      cvs      8159: BufferSeq     = Buffer &lt; Buffer &gt; .
1.1       cvs      8160: Buffer        = BufferID [ '(' 'Picture' ')' ] ';' .
                   8161: BufferID      = NAME .
                   8162: 
1.30      cvs      8163: CounterSeq    = Counter &lt; Counter &gt; .
1.1       cvs      8164: Counter       = CounterID [ ':' CounterFunc ] ';' .
                   8165: CounterID     = NAME .
                   8166: CounterFunc   = 'Rank' 'of' ElemID [ SLevelAsc ]
                   8167:                 [ 'Init' AttrID ] /
                   8168:                 'Rlevel' 'of' ElemID /
                   8169:                 'Set' InitValue 'On' ElemID
                   8170:                       'Add' Increment 'On' ElemID
                   8171:                       [ 'Init' AttrID ] .
                   8172: SLevelAsc     = [ '-' ] LevelAsc .
                   8173: LevelAsc      =  NUMBER .
                   8174: InitValue     = NUMBER .
                   8175: Increment     = NUMBER .
                   8176: ElemID        = NAME .
                   8177: AttrID        = NAME .
                   8178: 
1.30      cvs      8179: ConstSeq      = Const &lt; Const &gt; .
1.1       cvs      8180: Const         = ConstID '=' ConstValue ';' .
                   8181: ConstID       = NAME .
                   8182: ConstValue    = STRING .
                   8183: 
1.30      cvs      8184: VariableSeq   = Variable &lt; Variable &gt; .
                   8185: Variable      = VarID ':' Function &lt; Function &gt; ';' .
1.1       cvs      8186: VarID         = NAME .
                   8187: Function      = 'Value' '(' CounterID [ ':' Length ]
                   8188:                           [ ',' CounterStyle ]  ')' /
                   8189:                 'FileDir' / 'FileName' / 'Extension' /
                   8190:                 'DocumentName' / 'DocumentDir' /
                   8191:                 ConstID / CharString / 
                   8192:                 BufferID / AttrID .
                   8193: Length        = NUMBER .
                   8194: CounterStyle=   'Arabic' / 'LRoman' / 'URoman' /
                   8195:                 'Uppercase' / 'Lowercase' .
                   8196: CharString    = STRING .
                   8197: 
1.30      cvs      8198: ElemSeq       = TransType &lt; TransType &gt; .
1.1       cvs      8199: TransType     = [ FirstSec ] ElemID ':' RuleSeq .
                   8200: FirstSec      = 'First' / 'Second' .
1.30      cvs      8201: RuleSeq       = Rule / 'BEGIN' &lt; Rule &gt; 'END' ';' .
1.1       cvs      8202: Rule          = SimpleRule / ConditionBlock .
                   8203: ConditionBlock= 'IF' ConditionSeq SimpleRuleSeq .
1.30      cvs      8204: SimpleRuleSeq = 'BEGIN' &lt; SimpleRule &gt; 'END' ';' / 
1.1       cvs      8205:                 SimpleRule .
                   8206: 
                   8207: ConditionSeq  = Condition [ 'AND' Condition ] .
                   8208: Condition     = [ 'NOT' ] [ 'Target' ] Cond .
                   8209: Cond          = CondElem / CondAscend .
                   8210: CondElem      = 'FirstRef' / 'LastRef' /
                   8211:                 'ExternalRef' /
                   8212:                 'Alphabet' '=' Alphabet /
                   8213:                 'ComputedPage' / 'StartPage' / 
                   8214:                 'UserPage' / 'ReminderPage' /
                   8215:                 'Empty' /
1.18      cvs      8216:                 ElemID /
1.1       cvs      8217:                 'FirstAttr' / 'LastAttr' .
                   8218: CondAscend    = [ Ascend ] CondOnAscend .
                   8219: Ascend        = '*' / 'Parent' / 'Ancestor' LevelOrType .
                   8220: LevelOrType   = CondRelLevel / ElemID [ ExtStruct ] .
                   8221: CondRelLevel  = NUMBER .
                   8222: CondOnAscend  = 'First' / 'Last' /
                   8223:                 'Referred' / 
                   8224:                 [ 'Immediately' ] 'Within' [ NumParent ]
                   8225:                                   ElemID [ ExtStruct ] /
                   8226:                 'Attributes' /
                   8227:                 AttrID [ RelatAttr ] /
                   8228:                 'Presentation' /
1.34      cvs      8229:                 PresRule .
1.1       cvs      8230: NumParent     = [ GreaterLess ] NParent .
1.30      cvs      8231: GreaterLess   = '&gt;' / '&lt;' .
1.1       cvs      8232: NParent       = NUMBER.
                   8233: Alphabet      = NAME .
                   8234: RelatAttr     = '=' Value /
1.30      cvs      8235:                  '&gt;' [ '-' ] Minimum /
1.1       cvs      8236:                  '&lt;' [ '-' ] Maximum /
                   8237:                  'IN' '[' [ '-' ] MinInterval '..'
                   8238:                           [ '-' ] MaxInterval ']' .
                   8239: Value         = [ '-' ] IntegerVal / TextVal / AttrValue .
                   8240: Minimum       = NUMBER .
                   8241: Maximum       = NUMBER .
                   8242: MinInterval   = NUMBER .
                   8243: MaxInterval   = NUMBER .
                   8244: IntegerVal    = NUMBER .
                   8245: TextVal       = STRING .
                   8246: AttrValue     = NAME .
                   8247: 
                   8248: SimpleRule    = 'Create' [ 'IN' VarID ] Object
                   8249:                        [ Position ] ';' /
                   8250:                 'Write' Object [ Position ] ';' /
                   8251:                 'Read' BufferID [ Position ] ';' /
                   8252:                 'Include' File [ Position ] ';' /
1.6       cvs      8253:                 'Get'  [ RelPosition ] ElemID 
                   8254:                        [ ExtStruct ] 
                   8255:                        [ Position ] ';' /
1.1       cvs      8256:                 'Copy' [ RelPosition ] ElemID 
                   8257:                        [ ExtStruct ] 
                   8258:                        [ Position ] ';' /
                   8259:                 'Use' TrSchema [ 'For' ElemID ] ';' /
                   8260:                 'Remove' ';' /
1.31      cvs      8261:                 'Ignore' ';' /
1.1       cvs      8262:                 'NoTranslation' ';' /
                   8263:                 'NoLineBreak' ';' /
                   8264:                 'ChangeMainFile' VarID [ Position ] ';' /
1.14      cvs      8265:                 'RemoveFile' VarID [ Position ] ';' /
1.10      cvs      8266:                 'Set' CounterID InitValue [ Position ] ';' /
                   8267:                 'Add' CounterID Increment [ Position ] ';' /
1.25      cvs      8268:                 'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .
1.10      cvs      8269: 
1.25      cvs      8270: Indent        = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue .
1.10      cvs      8271: IndentSign    = '+' / '-' .
                   8272: IndentValue   = NUMBER .
1.1       cvs      8273: 
                   8274: Object        = ConstID / CharString /
                   8275:                 BufferID /
                   8276:                 VarID /
1.30      cvs      8277:                 '(' Function &lt; Function &gt; ')' /
1.21      cvs      8278:                  [ 'Translated' ] AttrID /
1.1       cvs      8279:                 'Value' /
                   8280:                 'Content' /
                   8281:                 'Attributes' /
                   8282:                 'Presentation' /
                   8283:                 'RefId' /
                   8284:                 'PairId' /
                   8285:                 'FileDir' / 'FileName' / 'Extension' /
                   8286:                 'DocumentName' / 'DocumentDir' /
                   8287:                 [ 'Referred' ] ReferredObject .
                   8288: Position      = 'After' / 'Before' .
                   8289: 
1.6       cvs      8290: ReferredObject= VarID /
                   8291:                 ElemID [ ExtStruct ] /
                   8292:                 'RefId' /
                   8293:                 'DocumentName' / 'DocumentDir' .                
1.1       cvs      8294: 
1.6       cvs      8295: File          = FileName / BufferID .
                   8296: FileName      = STRING .
1.1       cvs      8297: 
1.6       cvs      8298: RelPosition   = 'Included' / 'Referred' .
                   8299: ExtStruct     = '(' ElemID ')' .
1.1       cvs      8300: 
1.6       cvs      8301: TrSchema      = NAME .
                   8302: 
1.30      cvs      8303: AttrSeq       = TransAttr &lt; TransAttr &gt; .
1.6       cvs      8304: TransAttr     = AttrID [ '(' ElemID ')' ] 
                   8305:                 [ RelatAttr ] ':' RuleSeq .
                   8306: 
1.30      cvs      8307: PresSeq       = PresTrans &lt; PresTrans &gt; .
1.6       cvs      8308: PresTrans     = PresRule ':' RuleSeq .
                   8309: PresRule      = 'Size' [ PresRelation ] /
                   8310:                 'Indent' [ PresRelation ] /
                   8311:                 'LineSpacing' [ PresRelation ] /
                   8312:                 'Adjust' [ '=' AdjustVal ] /
                   8313:                 'Hyphenate' [ '=' BoolVal ] /
                   8314:                 'Style' [ '=' StyleVal ] /
1.24      cvs      8315:                 'Weight' [ '=' WeightVal ] /
1.6       cvs      8316:                 'Font' [ '=' FontVal ] /
                   8317:                 'UnderLine' [ '=' UnderLineVal ] /
                   8318:                 'Thickness' [ '=' ThicknessVal ] /
                   8319:                 'LineStyle' [ '=' LineStyleVal ] /
                   8320:                 'LineWeight' [ PresRelation ] /
                   8321:                 'FillPattern' [ '=' Pattern ] /
                   8322:                 'Background' [ '=' Color ] /
                   8323:                 'Foreground' [ '=' Color ] .
                   8324: 
                   8325: PresRelation  = '=' PresValue /
1.30      cvs      8326:                 '&gt;' [ '-' ] PresMinimum /
1.6       cvs      8327:                 '&lt;' [ '-' ] PresMaximum /
                   8328:                 'IN' '[' [ '-' ] PresIntervalMin '..'
                   8329:                          [ '-' ] PresIntervalMax ']' .
1.35      cvs      8330: AdjustVal     = 'Left' / 'Right' / 'VMiddle' / 'Justify' /
1.6       cvs      8331:                 'LeftWithDots' .
                   8332: BoolVal       = 'Yes' / 'No' .
1.24      cvs      8333: StyleVal      = 'Roman' / 'Italics' / 'Oblique' .
                   8334: WeightVal     = 'Normal' / 'Bold' .
1.6       cvs      8335: FontVal       = 'Times' / 'Helvetica' / 'Courier' .
                   8336: UnderLineVal  = 'NoUnderline' / 'UnderLined' /
                   8337:                 'OverLined' / 'CrossedOut' .
                   8338: ThicknessVal  = 'Thick' / 'Thin' .
                   8339: LineStyleVal  = 'Solid' / 'Dashed' / 'Dotted' .
                   8340: Pattern       = NAME .
                   8341: Color         = NAME .
                   8342: PresMinimum   = NUMBER .
                   8343: PresMaximum   = NUMBER .
1.1       cvs      8344: PresIntervalMin= NUMBER .
                   8345: PresIntervalMax= NUMBER .
1.6       cvs      8346: PresValue     = [ '-' ] PresVal .
                   8347: PresVal       = NUMBER .
1.1       cvs      8348: 
1.6       cvs      8349: TextTransSeq  = [ Alphabet ] TransSeq .
                   8350: Alphabet      = NAME .
1.30      cvs      8351: TransSeq      = 'BEGIN' &lt; Translation &gt; 'END' ';' /
1.6       cvs      8352:                 Translation .
1.30      cvs      8353: Translation   = Source [ '-&gt;' Target ] ';' .
1.6       cvs      8354: Source        = STRING .
1.18      cvs      8355: Target        = STRING .</pre>
                   8356: </div>
1.37    ! cvs      8357: <hr />
1.18      cvs      8358: </div>
1.1       cvs      8359: 
1.18      cvs      8360: <div class="chapter">
1.37    ! cvs      8361: <h1><a name="sect7" id="sect7">Character coding</a></h1>
1.1       cvs      8362: 
1.18      cvs      8363: <div class="section">
1.37    ! cvs      8364: <h2><a name="sectb71" id="sectb71">Characters</a></h2>
1.1       cvs      8365: 
1.37    ! cvs      8366: <p>The characters of the Latin alphabet follow the encoding defined in the
        !          8367: ISO 8859-1 (ISO Latin-1) standard. The characters of the Greek alphabet
        !          8368: follow the encoding defined by Adobe for its Symbol font (Adobe
        !          8369: FontSpecific).</p>
        !          8370: 
        !          8371: <p>Characters whose octal code is greater than 0200 are written in the form
        !          8372: of their octal code preceded by a backslash character (``\''). For example,
        !          8373: the French word 'Résumé' is written <tt>R\351sum\351</tt>.</p>
1.30      cvs      8374: 
                   8375: <p>To the ISO 8859-1 encoding four characters with the following codes have
1.37    ! cvs      8376: been added:<br />
        !          8377: <tt>212</tt>: line break<br />
        !          8378: <tt>240</tt>: sticky space<br />
        !          8379: <tt>201</tt>: thin space<br />
1.18      cvs      8380: <tt>202</tt>: en space</p>
1.30      cvs      8381: 
                   8382: <p>The <tt>212</tt> character is a ``line break'' character which forces a
1.37    ! cvs      8383: line break. The <tt>240</tt> character is a ``sticky space'', which cannot be
1.18      cvs      8384: replaced by a line break.</p>
                   8385: </div>
1.1       cvs      8386: 
1.18      cvs      8387: <div class="section">
1.37    ! cvs      8388: <h2><a name="sectb72" id="sectb72">Symbols</a></h2>
1.1       cvs      8389: 
1.37    ! cvs      8390: <p>The table below gives the codes for the symbols of Thot. Symbols can be
        !          8391: used in presentation schemas constants and in transcoding rules of
        !          8392: translation schemas. Each symbol is represented by a single character.</p>
1.18      cvs      8393: <ul>
1.30      cvs      8394:   <li><tt>r</tt>: a radical</li>
                   8395:   <li><tt>i</tt>: a simple integral</li>
                   8396:   <li><tt>c</tt>: a curvilinear integral</li>
                   8397:   <li><tt>d</tt>: a double integral</li>
                   8398:   <li><tt>t</tt>: a triple integral</li>
                   8399:   <li><tt>S</tt>: the summation symbol</li>
                   8400:   <li><tt>P</tt>: the product symbol</li>
                   8401:   <li><tt>U</tt>: the union symbol</li>
                   8402:   <li><tt>I</tt>: the intersection symbol</li>
                   8403:   <li><tt>&gt;</tt>: a right arrow</li>
                   8404:   <li><tt>&lt;</tt>: a left arrow</li>
1.37    ! cvs      8405:   <li><tt>^</tt>: an up arrow</li>
1.30      cvs      8406:   <li><tt>V</tt>: a down arrow</li>
                   8407:   <li><tt>(</tt>: an opening parenthesis</li>
                   8408:   <li><tt>)</tt>: a closing parenthesis</li>
                   8409:   <li><tt>{</tt>: an opening brace</li>
                   8410:   <li><tt>}</tt>: a closing brace</li>
                   8411:   <li><tt>[</tt>: an opening bracket</li>
                   8412:   <li><tt>]</tt>: a closing bracket</li>
1.18      cvs      8413: </ul>
                   8414: </div>
1.1       cvs      8415: 
1.18      cvs      8416: <div class="section">
1.37    ! cvs      8417: <h2><a name="sectb73" id="sectb73">Graphical elements</a></h2>
1.1       cvs      8418: 
1.30      cvs      8419: <p>The table below gives the codes for the graphical elements of Thot. These
1.1       cvs      8420: elements can be used in presentation schemas constants and in transcoding
1.37    ! cvs      8421: rules of translation schemas. Each graphical element is represented by a
1.18      cvs      8422: single character.</p>
                   8423: <ul>
1.30      cvs      8424:   <li>a: a circle</li>
                   8425:   <li><p><tt>A</tt>: an open curve with an arrow head at the end</p>
                   8426:   </li>
                   8427:   <li><tt>b</tt>: a horizontal line along the lower side of the box</li>
                   8428:   <li><tt>B</tt>: an open curve</li>
                   8429:   <li><tt>c</tt>: an ellipse inscribed in the box</li>
                   8430:   <li><tt>C</tt>: a rectangle with rounded corners</li>
                   8431:   <li><tt>D</tt>: an open curve with two arrow heads</li>
                   8432:   <li><tt>e</tt>: The northwest/southeast diagonal of the box with an
                   8433:     arrowhead at the bottom</li>
                   8434:   <li><tt>E</tt>: The southwest/northeast diagonal of the box with an
                   8435:     arrowhead at the top</li>
                   8436:   <li><tt>F</tt>: an open curve with an arrow head at start</li>
                   8437:   <li><tt>g</tt>: a line from the origin of the box to its opposite
                   8438:   corner</li>
                   8439:   <li><tt>h</tt>: a horizontal line as wide as the box and placed in its
                   8440:     middle</li>
                   8441:   <li><tt>l</tt>: a vertical line on the left side of the box</li>
                   8442:   <li><tt>L</tt>: a lozenge</li>
                   8443:   <li><tt>M</tt>: an open broken line with two arrow heads</li>
                   8444:   <li><tt>N</tt>: an open broken line with an arrow head at start</li>
                   8445:   <li><tt>o</tt>: The southwest/northeast diagonal of the box with an
                   8446:     arrowhead at the bottom</li>
                   8447:   <li><tt>O</tt>: The northwest/southeast diagonal of the box with an
                   8448:     arrowhead at the top</li>
                   8449:   <li><tt>p</tt>: a polygon</li>
                   8450:   <li><tt>P</tt>: a rectangle with round corners and a horizontal bar at the
                   8451:     top</li>
                   8452:   <li><tt>Q</tt>: an ellipse with a horizontal bar at the top</li>
                   8453:   <li><tt>r</tt>: a vertical line on the right side of the box</li>
                   8454:   <li><tt>R</tt>: a rectangle which is the shape of the box</li>
                   8455:   <li><tt>s</tt>: a closed curve</li>
                   8456:   <li><tt>S</tt>: an open broken line</li>
                   8457:   <li><tt>t</tt>: a horizontal line along the upper side of the box</li>
                   8458:   <li><tt>U</tt>: an open broken line with an arrow head at the end</li>
                   8459:   <li><tt>v</tt>: a vertical line as tall as the box and placed in its
                   8460:   middle</li>
                   8461:   <li><tt>V</tt>: a down arrow as tall as the box and in its middle</li>
                   8462:   <li>w: a segment (2 points)</li>
                   8463:   <li><tt>W</tt>: the upper right corner</li>
                   8464:   <li>x: a segment (2 points) with an arrow head at the end</li>
                   8465:   <li><tt>X</tt>: the lower right corner</li>
                   8466:   <li>y: a segment (2 points) with an arrow head at the end</li>
                   8467:   <li><tt>Y</tt>: the lower left corner</li>
                   8468:   <li>z: a segment (2 points) with an arrow head at the end</li>
                   8469:   <li><tt>Z</tt>: the upper left corner</li>
                   8470:   <li><tt>space</tt>: a transparent element</li>
                   8471:   <li><tt>^</tt>: an up arrow as tall as the box and in its middle</li>
                   8472:   <li><tt>&gt;</tt>: a right arrow as long as the box's width and in its
                   8473:     middle</li>
                   8474:   <li><tt>&gt;</tt>: a left arrow as long as the box's width and in its
                   8475:   middle</li>
                   8476:   <li><tt>/</tt>: The southwest/northeast diagonal of the box</li>
                   8477:   <li><tt>\</tt>: the northwest/southeast diagonal of the box</li>
1.18      cvs      8478: </ul>
1.37    ! cvs      8479: <hr />
1.18      cvs      8480: </div>
                   8481: </div>
                   8482: </body>
                   8483: </html>

Webmaster