Return to languages.html CVS log | Up to [Public] / Amaya / doc |
1.30 ! cvs 1: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ! 2: "http://www.w3.org/TR/html4/loose.dtd"> 1.18 cvs 3: <html> 4: <head> 1.30 ! cvs 5: <title>The Languages of Thot</title> ! 6: <meta http-equiv="Content-Type" content="text/html"> 1.18 cvs 7: </head> 1.30 ! cvs 8: 1.18 cvs 9: <body> 10: 1.19 cvs 11: <div class="frontmatter" align="center"> 1.18 cvs 12: <h1>The Languages of Thot</h1> 13: 14: <h3>Vincent Quint</h3> 15: 16: <h4>Translated from French by Ethan Munson</h4> 17: 1.30 ! cvs 18: <h4>Version of November 21, 2000</h4> ! 19: ! 20: <p>© 1996-2000 INRIA</p> 1.18 cvs 21: <hr> 22: </div> 23: 24: <div class="tableofcontents"> 25: <h2><a href="languages.toc.html">Contents</a></h2> 26: <ul> 1.30 ! cvs 27: <li><big><a href="#sect2">The document model of Thot</a></big> ! 28: <ul> ! 29: <li><strong><a href="#sectb21">The logical structure of ! 30: documents</a></strong></li> ! 31: <li><strong><a href="#sectb22">Generic and specific ! 32: structures</a></strong></li> ! 33: <li><strong><a href="#sectb23">Logical structure and physical ! 34: structure</a></strong></li> ! 35: <li><strong><a href="#sectb24">Document structures and object ! 36: structures</a></strong></li> ! 37: </ul> ! 38: </li> ! 39: <li><big><a href="#sect3">The S language</a></big> ! 40: <ul> ! 41: <li><strong><a href="#sectb31">Document meta-structure</a></strong> ! 42: <ul> ! 43: <li><a href="#sectc311">The basic types</a></li> ! 44: <li><a href="#sectc312">Constructed elements</a></li> ! 45: <li><a href="#sectc313">Logical structure constructors</a> ! 46: <ul> ! 47: <li><small><a href="#sectd3131">Aggregate and ! 48: List</a></small></li> ! 49: <li><small><a href="#sectd3132">Choice, Schema, and ! 50: Unit</a></small></li> ! 51: <li><small><a href="#sectd3133">Reference and ! 52: Inclusion</a></small></li> ! 53: <li><small><a href="#sectd3134">Mark pairs</a></small></li> ! 54: <li><small><a href="#sectd3135">Restrictions and ! 55: Extensions</a></small></li> ! 56: <li><small><a href="#sectd3136">Summary</a></small></li> ! 57: </ul> ! 58: </li> ! 59: <li><a href="#sectc314">Associated Elements</a></li> ! 60: <li><a href="#sectc315">Attributes</a></li> ! 61: <li><a href="#sectc316">Discussion of the model</a></li> ! 62: </ul> ! 63: </li> ! 64: <li><strong><a href="#sectb32">The definition language for generic ! 65: structures</a></strong> ! 66: <ul> ! 67: <li><a href="#sectc321">Writing Conventions</a></li> ! 68: <li><a href="#sectc322">Extension schemas</a></li> ! 69: <li><a href="#sectc323">The general organization of structure ! 70: schemas</a></li> ! 71: <li><a href="#sectc324">The default presentation</a></li> ! 72: <li><a href="#sectc325">Global Attributes</a></li> ! 73: <li><a href="#sectc326">Parameters</a></li> ! 74: <li><a href="#sectc327">Structured elements</a></li> ! 75: <li><a href="#sectc328">Structure definitions</a> ! 76: <ul> ! 77: <li><small><a href="#sectd3281">List</a></small></li> ! 78: <li><small><a href="#sectd3282">Aggregate</a></small></li> ! 79: <li><small><a href="#sectd3283">Choice</a></small></li> ! 80: <li><small><a href="#sectd3284">Reference</a></small></li> ! 81: <li><small><a href="#sectd3285">Mark pairs</a></small></li> ! 82: </ul> ! 83: </li> ! 84: <li><a href="#sectc329">Imports</a></li> ! 85: <li><a href="#sectc3210">Extension rules</a></li> ! 86: <li><a href="#sectc3211">Associated elements</a></li> ! 87: <li><a href="#sectc3212">Units</a></li> ! 88: <li><a href="#sectc3213">Skeleton elements</a></li> ! 89: <li><a href="#sectc3214">Exceptions</a></li> ! 90: </ul> ! 91: </li> ! 92: <li><strong><a href="#sectb33">Some examples</a></strong> ! 93: <ul> ! 94: <li><a href="#sectc331">A class of documents: articles</a></li> ! 95: <li><a href="#sectc332">A class of objects: mathematical ! 96: formulas</a></li> ! 97: </ul> ! 98: </li> ! 99: </ul> ! 100: </li> ! 101: <li><big><a href="#sect4">The P language</a></big> ! 102: <ul> ! 103: <li><strong><a href="#sectb41">Document presentation</a></strong> ! 104: <ul> ! 105: <li><a href="#sectc411">Two levels of presentation</a></li> ! 106: <li><a href="#sectc412">Boxes</a></li> ! 107: <li><a href="#sectc413">Views and visibility</a></li> ! 108: <li><a href="#sectc414">Pages</a></li> ! 109: <li><a href="#sectc415">Numbering</a></li> ! 110: <li><a href="#sectc416">Presentation parameters</a></li> ! 111: </ul> ! 112: </li> ! 113: <li><strong><a href="#sectb42">Presentation description ! 114: language</a></strong> ! 115: <ul> ! 116: <li><a href="#sectc421">The organization of a presentation ! 117: schema</a></li> ! 118: <li><a href="#sectc422">Views</a></li> ! 119: <li><a href="#sectc423">Print Views</a></li> ! 120: <li><a href="#sectc424">Counters</a></li> ! 121: <li><a href="#sectc425">Presentation constants</a></li> ! 122: <li><a href="#sectc426">Variables</a></li> ! 123: <li><a href="#sectc427">Default presentation rules</a></li> ! 124: <li><a href="#sectc428">Presentation and page layout boxes</a></li> ! 125: <li><a href="#sectc429">Presentation of structured elements</a></li> ! 126: <li><a href="#sectc4210">Logical attribute presentation</a></li> ! 127: <li><a href="#sectc4212">Value transmission rules</a></li> ! 128: <li><a href="#sectc4213">Presentation rules</a></li> ! 129: <li><a href="#sectc4214">Conditions applying to presentation ! 130: rules</a> ! 131: <ul> ! 132: <li><small><a href="#sectd42141">Conditions based on the logical ! 133: position of the element</a></small></li> ! 134: <li><small><a href="#sectd42142">Conditions on ! 135: references</a></small></li> ! 136: <li><small><a href="#sectd42143">Conditions on logical ! 137: attributes</a></small></li> ! 138: <li><small><a href="#sectd42144">Conditions on page ! 139: breaks</a></small></li> ! 140: <li><small><a href="#sectd42145">Conditions on the element's ! 141: content</a></small></li> ! 142: <li><small><a href="#sectd42146">Conditions on ! 143: counters</a></small></li> ! 144: </ul> ! 145: </li> ! 146: <li><a href="#sectc4215">A presentation rule</a></li> ! 147: <li><a href="#sectc4216">Box axes</a></li> ! 148: <li><a href="#sectc4217">Distance units</a></li> ! 149: <li><a href="#sectc4218">Relative positions</a></li> ! 150: <li><a href="#sectc4219">Box extents</a> ! 151: <ul> ! 152: <li><small><a href="#sectd42191">Fixed extents</a></small></li> ! 153: <li><small><a href="#sectd42192">Relative ! 154: extents</a></small></li> ! 155: <li><small><a href="#sectd42193">Elastic ! 156: extents</a></small></li> ! 157: </ul> ! 158: </li> ! 159: <li><a href="#sectc4220">Overflow</a></li> ! 160: <li><a href="#sectc4221">Inheritance</a></li> ! 161: <li><a href="#sectc4222">Line breaking</a> ! 162: <ul> ! 163: <li><small><a href="#sectd42221">Line spacing</a></small></li> ! 164: <li><small><a href="#sectd42222">First line ! 165: indentation</a></small></li> ! 166: <li><small><a href="#sectd42223">Alignment</a></small></li> ! 167: <li><small><a href="#sectd42224">Justification</a></small></li> ! 168: <li><small><a href="#sectd42225">Hyphenation</a></small></li> ! 169: <li><small><a href="#sectd42226">Avoiding line ! 170: breaking</a></small></li> ! 171: </ul> ! 172: </li> ! 173: <li><a href="#sectc4223">Page breaking and line breaking ! 174: conditions</a></li> ! 175: <li><a href="#sectc4224">Visibility</a></li> ! 176: <li><a href="#sectc4225">Character style parameters</a> ! 177: <ul> ! 178: <li><small><a href="#sectd42251">Character size</a></small></li> ! 179: <li><small><a href="#sectd42252">Font and character ! 180: style</a></small></li> ! 181: <li><small><a href="#sectd42253">Underlining</a></small></li> ! 182: </ul> ! 183: </li> ! 184: <li><a href="#sectc4226">Stacking order</a></li> ! 185: <li><a href="#sectc4227">Line style</a></li> ! 186: <li><a href="#sectc4228">Line thickness</a></li> ! 187: <li><a href="#sectc4229">Fill pattern</a></li> ! 188: <li><a href="#sectc4230">Colors</a></li> ! 189: <li><a href="#sectc4230a">Background color and border</a></li> ! 190: <li><a href="#sectc4230b">Background pictures</a></li> ! 191: <li><a href="#sectc4231">Presentation box content</a></li> ! 192: <li><a href="#sectc4232">Presentation box creation</a></li> ! 193: <li><a href="#sectc4233">Page layout</a></li> ! 194: <li><a href="#sectc4234">Box copies</a></li> ! 195: </ul> ! 196: </li> ! 197: </ul> ! 198: </li> ! 199: <li><big><a href="#sect5">The T language</a></big> ! 200: <ul> ! 201: <li><strong><a href="#sectb51">Document translation</a></strong> ! 202: <ul> ! 203: <li><a href="#sectc511">Translation principles</a></li> ! 204: <li><a href="#sectc512">Translation procedure</a></li> ! 205: </ul> ! 206: </li> ! 207: <li><strong><a href="#sectb52">Translation definition ! 208: language</a></strong> ! 209: <ul> ! 210: <li><a href="#sectc521">Organization of a translation ! 211: schema</a></li> ! 212: <li><a href="#sectc522">Line length</a></li> ! 213: <li><a href="#sectc523">Buffers</a></li> ! 214: <li><a href="#sectc524">Counters</a></li> ! 215: <li><a href="#sectc525">Constants</a></li> ! 216: <li><a href="#sectc526">Variables</a></li> ! 217: <li><a href="#sectc527">Translating structure elements</a></li> ! 218: <li><a href="#sectc528">Conditional rules</a> ! 219: <ul> ! 220: <li><small><a href="#sectd5281">Conditions based on the logical ! 221: position of the element</a></small></li> ! 222: <li><small><a href="#sectd5282">Conditions on ! 223: references</a></small></li> ! 224: <li><small><a href="#sectd5283">Conditions on the ! 225: parameters</a></small></li> ! 226: <li><small><a href="#sectd5284">Conditions on the ! 227: alphabets</a></small></li> ! 228: <li><small><a href="#sectd5285">Conditions on page ! 229: breaks</a></small></li> ! 230: <li><small><a href="#sectd5286">Conditions on the element's ! 231: content</a></small></li> ! 232: <li><small><a href="#sectd5287">Conditions on the presence of ! 233: comments</a></small></li> ! 234: <li><small><a href="#sectd5288">Conditions on the presence of ! 235: specific presentation rules</a></small></li> ! 236: <li><small><a href="#sectd5289">Conditions on the presence of ! 237: logical attributes</a></small></li> ! 238: <li><small><a href="#sectd52810">Conditions on logical ! 239: attributes</a></small></li> ! 240: <li><small><a href="#sectd52811">Conditions on specific ! 241: presentation rules</a></small></li> ! 242: </ul> ! 243: </li> ! 244: <li><a href="#sectc529">Translation rules</a></li> ! 245: <li><a href="#sectc5210">The <tt>Create</tt> rule</a></li> ! 246: <li><a href="#sectc5211">The <tt>Write</tt> rule</a></li> ! 247: <li><a href="#sectc5212">The <tt>Read</tt> rule</a></li> ! 248: <li><a href="#sectc5213">The <tt>Include</tt> rule</a></li> ! 249: <li><a href="#sectc5214">The <tt>Get</tt> rule</a></li> ! 250: <li><a href="#sectc5215">The <tt>Copy</tt> rule</a></li> ! 251: <li><a href="#sectc5216">The <tt>Use</tt> rule</a></li> ! 252: <li><a href="#sectc5217">The <tt>Remove</tt> rule</a></li> ! 253: <li><a href="#sectc5218">The <tt>NoTranslation</tt> rule</a></li> ! 254: <li><a href="#sectc5219">The <tt>NoLineBreak</tt> rule</a></li> ! 255: <li><a href="#sectc5220">The <tt>ChangeMainFile</tt> rule</a></li> ! 256: <li><a href="#sectc5220a">The <tt>RemoveFile</tt> rule</a></li> ! 257: <li><a href="#sectc5221">The <tt>Set</tt> and <tt>Add</tt> ! 258: rules</a></li> ! 259: <li><a href="#sectc5221a">The <tt>Indent</tt> rule</a></li> ! 260: <li><a href="#sectc5222">Rule application order</a></li> ! 261: <li><a href="#sectc5223">Translation of logical attributes</a></li> ! 262: <li><a href="#sectc5224">Translation of specific ! 263: presentations</a></li> ! 264: <li><a href="#sectc5225">Recoding of characters, symbols and ! 265: graphics</a></li> ! 266: </ul> ! 267: </li> ! 268: </ul> ! 269: </li> ! 270: <li><big><a href="#sect6">Language grammars</a></big> ! 271: <ul> ! 272: <li><strong><a href="#sectb61">The M meta-language</a></strong></li> ! 273: <li><strong><a href="#sectb62">The S language</a></strong></li> ! 274: <li><strong><a href="#sectb63">The P language</a></strong></li> ! 275: <li><strong><a href="#sectb64">The T language</a></strong></li> ! 276: </ul> ! 277: </li> ! 278: <li><big><a href="#sect7">Character coding</a></big> ! 279: <ul> ! 280: <li><strong><a href="#sectb71">Characters</a></strong></li> ! 281: <li><strong><a href="#sectb72">Symbols</a></strong></li> ! 282: <li><strong><a href="#sectb73">Graphical elements</a></strong></li> ! 283: </ul> ! 284: </li> 1.18 cvs 285: </ul> 286: <hr> 287: </div> 1.1 cvs 288: 1.18 cvs 289: <div class="chapter"> 1.30 ! cvs 290: <h1><a name="sect2">The document model of Thot</a></h1> 1.1 cvs 291: 1.30 ! cvs 292: <p>All of the services which Thot provides to the user are based on the ! 293: system's internal document representation. This representation is itself ! 294: derived from the document model which underlies Thot. The model is presented ! 295: here, prior to the description of the languages which permit the generic ! 296: specification of documents.</p> 1.1 cvs 297: 1.18 cvs 298: <div class="section"> 1.30 ! cvs 299: <h2><a name="sectb21">The logical structure of documents</a></h2> 1.1 cvs 300: 1.30 ! cvs 301: <p>The document model of Thot is primarily designed to allow the user to ! 302: operate on those entities which s/he has in mind when s/he works on a ! 303: document. The model makes no assumptions about the nature of these entities. ! 304: It is essentially these logical entities, such as paragraphs, sections, ! 305: chapters, notes, titles, and cross-references which give a document its ! 306: logical structure.</p> ! 307: ! 308: <p>Because of this model, the author can divide the document into chapters, 1.1 cvs 309: giving each one a title. The content of these chapters can be further divided 1.2 cvs 310: into sections, subsections, etc. The text is organized into successive 311: paragraphs, according to the content. In the writing phase, the lines, pages, 312: margins, spacing, fonts, and character styles are not very important. In fact, 313: if the system requires documents to be written in these terms, it gets in the 314: way. So, Thot's model is primarily based on the logical aspect of documents. 1.18 cvs 315: The creation of a model of this type essentially requires the definition :</p> 316: <ul> 1.30 ! cvs 317: <li>of the entities which can appear in the documents,</li> ! 318: <li>and the relations between these entities.</li> 1.18 cvs 319: </ul> 1.30 ! cvs 320: ! 321: <p>The choice of entities to include in the model can be subtle. Some ! 322: documents require chapters, while others only need various levels of sections. ! 323: Certain documents contain appendices, others don't. In different documents ! 324: the same logical entity may go by different names (e.g. ``Conclusion'' and 1.1 cvs 325: ``Summary''). Certain entities which are absolutely necessary in some 326: documents, such as clauses in a contract or the address of the recipient in a 1.18 cvs 327: letter, are useless in most other cases.</p> 1.30 ! cvs 328: ! 329: <p>The differences between documents result from more than just the entities ! 330: that appear in them, but also from the relationships between these entities ! 331: and the ways that they are linked. In certain documents, notes are spread ! 332: throughout the document, for example at the bottom of the page containing the 1.1 cvs 333: cross-reference to them, while in other documents they are collected at the 334: end of each chapter or even at the end of the work. As another example, the 335: introduction of some documents can contain many sections, while in other 336: documents, the introduction is restricted to be a short sequence of 1.18 cvs 337: paragraphs.</p> 1.30 ! cvs 338: ! 339: <p>All of this makes it unlikely that a single model can describe any document ! 340: at a relatively high level. It is obviously tempting to make up a list of ! 341: widely used entities, such as chapters, sections, paragraphs, and titles, and ! 342: then map all other entities onto the available choices. In this way, an 1.1 cvs 343: introduction can be supported as a chapter and a contract clause supported as 344: a paragraph or section. However, in trying to widen the range of usage of 345: certain entities, their meaning can be lost and the power of the model 346: reduced. In addition, while this widening partially solves the problem of 347: choosing entities, it does not solve the problem of their organization: when a 348: chapter must be composed of sections, how does one indicate that an 349: introduction has none when it is merely another chapter? One solution is to 350: include introductions in the list of supported entities. But then, how does 351: one distinguish those introductions which are allowed to have sections from 352: those which are not. Perhaps this could be done by defining two types of 353: introduction. Clearly, this approach risks an infinite expansion of the list 1.18 cvs 354: of widely used entities.</p> 355: </div> 1.1 cvs 356: 1.18 cvs 357: <div class="section"> 1.30 ! cvs 358: <h2><a name="sectb22">Generic and specific structures</a></h2> 1.1 cvs 359: 1.30 ! cvs 360: <p>Thus, it is apparently impossible to construct an exhaustive inventory of ! 361: all those entities which are necessary and sufficient to precisely describe ! 362: any document. It also seems impossible to specify all possible arrangements of 1.18 cvs 363: these entities in a document. This is why Thot uses a <em>meta-model</em> 364: instead, which permits the description of numerous <em>models</em>, each one 365: describing a <em>class</em> of documents.</p> 1.30 ! cvs 366: ! 367: <p>A <em>class</em> is a set of documents having very similar structure. Thus, 1.1 cvs 368: the collection of research reports published by a laboratory constitutes a 369: class; the set of commercial proposals by the sales department of a company 370: constitutes another class; the set of articles published by a journal 371: constitutes a third class. Clearly, it is not possible to enumerate every 372: possible document class. It is also clear that new document classes must be 1.18 cvs 373: created to satisfy new needs and applications.</p> 1.30 ! cvs 374: ! 375: <p>To give a more rigorous definition of classes, we must introduce the ideas ! 376: of <em>generic structure</em> and <em>specific structure</em>. Each document ! 377: has a <em>specific structure</em> which organizes the various parts which ! 378: comprise it. We illustrate this with the help of a simple example comparing ! 379: two reports, A and B (<a href="#specstruct">see Figure</a>). The report A ! 380: contains an introduction followed by three chapters and a conclusion. The ! 381: first chapter contains two sections, the second, three sections. That is the 1.18 cvs 382: <em>specific</em> structure of document A. Similarly, the structure of 1.1 cvs 383: document B is: an introduction, two chapters, a conclusion; Chapter 1 has 384: three sections while Chapter 2 has four. The specific structures of these two 1.18 cvs 385: documents are thus different.</p> 1.1 cvs 386: 1.18 cvs 387: <div class="figure"> 388: <hr> 389: <pre> Report A Report B 1.1 cvs 390: Introduction Introduction 391: Chapter 1 Chapter 1 392: Section 1.1 Section 1.1 393: Section 1.2 Section 1.2 394: Chapter 2 Section 1.3 395: Section 2.1 Chapter 2 396: Section 2.2 Section 2.1 397: Section 2.3 Section 2.2 398: Chapter 3 Section 2.3 399: Conclusion Section 2.4 1.18 cvs 400: Conclusion</pre> 1.30 ! cvs 401: ! 402: <p align="center"><em><a name="specstruct">Two specific ! 403: structures</a></em></p> 1.18 cvs 404: <hr> 1.30 ! cvs 405: </div> ! 406: ! 407: <p>The <em>generic structure</em> defines the ways in which specific ! 408: structures can be constructed. It specifies how to generate specific ! 409: structures. The reports A and B, though different, are constructed in ! 410: accordance with the same generic structure, which specifies that a report ! 411: contains an introduction followed by a variable number of chapters and a ! 412: conclusion, with each chapter containing a variable number of sections.</p> ! 413: ! 414: <p>There is a one-to-one correspondence between a class and a generic ! 415: structure: all the documents of a class are constructed in accordance with the ! 416: same generic structure. Hence the definition of the class: a class is a set ! 417: of documents whose specific structure is constructed in accordance with the ! 418: same generic structure. A class is characterized by its generic ! 419: structure.</p> 1.19 cvs 420: 1.30 ! cvs 421: <p>Thus, a generic structure can be considered to be a model at the level ! 422: which interests us, but only for one class of documents. When the definition ! 423: is limited to a single class of documents, it is possible to define a model ! 424: which does a good job of representing the documents of the class, including ! 425: the necessary entities and unencumbered by useless entities. The description ! 426: of the organization of the documents in the class can then be sufficiently 1.18 cvs 427: precise.</p> 428: </div> 1.1 cvs 429: 1.18 cvs 430: <div class="section"> 1.30 ! cvs 431: <h2><a name="sectb23">Logical structure and physical structure</a></h2> 1.1 cvs 432: 1.30 ! cvs 433: <p>Generic structures only describe the <em>logical</em> organization of 1.18 cvs 434: documents, not their <em>physical</em> presentation on a screen or on sheets 1.1 cvs 435: of paper. However, for a document to be displayed or printed, its graphic 1.18 cvs 436: presentation must be taken into account.</p> 1.30 ! cvs 437: ! 438: <p>An examination of current printed documents shows that the details of 1.1 cvs 439: presentation essentially serve to bring out their logical structure. Outside 440: of some particular domains, notably advertising, the presentation is rarely 441: independent of the logical organization of the text. Moreover, the art of 442: typography consists of enhancing the organization of the text being set, 443: without catching the eye of the reader with overly pronounced effects. Thus, 444: italic and boldface type are used to emphasize words or expressions which have 445: greater significance than the rest of the text: keywords, new ideas, 446: citations, book titles, etc. Other effects highlight the organization of the 447: text: vertical space, margin changes, page breaks, centering, eventually 448: combined with the changes in the shapes or weight of the characters. These 449: effects serve to indicate the transitions between paragraphs, sections, or 450: chapters: an object's level in the logical structure of the document is shown 1.18 cvs 451: by the markedness of the effects.</p> 1.30 ! cvs 452: ! 453: <p>Since the model permits the description of all of the logical structure of ! 454: the document, the presentation can be derived from the model without being 1.1 cvs 455: submerged in the document itself. It suffices to use the logical structure of 456: the document to make the desired changes in its presentation: changes in type 1.18 cvs 457: size, type style, spacing, margin, centering, etc.</p> 1.30 ! cvs 458: ! 459: <p>Just as one cannot define a unique generic logical structure for all ! 460: document classes, one cannot define universal presentation rules which can be ! 461: applied to all document classes. For certain types of documents the chapter ! 462: titles will be centered on the page and printed in large, bold type. For ! 463: other documents, the same chapter titles will be printed in small, italic type ! 464: and aligned on the left margin.</p> ! 465: ! 466: <p>Therefore, it is necessary to base the presentation specifications for 1.1 cvs 467: documents on their class. Such a specification can be very fine-grained, 468: because the presentation is expressed in terms of the entities defined in the 469: generic logical structure of the class. Thus, it is possible to specify a 470: different presentation for the chapter titles and the section titles, and 471: similarly to specify titles for the sections according to their level in the 472: section hierarchy. The set of rules which specify the presentation of all the 1.18 cvs 473: elements defined in a generic logical structure is called a <em>generic 474: presentation</em>.</p> 1.30 ! cvs 475: ! 476: <p>There are several advantages derived from having a presentation linked to ! 477: the generic structure and described by a generic presentation. Homogeneity is ! 478: the first. Since every document in a class corresponds to the same generic 1.1 cvs 479: logical structure, a homogenous presentation for different documents of the 480: same class can be assured by applying the same generic presentation to all 481: documents of the class. Homogeneity of presentation can also be found among 1.2 cvs 482: the entities of a single document: every section heading will be presented in 1.1 cvs 483: the same way, the first line of every paragraph of the same type will have the 1.18 cvs 484: same indentation, etc.</p> 1.30 ! cvs 485: ! 486: <p>Another advantage of this approach to presentation is that it facilitates 1.1 cvs 487: changes to the graphical aspect of documents. A change to the generic 488: presentation rules attached to each type of entity will alter the presentation 489: of the entire document, and will do so homogenously. In this case, the 490: internal homogeneity of the class is no longer assured, but the way to control 491: it is simple. It suffices to adopt a single generic presentation for the 1.18 cvs 492: entire class.</p> 1.30 ! cvs 493: ! 494: <p>If the presentation of the class does not have to be homogenous, then the 1.1 cvs 495: appearance of the document can be adapted to the way it will be used or to the 496: device used to render it. This quality is sufficient to allow the existence 1.18 cvs 497: of <a name="mulpres">many generic presentations</a> for the same document 1.1 cvs 498: class. By applying one or the other of these presentations to it, the document 499: can be seen under different graphical aspects. It must be emphasized that 500: this type of modification of the presentation is not a change to the document 501: itself (in its specific logical structure or its content), but only in its 1.18 cvs 502: appearance at the time of editing or printing.</p> 503: </div> 1.1 cvs 504: 1.18 cvs 505: <div class="section"> 1.30 ! cvs 506: <h2><a name="sectb24">Document structures and object structures</a></h2> 1.1 cvs 507: 1.30 ! cvs 508: <p>So far, we have only discussed the global structure of documents and have ! 509: not considered the contents found in that structure. We could limit ourselves ! 510: to purely textual contents by assuming that a title or a paragraph contains a 1.1 cvs 511: simple linear text. But this model would be too restrictive. In fact, 512: certain documents contain not only text, but also contain tables, diagrams, 513: photographs, mathematical formulas, and program fragments. The model must 1.18 cvs 514: permit the representation of such <em>objects</em>.</p> 1.30 ! cvs 515: ! 516: <p>Just as with the whole of the document, the model takes into account the 1.1 cvs 517: logical structure of objects of this type. Some are clearly structured, 518: others are less so. Logical structure can be recognized in mathematical 519: formulas, in tables, and in certain types of diagrams. On the other hand, it 520: is difficult to define the structure of a photograph or of some drawings. But 521: in any case, it does not seem possible to define one unique structure which 522: can represent every one of these types of objects. The approach taken in the 523: definition of meta-structure and document classes also applies to objects. 524: Object classes can be defined which put together objects of similar type, 1.18 cvs 525: constructed from the same generic logical structure.</p> 1.30 ! cvs 526: ! 527: <p>Thus, a mathematical class can be defined and have a generic logical ! 528: structure associated with it. But even if a single generic structure can ! 529: represent a sufficient variety of mathematical formulas, for other objects ! 530: with less rigorous structure, multiple classes must be defined. As for ! 531: documents, using multiple classes assures that the model can describe the full ! 532: range of objects to be presented. It also permits the system to support ! 533: objects which were not initially anticipated. Moreover, this comment applies ! 534: equally to mathematics: different classes of formulas can be described ! 535: depending on the domain of mathematics being described.</p> ! 536: ! 537: <p>Since objects have the same level of logical representation as documents, ! 538: they gain the same advantages. In particular, it is possible to define the 1.1 cvs 539: presentation separately from the objects themselves and attach it to the 540: class. Thus, as for documents, objects of the same type have a uniform 541: presentation and the presentation of every object in a given class can be 542: changed simply by changing the generic presentation of the class. Another 543: advantage of using this document model is that the system does not bother the 544: user with the details of presentation, but rather allows the user to 1.18 cvs 545: concentrate on the logical aspect of the document and the objects.</p> 1.30 ! cvs 546: ! 547: <p>It is clear that the documents in a class do not necessarily use the same 1.1 cvs 548: classes of objects: one technical report will contain tables while another 549: report will have no tables but will use mathematical formulas. The usable 1.2 cvs 550: object classes are not always mentioned in a limiting way in the generic 551: logical structure of documents. Rather, they can be chosen freely from a 1.18 cvs 552: large set, independent of the document class.</p> 1.30 ! cvs 553: ! 554: <p>Thus, the object classes will be made commonplace and usable in every 1.1 cvs 555: document. The notion of ``object'' can be enlarged to include not only 556: non-textual elements, but also certain types of textual elements which can 557: appear in practically every document, whatever their class. Among these 1.2 cvs 558: textual elements, one can mention enumerations, descriptions, examples, 1.18 cvs 559: quotations, even paragraphs.</p> 1.30 ! cvs 560: ! 561: <p>Thus, the document model is not a single, general model describing every ! 562: type of document in one place. Rather, it is a meta-model which can be used ! 563: to describe many different models each of which represents either a class of 1.1 cvs 564: similar documents or a class of similar objects which every document can 1.18 cvs 565: include.</p> 566: </div> 567: <hr> 568: </div> 1.1 cvs 569: 1.18 cvs 570: <div class="chapter"> 571: <h1><a name="sect3">The S language</a></h1> 1.1 cvs 572: 1.18 cvs 573: <div class="section"> 1.30 ! cvs 574: <h2><a name="sectb31">Document meta-structure</a></h2> 1.1 cvs 575: 1.30 ! cvs 576: <p>Since the concept of meta-structure is well suited to the task of ! 577: describing documents at a high level of abstraction, this meta-structure must ! 578: be precisely defined. Toward that end this section first presents the basic 1.1 cvs 579: elements from which documents and structured objects are composed and then 580: specifies the ways in which these basic elements are assembled into structures 1.18 cvs 581: representing complete documents and objects.</p> 1.1 cvs 582: 1.18 cvs 583: <div class="subsection"> 1.30 ! cvs 584: <h3><a name="sectc311">The basic types</a></h3> 1.1 cvs 585: 1.30 ! cvs 586: <p>At the lowest level of a document's structure, the first atom considered is 1.1 cvs 587: the character. However, since characters are seldom isolated, usually 588: appearing as part of a linear sequence, and in order to reduce the complexity 1.18 cvs 589: of the document structure, <em>character strings</em> are used as atoms and 1.1 cvs 590: consecutive characters belonging to the same structural element are grouped in 1.18 cvs 591: the same character string.</p> 1.30 ! cvs 592: ! 593: <p>If the structure of a document is not refined to go down to the level of 1.1 cvs 594: words or phrases, the contents of a simple paragraph can be considered to be a 595: single character string. On the other hand, the title of a chapter, the title 596: of the first section of that chapter, and the text of the first paragraph of 597: that section constitute three different character strings, because they belong 1.18 cvs 598: to distinct structural elements.</p> 1.30 ! cvs 599: ! 600: <p>If, instead, a very fine-grained representation for the structure of a 1.1 cvs 601: document is sought, character strings could be defined to contain only a 602: single word, or even just a single character. This is the case, for example, 603: in programs, for which one wants to retain a structure very close to the 1.2 cvs 604: syntax of the programming language. In this case, an assignment statement 1.1 cvs 605: initializing a simple variable to zero would be composed of two structural 606: elements, the identifier of the variable (a short character string) and the 1.18 cvs 607: assigned value (a string of a single character, `0').</p> 1.30 ! cvs 608: ! 609: <p>The character string is not the only atom necessary for representing those 1.1 cvs 610: documents that interest us. It suffices for purely textual documents, but as 611: soon as the non-textual objects which we have considered arise, there must be 612: other atoms; the number of objects which are to be represented determines the 1.18 cvs 613: number of types of atoms that are necessary.</p> 1.30 ! cvs 614: ! 615: <p>Primitive <em>graphical elements</em> are used for tables and figures of 1.1 cvs 616: different types. These elements are simple geometric shapes like horizontal 617: or vertical lines, which are sufficient for tables, or even oblique lines, 1.2 cvs 618: arrows, rectangles, circles, polygons, and curves for use in figures. From 619: these elements and character strings, graphical objects and tables can be 1.18 cvs 620: constructed.</p> 1.30 ! cvs 621: ! 622: <p>Photographs, though having very little structure, must still appear in 1.18 cvs 623: documents. They are supported by <em>picture</em> elements, which are 624: represented as matrices of pixels.</p> 1.30 ! cvs 625: ! 626: <p>Finally, mathematical notations require certain elements which are 1.18 cvs 627: simultaneously characters and graphical elements, the <em>symbols</em>. By way 1.2 cvs 628: of example, radicals, integration signs, or even large parentheses are 1.1 cvs 629: examples of this type of atom. The size of each of these symbols is 630: determined by its environment, that is to say, by the expression to which it 1.18 cvs 631: is attached.</p> 1.30 ! cvs 632: ! 633: <p>To summarize, the primitive elements which are used in the construction of 1.18 cvs 634: documents and structured objects are:</p> 635: <ul> 1.30 ! cvs 636: <li>character strings,</li> ! 637: <li>graphical elements,</li> ! 638: <li>pictures,</li> ! 639: <li>and mathematical symbols.</li> 1.18 cvs 640: </ul> 641: </div> 1.1 cvs 642: 1.18 cvs 643: <div class="subsection"> 1.30 ! cvs 644: <h3><a name="sectc312">Constructed elements</a></h3> ! 645: ! 646: <p>A document is evidently formed from primitive elements. But the model of ! 647: Thot also proposes higher level elements. Thus, in a document composed of ! 648: several chapters, each chapter is an element, and in the chapters each section ! 649: is also an element, and so on. A document is thus an organized set of ! 650: elements.</p> 1.1 cvs 651: 1.30 ! cvs 652: <p>In a document there are different sorts of elements. Each element has a 1.18 cvs 653: <em>type</em> which indicates the role of the element within the document as a 1.1 cvs 654: whole. Thus, we have, for example, the chapter and section types. The 655: document is made up of typed elements: elements of the type chapter and 656: elements of the type section, among others, but also character string elements 657: and graphical elements: the primitive elements are typed elements just as 658: well. At the other extreme, the document itself is also considered to be a 1.18 cvs 659: typed element.</p> 1.30 ! cvs 660: ! 661: <p>The important difference between the primitive elements and the other ! 662: elements of the document is that the primitive elements are atoms (they cannot ! 663: be decomposed), whereas the others, called <em>constructed elements</em>, are 1.1 cvs 664: composed of other elements, which can either be primitive elements or 665: constructed elements. A constructed element of type chapter (or more simply, 666: ``a chapter'') is composed of sections, which are also constructed elements. A 667: paragraph, a constructed element, can be made up of character strings, which 1.18 cvs 668: are primitive elements, and of equations, which are constructed elements.</p> 1.30 ! cvs 669: ! 670: <p>A document is also a constructed element. This is an important point. In 1.1 cvs 671: particular, it allows a document to be treated as part of another document, 672: and conversely, permits a part of a document to be treated as a complete 673: document. Thus, an article presented in a journal is treated by its author as 674: a document in itself, while the editor of the journal considers it to be part 675: of an issue. A table or a figure appearing in a document can be extracted and 676: treated as a complete document, for example to prepare transparencies for a 1.18 cvs 677: conference.</p> 1.30 ! cvs 678: ! 679: <p>These thoughts about types and constructed elements apply just as well to 1.1 cvs 680: objects as they do to documents. A table is a constructed element made up of 681: other constructed elements, rows and columns. A row is formed of cells, which 682: are also constructed elements which contain primitive elements (character 1.18 cvs 683: strings) and/or constructed elements like equations.</p> 684: </div> 1.1 cvs 685: 1.18 cvs 686: <div class="subsection"> 1.30 ! cvs 687: <h3><a name="sectc313">Logical structure constructors</a></h3> 1.1 cvs 688: 1.30 ! cvs 689: <p>Having defined the primitive elements and the constructed elements, it is ! 690: now time to define the types of organization which allow the building of 1.18 cvs 691: structures. For this, we rely on the notion of the <em>constructor</em>. A 1.1 cvs 692: constructor defines a way of assembling certain elements in a structure. It 693: resides at the level of the meta-structure: it does not describe the existing 694: relations in a given structure, but rather defines how elements are assembled 1.18 cvs 695: to build a structure that conforms to a model.</p> 1.30 ! cvs 696: ! 697: <p>In defining the overall organization of documents, the first two ! 698: constructors considered are the aggregate and the list.</p> 1.1 cvs 699: 1.18 cvs 700: <div class="subsubsection"> 1.30 ! cvs 701: <h4><a name="sectd3131">Aggregate and List</a></h4> 1.1 cvs 702: 1.30 ! cvs 703: <p>The <em>aggregate</em> constructor is used to define constructed element ! 704: types which are collections of a given number of other elements. These ! 705: collections may or may not be ordered. The elements may be either constructed ! 706: or primitive and are specified by their type. A report (that is, a ! 707: constructed element of the report type) has an aggregate structure. It is ! 708: formed from a title, an author's name, an introduction, a body, and a ! 709: conclusion, making it a collection of five element types. This type of ! 710: constructor is found in practically every document, and generally at several ! 711: levels in a document.</p> ! 712: ! 713: <p>The <em>list</em> constructor is used to define constructed elements which ! 714: are ordered sequences of elements (constructed or primitive) having the same ! 715: type. The minimum and maximum numbers of elements for the sequence can be ! 716: specified in the list constructor or the number of elements can be left ! 717: unconstrained. The body of a report is a list of chapters and is typically ! 718: required to contain a minimum of two chapters (is a chapter useful if it is ! 719: the only one in the report?) The chapter itself can contain a list of ! 720: sections, each section containing a list of paragraphs. In the same way as ! 721: the aggregate, the list is a very frequently used constructor in every type of ! 722: document. However, these two constructors are not sufficient to describe every ! 723: document structure; thus other constructors supplement them.</p> 1.18 cvs 724: </div> 1.1 cvs 725: 1.18 cvs 726: <div class="subsubsection"> 1.30 ! cvs 727: <h4><a name="sectd3132">Choice, Schema, and Unit</a></h4> 1.1 cvs 728: 1.30 ! cvs 729: <p>The <em>choice</em> constructor is used to define the structure of an ! 730: element type for which one alternative is chosen from several possibilities. ! 731: Thus, a paragraph can be either a simple text paragraph, or an enumeration, or ! 732: a citation.</p> ! 733: ! 734: <p>The choice constructor indicates the complete list of possible options, ! 735: which can be too restrictive in certain cases, the paragraph being one such ! 736: case. Two constructors, <em>unit</em> and <em>schema</em>, address this 1.1 cvs 737: inconvenience. They allow more freedom in the choice of an element type. If 738: a paragraph is defined by a schema constructor, it is possible to put in the 739: place of a paragraph a table, an equation, a drawing or any other object 740: defined by another generic logical structure. It is also possible to define a 741: paragraph as a sequence of units, which could be character strings, symbols, 1.2 cvs 742: or pictures. The choice constructor alone defines a generic logical structure 1.1 cvs 743: that is relatively constrained; in contrast, using units and schemas, a very 1.18 cvs 744: open structure can be defined.</p> 1.30 ! cvs 745: ! 746: <p>The <em>schema</em> constructor represents an object defined by a generic 1.18 cvs 747: logical structure chosen freely from among those available.</p> 1.30 ! cvs 748: ! 749: <p>The <em>unit</em> constructor represents an element whose type can be ! 750: either a primitive type or an element type defined as a unit in the generic ! 751: logical structure of the document, or in another generic logical structure ! 752: used in the document. Such an element may be used in document objects ! 753: constructed according to other generic structures.</p> ! 754: ! 755: <p>Thus, for example, if a cross-reference to a footnote is defined in the 1.1 cvs 756: generic logical structure ``Article'' as a unit, a table (an object defined by 757: another generic structure) can contain cross-references to footnotes, when 758: they appear in an article. In another type of document, a table defined by 759: the same generic structure can contain other types of elements, depending on 760: the type of document into which the table is inserted. All that is needed is 761: to declare, in the generic structure for tables, that the contents of cells 762: are units. In this way, the generic structure of objects is divided up 763: between different types of documents which are able to adapt themselves to the 1.18 cvs 764: environment into which they are inserted.</p> 765: </div> 1.1 cvs 766: 1.18 cvs 767: <div class="subsubsection"> 1.30 ! cvs 768: <h4><a name="sectd3133">Reference and Inclusion</a></h4> 1.1 cvs 769: 1.30 ! cvs 770: <p>The <em>reference</em> is used to define document elements that are 1.18 cvs 771: cross-references to other elements, such as a section, a chapter, a 772: bibliographic citation, or a figure. The reference is bi-directional. It can 773: be used to access both the element being cross-referenced and each of the 774: elements which make use of the cross-reference.</p> 1.30 ! cvs 775: ! 776: <p>References can be either <em>internal</em> or <em>external</em>. That is, 1.1 cvs 777: they can designate elements which appear in the same document or in another 1.18 cvs 778: document.</p> 1.30 ! cvs 779: ! 780: <p>The <em><a name="inclusion">inclusion</a></em> constructor is a special ! 781: type of reference. Like the reference, it is an internal or external ! 782: bidirectional link, but it is not a cross-reference. This link represents the ! 783: ``live'' inclusion of the designated element; it accesses the most recent ! 784: version of that element and not a ``dead'' copy, fixed in the state in which ! 785: it was found at the moment the copy was made. As soon as an element is ! 786: modified, all of its inclusions are automatically brought up to date. It must ! 787: be noted that, in addition to inclusion, Thot permits the creation of ``dead'' ! 788: copies.</p> ! 789: ! 790: <p>There are three types of inclusions: inclusions with full expansion, 1.1 cvs 791: inclusions with partial expansion, and inclusions without expansion. During 792: editing, inclusions without expansion are represented on the screen by the 793: name of the included document, in a special color, while inclusions with 794: expansion (full or partial) are represented by a copy (full or partial) of the 795: included element (also in a special color). The on-screen representation of a 1.18 cvs 796: partial inclusion is a <a href="#sectc3213">``skeleton''</a> image of the 797: included document.</p> 1.30 ! cvs 798: ! 799: <p>Inclusion with complete expansion can be used to include parts of the same 1.1 cvs 800: document or of other documents. Thus, it can be either an internal or an 801: external link. It can be used to include certain bibliographic entries of a 802: scientific article in another article, or to copy part of a mathematical 803: formula into another formula of the same document, thus assuring that both 1.18 cvs 804: copies will remain synchronized.</p> 1.30 ! cvs 805: ! 806: <p>Inclusion without expansion or with partial expansion is used to include 1.1 cvs 807: complete documents. It is always an external link. It is used primarily to 808: divide very large documents into sub-documents that are easier to manipulate, 809: especially when there are many authors. So, a book can include some chapters, 810: where each chapter is a different document which can be edited separately. 811: When viewing the book on the screen, it might be desirable to see only the 812: titles of the chapters and sections. This can be achieved using inclusion 1.18 cvs 813: with partial expansion.</p> 1.30 ! cvs 814: ! 815: <p>During printing, inclusions without expansion or with partial expansion can ! 816: be represented either as they were shown on the screen or by a complete (and 1.18 cvs 817: up-to-date) copy of the included element or document.</p> 1.30 ! cvs 818: ! 819: <p>The inclusion constructor, whatever its type, respects the generic ! 820: structure: only those elements authorized by the generic structure can be ! 821: included at a given position in a document.</p> 1.18 cvs 822: </div> 1.1 cvs 823: 1.18 cvs 824: <div class="subsubsection"> 1.30 ! cvs 825: <h4><a name="sectd3134">Mark pairs</a></h4> 1.1 cvs 826: 1.30 ! cvs 827: <p>It is often useful to delimit certain parts of a document independently ! 828: from the logical structure. For example, one might wish to attach some ! 829: information (in the form of an <a href="#sectc315">attribute</a>) or a ! 830: particular treatment to a group of words or a set of consecutive paragraphs. ! 831: <em>Mark pairs</em> are used to do this.</p> ! 832: ! 833: <p>Mark pairs are elements which are always paired and are terminals in the 1.1 cvs 834: logical structure of the document. Their position in the structure of the 835: document is defined in the generic structure. It is important to note that 1.18 cvs 836: when the terminals of a mark pair are <em>extensions</em> (see the next 837: section), they can be used quite freely.</p> 838: </div> 1.1 cvs 839: 1.18 cvs 840: <div class="subsubsection"> 1.30 ! cvs 841: <h4><a name="sectd3135">Restrictions and Extensions</a></h4> 1.1 cvs 842: 1.30 ! cvs 843: <p>The primitive types and the constructors presented so far permit the 1.1 cvs 844: definition of the logical structure of documents and objects in a rigorous 845: way. But this definition can be very cumbersome in certain cases, notably 846: when trying to constrain or extend the authorized element types in a 1.18 cvs 847: particular context. <em>Restrictions</em> and <em>extensions</em> are used to 848: cope with these cases.</p> 1.30 ! cvs 849: ! 850: <p>A restriction associates with a particular element type <em>A</em>, a list ! 851: of those element types which elements of type <em>A</em> may not contain, even ! 852: if the definition of type <em>A</em> and those of its components authorize ! 853: them otherwise. This simplifies the writing of generic logical structures and 1.1 cvs 854: allows limitations to be placed, when necessary, on the choices offered by the 1.18 cvs 855: schema and unit constructors.</p> 1.30 ! cvs 856: ! 857: <p>Extensions are the inverse of restrictions. They identify a list of ! 858: element types whose presence <em>is</em> permitted, even if its definition and ! 859: those of its components do not authorize them otherwise.</p> 1.18 cvs 860: </div> 861: 862: <div class="subsubsection"> 1.30 ! cvs 863: <h4><a name="sectd3136">Summary</a></h4> 1.18 cvs 864: 1.30 ! cvs 865: <p>Thus, four constructors are used to construct a document:</p> 1.18 cvs 866: <ul> 1.30 ! cvs 867: <li>the aggregate constructor (ordered or not),</li> ! 868: <li>the list constructor,</li> ! 869: <li>the choice constructor and its extensions, the unit and schema ! 870: constructors,</li> ! 871: <li>the reference constructor and its variant, the inclusion.</li> ! 872: </ul> ! 873: ! 874: <p>These constructors are also sufficient for objects. Thus, these ! 875: constructors provide a homogenous meta-model which can describe both the ! 876: organization of the document as a whole and that of the various types of ! 877: objects which it contains. After presenting the description language for ! 878: generic structures, we will present several examples which illustrate the ! 879: appropriateness of the model.</p> ! 880: ! 881: <p>The first three constructors (aggregate, list and choice) lead to tree-like 1.1 cvs 882: structures for documents and objects, the objects being simply the subtrees of 883: the tree of a document (or even of other objects' subtrees). The reference 884: constructor introduces other, non-hierarchical, relations which augment those 885: of the tree: when a paragraph makes reference to a chapter or a section, that 886: relation leaves the purely tree-like structure. Moreover, external reference 887: and inclusion constructors permit the establishment of links between different 1.18 cvs 888: documents, thus creating a hypertext structure.</p> 889: </div> 890: </div> 1.1 cvs 891: 1.18 cvs 892: <div class="subsection"> 1.30 ! cvs 893: <h3><a name="sectc314">Associated Elements</a></h3> 1.1 cvs 894: 1.30 ! cvs 895: <p>Thanks to the list, aggregate and choice constructors, the organization of ! 896: the document is specified rigorously, using constructed and primitive ! 897: elements. But a document is made up of more than just its elements; it clearly ! 898: also contains links between them. There exist elements whose position in the 1.1 cvs 899: document's structure is not determinable. This is notably the case for 900: figures and notes. A figure can be designated at many points in the same 901: document and its place in the physical document can vary over the life of the 902: document without any effect on the meaning or clarity of the document. At one 903: time, it can be placed at the end of the document along with all other 904: figures. At another time, it can appear at the top of the page which follows 905: the first mention of the figure. The figures can be dispersed throughout the 906: document or can be grouped together. The situation is similar for notes, 907: which can be printed at the bottom of the page on which they are mentioned or 908: assembled together at the end of the chapter or even the end of the work. Of 909: course, this brings up questions of the physical position of elements in 910: documents that are broken into pages, but this reflects the structural 911: instability of these elements. They cannot be treated the same way as 912: elements like paragraphs or sections, whose position in the structure is 1.18 cvs 913: directly linked to the semantics of the document.</p> 1.30 ! cvs 914: ! 915: <p>Those elements whose position in the structure of the document is not ! 916: fixed, even though they are definitely part of the document, are called 1.18 cvs 917: <em>associated elements</em>. Associated elements are themselves structures, 1.1 cvs 918: which is to say that their content can be organized logically by the 1.18 cvs 919: constructors from primitive and constructed elements.</p> 1.30 ! cvs 920: ! 921: <p>It can happen that the associated elements are totally disconnected from ! 922: the structure of the document, as in a commentary or appraisal of the entire ! 923: work. But more often, the associated elements are linked to the content of the 1.1 cvs 924: document by references. This is generally the case for notes and figures, 1.18 cvs 925: among others.</p> 1.30 ! cvs 926: ! 927: <p>Thus, associated elements introduce a new use for the reference ! 928: constructor. It not only serves to create links between elements of the ! 929: principal structure of the document, but also serves to link the associated ! 930: elements to the primary structure.</p> 1.18 cvs 931: </div> 1.1 cvs 932: 1.18 cvs 933: <div class="subsection"> 1.30 ! cvs 934: <h3><a name="sectc315">Attributes</a></h3> 1.1 cvs 935: 1.30 ! cvs 936: <p>There remain logical aspects of documents that are not entirely described ! 937: by the structure. Certain types of semantic information, which are not stated 1.1 cvs 938: explicitly in the text, must also be taken into account. In particular, such 939: information is shown by typographic effects which do not correspond to a 940: change between structural elements. In fact, certain titles are set in bold 941: or italic or are printed in a different typeface from the rest of the text in 942: order to mark them as structurally distinct. But these same effects 943: frequently appear in the middle of continuous text (e.g. in the interior of a 944: paragraph). In this case, there is no change between structural elements; the 945: effect serves to highlight a word, expression, or phrase. The notion of an 1.18 cvs 946: <em>attribute</em> is used to express this type of information.</p> 1.30 ! cvs 947: ! 948: <p>An attribute is a piece of information attached to a structural element ! 949: which augments the type of the element and clarifies its function in the ! 950: document. Keywords, foreign language words, and titles of other works can all ! 951: be represented by character strings with attached attributes. Attributes may 1.1 cvs 952: also be attached to constructed elements. Thus, an attribute indicating the 953: language can be attached to a single word or to a large part of a 1.18 cvs 954: document.</p> 1.30 ! cvs 955: ! 956: <p>In fact, an attribute can be any piece of information which is linked to a 1.1 cvs 957: part of a document and which can be used by agents which work on the document. 958: For example, the language in which the document is written determines the set 959: of characters used by an editor or formatter. It also determines the 960: algorithm or hyphenation dictionary to be used. The attribute ``keyword'' 961: facilitates the work of an information retrieval system. The attribute 962: ``index word'' allows a formatter to automatically construct an index at the 1.18 cvs 963: end of the document.</p> 1.30 ! cvs 964: ! 965: <p>As with the types of constructed elements, the attributes and the values ! 966: they can take are defined separately in each generic logical structure, not in ! 967: the meta-model, according to the needs of the document class or the nature of ! 968: the object.</p> ! 969: ! 970: <p>Many types of attributes are offered: numeric, textual, references, and 1.18 cvs 971: enumerations:</p> 972: <ul> 1.30 ! cvs 973: <li><em>Numeric attributes</em> can take integer values (negative, positive, ! 974: or null).</li> ! 975: <li><em>Textual attributes</em> have as their values character strings.</li> ! 976: <li><em>Reference attributes</em> designate an element of the logical ! 977: structure.</li> ! 978: <li><em>Enumeration attributes</em> can take one value from a limited list ! 979: of possible values, each value being a name.</li> 1.18 cvs 980: </ul> 1.30 ! cvs 981: ! 982: <p>In a generic structure, there is a distinction between <em>global 1.18 cvs 983: attributes</em> and <em>local attributes</em>. A global attribute can be 1.1 cvs 984: applied to every element type defined in the generic structure where it is 985: specified. In contrast, a local attribute can only be applied to certain 986: types of elements, even only a single type. The ``language'' attribute 987: presented above is an example of a global attribute. An example of a local 988: attribute is the rank of an author (principal author of the document or 989: secondary author): this attribute can only be applied sensibly to an element 1.18 cvs 990: of the ``author'' type.</p> 1.30 ! cvs 991: ! 992: <p>Attributes can be assigned to the elements which make up the document in ! 993: many different ways. The author can freely and dynamically place them on any ! 994: part of the document in order to attach supplementary information of his/her 1.18 cvs 995: choice. However, attributes may only be assigned in accordance with the rules 996: of the generic structure; in particular, local attributes can only be assigned 997: to those element types for which they are defined.</p> 1.30 ! cvs 998: ! 999: <p>In the generic structure, certain local attributes can be made mandatory ! 1000: for certain element types. In this case, Thot automatically associates the 1.2 cvs 1001: attribute with the elements of this type and it requires the user to provide a 1.18 cvs 1002: value for this attribute.</p> 1.30 ! cvs 1003: ! 1004: <p>Attributes can also be automatically assigned, with a given value, by every 1.1 cvs 1005: application processing the document in order to systematically add a piece of 1006: information to certain predefined elements of the document. By way of 1007: example, in a report containing a French abstract and an English abstract, 1008: each of the two abstracts is defined as a sequence of paragraphs. The first 1009: abstract has a value of ``French'' for the ``language'' attribute while the 1.18 cvs 1010: second abstract's ``language'' attribute has a value of ``English''.</p> 1.30 ! cvs 1011: ! 1012: <p>In the case of mark pairs, attributes are logically associated with the ! 1013: pair as a whole, but are actually attached to the first mark.</p> 1.18 cvs 1014: </div> 1.1 cvs 1015: 1.18 cvs 1016: <div class="subsection"> 1.30 ! cvs 1017: <h3><a name="sectc316">Discussion of the model</a></h3> 1.1 cvs 1018: 1.30 ! cvs 1019: <p>The notions of attribute, constructor, structured element, and associated 1.1 cvs 1020: element are used in the definition of generic logical structures of documents 1021: and objects. The problem is to assemble them to form generic structures. In 1022: fact, many types of elements and attributes can be found in a variety of 1023: generic structures. Rather than redefine them for each structure in which 1024: they appear, it is best to share them between structures. The object classes 1025: already fill this sharing function. If a mathematical class is defined, its 1026: formulas can be used in many different document classes, without redefining 1027: the structure of each class. This problem arises not only for the objects 1028: considered here; it also arises for the commonplace textual elements found in 1029: many document classes. This is the reason why the notion of object is so 1030: broad and why paragraphs and enumerations are also considered to be objects. 1031: These object classes not only permit the sharing of the structures of 1.18 cvs 1032: elements, but also of the attributes defined in the generic structures.</p> 1.30 ! cvs 1033: ! 1034: <p>Structure, such as that presented here, can appear very rigid, and it is 1.1 cvs 1035: possible to imagine that a document editing system based on this model could 1036: prove very constraining to the user. This is, in fact, a common criticism of 1037: syntax-directed editors. This defect can be avoided with Thot, primarily for 1.18 cvs 1038: three reasons:</p> 1039: <ul> 1.30 ! cvs 1040: <li>the generic structures are not fixed in the model itself,</li> ! 1041: <li>the model takes the dynamics of documents into account,</li> ! 1042: <li>the constructors offer great flexibility.</li> 1.18 cvs 1043: </ul> 1.30 ! cvs 1044: ! 1045: <p>When the generic structure of a document is not predefined, but rather is 1.1 cvs 1046: constructed specifically for each document class, it can be carefully adapted 1047: to the current needs. In cases where the generic structure is inadequate for 1048: a particular document of the class, it is always possible either to create a 1049: new class with a generic structure well suited to the new case or to extend 1050: the generic structure of the existing class to take into account the specifics 1051: of the document which poses the problem. These two solutions can also be 1.18 cvs 1052: applied to objects whose structures prove to be poorly designed.</p> 1.30 ! cvs 1053: ! 1054: <p>The model is sufficiently flexible to take into account all the phases of ! 1055: the life of the document. When a generic structure specifies that a report ! 1056: must contain a title, an abstract, an introduction, at least two chapters, and ! 1057: a conclusion, this means only that a report, <em>upon completion</em>, will ! 1058: have to contain all of these elements. When the author begins writing, none ! 1059: of these elements is present. Thot uses this model. Therefore, it tolerates 1.2 cvs 1060: documents which do not conform strictly to the generic structure of their 1061: class; it also considers the generic logical structure to be a way of helping 1.18 cvs 1062: the user in the construction of a complex document.</p> 1.30 ! cvs 1063: ! 1064: <p>In contrast, other applications may reject a document which does not ! 1065: conform strictly to its generic structure. This is, for example, what is done ! 1066: by compilers which refuse to generate code for a program which is not 1.1 cvs 1067: syntactically correct. This might also occur when using a document 1.18 cvs 1068: application for a report which does not have an abstract or title.</p> 1.30 ! cvs 1069: ! 1070: <p>The constructors of the document model bring a great flexibility to the 1.1 cvs 1071: generic structures. A choice constructor (and even more, a unit or schema 1072: constructor) can represent several, very different elements. The list 1073: constructor permits the addition of more elements of the same type. Used 1074: together, these two constructors permit any series of elements of different 1075: types. Of course, this flexibility can be reduced wherever necessary since a 1076: generic structure can limit the choices or the number of elements in a 1.18 cvs 1077: list.</p> 1.30 ! cvs 1078: ! 1079: <p>Another difficulty linked to the use of structure in the document model 1.1 cvs 1080: resides in the choice of the level of the structure. The structure of a 1081: discussion could be extracted from the text itself via linguistic analysis. 1082: Some studies are exploring this approach, but the model of Thot excludes this 1083: type of structure. It only takes into account the logical structure provided 1.18 cvs 1084: explicitly by the author.</p> 1.30 ! cvs 1085: ! 1086: <p>However, the level of structure of the model is not imposed. Each generic 1.1 cvs 1087: structure defines its own level of structure, adapted to the document class or 1088: object and to the ways in which it will be processed. If it will only be 1089: edited and printed, a relatively simple structure suffices. If more 1090: specialized processing will be applied to it, the structure must represent the 1091: element types on which this processing must act. By way of example, a simple 1092: structure is sufficient for printing formulas, but a more complex structure is 1093: required to perform symbolic or numeric calculations on the mathematical 1.18 cvs 1094: expressions. The document model of Thot allows both types of structure.</p> 1095: </div> 1096: </div> 1.1 cvs 1097: 1.18 cvs 1098: <div class="section"> 1.30 ! cvs 1099: <h2><a name="sectb32">The definition language for generic structures</a></h2> 1.1 cvs 1100: 1.30 ! cvs 1101: <p>Generic structures, which form the basis of the document model of Thot, are 1.1 cvs 1102: specified using a special language. This definition language, called S, is 1.18 cvs 1103: described in this section.</p> 1.30 ! cvs 1104: ! 1105: <p>Each generic structure, which defines a class of documents or objects, is 1.2 cvs 1106: specified by a file, written in the S language, which is called a 1.18 cvs 1107: <em>structure schema</em>. Structure schemas are compiled into tables, called 1108: structure tables, which are used by Thot and which determine its behavior.</p> 1.1 cvs 1109: 1.18 cvs 1110: <div class="subsection"> 1.30 ! cvs 1111: <h3><a name="sectc321">Writing Conventions</a></h3> 1.1 cvs 1112: 1.30 ! cvs 1113: <p>The grammar of S, like those of the languages P and T presented later, is 1.1 cvs 1114: described using the meta-language M, derived from the Backus-Naur Form 1.18 cvs 1115: (BNF).</p> 1.30 ! cvs 1116: ! 1117: <p>In this meta-language each rule of the grammar is composed of a grammar ! 1118: symbol followed by an equals sign (`=') and the right part of the rule. The ! 1119: equals sign plays the same role as the traditional `::=' of BNF: it indicates ! 1120: that the right part defines the symbol of the left part. In the right ! 1121: part,</p> 1.18 cvs 1122: <dl> 1.30 ! cvs 1123: <dt>concatenation</dt> ! 1124: <dd>is shown by the juxtaposition of symbols;</dd> ! 1125: <dt>character strings</dt> ! 1126: <dd>between apostrophes ' represent terminal symbols, that is, keywords in ! 1127: the language defined. Keywords are written here in upper-case letters, ! 1128: but can be written in any combination of upper and lower-case letters. ! 1129: For example, the keyword <tt>DEFPRES</tt> of S can also be written as ! 1130: <tt>defpres</tt> or <tt>DefPres</tt>.</dd> ! 1131: <dt>material between brackets</dt> ! 1132: <dd>(`[' and `]') is optional;</dd> ! 1133: <dt>material between angle brackets</dt> ! 1134: <dd>(`<' and `>') can be repeated many times or omitted;</dd> ! 1135: <dt>the slash</dt> ! 1136: <dd>(`/') indicates an alternative, a choice between the options separated ! 1137: by the slash character;</dd> ! 1138: <dt>the period</dt> ! 1139: <dd>marks the end of a rule;</dd> ! 1140: <dt>text between braces</dt> ! 1141: <dd>(`{' and `}') is simply a comment.</dd> 1.18 cvs 1142: </dl> 1.30 ! cvs 1143: ! 1144: <p>The M meta-language also uses the concepts of identifiers, strings, and 1.18 cvs 1145: integers:</p> 1146: <dl> 1.30 ! cvs 1147: <dt><tt>NAME</tt></dt> ! 1148: <dd>represents an identifier, a sequence of letters (upper or lower-case), ! 1149: digits, and underline characters (`_'), beginning with a letter. Also ! 1150: considered a letter is the sequence of characters `<tt>\nnn</tt>' where ! 1151: the letter <tt>n</tt> represents the ISO Latin-1 code of the letter in ! 1152: octal. It is thus possible to use accented letters in identifiers. The ! 1153: maximum length of identifiers is fixed by the compiler. It is normally ! 1154: 31 characters. ! 1155: <p>Unlike keywords, upper and lower-case letters are distinct in ! 1156: identifiers. Thus, <tt>Title</tt>, <tt>TITLE</tt>, and <tt>title</tt> ! 1157: are considered different identifiers.</p> ! 1158: </dd> ! 1159: <dt><tt>STRING</tt></dt> ! 1160: <dd>represents a string. This is a string of characters delimited by ! 1161: apostrophes. If an apostrophe must appear in a string, it is doubled. ! 1162: As with identifiers, strings can contain characters represented by their ! 1163: octal code (after a backslash). As with apostrophes, if a backslash ! 1164: must appear in a string, it is doubled.</dd> ! 1165: <dt><tt>NUMBER</tt></dt> ! 1166: <dd>represents a positive integer or zero (without a sign), or said ! 1167: another way, a sequence of decimal digits.</dd> 1.18 cvs 1168: </dl> 1.30 ! cvs 1169: ! 1170: <p>The M language can be used to define itself as follows:</p> 1.18 cvs 1171: <pre>{ Any text between braces is a comment. } 1.30 ! cvs 1172: Grammar = Rule < Rule > 'END' . ! 1173: { The < and > signs indicate zero } 1.1 cvs 1174: { or more repetitions. } 1175: { END marks the end of the grammar. } 1176: Rule = Ident '=' RightPart '.' . 1177: { The period indicates the end of a rule } 1178: RightPart = RtTerminal / RtIntermed . 1179: { The slash indicates a choice } 1180: RtTerminal ='NAME' / 'STRING' / 'NUMBER' . 1181: { Right part of a terminal rule } 1.30 ! cvs 1182: RtIntermed = Possibility < '/' Possibility > . 1.1 cvs 1183: { Right part of an intermediate rule } 1.30 ! cvs 1184: Possibility = ElemOpt < ElemOpt > . ! 1185: ElemOpt = Element / '[' Element < Element > ']' / ! 1186: '<' Element < Element > '>' . 1.1 cvs 1187: { Brackets delimit optional parts } 1188: Element = Ident / KeyWord . 1189: Ident = NAME . 1190: { Identifier, sequence of characters } 1191: KeyWord = STRING . 1192: { Character string delimited by apostrophes } 1.18 cvs 1193: END</pre> 1194: </div> 1.1 cvs 1195: 1.18 cvs 1196: <div class="subsection"> 1.30 ! cvs 1197: <h3><a name="sectc322">Extension schemas</a></h3> 1.1 cvs 1198: 1.30 ! cvs 1199: <p>A structure schema defines the generic logical structure of a class of 1.1 cvs 1200: documents or objects, independent of the operations which can be performed on 1201: the documents. However, certain applications may require particular 1202: information to be represented by the structure for the documents that they 1203: operate on. Thus a document version manager will need to indicate in the 1204: document the parts which belong to one version or another. An indexing system 1205: will add highly-structured index tables as well as the links between these 1.18 cvs 1206: tables and the rest of the document.</p> 1.30 ! cvs 1207: ! 1208: <p>Thus, many applications need to extend the generic structure of the ! 1209: documents on which they operate to introduce new attributes, associated ! 1210: elements or element types. These additions are specific to each application ! 1211: and must be able to be applied to any generic structure: users will want to ! 1212: manage versions or construct indices for many types of documents. Extension ! 1213: schemas fulfill this role: they define attributes, elements, associated ! 1214: elements, units, etc., but they can only be used jointly with a structure ! 1215: schema that they complete. Otherwise, structure schemas can always be used ! 1216: without these extensions when the corresponding applications are not ! 1217: available.</p> 1.18 cvs 1218: </div> 1.1 cvs 1219: 1.18 cvs 1220: <div class="subsection"> 1.30 ! cvs 1221: <h3><a name="sectc323">The general organization of structure schemas</a></h3> 1.1 cvs 1222: 1.30 ! cvs 1223: <p>Every structure schema begins with the keyword <tt>STRUCTURE</tt> and ends 1.18 cvs 1224: with the keyword <tt>END</tt>. The keyword <tt>STRUCTURE</tt> is followed by 1225: the keyword <tt>EXTENSION</tt> in the case where the schema defines an 1.1 cvs 1226: extension, then by the name of the generic structure which the schema defines 1227: (the name of the document or object class). The name of the structure is 1.18 cvs 1228: followed by a semicolon.</p> 1.30 ! cvs 1229: ! 1230: <p>In the case of a complete schema (that is, a schema which is not an 1.1 cvs 1231: extension), the definition of the name of the structure is followed by the 1232: declarations of the default presentation schema, the global attributes, the 1233: parameters, the structure rules, the associated elements, the units, the 1234: skeleton elements and the exceptions. Only the definition of the structure 1235: rules is required. Each series of declarations begins with a keyword: 1.18 cvs 1236: <tt>DEFPRES</tt>, <tt>ATTR</tt>, <tt>PARAM</tt>, <tt>STRUCT</tt>, 1237: <tt>ASSOC</tt>, <tt>UNITS</tt>, <tt>EXPORT</tt>, <tt>EXCEPT</tt>.</p> 1.30 ! cvs 1238: ! 1239: <p>In the case of an extension schema, there are neither parameters nor ! 1240: skeleton elements and the <tt>STRUCT</tt> section is optional, while that ! 1241: section is required in a schema that is not an extension. On the other hand, ! 1242: extension schemas can contain an <tt>EXTENS</tt> section, which must not ! 1243: appear in a schema which is not an extension; this section defines the ! 1244: complements to attach to the rules found in the schema to which the extension ! 1245: will be added. The sections <tt>ATTR</tt>, <tt>STRUCT</tt>, <tt>ASSOC</tt>, ! 1246: and <tt>UNITS</tt> define new attributes, new elements, new associated ! 1247: elements, and new units which add their definitions to the principal ! 1248: schema.</p> 1.18 cvs 1249: <pre> StructSchema ='STRUCTURE' ElemID ';' 1.1 cvs 1250: 'DEFPRES' PresID ';' 1251: [ 'ATTR' AttrSeq ] 1252: [ 'PARAM' RulesSeq ] 1253: 'STRUCT' RulesSeq 1254: [ 'ASSOC' RulesSeq ] 1255: [ 'UNITS' RulesSeq ] 1256: [ 'EXPORT' SkeletonSeq ] 1257: [ 'EXCEPT' ExceptSeq ] 1258: 'END' . 1.18 cvs 1259: ElemID = NAME .</pre> 1.30 ! cvs 1260: ! 1261: <p>or</p> 1.18 cvs 1262: <pre> ExtensSchema ='STRUCTURE' 'EXTENSION' ElemID ';' 1.1 cvs 1263: 'DEFPRES' PresID ';' 1264: [ 'ATTR' AttrSeq ] 1265: [ 'STRUCT' RulesSeq ] 1266: [ 'EXTENS' ExtensRuleSeq ] 1267: [ 'ASSOC' RulesSeq ] 1268: [ 'UNITS' RulesSeq ] 1269: [ 'EXCEPT' ExceptSeq ] 1270: 'END' . 1.18 cvs 1271: ElemID = NAME .</pre> 1272: </div> 1.1 cvs 1273: 1.18 cvs 1274: <div class="subsection"> 1.30 ! cvs 1275: <h3><a name="sectc324">The default presentation</a></h3> 1.1 cvs 1276: 1.30 ! cvs 1277: <p>It was shown <a href="#mulpres">above</a> that many different presentations 1.1 cvs 1278: are possible for documents and objects of the same class. The structure 1.18 cvs 1279: schema defines a preferred presentation for the class, called the <em>default 1280: presentation</em>. Like generic structures, presentations are described by 1281: programs, called <em>presentation schemas</em>, which are written in a 1282: specific language, P, presented <a href="#sectb42">later</a> in this document. 1283: The name appearing after the keyword <tt>DEFPRES</tt> is the name of the 1.2 cvs 1284: default presentation schema. When a new document is created, Thot will use 1285: this presentation schema by default, but the user remains free to choose 1.18 cvs 1286: another if s/he wishes.</p> 1287: <pre> PresID = NAME .</pre> 1288: </div> 1.1 cvs 1289: 1.18 cvs 1290: <div class="subsection"> 1.30 ! cvs 1291: <h3><a name="sectc325">Global Attributes</a></h3> 1.1 cvs 1292: 1.30 ! cvs 1293: <p>If the generic structure includes global attributes of its own, they are 1.18 cvs 1294: declared after the keyword <tt>ATTR</tt>. Each global attribute is defined by 1.1 cvs 1295: its name, followed by an equals sign and the definition of its type. The 1.18 cvs 1296: declaration of a global attribute is terminated by a semi-colon.</p> 1.30 ! cvs 1297: ! 1298: <p>For attributes of the numeric, textual, or reference types, the type is 1.18 cvs 1299: indicated by a keyword, <tt>INTEGER</tt>, <tt>TEXT</tt>, or <tt>REFERENCE</tt> 1300: respectively.</p> 1.30 ! cvs 1301: ! 1302: <p>In the case of a reference attribute, the keyword <tt>REFERENCE</tt> is 1.1 cvs 1303: followed by the type of the referenced element in parentheses. It can refer 1.18 cvs 1304: to any type at all, specified by using the keyword <tt>ANY</tt>, or to a 1.1 cvs 1305: specific type. In the latter case, the element type designated by the 1.18 cvs 1306: reference can be defined either in the <a href="#sectc327"><tt>STRUCT</tt> 1307: section</a> of the same structure schema or in the <tt>STRUCT</tt> section of 1.1 cvs 1308: another structure schema. When the type is defined in another schema, the 1309: element type is followed by the name of the structure schema (within 1310: parentheses) in which it is defined. The name of the designated element type 1.18 cvs 1311: can be preceded by the keyword <tt>First</tt> or <tt>Second</tt>, but only in 1312: the case where the type is defined as <a href="#sectd3285">a pair</a>. These 1.1 cvs 1313: keywords indicate whether the attribute must designate the first mark of the 1314: pair or the second. If the reference refers to a pair and neither of these 1.18 cvs 1315: two keywords is present, then the first mark is used.</p> 1.30 ! cvs 1316: ! 1317: <p>In the case of an enumeration attribute, the equals sign is followed by the 1.1 cvs 1318: list of names representing the possible values of the attribute, the names 1319: being separated from each other by commas. An enumeration attribute has at 1320: least one possible value; the maximum number of values is defined by the 1.18 cvs 1321: compiler for the S language.</p> 1.30 ! cvs 1322: <pre> AttrSeq = Attribute < Attribute > . 1.1 cvs 1323: Attribute = AttrID '=' AttrType ';' . 1324: AttrType = 'INTEGER' / 'TEXT' / 1325: 'REFERENCE' '(' RefType ')' / 1326: ValueSeq . 1327: RefType = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] . 1328: FirstSec = 'First' / 'Second' . 1329: ExtStruct = '(' ElemID ')' . 1.30 ! cvs 1330: ValueSeq = AttrVal < ',' AttrVal > . 1.1 cvs 1331: AttrID = NAME . 1.18 cvs 1332: AttrVal = NAME .</pre> 1.30 ! cvs 1333: ! 1334: <p>There is a predefined global text attribute, the <em>language</em>, which ! 1335: is automatically added to every Thot structure schema. This attribute allows 1.2 cvs 1336: Thot to perform certain actions, such as hyphenation and spell-checking, which 1337: cannot be performed without knowing the language in which each part of the 1338: document is written. This attribute can be used just like any explicitly 1.18 cvs 1339: declared attribute: the system acts as if every structure schema contains</p> 1340: <pre>ATTR 1341: Language = TEXT;</pre> 1.30 ! cvs 1342: 1.18 cvs 1343: <blockquote class="example"> 1.30 ! cvs 1344: <p><strong>Example:</strong></p> ! 1345: ! 1346: <p>The following specification defines the global enumeration attribute ! 1347: WordType.</p> ! 1348: <pre>ATTR 1.18 cvs 1349: WordType = Definition, IndexWord, DocumentTitle;</pre> 1350: </blockquote> 1351: </div> 1.1 cvs 1352: 1.18 cvs 1353: <div class="subsection"> 1.30 ! cvs 1354: <h3><a name="sectc326">Parameters</a></h3> 1.1 cvs 1355: 1.30 ! cvs 1356: <p>A parameter is a document element which can appear many times in the ! 1357: document, but always has the same value. This value can only be modified in a 1.1 cvs 1358: controlled way by certain applications. For example, in an advertising 1359: circular, the name of the recipient may appear in the address part and in the 1360: text of the circular. If the recipient's name were a parameter, it might only 1.18 cvs 1361: be able to be changed by a ``mail-merge'' application.</p> 1.30 ! cvs 1362: ! 1363: <p>Parameters are not needed for every document class, but if the schema ! 1364: includes parameters they are declared after the keyword <tt>PARAM</tt>. Each ! 1365: parameter declaration is made in the same way as a <a ! 1366: href="#sectc327">structure element declaration</a>.</p> ! 1367: ! 1368: <p>During editing, Thot permits the insertion of parameters wherever the 1.1 cvs 1369: structure schema allows; it also permits the removal of parameters which are 1370: already in the document but does not allow the modification of the parameter's 1.2 cvs 1371: content in any way. The content is generated automatically by Thot during the 1372: creation of the parameter, based on the value of the parameter in the 1.18 cvs 1373: document.</p> 1374: </div> 1.1 cvs 1375: 1.18 cvs 1376: <div class="subsection"> 1.30 ! cvs 1377: <h3><a name="sectc327">Structured elements</a></h3> 1.1 cvs 1378: 1.30 ! cvs 1379: <p>The rules for defining structured elements are required, except in an 1.1 cvs 1380: extension schema: they constitute the core of a structure schema, since they 1381: define the structure of the different types of elements that occur in a 1.18 cvs 1382: document or object of the class defined by the schema.</p> 1.30 ! cvs 1383: ! 1384: <p>The first structure rule after the keyword <tt>STRUCT</tt> must define the 1.1 cvs 1385: structure of the class whose name appears in the first instruction 1.18 cvs 1386: (<tt>STRUCTURE</tt>) of the schema. This is the root rule of the schema, 1387: defining the root of the document tree or object tree.</p> 1.30 ! cvs 1388: ! 1389: <p>The remaining rules may be placed in any order, since the language permits ! 1390: the definition of element types before or after their use, or even in the same 1.1 cvs 1391: instruction in which they are used. This last case allows the definition of 1.18 cvs 1392: recursive structures.</p> 1.30 ! cvs 1393: ! 1394: <p>Each rule is composed of a name (the name of the element type whose ! 1395: structure is being defined) followed by an equals sign and a structure ! 1396: definition.</p> ! 1397: ! 1398: <p>If any local attributes are associated with the element type defined by the 1.2 cvs 1399: rule, they appear between parentheses after the type name and before the 1.18 cvs 1400: equals sign. The parentheses contain, first, the keyword <tt>ATTR</tt>, then 1.2 cvs 1401: the list of local attributes, separated by commas. Each local attribute is 1402: composed of the name of the attribute followed by an equals sign and the 1.18 cvs 1403: definition of the attribute's type, just as in the definition of <a 1404: href="#sectc325">global attributes</a>. The name of the attribute can be 1.2 cvs 1405: preceded by an exclamation point to indicate that the attribute must always be 1406: present for this element type. The same attribute, identified by its name, 1407: can be defined as a local attribute for multiple element types. In this 1408: case, the equals sign and definition of the attribute type need only appear in 1409: the first occurrence of the attribute. It should be noted that global 1.18 cvs 1410: attributes cannot also be defined as local attributes.</p> 1.30 ! cvs 1411: ! 1412: <p>If any <a href="#sectd3135">extensions</a> are defined for this element ! 1413: type, a plus sign follows the structure definition and the names of the ! 1414: extension element types appear between parentheses after the plus. If there ! 1415: are multiple extensions, they are separated by commas. These types can either ! 1416: be defined in the same schema, defined in other schemas, or they may be base 1.18 cvs 1417: types identified by the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>, 1418: <tt>SYMBOL</tt>, or <tt>PICTURE</tt>.</p> 1.30 ! cvs 1419: ! 1420: <p><a href="#sectd3135">Restrictions</a> are indicated in the same manner as 1.18 cvs 1421: extensions, but they are introduced by a minus sign and they come after the 1422: extensions, or if there are no extensions, after the structure definition.</p> 1.30 ! cvs 1423: ! 1424: <p>If the values of attributes must be attached systematically to this element 1.18 cvs 1425: type, they are introduced by the keyword <tt>WITH</tt> and declared in the 1.1 cvs 1426: form of a list of fixed-value attributes. When such definitions of fixed 1.18 cvs 1427: attribute values appear, they are always the last part of the rule.</p> 1.30 ! cvs 1428: ! 1429: <p>The rule is terminated by a semicolon.</p> ! 1430: <pre> RuleSeq = Rule < Rule > . 1.1 cvs 1431: Rule = ElemID [ LocAttrSeq ] '=' DefWithAttr ';'. 1.30 ! cvs 1432: LocAttrSeq = '(' 'ATTR' LocAttr < ';' LocAttr > ')' . 1.1 cvs 1433: LocAttr = [ '!' ] AttrID [ '=' AttrType ] . 1434: DefWithAttr = Definition 1435: [ '+' '(' ExtensionSeq ')' ] 1436: [ '-' '(' RestrictSeq ')' ] 1437: [ 'WITH' FixedAttrSeq ] . 1.30 ! cvs 1438: ExtensionSeq = ExtensionElem < ',' ExtensionElem > . 1.1 cvs 1439: ExtensionElem = ElemID / 'TEXT' / 'GRAPHICS' / 1440: 'SYMBOL' / 'PICTURE' . 1.30 ! cvs 1441: RestrictSeq = RestrictElem < ',' RestrictElem > . 1.1 cvs 1442: RestrictElem = ElemID / 'TEXT' / 'GRAPHICS' / 1.18 cvs 1443: 'SYMBOL' / 'PICTURE' .</pre> 1.30 ! cvs 1444: ! 1445: <p>The list of fixed-value attributes is composed of a sequence of 1.1 cvs 1446: attribute-value pairs separated by commas. Each pair contains the name of the 1447: attribute and the fixed value for this element type, the two being separated 1448: by an equals sign. If the sign is preceded by a question mark the given value 1449: is only an initial value that may be modified later rather than a value fixed 1450: for all time. Reference attributes are an exception to this norm. They 1451: cannot be assigned a fixed value, but when the name of such an attribute 1452: appears this indicates that this element type must have a valid value for the 1.2 cvs 1453: attribute. For the other attribute types, the fixed value is indicated by a 1.1 cvs 1454: signed integer (numeric attributes), a character string between apostrophes 1.18 cvs 1455: (textual attributes) or the name of a value (enumeration attributes).</p> 1.30 ! cvs 1456: ! 1457: <p>Fixed-value attributes can either be <a href="#sectc325">global</a> or ! 1458: local to the element type for which they are fixed, but they must be declared ! 1459: before they are used.</p> ! 1460: <pre> FixedAttrSeq = FixedAttr < ',' FixedAttr > . 1.1 cvs 1461: FixedAttr = AttrID [ FixedOrModifVal ] . 1462: FixedOrModifVal = [ '?' ] '=' FixedValue . 1463: FixedValue = [ '-' ] NumValue / TextVal / AttrVal . 1464: NumValue = NUMBER . 1.18 cvs 1465: TextVal = STRING .</pre> 1466: </div> 1.1 cvs 1467: 1.18 cvs 1468: <div class="subsection"> 1.30 ! cvs 1469: <h3><a name="sectc328">Structure definitions</a></h3> 1.1 cvs 1470: 1.30 ! cvs 1471: <p>The structure of an element type can be a simple base type or a constructed 1.18 cvs 1472: type.</p> 1.30 ! cvs 1473: ! 1474: <p>For constructed types, it is frequently the case that similar structures 1.1 cvs 1475: appear in many places in a document. For example the contents of the 1476: abstract, of the introduction, and of a section can have the same structure, 1477: that of a sequence of paragraphs. In this case, a single, common structure 1478: can be defined (the paragraph sequence in this example), and the schema is 1479: written to indicate that each element type possesses this structure, as 1.18 cvs 1480: follows:</p> 1481: <pre> Abstract = Paragraph_sequence; 1.1 cvs 1482: Introduction = Paragraph_sequence; 1.18 cvs 1483: Section_contents = Paragraph_sequence;</pre> 1.30 ! cvs 1484: ! 1485: <p>The equals sign means ``has the same structure as''.</p> ! 1486: ! 1487: <p>If the element type defined is a simple base type, this is indicated by one ! 1488: of the keywords <tt>TEXT</tt>, <tt>GRAPHICS</tt>, <tt>SYMBOL</tt>, or 1.18 cvs 1489: <tt>PICTURE</tt>. If some local attributes must be associated with a base 1.1 cvs 1490: type, the keyword of the base type is followed by the declaration of the local 1.18 cvs 1491: attributes using the syntax <a href="#sectc327">presented above.</a></p> 1.30 ! cvs 1492: ! 1493: <p>In the case of an open choice, the type is indicated by the keyword 1.18 cvs 1494: <tt>UNIT</tt> for units or the keyword <tt>NATURE</tt> for objects having a 1495: structure defined by any other schema.</p> 1.30 ! cvs 1496: ! 1497: <p>A unit represents one of the two following categories:</p> 1.18 cvs 1498: <ul> 1.30 ! cvs 1499: <li>a base type: text, graphical element, symbol, picture,</li> ! 1500: <li>an element whose type is chosen from among the types defined as units in ! 1501: the <tt>UNITS</tt> section of the document's structure schema. It can ! 1502: also be chosen from among the types defined as <a ! 1503: href="#sectd3132">units</a> in the <a href="#sectc3212"><tt>UNITS</tt> ! 1504: section</a> of the structure schemas that defines the ancestors of the ! 1505: element to which the rule is applied.</li> 1.18 cvs 1506: </ul> 1.30 ! cvs 1507: ! 1508: <p>Before the creation of an element defined as a unit, Thot asks the user to 1.18 cvs 1509: choose between the categories of elements.</p> 1.30 ! cvs 1510: ! 1511: <p>Thus, the contents of a paragraph can be specified as a sequence of units, 1.1 cvs 1512: which will permit the inclusion in the paragraphs of character strings, 1513: symbols, and various elements, such as cross-references, if these are defined 1.18 cvs 1514: as units.</p> 1.30 ! cvs 1515: ! 1516: <p>A schema object (keyword <tt>NATURE</tt>) represents an object defined by a 1.1 cvs 1517: structure schema freely chosen from among the available schemas; in the case 1518: the element type is defined by the first rule (the root rule) of the chosen 1.18 cvs 1519: schema.</p> 1.30 ! cvs 1520: ! 1521: <p>If the element type defined is a constructed type, the list, aggregate, 1.1 cvs 1522: choice, and reference constructors are used. In this case the definition 1523: begins with a keyword identifying the constructor. This keyword is followed 1.18 cvs 1524: by a syntax specific to each constructor.</p> 1.30 ! cvs 1525: ! 1526: <p>The local attribute definitions appear after the name of the element type 1.18 cvs 1527: being defined, if this element type has <a href="#sectc327">local 1528: attributes</a>.</p> 1529: <pre> Definition = BaseType [ LocAttrSeq ] / Constr / Element . 1.1 cvs 1530: BaseType = 'TEXT' / 'GRAPHICS' / 'SYMBOL' / 'PICTURE' / 1531: 'UNIT' / 'NATURE' . 1532: Element = ElemID [ ExtOrDef ] . 1533: ExtOrDef = 'EXTERN' / 'INCLUDED' / 1534: [ LocAttrSeq ] '=' Definition . 1535: Constr = 'LIST' [ '[' min '..' max ']' ] 'OF' 1536: '(' DefWithAttr ')' / 1537: 'BEGIN' DefOptSeq 'END' / 1538: 'AGGREGATE' DefOptSeq 'END' / 1539: 'CASE' 'OF' DefSeq 'END' / 1540: 'REFERENCE' '(' RefType ')' / 1.18 cvs 1541: 'PAIR' .</pre> 1.1 cvs 1542: 1.18 cvs 1543: <div class="subsubsection"> 1.30 ! cvs 1544: <h4><a name="sectd3281">List</a></h4> 1.1 cvs 1545: 1.30 ! cvs 1546: <p>The list constructor permits the definition of an element type composed of ! 1547: a list of elements, all of the same type. A list definition begins with the 1.18 cvs 1548: <tt>LIST</tt> keyword followed by an optional range, the keyword <tt>OF</tt>, 1.1 cvs 1549: and the definition, between parentheses, of the element type which must 1550: compose the list. The optional range is composed of the minimum and maximum 1551: number of elements for the list separated by two periods and enclosed by 1552: brackets. If the range is not present, the number of list elements is 1553: unconstrained. When only one of the two bounds of the range is unconstrained, 1554: it is represented by a star ('*') character. Even when both bounds are 1.18 cvs 1555: unconstrained, they can be specified by <tt>[*..*]</tt>, but it is simpler not 1556: to specify any bound.</p> 1557: <pre> 'LIST' [ '[' min '..' max ']' ] 1.1 cvs 1558: 'OF' '(' DefWithAttr ')' 1559: min = Integer / '*' . 1560: max = Integer / '*' . 1.18 cvs 1561: Integer = NUMBER .</pre> 1.30 ! cvs 1562: ! 1563: <p>Before the document is edited, Thot creates the minimum number of elements ! 1564: for the list. If no minimum was given, it creates a single element. If a ! 1565: maximum number of elements is given and that number is attained, the editor ! 1566: refuses to create new elements for the list.</p> ! 1567: ! 1568: <blockquote class="example"> ! 1569: <p><strong>Example:</strong></p> ! 1570: ! 1571: <p>The following two instructions define the body of a document as a ! 1572: sequence of at least two chapters and the contents of a section as a ! 1573: sequence of paragraphs. A single paragraph can be the entire contents of a ! 1574: section.</p> ! 1575: <pre>Body = LIST [2..*] OF (Chapter); 1.18 cvs 1576: Section_contents = LIST OF (Paragraph);</pre> 1577: </blockquote> 1578: </div> 1.1 cvs 1579: 1.18 cvs 1580: <div class="subsubsection"> 1.30 ! cvs 1581: <h4><a name="sectd3282">Aggregate</a></h4> 1.1 cvs 1582: 1.30 ! cvs 1583: <p>The aggregate constructor is used to define an element type as a collection ! 1584: of sub-elements, each having a fixed type. The collection may be ordered or 1.1 cvs 1585: unordered. The elements composing the collection are called 1.18 cvs 1586: <em>components</em>. In the definition of an aggregate, a keyword indicates 1587: whether or not the aggregate is ordered: <tt>BEGIN</tt> for an ordered 1588: aggregate, <tt>AGGREGATE</tt> for an unordered aggregate. This keyword is 1.1 cvs 1589: followed by the list of component type definitions which is terminated by the 1.18 cvs 1590: <tt>END</tt> keyword. The component type definitions are separated by 1591: commas.</p> 1.30 ! cvs 1592: ! 1593: <p>Before creating an aggregate, the Thot editor creates all the aggregate's 1.1 cvs 1594: components in the order they appear in the structure schema, even for 1595: unordered aggregates. However, unlike ordered aggregates, the components of 1596: an unordered aggregate may be rearranged using operations of the Thot editor. 1597: The exceptions to the rule are any components whose name was preceded by a 1598: question mark character ('?'). These components, which are optional, can be 1599: created by explicit request, possibly at the time the aggregate is created, 1.18 cvs 1600: but they are not created automatically <em>prior</em> to the creation of the 1601: aggregate.</p> 1602: <pre> 'BEGIN' DefOptSeq 'END' 1.30 ! cvs 1603: DefOptSeq = DefOpt ';' < DefOpt ';' > . 1.18 cvs 1604: DefOpt = [ '?' ] DefWithAttr .</pre> 1.30 ! cvs 1605: 1.18 cvs 1606: <blockquote class="example"> 1.30 ! cvs 1607: <p><strong>Example:</strong></p> ! 1608: ! 1609: <p>In a bilingual document, each paragraph has an English version and a ! 1610: French version. In certain cases, the translator wants to add a marginal ! 1611: note, but this note is present in very few paragraphs. Thus, it must not be ! 1612: created systematically for every paragraph. A bilingual paragraph of this ! 1613: type is declared:</p> ! 1614: <pre>Bilingual_paragraph = BEGIN 1.1 cvs 1615: French_paragraph = TEXT; 1616: English_paragraph = TEXT; 1617: ? Note = TEXT; 1.18 cvs 1618: END;</pre> 1619: </blockquote> 1620: </div> 1.1 cvs 1621: 1.18 cvs 1622: <div class="subsubsection"> 1.30 ! cvs 1623: <h4><a name="sectd3283">Choice</a></h4> 1.1 cvs 1624: 1.30 ! cvs 1625: <p>The choice constructor permits the definition of an element type which is 1.18 cvs 1626: chosen from among a set of possible types. The keywords <tt>CASE</tt> and 1627: <tt>OF</tt> are followed by a list of definitions of possible types, which are 1628: separated by semicolons and terminated by the <tt>END</tt> keyword.</p> 1629: <pre> 'CASE' 'OF' DefSeq 'END' 1.30 ! cvs 1630: DefSeq = DefWithAttr ';' < DefWithAttr ';' > .</pre> ! 1631: ! 1632: <p>Before the creation of an element defined as a choice, the Thot editor 1.1 cvs 1633: presents the list of possible types for the element to the user. The user has 1.18 cvs 1634: only to select the element type that s/he wants to create from this list.</p> 1.30 ! cvs 1635: ! 1636: <p>The order of the type declarations is important. It determines the order ! 1637: of the list presented to the user before the creation of the element. Also, ! 1638: when a Choice element is being created automatically, the first type in the ! 1639: list is used. In fact, using the Thot editor, when an empty Choice element is 1.1 cvs 1640: selected, it is possible to select this element and to enter its text from 1641: keyboard. In this case, the editor uses the first element type which can 1.18 cvs 1642: contain an atom of the character string type.</p> 1.30 ! cvs 1643: ! 1644: <p>The two special cases of the choice constructor, the <a 1.18 cvs 1645: href="#sectc328"><em>schema</em></a> and the <a 1646: href="#sectc3212"><em>unit</em></a> are discussed elsewhere.</p> 1.30 ! cvs 1647: 1.18 cvs 1648: <blockquote class="example"> 1.30 ! cvs 1649: <p><strong>Example:</strong></p> ! 1650: ! 1651: <p>It is common in documents to treat a variety of objects as if they were ! 1652: ordinary paragraphs. Thus, a ``Paragraph'' might actually be composed of a ! 1653: block of text (an ordinary paragraph), or a mathematical formula whose ! 1654: structure is defined by another structure schema named Math, or a table, ! 1655: also defined by another structure schema. Here is a definition of such a ! 1656: paragraph:</p> ! 1657: <pre>Paragraph = CASE OF 1.1 cvs 1658: Simple_text = TEXT; 1659: Formula = Math; 1660: Table_para = Table; 1.18 cvs 1661: END;</pre> 1662: </blockquote> 1663: </div> 1.1 cvs 1664: 1.18 cvs 1665: <div class="subsubsection"> 1.30 ! cvs 1666: <h4><a name="sectd3284">Reference</a></h4> 1.1 cvs 1667: 1.30 ! cvs 1668: <p>Like all elements in Thot, references are typed. An element type defined ! 1669: as a reference is a cross-reference to an element of some other given type. ! 1670: The keyword <tt>REFERENCE</tt> is followed by the name of a type enclosed in 1.1 cvs 1671: parentheses. When the type which is being cross-referenced is defined in 1672: another structure schema, the type name is itself followed by the name of the 1.18 cvs 1673: external structure schema in which it is defined.</p> 1.30 ! cvs 1674: ! 1675: <p>When the designated element type is a <a href="#sectd3285">mark pair</a>, ! 1676: it can be preceded by a <tt>FIRST</tt> or <tt>SECOND</tt> keyword. These 1.18 cvs 1677: keywords indicate whether the reference points to the first or second mark of 1678: the pair. If the reference points to a pair and neither of these two keywords 1679: is present, the reference is considered to point to the first mark of the 1680: pair.</p> 1.30 ! cvs 1681: ! 1682: <p>There is an exception to the principle of typed references: it is possible ! 1683: to define a reference which designates an element of any type, which can ! 1684: either be in the same document or another document. In this case, it suffices ! 1685: to put the keyword <tt>ANY</tt> in the parentheses which indicate the ! 1686: referenced element type.</p> 1.18 cvs 1687: <pre> 'REFERENCE' '(' RefType ')' 1688: RefType = 'ANY' / [ FirstSec ] ElemID [ ExtStruct ] .</pre> 1.30 ! cvs 1689: ! 1690: <p>When defining an inclusion, the <tt>REFERENCE</tt> keyword is not used. 1.1 cvs 1691: Inclusions with complete expansion are not declared as such in the structure 1692: schemas, since any element defined in a structure schema can be replaced by an 1693: element of the same type. Instead, inclusions without expansion or with 1694: partial expansion must be declared explicitly whenever they will include a 1695: complete object ( and not a part of an object). In this case, the object type 1696: to be included (that is, the name of its structure schema) is followed by a 1.18 cvs 1697: keyword: <tt>EXTERN</tt> for inclusion without expansion and <tt>INCLUDED</tt> 1698: for partial expansion.</p> 1.30 ! cvs 1699: ! 1700: <p>Before creating a cross-reference or an inclusion, the Thot editor asks the 1.1 cvs 1701: user to choose, from the document images displayed, the referenced or included 1.18 cvs 1702: element.</p> 1.30 ! cvs 1703: 1.18 cvs 1704: <blockquote class="example"> 1.30 ! cvs 1705: <p><strong>Example:</strong></p> ! 1706: ! 1707: <p>If the types Note and Section are defined in the Article structure ! 1708: schema, it is possible to define, in the same structure schema, a reference ! 1709: to a note and a reference to a section in this manner:</p> ! 1710: <pre>Ref_note = REFERENCE (Note); 1.18 cvs 1711: Ref_section = REFERENCE (Section);</pre> 1.30 ! cvs 1712: ! 1713: <p>It is also possible to define the generic structure of a collection of ! 1714: articles, which include (with partial expansion) objects of the Article ! 1715: class and which possess an introduction which may include cross-references ! 1716: to sections of the included articles. In the Collection structure schema, ! 1717: the definitions are:</p> ! 1718: <pre>Collection = BEGIN 1.6 cvs 1719: Collection_title = TEXT; 1720: Introduction = LIST OF (Elem = CASE OF 1.1 cvs 1721: TEXT; 1722: Ref_sect; 1723: END); 1.6 cvs 1724: Body = LIST OF (Article INCLUDED); 1725: END; 1.18 cvs 1726: Ref_sect = REFERENCE (Section (Article));</pre> 1.30 ! cvs 1727: ! 1728: <p>Here we define a Folder document class which has a title and includes ! 1729: documents of different types, particularly Folders:</p> ! 1730: <pre>Folder = BEGIN 1.6 cvs 1731: Folder_title = TEXT; 1732: Folder_contents = LIST OF (Document); 1733: END; 1.1 cvs 1734: 1735: Document = CASE OF 1736: Article EXTERN; 1737: Collection EXTERN; 1738: Folder EXTERN; 1.18 cvs 1739: END;</pre> 1.30 ! cvs 1740: ! 1741: <p>Under this definition, Folder represents either an aggregate which ! 1742: contains a folder title and the list of included documents or an included ! 1743: folder. To resolve this ambiguity, in the P language, the placement of a ! 1744: star character in front of the type name (here, Folder) indicates an ! 1745: included document.</p> 1.18 cvs 1746: </blockquote> 1747: </div> 1.1 cvs 1748: 1.18 cvs 1749: <div class="subsubsection"> 1.30 ! cvs 1750: <h4><a name="sectd3285">Mark pairs</a></h4> 1.1 cvs 1751: 1.30 ! cvs 1752: <p>Like other elements, mark pairs are typed. The two marks of the pair have ! 1753: the same type, but there exist two predefined subtypes which apply to all mark 1.18 cvs 1754: pairs: the first mark of the pair (called <tt>First</tt> in the P and T 1755: languages) and the second mark (called <tt>Second</tt>).</p> 1.30 ! cvs 1756: ! 1757: <p>In the S language, a mark pair is noted simply by the <tt>PAIR</tt> 1.18 cvs 1758: keyword.</p> 1.30 ! cvs 1759: ! 1760: <p>In the Thot editor, marks are always moved or destroyed together. The two 1.1 cvs 1761: marks of a pair have the same identifier, unique within the document, which 1.18 cvs 1762: permits intertwining mark pairs without risk of ambiguity.</p> 1763: </div> 1764: </div> 1.1 cvs 1765: 1.18 cvs 1766: <div class="subsection"> 1.30 ! cvs 1767: <h3><a name="sectc329">Imports</a></h3> 1.1 cvs 1768: 1.30 ! cvs 1769: <p>Because of schema constructors, it is possible, before editing a document, ! 1770: to use classes defined by other structure schemas whenever they are needed. It ! 1771: is also possible to assign specific document classes to certain element types. ! 1772: In this case, these classes are simply designated by their name. In fact, if ! 1773: a type name is not defined in the structure schema, it is assumed that it 1.18 cvs 1774: specifies a structure defined by another structure schema.</p> 1.30 ! cvs 1775: 1.18 cvs 1776: <blockquote class="example"> 1.30 ! cvs 1777: <p><strong>Example:</strong></p> ! 1778: ! 1779: <p>If the types Math and Table don't appear in the left part of a structure ! 1780: rule in the schema, the following two rules indicate that a formula has the ! 1781: structure of an object defined by the structure schema Math and that a table ! 1782: element has the structure of an object defined by the Table schema.</p> ! 1783: <pre>Formula = Math; 1.18 cvs 1784: Table_elem = Table;</pre> 1785: </blockquote> 1786: </div> 1787: 1788: <div class="subsection"> 1.30 ! cvs 1789: <h3><a name="sectc3210">Extension rules</a></h3> 1.18 cvs 1790: 1.30 ! cvs 1791: <p>The <tt>EXTENS</tt> section, which can only appear in an extension schema, 1.1 cvs 1792: defines complements to the rules in the primary schema (i.e. the structure 1793: schema to which the extension schema will be applied). More precisely, this 1794: section permits the addition to an existing type of local attributes, 1.18 cvs 1795: extensions, restrictions and fixed-value attributes.</p> 1.30 ! cvs 1796: ! 1797: <p>These additions can be applied to the root rule of the primary schema, 1.18 cvs 1798: designated by the keyword <tt>Root</tt>, or to any other explicitly named 1799: rule.</p> 1.30 ! cvs 1800: ! 1801: <p>Extension rules are separated from each other by a semicolon and each 1.18 cvs 1802: extension rule has the same syntax as a <a href="#sectc327">structure 1803: rule</a>, but the part which defines the constructor is absent.</p> 1.30 ! cvs 1804: <pre> ExtenRuleSeq = ExtensRule ';' < ExtensRule ';' > . 1.6 cvs 1805: ExtensRule = RootOrElem [ LocAttrSeq ] 1806: [ '+' '(' ExtensionSeq ')' ] 1807: [ '-' '(' RestrictSeq ')' ] 1808: [ 'WITH' FixedAttrSeq ] . 1.18 cvs 1809: RootOrElem = 'Root' / ElemID .</pre> 1810: </div> 1.1 cvs 1811: 1.18 cvs 1812: <div class="subsection"> 1.30 ! cvs 1813: <h3><a name="sectc3211">Associated elements</a></h3> 1.1 cvs 1814: 1.30 ! cvs 1815: <p>If associated elements are necessary, they must be declared in a specific 1.18 cvs 1816: section of the structure schema, introduced by the keyword <tt>ASSOC</tt>. 1.1 cvs 1817: Each associated element type is specified like any other structured element. 1818: However, these types must not appear in any other element types of the schema, 1.18 cvs 1819: except in <tt>REFERENCE</tt> rules.</p> 1820: </div> 1.1 cvs 1821: 1.18 cvs 1822: <div class="subsection"> 1.30 ! cvs 1823: <h3><a name="sectc3212">Units</a></h3> ! 1824: ! 1825: <p>The <tt>UNITS</tt> section of the structure schema contains the ! 1826: declarations of the element types which can be used in the external objects ! 1827: making up parts of the document or in objects of the class defined by the ! 1828: schema. As with associated elements, these element types are defined just ! 1829: like other structured element types. They can be used in the other element ! 1830: types of the schema, but they can also be used in any other rule of the ! 1831: schema.</p> ! 1832: ! 1833: <blockquote class="example"> ! 1834: <p><strong>Example:</strong></p> 1.1 cvs 1835: 1.30 ! cvs 1836: <p>If references to notes are declared as units:</p> ! 1837: <pre>UNITS 1.18 cvs 1838: Ref_note = REFERENCE (Note);</pre> 1.30 ! cvs 1839: ! 1840: <p>then it is possible to use references to notes in a cell of a table, even ! 1841: when <tt>Table</tt> is an external structure schema. The <tt>Table</tt> ! 1842: schema must declare a cell to be a sequence of units, which can then be base ! 1843: element types (text, for example) or references to notes in the ! 1844: document.</p> ! 1845: <pre>Cell = LIST OF (UNITS);</pre> 1.18 cvs 1846: </blockquote> 1847: </div> 1.1 cvs 1848: 1.18 cvs 1849: <div class="subsection"> 1.30 ! cvs 1850: <h3><a name="sectc3213">Skeleton elements</a></h3> 1.1 cvs 1851: 1.30 ! cvs 1852: <p>When editing a document which contains or must contain external references ! 1853: to several other documents, it may be necessary to load a large number of 1.1 cvs 1854: documents, simply to see the parts designated by the external references of 1855: the document while editing, or to access the source of included elements. In 1856: this case, the external documents are not modified and it is only necessary to 1857: see the elements of these documents which could be referenced. Because of 1858: this, the editor will suggest that the documents be loaded in ``skeleton'' 1859: form. This form contains only the elements of the document explicitly 1.18 cvs 1860: mentioned in the <tt>EXPORT</tt> section of their structure schema and, for 1.1 cvs 1861: these elements, only the part of the contents specified in that section. This 1862: form has the advantage of being very compact, thus requiring very few 1863: resources from the editor. This is also the skeleton form which constitutes 1.18 cvs 1864: the expanded form of <a href="#inclusion">inclusions</a> with partial 1865: expansion.</p> 1.30 ! cvs 1866: ! 1867: <p>Skeleton elements must be declared explicitly in the <tt>EXPORT</tt> ! 1868: section of the structure schema that defines them. This section begins with ! 1869: the keyword <tt>EXPORT</tt> followed by a comma-separated list of the element 1.1 cvs 1870: types which must appear in the skeleton form and ending with a semicolon. 1.18 cvs 1871: These types must have been previously declared in the schema.</p> 1.30 ! cvs 1872: ! 1873: <p>For each skeleton element type, the part of the contents which is loaded by 1.1 cvs 1874: the editor, and therefore displayable, can be specified by putting the keyword 1.18 cvs 1875: <tt>WITH</tt> and the name of the contained element type to be loaded after 1.1 cvs 1876: the name of the skeleton element type. In this case only that named element, 1877: among all the elements contained in the exportable element type, will be 1.18 cvs 1878: loaded. If the <tt>WITH</tt> is absent, the entire contents of the skeleton 1.1 cvs 1879: element will be loaded by the editor. If instead, it is better that the 1880: skeleton form not load the contents of a particular element type, the keyword 1.18 cvs 1881: <tt>WITH</tt> must be followed by the word <tt>Nothing</tt>.</p> 1882: <pre> [ 'EXPORT' SkeletonSeq ] 1.1 cvs 1883: 1.30 ! cvs 1884: SkeletonSeq = SkelElem < ',' SkelElem > ';' . 1.1 cvs 1885: SkelElem = ElemID [ 'WITH' Contents ] . 1.18 cvs 1886: Contents = 'Nothing' / ElemID [ ExtStruct ] .</pre> 1.30 ! cvs 1887: 1.18 cvs 1888: <blockquote class="example"> 1.30 ! cvs 1889: <p><strong>Example:</strong></p> ! 1890: ! 1891: <p>Suppose that, in documents of the article class, the element types ! 1892: Article_title, Figure, Section, Paragraph, and Biblio should appear in the ! 1893: skeleton form in order to make it easier to create external references to ! 1894: them from other documents. When loading an article in its skeleton form, ! 1895: all of these element types will be loaded except for paragraphs, but only ! 1896: the article title will be loaded in its entirety. For figures, the caption ! 1897: will be loaded, while for sections, the title will be loaded, and for ! 1898: bibliographic entries, only the title that they contain will be loaded. ! 1899: Note that bibliographic elements are defined in another structure schema, ! 1900: RefBib. To produce this result, the following declarations should be placed ! 1901: in the Article structure schema:</p> ! 1902: <pre>EXPORT 1.1 cvs 1903: Article_title, 1.5 cvs 1904: Figure With Caption, 1.1 cvs 1905: Section With Section_title, 1906: Paragraph With Nothing, 1.18 cvs 1907: Biblio With Biblio_title(RefBib);</pre> 1908: </blockquote> 1909: </div> 1.1 cvs 1910: 1.18 cvs 1911: <div class="subsection"> 1.30 ! cvs 1912: <h3><a name="sectc3214">Exceptions</a></h3> 1.1 cvs 1913: 1.30 ! cvs 1914: <p>The behavior of the Thot editor and the actions that it performs are 1.1 cvs 1915: determined by the structure schemas. These actions are applied to all 1916: document and object types in accordance with their generic structure. For 1917: certain object types, such as tables and graphics, these actions are not 1918: sufficient or are poorly adapted and some special actions must be added to or 1919: substituted for certain standard actions. These special actions are called 1.18 cvs 1920: <em>exceptions</em>.</p> 1.30 ! cvs 1921: ! 1922: <p>Exceptions only inhibit or modify certain standard actions, but they can be 1.18 cvs 1923: used freely in every structure schema.</p> 1.30 ! cvs 1924: ! 1925: <p>Each structure schema can contain a section defining exceptions. It begins 1.18 cvs 1926: with the keyword <tt>EXCEPT</tt> and is composed of a sequence of exception 1.1 cvs 1927: declarations, separated by semicolons. Each declaration of an exception 1928: begins with the name of an element type or attribute followed by a colon. This 1929: indicates the element type or attribute to which the following exceptions 1.18 cvs 1930: apply. When the given element type name is a <a href="#sectd3285">mark 1931: pair</a>, and only in this case, the type name can be preceded by the keyword 1932: <tt>First</tt> or <tt>Second</tt>, to indicate if the exceptions which follow 1.1 cvs 1933: are associated with the first mark of the pair or the second. In the absence 1.18 cvs 1934: of this keyword, the first mark is used.</p> 1.30 ! cvs 1935: ! 1936: <p>When placed in an <a href="#sectc322">extension schema</a>, the keyword 1.18 cvs 1937: <tt>EXTERN</tt> indicates that the type name which follows is found in the 1.1 cvs 1938: principal schema (the schema being extended by the extension schema). The 1.18 cvs 1939: exceptions are indicated by a name. They are separated by semicolons.</p> 1940: <pre> [ 'EXCEPT' ExceptSeq ] 1.1 cvs 1941: 1.30 ! cvs 1942: ExceptSeq = Except ';' < Except ';' > . 1.1 cvs 1943: Except = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr 1944: ':' ExcValSeq . 1945: ExcTypeOrAttr = ElemID / AttrID . 1.30 ! cvs 1946: ExcValSeq = ExcValue < ',' ExcValue > . 1.19 cvs 1947: ExcValue ='NoCut' / 'NoCreate' / 'NoHMove' / 1948: 'NoVMove' / 'NoHResize' / 'NoVResize' / 1949: 'NoMove' / 'NoResize' / 'MoveResize' / 1950: 'NewWidth' / 'NewHeight' / 'NewHPos' / 1951: 'NewVPos' / 'Invisible' / 1.28 cvs 1952: 'NoSelect' / 'NoSpellCheck' / 1.1 cvs 1953: 'Hidden' / 'ActiveRef' / 1954: 'ImportLine' / 'ImportParagraph' / 1955: 'NoPaginate' / 'ParagraphBreak' / 1.19 cvs 1956: 'PageBreak' / 'PageBreakAllowed' / 'PageBreakPlace' / 1957: 'PageBreakRepetition' / 'PageBreakRepBefore' / 1.9 cvs 1958: 'HighlightChildren' / 'ExtendedSelection' / 1.29 cvs 1959: 'ReturnCreateNL' / 'ReturnCreateWithin' / 1960: 'IsDraw' / 'IsTable' / 1.19 cvs 1961: 'IsRow' / 'IsColHead' / 'IsCell' / 1962: 'NewPercentWidth' / 'ColRef' / 'ColSpan' / 1963: 'RowSpan' / 'SaveDocument' / 'Shadow' .</pre> 1.30 ! cvs 1964: ! 1965: <p>The following are the available exceptions:</p> 1.18 cvs 1966: <dl> 1.30 ! cvs 1967: <dt><tt>NoCut</tt></dt> ! 1968: <dd>This exception can only be applied to element types. Elements of a ! 1969: type to which this exception is applied cannot be deleted by the ! 1970: editor.</dd> ! 1971: <dt><tt>NoCreate</tt></dt> ! 1972: <dd>This exception can only be applied to element types. Elements of a ! 1973: type to which this exception is applied cannot be created by ordinary ! 1974: commands for creating new elements. These elements are usually created ! 1975: by special actions associated with other exceptions.</dd> ! 1976: <dt><tt>NoHMove</tt></dt> ! 1977: <dd>This exception can only be applied to element types. Elements of a ! 1978: type to which this exception is applied cannot be moved horizontally ! 1979: with the mouse. Their children elements cannot be moved either.</dd> ! 1980: <dt><tt>NoVMove</tt></dt> ! 1981: <dd>This exception can only be applied to element types. Elements of a ! 1982: type to which this exception is applied cannot be moved vertically with ! 1983: the mouse. Their children elements cannot be moved either.</dd> ! 1984: <dt><tt>NoMove</tt></dt> ! 1985: <dd>This exception can only be applied to element types. Elements of a ! 1986: type to which this exception is applied cannot be moved in any direction ! 1987: with the mouse. Their children elements cannot be moved either.</dd> ! 1988: <dt><tt>NoHResize</tt></dt> ! 1989: <dd>This exception can only be applied to element types. Elements of a ! 1990: type to which this exception is applied cannot be resized horizontally ! 1991: with the mouse. Their children elements cannot be resized either.</dd> ! 1992: <dt><tt>NoVResize</tt></dt> ! 1993: <dd>This exception can only be applied to element types. Elements of a ! 1994: type to which this exception is applied cannot be resized vertically ! 1995: with the mouse. Their children elements cannot be resized either.</dd> ! 1996: <dt><tt>NoResize</tt></dt> ! 1997: <dd>This exception can only be applied to element types. Elements of a ! 1998: type to which this exception is applied cannot be resized in any ! 1999: direction with the mouse. Their children elements cannot be resized ! 2000: either.</dd> ! 2001: <dt><tt>MoveResize</tt></dt> ! 2002: <dd>This exception can only be applied to element types. Elements of a ! 2003: type to which this exception is applied can be moved and resized in any ! 2004: direction with the mouse, even if one of their ancestor element has an ! 2005: exception that prevents moving or resizing. Their children elements can ! 2006: also be resized or moved.</dd> ! 2007: <dt><tt>NewWidth</tt></dt> ! 2008: <dd>This exception can only be applied to numeric attributes. If the ! 2009: width of an element which has this attribute is modified with the mouse, ! 2010: the value of the new width will be assigned to the attribute.</dd> ! 2011: <dt><tt>NewHeight</tt></dt> ! 2012: <dd>This exception can only be applied to numeric attributes. If the ! 2013: height of an element which has this attribute is modified with the ! 2014: mouse, the value of the new height will be assigned to the ! 2015: attribute.</dd> ! 2016: <dt><tt>NewHPos</tt></dt> ! 2017: <dd>This exception can only be applied to numeric attributes. If the ! 2018: horizontal position of an element which has this attribute is modified ! 2019: with the mouse, the value of the new horizontal position will be ! 2020: assigned to the attribute.</dd> ! 2021: <dt><tt>NewVPos</tt></dt> ! 2022: <dd>This exception can only be applied to numeric attributes. If the ! 2023: vertical position of an element which has this attribute is modified ! 2024: with the mouse, the value of the new vertical position will be assigned ! 2025: to the attribute.</dd> ! 2026: <dt><tt>Invisible</tt></dt> ! 2027: <dd>This exception can only be applied to attributes, but can be applied ! 2028: to all attribute types. It indicates that the attribute must not be ! 2029: seen by the user and that its value must not be changed directly. This ! 2030: exception is usually used when another exception manipulates the value ! 2031: of an attribute.</dd> ! 2032: <dt><tt>NoSelect</tt></dt> ! 2033: <dd>This exception can only be applied to element types. Elements of a ! 2034: type to which this exception is applied cannot be selected directly ! 2035: with the mouse, but they can be selected by other methods provided by ! 2036: the editor.</dd> ! 2037: <dt>NoSpellCheck</dt> ! 2038: <dd>This exception can only be applied to element types. Elements of a ! 2039: type to which this exception is applied are not taken into account by ! 2040: the spell checker.</dd> ! 2041: <dt><tt>Hidden</tt></dt> ! 2042: <dd>This exception can only be applied to element types. It indicates ! 2043: that elements of this type, although present in the document's ! 2044: structure, must not be shown to the user of the editor. In particular, ! 2045: the creation menus must not propose this type and the selection message ! 2046: must not pick it.</dd> ! 2047: <dt><tt>ActiveRef</tt></dt> ! 2048: <dd>This exception can only be applied to attributes of the reference ! 2049: type. It indicates that when the user of the editor makes a double ! 2050: click on an element which possesses a reference attribute having this ! 2051: exception, the element designated by the reference attribute will be ! 2052: selected.</dd> ! 2053: <dt><tt>ImportLine</tt></dt> ! 2054: <dd>This exception can only be applied to element types. It indicates ! 2055: that elements of this type should receive the content of imported text ! 2056: files. An element is created for each line of the imported file. A ! 2057: structure schema cannot contain several exceptions <tt>ImportLine</tt> ! 2058: and, if it contains one, it should not contain any exception ! 2059: <tt>ImportParagraph</tt>.</dd> ! 2060: <dt><tt>ImportParagraph</tt></dt> ! 2061: <dd>This exception can only be applied to element types. It indicates ! 2062: that elements of this type should receive the content of imported text ! 2063: files. An element is created for each paragraph of the imported file. ! 2064: A paragraph is a sequence of lines without any empty line. A structure ! 2065: schema cannot contain several exceptions <tt>ImportParagraph</tt> and, ! 2066: if it contains one, it should not contain any exception ! 2067: <tt>ImportLine</tt>.</dd> ! 2068: <dt><tt>NoPaginate</tt></dt> ! 2069: <dd>This exception can only be applied to the root element, i.e. the name ! 2070: that appear after the keyword <tt>STRUCTURE</tt> at the beginning of the ! 2071: structure schema. It indicates that the editor should not allow the ! 2072: user to paginate documents of that type.</dd> ! 2073: <dt><tt>ParagraphBreak</tt></dt> ! 2074: <dd>This exception can only be applied to element types. When the caret ! 2075: is within an element of a type to which this exception is applied, it is ! 2076: that element that will be split when the user hits the Return key.</dd> ! 2077: <dt><tt>ReturnCreateNL</tt></dt> ! 2078: <dd>This exception can only be applied to element types. When the caret ! 2079: is within an element of a type to which this exception is applied, the ! 2080: Return key simply inserts a New line character (code \212) at the ! 2081: current position. The Return key does not create a new element; it does ! 2082: not split the current element either.</dd> ! 2083: <dt><tt>ReturnCreateWithin</tt></dt> ! 2084: <dd>This exception can only be applied to element types. When the caret ! 2085: is within an element of a type to which this exception is applied, the ! 2086: Return key will create a new element within that element, not a sibling ! 2087: after that element.</dd> ! 2088: <dt><tt>HighlightChildren</tt></dt> ! 2089: <dd>This exception can only be applied to element types. Elements of a ! 2090: type to which this exception is applied are not highlighted themselves ! 2091: when they are selected, but all their children are highlighted ! 2092: instead.</dd> ! 2093: <dt><tt>ExtendedSelection</tt></dt> ! 2094: <dd>This exception can only be applied to element types. The selection ! 2095: extension command (middle button of the mouse) only add the clicked ! 2096: element (if it has that exception) to the current selection, without ! 2097: selecting other elements between the current selection and the clicked ! 2098: element.</dd> ! 2099: <dt>IsDraw, IsTable, IsColHead, IsRow, IsCell</dt> ! 2100: <dd>These exceptions can only be applied to element types. Elements of a ! 2101: type to which these exceptions are applied are identified as Draws, ! 2102: Tables, Colheads, Rows or Cells and specific processing are applied to ! 2103: them.</dd> ! 2104: <dt>ColRef</dt> ! 2105: <dd>This exception can only be applied to attributes of the reference ! 2106: type. It indicates that this attribute refers to the column head (see ! 2107: exception IsColHead) which the element belongs to.</dd> ! 2108: <dt>ColSpan, RowSpan</dt> ! 2109: <dd>These exceptions can only be applied to numeric attributes of cells. ! 2110: They indicate that attribute values give how many columns or rows the ! 2111: element spans.</dd> ! 2112: <dt>Shadow</dt> ! 2113: <dd>This exception can only be applied to element types. Text of elements ! 2114: of a type to which this exception is applied are displayed and printed ! 2115: as a set of stars ('*').</dd> 1.18 cvs 2116: </dl> 1.30 ! cvs 2117: 1.18 cvs 2118: <blockquote class="example"> 1.30 ! cvs 2119: <p><strong>Example:</strong></p> ! 2120: ! 2121: <p>Consider a structure schema for object-style graphics which defines the ! 2122: Graphic_object element type with the associated Height and Weight numeric ! 2123: attributes. Suppose that we want documents of this class to have the ! 2124: following qualities:</p> ! 2125: <ul> ! 2126: <li>Whenever the width or height of an object is changed using the mouse, ! 2127: the new values are stored in the object's Width and Height ! 2128: attributes.</li> ! 2129: <li>The user should not be able to change the values of the Width and ! 2130: Height attributes via the Attributes menu of the Thot editor.</li> ! 2131: </ul> ! 2132: ! 2133: <p>The following exceptions will produce this effect.</p> ! 2134: <pre>STRUCT 1.1 cvs 2135: ... 1.5 cvs 2136: Graphics_object (ATTR Height = Integer; Width = Integer) 1.1 cvs 2137: = GRAPHICS with Height ?= 10, Width ?= 10; 2138: ... 2139: EXCEPT 2140: Height: NewHeight, Invisible; 1.18 cvs 2141: Width: NewWidth, Invisible;</pre> 2142: </blockquote> 2143: </div> 2144: </div> 1.1 cvs 2145: 1.18 cvs 2146: <div class="section"> 1.30 ! cvs 2147: <h2><a name="sectb33">Some examples</a></h2> 1.1 cvs 2148: 1.30 ! cvs 2149: <p>In order to illustrate the principles of the document model and the syntax ! 2150: of the S language, this section presents two examples of structure schemas. ! 2151: One defines a class of documents, the other defines a class of objects.</p> 1.1 cvs 2152: 1.18 cvs 2153: <div class="subsection"> 1.30 ! cvs 2154: <h3><a name="sectc331">A class of documents: articles</a></h3> 1.1 cvs 2155: 1.30 ! cvs 2156: <p>This example shows a possible structure for articles published in a ! 2157: journal. Text between braces is comments.</p> 1.18 cvs 2158: <pre>STRUCTURE Article; { This schema defines the Article class } 1.1 cvs 2159: DEFPRES ArticleP; { The default presentation schema is 2160: ArticleP } 2161: ATTR { Global attribute definitions } 2162: WordType = Definition, IndexWord, DocumentTitle; 2163: { A single global attribute is defined, with three values } 2164: STRUCT { Definition of the generic structure } 2165: Article = BEGIN { The Article class has an aggregate 2166: structure } 2167: Title = BEGIN { The title is an aggregate } 2168: French_title = 2169: Text WITH Language='Fran\347ais'; 2170: English_title = 2171: Text WITH Language='English'; 2172: END; 2173: Authors = 2174: LIST OF (Author 2175: (ATTR Author_type=principal,secondary) 2176: { The Author type has a local attribute } 2177: = BEGIN 2178: Author_name = Text; 2179: Info = Paragraphs ; 2180: { Paragraphs is defined later } 2181: Address = Text; 2182: END 2183: ); 2184: Keywords = Text; 2185: { The journal's editor introduces the article 2186: with a short introduction, in French and 2187: in English } 2188: Introduction = 2189: BEGIN 2190: French_intr = Paragraphs WITH 2191: Language='Fran\347ais'; 2192: English_intr = Paragraphs WITH 2193: Language='English'; 2194: END; 2195: Body = Sections; { Sections are defined later } 2196: { Appendixes are only created on demand } 2197: ? Appendices = 2198: LIST OF (Appendix = 2199: BEGIN 2200: Appendix_Title = Text; 2201: Appendix_Contents = Paragraphs; 2202: END 2203: ); 2204: END; { End of the Article aggregate } 2205: 2206: Sections = LIST [2..*] OF ( 2207: Section = { At least 2 sections } 2208: BEGIN 2209: Section_title = Text; 2210: Section_contents = 2211: BEGIN 2212: Paragraphs; 2213: Sections; { Sections at a lower level } 2214: END; 2215: END 2216: ); 2217: 2218: Paragraphs = LIST OF (Paragraph = CASE OF 2219: Enumeration = 2220: LIST [2..*] OF 2221: (Item = Paragraphs); 2222: Isolated_formula = Formula; 2223: LIST OF (UNIT); 2224: END 2225: ); 2226: 2227: ASSOC { Associated elements definitions } 2228: 2229: Figure = BEGIN 1.5 cvs 2230: Figure_caption = Text; 1.1 cvs 2231: Illustration = NATURE; 2232: END; 2233: 2234: Biblio_citation = CASE OF 2235: Ref_Article = 2236: BEGIN 2237: Authors_Bib = Text; 2238: Article_Title = Text; 2239: Journal = Text; 2240: Page_Numbers = Text; 2241: Date = Text; 2242: END; 2243: Ref_Livre = 2244: BEGIN 2245: Authors_Bib; { Defined above } 2246: Book_Title = Text; 2247: Editor = Text; 2248: Date; { Defined above } 2249: END; 2250: END; 2251: 2252: Note = Paragraphs - (Ref_note); 2253: 2254: UNITS { Elements which can be used in objects } 2255: 2256: Ref_note = REFERENCE (Note); 2257: Ref_biblio = REFERENCE (Biblio_citation); 2258: Ref_figure = REFERENCE (Figure); 2259: Ref_formula = REFERENCE (Isolated_formula); 2260: 2261: EXPORT { Skeleton elements } 2262: 2263: Title, 1.5 cvs 2264: Figure with Figure_caption, 1.1 cvs 2265: Section With Section_title; 2266: 1.18 cvs 2267: END { End of the structure schema }</pre> 1.30 ! cvs 2268: ! 2269: <p>This schema is very complete since it defines both paragraphs and 1.1 cvs 2270: bibliographic citations. These element types could just as well be defined in 1.18 cvs 2271: other structure schemas, as is the case with the <tt>Formula</tt> class. All 1.1 cvs 2272: sorts of other elements can be inserted into an article, since a paragraph can 2273: contain any type of unit. Similarly, figures can be any class of document or 1.18 cvs 2274: object that the user chooses.</p> 1.30 ! cvs 2275: ! 2276: <p>Generally, an article doesn't contain appendices, but it is possible to add 1.1 cvs 2277: them on explicit request: this is the effect of the question mark before the 1.18 cvs 2278: word Appendices.</p> 1.30 ! cvs 2279: ! 2280: <p>The Figure, Biblio_citation and Note elements are associated elements. ! 2281: Thus, they are only used in <tt>REFERENCE</tt> statements.</p> ! 2282: ! 2283: <p>Various types of cross-references can be put in paragraphs. They can also ! 2284: be placed the objects which are part of the article, since the ! 2285: cross-references are defined as units (<tt>UNITS</tt>).</p> ! 2286: ! 2287: <p>There is a single restriction to prevent the creation of Ref_note elements 1.18 cvs 2288: within notes.</p> 1.30 ! cvs 2289: ! 2290: <p>It is worth noting that the S language permits the definition of recursive 1.1 cvs 2291: structures like sections: a section can contain other sections (which are thus 2292: at the next lower level of the document tree). Paragraphs are also recursive 2293: elements, since a paragraph can contain an enumeration in which each element 1.18 cvs 2294: (<tt>Item</tt>) is composed of paragraphs.</p> 2295: </div> 1.1 cvs 2296: 1.18 cvs 2297: <div class="subsection"> 1.30 ! cvs 2298: <h3><a name="sectc332">A class of objects: mathematical formulas</a></h3> 1.1 cvs 2299: 1.30 ! cvs 2300: <p>The example below defines the <tt>Formula</tt> class which is used in ! 2301: Article documents. This class represents mathematical formulas with a rather ! 2302: simple structure, but sufficient to produce a correct rendition on the screen ! 2303: or printer. To support more elaborate operations (formal or numeric 1.1 cvs 2304: calculations), a finer structure should be defined. This class doesn't use any 1.18 cvs 2305: other class and doesn't define any associated elements or units.</p> 2306: <pre>STRUCTURE Formula; 1.1 cvs 2307: DEFPRES FormulaP; 2308: 2309: ATTR 2310: String_type = Function_name, Variable_name; 2311: 2312: STRUCT 2313: Formula = Expression; 2314: Expression = LIST OF (Construction); 2315: Construction = CASE OF 2316: TEXT; { Simple character string } 2317: Index = Expression; 2318: Exponent = Expression; 2319: Fraction = 2320: BEGIN 1.6 cvs 2321: Numerator = Expression; 1.1 cvs 2322: Denominator = Expression; 2323: END; 2324: Root = 2325: BEGIN 2326: ? Order = TEXT; 2327: Root_Contents = Expression; 2328: END; 2329: Integral = 2330: BEGIN 2331: Integration_Symbol = SYMBOL; 2332: Lower_Bound = Expression; 2333: Upper_Bound = Expression; 2334: END; 2335: Triple = 2336: BEGIN 2337: Princ_Expression = Expression; 2338: Lower_Expression = Expression; 2339: Upper_Expression = Expression; 2340: END; 2341: Column = LIST [2..*] OF 2342: (Element = Expression); 2343: Parentheses_Block = 2344: BEGIN 2345: Opening = SYMBOL; 2346: Contents = Expression; 2347: Closing = SYMBOL; 2348: END; 2349: END; { End of Choice Constructor } 1.18 cvs 2350: END { End of Structure Schema }</pre> 1.30 ! cvs 2351: ! 2352: <p>This schema defines a single global attribute which allows functions and 1.1 cvs 2353: variables to be distinguished. In the presentation schema, this attribute can 2354: be used to choose between roman (for functions) and italic characters (for 1.18 cvs 2355: variables).</p> 1.30 ! cvs 2356: ! 2357: <p>A formula's structure is that of a mathematical expression, which is itself ! 2358: a sequence of mathematical constructions. A mathematical construction can be 1.1 cvs 2359: either a simple character string, an index, an exponent, a fraction, a root, 2360: etc. Each of these mathematical constructions has a sensible structure which 2361: generally includes one or more expressions, thus making the formula class's 1.18 cvs 2362: structure definition recursive.</p> 1.30 ! cvs 2363: ! 2364: <p>In most cases, the roots which appear in the formulas are square roots and 1.1 cvs 2365: their order (2) is not specified. This is why the Order component is marked 2366: optional by a question mark. When explicitly requested, it is possible to add 1.18 cvs 2367: an order to a root, for example for cube roots (order = 3).</p> 1.30 ! cvs 2368: ! 2369: <p>An integral is formed by an integration symbol, chosen by the user (simple 1.1 cvs 2370: integral, double, curvilinear, etc.), and two bounds. A more fine-grained 2371: schema would add components for the integrand and the integration variable. 2372: Similarly, the Block_Parentheses construction leaves the choice of opening and 2373: closing symbols to the user. They can be brackets, braces, parentheses, 1.18 cvs 2374: etc.</p> 2375: </div> 2376: </div> 2377: <hr> 2378: </div> 1.1 cvs 2379: 1.18 cvs 2380: <div class="chapter"> 2381: <h1><a name="sect4">The P Language</a></h1> 1.1 cvs 2382: 1.18 cvs 2383: <div class="section"> 1.30 ! cvs 2384: <h2><a name="sectb41">Document presentation</a></h2> 1.1 cvs 2385: 1.30 ! cvs 2386: <p>Because of the model adopted for Thot, the presentation of documents is 1.1 cvs 2387: clearly separated from their structure and content. After having presented 2388: the logical structure of documents, we now detail the principles implemented 1.18 cvs 2389: for their presentation. The concept of <em>presentation</em> encompasses what 1.5 cvs 2390: is often called the page layout, the composition, or the document style. It 1.18 cvs 2391: is the set of operations which display the document on the screen or print it 2392: on paper. Like logical structure, document presentation is defined 2393: generically with the help of a language, called P.</p> 1.1 cvs 2394: 1.18 cvs 2395: <div class="subsection"> 1.30 ! cvs 2396: <h3><a name="sectc411">Two levels of presentation</a></h3> 1.1 cvs 2397: 1.30 ! cvs 2398: <p>The link between structure and presentation is clear: the logical ! 2399: organization of a document is used to carry out its presentation, since the ! 2400: purpose of the presentation is to make evident the organization of the ! 2401: document. But the presentation is equally dependent on the device used to ! 2402: render the document. Certain presentation effects, notably changes of font or ! 2403: character set, cannot be performed on all printers or on all screens. This is ! 2404: why Thot uses a two-level approach, where the presentation is first described ! 2405: in abstract terms, without taking into account each particular device, and ! 2406: then the presentation is realized within the constraints of a given ! 2407: device.</p> ! 2408: ! 2409: <p>Thus, presentation is only described as a function of the structure of the 1.1 cvs 2410: documents and the image that would be produced on an idealized device. For 2411: this reason, presentation descriptions do not refer to any device 1.18 cvs 2412: characteristics: they describe <em>abstract presentations</em> which can be 2413: concretized on different devices.</p> 1.30 ! cvs 2414: ! 2415: <p>A presentation description also defines a <em>generic presentation</em>, ! 2416: since it describes the appearance of a class of documents or objects. This ! 2417: generic presentation must also be applied to document and object instances, ! 2418: each conforming to its generic logical structure, but with all the allowances ! 2419: that were called to mind above: missing elements, constructed elements with ! 2420: other logical structures, etc.</p> ! 2421: ! 2422: <p>In order to preserve the homogeneity between documents and objects, 1.1 cvs 2423: presentation is described with a single set of tools which support the layout 2424: of a large document as well as the composition of objects like a graphical 2425: figure or mathematical formula. This unity of presentation description tools 2426: contrasts with the traditional approach, which focuses more on documents than 2427: objects and thus is based on the usual typographic conventions, such as the 2428: placement of margins, indentations, vertical spaces, line lengths, 1.18 cvs 2429: justification, font changes, etc.</p> 2430: </div> 1.1 cvs 2431: 1.18 cvs 2432: <div class="subsection"> 1.30 ! cvs 2433: <h3><a name="sectc412">Boxes</a></h3> 1.1 cvs 2434: 1.30 ! cvs 2435: <p>To assure the homogeneity of tools, all presentation in Thot, for documents ! 2436: as well as for the objects which they contain, is based on the notion of the 1.18 cvs 2437: <em>box</em>, such as was implemented in T<sub><big>E</big></sub>X.</p> 1.30 ! cvs 2438: ! 2439: <p>Corresponding to each element of the document is a box, which is the 1.1 cvs 2440: rectangle enclosing the element on the display device (screen or sheet of 1.18 cvs 2441: paper); the outline of this rectangle is not visible, except when a <a 2442: href="#sectc4230a"><tt>ShowBox</tt> rule</a> applies to the element. The sides 2443: of the box are parallel to the sides of the screen or the sheet of paper. By 2444: way of example, a box is associated with a character string, a line of text, a 2445: page, a paragraph, a title, a mathematical formula, or a table cell.</p> 1.30 ! cvs 2446: ! 2447: <p>Whatever element it corresponds to, each box possesses four sides and four 1.18 cvs 2448: axes, which we designate as follows (<a href="#boxes">see figure</a>):</p> 2449: <dl> 1.30 ! cvs 2450: <dt><tt>Top</tt></dt> ! 2451: <dd>the upper side,</dd> ! 2452: <dt><tt>Bottom</tt></dt> ! 2453: <dd>the lower side,</dd> ! 2454: <dt><tt>Left</tt></dt> ! 2455: <dd>the left side,</dd> ! 2456: <dt><tt>Right</tt></dt> ! 2457: <dd>the right side,</dd> ! 2458: <dt><tt>VMiddle</tt></dt> ! 2459: <dd>the vertical axis passing through the center of the box,</dd> ! 2460: <dt><tt>HMiddle</tt></dt> ! 2461: <dd>the horizontal axis passing through the center of the box,</dd> ! 2462: <dt><tt>VRef</tt></dt> ! 2463: <dd>the vertical reference axis,</dd> ! 2464: <dt><tt>HRef</tt></dt> ! 2465: <dd>the horizontal reference axis.</dd> 1.18 cvs 2466: </dl> 2467: 2468: <div class="figure"> 2469: <hr> 2470: <pre> Left VRef VMiddle Right 1.1 cvs 2471: : : 2472: Top ----------------------------- 2473: | : : | 2474: | : : | 2475: | : : | 2476: | : : | 2477: | : : | 2478: HMiddle ..|...........................|.. 2479: | : : | 2480: | : : | 2481: HRef ..|...........................|.. 2482: | : : | 2483: | : : | 2484: Bottom ----------------------------- 1.18 cvs 2485: : :</pre> 1.30 ! cvs 2486: ! 2487: <p align="center"><em><a name="boxes">The sides and axes of ! 2488: boxes</a><em></em></em></p> 1.18 cvs 2489: <hr> 1.30 ! cvs 2490: </div> 1.19 cvs 2491: 1.30 ! cvs 2492: <p>The principal role of boxes is to set the extent and position of the images ! 2493: of the different elements of a document with respect to each other on the 1.1 cvs 2494: reproduction device. This is done by defining relations between the boxes of 2495: different elements which give relative extents and positions to these 1.18 cvs 2496: boxes.</p> 1.30 ! cvs 2497: ! 2498: <p>There are three types of boxes:</p> 1.18 cvs 2499: <ul> 1.30 ! cvs 2500: <li>boxes corresponding to structural elements of the document,</li> ! 2501: <li>presentation boxes,</li> ! 2502: <li>page layout boxes.</li> 1.18 cvs 2503: </ul> 1.30 ! cvs 2504: ! 2505: <p><strong>Boxes corresponding to structural elements of the document</strong> 1.1 cvs 2506: are those which linked to each of the elements (base or structured) of the 2507: logical structure of the document. Such a box contains all the contents of 1.18 cvs 2508: the element to which it corresponds (there is an exception: see <a 2509: href="#sectc4220">rules <tt>VertOverflow</tt> and <tt>HorizOverflow</tt></a>). 2510: These boxes form a tree-like structure, identical to that of the structural 2511: elements to which they correspond. This tree expresses the inclusion 2512: relationships between the boxes: a box includes all the boxes of its subtree. 2513: On the other hand, there are no predefined rules for the relative positions of 2514: the included boxes. If they are at the same level, they can overlap, be 2515: contiguous, or be disjoint. The rules expressed in the generic presentation 2516: specify their relative positions.</p> 1.30 ! cvs 2517: ! 2518: <p><strong>Presentation boxes</strong> represent elements which are not found ! 2519: in the logical structure of the document but which are added to meet the needs ! 2520: of presentation. These boxes are linked to the elements of the logical ! 2521: structure that are best suited to bringing them out. For example, they are ! 2522: used to add the character string ``Summary:'' before the summary in the ! 2523: presentation of a report or to represent the fraction bar in a formula, or ! 2524: also to make the title of a field in a form appear. These elements have no ! 2525: role in the logical structure of the document: the presence of a Summary ! 2526: element in the document does not require the creation of another structural ! 2527: object to hold the word ``Summary''. Similarly, if a Fraction element contains ! 2528: both a Numerator element and a Denominator element, the fraction bar has no ! 2529: purpose structurally. On the other hand, these elements of the presentation ! 2530: are important for the reader of the reproduced document or for the user of an 1.1 cvs 2531: editor. This is why they must appear in the document's image. It is the 2532: generic presentation which specifies the presentation boxes to add by 2533: indicating their content (a base element for which the value is specified) and 2534: the position that they must take in the tree of boxes. During editing, these 1.18 cvs 2535: boxes cannot be modified by the user.</p> 1.30 ! cvs 2536: ! 2537: <p><strong>Page layout boxes</strong> are boxes created implicitly by the page 1.1 cvs 2538: layout rules. These rules indicate how the contents of a structured element 2539: must be broken into lines and pages. In contrast to presentation boxes, these 2540: line and page boxes do not depend on the logical structure of the document, 1.18 cvs 2541: but rather on the physical constraints of the output devices: character size, 2542: height and width of the window on the screen or of the sheet of paper.</p> 2543: </div> 1.1 cvs 2544: 1.18 cvs 2545: <div class="subsection"> 1.30 ! cvs 2546: <h3><a name="sectc413">Views and visibility</a></h3> 1.1 cvs 2547: 1.30 ! cvs 2548: <p>One of the operations that one might wish to perform on a document is to ! 2549: view it is different ways. For this reason, it is possible to define several 1.18 cvs 2550: <em>views</em> for the same document, or better yet, for all documents of the 1.1 cvs 2551: same class. A view is not a different presentation of the document, but 2552: rather a filter which only allows the display of certain parts of the 2553: document. For example, it might be desirable to see only the titles of 2554: chapters and sections in order to be able to move rapidly through the 2555: document. Such a view could be called a ``table of contents''. It might also 2556: be desirable to see only the mathematical formulas of a document in order to 2557: avoid being distracted by the non-mathematical aspects of the document. A 1.18 cvs 2558: ``mathematics'' view could provide this service.</p> 1.30 ! cvs 2559: ! 2560: <p>Views, like presentation, are based on the generic logical structure. Each 1.1 cvs 2561: document class, and each generic presentation, can be provided with views 2562: which are particularly useful for that class or presentation. For each view, 1.18 cvs 2563: the <em>visibility</em> of elements is defined, indicated whether or not the 1.1 cvs 2564: elements must be presented to the user. The visibility is calculated as a 2565: function of the type of the elements or their hierarchical position in the 2566: structure of the document. Thus, for a table of contents, all the ``Chapter 2567: Title'' and ``Section Title'' elements are made visible. However, the 2568: hierarchical level could be used to make the section titles invisible below a 2569: certain threshold level. By varying this threshold, the granularity of the 2570: view can be varied. In the ``mathematics'' view, only Formula elements would 1.18 cvs 2571: be made visible, no matter what their hierarchical level.</p> 1.30 ! cvs 2572: ! 2573: <p>Because views are especially useful for producing a synthetic image of the 1.1 cvs 2574: document, it is necessary to adapt the presentation of the elements to the 2575: view in which they appear. For example, it is inappropriate to have a page 2576: break before every chapter title in the table of contents. Thus, generic 2577: presentations take into account the possible views and permit each element 1.18 cvs 2578: type's presentation to vary according the view in which its image appears.</p> 1.30 ! cvs 2579: ! 2580: <p><a name="views">Views</a> are also used, when editing documents, to display 1.1 cvs 2581: the associated elements. So, in addition to the primary view of the document, 2582: there can be a ``notes'' view and a ``figures'' view which contain, 2583: respectively, the associated elements of the Note and Figure types. In this 2584: way, it is possible to see simultaneously the text which refers to these 2585: elements and the elements themselves, even if they will be separated when 1.18 cvs 2586: printed.</p> 2587: </div> 1.1 cvs 2588: 1.18 cvs 2589: <div class="subsection"> 1.30 ! cvs 2590: <h3><a name="sectc414">Pages</a></h3> 1.1 cvs 2591: 1.30 ! cvs 2592: <p>Presentation schemas can be defined which display the document as a long 1.1 cvs 2593: scroll, without page breaks. This type of schema is particularly well-suited 2594: to the initial phase of work on a document, where jumps from page to page 2595: would hinder composing and reading the document on a screen. In this case, 2596: the associated elements (such as notes), which are normally displayed in the 2597: page footer, are presented in a separate window. But, once the document is 2598: written, it may be desirable to display the document on the screen in the same 2599: manner in which it will be printed. So, the presentation schema must define 1.18 cvs 2600: pages.</p> 1.30 ! cvs 2601: ! 2602: <p>The P language permits the specification of the dimensions of pages as well ! 2603: as their composition. It is possible to generate running titles, page ! 2604: numbers, zones at the bottom of the page for notes, etc. The editor follows ! 2605: this model and inserts page break marks in the document which are used during ! 2606: printing, insuring that the pages on paper are the same as on the screen.</p> ! 2607: ! 2608: <p>Once a document has been edited with a presentation schema defining pages, ! 2609: it contains page marks. But it is always possible to edit the document using ! 2610: a schema without pages. In this case, the page marks are simply ignored by ! 2611: the editor. They are considered again as soon as a schema with pages is used. 1.18 cvs 2612: Thus, the user is free to choose between schemas with and without pages.</p> 1.30 ! cvs 2613: ! 2614: <p>Thot treats the page break, rather than the page itself, as a box. This ! 2615: page break box contains all the elements of one page's footer, a rule marking ! 2616: the edge of this page, and all the elements of the next page's header. The 1.1 cvs 2617: elements of the header and footer can be running titles, page number, 2618: associated elements (notes, for example), etc. All these elements, as well as 2619: their content and graphical appearance, are defined by the generic 1.18 cvs 2620: presentation.</p> 2621: </div> 1.1 cvs 2622: 1.18 cvs 2623: <div class="subsection"> 1.30 ! cvs 2624: <h3><a name="sectc415">Numbering</a></h3> 1.1 cvs 2625: 1.30 ! cvs 2626: <p>Many elements are numbered in documents: pages, chapters, sections, ! 2627: formulas, theorems, notes, figures, bibliographic references, exercises, ! 2628: examples, lemmas, etc. Because Thot has a notion of logical structure, all of ! 2629: these numbers (with the exception of pages) are redundant with information ! 2630: implicit in the logical structure of the document. Such numbers are simply a ! 2631: way to make the structure of the document more visible. So, they are part of ! 2632: the document's presentation and are calculated by the editor from the logical 1.1 cvs 2633: structure. The structure does not contain numbers as such; it only defines 2634: relative structural positions between elements, which serve as ordering 1.18 cvs 2635: relations on these elements.</p> 1.30 ! cvs 2636: ! 2637: <p>If the structure schema defines the body of a document as a sequence of at 1.18 cvs 2638: least two chapters:</p> 2639: <pre>Body = LIST [2..*] OF Chapter;</pre> 1.30 ! cvs 2640: ! 2641: <p>the sequence defined by the list constructor is ordered and each chapter ! 2642: can be assigned a number based on its rank in the Body list. Therefore, all 1.18 cvs 2643: elements contained in lists a the structure of a document can be numbered, but 2644: they are not the only ones. The tree structure induced by the aggregate, 2645: list, and choice constructors (excluding references) defines a total order on 2646: the elements of the document's primary structure. So, it is possible to 2647: define a numbering which uses this order, filtering elements according to 2648: their type so that only certain element types are taken into account in the 2649: numbering. In this way, it possible to number all the theorems and lemmas of 2650: a chapter in the same sequence of numbers, even when they are not part of the 2651: same list constructor and appear at different levels of the document's tree. 2652: By changing the filter, they can be numbered separately: one sequence of 2653: numbers for theorems, another for the lemmas.</p> 1.30 ! cvs 2654: ! 2655: <p>Associated elements pose a special problem, since they are not part of the 1.1 cvs 2656: document's primary structure, but are attached only by references, which 2657: violate the total order of the document. Then, these associated elements are 2658: frequently numbered, precisely because the number is an effective way to 2659: visualize the reference. In order to resolve this problem, Thot implicitly 2660: defines a list constructor for each type of associated element, gathering 2661: together (and ordering) these elements. Thus, the associated elements can be 1.18 cvs 2662: numbered by type.</p> 1.30 ! cvs 2663: ! 2664: <p>Since they are calculated from the document's logical structure and only ! 2665: for the needs of the presentation, numbers are presentation elements, ! 2666: described by presentation boxes, just like the fraction bar or the word ! 2667: ``Summary''. Nevertheless, numbers differ from these other boxes because their ! 2668: content varies from instance to instance, even though they are of the same ! 2669: type, whereas all fraction bars are horizontal lines and the same word ! 2670: ``Summary'' appears at the head of every document's summary.</p> 1.18 cvs 2671: </div> 1.1 cvs 2672: 1.18 cvs 2673: <div class="subsection"> 1.30 ! cvs 2674: <h3><a name="sectc416">Presentation parameters</a></h3> 1.1 cvs 2675: 1.30 ! cvs 2676: <p>The principal parameters which determine document presentation are the 1.18 cvs 2677: <em>positions</em> and <em>dimensions</em> of boxes, the <em>font</em>, the 2678: <em>style</em>, the <em>size</em>, the <em>underlining</em> and the 2679: <em>color</em> of their content. From these parameters, and some others of 1.1 cvs 2680: less importance, it is possible to represent the usual typographic parameters 2681: for the textual parts of the document. These same parameters can be used to 2682: describe the geometry of the non-textual elements, even though they are 1.18 cvs 2683: two-dimensional elements unlike the text, which is linear.</p> 1.30 ! cvs 2684: ! 2685: <p>As we have already seen, the positions of the boxes always respect the ! 2686: rule of enclosure: a box in the tree encloses all the boxes of the next lower ! 2687: level which are attached to it. The positional parameters permit the ! 2688: specification of the position of each box in relation to the enclosing box or ! 2689: to its sibling boxes (boxes directly attached to the same enclosing box in the ! 2690: tree of boxes).</p> ! 2691: ! 2692: <p>The presentation parameters also provide control over the dimensions of the 1.1 cvs 2693: boxes. The dimensions of a box can depend either on its content or on its 2694: context (its sibling boxes and the enclosing box). Each dimension (height or 1.18 cvs 2695: width) can be defined independently of the other.</p> 1.30 ! cvs 2696: ! 2697: <p>Because of the position and dimension parameters, it is possible to do the 1.1 cvs 2698: same things that are normally done in typography by changing margins, line 2699: lengths, and vertical or horizontal skips. This approach can also align or 1.18 cvs 2700: center elements and groups of elements.</p> 1.30 ! cvs 2701: ! 2702: <p>In contrast to the position and dimension parameters, the font, style, ! 2703: size, underlining, and color do not concern the box itself (the rectangle ! 2704: delimiting the element), but its content. These parameters indicate the ! 2705: typographic attributes which must be applied to the text contained in the box, ! 2706: and by extension, to all base elements.</p> ! 2707: ! 2708: <p>For text, the font parameter is used to change the family of characters 1.1 cvs 2709: (Times, Helvetica, Courier, etc.); the style is used to obtain italic or 2710: roman, bold or light characters; the size determines the point size of the 2711: characters; underlining defines the type and thickness of the lines drawn 1.18 cvs 2712: above, below, or through the characters.</p> 1.30 ! cvs 2713: ! 2714: <p>For graphics, the line style parameter can be either solid, dotted, or ! 2715: dashed; the line thickness parameter controls the width of the lines; the fill ! 2716: pattern parameter determines how closed geometric figures must be filled.</p> ! 2717: ! 2718: <p>While some of the parameters which determine the appearance of a box's 1.1 cvs 2719: contents make sense only for one content type (text or graphic), other 2720: parameters apply to all content types: these are the color parameters. These 1.18 cvs 2721: indicate the color of lines and the background color.</p> 2722: </div> 2723: </div> 1.1 cvs 2724: 1.18 cvs 2725: <div class="section"> 1.30 ! cvs 2726: <h2><a name="sectb42">Presentation description language</a></h2> ! 2727: ! 2728: <p>A generic presentation defines the values of presentation parameters (or ! 2729: the way to calculate those values) for a generic structure, or more precisely, ! 2730: for all the element types and all the global and local attributes defined in ! 2731: that generic structure. This definition of the presentation parameters is ! 2732: made with the P language. A program written in this language, that is a ! 2733: generic presentation expressed in P, is call a <em>presentation schema</em>. ! 2734: This section describes the syntax and semantics of the language, using the ! 2735: same <a href="#sectc321">meta-language</a> as was used for the definition of ! 2736: the S language.</p> 1.1 cvs 2737: 1.30 ! cvs 2738: <p>Recall that it is possible to write many different presentation schemas for 1.1 cvs 2739: the same class of documents or objects. This allows users to choose for a 2740: document the graphical appearance which best suits their type of work or 1.18 cvs 2741: their personal taste.</p> 1.1 cvs 2742: 1.18 cvs 2743: <div class="subsection"> 1.30 ! cvs 2744: <h3><a name="sectc421">The organization of a presentation schema</a></h3> 1.1 cvs 2745: 1.30 ! cvs 2746: <p>A presentation schema begins with the word <tt>PRESENTATION</tt> and ends ! 2747: with the word <tt>END</tt>. The word <tt>PRESENTATION</tt> is followed by the ! 2748: name of the generic structure to which the presentation will be applied. This ! 2749: name must be the same as that which follows the keyword <tt>STRUCTURE</tt> in ! 2750: the structure schema associated with the presentation schema.</p> ! 2751: ! 2752: <p>After this declaration of the name of the structure, the following sections 1.18 cvs 2753: appear (in order):</p> 2754: <ul> 1.30 ! cvs 2755: <li>Declarations of ! 2756: <ul> ! 2757: <li>all views,</li> ! 2758: <li>printed views,</li> ! 2759: <li>counters,</li> ! 2760: <li>presentation constants,</li> ! 2761: <li>variables,</li> ! 2762: </ul> ! 2763: </li> ! 2764: <li>default presentation rules,</li> ! 2765: <li>presentation box and page layout box definitions,</li> ! 2766: <li>presentation rules for structured elements,</li> ! 2767: <li>presentation rules for attributes,</li> ! 2768: <li>rules for transmitting values to attributes of included documents.</li> 1.18 cvs 2769: </ul> 1.30 ! cvs 2770: ! 2771: <p>Each of these sections is introduced by a keyword which is followed by a 1.18 cvs 2772: sequence of declarations. Every section is optional.</p> 2773: <pre> SchemaPres ='PRESENTATION' ElemID ';' 1.1 cvs 2774: [ 'VIEWS' ViewSeq ] 2775: [ 'PRINT' PrintViewSeq ] 2776: [ 'COUNTERS' CounterSeq ] 2777: [ 'CONST' ConstSeq ] 2778: [ 'VAR' VarSeq ] 2779: [ 'DEFAULT' ViewRuleSeq ] 2780: [ 'BOXES' BoxSeq ] 2781: [ 'RULES' PresentSeq ] 2782: [ 'ATTRIBUTES' PresAttrSeq ] 2783: [ 'TRANSMIT' TransmitSeq ] 2784: 'END' . 1.18 cvs 2785: ElemID = NAME .</pre> 2786: </div> 1.1 cvs 2787: 1.18 cvs 2788: <div class="subsection"> 1.30 ! cvs 2789: <h3><a name="sectc422">Views</a></h3> 1.1 cvs 2790: 1.30 ! cvs 2791: <p>Each of the possible views must be declared in the presentation schema. As 1.18 cvs 2792: has <a href="#views">already been described</a>, the presentation rules for an 1.1 cvs 2793: element type can vary according to the view in which the element appears. The 2794: name of the view is used to designate the view to which the presentation rules 1.18 cvs 2795: apply (see the <a href="#inkeyword"><tt>IN</tt> instruction</a>). The 1.1 cvs 2796: definition of the view's contents are dispersed throughout the presentation 2797: rules attached to the different element types and attributes. The 1.18 cvs 2798: <tt>VIEWS</tt> section is simply a sequence of view names separated by commas 2799: and terminated by a semi-colon.</p> 1.30 ! cvs 2800: ! 2801: <p>One of the view names (and only one) can be followed by the keyword 1.18 cvs 2802: <tt>EXPORT</tt>. This keyword identifies the view which presents the members 2803: of the document class in <a href="#sectc3213">skeleton form</a>. The 2804: graphical appearance and the content of this view is defined just as with 2805: other views, but it is useless to specify presentation rules concerning this 2806: view for the elements which are not loaded in the skeleton form.</p> 1.30 ! cvs 2807: ! 2808: <p>It is not necessary to declare any views; in this case there is a single 1.1 cvs 2809: unnamed view. If many views are declared, the first view listed is considered 2810: the principal view. The principal view is the one to which all rules that are 1.18 cvs 2811: not preceded by an indication of a view will apply (see the <a 2812: href="#inkeyword">instruction <tt>IN</tt></a>).</p> 1.30 ! cvs 2813: ! 2814: <p>The principal view is the the one which the editor presents on the screen ! 2815: when the user asks to create or edit a document. Thus, it makes sense to put ! 2816: the most frequently used view at the head of the list. But if the structure 1.18 cvs 2817: schema contains <a href="#sectc3213">skeleton elements</a> and is loaded in 2818: its skeleton form, the view whose name is followed by the keyword 2819: <tt>EXPORT</tt> will be opened and no other views can be opened.</p> 2820: <pre> 'VIEWS' ViewSeq 1.1 cvs 2821: ViewSeq = ViewDeclaration 1.30 ! cvs 2822: < ',' ViewDeclaration > ';' . 1.1 cvs 2823: ViewDeclaration = ViewID [ 'EXPORT' ] . 1.18 cvs 2824: ViewID = NAME .</pre> 1.30 ! cvs 2825: 1.18 cvs 2826: <blockquote class="example"> 1.30 ! cvs 2827: <p><strong>Example:</strong></p> ! 2828: ! 2829: <p>When editing a report, it might be useful have views of the table of ! 2830: contents and of the mathematical formulas, in addition to the principal view ! 2831: which shows the document in its entirety. To achieve this, a presentation ! 2832: schema for the Report class would have the following <tt>VIEWS</tt> ! 2833: section:</p> ! 2834: <pre>VIEWS 1.18 cvs 2835: Full_text, Table_of_contents, Formulas;</pre> 1.30 ! cvs 2836: ! 2837: <p>The contents of these views are specified in the presentation rules of ! 2838: the schema.</p> 1.18 cvs 2839: </blockquote> 2840: </div> 1.1 cvs 2841: 1.18 cvs 2842: <div class="subsection"> 1.30 ! cvs 2843: <h3><a name="sectc423">Print Views</a></h3> 1.1 cvs 2844: 1.30 ! cvs 2845: <p>When editing a document, each view is presented in a different window. In 1.18 cvs 2846: addition to the views specified by the <tt>VIEWS</tt> instruction, the user 1.1 cvs 2847: can display the associated elements with one window for each type of 1.18 cvs 2848: associated element.</p> 1.30 ! cvs 2849: ! 2850: <p>When printing a document, it is possible to print any number of views, ! 2851: chosen from among all the views which the editor can display (views in the ! 2852: strict sense or associated elements). Print views, as well as the order in ! 2853: which they must be printed, are indicated by the <tt>PRINT</tt> instruction. ! 2854: It appears after the <tt>VIEWS</tt> instruction and is formed of the keyword 1.18 cvs 2855: <tt>PRINT</tt> followed by the ordered list of print view names. The print 1.1 cvs 2856: view names are separated by commas and followed by a semi-colon. A print view 1.18 cvs 2857: name is either a view name declared in the <tt>VIEWS</tt> instruction or the 1.1 cvs 2858: name of an associated element type (with an ``s'' added to the end). The 1.18 cvs 2859: associated element must have been declared in the <tt>ASSOC</tt> section of 2860: the structure schema.</p> 2861: <pre> 'PRINT' PrintViewSeq 1.30 ! cvs 2862: PrintViewSeq = PrintView < ',' PrintView > ';' . 1.18 cvs 2863: PrintView = ViewID / ElemID .</pre> 1.30 ! cvs 2864: ! 2865: <p>If the <tt>PRINT</tt> instruction is absent, the printing program will ! 2866: print only the principal view (the first view specified by the <tt>VIEWS</tt> 1.18 cvs 2867: instruction or the single, unnamed view when there is no <tt>VIEWS</tt> 2868: instruction).</p> 1.30 ! cvs 2869: 1.18 cvs 2870: <blockquote class="example"> 1.30 ! cvs 2871: <p><strong>Example:</strong></p> ! 2872: ! 2873: <p>Consider a Report presentation using the view declarations from the ! 2874: preceding example. Suppose we want to print the full text and table of ! 2875: contents views, but not the Formulas view, which is only useful when ! 2876: editing. In addition, suppose that we also want to print the bibliographic ! 2877: citations, which are associated elements (of type <tt>Citation</tt>). A ! 2878: sensible printing order would be to print the full text then the ! 2879: bibliography and finally the table of contents. To obtain this result when ! 2880: printing, the presentation schema would say:</p> ! 2881: <pre>PRINT 1.18 cvs 2882: Full_text, Citations, Table_of_contents;</pre> 2883: </blockquote> 2884: </div> 2885: 2886: <div class="subsection"> 1.30 ! cvs 2887: <h3><a name="sectc424">Counters</a></h3> 1.18 cvs 2888: 1.30 ! cvs 2889: <p>A presentation has a <em>counter</em> for each type of number in the 1.1 cvs 2890: presentation. All counters, and therefore all types of numbers, used in the 1.18 cvs 2891: schema must be declared after the <tt>COUNTERS</tt> keyword.</p> 1.30 ! cvs 2892: ! 2893: <p>Each counter declaration is composed of a name identifying the counter 1.1 cvs 2894: followed by a colon and the counting function to be applied to the counter. 1.18 cvs 2895: The counter declaration ends with a semi-colon.</p> 1.30 ! cvs 2896: ! 2897: <p>The counting function indicates how the counter values will be calculated. 1.16 cvs 2898: Three types of counting functions are available. The first type is used to 2899: count the elements of a list or aggregate: it assigns to the counter the rank 1.18 cvs 2900: of the element in the list or aggregate. More precisely, the function</p> 2901: <pre>RANK OF ElemID [ LevelAsc ] [ INIT AttrID ] 2902: [ 'REINIT' AttrID ]</pre> 1.30 ! cvs 2903: ! 2904: <p>indicates that when an element creates, by a creation rule (see the <a 1.18 cvs 2905: href="#sectc4232"><tt>Create</tt> instructions</a>), a presentation box 1.5 cvs 2906: containing the counter value, this value is the rank of the creating element, 1.18 cvs 2907: if it is of type <tt>ElemID</tt>, otherwise the rank of the first element of 2908: type <tt>ElemID</tt> which encloses the creating element in the logical 2909: structure of the document.</p> 1.30 ! cvs 2910: ! 2911: <p>The type name can be preceded by a star in the special case where the 1.18 cvs 2912: structure schema defines an element of whose <tt>ElemID</tt> is the same as 2913: that of an <a href="#sectd3284">inclusion</a> without expansion or with 2914: partial expansion. To resolve this ambiguity, the <tt>ElemID</tt> alone 2915: refers to the type defined in the structure schema while the <tt>ElemID</tt> 2916: preceded by a star refers to the included type.</p> 1.30 ! cvs 2917: ! 2918: <p>The type name <tt>ElemID</tt> can be followed by an integer. That number 1.1 cvs 2919: represents the relative level, among the ancestors of the creating element, of 1.18 cvs 2920: the element whose rank is asked. If that relative level <i>n</i> is unsigned, 2921: the <i>n</i><sup>th</sup> element of type <tt>ElemID</tt> encountered when 1.1 cvs 2922: travelling the logical structure from the root to the creating element is 1.16 cvs 2923: taken into account. If the relative level is negative, the logical structure 2924: is travelled in the other direction, from the creating element to the 1.18 cvs 2925: root.</p> 1.30 ! cvs 2926: ! 2927: <p>The function can end with the keyword <tt>INIT</tt> followed by the name of ! 2928: a numeric attribute (and only a numeric attribute). Then, the rank of the ! 2929: first element of the list or aggregate is considered to be the value of this 1.1 cvs 2930: attribute, rather than the default value of 1, and the rank of the other 2931: elements is shifted accordingly. The attribute which determines the initial 1.18 cvs 2932: value is searched on the element itself and on its ancestors.</p> 1.30 ! cvs 2933: ! 2934: <p>The function can end with the keyword <tt>REINIT</tt> followed by the name ! 2935: of a numeric attribute (and only a numeric attribute). Then, if an element to ! 2936: be counted has this attribute, the counter value for this element is the 1.1 cvs 2937: attribute value and the following elements are numbered starting from this 1.18 cvs 2938: value.</p> 1.30 ! cvs 2939: ! 2940: <p>When the <tt>RANK</tt> function is written</p> 1.18 cvs 2941: <pre>RANK OF Page [ ViewID ] [ INIT AttrID ]</pre> 1.30 ! cvs 2942: ! 2943: <p>(<tt>Page</tt>is a keyword of the P language), the counter takes as its ! 2944: value the number of the page on which the element which creates the ! 2945: presentation box containing the number appears. This is done as if the pages ! 2946: of the document form a list for each view. The counter only takes into ! 2947: account the pages of the relevant view, that is the view displaying the ! 2948: presentation box whose contents take the value of the number. However, if the ! 2949: keyword <tt>Page</tt> is followed by the name of a view (between parentheses), ! 2950: it is the pages of that view that are taken into account. As in the preceding ! 2951: form, the <tt>RANK</tt> function applied to pages can end with the ! 2952: <tt>INIT</tt> keyword followed by the name of a numeric attribute which sets ! 2953: the value of the first page's number. This attribute must be a local ! 2954: attribute of the document itself, and not of one of its components.</p> ! 2955: ! 2956: <p>The second counting function is used to count the occurrences of a certain 1.18 cvs 2957: element type in a specified context. The instruction</p> 2958: <pre>SET n ON Type1 ADD m ON Type2 [ INIT AttrID ]</pre> 1.30 ! cvs 2959: ! 2960: <p>says that when the document is traversed from beginning to end (in the ! 2961: order induced by the logical structure), the counter is assigned the value 1.18 cvs 2962: <tt>n</tt> each time an element of type <tt>Type1</tt> is encountered, no 2963: matter what the current value of the counter, and the value <tt>m</tt> is 2964: added to the current value of the counter each time an element of type 2965: <tt>Type2</tt> is encountered.</p> 1.30 ! cvs 2966: ! 2967: <p>As with the <tt>RANK</tt> function, the type names can be preceded by a ! 2968: star to resolve the ambiguity of included elements.</p> ! 2969: ! 2970: <p>If the function ends with the keyword <tt>INIT</tt> followed by the name of ! 2971: an attribute and if the document possesses this attribute, the value of this 1.18 cvs 2972: attribute is used in place of <tt>n</tt>. The attribute must be numeric. It 2973: is searched on the element itself and on its ancestors.</p> 1.30 ! cvs 2974: ! 2975: <p>This function can also be used with the <tt>Page</tt> keyword in the place ! 2976: of <tt>Type1</tt> or <tt>Type2</tt>. In the first case, the counter is 1.18 cvs 2977: reinitialized on each page with the value <tt>n</tt>, while in the second 2978: case, it is incremented by <tt>m</tt> on each page. As with the preceding 2979: counting function, the word <tt>Page</tt> can be followed by a name between 1.1 cvs 2980: parentheses. In this case, the name specifies a view whose pages are taken 1.18 cvs 2981: into account.</p> 1.30 ! cvs 2982: ! 2983: <p>The definition of a counter can contain several <tt>SET</tt> functions and 1.18 cvs 2984: several <tt>ADD</tt> functions, each with a different value. The total number 2985: of counting functions must not be greater than 6.</p> 1.30 ! cvs 2986: ! 2987: <p>The third counting function is used to count the elements of a certain type 1.16 cvs 2988: encountered when travelling from the creating element to the root of the 2989: logical structure. The creating element is included if it is of that type. 1.18 cvs 2990: That function is written</p> 2991: <pre>RLEVEL OF Type</pre> 1.30 ! cvs 2992: ! 2993: <p>where <tt>Type</tt> represents the type of the elements to be counted.</p> ! 2994: ! 2995: <p>The formal definition of counter declarations is:</p> 1.18 cvs 2996: <pre> 'COUNTERS' CounterSeq 1.30 ! cvs 2997: CounterSeq = Counter < Counter > . 1.1 cvs 2998: Counter = CounterID ':' CounterFunc ';' . 2999: CounterID = NAME . 3000: CounterFunc = 'RANK' 'OF' TypeOrPage [ SLevelAsc ] 1.16 cvs 3001: [ 'INIT' AttrID ] [ 'REINIT' AttrID ] / 1.30 ! cvs 3002: SetFunction < SetFunction > ! 3003: AddFunction < AddFunction > 1.16 cvs 3004: [ 'INIT' AttrID ] / 3005: 'RLEVEL' 'OF' ElemID . 1.1 cvs 3006: SLevelAsc = [ '-' ] LevelAsc . 3007: LevelAsc = NUMBER . 3008: SetFunction = 'SET' CounterValue 'ON' TypeOrPage . 3009: AddFunction = 'ADD' CounterValue 'ON' TypeOrPage . 3010: TypeOrPage = 'Page' [ '(' ViewID ')' ] / 1.16 cvs 3011: [ '*' ] ElemID . 1.18 cvs 3012: CounterValue = NUMBER .</pre> 1.30 ! cvs 3013: 1.18 cvs 3014: <blockquote class="example"> 1.30 ! cvs 3015: <p><strong>Example:</strong></p> ! 3016: ! 3017: <p>If the body of a chapter is defined as a sequence of sections in the ! 3018: structure schema:</p> ! 3019: <pre>Chapter_body = LIST OF (Section = 1.1 cvs 3020: BEGIN 3021: Section_Title = Text; 3022: Section_Body = Paragraphs; 3023: END 1.18 cvs 3024: );</pre> 1.30 ! cvs 3025: ! 3026: <p>the section counter is declared:</p> ! 3027: <pre>SectionCtr : RANK OF Section;</pre> ! 3028: ! 3029: <p>and the display of the section number before the section title is ! 3030: obtained by a <a href="#sectc4232"><tt>CreateBefore</tt> rule</a> attached ! 3031: the <tt>Section_Title</tt> type, which creates a presentation box whose ! 3032: content is the value of the <tt>SectionCtr</tt> counter (see the <a ! 3033: href="#sectc4231"><tt>Content</tt> instruction</a>).</p> ! 3034: ! 3035: <p>In order to number the formulas separately within each chapter, the ! 3036: formula counter is declared:</p> ! 3037: <pre>FormulaCtr : SET 0 ON Chapter ADD 1 ON Formula;</pre> ! 3038: ! 3039: <p>and the display of the formula number in the right margin, alongside each ! 3040: formula, is obtained by a <tt>CreateAfter</tt> instruction attached to the ! 3041: <tt>Formula</tt> type, which creates a presentation box whose content is the ! 3042: value of the <tt>FormulaCtr</tt> counter.</p> ! 3043: ! 3044: <p>To number the page chapter by chapter, with the first page of each ! 3045: chapter having the number 1, the counter definition would be</p> ! 3046: <pre>ChapterPageCtr : SET 0 ON Chapter ADD 1 ON Page;</pre> ! 3047: ! 3048: <p>If there is also a chapter counter</p> ! 3049: <pre>ChapterCtr : RANK OF Chapter;</pre> ! 3050: ! 3051: <p>the <a href="#sectc4231">content</a> of a presentation box created at the ! 3052: top of each page could be defined as:</p> ! 3053: <pre>Content : (VALUE(ChapterCtr, URoman) TEXT '-' 1.18 cvs 3054: VALUE(ChapterPageCtr, Arabic));</pre> 1.30 ! cvs 3055: ! 3056: <p>Thus, the presentation box contains the number of the chapter in ! 3057: upper-case roman numerals followed by a hyphen and the number of the page ! 3058: within the chapter in arabic numerals.</p> 1.18 cvs 3059: </blockquote> 1.30 ! cvs 3060: 1.18 cvs 3061: <blockquote class="example"> 1.30 ! cvs 3062: <p><strong>Example:</strong></p> ! 3063: ! 3064: <p>To count tables and figures together in a document of the chapter type, a ! 3065: counter could be defined using:</p> ! 3066: <pre>CommonCtr : SET 0 ON Chapter ADD 1 ON Table 1.18 cvs 3067: ADD 1 ON Figure;</pre> 3068: </blockquote> 3069: </div> 1.1 cvs 3070: 1.18 cvs 3071: <div class="subsection"> 1.30 ! cvs 3072: <h3><a name="sectc425">Presentation constants</a></h3> 1.1 cvs 3073: 1.30 ! cvs 3074: <p>Presentation constants are used in the definition of the content of 1.18 cvs 3075: presentation boxes. This content is used in <a href="#sectc426">variable 3076: definitions</a> and in the <a href="#sectc4231"><tt>Content</tt> rule</a>. The 1.1 cvs 3077: only presentation constants which can be used are character strings, 1.2 cvs 3078: mathematical symbols, graphical elements, and pictures, that is to say, base 1.18 cvs 3079: elements.</p> 1.30 ! cvs 3080: ! 3081: <p>Constants can be defined directly in the variables or presentation boxes 1.18 cvs 3082: (<tt>Content</tt> rule) which use them. But it is only necessary them to 1.1 cvs 3083: declare once, in the constant declaration section, even though they are used 3084: in many variables or boxes. Thus, each declared constant has a name, which 3085: allows it to be designated whenever it is used, a type (one of the four base 3086: types) and a value (a character string or a single character for mathematical 1.18 cvs 3087: symbols and graphical elements).</p> 1.30 ! cvs 3088: ! 3089: <p>The constant declarations appear after the keyword <tt>CONST</tt>. Each 1.1 cvs 3090: declaration is composed of the name of the constant, an equals sign, a keyword 1.18 cvs 3091: representing its type (<tt>Text</tt>, <tt>Symbol</tt>, <tt>Graphics</tt> or 3092: <tt>Picture</tt>) and the string representing its value. A semi-colon 3093: terminates each declaration.</p> 1.30 ! cvs 3094: ! 3095: <p>In the case of a character string, the keyword <tt>Text</tt> can be ! 3096: followed by the name of an alphabet (for example, <tt>Greek</tt> or ! 3097: <tt>Latin</tt>) in which the constant's text should be expressed. If the ! 3098: alphabet name is absent, the Latin alphabet is used. When the alphabet name ! 3099: is present, only the first letter of the alphabet name is interpreted. Thus, ! 3100: the words <tt>Greek</tt> and <tt>Grec</tt> designate the same alphabet. In ! 3101: current versions of Thot, only the Greek and Latin alphabets are ! 3102: available.</p> 1.18 cvs 3103: <pre> 'CONST' ConstSeq 1.30 ! cvs 3104: ConstSeq = Const < Const > . 1.1 cvs 3105: Const = ConstID '=' ConstType ConstValue ';' . 3106: ConstID = NAME . 3107: ConstType ='Text' [ Alphabet ] / 'Symbol' / 3108: 'Graphics' / 'Picture' . 3109: ConstValue = STRING . 1.18 cvs 3110: Alphabet = NAME .</pre> 1.30 ! cvs 3111: ! 3112: <p>For character strings in the Latin alphabet (ISO Latin-1 character set), 1.1 cvs 3113: characters having codes higher than 127 (decimal) are represented by their 1.18 cvs 3114: code in octal.</p> 1.30 ! cvs 3115: ! 3116: <p>In the case of a symbol or graphical element, the value only contains a ! 3117: single character, between apostrophes, which indicates the form of the element ! 3118: which must be drawn in the box whose content is the constant. The symbol or 1.1 cvs 3119: graphical element takes the dimensions of the box, which are determined by the 1.18 cvs 3120: <tt>Height</tt> and <tt>Width</tt> rules. See <a href="#sectb72">table of 3121: codes</a> for the symbols and graphical elements.</p> 1.30 ! cvs 3122: 1.18 cvs 3123: <blockquote class="example"> 1.30 ! cvs 3124: <p><strong>Example:</strong></p> ! 3125: ! 3126: <p>The constants ``Summary:'' and fraction bar, which were described ! 3127: earlier, are declared:</p> ! 3128: <pre>CONST 1.1 cvs 3129: SummaryConst = Text 'Summary:'; 1.18 cvs 3130: Bar = Graphics 'h';</pre> 3131: </blockquote> 3132: </div> 1.1 cvs 3133: 1.18 cvs 3134: <div class="subsection"> 1.30 ! cvs 3135: <h3><a name="sectc426">Variables</a></h3> 1.1 cvs 3136: 1.30 ! cvs 3137: <p>Variables permit the definition of computed content for presentation boxes. ! 3138: A variable is associated with a presentation box by a <tt>Content</tt> rule; ! 3139: but before being used in a <tt>Content</tt> rule, a variable can be defined in ! 3140: the <tt>VAR</tt> section. It is also possible to define a variable at the ! 3141: time of its use in a <tt>Content</tt> rule, as can be done with a ! 3142: constant.</p> ! 3143: ! 3144: <p>A variable has a name and a value which is a character string resulting ! 3145: from the concatenation of the values of a sequence of functions. Each ! 3146: variable declaration is composed of the variable name followed by a colon and ! 3147: the sequence of functions which produces its value, separated by spaces. Each 1.18 cvs 3148: declaration is terminated by a semi-colon.</p> 3149: <pre> 'VAR' VarSeq 1.30 ! cvs 3150: VarSeq = Variable < Variable > . 1.1 cvs 3151: Variable = VarID ':' FunctionSeq ';' . 3152: VarID = NAME . 1.30 ! cvs 3153: FunctionSeq = Function < Function > .</pre> ! 3154: ! 3155: <p>Several functions are available. The first two return, in the form of a 1.18 cvs 3156: character string, the current date. <tt>DATE</tt> returns the date in 3157: English, while <tt>FDATE</tt> returns the date in french.</p> 1.30 ! cvs 3158: ! 3159: <p>Two other functions, <tt>DocName</tt> and <tt>DirName</tt>, return the 1.18 cvs 3160: document name and the directory where the document is stored.</p> 1.30 ! cvs 3161: ! 3162: <p>Function <tt>ElemName</tt> returns the type of the element which created ! 3163: the presentation box whose contents are the variable.</p> ! 3164: ! 3165: <p>Another function simply returns the value of a presentation constant. For ! 3166: any constant declared in the <tt>CONST</tt> section, it is sufficient to give ! 3167: the name of the constant. Otherwise, the type and value of the constant must ! 3168: be given, using the same form as in a <a href="#sectc425">constant 1.18 cvs 3169: declaration</a>. If the constant is not of type text, (types <tt>Symbol</tt>, 3170: <tt>Graphics</tt> or <tt>Picture</tt>), it must be alone in the variable 3171: definition; only constants of type <tt>Text</tt> can be mixed with other 3172: functions.</p> 1.30 ! cvs 3173: ! 3174: <p>It is also possible to obtain the value of an attribute, simply by ! 3175: mentioning the attribute's name. The value of this function is the value of ! 3176: the attribute for the element which created the presentation box whose ! 3177: contents are the variable. If the creating element does not have the ! 3178: indicated attribute, the value is an empty string. In the case of a numeric ! 3179: attribute, the attribute is translated into a decimal number in arabic ! 3180: numerals. If another form is desired, the <tt>VALUE</tt> function must be ! 3181: used.</p> ! 3182: ! 3183: <p>The last available function returns, as a character string, the value of a 1.1 cvs 3184: counter, an attribute or a page number. This value can be presented in 1.18 cvs 3185: different styles. The keyword <tt>VALUE</tt> is followed (between 1.1 cvs 3186: parentheses) by the name of the counter, the name of the attribute, or the 1.18 cvs 3187: keyword <tt>PageNumber</tt> and the desired style, the two parameters being 1.1 cvs 3188: separated by a comma. The style is a keyword which indicates whether the 1.18 cvs 3189: value should be presented in arabic numerals (<tt>Arabic</tt>), lower-case 3190: roman numerals (<tt>LRoman</tt>), or upper-case roman numerals 3191: (<tt>URoman</tt>), or by an upper-case letter (<tt>Uppercase</tt>) or 3192: lower-case letter (<tt>Lowercase</tt>).</p> 1.30 ! cvs 3193: ! 3194: <p>For a page counter, the keyword <tt>PageNumber</tt> can be followed, ! 3195: between parentheses, by the name of the view from which to obtain the page ! 3196: number. By default, the first view declared in the <tt>VIEWS</tt> section is ! 3197: used. The value obtained is the number of the page on which is found the ! 3198: element that is using the variable in a <tt>Content</tt> rule.</p> ! 3199: ! 3200: <p>For an ordinary counter, the name of the counter can be preceded by the 1.18 cvs 3201: keyword <tt>MaxRangeVal</tt> or <tt>MinRangeVal</tt>. These keywords mean 1.1 cvs 3202: that the value returned by the function is the maximum (minimum resp.) value 3203: taken by the counter in the whole document, not the value for the element 1.18 cvs 3204: concerned by the function.</p> 3205: <pre> Function = 'DATE' / 'FDATE' / 1.1 cvs 3206: 'DocName' / 'DirName' / 3207: 'ElemName' / 'AttributeName' / 3208: ConstID / ConstType ConstValue / 3209: AttrID / 3210: 'VALUE' '(' PageAttrCtr ',' 3211: CounterStyle ')' . 1.6 cvs 3212: PageAttrCtr = 'PageNumber' [ '(' ViewID ')' ] / 1.1 cvs 3213: [ MinMax ] CounterID / AttrID . 3214: CounterStyle = 'Arabic' / 'LRoman' / 'URoman' / 3215: 'Uppercase' / 'Lowercase' . 1.18 cvs 3216: MinMax = 'MaxRangeVal' / 'MinRangeVal' .</pre> 1.30 ! cvs 3217: 1.18 cvs 3218: <blockquote class="example"> 1.30 ! cvs 3219: <p><strong>Example:</strong></p> ! 3220: ! 3221: <p>To make today's date appear at the top of the first page of a report, a ! 3222: <a href="#sectc4232"><tt>CREATE</tt> rule</a> associated with the ! 3223: Report_Title element type generates a presentation box whose content ! 3224: (specified by the <tt>Content</tt> rule of that presentation box) is the ! 3225: variable:</p> ! 3226: <pre>VAR 1.18 cvs 3227: Todays_date : TEXT 'Version of ' DATE;</pre> 1.30 ! cvs 3228: ! 3229: <p>To produce, before each section title, the chapter number (in upper-case ! 3230: roman numerals) followed by the section number (in arabic numerals), two ! 3231: counters must be defined:</p> ! 3232: <pre>COUNTERS 1.1 cvs 3233: ChapterCtr : RANK OF Chapter; 1.18 cvs 3234: SectionCtr : RANK OF Section;</pre> 1.30 ! cvs 3235: ! 3236: <p>and the Section_Title element must create a presentation box whose ! 3237: content is the variable</p> ! 3238: <pre>VAR 1.1 cvs 3239: SectionNum : VALUE (ChapterCtr, URoman) TEXT '-' 1.18 cvs 3240: VALUE (SectionCtr, Arabic);</pre> 1.30 ! cvs 3241: ! 3242: <p>In order to make the page number on which each section begins appear in ! 3243: the table of contents view next to the section title, each Section_Title ! 3244: element must create a presentation box, visible only in the table of ! 3245: contents view, whose content is the variable:</p> ! 3246: <pre>VAR 1.1 cvs 3247: TitlePageNume : 1.18 cvs 3248: VALUE (PageNumber(Full_text), Arabic);</pre> 3249: </blockquote> 3250: </div> 1.1 cvs 3251: 1.18 cvs 3252: <div class="subsection"> 1.30 ! cvs 3253: <h3><a name="sectc427">Default presentation rules</a></h3> 1.1 cvs 3254: 1.30 ! cvs 3255: <p>In order to avoid having to specify, for each element type defined in the 1.1 cvs 3256: structure schema, values for every one of the numerous presentation 3257: parameters, the presentation schema allows the definition of a set of default 3258: presentation rules. These rules apply to all the boxes of the elements 3259: defined in the structure schema and to the presentation boxes and page layout 3260: boxes defined in the presentation schema. Only rules which differ from these 1.18 cvs 3261: default need to be specified in other sections of the presentation schema.</p> 1.30 ! cvs 3262: ! 3263: <p>For the primary view, the default rules can define every presentation 1.18 cvs 3264: parameter, but not the <a href="#presfunct">presentation functions</a> or the 3265: <a href="#sectc4223">linebreaking conditions</a> (the <tt>NoBreak1</tt>, 3266: <tt>NoBreak2</tt>, and <tt>Gather</tt> rules).</p> 1.30 ! cvs 3267: ! 3268: <p>In a presentation schema, the default presentation rules section is ! 3269: optional; in this case, the <tt>DEFAULT</tt> keyword is also absent and the ! 3270: following rules are considered to be the default rules:</p> 1.26 cvs 3271: <pre> Visibility: Enclosing =; 3272: VertRef: * . Left; 3273: HorizRef: Enclosed . HRef; 3274: Height: Enclosed . Height; 3275: Width: Enclosed . Width; 3276: VertPos: Top = Previous . Bottom; 3277: HorizPos: Left = Enclosing . Left; 3278: MarginTop: 0; 3279: MarginRight: 0; 3280: MarginBottom: 0; 3281: MarginLeft: 0; 3282: PaddingTop: 0; 3283: PaddingRight: 0; 3284: PaddingBottom: 0; 3285: PaddingLeft: 0; 3286: BorderTopWidth: 0; 3287: BorderRightWidth: 0; 3288: BorderBottomWidth: 0; 3289: BorderLeftWidth: 0; 3290: BorderTopColor: Foreground; 3291: BorderRightColor: Foreground; 3292: BorderBottomColor: Foreground; 3293: BorderLeftColor: Foreground; 3294: BorderTopStyle: None; 3295: BorderRightStyle: None; 3296: BorderBottomStyle: None; 3297: BorderLeftStyle: None; 3298: VertOverflow: No; 3299: HorizOverflow: No; 3300: Size: Enclosing =; 3301: Style: Enclosing =; 3302: Weight: Enclosing =; 3303: Font: Enclosing =; 3304: Underline: Enclosing =; 3305: Thickness: Enclosing =; 3306: Indent: Enclosing =; 3307: LineSpacing: Enclosing =; 3308: Adjust: Enclosing =; 3309: Justify: Enclosing =; 3310: Hyphenate: Enclosing =; 3311: PageBreak: Yes; 3312: LineBreak: Yes; 3313: InLine: Yes; 3314: Depth: 0; 3315: LineStyle: Enclosing =; 3316: LineWeight: Enclosing =; 3317: FillPattern: Enclosing =; 3318: Background: Enclosing =; 3319: Foreground: Enclosing =;</pre> 1.30 ! cvs 3320: ! 3321: <p>If other values are desired for the default rules, they must be defined 1.1 cvs 3322: explicitly in the default rules section. In fact, it is only necessary to 3323: define those default rules which differ from the ones above, since the rules 1.18 cvs 3324: above will be used whenever a rule is not explicitly named.</p> 1.30 ! cvs 3325: ! 3326: <p>Default rules for views other than the primary view can also be specified. 1.1 cvs 3327: Otherwise, the default rules for the primary views are applied to the other 1.18 cvs 3328: views.</p> 1.30 ! cvs 3329: ! 3330: <p>Default rules are expressed in the same way as <a ! 3331: href="#sectc4215">explicit rules for document elements</a>.</p> 1.18 cvs 3332: </div> 1.1 cvs 3333: 1.18 cvs 3334: <div class="subsection"> 1.30 ! cvs 3335: <h3><a name="sectc428">Presentation and page layout boxes</a></h3> 1.1 cvs 3336: 1.30 ! cvs 3337: <p>The presentation process uses elements which are not part of the logical 1.1 cvs 3338: structure of the document, such as pages (which are the page layout boxes) or 3339: alternatively, rules, numbers, or words introducing certain parts of the 3340: document, such as ``Summary'', ``Appendices'', ``Bibliography'', etc. (which 1.18 cvs 3341: are presentation boxes).</p> 1.30 ! cvs 3342: ! 3343: <p>After the word <tt>BOXES</tt>, each presentation or page layout box is ! 3344: defined by its name and a sequence of presentation rules which indicate how ! 3345: they must be displayed. These rules are the same as those which define the ! 3346: boxes associated with element of the logical structure of the document, with a 1.18 cvs 3347: single exception, the <a href="#sectc4231"><tt>Content</tt> rule</a> which is 1.1 cvs 3348: used only to specify the content of presentation boxes. The content of boxes 3349: associated with elements of the document structure is defined in each document 3350: or object and thus is not specified in the presentation schema, which applies 1.18 cvs 3351: to all documents or objects of a class.</p> 1.30 ! cvs 3352: ! 3353: <p>Among the rules which define a presentation box, certain ones can refer to 1.1 cvs 3354: another presentation box (for example, in their positional rules). If the 3355: designated box is defined after the box which designates it, a 1.18 cvs 3356: <tt>FORWARD</tt> instruction followed by the name of the designated box must 3357: appear before the designation.</p> 3358: <pre> 'BOXES' BoxSeq 1.30 ! cvs 3359: BoxSeq = Box < Box > . 1.1 cvs 3360: Box ='FORWARD' BoxID ';' / 3361: BoxID ':' ViewRuleSeq . 1.18 cvs 3362: BoxID = NAME .</pre> 3363: </div> 1.1 cvs 3364: 1.18 cvs 3365: <div class="subsection"> 1.30 ! cvs 3366: <h3><a name="sectc429">Presentation of structured elements</a></h3> 1.1 cvs 3367: 1.30 ! cvs 3368: <p>After the words <tt>RULES</tt>, the presentation schema gives the ! 3369: presentation rules that apply to the elements whose types are defined in the ! 3370: structure schema. Only those rules which differ from the <a 1.18 cvs 3371: href="#sectc427">default</a> must be specified in the <tt>RULES</tt> 3372: section.</p> 1.30 ! cvs 3373: ! 3374: <p>The rule definitions for each element type are composed of the name of the 1.1 cvs 3375: element type (as specified in the structure schema) followed by a colon and 1.18 cvs 3376: the set of rules specific to that type.</p> 1.30 ! cvs 3377: ! 3378: <p>The type name can be preceded by a star in the special case where the 1.18 cvs 3379: structure schema defines an <a href="#sectd3284">inclusion</a> without 1.1 cvs 3380: expansion (or with partial expansion) of a type with the same name as an 1.18 cvs 3381: element of defined in the structure schema.</p> 1.30 ! cvs 3382: ! 3383: <p>In the case where the element is a <a href="#sectd3285">mark pair</a>, but 1.18 cvs 3384: only in this case, the type name can be preceded by the keywords 3385: <tt>First</tt> or <tt>Second</tt>. These keywords indicate whether the rules 3386: that follow apply to the first or second mark of the pair.</p> 3387: <pre> 'RULES' PresentSeq 1.30 ! cvs 3388: PresentSeq = Present < Present > . 1.6 cvs 3389: Present = [ '*' ] [ FirstSec ] ElemID ':' 3390: ViewRuleSeq . 1.18 cvs 3391: FirstSec = 'First' / 'Second' .</pre> 1.30 ! cvs 3392: ! 3393: <p>A presentation schema can define presentation rules for base elements, ! 3394: which are defined implicitly in the structure schemas. In the English version ! 3395: of the presentation schema compiler, the base type names are the same as in ! 3396: the S language, but they are terminated by the <tt>_UNIT</tt> suffix: 1.18 cvs 3397: <tt>TEXT_UNIT</tt>, <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>, 3398: <tt>GRAPHICS_UNIT</tt>. The base type names are written in upper-case 3399: letters.</p> 3400: </div> 3401: 3402: <div class="subsection"> 1.30 ! cvs 3403: <h3><a name="sectc4210">Logical attribute presentation</a></h3> 1.18 cvs 3404: 1.30 ! cvs 3405: <p>After the keyword <tt>ATTRIBUTES</tt>, all attributes which are to have ! 3406: some effect on the presentation of the element to which they are attached must ! 3407: be mentioned, along with the corresponding presentation rules. This is true ! 3408: for both global attributes (which can be attached to all element types) and ! 3409: local attributes (which can only be attached to certain element types).</p> ! 3410: ! 3411: <p>Also mentioned in this section are attributes which imply an effect on 1.1 cvs 3412: elements in the subtree of the element to which they are attached. The 3413: presentation of these descendants can be modified as a function of the value 3414: of the attribute which they inherit, just as if it was attached to them 1.18 cvs 3415: directly.</p> 1.30 ! cvs 3416: ! 3417: <p>The specification for each attribute includes the attribute's name, ! 3418: followed by an optional value specification and, after a colon, a set of ! 3419: rules. The set of rules must contain at least one rule.</p> ! 3420: ! 3421: <p>When there is no value specification, the rules are applied to all elements 1.1 cvs 3422: which carry the attribute, no matter what their value. When the rules must 3423: only apply when the attribute has certain values, these values must be 1.18 cvs 3424: specified. Thus, the same attribute can appear in the <tt>ATTRIBUTES</tt> 1.1 cvs 3425: section several times, with each appearance having a different value 3426: specification. However, reference attributes never have a value specification 1.18 cvs 3427: and, as a result, can only appear once in the <tt>ATTRIBUTES</tt> section.</p> 1.30 ! cvs 3428: ! 3429: <p>To specify that the presentation rules apply to some of the descendants of ! 3430: the element having the attribute, the name of the affected element type is ! 3431: given, between parentheses, after the attribute name. This way, the ! 3432: presentation rules for the attribute will be applied to the element having the ! 3433: attribute, if it is of the given type, and to all of its descendants of the ! 3434: given type. In the case where this type is a <a href="#sectd3285">mark ! 3435: pair</a>, but only in this case, the type name can be preceded by the keywords ! 3436: <tt>First</tt> or <tt>Second</tt>. These keywords indicate whether the rules ! 3437: that follow apply to the first or second mark of the pair. If the rule must ! 3438: apply to several different element types, the specification must be repeated ! 3439: for each element type.</p> ! 3440: ! 3441: <p>The specification of values for which the presentation rules will be ! 3442: applied varies according to the type of the attribute:</p> 1.18 cvs 3443: <dl> 1.30 ! cvs 3444: <dt>numeric attribute</dt> ! 3445: <dd>If the rules are to apply for one value of the attribute, then the ! 3446: attribute name is followed by an equals sign and this value. If the ! 3447: rules are to apply for all values less than (or greater than) a ! 3448: threshold value, non-inclusive, the attribute name followed by a '<' ! 3449: sign (or a '>' sign, respectively) and the threshold value. If the ! 3450: rules must apply to a range of values, the attribute name is followed by ! 3451: the word '<tt>IN</tt>' and the two bounds of the range, enclosed in ! 3452: brackets and separated by two periods ('<tt>..</tt>'). In the case of ! 3453: ranges, the values of the bounds are included in the range. ! 3454: <p>The threshold value in the comparisons can be the value of an ! 3455: attribute attached to an ancestor element. In this case, the attribute ! 3456: name is given instead of a constant value.</p> ! 3457: <p>It is also possible to write rules which apply only when a comparison ! 3458: between two different attributes of the element's ancestors is true. In ! 3459: this case, the first attribute name is followed by a comparison keyword ! 3460: and the name of the second attribute. The comparison keywords are ! 3461: <tt>EQUAL</tt> (simple equality), <tt>LESS</tt> (non-inclusive less ! 3462: than), and <tt>GREATER</tt> (non-inclusive greater than).</p> ! 3463: </dd> ! 3464: <dt>text attribute</dt> ! 3465: <dd>If the rules are to apply for one value of the attribute, then the ! 3466: attribute name is followed by an equals sign and this value.</dd> ! 3467: <dt>reference attribute</dt> ! 3468: <dd>There is never a value specification; the rules apply no matter what ! 3469: element is designated by the attribute.</dd> ! 3470: <dt>enumerated attribute</dt> ! 3471: <dd>If the rules are to apply for one value of the attribute, then the ! 3472: attribute name is followed by an equals sign and this value.</dd> 1.18 cvs 3473: </dl> 1.30 ! cvs 3474: ! 3475: <p>The order in which the rules associated with a numeric attribute are ! 3476: defined is important. When multiple sets of rules can be applied, the first ! 3477: set declared is the one used.</p> ! 3478: ! 3479: <p>Rules for attributes have priority over both default rules and rules 1.1 cvs 3480: associated with element types. The attribute rules apply to the element to 3481: which the attribute is attached. It is the rules which apply to the 3482: surrounding elements (and especially to the descendants) which determine the 3483: effect of the attribute rules on the environment ( and especially on the 1.18 cvs 3484: terminal elements of the structure).</p> 3485: <pre> 'ATTRIBUTES' PresAttrSeq 1.30 ! cvs 3486: PresAttrSeq = PresAttr < PresAttr > . 1.1 cvs 3487: PresAttr = AttrID [ '(' [ FirstSec ] ElemID ')' ] 3488: [ AttrRelation ] ':' ViewRuleSeq . 3489: AttrID = NAME . 3490: AttrRelation ='=' AttrVal / 1.30 ! cvs 3491: '>' [ '-' ] MinValue / 1.1 cvs 3492: '<' [ '-' ] MaxValue / 3493: 'IN' '[' [ '-' ] LowerBound '..' 3494: [ '-' ] UpperBound ']' / 3495: 'GREATER' AttrID / 3496: 'EQUAL' AttrID / 3497: 'LESS' AttrID . 3498: AttrVal = [ '-' ] EqualNum / EqualText / 3499: AttrValue . 3500: MinValue = NUMBER . 3501: MaxValue = NUMBER . 3502: LowerBound = NUMBER . 3503: UpperBound = NUMBER. 3504: EqualNum = NUMBER . 3505: EqualText = STRING . 1.18 cvs 3506: AttrValue = NAME .</pre> 1.30 ! cvs 3507: ! 3508: <p>In presentation rules associated with a numeric attribute (and only in such 1.1 cvs 3509: rules), the attribute name can be used in place of a numeric value. In this 3510: case, the value of the attribute is used in the application of the rule. Thus, 3511: the attribute can represent a relation between the size of two boxes, the 3512: height and width of a box, the height of an area where page breaks are 3513: prohibited, the distance between two boxes, the position of the reference axis 3514: of a box, the interline spacing, the indentation of the first line, the 1.18 cvs 3515: visibility, the depth (z-order), or the character set.</p> 1.30 ! cvs 3516: ! 3517: <p>The presentation rules associated with reference attributes, it is possible ! 3518: to use the element designated by the attribute as a reference box in a ! 3519: positional or extent rule. This element is represented in the <a 1.18 cvs 3520: href="#sectc4218">position</a> or <a href="#sectc4219">extent</a> rule by the 3521: keyword <tt>Referred</tt>.</p> 1.30 ! cvs 3522: 1.18 cvs 3523: <blockquote class="example"> 1.30 ! cvs 3524: <p><strong>Example:</strong></p> ! 3525: ! 3526: <p>In all structure schemas, there is a global Language attribute defined as ! 3527: follows:</p> ! 3528: <pre>ATTR 1.18 cvs 3529: Language = TEXT;</pre> 1.30 ! cvs 3530: ! 3531: <p>The following rules would make French text be displayed in roman ! 3532: characters and English text be displayed in italics:</p> ! 3533: <pre>ATTRIBUTES 1.1 cvs 3534: Language = 'French' : 1.6 cvs 3535: Style : Roman; 1.1 cvs 3536: Language = 'English' : 1.18 cvs 3537: Style : Italics;</pre> 1.30 ! cvs 3538: ! 3539: <p>Using these rules, when the user puts the Language attribute with the ! 3540: value 'English' on the summary of a document, every character string ! 3541: (terminal elements) contained in the summary are displayed in italics. See ! 3542: the <a href="#sectd42252"><tt>Style</tt> rule</a>.</p> 1.18 cvs 3543: </blockquote> 1.30 ! cvs 3544: 1.18 cvs 3545: <blockquote class="example"> 1.30 ! cvs 3546: <p><strong>Example:</strong></p> ! 3547: ! 3548: <p>A numeric attribute representing the importance of the part of the ! 3549: document to which it is attached can be defined:</p> ! 3550: <pre>ATTR 1.18 cvs 3551: Importance = INTEGER;</pre> 1.30 ! cvs 3552: ! 3553: <p>In the presentation schema, the importance of an element is reflected in ! 3554: the choice of character size, using the following rules.</p> ! 3555: <pre>ATTRIBUTES 1.1 cvs 3556: Importance < 2 : 3557: Size : 1; 3558: Importance IN [2..4] : 3559: Size : Importance; 3560: Importance = 10 : 3561: Size : 5; 1.30 ! cvs 3562: Importance > 4 : 1.18 cvs 3563: Size : 4;</pre> 1.30 ! cvs 3564: ! 3565: <p>Thus, the character size corresponds to the value of the Importance ! 3566: attribute; its value is</p> ! 3567: <ul> ! 3568: <li>the value of the Importance attribute when the value is between 2 and ! 3569: 4 (inclusive),</li> ! 3570: <li>1, when the value of the Importance attribute is less than 2,</li> ! 3571: <li>4, when the value of the Importance attribute is greater than 4,</li> ! 3572: <li>5, when the value of the Importance attribute is 10.</li> ! 3573: </ul> ! 3574: ! 3575: <p>The last case (value 5) must be defined before the case which handles all ! 3576: Importance values greater than 4, because the two rules are not disjoint and ! 3577: the first one defined will have priority. Otherwise, when the Importance ! 3578: attribute has value 10, the font size will be 4.</p> 1.18 cvs 3579: </blockquote> 1.30 ! cvs 3580: 1.18 cvs 3581: <blockquote class="example"> 1.30 ! cvs 3582: <p><strong>Example:</strong></p> ! 3583: ! 3584: <p>Suppose the structure defines a list element which can have an attribute ! 3585: defining the type of list (numbered or not):</p> ! 3586: <pre>STRUCT 1.1 cvs 3587: list (ATTR list_type = enumeration, dash) 1.18 cvs 3588: = LIST OF (list_item = TEXT);</pre> 1.30 ! cvs 3589: ! 3590: <p>Then, the presentation schema could use the attribute placed on the list ! 3591: element to put either a dash or a number before the each element of the ! 3592: list:</p> ! 3593: <pre>ATTRIBUTES 1.1 cvs 3594: list_type (list_item) = enumeration : 3595: CreateBefore (NumberBox); 3596: list_type (list_item) = dash : 1.18 cvs 3597: CreateBefore (DashBox);</pre> 3598: </blockquote> 1.30 ! cvs 3599: 1.18 cvs 3600: <blockquote class="example"> 1.30 ! cvs 3601: <p><strong>Example:</strong></p> ! 3602: ! 3603: <p>Suppose that two attributes are defined in the structure schema. The ! 3604: first is a numeric global attribute called ``version''. The other is a ! 3605: local attribute defined on the root of the document called ! 3606: ``Document_version'':</p> ! 3607: <pre>STRUCTURE Document 1.1 cvs 3608: ATTR 3609: version = INTEGER; 3610: STRUCT 3611: Document (ATTR Document_version = INTEGER) = 3612: BEGIN 3613: SomeElement ; 3614: ... 3615: SomeOtherElement ; 3616: END ; 1.18 cvs 3617: ...</pre> 1.30 ! cvs 3618: ! 3619: <p>These attributes can be used in the presentation schema to place change ! 3620: bars in the margin next to elements whose version attribute has a value ! 3621: equal to the Document_version attribute of the root and to place a star in ! 3622: margin of elements whose version attribute is less than the value of the ! 3623: root's Document_version attribute:</p> ! 3624: <pre>ATTRIBUTES 1.1 cvs 3625: version EQUAL Document_version : 3626: CreateBefore (ChangeBarBox) ; 3627: version LESS Document_version : 1.18 cvs 3628: CreateBefore (StarBox) ;</pre> 3629: </blockquote> 3630: </div> 1.1 cvs 3631: 1.18 cvs 3632: <div class="subsection"> 1.30 ! cvs 3633: <h3><a name="sectc4212">Value transmission rules</a></h3> 1.1 cvs 3634: 1.30 ! cvs 3635: <p>The last section of a presentation schema, which is optional, serves to 1.1 cvs 3636: defines the way in which a document transmits certain values to its 1.18 cvs 3637: sub-documents. A sub-document is an document <a 3638: href="#inclusion">included</a> without expansion or with partial expansion. 1.1 cvs 3639: The primary document can transmit to its sub-documents the values of certain 3640: counters or the textual content of certain of its elements, as a function of 1.18 cvs 3641: their type.</p> 1.30 ! cvs 3642: ! 3643: <p>The sub-documents receive these values in attributes which must be defined ! 3644: in their structure schema as local attributes of the root element. The types ! 3645: of these attributes must correspond to the type of the value which they ! 3646: receive: numeric attributes for receiving the value of a counter, textual ! 3647: attributes for receiving the content of an element.</p> ! 3648: ! 3649: <p>In the structure schema of the primary document, there appears at the end, 1.18 cvs 3650: after the <tt>TRANSMIT</tt> keyword, a sequence of transmission rules. Each 1.1 cvs 3651: rule begins with the name of the counter to transmit or of the element type 3652: whose textual content will be transmitted. This name is followed by the 1.18 cvs 3653: keyword <tt>To</tt> and the name of the attribute of the sub-document to which 1.1 cvs 3654: the value is transmitted. The sub-document class is indicated between 3655: parentheses after the name of the attribute. The transmission rule ends with 1.18 cvs 3656: a semicolon.</p> 1.30 ! cvs 3657: <pre> TransmitSeq = Transmit < Transmit > . 1.1 cvs 3658: Transmit = TypeOrCounter 'To' ExternAttr 3659: '(' ElemID ')' ';' . 3660: TypeOrCounter = CounterID / ElemID . 1.18 cvs 3661: ExternAttr = NAME .</pre> 1.30 ! cvs 3662: 1.18 cvs 3663: <blockquote class="example"> 1.30 ! cvs 3664: <p><strong>Example:</strong></p> ! 3665: ! 3666: <p>Consider a Book document class which includes instances of the Chapter ! 3667: document class. These classes might have the following schemas:</p> ! 3668: <pre>STRUCTURE Book 1.1 cvs 3669: STRUCT 3670: Book = BEGIN 3671: Title = Text; 3672: Body = LIST OF (Chapter INCLUDED); 3673: END; 3674: ... 3675: 3676: STRUCTURE Chapter 3677: STRUCT 3678: Chapter (ATTR FirstPageNum = Integer; 3679: ChapterNum = Integer; 3680: CurrentTitle = Text) = 1.6 cvs 3681: BEGIN 3682: ChapterTitle = Text; 3683: ... 3684: END; 1.18 cvs 3685: ...</pre> 1.30 ! cvs 3686: ! 3687: <p>Then the presentation schema for books could define chapter and page ! 3688: counters. The following transmission rules in the book presentation schema ! 3689: would transmit values for the three attributes defined at the root of each ! 3690: chapter sub-document.</p> ! 3691: <pre>PRESENTATION Book; 1.1 cvs 3692: VIEWS 3693: Full_text; 3694: COUNTERS 3695: ChapterCtr: Rank of Chapter; 3696: PageCtr: Rank of Page(Full_text); 3697: ... 3698: TRANSMIT 3699: PageCtr TO FirstPageNum(Chapter); 3700: ChapterCtr TO ChapterNum(Chapter); 3701: Title TO CurrentTitle(Chapter); 1.18 cvs 3702: END</pre> 1.30 ! cvs 3703: ! 3704: <p>Thus, each chapter included in a book can number its pages as a function ! 3705: of the number of pages preceding it in the book, can make the chapter's ! 3706: number appear before the number of each of its sections, or can place the ! 3707: title of the book at the top of each page.</p> 1.18 cvs 3708: </blockquote> 3709: </div> 1.1 cvs 3710: 1.18 cvs 3711: <div class="subsection"> 1.30 ! cvs 3712: <h3><a name="sectc4213">Presentation rules</a></h3> 1.1 cvs 3713: 1.30 ! cvs 3714: <p>Whether defining the appearance of a presentation or page layout box, an 1.1 cvs 3715: element type, or an attribute value, the set of presentation rules that apply 1.18 cvs 3716: is always defined in the same way.</p> 1.30 ! cvs 3717: ! 3718: <p>Normally, a set of presentation rules is placed between the keywords 1.18 cvs 3719: <tt>BEGIN</tt> and <tt>END</tt>, the keyword <tt>END</tt> being followed by a 1.1 cvs 3720: semicolon. The first section of this block defines the rules that apply to 1.18 cvs 3721: the primary view, if the <a href="#sectc427">default rules</a> are not 1.1 cvs 3722: completely suitable. Next comes the rules which apply to specific other 3723: views, with a rule sequence for each view for which the default rules are not 3724: satisfactory. If the default rules are suitable for the non-primary views, 3725: there will not be any specific rules for these views. If there is only one 1.18 cvs 3726: rule which applies to all views then the keywords <tt>BEGIN</tt> and 3727: <tt>END</tt> need not appear.</p> 1.30 ! cvs 3728: ! 3729: <p>For each view, it is only necessary to specify those rules which differ ! 3730: from the default rules for the view, so that for certain views (or even all ! 3731: views), there may be no specific rules.</p> ! 3732: ! 3733: <p>The specific rules for a non-primary view are introduced by the <a 1.18 cvs 3734: name="inkeyword"><tt>IN</tt> keyword</a>, followed by the view name. The 3735: rules for that view follow, delimited by the keywords <tt>BEGIN</tt> and 3736: <tt>END</tt>, or without these two keywords when there is only one rule.</p> 1.30 ! cvs 3737: ! 3738: <p><strong>Note:</strong> the view name which follows the <tt>IN</tt> keyword 1.1 cvs 3739: must not be the name of the primary view, since the rules for that view are 1.18 cvs 3740: found before the rules for the other views.</p> 1.30 ! cvs 3741: ! 3742: <p>Within each block concerning a view, other blocks can appear, delimited by ! 3743: the same keywords <tt>BEGIN</tt> and <tt>END</tt>. Each of these blocks ! 3744: gathers the presentation rules that apply, for a given view, only when a given 1.1 cvs 3745: condition is satisfied. Each block is preceded by a condition introduced by 1.18 cvs 3746: the <tt>IF</tt> keyword. If such a conditional block contains only one rule, 3747: the keywords <tt>BEGIN</tt> and <tt>END</tt> can be omitted.</p> 1.30 ! cvs 3748: ! 3749: <p>Although the syntax allows any presentation rule to appear in a conditional 1.18 cvs 3750: block, only <a href="#sectc4232">creation rules</a> are allowed after any 3751: condition; other rules are allowed only after conditions <tt>Within</tt> and 1.1 cvs 3752: ElemID. In addition, the following rules cannot be conditional: 1.18 cvs 3753: <tt>PageBreak, LineBreak, Inline, Gather</tt>.</p> 1.30 ! cvs 3754: ! 3755: <p>For a given view, the rules that apply without any condition must appear 1.1 cvs 3756: before the first conditional block. If some rules apply only when none of the 3757: specified condition holds, they are grouped in a block preceded by the keyword 1.18 cvs 3758: <tt>Otherwise</tt>, and that block must appear after the last conditionnal 3759: block concerning the same view.</p> 1.30 ! cvs 3760: <pre> ViewRuleSeq = 'BEGIN' < RulesAndCond > < ViewRules > 1.1 cvs 3761: 'END' ';' / 3762: ViewRules / CondRules / Rule . 3763: RulesAndCond = CondRules / Rule . 3764: ViewRules = 'IN' ViewID CondRuleSeq . 1.30 ! cvs 3765: CondRuleSeq = 'BEGIN' < RulesAndCond > 'END' ';' / 1.1 cvs 3766: CondRules / Rule . 1.30 ! cvs 3767: CondRules = CondRule < CondRule > 1.1 cvs 3768: [ 'Otherwise' RuleSeq ] . 3769: CondRule = 'IF' ConditionSeq RuleSeq . 1.30 ! cvs 3770: RulesSeq = 'BEGIN' Rule < Rule > 'END' ';' / 1.18 cvs 3771: Rule .</pre> 1.30 ! cvs 3772: 1.18 cvs 3773: <blockquote class="example"> 1.30 ! cvs 3774: <p><strong>Example:</strong></p> ! 3775: ! 3776: <p>The following rules for a report's title make the title visible in the ! 3777: primary view and invisible in the table of contents and in the formula views ! 3778: (see the <a href="#sectc4224"><tt>Visibility</tt> rule</a>).</p> ! 3779: <pre>Title : BEGIN 1.1 cvs 3780: Visibility : 1; 3781: ... {Other rules for the primary view} 3782: IN Table_of_contents 3783: Visibility : 0; 3784: IN Formulas 3785: Visibility : 0; 1.18 cvs 3786: END;</pre> 3787: </blockquote> 3788: </div> 1.1 cvs 3789: 1.18 cvs 3790: <div class="subsection"> 1.30 ! cvs 3791: <h3><a name="sectc4214">Conditions applying to presentation rules</a></h3> 1.1 cvs 3792: 1.30 ! cvs 3793: <p>Many conditions can be applied to presentation rules. Conditions allow 1.1 cvs 3794: certain presentation rules to apply only in certain cases. These conditions 3795: can be based on the structural position of the element. They can be based on 3796: whether the element has references, and what type of references, whether the 3797: element has attributes, whether the element is empty or not. They can also be 1.18 cvs 3798: based on the value of a counter.</p> 1.30 ! cvs 3799: ! 3800: <p>It is possible to specify several conditions which must all be true for the 1.18 cvs 3801: rules to apply.</p> 1.30 ! cvs 3802: ! 3803: <p>A set of conditions is specified by the <tt>IF</tt> keyword. This keyword ! 3804: is followed by the sequence of conditions, separated by the <tt>AND</tt> ! 3805: keyword. Each condition is specified by a keyword which defines the condition ! 3806: type. In some cases, the keyword is followed by other data, which specify the ! 3807: condition more precisely.</p> ! 3808: ! 3809: <p>An elementary condition can be negative; it is then preceded by the 1.18 cvs 3810: <tt>NOT</tt> keyword.</p> 1.30 ! cvs 3811: ! 3812: <p>When the presentation rule(s) controlled by the condition apply to a ! 3813: reference element or a reference attribute, an elementary condition can also ! 3814: apply to element referred by this reference. The <tt>Target</tt> keyword is ! 3815: used for that purpose. It must appear before the keyword defining the ! 3816: condition type.</p> 1.18 cvs 3817: <pre> CondRule ='IF' ConditionSeq RuleSeq . 1.30 ! cvs 3818: ConditionSeq = Condition < 'AND' Condition > . 1.1 cvs 3819: Condition = [ 'NOT' ] [ 'Target' ] ConditionElem . 3820: ConditionElem ='First' / 'Last' / 3821: [ 'Immediately' ] 'Within' [ NumParent ] 3822: ElemID [ ExtStruct ] / 3823: ElemID / 3824: 'Referred' / 'FirstRef' / 'LastRef' / 3825: 'ExternalRef' / 'InternalRef' / 'CopyRef' / 3826: 'AnyAttributes' / 'FirstAttr' / 'LastAttr' / 3827: 'UserPage' / 'StartPage' / 'ComputedPage' / 3828: 'Empty' / 3829: '(' [ MinMax ] CounterName CounterCond ')' / 3830: CondPage '(' CounterID ')' . 3831: NumParent = [ GreaterLess ] NParent . 1.30 ! cvs 3832: GreaterLess ='>' / '<' . 1.1 cvs 3833: NParent = NUMBER. 1.6 cvs 3834: ExtStruct ='(' ElemID ')' . 1.30 ! cvs 3835: CounterCond ='<' MaxCtrVal / '>' MinCtrVal / 1.1 cvs 3836: '=' EqCtrVal / 3837: 'IN' '[' ['-'] MinCtrBound '.' '.' 3838: ['-'] MaxCtrBound ']' . 3839: PageCond ='Even' / 'Odd' / 'One' . 3840: MaxCtrVal = NUMBER . 3841: MinCtrVal = NUMBER . 3842: EqCtrVal = NUMBER . 3843: MaxCtrBound = NUMBER . 1.18 cvs 3844: MinCtrBound = NUMBER .</pre> 1.1 cvs 3845: 1.18 cvs 3846: <div class="subsubsection"> 3847: <h4><a name="sectd42141">Conditions based on the logical position of the 3848: element</a></h4> 1.30 ! cvs 3849: ! 3850: <p>The condition can be on the position of the element in the document's ! 3851: logical structure tree. It is possible to test whether the element is the ! 3852: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is ! 3853: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>). These 1.18 cvs 3854: conditions can be associated only with <a href="#sectc4232">creation 3855: rules</a>.</p> 1.30 ! cvs 3856: ! 3857: <p>It is also possible to test if the element is contained in an element of a 1.18 cvs 3858: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). The type 3859: is indicated after the keyword <tt>Within</tt>. If that element type is 1.1 cvs 3860: defined in a structure schema which is not the one which corresponds to the 3861: presentation schema, the type name of this element must be followed, between 1.18 cvs 3862: parentheses, by the name of the structure schema which defines it.</p> 1.30 ! cvs 3863: ! 3864: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the 1.18 cvs 3865: condition is satisfied only if the <em>parent</em> element has the type 3866: indicated. If the word <tt>Immediately</tt> is missing, the condition is 3867: satisfied if any <em>ancestor</em> has the type indicated.</p> 1.30 ! cvs 3868: ! 3869: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the 1.1 cvs 3870: type. It specifies the number of ancestors of the indicated type that must be 3871: present for the condition to be satisfied. If the keyword 1.18 cvs 3872: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the 3873: element must have the indicated type. The integer <i>n</i> must be positive 1.30 ! cvs 3874: or zero. It can be preceded by <tt><</tt> or <tt>></tt> to indicate a 1.1 cvs 3875: maximum or minimum number of ancestors. If these symbols are missing, the 1.18 cvs 3876: condition is satisfied only if it exists exactly <i>n</i> ancestors. When 1.30 ! cvs 3877: this number is missing, it is equivalent to > 0.</p> ! 3878: ! 3879: <p>If the condition applies to presentation rules associated with an ! 3880: attribute, in the <tt>ATTRIBUTES</tt> section of the presentation schema, the ! 3881: condition can be simply an element name. Presentation rules are then executed ! 3882: only if the attribute is attached to an element of that type. The keyword ! 3883: <tt>NOT</tt> before the element name indicates that the presentation rules ! 3884: must be executed only if the element is not of the type indicated.</p> 1.18 cvs 3885: </div> 1.1 cvs 3886: 1.18 cvs 3887: <div class="subsubsection"> 1.30 ! cvs 3888: <h4><a name="sectd42142">Conditions on references</a></h4> ! 3889: ! 3890: <p>References may be taken into account in conditions, which can be based on ! 3891: the fact that the element, or one of its ancestors, is designated by a at ! 3892: least one reference (<tt>Referred</tt>) or by none (<tt>NOT ! 3893: Referred</tt>).</p> ! 3894: ! 3895: <p>If the element or attribute to which the condition is attached is a ! 3896: reference, the condition can be based on the fact that it acts as the first ! 3897: reference to the designated element (<tt>FirstRef</tt>), or as the last ! 3898: (<tt>LastRef</tt>), or as a reference to an element located in another ! 3899: document (<tt>ExternalRef</tt>) or in the same document ! 3900: (<tt>InternalRef</tt>).</p> 1.1 cvs 3901: 1.30 ! cvs 3902: <p>The condition can also be based on the fact that the element is an <a 1.18 cvs 3903: href="#inclusion">inclusion</a>. This is noted (<tt>CopyRef</tt>).</p> 1.30 ! cvs 3904: ! 3905: <p>Like all conditions, conditions on references can be inverted by the 1.18 cvs 3906: <tt>NOT</tt> keyword. These conditions can be associated only with <a 3907: href="#sectc4232">creation rules</a>.</p> 3908: </div> 1.1 cvs 3909: 1.18 cvs 3910: <div class="subsubsection"> 1.30 ! cvs 3911: <h4><a name="sectd42143">Conditions on logical attributes</a></h4> ! 3912: ! 3913: <p>The condition can be based on the presence or absence of attributes ! 3914: associated with the element, no matter what the attributes or their values. ! 3915: The <tt>AnyAttributes</tt> keyword expresses this condition.</p> 1.1 cvs 3916: 1.30 ! cvs 3917: <p>If the condition appears in the presentation rules of an attribute, the 1.18 cvs 3918: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate that 1.1 cvs 3919: the rules must only be applied if this attribute is the first attribute for 3920: the element or if it is the last (respectively). These conditions can also be 1.18 cvs 3921: inverted by the <tt>NOT</tt> keyword. These conditions can be associated only 3922: with <a href="#sectc4232">creation rules</a>.</p> 1.30 ! cvs 3923: ! 3924: <p>It is also possible to apply certain presentation rules only when the ! 3925: element being processed or one of its ancestors has a certain attribute, ! 3926: perhaps with a certain value. This can be done in the <a 1.18 cvs 3927: href="#sectc4210"><tt>ATTRIBUTES</tt> section</a>.</p> 3928: </div> 1.1 cvs 3929: 1.18 cvs 3930: <div class="subsubsection"> 1.30 ! cvs 3931: <h4><a name="sectd42144">Conditions on page breaks</a></h4> 1.1 cvs 3932: 1.30 ! cvs 3933: <p>The page break base type (and only this type) can use the following 1.18 cvs 3934: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, and <tt>UserPage</tt>. 3935: The <tt>ComputedPage</tt> condition indicates that the presentation rule(s) 1.1 cvs 3936: should apply if the page break was created automatically by Thot; the 1.18 cvs 3937: <tt>StartPage</tt> condition is true if the page break is generated before the 3938: element by the <tt>Page</tt> rule; and the <tt>UserPage</tt> condition applies 3939: if the page break was inserted by the user.</p> 1.30 ! cvs 3940: ! 3941: <p>These conditions can be associated only with <a href="#sectc4232">creation 1.18 cvs 3942: rules</a>.</p> 3943: </div> 1.1 cvs 3944: 1.18 cvs 3945: <div class="subsubsection"> 1.30 ! cvs 3946: <h4><a name="sectd42145">Conditions on the element's content</a></h4> 1.1 cvs 3947: 1.30 ! cvs 3948: <p>The condition can be based on whether or not the element is empty. An ! 3949: element which has no children or whose leaves are all empty is considered to ! 3950: be empty itself. This condition is expressed by the <tt>Empty</tt> keyword, ! 3951: optionally preceded by the <tt>NOT</tt> keyword. This condition can be ! 3952: associated only with <a href="#sectc4232">creation rules</a>.</p> 1.18 cvs 3953: </div> 1.1 cvs 3954: 1.18 cvs 3955: <div class="subsubsection"> 1.30 ! cvs 3956: <h4><a name="sectd42146">Conditions on counters</a></h4> 1.1 cvs 3957: 1.30 ! cvs 3958: <p>Presentation rules can apply when the counter's value is one, is even or ! 3959: odd, is equal, greater than or less than a given value or falls in a range of 1.1 cvs 3960: values. This is particularly useful for creating header and footer boxes. 1.18 cvs 3961: These conditions can be associated only with <a href="#sectc4232">creation 3962: rules</a>.</p> 1.30 ! cvs 3963: ! 3964: <p>To compare the value of a counter to a given value, a comparison is given 1.1 cvs 3965: between parentheses. The comparison is composed of the counter name followed 3966: by an equals, greater than, or less than sign and the value to which the 3967: counter will be compared. A test for whether or not a counter's value falls 3968: in a range also appears within parentheses. In this case, the counter name is 1.18 cvs 3969: followed by the <tt>IN</tt> keyword and the range definition within brackets. 3970: The <tt>Even</tt>, <tt>Odd</tt> and <tt>One</tt> are used to test a counter's 3971: value and are followed by the counter name between parentheses.</p> 1.30 ! cvs 3972: ! 3973: <p>The list of possible conditions on counters is:</p> 1.18 cvs 3974: <dl> 1.30 ! cvs 3975: <dt><tt>Even (Counter)</tt></dt> ! 3976: <dd>the box is created only if the counter has an even value.</dd> ! 3977: <dt><tt>Odd (Counter)</tt></dt> ! 3978: <dd>the box is created only if the counter has an odd value.</dd> ! 3979: <dt><tt>One (Counter)</tt></dt> ! 3980: <dd>the box is created only the counter's value is 1.</dd> ! 3981: <dt><tt>NOT One (Counter)</tt></dt> ! 3982: <dd>the box is created, unless the counter's value is 1.</dd> ! 3983: <dt><tt>(Counter < Value)</tt></dt> ! 3984: <dd>the box is created only if the counter's value is less than ! 3985: Value.</dd> ! 3986: <dt><tt>(Counter > Value)</tt></dt> ! 3987: <dd>the box is created only if the counter's value is greater than ! 3988: Value.</dd> ! 3989: <dt><tt>(Counter = Value)</tt></dt> ! 3990: <dd>the box is created only if the counter's value is equal to Value.</dd> ! 3991: <dt><tt>NOT (Counter = Value)</tt></dt> ! 3992: <dd>the is created only if the counter's value is different than ! 3993: Value.</dd> ! 3994: <dt><tt>(Counter IN [MinValue..MaxValue])</tt></dt> ! 3995: <dd>the box is created only if the counter's value falls in the range ! 3996: bounded by MinValue and MaxValue (inclusive).</dd> ! 3997: <dt><tt>NOT (Counter IN [MinValue..MaxValue])</tt></dt> ! 3998: <dd>the box is created only if the value of the counter does not fall in ! 3999: the range bounded by MinValue and MaxValue (inclusive).</dd> 1.18 cvs 4000: </dl> 1.30 ! cvs 4001: ! 4002: <p><strong>Note:</strong> the <tt>NOT Even</tt> and <tt>NOT Odd</tt> ! 4003: conditions are syntactically correct but can be expressed more simply by ! 4004: <tt>Odd</tt> and <tt>Even</tt>, respectively.</p> 1.18 cvs 4005: </div> 4006: </div> 1.1 cvs 4007: 1.18 cvs 4008: <div class="subsection"> 1.30 ! cvs 4009: <h3><a name="sectc4215">A presentation rule</a></h3> 1.1 cvs 4010: 1.30 ! cvs 4011: <p>A presentation rule defines either a presentation parameter or presentation 1.18 cvs 4012: function. The parameters are:</p> 4013: <ul> 1.30 ! cvs 4014: <li>the position of the vertical and horizontal reference axes of the ! 4015: box,</li> ! 4016: <li>the position of the box in relation to other boxes,</li> ! 4017: <li>the height or width of the box, with overflow exceptions,</li> ! 4018: <li>the margins, padding and borders of the box,</li> ! 4019: <li>the characteristics of the lines contained in the box: linespacing, ! 4020: indentation of the first line, justification, hyphenation,</li> ! 4021: <li>the conditions for breaking the box across pages,</li> ! 4022: <li>the characteristics of the characters contained in the box: size, font, ! 4023: style, underlining,</li> ! 4024: <li>the depth of the box among overlapping boxes (often called stacking ! 4025: order),</li> ! 4026: <li>the characteristics of graphic elements contained in the box: style and ! 4027: thickness of lines, fill pattern for closed objects,</li> ! 4028: <li>the colors in text, graphics, pictures, and symbols contained in the box ! 4029: are displayed or printed,</li> ! 4030: <li>for presentation boxes only, the contents of the box.</li> ! 4031: </ul> ! 4032: ! 4033: <p>The <a name="presfunct">presentation functions</a> are:</p> ! 4034: <ul> ! 4035: <li>the creation of a presentation box</li> ! 4036: <li>the line-breaking or page-breaking style,</li> ! 4037: <li>the copying of another box,</li> ! 4038: <li>the display of the box background and border,</li> ! 4039: <li>the display of a background picture and its aspect.</li> ! 4040: </ul> ! 4041: ! 4042: <p>For each box and each view, every presentation parameter is defined once ! 4043: and only once, either explicitly or by the <a href="#sectc427">default ! 4044: rules</a>. In contrast, presentation functions are not obligatory and can ! 4045: appear many times for the same element. for example an element can create ! 4046: many presentation boxes. Another element may not use any presentation 1.18 cvs 4047: functions.</p> 1.30 ! cvs 4048: ! 4049: <p>Each rule defining a presentation parameter begins with a keyword followed ! 4050: by a colon. The keyword indicates the parameter which is the subject of the 1.18 cvs 4051: rule. After the keyword and the colon, the remainder of the rule varies. All 4052: rules are terminated by a semicolon.</p> 4053: <pre> Rule = PresParam ';' / PresFunc ';' . 1.6 cvs 4054: PresParam ='VertRef' ':' PositionHoriz / 4055: 'HorizRef' ':' PositionVert / 4056: 'VertPos' ':' VPos / 4057: 'HorizPos' ':' HPos / 4058: 'Height' ':' Dimension / 4059: 'Width' ':' Dimension / 4060: 'VertOverflow' ':' Boolean / 1.1 cvs 4061: 'HorizOverflow' ':' Boolean / 1.26 cvs 4062: 'MarginTop' ':' MarginWidth / 4063: 'MarginRight' ':' MarginWidth / 4064: 'MarginBottom' ':' MarginWidth / 4065: 'MarginLeft' ':' MarginWidth / 4066: 'PaddingTop' ':' PaddingWidth / 4067: 'PaddingRight' ':' PaddingWidth / 4068: 'PaddingBottom' ':' PaddingWidth / 4069: 'PaddingLeft' ':' PaddingWidth / 4070: 'BorderTopWidth' ':' BorderWidth / 4071: 'BorderRightWidth' ':' BorderWidth / 4072: 'BorderBottomWidth' ':' BorderWidth / 4073: 'BorderLeftWidth' ':' BorderWidth / 4074: 'BorderTopColor' ':' BorderColor / 4075: 'BorderRightColor' ':' BorderColor / 4076: 'BorderBottomColor' ':' BorderColor / 4077: 'BorderLeftColor' ':' BorderColor / 4078: 'BorderTopStyle' ':' BorderStyle / 4079: 'BorderRightStyle' ':' BorderStyle / 4080: 'BorderBottomStyle' ':' BorderStyle / 4081: 'BorderLeftStyle' ':' BorderStyle . 1.6 cvs 4082: 'LineSpacing' ':' DistanceInherit / 4083: 'Indent' ':' DistanceInherit / 4084: 'Adjust' ':' AdjustInherit / 4085: 'Justify' ':' BoolInherit / 4086: 'Hyphenate' ':' BoolInherit / 4087: 'PageBreak' ':' Boolean / 4088: 'LineBreak' ':' Boolean / 4089: 'InLine' ':' Boolean / 4090: 'NoBreak1' ':' AbsDist / 4091: 'NoBreak2' ':' AbsDist / 4092: 'Gather' ':' Boolean / 4093: 'Visibility' ':' NumberInherit / 4094: 'Size' ':' SizeInherit / 4095: 'Font' ':' NameInherit / 4096: 'Style' ':' StyleInherit / 1.23 cvs 4097: 'Weight' ':' WeightInherit / 1.6 cvs 4098: 'Underline' ':' UnderLineInherit / 4099: 'Thickness' ':' ThicknessInherit / 4100: 'Depth' ':' NumberInherit / 4101: 'LineStyle' ':' LineStyleInherit / 4102: 'LineWeight' ':' DistanceInherit / 4103: 'FillPattern' ':' NameInherit / 4104: 'Background' ':' NameInherit / 1.13 cvs 4105: 'Foreground' ':' NameInherit / 1.6 cvs 4106: 'Content' ':' VarConst . 1.1 cvs 4107: PresFunc = Creation '(' BoxID ')' / 4108: 'Line' / 4109: 'NoLine' / 4110: 'Page' '(' BoxID ')' / 1.13 cvs 4111: 'Copy' '(' BoxTypeToCopy ')' / 4112: 'ShowBox' / 1.18 cvs 4113: 'BackgroundPicture' ':' FileName / 4114: 'PictureMode' ':' PictMode /</pre> 4115: </div> 4116: 4117: <div class="subsection"> 1.30 ! cvs 4118: <h3><a name="sectc4216">Box axes</a></h3> 1.18 cvs 4119: 1.30 ! cvs 4120: <p>The position of the middle axes <tt>VMiddle</tt> and <tt>HMiddle</tt> in 1.1 cvs 4121: relation to their box is always calculated automatically as a function of the 4122: height and width of the box and is not specified by the presentation rules. In 4123: the presentation schema, these middle axes are used only to position their box 4124: with respect to another by specifying the distance between the middle axis and 1.18 cvs 4125: an axis or a side of another box (see the <a href="#sectc4218">relative 4126: position</a>).</p> 1.30 ! cvs 4127: ! 4128: <p>The reference axes of a box are also used to position their box in relation ! 4129: to another, but in contrast to the middle axes, the presentation schema must ! 4130: make their position explicit, either in relation to a side or the middle axis ! 4131: of the box itself, or in relation to an axis of an enclosed box.</p> ! 4132: ! 4133: <p>Only boxes of base elements have predefined reference axes. For character 1.1 cvs 4134: string boxes, the horizontal reference axis is the baseline of the characters 4135: (the line which passes immediately under the upper-case letters, ignoring the 4136: letter Q) and the vertical reference axis is at the left edge of the first 1.18 cvs 4137: character of the string.</p> 1.30 ! cvs 4138: ! 4139: <p>The positions of a box's reference axes are defined by the <tt>VertRef</tt> 1.18 cvs 4140: and <tt>HorizRef</tt> rules which specify the <a href="#distance">distance</a> 1.1 cvs 4141: between the reference axis and an axis or parallel side of the same box or of 1.18 cvs 4142: an enclosed box.</p> 4143: <pre> 'VertRef' ':' PositionHoriz 4144: 'HorizRef' ':' PositionVert</pre> 1.30 ! cvs 4145: 1.18 cvs 4146: <blockquote class="example"> 1.30 ! cvs 4147: <p><strong>Example:</strong></p> ! 4148: ! 4149: <p>If, in the structure schema for mathematical formulas, the fraction ! 4150: element is defined by</p> ! 4151: <pre>Fraction = BEGIN 1.1 cvs 4152: Numerator = Expression; 4153: Denominator = Expression; 1.18 cvs 4154: END;</pre> 1.30 ! cvs 4155: ! 4156: <p>then the horizontal reference axis of the fraction can be positioned on ! 4157: top of the denominator by the rule:</p> ! 4158: <pre>Fraction : 1.1 cvs 4159: BEGIN 4160: HorizRef : Enclosed Denominator . Top; 4161: ... 1.18 cvs 4162: END;</pre> 1.30 ! cvs 4163: ! 4164: <p>To put the horizontal reference axis of a column at its middle:</p> ! 4165: <pre>Column : 1.1 cvs 4166: BEGIN 4167: HorizRef : * . HMiddle; 4168: ... 1.18 cvs 4169: END;</pre> 4170: </blockquote> 4171: </div> 1.1 cvs 4172: 1.18 cvs 4173: <div class="subsection"> 1.30 ! cvs 4174: <h3><a name="sectc4217">Distance units</a></h3> 1.1 cvs 4175: 1.30 ! cvs 4176: <p>Some distances and dimensions appear in many rules of a presentation ! 4177: schema, especially in position rules (<tt>VertPos, HorizPos</tt>), in extent ! 4178: rules for boxes (<tt>Height, Width</tt>), in rules defining lines ! 4179: (<tt>LineSpacing, Indent</tt>), in rules controlling pagination (<tt>NoBreak1, ! 4180: NoBreak2</tt>) and in rules specifying the thickness of strokes ! 4181: (<tt>LineWeight</tt>).</p> ! 4182: ! 4183: <p>In all these rules, the distance or extent can be expressed</p> ! 4184: <ul> ! 4185: <li>either in relative units, which depend on the size of the characters in ! 4186: the current font: height of the element's font or height of the letter ! 4187: 'x',</li> ! 4188: <li>or in absolute units: centimeter, millimeter, inch, typographer's point, ! 4189: pica or pixel.</li> ! 4190: </ul> ! 4191: ! 4192: <p>Units can be chosen freely. Thus, it is possible to use relative units in ! 4193: one rule, centimeters in the next rule, and typographer's points in ! 4194: another.</p> ! 4195: ! 4196: <p>Absolute units are used to set rigid rules for the appearance of documents. ! 4197: In contrast, relative units allow changes of scale. The editor lets the value ! 4198: of relative units be changed dynamically. Such changes affect every box using 1.1 cvs 4199: relative units simultaneously and in the same proportion. Changing the value 4200: of the relative units affects the size of the characters and graphical 1.18 cvs 4201: elements, and the size of the boxes and the distances between them.</p> 1.30 ! cvs 4202: ! 4203: <p>A <a name="distance">distance</a> or extent is specified by a number, which 1.1 cvs 4204: may be followed by one or more spaces and a units keyword. When there is no 4205: units keyword, the number specifies the number of relative units, where a 4206: relative unit is the height of a character in the current font (an em). When 4207: the number is followed by a units keyword, the keyword indicates the type of 1.18 cvs 4208: absolute units:</p> 4209: <ul> 1.30 ! cvs 4210: <li><tt>em</tt>: height of the element's font,</li> ! 4211: <li><tt>ex</tt>: height of the letter 'x',</li> ! 4212: <li><tt>cm</tt>: centimeter,</li> ! 4213: <li><tt>mm</tt>: millimeter,</li> ! 4214: <li><tt>in</tt>: inch (1 in = 2.54 cm),</li> ! 4215: <li><tt>pt</tt>: point (1 pt = 1/72 in),</li> ! 4216: <li><tt>pc</tt>: pica (1 pc = 12 pt),</li> ! 4217: <li><tt>px</tt>: pixel.</li> 1.18 cvs 4218: </ul> 1.30 ! cvs 4219: ! 4220: <p>Whatever the chosen unit, relative or absolute, the number is not ! 4221: necessarily an integer and may be expressed in fixed point notation (using the ! 4222: American convention of a period to express the decimal point).</p> ! 4223: ! 4224: <p>If the distance appears in a presentation rule for a numeric attribute, the 1.1 cvs 4225: number can be replaced by the name of an attribute. In this case, the value 4226: of the attribute is used. Obviously, the attribute name cannot be followed by 4227: a decimal point and a fractional part, but it can be followed a units keyword. 1.18 cvs 4228: However, the choice of units is limited to em, ex, pt and px.</p> 4229: <pre> Distance = [ Sign ] AbsDist . 1.1 cvs 4230: Sign ='+' / '-' . 4231: AbsDist = IntegerOrAttr [ '.' DecimalPart ] 4232: [ Unit ]. 4233: IntegerOrAttr = IntegerPart / AttrID . 4234: IntegerPart = NUMBER . 4235: DecimalPart = NUMBER . 4236: Unit ='em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' / 1.18 cvs 4237: 'pc' / 'px' / '%' .</pre> 1.30 ! cvs 4238: 1.18 cvs 4239: <blockquote class="example"> 1.30 ! cvs 4240: <p><strong>Example:</strong></p> ! 4241: ! 4242: <p>The following rules specify that a box has a height of 10.5 centimeters ! 4243: and a width of 5.3 ems:</p> ! 4244: <pre>Height : 10.5 cm; 1.18 cvs 4245: Width : 5.3;</pre> 4246: </blockquote> 4247: </div> 1.1 cvs 4248: 1.18 cvs 4249: <div class="subsection"> 1.30 ! cvs 4250: <h3><a name="sectc4218">Relative positions</a></h3> 1.1 cvs 4251: 1.30 ! cvs 4252: <p>The positioning of boxes uses the eight axes and sides, the sides generally 1.1 cvs 4253: being used to define the juxtapositioning (vertical or horizontal) of boxes, 4254: the middle axes being used to define centering, and the reference axes being 1.18 cvs 4255: used for alignment.</p> 1.30 ! cvs 4256: ! 4257: <p>Two rules allow a box to be placed relative to other boxes. The 1.18 cvs 4258: <tt>VertPos</tt> rule positions the box vertically. The <tt>HorizPos</tt> 4259: rule positions the box horizontally. It is possible that a box's position 4260: could be entirely determined by other boxes positioned relative to it. In this 4261: case, the position is implicit and the word <tt>nil</tt> can be used to 4262: specify that no position rule is needed. Otherwise, an explicit rule must be 4263: given by indicating the axis or side which defines the position of the box, 4264: followed by an equals sign and the distance between between this axis or side 4265: and a parallel axis or side of another box, called the reference box. The box 4266: for which the rule is written will be positioned relative to the reference 4267: box.</p> 4268: <pre> 'VertPos' ':' VPos 1.6 cvs 4269: 'HorizPos' ':' HPos 4270: HPos = 'nil' / VertAxis '=' HorizPosition 4271: [ 'UserSpecified' ]. 4272: VPos = 'nil' / HorizAxis '=' VertPosition 4273: [ 'UserSpecified' ]. 1.1 cvs 4274: VertAxis = 'Left' / 'VMiddle' / 'VRef' / 'Right' . 1.18 cvs 4275: HorizAxis = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' .</pre> 1.30 ! cvs 4276: ! 4277: <p>The reference box is an adjacent box: enclosing, enclosed or adjacent. When ! 4278: a rule is associated with a reference type attribute (and only in this case), ! 4279: it can be a box of the element designated by the attribute. The reference box 1.18 cvs 4280: can be either a presentation box previously defined in the <tt>BOXES</tt> 1.1 cvs 4281: section of the schema and created by a creation function, or the box 1.18 cvs 4282: associated with a structured element.</p> 1.30 ! cvs 4283: ! 4284: <p>The structural position of the reference box (relative to the box for which 1.18 cvs 4285: the rule is being written) is indicated by a keyword: <tt>Enclosing</tt>, 4286: <tt>Enclosed</tt>, or, for sibling boxes, <tt>Previous</tt> or <tt>Next</tt>. 1.1 cvs 4287: The reference attributes, or presentation boxes created by a reference 1.18 cvs 4288: attribute, the <tt>Referred</tt> keyword may be used to designate the element 4289: which the reference points to. The keyword <tt>Creator</tt> can be used in 1.1 cvs 4290: rules for presentation boxes to designate the box of the element which created 1.18 cvs 4291: the presentation box. Finally, the <tt>Root</tt> keyword can be used to 4292: designate the root of the document.</p> 1.30 ! cvs 4293: ! 4294: <p>When the keyword is ambiguous, it is followed by the name of an element ! 4295: type or presentation box which resolves the ambiguity (the <tt>Creator</tt> ! 4296: and <tt>Root</tt> keywords are never ambiguous). If this name is not given, ! 4297: then the first box encountered is used as the reference box. It is also ! 4298: possible to use just the name of an element type or presentation box without ! 4299: an initial keyword. In this case, a sibling having that name will be used. If ! 4300: the name is preceded by the keyword <tt>NOT</tt>, then the reference box will ! 4301: be the first box whose type is not the named one.</p> ! 4302: ! 4303: <p>In place of the box or type name, the keywords <tt>AnyElem</tt>, 1.18 cvs 4304: <tt>AnyBox</tt> and <tt>ElemWithAttr</tt> can be used, representing 1.17 cvs 4305: respectively, any structured element box, any presentation box, and the box 4306: corresponding to any structured element having a particular attribute, 4307: whatever its value; the name of this attribute must follow the keyword 1.18 cvs 4308: <tt>ElemWithAttr</tt>.</p> 1.30 ! cvs 4309: ! 4310: <p>A type name may be preceded by a star in order to resolve the ambiguity in ! 4311: the special case where the structure schema defines an <a 1.18 cvs 4312: href="#sectd3284">inclusion</a> without expansion (or with partial expansion) 4313: of the same type as an element of the scheme. For mark pairs (and only for <a 4314: href="#sectd3285">mark pairs</a>) the type name <em>must</em> be preceded by 4315: the <tt>First</tt> or <tt>Second</tt> keyword, which indicates which of the 4316: two marks of the pair should be used as the reference box.</p> 1.30 ! cvs 4317: ! 4318: <p>The star character ('<tt>*</tt>') used alone designates the box to which ! 4319: the rule applies (in this case, it is obviously useless to specify the type of ! 4320: the reference box).</p> ! 4321: ! 4322: <p>The keywords <tt>Enclosing</tt> and <tt>Enclosed</tt> can be used no matter 1.1 cvs 4323: what constructor defines the type to which the rule applies. When applied to 1.18 cvs 4324: the element which represents the entire document, <tt>Enclosing</tt> 1.1 cvs 4325: designates the window or page in which the document's image is displayed for 4326: the view to which the rule applies. A box or type name without a keyword is 4327: used for aggregate elements and designates another element of the same 4328: aggregate. It can also be used to designate a presentation or page layout 1.18 cvs 4329: box. The keywords <tt>Previous</tt> and <tt>Next</tt> are primarily used to 1.1 cvs 4330: denote list elements, but can also be used to denote elements of an 1.18 cvs 4331: aggregate.</p> 1.30 ! cvs 4332: ! 4333: <p>In the position rule, the structural position relative to the reference box ! 4334: is followed, after a period, by the name of an axis or side. The rule ! 4335: specifies its node's position as being some distance from this axis or side of ! 4336: the reference box. If this distance is zero, then the distance does not ! 4337: appear in the rule. Otherwise, it does appear as a positive or negative ! 4338: number (the sign is required for negative numbers). The sign takes into ! 4339: account the orientation of the coordinate axes: for top to bottom for the ! 4340: vertical axis and from left to right for the horizontal axis. Thus, a ! 4341: negative distance in a vertical position indicates that the side or axis ! 4342: specified in the rule is above the side or axis of the reference box.</p> ! 4343: ! 4344: <p>The distance can be followed by the <tt>UserSpecified</tt> keyword (even if 1.18 cvs 4345: the distance is nil and does not appear, the <tt>UserSpecified</tt> keyword 1.1 cvs 4346: can be used). It indicates that when the element to which the rule applies is 4347: being created, the editor will ask the user to specify the distance himself, 4348: using the mouse. In this case, the distance specified in the rule is a 4349: default distance which is suggested to the user but can be modified. The 1.18 cvs 4350: <tt>UserSpecified</tt> keyword can be used either in the vertical position 4351: rule, the horizontal position rule, or both.</p> 4352: <pre> VertPosition = Reference '.' HorizAxis [ Distance ] . 1.1 cvs 4353: HorizPosition = Reference '.' VertAxis [ Distance ] . 4354: Reference ='Enclosing' [ BoxTypeNot ] / 4355: 'Enclosed' [ BoxTypeNot ] / 4356: 'Previous' [ BoxTypeNot ] / 4357: 'Next' [ BoxTypeNot ] / 4358: 'Referred' [ BoxTypeNot ] / 4359: 'Creator' / 4360: 'Root' / 4361: '*' / 4362: BoxOrType . 4363: BoxOrType = BoxID / 4364: [ '*' ] [ FirstSec ] ElemID / 1.17 cvs 4365: 'AnyElem' / 'AnyBox' / 4366: 'ElemWithAttr' AttrID . 1.18 cvs 4367: BoxTypeNot = [ 'NOT' ] BoxOrType .</pre> 1.30 ! cvs 4368: 1.18 cvs 4369: <blockquote class="example"> 1.30 ! cvs 4370: <p><strong>Example:</strong></p> ! 4371: ! 4372: <p>If a <a name="expos1">report</a> is defined by the following structure ! 4373: schema:</p> ! 4374: <pre>Report = BEGIN 1.6 cvs 4375: Title = Text; 4376: Summary = Text; 4377: Keywords = Text; 4378: ... 1.18 cvs 4379: END;</pre> 1.30 ! cvs 4380: ! 4381: <p>then the presentation schema could contain the rules:</p> ! 4382: <pre>Report : BEGIN 1.6 cvs 4383: VertPos : Top = Enclosing . Top; 4384: HorizPos : Left = Enclosing . Left; 4385: ... 1.18 cvs 4386: END;</pre> 1.30 ! cvs 4387: ! 4388: <p>These rules place the <a name="reportexample">report</a> in the upper ! 4389: left corner of the enclosing box, which is the window in which the document ! 4390: is being edited.</p> ! 4391: <pre>Title : BEGIN 1.6 cvs 4392: VertPos : Top = Enclosing . Top + 1; 4393: HorizPos : VMiddle = Enclosing . VMiddle; 4394: ... 1.18 cvs 4395: END;</pre> 1.30 ! cvs 4396: ! 4397: <p>The top of the title is one line (a line has the height of the characters ! 4398: of the title) from the top of the report, which is also the top of the ! 4399: editing window. The title is centered horizontally in the window (see <a ! 4400: href="#posdim">figure</a>).</p> ! 4401: <pre>Summary : BEGIN 1.1 cvs 4402: VertPos : Top = Title . Bottom + 1.5; 4403: HorizPos : Left = Enclosing . Left + 2 cm; 4404: ... 1.18 cvs 4405: END;</pre> 1.30 ! cvs 4406: ! 4407: <p>The top of the summary is place a line and a half below the bottom of the ! 4408: title and is shifted two centimeters from the side of the window.</p> 1.18 cvs 4409: </blockquote> 1.30 ! cvs 4410: 1.18 cvs 4411: <blockquote class="example"> 1.30 ! cvs 4412: <p><strong>Example:</strong></p> ! 4413: ! 4414: <p>Suppose there is a <a name="expos2">Design</a> logical structure which ! 4415: contains graphical elements:</p> ! 4416: <pre>Design = LIST OF (ElemGraph = GRAPHICS);</pre> ! 4417: ! 4418: <p>The following rules allow the user to freely choose the position of each ! 4419: element when it is created:</p> ! 4420: <pre>ElemGraph = 1.1 cvs 4421: BEGIN 4422: VertPos : Top = Enclosing . Top + 1 cm UserSpecified; 4423: HorizPos: Left = Enclosing . Left UserSpecified; 4424: ... 1.18 cvs 4425: END;</pre> 1.30 ! cvs 4426: ! 4427: <p>Thus, when a graphical element is created, its default placement is at ! 4428: the left of the window and 1 cm from the top, but the user can move it ! 4429: immediately, simply by moving the mouse.</p> 1.18 cvs 4430: </blockquote> 4431: </div> 1.1 cvs 4432: 1.18 cvs 4433: <div class="subsection"> 1.30 ! cvs 4434: <h3><a name="sectc4219">Box extents</a></h3> 1.1 cvs 4435: 1.30 ! cvs 4436: <p>The extents (height and width) of each box are defined by the two rules 1.18 cvs 4437: <tt>Height</tt> and <tt>Width</tt>. There are three types of extents: fixed, 4438: relative, and elastic.</p> 1.1 cvs 4439: 1.18 cvs 4440: <div class="subsubsection"> 1.30 ! cvs 4441: <h4><a name="sectd42191">Fixed extents</a></h4> 1.1 cvs 4442: 1.30 ! cvs 4443: <p>A fixed dimension sets the height or width of the box independently of all 1.18 cvs 4444: other boxes. It is expressed in <a href="#sectc4217">distance units</a>. The 4445: extent can be followed by the <tt>UserSpecified</tt> keyword which indicates 1.1 cvs 4446: that when the element to which the rule applies is being created, the editor 4447: will ask the user to specify the extent himself, using the mouse. In this 4448: case, the extent specified in the rule is a default extent which is suggested 1.18 cvs 4449: to the user but can be modified. The <tt>UserSpecified</tt> keyword can be 4450: used either in the <tt>Height</tt> rule, the <tt>Width</tt> rule, or both.</p> 1.30 ! cvs 4451: ! 4452: <p>A fixed extent rule can be ended by the <tt>Min</tt> keyword, which ! 4453: signifies that the indicated value is a minimum, and that, if the contents of ! 4454: the box require it, a larger extent is possible.</p> 1.18 cvs 4455: <pre> 'Height' ':' Dimension 1.1 cvs 4456: 'Width' ':' Dimension 4457: Dimension = AbsDist [ 'UserSpecified' ] [ 'Min' ] / 1.18 cvs 4458: ...</pre> 1.30 ! cvs 4459: 1.18 cvs 4460: <blockquote class="example"> 1.30 ! cvs 4461: <p><strong>Example:</strong></p> ! 4462: ! 4463: <p>Continuing with the <a href="#expos2">previous example</a>, it is ! 4464: possible to allow the user to choose the size of each graphical element as ! 4465: it is created:</p> ! 4466: <pre>ElemGraph : BEGIN 1.6 cvs 4467: Width : 2 cm UserSpecified; 1.1 cvs 4468: Height : 1 cm UserSpecified; 4469: ... 1.18 cvs 4470: END;</pre> 1.30 ! cvs 4471: ! 4472: <p>Thus, when a graphical element is create, it is drawn by default with a ! 4473: width of 2 cm and a height of 1 cm, but the user is free to resize it ! 4474: immediately with the mouse.</p> ! 4475: <pre>Summary : BEGIN 1.1 cvs 4476: Height : 5 cm Min; 4477: ... 4478: END; 4479: Keywords : BEGIN 4480: VertPos : Top = Summary . Bottom; 4481: ... 1.18 cvs 4482: END;</pre> 4483: </blockquote> 4484: </div> 1.1 cvs 4485: 1.18 cvs 4486: <div class="subsubsection"> 1.30 ! cvs 4487: <h4><a name="sectd42192">Relative extents</a></h4> ! 4488: ! 4489: <p>A relative extent determines the extent as a function of the extent of ! 4490: another box, just as a relative position places a box in relation to another. ! 4491: The reference box in an extent rule is designated using the same syntax as is ! 4492: used in a relative position rule. It is followed by a period and a ! 4493: <tt>Height</tt> or <tt>Width</tt> keyword, depending on the extent being ! 4494: referred to. Next comes the relation between the extent being defined and the ! 4495: extent of the reference box. This relation can be either a percentage or a ! 4496: difference.</p> 1.1 cvs 4497: 1.30 ! cvs 4498: <p>A percentage is indicated by a star (the multiplication symbol) followed by 1.1 cvs 4499: the numeric percentage value (which may be greater than or less than 100) and 4500: the percent (`%') character. A difference is simply indicated by a signed 1.18 cvs 4501: difference.</p> 1.30 ! cvs 4502: ! 4503: <p>If the rule appears in the presentation rules of a numeric attribute, the 1.1 cvs 4504: percentage value can be replaced by the name of the attribute. This attribute 1.18 cvs 4505: is then used as a percentage. The attribute can also be used as part of a <a 4506: href="#distance">difference</a>.</p> 1.30 ! cvs 4507: ! 4508: <p>Just as with a fixed extent, a relative extent rule can end with the 1.18 cvs 4509: <tt>Min</tt> keyword, which signifies that the extent is a minimum and that, 4510: if the contents of the box require it, a larger extent is possible.</p> 1.30 ! cvs 4511: ! 4512: <p>A special case of relative extent rules is:</p> 1.18 cvs 4513: <pre>Height : Enclosed . Height;</pre> 1.30 ! cvs 4514: ! 4515: <p>or</p> 1.18 cvs 4516: <pre>Width : Enclosed . Width;</pre> 1.30 ! cvs 4517: ! 4518: <p>which specifies that the box has a height (or width) such that it encloses ! 4519: all the boxes which it contains, excluding boxes having a rule ! 4520: <tt>VertOverflow: Yes;</tt> or <tt>HorizOverflow: Yes;</tt>.</p> ! 4521: ! 4522: <p><strong>Note:</strong> character strings (type <tt>TEXT_UNIT</tt>) ! 4523: generally must use the sum of the widths of the characters which compose them ! 4524: as their width, which is expressed by the rule:</p> 1.18 cvs 4525: <pre>TEXT_UNIT : 4526: Width : Enclosed . Width;</pre> 1.30 ! cvs 4527: ! 4528: <p>If this rule is not the default <tt>Width</tt> rule, it must be given 1.18 cvs 4529: explicitly in the <tt>RULES</tt> section which defines the presentation rules 4530: of the logical elements.</p> 4531: <pre> 'Height' ':' Extent 1.1 cvs 4532: 'Width' ':' Extent 4533: Extent = Reference '.' HeightWidth [ Relation ] 4534: [ 'Min' ] / ... 4535: HeightWidth ='Height' / 'Width' . 4536: Relation ='*' ExtentAttr '%' / Distance . 4537: ExtentAttr = ExtentVal / AttrID . 1.18 cvs 4538: ExtentVal = NUMBER .</pre> 1.30 ! cvs 4539: 1.18 cvs 4540: <blockquote class="example"> 1.30 ! cvs 4541: <p><strong>Example:</strong></p> ! 4542: ! 4543: <p>Completing the <a href="#expos1">above example</a>, it is possible to ! 4544: specify that the report takes its width from the editing window and its ! 4545: height from the size of its contents (this can obviously be greater than ! 4546: that of the window):</p> ! 4547: <pre>Report : BEGIN 1.1 cvs 4548: Width : Enclosing . Width; 4549: Height : Enclosed . Height; 4550: ... 1.18 cvs 4551: END;</pre> 1.30 ! cvs 4552: ! 4553: <p>Then, the following rules make the title occupy 60% of the width of the ! 4554: report (which is that of the window) and is broken into centered lines of ! 4555: this width (see the <a href="#sectc4222"><tt>Line</tt> rule</a>).</p> ! 4556: <pre>Title : BEGIN 1.1 cvs 4557: Width : Enclosing . Width * 60%; 4558: Height : Enclosed . Height; 4559: Line; 4560: Adjust : VMiddle; 4561: ... 1.18 cvs 4562: END;</pre> 1.30 ! cvs 4563: ! 4564: <p>The summary occupy the entire width of the window, with the exception of ! 4565: a 2 cm margin reserved by the horizontal position rule:</p> ! 4566: <pre>Summary : BEGIN 1.1 cvs 4567: Width : Enclosing . Width - 2 cm; 4568: Height : Enclosed . Height; 4569: ... 1.18 cvs 4570: END;</pre> 4571: 1.30 ! cvs 4572: <p>This set of rules, plus the <a href="#reportexample">position rules given ! 4573: above</a>, produce the layout of boxes shown in the following<a ! 4574: href="#posdim">figure</a>.</p> ! 4575: ! 4576: <div class="figure"> ! 4577: <hr> ! 4578: <pre>------------------------------------------------------------- 1.1 cvs 4579: | Window and Report ^ | 4580: | | 1 line | 4581: | v | 4582: | ------------------------------------- | 4583: | | | | 4584: : 20% : Title : 20% : 1.30 ! cvs 4585: :<--------->: :<--------->: 1.1 cvs 4586: : : 60% : : 1.30 ! cvs 4587: : :<--------------------------------->: : 1.1 cvs 4588: | | | | 4589: | ------------------------------------- | 4590: | ^ | 4591: | | 1.5 line | 4592: | | | 4593: | v | 4594: | ---------------------------------------------------| 4595: | 2 cm | | 1.30 ! cvs 4596: |<------>| Summary | 1.18 cvs 4597: : : :</pre> 1.19 cvs 4598: 1.30 ! cvs 4599: <p align="center"><em><a name="posdim">Box position and ! 4600: extent</a><em></em></em></p> ! 4601: <hr> ! 4602: </div> 1.18 cvs 4603: </blockquote> 4604: </div> 1.1 cvs 4605: 1.18 cvs 4606: <div class="subsubsection"> 1.30 ! cvs 4607: <h4><a name="sectd42193">Elastic extents</a></h4> 1.1 cvs 4608: 1.30 ! cvs 4609: <p>The last type of extent is the elastic extent. Either one or both extents ! 4610: can be elastic. A box has an elastic extent when two opposite sides are ! 4611: linked by distance constraints to two sides or axes of other boxes.</p> ! 4612: ! 4613: <p>One of the sides of the elastic box is linked by a position rule 1.18 cvs 4614: (<tt>VertPos</tt> or <tt>HorizPos</tt>) to a neighboring box. The other side 4615: is link to another box by a <tt>Height</tt> or <tt>Width</tt> rule, which 1.1 cvs 4616: takes the same form as the position rule. For the elastic box itself, the 4617: notions of sides (left or right, top or bottom) are fuzzy, since the movement 4618: of either one of the two reference boxes can, for example, make the left side 4619: of the elastic box move to the right of its right side. This is not 4620: important. The only requirement is that the two sides of the elastic box used 1.18 cvs 4621: in the position and extent rule are opposite sides of the box.</p> 4622: <pre> 'Height' ':' Extent 1.6 cvs 4623: 'Width' ':' Extent 1.18 cvs 4624: Extent = HPos / VPos / ...</pre> 1.30 ! cvs 4625: 1.18 cvs 4626: <blockquote class="example"> 1.30 ! cvs 4627: <p><strong>Example:</strong></p> ! 4628: ! 4629: <p>Suppose we want to draw an elastic arrow or line between the middle of ! 4630: the bottom side of box A and the upper left corner of box B. To do this, we ! 4631: would define a graphics box whose upper left corner coincides with the ! 4632: middle of the bottom side of A (a position rule) and whose lower right ! 4633: corner coincides with with the upper left corner of B (dimension rules):</p> ! 4634: <pre>LinkedBox : 1.1 cvs 4635: BEGIN 1.6 cvs 4636: VertPos : Top = A .Bottom; 1.1 cvs 4637: HorizPos : Left = A . VMiddle; 1.6 cvs 4638: Height : Bottom = B . Top; 4639: Width : Right = B . Left; 1.18 cvs 4640: END;</pre> 4641: </blockquote> 1.30 ! cvs 4642: 1.18 cvs 4643: <blockquote class="example"> 1.30 ! cvs 4644: <p><strong>Example:</strong></p> ! 4645: ! 4646: <p>The element SectionTitle creates a presentation box called SectionNum ! 4647: which contains the number of the section. Suppose we want to align the ! 4648: SectionNum and SectionTitle horizontally, have the SectionNum take its width ! 4649: from its contents (the section number), have the SectionTitle box begin 0.5 ! 4650: cm to the right of the SectionNum box and end at the right edge of its ! 4651: enclosing box. This would make the SectionTitle box elastic, since its width ! 4652: is defined by the position of its left and right sides. The following rules ! 4653: produce this effect:</p> ! 4654: <pre>SectionNum : 1.1 cvs 4655: BEGIN 4656: HorizPos : Left = Enclosing . Left; 4657: Width : Enclosed . Width; 4658: ... 4659: END; 4660: 4661: SectionTitle : 4662: BEGIN 4663: HorizPos : Left = SectionNum . Right + 0.5 cm; 4664: Width : Right = Enclosing . Right; 4665: ... 1.18 cvs 4666: END;</pre> 4667: </blockquote> 4668: </div> 4669: </div> 1.1 cvs 4670: 1.18 cvs 4671: <div class="subsection"> 1.30 ! cvs 4672: <h3><a name="sectc4220">Overflow</a></h3> 1.1 cvs 4673: 1.30 ! cvs 4674: <p>A boxes corresponding to a structural element normally contain all boxes 1.1 cvs 4675: corresponding to the elements of its subtree. However, in some cases, it 4676: could be necessary to allow a box to jut out from its parent box. Two 4677: presentation rules indicate that such an overflow is allowed, one for 1.18 cvs 4678: horizontal overflow, one for vertical overflow.</p> 1.30 ! cvs 4679: ! 4680: <p>Each of these rules is expressed by a keyword followed by a colon and the 1.18 cvs 4681: keyword <tt>Yes</tt> or <tt>No</tt>.</p> 4682: <pre> 'VertOverflow' ':' Boolean / 1.1 cvs 4683: 'HorizOverflow' ':' Boolean . 1.18 cvs 4684: Boolean = 'Yes' / 'No' .</pre> 4685: </div> 1.1 cvs 4686: 1.30 ! cvs 4687: <p>@@@@@ ******</p> ! 4688: 1.26 cvs 4689: <p>Explain Margin, Padding and Border. Refer to CSS2.</p> 4690: <pre> 'MarginTop' ':' MarginWidth / 4691: 'MarginRight' ':' MarginWidth / 4692: 'MarginBottom' ':' MarginWidth / 4693: 'MarginLeft' ':' MarginWidth / 4694: 'PaddingTop' ':' PaddingWidth / 4695: 'PaddingRight' ':' PaddingWidth / 4696: 'PaddingBottom' ':' PaddingWidth / 4697: 'PaddingLeft' ':' PaddingWidth / 4698: 'BorderTopWidth' ':' BorderWidth / 4699: 'BorderRightWidth' ':' BorderWidth / 4700: 'BorderBottomWidth' ':' BorderWidth / 4701: 'BorderLeftWidth' ':' BorderWidth / 4702: 'BorderTopColor' ':' BorderColor / 4703: 'BorderRightColor' ':' BorderColor / 4704: 'BorderBottomColor' ':' BorderColor / 4705: 'BorderLeftColor' ':' BorderColor / 4706: 'BorderTopStyle' ':' BorderStyle / 4707: 'BorderRightStyle' ':' BorderStyle / 4708: 'BorderBottomStyle' ':' BorderStyle / 4709: 'BorderLeftStyle' ':' BorderStyle . 4710: 4711: MarginWidth = InheritParent / 'Auto' / Distance . 4712: PaddingWidth = InheritParent / Distance . 4713: BorderWidth = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance . 4714: BorderColor = InheritParent / 'Transparent' / 'Foreground' / 4715: ColorName . 4716: BorderStyle = InheritParent / 4717: 'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' / 4718: 'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' . 1.27 cvs 4719: InheritParent = 'Enclosing' '=' / 'Creator' '=' . 1.26 cvs 4720: ColorName = NAME .</pre> 1.30 ! cvs 4721: ! 4722: <p>@@@@@ ******</p> 1.26 cvs 4723: 1.18 cvs 4724: <div class="subsection"> 1.30 ! cvs 4725: <h3><a name="sectc4221">Inheritance</a></h3> 1.1 cvs 4726: 1.30 ! cvs 4727: <p>A presentation parameter can be defined by reference to the same parameter ! 4728: of another box in the tree of boxes. These structural links are expressed by 1.1 cvs 4729: kinship. The reference box can be that of the element immediately above in 1.18 cvs 4730: the structure (<tt>Enclosing</tt>), two levels above (<tt>GrandFather</tt>), 4731: immediately below (<tt>Enclosed</tt>) or immediately before 4732: (<tt>Previous</tt>). In the case of a presentation box, and only in that 1.1 cvs 4733: case, the reference box may be the element which created the presentation box 1.18 cvs 4734: (<tt>Creator</tt>).</p> 1.30 ! cvs 4735: ! 4736: <p>Kinship is expressed in terms of the logical structure of the document and ! 4737: not in terms of the tree of boxes. The presentation box cannot transmit any ! 4738: of their parameters by inheritance; only structured element boxes can do so. ! 4739: As an example, consider an element B which follows an element A in the logical 1.1 cvs 4740: structure. The element B creates a presentation box P in front of itself, 1.18 cvs 4741: using the <tt>CreateBefore</tt> rule (see the <a href="#sectc4232">creation 4742: rules</a>). If element B's box inherits its character style using the 4743: <tt>Previous</tt> kinship operation, it gets its character style from A's box, 1.1 cvs 4744: not from P's box. Inheritance works differently for positions and extents, 1.18 cvs 4745: which can refer to presentation boxes.</p> 1.30 ! cvs 4746: ! 4747: <p>The inherited parameter value can be the same as that of the reference box. 1.1 cvs 4748: This is indicated by an equals sign. However, for numeric parameters, a 4749: different value can be obtained by adding or subtracting a number from the 4750: reference box's parameter value. Addition is indicated by a plus sign before 4751: the number, while subtraction is specified with a minus sign. The value of a 4752: parameter can also be given a maximum (if the sign is a plus) or minimum (if 1.18 cvs 4753: the sign is a minus).</p> 1.30 ! cvs 4754: ! 4755: <p>If the rule is being applied to a numeric attribute, the number to add or 1.1 cvs 4756: subtract can be replaced by the attribute name. The value of a maximum or 4757: minimum may also be replaced by an attribute name. In these cases, the value 1.18 cvs 4758: of the attribute is used.</p> 4759: <pre> Inheritance = Kinship InheritedValue . 1.6 cvs 4760: Kinship ='Enclosing' / 'GrandFather' / 'Enclosed' / 4761: 'Previous' / 'Creator' . 1.1 cvs 4762: InheritedValue ='+' PosIntAttr [ 'Max' maximumA ] / 1.6 cvs 4763: '-' NegIntAttr [ 'Min' minimumA ] / 4764: '=' . 4765: PosIntAttr = PosInt / AttrID . 4766: PosInt = NUMBER . 4767: NegIntAttr = NegInt / AttrID . 4768: NegInt = NUMBER . 4769: maximumA = maximum / AttrID . 4770: maximum = NUMBER . 4771: minimumA = minimum / AttrID . 1.18 cvs 4772: minimum = NUMBER .</pre> 1.30 ! cvs 4773: ! 4774: <p>The parameters which can be obtained by inheritance are justification, 1.1 cvs 4775: hyphenation, interline spacing, character font (font family), font style, font 4776: size, visibility, indentation, underlining, alignment of text, stacking order 4777: of objects, the style and thickness of lines, fill pattern and the colors of 1.18 cvs 4778: lines and characters.</p> 4779: </div> 1.1 cvs 4780: 1.18 cvs 4781: <div class="subsection"> 1.30 ! cvs 4782: <h3><a name="sectc4222">Line breaking</a></h3> 1.1 cvs 4783: 1.30 ! cvs 4784: <p>The <tt>Line</tt> rule specifies that the contents of the box should be ! 4785: broken into lines: the boxes included in the box to which this rule is ! 4786: attached are displayed one after the other, from left to right, with their ! 4787: horizontal reference axes aligned so that they form a series of lines. The ! 4788: length of these lines is equal to the width of the box to which the ! 4789: <tt>Line</tt> rule is attached.</p> ! 4790: ! 4791: <p>When an included box overflows the current line, it is either carried ! 4792: forward to the next line, cur, or left the way it is. The <a 1.18 cvs 4793: href="#sectc4223"><tt>LineBreak</tt> rule</a> is used to allow or prevent the 1.1 cvs 4794: breaking of included boxes. If the included box is not breakable but is 4795: longer than the space remaining on the line, it is left as is. When a 4796: character string box is breakable, the line is broken between words or, if 1.18 cvs 4797: necessary, by <a href="#sectd42225">hyphenating a word</a>. When a compound 4798: box is breakable, the box is transparent in regard to line breaking. The boxes 4799: included in the compound box are treated just like included boxes which have 4800: the <tt>LineBreak</tt> rule. Thus, it is possible to traverse a complete 4801: subtree of boxes to line break the text leaves of a complex structure.</p> 1.30 ! cvs 4802: ! 4803: <p>The relative position rules of the included boxes are ignored, since the ! 4804: boxes will be placed according to the line breaking rules.</p> ! 4805: ! 4806: <p>The <tt>Line</tt> rule does not have a parameter. The characteristics of ! 4807: the lines that will be constructed are determined by the <tt>LineSpacing</tt>, 1.18 cvs 4808: <tt>Indent</tt>, <tt>Adjust</tt>, <tt>Justify</tt>, and <tt>Hyphenate</tt> 4809: rules. Moreover, the <a href="#insectd42226"><tt>Inline</tt> rule</a> permits 4810: the exclusion of certain elements from the line breaking process.</p> 1.30 ! cvs 4811: ! 4812: <p>When the <tt>Line</tt> rule appears in the rules sequence of a non-primary 1.18 cvs 4813: view, it applies only to that view, but when the <tt>Line</tt> rule appears in 1.1 cvs 4814: the rules sequence of the primary view, it also applies to the other views by 1.18 cvs 4815: default, except for those views which explicitly invoke the <tt>NoLine</tt> 4816: rule. Thus, the <tt>NoLine</tt> rule can be used in a non-primary view to 4817: override the primary view's <tt>Line</tt> rule. The <tt>NoLine</tt> rule must 4818: not be used with the primary view because the absence of the <tt>Line</tt> 4819: rule has the same effect. Like the <tt>Line</tt> rule, the <tt>NoLine</tt> 4820: rule does not take any parameters.</p> 4821: <pre> 'Line' 4822: 'NoLine'</pre> 4823: 4824: <div class="subsubsection"> 1.30 ! cvs 4825: <h4><a name="sectd42221">Line spacing</a></h4> 1.18 cvs 4826: 1.30 ! cvs 4827: <p>The <tt>LineSpacing</tt> rule defines the line spacing to be used in the ! 4828: line breaking process. The line spacing is the distance between the baselines 1.1 cvs 4829: (horizontal reference axis) of the successive lines produced by the 1.18 cvs 4830: <tt>Line</tt> rule. The value of the line spacing can be specified as a 4831: constant or by inheritance. It is expressed in any of the available <a 4832: href="#sectc4217">distance units</a>.</p> 1.30 ! cvs 4833: ! 4834: <p>Inheritance allows the value to be obtained from a relative in the ! 4835: structure tree, either without change (an equals sign appears after the ! 4836: inheritance keyword), with a positive difference (a plus sign), or a negative ! 4837: difference (a minus sign). When the rule uses a difference, the value of the ! 4838: difference follows the sign and is expressed as a <a ! 4839: href="#sectc4217">distance</a>.</p> 1.18 cvs 4840: <pre> 'LineSpacing' ':' DistOrInherit 1.6 cvs 4841: DistOrInherit = Kinship InheritedDist / Distance . 1.18 cvs 4842: InheritedDist = '=' / '+' AbsDist / '-' AbsDist .</pre> 1.30 ! cvs 4843: ! 4844: <p>When the line spacing value (or its difference from another element) is 1.1 cvs 4845: expressed in relative units, it changes with the size of the characters. Thus, 4846: when a larger font is chosen for a part of the document, the line spacing of 4847: that part expands proportionally. In contrast, when the line spacing value is 4848: expressed in absolute units (centimeters, inches, typographer's points), it is 4849: independent of the characters, which permits the maintenance of a consistent 4850: line spacing, whatever the character font. Either approach can be taken, 1.18 cvs 4851: depending on the desired effect.</p> 4852: </div> 1.1 cvs 4853: 1.18 cvs 4854: <div class="subsubsection"> 1.30 ! cvs 4855: <h4><a name="sectd42222">First line indentation</a></h4> 1.1 cvs 4856: 1.30 ! cvs 4857: <p>The <tt>Indent</tt> rule is used to specify the indentation of the first ! 4858: line of the elements broken into lines by the <tt>Line</tt> function. The 1.1 cvs 4859: indentation determines how far the first line of the element is shifted with 4860: respect to the other lines of the same element. It can be specified as a 4861: constant or by inheritance. The constant value is a positive integer (shifted 4862: to the right; the sign is optional), a negative integer (shifted to the left) 1.18 cvs 4863: or zero (no shift). All available <a href="#sectc4217">units</a> can be 4864: used.</p> 1.30 ! cvs 4865: ! 4866: <p>Indentation can be defined for any box, regardless of whether the box is ! 4867: line broken, and transmitted by inheritance to elements that are line broken. ! 4868: The size of the indentation is specified in the same manner as the <a 1.18 cvs 4869: href="#sectd42221">line spacing</a>.</p> 4870: <pre> 'Indent' ':' DistOrInherit</pre> 4871: </div> 1.1 cvs 4872: 1.18 cvs 4873: <div class="subsubsection"> 1.30 ! cvs 4874: <h4><a name="sectd42223">Alignment</a></h4> 1.1 cvs 4875: 1.30 ! cvs 4876: <p>The alignment style of the lines constructed during line breaking is ! 4877: defined by the <tt>Adjust</tt> rule. The alignment value can be a constant or 1.18 cvs 4878: inherited. A constant value is specified by a keyword:</p> 4879: <ul> 1.30 ! cvs 4880: <li><tt>Left</tt>: at the left edge,</li> ! 4881: <li><tt>Right</tt>: at the right edge,</li> ! 4882: <li><tt>VMiddle</tt>: centered</li> ! 4883: <li><tt>LeftWithDots</tt>: at the left edge with a dotted line filling out ! 4884: the last line up to the right edge of the line breaking box.</li> 1.18 cvs 4885: </ul> 1.30 ! cvs 4886: ! 4887: <p>An inherited value can only be the same as that of the reference box and is 1.18 cvs 4888: specified by a kinship keyword followed by an equals sign.</p> 4889: <pre> 'Adjust' ':' AlignOrInherit 1.1 cvs 4890: AlignOrInherit = Kinship '=' / Alignment . 4891: Alignment = 'Left' / 'Right' / 'VMiddle' / 1.18 cvs 4892: 'LeftWithDots' .</pre> 4893: </div> 1.1 cvs 4894: 1.18 cvs 4895: <div class="subsubsection"> 1.30 ! cvs 4896: <h4><a name="sectd42224">Justification</a></h4> 1.1 cvs 4897: 1.30 ! cvs 4898: <p>The <tt>Justify</tt> rule indicates whether the lines contained in the box ! 4899: and produced by a <tt>Line</tt> rule should be extended horizontally to occupy ! 4900: the entire width of their enclosing box. The first and last lines are treated 1.1 cvs 4901: specially: the position of the beginning of the first line is fixed by the 1.18 cvs 4902: <tt>Indent</tt> rule and last line is not extended. The justification 1.1 cvs 4903: parameter defined by this rule takes a boolean value, which can be a constant 4904: or inherited. A constant boolean value is expressed by either the 1.18 cvs 4905: <tt>Yes</tt> or the <tt>No</tt> keyword. An inherited value can only be the 1.1 cvs 4906: same as that of the reference box and is specified by a kinship keyword 1.18 cvs 4907: followed by an equals sign.</p> 4908: <pre> 'Justify' ':' BoolInherit 1.1 cvs 4909: BoolInherit = Boolean / Kinship '=' . 1.18 cvs 4910: Boolean ='Yes' / 'No' .</pre> 1.30 ! cvs 4911: ! 4912: <p>When the lines are justified, the alignment parameter specified in the 1.18 cvs 4913: <tt>Adjust</tt> rule has no influence, other than on the last line produced. 1.1 cvs 4914: This occurs because, when the other are extended to the limits of the box, the 1.18 cvs 4915: alignment style is no longer perceptible.</p> 1.30 ! cvs 4916: 1.18 cvs 4917: <blockquote class="example"> 1.30 ! cvs 4918: <p><strong>Example:</strong></p> ! 4919: ! 4920: <p>An important use of inheritance is to vary the characteristics of lines ! 4921: for an element type (for example, Paragraph) according to the enclosing ! 4922: environment (for example, Summary or Section), and thus obtain different ! 4923: line breaking styles for the same elements when they appear in different ! 4924: environments. The following rules specify that paragraphs inherit their ! 4925: alignment, justification, and line spacing:</p> ! 4926: <pre>Paragraph : 1.1 cvs 4927: BEGIN 4928: Justify : Enclosing = ; 4929: LineSpacing : Enclosing = ; 4930: Adjust : Enclosing =; 4931: Line; 1.18 cvs 4932: END;</pre> 1.30 ! cvs 4933: ! 4934: <p>If the alignment, justification, and line spacing of the Section and ! 4935: Summary elements is fixed:</p> ! 4936: <pre>Section : 1.1 cvs 4937: BEGIN 4938: Adjust : Left; 4939: Justify : Yes; 4940: LineSpacing : 1; 4941: END; 4942: Summary : 4943: BEGIN 4944: Adjust : VMiddle; 4945: Justify : No; 4946: LineSpacing : 1.3; 1.18 cvs 4947: END;</pre> 1.30 ! cvs 4948: ! 4949: <p>then the paragraphs appearing in sections are justified with a simple ! 4950: line spacing while those appearing in summaries are centered and not ! 4951: justified and have a larger line spacing. These are nevertheless the very ! 4952: same type of paragraph defined in the logical structure schema.</p> 1.18 cvs 4953: </blockquote> 4954: </div> 4955: 4956: <div class="subsubsection"> 1.30 ! cvs 4957: <h4><a name="sectd42225">Hyphenation</a></h4> 1.18 cvs 4958: 1.30 ! cvs 4959: <p>The <tt>Hyphenate</tt> rule indicates whether or not words should be broken ! 4960: by hyphenation at the end of lines. It affects the lines produced by the 1.18 cvs 4961: <tt>Line</tt> rule and contained in the box carrying the <tt>Hyphenate</tt> 4962: rule.</p> 1.30 ! cvs 4963: ! 4964: <p>The hyphenation parameter takes a boolean value, which can be either ! 4965: constant or inherited. A constant boolean value is expressed by either the 1.18 cvs 4966: <tt>Yes</tt> or the <tt>No</tt> keyword. An inherited value can only be the 1.1 cvs 4967: same as that of the reference box and is specified by a kinship keyword 1.18 cvs 4968: followed by an equals sign.</p> 4969: <pre> 'Hyphenate' ':' BoolInherit 1.1 cvs 4970: BoolInherit = Boolean / Kinship '=' . 1.18 cvs 4971: Boolean = 'Yes' / 'No' .</pre> 4972: </div> 4973: 4974: <div class="subsubsection"> 1.30 ! cvs 4975: <h4><a name="sectd42226">Avoiding line breaking</a></h4> 1.18 cvs 4976: 1.30 ! cvs 4977: <p>The <tt>InLine</tt> rule is used to specify that a box that would otherwise 1.18 cvs 4978: participate in line breaking asked for by the <tt>Line</tt> rule of an 1.1 cvs 4979: enclosing box, instead avoids the line breaking process and positions itself 1.18 cvs 4980: according to the <tt>HorizPos</tt> and <tt>VertPos</tt> rules that apply to 4981: it. When the <tt>InLine</tt> rule applies to a box which would not be line 4982: broken, it has no effect.</p> 1.30 ! cvs 4983: ! 4984: <p>The rule is expressed by the <tt>InLine</tt> keyword followed by a colon ! 4985: and the keyword <tt>Yes</tt>, if the box should participate in line breaking, ! 4986: or the keyword <tt>No</tt>, if it should not. This is the only form possible: 1.1 cvs 4987: this rule cannot be inherited. Moreover, it can only appear in the rules of 4988: the primary view and applies to all views defined in the presentation 1.18 cvs 4989: schema.</p> 4990: <pre> 'InLine' ':' Boolean . 4991: Boolean = 'Yes' / 'No' .</pre> 1.30 ! cvs 4992: 1.18 cvs 4993: <blockquote class="example"> 1.30 ! cvs 4994: <p><strong>Example:</strong></p> ! 4995: ! 4996: <p>Suppose the structure schema defines a logical attribute called ! 4997: <tt>New</tt> which is used to identify the passages in a document which were ! 4998: recently modified. It would be nice to have the presentation schema make a ! 4999: bar appear in the left margin next to each passage having the <tt>New</tt> ! 5000: attribute. A new passage can be an entire element, such as a paragraph or ! 5001: section, or it can be some words in the middle of a paragraph. To produce ! 5002: the desired effect, the <tt>New</tt> attribute is given a creation rule ! 5003: which generates a <tt>VerticalBar</tt> presentation box.</p> ! 5004: ! 5005: <p>When the <tt>New</tt> attribute is attached to a character string which ! 5006: is inside a line broken element (inside a paragraph, for example), the bar ! 5007: is one of the elements which participates in line breaking and it is placed ! 5008: normally in the current line, at the end of the character string which has ! 5009: the attribute. To avoid this, the <tt>InLine</tt> rule is used in the ! 5010: following way:</p> ! 5011: <pre>BOXES 1.1 cvs 5012: VerticalBar: 5013: BEGIN 5014: Content: Graphics 'l'; 5015: HorizPos: Left = Root . Left; 5016: VertPos: Top = Creator . Top; 5017: Height: Bottom = Creator . Bottom; 5018: Width: 1 pt; 5019: InLine: No; 5020: ... 5021: END; 5022: ... 5023: ATTRIBUTES 5024: Nouveau: 5025: BEGIN 5026: CreateAfter(VerticalBar); 1.18 cvs 5027: END;</pre> 5028: </blockquote> 5029: </div> 5030: </div> 1.1 cvs 5031: 1.18 cvs 5032: <div class="subsection"> 1.30 ! cvs 5033: <h3><a name="sectc4223">Page breaking and line breaking conditions</a></h3> 1.1 cvs 5034: 1.30 ! cvs 5035: <p>Pages are constructed by the editor in accordance with the model specified ! 5036: by a <a href="#sectc4233"><tt>Page</tt> rule</a>. The page model describes ! 5037: only the composition of the pages but does not give any rules for breaking 1.18 cvs 5038: different element types across pages. Now, it is possible that certain 5039: elements must not be cut by page breaks, while others can be cut anywhere. The 5040: <tt>PageBreak</tt>, <tt>NoBreak1</tt>, and <tt>NoBreak2</tt> rules are used to 5041: specify the conditions under which each element type can be cut.</p> 1.30 ! cvs 5042: ! 5043: <p>The <tt>PageBreak</tt> rule is used to indicate whether or not the box can ! 5044: be cut during the construction of pages. If cutting is authorized, the box ! 5045: can be cut, with one part appearing at the bottom of a page and the other part 1.1 cvs 5046: appearing at the top of the next page. The rule is formed by the 1.18 cvs 5047: <tt>PageBreak</tt> keyword followed by a colon and a constant boolean value 5048: (<tt>Yes</tt> or <tt>No</tt>). This is the only form possible: this rule 1.1 cvs 5049: cannot be inherited. Moreover, it can only appear in the rules of the primary 1.18 cvs 5050: view and applies to all views defined in the presentation schema.</p> 1.30 ! cvs 5051: ! 5052: <p>Whether objects can be cut by line breaks can be controlled in a similar ! 5053: way using the <tt>LineBreak</tt> rule. This rule allows the specification of 1.1 cvs 5054: whether or not the box can be cut during the construction of lines. If 5055: cutting is authorized, the box can be cut, with one part appearing at the end 5056: of a line and the other part appearing at the beginning of the next line. The 1.18 cvs 5057: rule is formed by the <tt>LineBreak</tt> keyword followed by a colon and a 5058: constant boolean value (<tt>Yes</tt> or <tt>No</tt>). This is the only form 1.1 cvs 5059: possible: this rule cannot be inherited. Moreover, it can only appear in the 5060: rules of the primary view and applies to all views defined in the presentation 1.18 cvs 5061: schema.</p> 5062: <pre> 'PageBreak' ':' Boolean . 1.1 cvs 5063: 'LineBreak' ':' Boolean . 1.18 cvs 5064: Boolean = 'Yes' / 'No' .</pre> 1.30 ! cvs 5065: ! 5066: <p>When a box can be cut by a page break, it is possible that a page break ! 5067: will fall an inappropriate spot, creating, for example, a widow or orphan, or 1.1 cvs 5068: separating the title of a section from the first paragraph of the section. The 1.18 cvs 5069: <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules are used to avoid this. They 5070: specify that the box of the element to which they apply cannot be cut within a 5071: certain zone at the top (<tt>NoBreak1</tt> rule) or at the bottom 5072: (<tt>NoBreak2</tt> rule). These two rules specify the height of the zones in 5073: which page breaks are prohibited.</p> 1.30 ! cvs 5074: ! 5075: <p>The <tt>NoBreak1</tt> and <tt>NoBreak2</tt> rules give the height of the ! 5076: zone in which page breaking is prohibited. The height is given as a constant ! 5077: value using any of the <a href="#sectc4217">available units</a>, absolute or 1.18 cvs 5078: relative. The value may not be inherited.</p> 5079: <pre> 'NoBreak1' ':' AbsDist . 5080: 'NoBreak2' ':' AbsDist .</pre> 1.30 ! cvs 5081: 1.18 cvs 5082: <blockquote class="example"> 1.30 ! cvs 5083: <p><strong>Example:</strong></p> ! 5084: ! 5085: <p>The following rules prevent widows and orphans in a paragraph:</p> ! 5086: <pre>Paragraph : 1.1 cvs 5087: BEGIN 5088: NoBreak1 : 2; 5089: NoBreak2 : 2; 1.18 cvs 5090: END;</pre> 1.30 ! cvs 5091: ! 5092: <p>This rule prevents a section title from becoming separated from the first ! 5093: paragraph of the section by prohibiting page breaks at the beginning of the ! 5094: section rule:</p> ! 5095: <pre>Section : 1.18 cvs 5096: NoBreak1 : 1.5 cm;</pre> 1.30 ! cvs 5097: ! 5098: <p>Finally, this rule prevents a figure from being page broken in any ! 5099: way:</p> ! 5100: <pre>Figure : 1.18 cvs 5101: PageBreak : No;</pre> 5102: </blockquote> 1.30 ! cvs 5103: ! 5104: <p>The Thot editor constructs the document images displayed on the screen 1.1 cvs 5105: dynamically. As the user moves in the document or makes the document scroll 5106: in a window, the editor constructs the image to be displayed in little bits, 5107: filling the gaps which are produced in the course of these operations. It 5108: stops filling in the image when an element reaches the edge of the window in 5109: which the gap appears. If the appearance of the document is complex, it is 5110: possible that the image in incomplete, even though the edge of the window was 5111: reached. For example, an element might need to be presented to the side of 5112: the last element displayed, but its image was not constructed. The user will 5113: not know whether the element is really absent or if its image has simply not 1.18 cvs 5114: been constructed.</p> 1.30 ! cvs 5115: ! 5116: <p>The <tt>Gather</tt> rule is used to remedy this problem. When the rule 1.18 cvs 5117: <tt>Gather : Yes;</tt> is associated with an element type, the image of such 5118: elements is constructed as a block by the editor: it is never split up.</p> 1.30 ! cvs 5119: ! 5120: <p>The <tt>Gather</tt> rule may not appear in the <a href="#sectc427">default 1.18 cvs 5121: rules</a>. Elements which do not have the <tt>Gather</tt> rule are considered 5122: susceptible to being split up during display. Thus, it is not necessary to 5123: use the <tt>Gather : No;</tt> form. This rule must be used prudently and only 5124: for those elements which truly need it. If used incorrectly, it can 5125: pointlessly increase the size of the image constructed by the editor and lead 5126: to excessive memory consumption by the editor.</p> 1.30 ! cvs 5127: ! 5128: <p>Like the <tt>PageBreak</tt> and <tt>LineBreak</tt> rules, the ! 5129: <tt>Gather</tt> rule can only appear in rules of the primary view and applies ! 5130: to all views defined in the presentation schema.</p> 1.18 cvs 5131: <pre> 'Gather' ':' Boolean .</pre> 5132: </div> 1.1 cvs 5133: 1.18 cvs 5134: <div class="subsection"> 1.30 ! cvs 5135: <h3><a name="sectc4224">Visibility</a></h3> 1.1 cvs 5136: 1.30 ! cvs 5137: <p>The visibility parameter is used to control which elements should or should 1.1 cvs 5138: not be displayed, based on context. An element can have different 5139: visibilities in different views. If an element's visibility is zero for a 5140: view, that element is not displayed in that view and does not occupy any space 1.18 cvs 5141: (its extents are zero).</p> 1.30 ! cvs 5142: ! 5143: <p>Visibility takes non-negative integer values (positive or zero). If values 1.1 cvs 5144: greater than 1 are used, they allow the user to choose a degree of visibility 5145: and, thus, to see only those boxes whose visibility parameter exceeds a 5146: certain threshold. This gives the user control over the granularity of the 1.18 cvs 5147: displayed pictures.</p> 1.30 ! cvs 5148: ! 5149: <p>The visibility parameter can be defined as a constant or by inheritance. If 1.1 cvs 5150: defined by inheritance, it cannot be based on the value of the next or 1.18 cvs 5151: previous box. Visibility can only be inherited from above.</p> 1.30 ! cvs 5152: ! 5153: <p>If it is a numeric attribute's presentation rule, the visibility can be 1.1 cvs 5154: specified by the attribute's name, in which case the value of the attribute is 1.18 cvs 5155: used.</p> 5156: <pre> 'Visibility' ':' NumberInherit 1.1 cvs 5157: NumberInherit = Integer / AttrID / Inheritance . 1.18 cvs 5158: Integer = NUMBER .</pre> 1.30 ! cvs 5159: 1.18 cvs 5160: <blockquote class="example"> 1.30 ! cvs 5161: <p><strong>Example:</strong></p> ! 5162: ! 5163: <p>Suppose that only <tt>Formula</tt> elements should be displayed in the ! 5164: <tt>MathView</tt> view. Then, the default rules should include:</p> ! 5165: <pre>DEFAULT 1.18 cvs 5166: IN MathView Visibility:0;</pre> 1.30 ! cvs 5167: ! 5168: <p>which makes all elements invisible in the <tt>MathView</tt> view. ! 5169: However, the <tt>Formula</tt> element also has a <tt>Visibility</tt> ! 5170: rule:</p> ! 5171: <pre>Formula : 1.18 cvs 5172: IN MathView Visibility:5;</pre> 1.30 ! cvs 5173: ! 5174: <p>which makes formulas, and only formulas, visible.</p> 1.18 cvs 5175: </blockquote> 5176: </div> 1.1 cvs 5177: 1.18 cvs 5178: <div class="subsection"> 1.30 ! cvs 5179: <h3><a name="sectc4225">Character style parameters</a></h3> 1.1 cvs 5180: 1.30 ! cvs 5181: <p>Four parameters are used to determine which characters are used to display 1.18 cvs 5182: text. They are size, font, style, and underlining.</p> 1.1 cvs 5183: 1.18 cvs 5184: <div class="subsubsection"> 1.30 ! cvs 5185: <h4><a name="sectd42251">Character size</a></h4> ! 5186: ! 5187: <p>The size parameter has two effects. First, it is used to specify the ! 5188: actual size and distance units for boxes defined in <a ! 5189: href="#sectc4217">relative units</a>. Second, it defines the size of the ! 5190: characters contained in the box.</p> 1.1 cvs 5191: 1.30 ! cvs 5192: <p>As a distance or length, the size can be expressed in abstract or absolute 1.1 cvs 5193: units. It can also be inherited. If it is not inherited, it is expressed 1.18 cvs 5194: simply as an integer followed by the <tt>pt</tt> keyword, which indicates that 5195: the size is expressed in typographer's points. The absence of the <tt>pt</tt> 1.1 cvs 5196: keyword indicates that it is in abstract units in which the value 1 represents 5197: the smallest size while the value 16 is the largest size. The relationship 5198: between these abstract sizes and the real character sizes is controlled by a 5199: table which can be modified statically or even dynamically during the 1.18 cvs 5200: execution of the Thot editor.</p> 1.30 ! cvs 5201: ! 5202: <p>If the <tt>Size</tt> rule is a numeric attribute's presentation rule, the ! 5203: value of the size parameter can be specified by the attribute's name, in which ! 5204: case the value of the attribute is used.</p> ! 5205: ! 5206: <p><strong>Note:</strong> the only unit available for defining an absolute ! 5207: size is the typographer's point. Centimeters and inches may not be used.</p> ! 5208: ! 5209: <p>If the size is inherited, the rule must specify the relative from which to ! 5210: inherit and any percentage or difference from that relative's value. A ! 5211: percentage is indicated by a <tt>*</tt> followed by the value of the ! 5212: percentage and a <tt>%</tt>. A difference can be expressed in either ! 5213: typographer's points or in abstract units and the maximum or minimum size can ! 5214: be specified, but without specifying the unit: it is the same as was specified ! 5215: for the difference.</p> ! 5216: ! 5217: <p>In a numeric attribute's presentation rule, the difference in size or the 1.22 cvs 5218: percentage can be indicated by the attribute's name instead of the numeric 5219: value, which means that the attribute's value should be used as the difference 5220: or percentage. The attribute can also be used as the minimum or maximum size 5221: for a difference.</p> 5222: <pre> 'Size' ':' SizeInherit 5223: SizeInherit = SizeAttr [ 'pt' ] / 5224: Kinship InheritedSize . 5225: InheritedSize ='+' SizeAttr [ 'pt' ] 5226: [ 'Max' MaxSizeAttr ] / 5227: '-' SizeAttr [ 'pt' ] 5228: [ 'Min' MinSizeAttr ] / 5229: '*' PercentSizeAttr '%' / 5230: '=' . 5231: SizeAttr = Size / AttrID . 5232: Size = NUMBER . 5233: MaxSizeAttr = MaxSize / AttrID . 5234: MaxSize = NUMBER . 5235: MinSizeAttr = MinSize / AttrID . 5236: MinSize = NUMBER . 5237: PercentSizeAttr = PercentSize / AttrID . 5238: PercentSize = NUMBER .</pre> 1.30 ! cvs 5239: 1.18 cvs 5240: <blockquote class="example"> 1.30 ! cvs 5241: <p><strong>Example:</strong></p> ! 5242: ! 5243: <p>The rule</p> ! 5244: <pre>Size : Enclosing - 2 pt Min 7;</pre> ! 5245: ! 5246: <p>states that the character size is 2 points less than that of the ! 5247: enclosing box, but that it may not be less than 7 points, whatever the ! 5248: enclosing box's value.</p> ! 5249: ! 5250: <p>The following rules make the text of a report be displayed with ! 5251: medium-sized characters (for example, size 5), while the title is displayed ! 5252: with larger characters and the summary is displayed with smaller ! 5253: characters:</p> ! 5254: <pre>Report : 1.1 cvs 5255: Size : 5; 5256: Title : 5257: Size : Enclosing + 2; 5258: Summary : 1.18 cvs 5259: Size : Enclosing - 1;</pre> 1.30 ! cvs 5260: ! 5261: <p>Thus, the character sizes in the entire document can be changed by ! 5262: changing the size parameter of the Report element, while preserving the ! 5263: relationships between the sizes of the different elements.</p> 1.18 cvs 5264: </blockquote> 5265: </div> 5266: 5267: <div class="subsubsection"> 1.30 ! cvs 5268: <h4><a name="sectd42252">Font and character style</a></h4> 1.18 cvs 5269: 1.30 ! cvs 5270: <p>The <tt>Font</tt> rule determines the font family to be used to display the 1.18 cvs 5271: characters contained in the box, while the <tt>Style</tt> rule determines 1.23 cvs 5272: their style and the <tt>Weight</tt> rule determines their weight. Thot 5273: recognizes three character fonts (Times, Helvetica, and Courier), three 5274: styles: Roman, Italics, and Oblique, and two weights: Normal and Bold.</p> 1.30 ! cvs 5275: ! 5276: <p>The font family, style and weight can be specified by a named constant or ! 5277: can be inherited. For the name of the font family only the first character is ! 5278: used.</p> ! 5279: ! 5280: <p>Only identical inheritance is allowed: the box takes the same font, style ! 5281: or weight as the box from which it inherits. This is indicated by an equals 1.23 cvs 5282: sign after the kinship specification.</p> 5283: <pre> 'Font' ':' NameInherit / 5284: 'Style' ':' StyleInherit / 5285: 'Weight' ':' WeightInherit / 5286: 5287: NameInherit = Kinship '=' / FontName . 5288: FontName = NAME . 5289: StyleInherit = Kinship '=' / 5290: 'Roman' / 'Italics' / 'Oblique' . 5291: WeightInherit = Kinship '=' / 5292: 'Normal' / 'Bold' .</pre> 1.30 ! cvs 5293: 1.18 cvs 5294: <blockquote class="example"> 1.30 ! cvs 5295: <p><strong>Example:</strong></p> ! 5296: ! 5297: <p>To specify that the summary uses the font family of the rest of the ! 5298: document, but in the italic style, the following rules are used:</p> ! 5299: <pre>Summary : 1.1 cvs 5300: BEGIN 5301: Font : Enclosing =; 5302: Style : Italics; 1.18 cvs 5303: END;</pre> 5304: </blockquote> 5305: </div> 5306: 5307: <div class="subsubsection"> 1.30 ! cvs 5308: <h4><a name="sectd42253">Underlining</a></h4> 1.18 cvs 5309: 1.30 ! cvs 5310: <p>The <tt>Underline</tt> rule is used to specify if the characters contained ! 5311: in a box should have lines drawn on or near them. There are four underlining 1.18 cvs 5312: styles: <tt>Underlined</tt>, <tt>Overlined</tt>, <tt>CrossedOut</tt>, and 5313: <tt>NoUnderline</tt>. The <tt>Thickness</tt> rule specifies the thickness of 5314: the line, <tt>Thin</tt> or <tt>Thick</tt>.</p> 1.30 ! cvs 5315: ! 5316: <p>As with font family and style, only identical inheritance is allowed: the ! 5317: box has the same underlining type as the box from which it inherits the value. 1.18 cvs 5318: This is indicated by an equals sign after the kinship specification.</p> 5319: <pre> 'Underline' ':' UnderLineInherit / 1.1 cvs 5320: 'Thickness' ':' ThicknessInherit / 5321: 5322: UnderLineInherit = Kinship '=' / 'NoUnderline' / 5323: 'Underlined' / 5324: 'Overlined' / 'CrossedOut' . 1.18 cvs 5325: ThicknessInherit = Kinship '=' / 'Thick' / 'Thin' .</pre> 5326: </div> 5327: </div> 5328: 5329: <div class="subsection"> 1.30 ! cvs 5330: <h3><a name="sectc4226">Stacking order</a></h3> 1.18 cvs 5331: 1.30 ! cvs 5332: <p>The <tt>Depth</tt> rule is used to define the stacking order of terminal ! 5333: boxes when multiple boxes at least partially overlap. This rule defines how ! 5334: the depth parameter, which is zero or a positive integer, is calculated. The 1.1 cvs 5335: depth parameter has a value for all boxes. For terminal boxes in the 5336: structure and for presentation boxes, the depth value is used during display 5337: and printing: the boxes with the lowest value overlap those with higher 5338: depths. For non-terminal boxes, the depth is not interpreted during display, 1.18 cvs 5339: but it is used to calculate the depth of terminal boxes by inheritance.</p> 1.30 ! cvs 5340: ! 5341: <p>Like most other rules, the depth rule is defined in the <a 1.18 cvs 5342: href="#sectc427">default rules</a> of each presentation schema. Thus, there 5343: is always a depth value, even when it is not necessary because there is no 5344: overlapping. To avoid useless operations, a zero value can be given to the 5345: depth parameter, which signifies that overlapping is never a problem.</p> 1.30 ! cvs 5346: ! 5347: <p>The depth rule has the same form as the <a href="#sectc4224">visibility 1.18 cvs 5348: rule</a>. It can be defined by inheritance or by a constant numeric value. 5349: When the rule is attached to a numeric attribute, it can take the value of 5350: that attribute.</p> 5351: <pre> 'Depth' ':' NumberInherit</pre> 1.30 ! cvs 5352: 1.18 cvs 5353: <blockquote class="example"> 1.30 ! cvs 5354: <p><strong>Example:</strong></p> ! 5355: ! 5356: <p>For a purely textual document, in which overlapping never poses a ! 5357: problem, a single default <tt>Depth</tt> rule in the presentation schema is ! 5358: sufficient:</p> ! 5359: <pre>DEFAULT 1.1 cvs 5360: Depth : 0; 1.18 cvs 5361: ...</pre> 1.30 ! cvs 5362: ! 5363: <p>To make the text of examples appear on a light blue background, a ! 5364: presentation box is defined:</p> ! 5365: <pre>BOXES 1.1 cvs 5366: BlueBG : 5367: BEGIN 5368: Content : Graphics 'R'; 5369: Background : LightBlue3; 5370: FillPattern: backgroundcolor; 5371: Depth : 2; 5372: ... 1.18 cvs 5373: END;</pre> 1.30 ! cvs 5374: ! 5375: <p>and is created by the <tt>Example</tt> element, which has the rules:</p> ! 5376: <pre>RULES 1.1 cvs 5377: Example : 5378: BEGIN 5379: CreateFirst (BlueBG); 5380: Depth : 1; 5381: ... 1.18 cvs 5382: END;</pre> 1.30 ! cvs 5383: ! 5384: <p>In this way, the text of an example (if it inherits its depth from its ! 5385: ancestor) will be superimposed on a light blue background, and not the ! 5386: reverse).</p> 1.18 cvs 5387: </blockquote> 5388: </div> 5389: 5390: <div class="subsection"> 1.30 ! cvs 5391: <h3><a name="sectc4227">Line style</a></h3> 1.18 cvs 5392: 1.30 ! cvs 5393: <p>The <tt>LineStyle</tt> rule determines the style of line which should be ! 5394: used to draw all the elements contained in the box and the box itself, if it ! 5395: has a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>. The line style can be 1.18 cvs 5396: indicated by a name (<tt>Solid</tt>, <tt>Dashed</tt>, <tt>Dotted</tt>) or it 1.13 cvs 5397: can be inherited. All elements of the graphic base type are affected by this 1.1 cvs 5398: rule, but it can be attached to any box and transmitted by inheritance to the 1.18 cvs 5399: graphic elements. The border of elements having a <a 5400: href="#sectc4230a"><tt>ShowBox</tt> rule</a> is drawn according to the line 5401: style specified by this rule.</p> 1.30 ! cvs 5402: ! 5403: <p>Only identical inheritance is allowed: the box takes the same line style as 1.1 cvs 5404: the box from which it inherits. This is indicated by an equals sign after the 1.18 cvs 5405: kinship specification.</p> 5406: <pre> 'LineStyle' ':' LineStyleInherit 1.1 cvs 5407: LineStyleInherit = Kinship '=' / 1.18 cvs 5408: 'Solid' / 'Dashed' / 'Dotted' .</pre> 1.30 ! cvs 5409: 1.18 cvs 5410: <blockquote class="example"> 1.30 ! cvs 5411: <p><strong>Example:</strong></p> ! 5412: ! 5413: <p>To specify that, in Figures, the graphical parts should be drawn in solid ! 5414: lines, the Figure element is given a rule using the <tt>Solid</tt> name:</p> ! 5415: <pre>Figure : 1.18 cvs 5416: LineStyle : Solid;</pre> 1.30 ! cvs 5417: ! 5418: <p>and the elements composing figures are given an inheritance rule:</p> ! 5419: <pre> LineStyle : Enclosing =;</pre> 1.18 cvs 5420: </blockquote> 5421: </div> 5422: 5423: <div class="subsection"> 1.30 ! cvs 5424: <h3><a name="sectc4228">Line thickness</a></h3> 1.18 cvs 5425: 1.30 ! cvs 5426: <p>The <tt>LineWeight</tt> rule determines the thickness of the lines of all 1.1 cvs 5427: graphical elements which appear in the box, no matter what their line style. 5428: Line thickness can be specified by a constant value or by inheritance. A 5429: constant value is a positive number followed by an optional unit specification 1.18 cvs 5430: (which is absent when using relative units). All available <a 5431: href="#sectc4217">distance units</a> can be used. Line thickness is expressed 5432: in the same way as <a href="#sectd42221">line spacing</a>.</p> 5433: <pre> 'LineWeight' ':' DistOrInherit</pre> 1.30 ! cvs 5434: ! 5435: <p>All elements of the graphic base type are affected by this rule, but it can ! 5436: be attached to any box and transmitted by inheritance to the graphic elements. 1.18 cvs 5437: The border of element having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a> 5438: is also drawn according to the thickness specified by this rule.</p> 1.30 ! cvs 5439: 1.18 cvs 5440: <blockquote class="example"> 1.30 ! cvs 5441: <p><strong>Example:</strong></p> ! 5442: ! 5443: <p>To specify that, in Figures, the graphical parts should be drawn with ! 5444: lines 0.3 pt thick, the Figure element is given this rule:</p> ! 5445: <pre>Figure : 1.18 cvs 5446: LineWeight : 0.3 pt;</pre> 1.30 ! cvs 5447: ! 5448: <p>and the elements composing figures are given an inheritance rule:</p> ! 5449: <pre> LineWeight : Enclosing =;</pre> 1.18 cvs 5450: </blockquote> 5451: </div> 5452: 5453: <div class="subsection"> 1.30 ! cvs 5454: <h3><a name="sectc4229">Fill pattern</a></h3> 1.18 cvs 5455: 1.30 ! cvs 5456: <p>The <tt>FillPattern</tt> rule determines the pattern used to fill closed 1.1 cvs 5457: graphical elements (circles, rectangles, etc.) which appear in the box. This 1.18 cvs 5458: rule also specifies the pattern used to fill the box associated with elements 5459: having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a><a>. This pattern can 5460: be indicated by a named constant or by inheritance. The named constant 5461: identifies one of the patterns available in Thot. The names of the available 5462: patterns are: nopattern, foregroundcolor, backgroundcolor, gray1, gray2, 5463: gray3, gray4, gray5, gray6, gray7, horiz1, horiz2, horiz3, vert1, vert2, 5464: vert3, left1, left2, left3, right1, right2, right3, square1, square2, square3, 5465: lozenge, brick, tile, sea, basket.</a></p> 1.30 ! cvs 5466: ! 5467: <p>Like the other rules peculiar to graphics, <tt>LineStyle</tt> and 1.18 cvs 5468: <tt>LineWeight</tt>, only elements of the graphic base type are affected by 5469: the <tt>FillPattern</tt> rule, but the rule can be attached to any box and 1.1 cvs 5470: transmitted by inheritance to the graphic elements. As with the other rules 1.18 cvs 5471: specific to graphics, only identical inheritance is allowed.</p> 1.30 ! cvs 5472: ! 5473: <p>The <tt>FillPattern</tt> rule can also be used to determine whether or not 1.12 cvs 5474: text characters, symbols and pictures should be colored. For these element 5475: types (text, symbols, and pictures), the only valid values are 1.18 cvs 5476: <tt>nopattern</tt>, <tt>foregroundcolor</tt>, and <tt>backgroundcolor</tt>. 5477: When <tt>FillPattern</tt> has the value <tt>backgroundcolor</tt>, text 5478: characters, symbols, and bitmaps are given the color specified by the <a 5479: href="#sectc4230"><tt>Background</tt> rule</a> which applies to these 5480: elements. When <tt>FillPattern</tt> has the value <tt>foregroundcolor</tt>, 5481: these same elements are given the color specified by the <a 5482: href="#sectc4230"><tt>Foreground</tt> rule</a> which applies to these 5483: elements. In all other case, text characters are not colored.</p> 5484: <pre> 'FillPattern' ':' NameInherit</pre> 1.30 ! cvs 5485: 1.18 cvs 5486: <blockquote class="example"> 1.30 ! cvs 5487: <p><strong>Example:</strong></p> ! 5488: ! 5489: <p>To specify that, in Figures, the closed graphical elements should be ! 5490: filled with a pattern resembling a brick wall, the Figure element is given ! 5491: this rule:</p> ! 5492: <pre>Figure : 1.18 cvs 5493: FillPattern : brick;</pre> 1.30 ! cvs 5494: ! 5495: <p>and the elements composing figures are given an inheritance rule:</p> ! 5496: <pre> FillPattern : Enclosing =;</pre> 1.18 cvs 5497: </blockquote> 5498: </div> 5499: 5500: <div class="subsection"> 1.30 ! cvs 5501: <h3><a name="sectc4230">Colors</a></h3> 1.18 cvs 5502: 1.30 ! cvs 5503: <p>The <tt>Foreground</tt> and <tt>Background</tt> rules determine the ! 5504: foreground and background colors of the base elements which appear in the box. ! 5505: They also control the color of boxes associated with elements having a <a 1.18 cvs 5506: href="#sectc4230a"><tt>ShowBox</tt> rule</a>. These colors can be specified 5507: with a named constant or by inheritance. The named constants specify one of 5508: the available colors in Thot. The available color names can be found in the 1.30 ! cvs 5509: file <tt>thot.color</tt>. In addition to those names, you can use the keyword ! 5510: <code>Transparent</code>, to not draw anything.</p> ! 5511: ! 5512: <p>The color rules affect the same way all base elements and elements having a ! 5513: <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>, no matter what their type ! 5514: (text, graphics, pictures, symbols). The color rules can be associated with ! 5515: any box and can be transmitted by inheritance to the base elements or the ! 5516: elements having a <a href="#sectc4230a"><tt>ShowBox</tt> rule</a>. Like the ! 5517: preceding rules, only inheritance of the same value is allowed.</p> ! 5518: <pre> 'Foreground' ':' Color ! 5519: 'Background' ':' Color ! 5520: Color = 'Transparent' / Link '=' / FontColorName .</pre> ! 5521: ! 5522: <p><strong>Note:</strong> text colors only appear for text elements whose <a 1.18 cvs 5523: href="#sectc4229">fill pattern</a> does not prevent the use of color.</p> 1.30 ! cvs 5524: 1.18 cvs 5525: <blockquote class="example"> 1.30 ! cvs 5526: <p><strong>Example:</strong></p> ! 5527: ! 5528: <p>To specify that, in Figures, everything must be drawn in blue on a ! 5529: background of yellow, the Figure element is given these rules:</p> ! 5530: <pre>Figure : 1.1 cvs 5531: BEGIN 5532: Foreground : Blue; 5533: Background : Yellow; 5534: Fillpattern : backgroundcolor; 1.18 cvs 5535: END;</pre> 1.30 ! cvs 5536: ! 5537: <p>and the elements composing figures are given inheritance rules:</p> ! 5538: <pre> Foreground : Enclosing =; 1.1 cvs 5539: Background : Enclosing =; 1.18 cvs 5540: FillPattern : Enclosing =;</pre> 5541: </blockquote> 5542: </div> 5543: 5544: <div class="subsection"> 1.30 ! cvs 5545: <h3><a name="sectc4230a">Background color and border</a></h3> 1.18 cvs 5546: 1.30 ! cvs 5547: <p>Boxes associated with structural elements are normally not visible, but it ! 5548: is possible to draw their border and/or to paint their area when it is needed. 1.18 cvs 5549: This is achieved by associating the <tt>ShowBox</tt> rule with the concerned 1.13 cvs 5550: element. This rule has no parameter and no value. It is simply written 1.18 cvs 5551: <tt>Showbox;</tt>. It is not inherited nor transmitted to any other element. 5552: It applies only to the element with which it is associated.</p> 5553: <pre> 'ShowBox'</pre> 1.30 ! cvs 5554: ! 5555: <p>When an element has a <tt>ShowBox</tt> rule, the border is drawn only if ! 5556: the <tt>LineWeight</tt> rule that applies to that element has a non-zero value 1.18 cvs 5557: (this value can be inherited). The color, style and thickness of the border 5558: are defined by the <tt>Foreground</tt>, <tt>LineStyle</tt>, and 5559: <tt>LineWeight</tt> rules that apply to the element.</p> 1.30 ! cvs 5560: ! 5561: <p>When an element has a <tt>ShowBox</tt> rule, the background of this element ! 5562: is paint only if the value of the <tt>FillPattern</tt> rule that applies to ! 5563: that element is not <tt>nopattern</tt>. The pattern and color(s) of the ! 5564: background are defined by the <tt>FillPattern</tt>, <tt>Background</tt>, and 1.18 cvs 5565: <tt>Foreground</tt> rules that apply to the element.</p> 5566: </div> 5567: 5568: <div class="subsection"> 1.30 ! cvs 5569: <h3><a name="sectc4230b">Background pictures</a></h3> 1.18 cvs 5570: 1.30 ! cvs 5571: <p>The <tt>BackgroundPicture</tt> rule allows to display a picture as the 1.13 cvs 5572: background of an element. It has a single parameter, the file name of the 1.18 cvs 5573: picture. This is a string delimited by single quotes. If the first character 5574: in this string is '/', it is considered as an absolute path, otherwise the 5575: file is searched for along the schema directory path. This file may contain a 5576: picture in any format accepted by Thot (xbm, xpm, gif, jpeg, png, etc.)</p> 1.30 ! cvs 5577: ! 5578: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only to 1.13 cvs 5579: the element with which they are associated. They are not inherited nor 1.18 cvs 5580: transmitted to children elements.</p> 1.30 ! cvs 5581: ! 5582: <p>The background picture has not always the same size as the element's box. 1.13 cvs 5583: There are diffrent ways to fill the element box with the picture. This is 1.18 cvs 5584: specified by the <tt>PictureMode</tt> rule, which should be associated to the 5585: same element. This rule may take one of the following values:</p> 5586: <dl> 1.30 ! cvs 5587: <dt><tt>NormalSize</tt></dt> ! 5588: <dd>The picture is centered in the box, and clipped if it is too ! 5589: large.</dd> ! 5590: <dt><tt>Scale</tt></dt> ! 5591: <dd>The picture is zoomed to fit the box size.</dd> ! 5592: <dt><tt>RepeatX</tt></dt> ! 5593: <dd>The picture is repeated horizontally to fit the box width.</dd> ! 5594: <dt><tt>RepeatY</tt></dt> ! 5595: <dd>The picture is repeated vertically to fit the box height.</dd> ! 5596: <dt><tt>RepeatXY</tt></dt> ! 5597: <dd>The picture is repeated both horizontally and vertically to fill the ! 5598: box.</dd> 1.18 cvs 5599: </dl> 1.30 ! cvs 5600: ! 5601: <p>If an element has a <tt>BackgroundPicture</tt> rule and no 1.18 cvs 5602: <tt>PictureMode</tt> rule, the <tt>NormalSize</tt> value is assumed.</p> 5603: <pre> 'BackgroundPicture' ':' FileName / 1.13 cvs 5604: 'PictureMode' ':' PictMode . 5605: 5606: FileName = STRING . 1.18 cvs 5607: PictMode = 'NormalSize' / 'Scale' / 'RepeatXY' / 'RepeatX' / 'RepeatY' .</pre> 1.30 ! cvs 5608: ! 5609: <p>The <tt>BackgroundPicture</tt> and <tt>PictureMode</tt> rules apply only to 1.13 cvs 5610: the element with which they are associated. They are not inherited nor 1.18 cvs 5611: transmitted to children elements.</p> 5612: </div> 1.13 cvs 5613: 1.18 cvs 5614: <div class="subsection"> 1.30 ! cvs 5615: <h3><a name="sectc4231">Presentation box content</a></h3> 1.1 cvs 5616: 1.30 ! cvs 5617: <p>The <tt>Content</tt> rule applies to presentation boxes. It indicates the 1.1 cvs 5618: content given to a box. This content is either a variable's value or a 1.18 cvs 5619: constant value. In the special case of <a href="#sectc4233">header or footer 5620: boxes</a>, the content can also be a structured element type.</p> 1.30 ! cvs 5621: ! 5622: <p>If the content is a constant, it can be specified, as in a variable 1.18 cvs 5623: declaration, either by the name of a constant declared in the <tt>CONST</tt> 1.1 cvs 5624: section or by direct specification of the type and value of the box's 1.18 cvs 5625: content.</p> 1.30 ! cvs 5626: ! 5627: <p>Similarly, if it is a variable, the name of a variable declared in 1.18 cvs 5628: <tt>VAR</tt> section can be given or the variable may be defined within 5629: parentheses. The content inside the parentheses has the same syntax as a <a 5630: href="#sectc426">variable declaration</a>.</p> 1.30 ! cvs 5631: ! 5632: <p>When the content is a structured element type, the name of the element type ! 5633: is given after the colon. In this case, the box's content is all elements of 1.1 cvs 5634: the named type which are designated by references which are part of the page 1.18 cvs 5635: on which the header or footer with this <tt>Content</tt> rule appears. Only 5636: associated elements can appear in a <tt>Content</tt> rule and the structure 1.1 cvs 5637: must provide references to these elements. Moreover, the box whose content 5638: they are must be a header or footer box generated by a page box of the primary 1.18 cvs 5639: view.</p> 5640: <pre> 'Content' ':' VarConst 1.1 cvs 5641: VarConst = ConstID / ConstType ConstValue / 5642: VarID / '(' FunctionSeq ')' / 1.18 cvs 5643: ElemID .</pre> 1.30 ! cvs 5644: ! 5645: <p>A presentation box can have only one <tt>Content</tt> rule, which means ! 5646: that the content of a presentation box cannot vary from view to view. However, ! 5647: such an effect can be achieved by creating several presentation boxes, each ! 5648: with different content and visible in different views.</p> ! 5649: ! 5650: <p>The <tt>Content</tt> rule also applies to elements defined as references in 1.1 cvs 5651: the structure schema. In this case, the content defined by the rule must be 5652: a constant. It is this content which appears on the screen or paper to 5653: represent references of the type to which the rule applies. A reference can 1.18 cvs 5654: have a <tt>Content</tt> rule or a <a href="#sectc4234"><tt>Copy</tt> rule</a> 1.1 cvs 5655: for each view. If neither of these rules appears, the reference is displayed 1.18 cvs 5656: as <tt>[*]</tt>, which is equivalent to the rule:</p> 5657: <pre> Content: Text '[*]';</pre> 1.30 ! cvs 5658: 1.18 cvs 5659: <blockquote class="example"> 1.30 ! cvs 5660: <p><strong>Example:</strong></p> ! 5661: ! 5662: <p>The content of the presentation box created to make the chapter number ! 5663: and section number appear before each section title can be defined by:</p> ! 5664: <pre>BOXES 1.1 cvs 5665: SectionNumBox : 5666: BEGIN 5667: Content : NumSection; 5668: ... 1.18 cvs 5669: END;</pre> 1.30 ! cvs 5670: ! 5671: <p>if the <tt>NumSection</tt> variable has been defined in the variable ! 5672: definition section of the presentation schema. Otherwise the ! 5673: <tt>Content</tt> would be written:</p> ! 5674: <pre>BOXES 1.1 cvs 5675: SectionNumBox : 5676: BEGIN 5677: Content : (VALUE (ChapterCtr, Roman) TEXT '.' 5678: VALUE (SectionCtr, Arabic)); 5679: ... 1.18 cvs 5680: END;</pre> 1.30 ! cvs 5681: ! 5682: <p>To specify that a page footer should contain all elements of the ! 5683: <tt>Note</tt> type are referred to in the page, the following rule is ! 5684: written:</p> ! 5685: <pre>BOXES 1.1 cvs 5686: NotesFooterBox : 5687: BEGIN 5688: Content : Note; 5689: ... 1.18 cvs 5690: END;</pre> 1.30 ! cvs 5691: ! 5692: <p><tt>Note</tt> is defined as an associated element in the structure schema ! 5693: and NotesFooterBox is created by a page box of the primary view.</p> 1.18 cvs 5694: </blockquote> 5695: </div> 1.1 cvs 5696: 1.18 cvs 5697: <div class="subsection"> 1.30 ! cvs 5698: <h3><a name="sectc4232">Presentation box creation</a></h3> 1.1 cvs 5699: 1.30 ! cvs 5700: <p>A creation rule specifies that a presentation box should be created when an 1.18 cvs 5701: element of the type to which the rule is attached appears in the document.</p> 1.30 ! cvs 5702: ! 5703: <p>A keyword specifies the position, relative to the creating box, at which ! 5704: the created box will be placed in the structure:</p> 1.18 cvs 5705: <dl> 1.30 ! cvs 5706: <dt><tt>CreateFirst</tt></dt> ! 5707: <dd>specifies that the box should be created as the first box of the next ! 5708: lower level, before any already existing boxes, and only if the ! 5709: beginning of the creating element is visible;</dd> ! 5710: <dt><tt>CreateLast</tt></dt> ! 5711: <dd>specifies that the box should be created as the last box of the next ! 5712: lower level, after any existing boxes, and only if the end of the ! 5713: creating element is visible;</dd> ! 5714: <dt><tt>CreateBefore</tt></dt> ! 5715: <dd>specifies that the box should be created before the creating box, on ! 5716: the same level as the creating box, and only if the beginning of the ! 5717: creating element is visible;</dd> ! 5718: <dt><tt>CreateAfter</tt></dt> ! 5719: <dd>specifies that the box should be created after the creating box, on ! 5720: the same level as the creating box, and only if the beginning of the ! 5721: creating element is visible;</dd> ! 5722: <dt><tt>CreateEnclosing</tt></dt> ! 5723: <dd>specifies that the box should be created at the upper level relatively ! 5724: to the creating box, and that it must contain that creating box and all ! 5725: presentation boxes created by the same creating box.</dd> 1.18 cvs 5726: </dl> 1.30 ! cvs 5727: ! 5728: <p>This keyword can be followed by the <tt>Repeated</tt> keyword to indicate ! 5729: that the box must be created for each part of the creating element. These ! 5730: parts result from the division of the element by page breaks or column ! 5731: changes. If the <tt>Repeated</tt> keyword is missing, the box is only created ! 5732: for the first part of the creating element (<tt>CreateFirst</tt> and 1.18 cvs 5733: <tt>CreateBefore</tt> rules) or for the last part (<tt>CreateLast</tt> and 5734: <tt>CreateAfter</tt> rules).</p> 1.30 ! cvs 5735: ! 5736: <p>The type of presentation to be created is specified at the end of the rule 1.18 cvs 5737: between parentheses.</p> 1.30 ! cvs 5738: ! 5739: <p>Creation rules cannot appear in the <a href="#sectc427">default ! 5740: presentation rules</a>. The boxes being created should have a ! 5741: <tt>Content</tt> rule which indicates their <a ! 5742: href="#sectc4231">content</a>.</p> ! 5743: ! 5744: <p>Creation rules can only appear in the block of rules for the primary view; 1.1 cvs 5745: creation is provoked by a document element for all views. However, for each 5746: view, the presentation box is only created if the creating element is itself a 5747: box in the view. Moreover, the visibility parameter of the presentation box 5748: can be adjusted to control the creation of the box on a view-by-view 1.18 cvs 5749: basis.</p> 5750: <pre> Creation '(' BoxID ')' 1.1 cvs 5751: Creation = Create [ 'Repeated' ] . 5752: Create ='CreateFirst' / 'CreateLast' / 5753: 'CreateBefore' / 'CreateAfter' / 1.18 cvs 5754: 'CreateEnclosing' .</pre> 1.30 ! cvs 5755: 1.18 cvs 5756: <blockquote class="example"> 1.30 ! cvs 5757: <p><strong>Example:</strong></p> ! 5758: ! 5759: <p>Let us define an object type, called Table, which is composed of a ! 5760: sequence of columns, all having the same fixed width, where the columns are ! 5761: separated by vertical lines. There is a line to the left of the first ! 5762: column and one to the right of the last. Each column has a variable number ! 5763: of cells, placed one on top of the other and separated by horizontal lines. ! 5764: There are no horizontal lines above the first cell or below the last cell. ! 5765: The text contained in each cell is broken into lines and these lines are ! 5766: centered horizontally in the cell. The logical structure of this object is ! 5767: defined by:</p> ! 5768: <pre>Table = LIST OF (Column); 1.18 cvs 5769: Column = LIST OF (Cell = Text);</pre> 5770: 1.30 ! cvs 5771: <div class="figure"> ! 5772: <hr> ! 5773: <pre>| | | | 1.1 cvs 5774: | xx xxxx xxxx |x xxxx xxx xxxxx| x xxx x xxx | 5775: | xxx xxx xxxx x | x xx x xxx | xxxxx xxxx xx | 5776: | xxxxx xxxx |----------------| xxx xxxxx x | 5777: | xxxxx xxx xxxx | xxxx xx xx xxx | xx xx | 5778: | xxx xxxx x xxx | xxxx x xxx x |---------------| 5779: |----------------| xxx xxxx xxxxx | xxxxx xxxxx | 5780: | xxx xxx xxxxxx |----------------| xxx xxxx xxxx | 5781: | xxxx xxxx xx | xxxx xx x xx | xxx xx x xx | 5782: |----------------| xxx xxxxx xxxx | xxxx xxxx xxx | 5783: | xxxxx xxx xxxx | xxxx xx x xx | xxxxx xxx | 1.18 cvs 5784: |xxxx xx x xxxxxx| xxxx xx xxxxxx | xxxxx xxxxx |</pre> 1.19 cvs 5785: 1.30 ! cvs 5786: <p align="center"><em><a name="table">The design of a table</a></em></p> ! 5787: <hr> ! 5788: </div> ! 5789: ! 5790: <p>The presentation of the table should resemble the design of the above <a ! 5791: href="#table">figure</a>. It is defined by the following presentation ! 5792: schema fragment:</p> ! 5793: <pre>BOXES 1.1 cvs 5794: VertLine : BEGIN 5795: Width : 0.3 cm; 5796: Height : Enclosing . Height; 5797: VertPos : Top = Enclosing . Top; 5798: HorizPos : Left = Previous . Right; 5799: Content : Graphics 'v'; 5800: END; 5801: 5802: HorizLine: BEGIN 5803: Width : Enclosing . Width; 5804: Height : 0.3 cm; 5805: VertPos : Top = Previous . Bottom; 5806: HorizPos : Left = Enclosing . Left; 5807: Content : Graphics 'h'; 5808: END; 5809: 5810: RULES 1.6 cvs 5811: Column : BEGIN 5812: CreateBefore (VertLine); 5813: IF LAST CreateAfter (VertLine); 5814: Width : 2.8 cm; 5815: Height : Enclosed . Height; 5816: VertPos : Top = Enclosing . Top; 5817: HorizPos : Left = Previous . Right; 5818: END; 5819: 5820: Cell : BEGIN 5821: IF NOT FIRST CreateBefore (HorizLine); 5822: Width : Enclosing . Width; 5823: Height : Enclosed . Height; 5824: VertPos : Top = Previous . Bottom; 5825: HorizPos : Left = Enclosing . Left; 5826: Line; 5827: Adjust : VMiddle; 1.18 cvs 5828: END;</pre> 1.30 ! cvs 5829: ! 5830: <p>It is useful to note that the horizontal position rule of the first ! 5831: vertical line will not be applied, since there is no preceding box. In this ! 5832: case, the box is simply placed on the left side of the enclosing box.</p> 1.18 cvs 5833: </blockquote> 5834: </div> 5835: 5836: <div class="subsection"> 1.30 ! cvs 5837: <h3><a name="sectc4233">Page layout</a></h3> 1.18 cvs 5838: 1.30 ! cvs 5839: <p>The page models specified in the <tt>Page</tt> rule are defined by boxes 1.18 cvs 5840: declared in the <tt>BOXES</tt> section of the presentation schema. Pages are 1.1 cvs 5841: not described as frames which will be filled by the document's text, but as 5842: element are inserted in the flow of the document and which mark the page 5843: breaks. Each of these page break elements contains presentation boxes which 5844: represent the footer boxes of a page followed by header boxes of the next 5845: page. The page box itself is the simple line which separates two pages on the 5846: screen. Both the footer and header boxes placed themselves with respect to 5847: this page box, with the footer being placed above it and the header boxes 1.18 cvs 5848: being placed above it.</p> 1.30 ! cvs 5849: ! 5850: <p>The boxes created by a page box are headers and footers and can only place 1.1 cvs 5851: themselves vertically with respect to the page box itself (which is in fact 5852: the separation between two pages). Besides, it is their vertical position 5853: rule which determines whether they are header or footer boxes. Header and 5854: footer boxes must have an explicit vertical position rule (they must not use 1.18 cvs 5855: the default rule).</p> 1.30 ! cvs 5856: ! 5857: <p>Footer boxes must have an absolute height or inherit the height of their 1.18 cvs 5858: contents:</p> 5859: <pre>Height : Enclosed . Height;</pre> 1.30 ! cvs 5860: ! 5861: <p>A page box must have height and width rules and these two rules must be 1.1 cvs 5862: specified with constant values, expressed in centimeters, inches, or 5863: typographer's points. These two rules are interpreted in a special way for 5864: page boxes: they determine the width of the page and the vertical distance 5865: between two page separators, which is the height of the page and its header 1.18 cvs 5866: and footer together.</p> 1.30 ! cvs 5867: ! 5868: <p>A page box should also have vertical and horizontal position rules and ! 5869: these two rules should specify the position on the sheet of paper of the ! 5870: rectangle enclosing the page's contents. These two rules must position the ! 5871: upper left corner of the enclosing rectangle in relation to the upper left ! 5872: corner of the sheet of paper, considered to be the enclosing element. In both ! 5873: rules, distances must be expressed in fixed units: centimeters (<tt>cm</tt>), ! 5874: inches (<tt>in</tt>), or typographer's points (<tt>pt</tt>). Thus, rules ! 5875: similar to the following should be found in the rules for a page box:</p> 1.18 cvs 5876: <pre>BOXES 1.1 cvs 5877: ThePage : 5878: BEGIN 5879: VertPos : Top = Enclosing . Top + 3 cm; 5880: HorizPos : Left = Enclosing . Left + 2.5 cm; 5881: Width : 16 cm; 5882: Height : 22.5 cm; 1.18 cvs 5883: END;</pre> 1.30 ! cvs 5884: ! 5885: <p>When a document must be page broken, the page models to be constructed are 1.18 cvs 5886: defined in the <tt>BOXES</tt> section of the presentation schema by declaring 5887: page boxes and header and footer boxes. Also, the <tt>Page</tt> rule is used 1.1 cvs 5888: to specify to which parts of the document and to which views each model should 1.18 cvs 5889: be applied.</p> 1.30 ! cvs 5890: ! 5891: <p>The <tt>Page</tt> rule has only one parameter, given between parentheses ! 5892: after the <tt>Page</tt> keyword. This parameter is the name of the box which ! 5893: must serve as the model for page construction. When a <tt>Page</tt> rule is 1.1 cvs 5894: attached to an element type, each time such an element appears in a document, 5895: a page break takes place and the page model indicated in the rule is applied 5896: to all following pages, until reaching the next element which has a 1.18 cvs 5897: <tt>Page</tt> rule.</p> 1.30 ! cvs 5898: ! 5899: <p>The <tt>Page</tt> rule applies to only one view; if it appears in the ! 5900: primary view's block of rules, a <tt>Page</tt> rule applies only to that view. ! 5901: Thus, different page models can be defined for the full document and for its ! 5902: table of contents, which is another view of the same document. Some views can ! 5903: be specified with pages, and other views of the same document can be specified 1.18 cvs 5904: without pages.</p> 5905: <pre> 'Page' '(' BoxID ')'</pre> 5906: </div> 5907: 5908: <div class="subsection"> 1.30 ! cvs 5909: <h3><a name="sectc4234">Box copies</a></h3> 1.18 cvs 5910: 1.30 ! cvs 5911: <p>The <tt>Copy</tt> rule can be used for an element which is defined as a 1.7 cvs 5912: reference in the structure schema. In this case, the rule specifies, between 1.18 cvs 5913: parenthesis, the name of the box (declared in the <tt>BOXES</tt> section) 1.1 cvs 5914: which must be produced when this reference appears in the structure of a 5915: document. The box produced is a copy (same contents, but possible different 5916: presentation) of the box type indicated by the parameter between parentheses, 5917: and which is in the element designated by the reference. The name of a box 5918: can be replaced by type name. Then what is copied is the contents of the 1.18 cvs 5919: element of this type which is inside the referenced element.</p> 1.30 ! cvs 5920: ! 5921: <p>Whether a box name or type name is given, it may be followed by the name of ! 5922: a structure schema between parentheses. This signifies that the box or type ! 5923: is defined in the indicated structure schema and not in the structure schema ! 5924: with which the rule's presentation schema is associated.</p> ! 5925: ! 5926: <p>The <tt>Copy</tt> rule can also be applied to a presentation box. If the 1.1 cvs 5927: presentation box was created by a reference attribute, the rule is applied as 5928: in the case of a reference element: the contents of the box having the 1.18 cvs 5929: <tt>Copy</tt> rule are based on the element designated by the reference 5930: attribute. For other presentation boxes, the <tt>Copy</tt> rule takes a type 1.1 cvs 5931: name parameter which can be followed, between parentheses, by the name of the 5932: structure schema in which the type is defined, if it is not defined in the 5933: same schema. The contents of the box which has this rule are a copy of the 5934: element of this type which is in the element creating the presentation box, or 5935: by default, the box of this type which precedes the presentation box. This 5936: last facility is used, for example, to define the running titles in headers or 1.18 cvs 5937: footers.</p> 5938: <pre> 'Copy' '(' BoxTypeToCopy ')' . 1.1 cvs 5939: BoxTypeToCopy = BoxID [ ExtStruct ] / 1.6 cvs 5940: ElemID [ ExtStruct ] . 1.18 cvs 5941: ExtStruct = '(' ElemID ')' .</pre> 1.30 ! cvs 5942: ! 5943: <p>Like the creation rules, the <tt>Copy</tt> rule cannot appear in the <a 1.18 cvs 5944: href="#sectc427">default presentation rules</a>. Moreover, this rule can only 5945: appear in the primary view's block of rules; the copy rule is applied to all 5946: views.</p> 1.30 ! cvs 5947: 1.18 cvs 5948: <blockquote class="example"> 1.30 ! cvs 5949: <p><strong>Example:</strong></p> ! 5950: ! 5951: <p>If the following definitions are in the structure schema:</p> ! 5952: <pre>Body = LIST OF (Chapter = 1.1 cvs 5953: BEGIN 5954: ChapterTitle = Text; 5955: ChapterBody = SectionSeq; 5956: END); 1.18 cvs 5957: RefChapter = REFERENCE (Chapter);</pre> 1.30 ! cvs 5958: ! 5959: <p>then the following presentation rules (among many other rules in the ! 5960: presentation schema) can be specified:</p> ! 5961: <pre>COUNTERS 1.1 cvs 5962: ChapterCtr : RANK OF Chapter; 5963: BOXES 5964: ChapterNumber : 5965: BEGIN 5966: Content : (VALUE (ChapterCtr, URoman)); 5967: ... 5968: END; 5969: RULES 5970: Chapter : 5971: BEGIN 5972: CreateFirst (ChapterNumber); 5973: ... 5974: END; 5975: RefChapter : 5976: BEGIN 5977: Copy (ChapterNumber); 5978: ... 1.18 cvs 5979: END;</pre> 1.30 ! cvs 5980: ! 5981: <p>which makes the number of the chapter designated by the reference appear ! 5982: in uppercase roman numerals, in place of the reference to a chapter itself. ! 5983: Alternatively, the chapter title can be made to appear in place of the ! 5984: reference by writing this <tt>Copy</tt>rule:</p> ! 5985: <pre> Copy (ChapterTitle);</pre> ! 5986: ! 5987: <p>To define a header box, named <tt>RunningTitle</tt>, which contains the ! 5988: title of the current chapter, the box's contents are defined in this ! 5989: way:</p> ! 5990: <pre>BOXES 1.1 cvs 5991: RunningTitle : 1.18 cvs 5992: Copy (ChapterTitle);</pre> 5993: </blockquote> 5994: </div> 5995: </div> 5996: <hr> 5997: </div> 1.1 cvs 5998: 1.18 cvs 5999: <div class="chapter"> 6000: <h1><a name="sect5">The T language</a></h1> 1.1 cvs 6001: 1.18 cvs 6002: <div class="section"> 1.30 ! cvs 6003: <h2><a name="sectb51">Document translation</a></h2> 1.1 cvs 6004: 1.30 ! cvs 6005: <p>Because of its document model, Thot can produce documents in a high-level 1.18 cvs 6006: abstract form. This form, called the <em>canonical form</em> is specific to 1.1 cvs 6007: Thot; it is well suited to the editor's manipulations, but it does not 6008: necessarily suit other operations which might be applied to documents. Because 6009: of this, the Thot editor offers the choice of saving documents in its own form 6010: (the canonical form) or a format defined by the user. In the latter case, the 6011: Thot document is transformed by the translation program. This facility can 6012: also be used to export documents from Thot to systems using other 1.18 cvs 6013: formalisms.</p> 1.1 cvs 6014: 1.18 cvs 6015: <div class="subsection"> 1.30 ! cvs 6016: <h3><a name="sectc511">Translation principles</a></h3> 1.1 cvs 6017: 1.30 ! cvs 6018: <p>Document translation allows the export of documents to other systems which ! 6019: do not accept Thot's canonical form. Translation can be used to export ! 6020: document to source-based formatters like T<sub><big>E</big></sub>X, 1.18 cvs 6021: L<sup>A</sup>T<sub><big>E</big></sub>X, and <tt>troff</tt>. It can also be 1.1 cvs 6022: used to translate documents into interchange formats like SGML or HTML. To 6023: allow the widest range of possible exports, Thot does not limit the choice of 6024: translations, but rather allows the user to define the formalisms into which 1.18 cvs 6025: documents can be translated.</p> 1.30 ! cvs 6026: ! 6027: <p>For each document or object class, a set of translation rules can be ! 6028: defined, specifying how the canonical form should be transformed into a given 1.18 cvs 6029: formalism. These translation rules are grouped into <em>translation 6030: schemas</em>, each schema containing the rules necessary to translate a 1.1 cvs 6031: generic logical structure (document or object structure) into a particular 6032: formalism. The same generic logical structure can have several different 6033: translation schemas, each defining translation rules for a different 1.18 cvs 6034: formalism.</p> 1.30 ! cvs 6035: ! 6036: <p>Like presentation schemas, translation schemas are generic. Thus, they ! 6037: apply to an entire object or document class and permit translation of all ! 6038: documents or objects of that class.</p> 1.18 cvs 6039: </div> 1.1 cvs 6040: 1.18 cvs 6041: <div class="subsection"> 1.30 ! cvs 6042: <h3><a name="sectc512">Translation procedure</a></h3> 1.1 cvs 6043: 1.30 ! cvs 6044: <p>The translator works on the specific logical structure of the document ! 6045: being translated. It traverses the primary tree of this logical structure in 1.1 cvs 6046: pre-order and, at each node encountered, it applies the corresponding 6047: translation rules defined in the translation schema. Translation can be 1.18 cvs 6048: associated:</p> 6049: <ul> 1.30 ! cvs 6050: <li>with element types defined in the structure schema,</li> ! 6051: <li>with global or local attributes defined in the structure schema,</li> ! 6052: <li>with specific presentation rules,</li> ! 6053: <li>with the content of the leaves of the structure (characters, symbols ! 6054: and graphical elements)</li> 1.18 cvs 6055: </ul> 1.30 ! cvs 6056: ! 6057: <p>Thus, for each node, the translator applies all rules associated with the 1.1 cvs 6058: element type, all rules associated with each attribute (local or global) 6059: carried by the element, and if the element is a leaf of the tree, it also 1.10 cvs 6060: applies translation rules for characters, symbols, or graphical elements, 1.18 cvs 6061: depending on the type of the leaf.</p> 1.30 ! cvs 6062: ! 6063: <p>Rules associated with the content of leaves are different from all other 1.1 cvs 6064: rules: they specify only how to translate character strings, symbols, and 6065: graphical elements. All other rules, whether associated with element types, 6066: with specific presentation rules or with attributes, are treated similarly. 1.18 cvs 6067: These rules primarily allow:</p> 6068: <ul> 1.30 ! cvs 6069: <li>generation of a text constant or variable before or after the contents ! 6070: of an element,</li> ! 6071: <li>modification of the order in which elements appear after ! 6072: translation,</li> ! 6073: <li>removal of an element in the translated document,</li> ! 6074: <li>and writing messages on the user's terminal during translation.</li> 1.18 cvs 6075: </ul> 6076: </div> 6077: </div> 1.1 cvs 6078: 1.18 cvs 6079: <div class="section"> 1.30 ! cvs 6080: <h2><a name="sectb52">Translation definition language</a></h2> 1.1 cvs 6081: 1.30 ! cvs 6082: <p>Translation schemas are written in a custom language, called T, which is 1.1 cvs 6083: described in the rest of this chapter. The grammar of T is specified using 1.18 cvs 6084: the same <a href="#sectc321">meta-language</a> as was used for the S and P 1.1 cvs 6085: languages and the translation schemas are written using the same conventions 6086: as the structure and presentation schemas. In particular, the keywords of the 6087: T language (the stings between apostrophes in the following syntax rules) can 6088: be written in any combination of upper-case and lower-case letters, but 6089: identifiers created by the programmer must always be written in the same 1.18 cvs 6090: way.</p> 1.1 cvs 6091: 1.18 cvs 6092: <div class="subsection"> 1.30 ! cvs 6093: <h3><a name="sectc521">Organization of a translation schema</a></h3> 1.1 cvs 6094: 1.30 ! cvs 6095: <p>A translation schema is begun by the <tt>TRANSLATION</tt> keyword and is 1.18 cvs 6096: terminated by the <tt>END</tt> keyword. The <tt>TRANSLATION</tt> keyword is 1.1 cvs 6097: followed by the name of the generic structure for which a translation is being 6098: defined and a semicolon. This name must be identical to the name which 1.18 cvs 6099: appears after the <tt>STRUCTURE</tt> keyword in the corresponding structure 6100: schema.</p> 1.30 ! cvs 6101: ! 6102: <p>After this declaration of the structure, the following material appears in 1.18 cvs 6103: order:</p> 6104: <ul> 1.30 ! cvs 6105: <li>the length of lines produced by the translation,</li> ! 6106: <li>the character delimiting the end of the line,</li> ! 6107: <li>the character string which the translator will insert if it must ! 6108: line-break the translated text,</li> ! 6109: <li>declarations of ! 6110: <ul> ! 6111: <li>buffers,</li> ! 6112: <li>counters,</li> ! 6113: <li>constants,</li> ! 6114: <li>variables,</li> ! 6115: </ul> ! 6116: </li> ! 6117: <li>translation rules associated with element types,</li> ! 6118: <li>translation rules associated with attributes,</li> ! 6119: <li>translation rules associated with specific presentation rules,</li> ! 6120: <li>translation rules associated with characters strings, symbols and ! 6121: graphical elements.</li> 1.18 cvs 6122: </ul> 1.30 ! cvs 6123: ! 6124: <p>Each of these sections is introduced by a keyword followed by a sequence of 1.1 cvs 6125: declarations. All of these sections are optional, expect for the translation 1.18 cvs 6126: rules associated with element types. Many <tt>TEXTTRANSLATE</tt> sections can 1.1 cvs 6127: appear, each defining the rules for translating character strings of a 1.18 cvs 6128: particular alphabet.</p> 6129: <pre> TransSchema ='TRANSLATION' ElemID ';' 1.1 cvs 6130: [ 'LINELENGTH' LineLength ';' ] 6131: [ 'LINEEND' CHARACTER ';' ] 6132: [ 'LINEENDINSERT' STRING ';' ] 6133: [ 'BUFFERS' BufferSeq ] 6134: [ 'COUNTERS' CounterSeq ] 6135: [ 'CONST' ConstSeq ] 6136: [ 'VAR' VariableSeq ] 6137: 'RULES' ElemSeq 6138: [ 'ATTRIBUTES' AttrSeq ] 6139: [ 'PRESENTATION' PresSeq ] 1.30 ! cvs 6140: < 'TEXTTRANSLATE' TextTransSeq > 1.1 cvs 6141: [ 'SYMBTRANSLATE' TransSeq ] 6142: [ 'GRAPHTRANSLATE' TransSeq ] 1.18 cvs 6143: 'END' .</pre> 6144: </div> 1.1 cvs 6145: 1.18 cvs 6146: <div class="subsection"> 1.30 ! cvs 6147: <h3><a name="sectc522">Line length</a></h3> 1.1 cvs 6148: 1.30 ! cvs 6149: <p>If a <tt>LINELENGTH</tt> instruction is present after the structure 1.1 cvs 6150: declaration, the translator divides the text it produces into lines, each line 6151: having a length less than or equal to the integer which follows the 1.18 cvs 6152: <tt>LINELENGTH</tt> keyword. This maximum line length is expressed as a 1.1 cvs 6153: number of characters. The end of the line is marked by the character defined 1.18 cvs 6154: by the <tt>LINEEND</tt> instruction. When the translator breaks the lines on 1.1 cvs 6155: a space character in generated text, this space will be replaced by the 1.18 cvs 6156: character string defined by the <tt>LINEENDINSERT</tt> instruction.</p> 1.30 ! cvs 6157: ! 6158: <p>If the <tt>LINEEND</tt> instruction is not defined then the linefeed ! 6159: character (octal code 12) is used as the default line end character. If the 1.18 cvs 6160: <tt>LINEENDINSERT</tt> instruction is not defined, the linefeed character is 6161: inserted at the end of the produced lines. If there is no <tt>LINELENGTH</tt> 1.1 cvs 6162: instruction, the translated text is not divided into lines. Otherwise, if the 6163: translation rules generate line end marks, these marks remain in the 6164: translated text, but the length of the lines is not controlled by the 1.18 cvs 6165: translator.</p> 6166: <pre> LineLength = NUMBER .</pre> 1.30 ! cvs 6167: 1.18 cvs 6168: <blockquote class="example"> 1.30 ! cvs 6169: <p><strong>Example:</strong></p> ! 6170: ! 6171: <p>To limit the lines produced by the translator to a length of 80 ! 6172: characters, the following rule is written at the beginning of the ! 6173: translation schema.</p> ! 6174: <pre>LineLength 80;</pre> 1.18 cvs 6175: </blockquote> 6176: </div> 1.1 cvs 6177: 1.18 cvs 6178: <div class="subsection"> 1.30 ! cvs 6179: <h3><a name="sectc523">Buffers</a></h3> 1.1 cvs 6180: 1.30 ! cvs 6181: <p>A buffer is a unit of memory managed by the translator, which can either 1.18 cvs 6182: contain text read from the terminal during the translation (see the <a 6183: href="#sectc5212"><tt>Read</tt> rule</a>), or the name of the last picture 1.1 cvs 6184: (bit-map) encountered by the translator in its traversal of the document. 1.2 cvs 6185: Remember the pictures are stored in files that are separate for the document 1.1 cvs 6186: files and that the canonical form contains only the names of the files in 1.18 cvs 6187: which the pictures are found.</p> 1.30 ! cvs 6188: ! 6189: <p>Thus, there are two types of buffers: buffers for reading from the ! 6190: terminal (filled by the <tt>Read</tt> rule) and the buffer of picture names ! 6191: (containing the name of the last picture encountered). A translation schema ! 6192: can use either type, one or several read buffers and one (and only one) ! 6193: picture name buffer.</p> ! 6194: ! 6195: <p>If any buffers are used, the <tt>BUFFERS</tt> keyword must be present, 1.1 cvs 6196: followed by declarations of every buffer used in the translation schema. Each 6197: buffer declaration is composed only of the name of the buffer, chosen freely 1.2 cvs 6198: by the programmer. The picture name buffer is identified by the 1.18 cvs 6199: <tt>Picture</tt> keyword, between parentheses, following the buffer name. The 6200: <tt>Picture</tt> keyword may only appear once. Each buffer declaration is 6201: terminated by a semicolon.</p> 1.30 ! cvs 6202: <pre> BufferSeq = Buffer < Buffer > . 1.1 cvs 6203: Buffer = BufferID [ '(' 'Picture' ')' ] ';' . 1.18 cvs 6204: BufferID = NAME .</pre> 1.30 ! cvs 6205: 1.18 cvs 6206: <blockquote class="example"> 1.30 ! cvs 6207: <p><strong>Example:</strong></p> ! 6208: ! 6209: <p>The following buffer declarations create a picture name buffer named ! 6210: <tt>pictureName</tt> and a read buffer named <a ! 6211: name="destname"><tt>DestName</tt></a>:</p> ! 6212: <pre>BUFFERS 1.18 cvs 6213: pictureName (Picture); DestName;</pre> 6214: </blockquote> 6215: </div> 1.1 cvs 6216: 1.18 cvs 6217: <div class="subsection"> 1.30 ! cvs 6218: <h3><a name="sectc524">Counters</a></h3> ! 6219: ! 6220: <p>Certain translation rules generate text that varies according to the ! 6221: context of the element to which the rules apply. Variable text is defined ! 6222: either in the <a href="#sectc526"><tt>VAR</tt> section</a> of the translation ! 6223: schema or in the rule itself (see the <tt>Create</tt> and <tt>Write</tt> ! 6224: rules). Both types of definition rely on counters for the calculation of ! 6225: variable material.</p> ! 6226: ! 6227: <p>There are two types of counter: counters whose value is explicitely ! 6228: computed by applying <a href="#sectc5221"><tt>Set</tt> and <tt>Add</tt> ! 6229: rules</a>, and counters whose value is computed by a function associated with ! 6230: the counter. Those functions allow the same calculations as can be used in ! 6231: presentation schemas. As in a presentation schema, counters must be defined in ! 6232: the <tt>COUNTERS</tt> section of the translation schema before they are ! 6233: used.</p> ! 6234: ! 6235: <p>When counters are used in a translation schema, the <tt>COUNTERS</tt> ! 6236: keyword is followed by the declarations of every counter used. Each ! 6237: declaration is composed of the counter's name possibly followed by a colon and ! 6238: the counting function to be used for the counter. The declaration is ! 6239: terminated by a semi-colon. If the counter is explicitely computed by ! 6240: <tt>Set</tt> and <tt>Add</tt> rules, no counting function is indicated. If a ! 6241: counting function is indicated, <tt>Set</tt> and <tt>Add</tt> rules cannot be ! 6242: applied to that counter.</p> 1.1 cvs 6243: 1.30 ! cvs 6244: <p>The counting function indicates how the counter's value will be computed. 1.18 cvs 6245: Three functions are available: <tt>Rank</tt>, <tt>Rlevel</tt>, and 6246: <tt>Set</tt>.</p> 6247: <ul> 1.30 ! cvs 6248: <li><tt>Rank of ElemID</tt> indicates that the counter's value is the rank ! 6249: of the element of type <tt>ElemID</tt> which encloses the element for ! 6250: which the counter is being evaluated. For the purposes of this function, ! 6251: an element of type <tt>ElemID</tt> is considered to enclose itself. This ! 6252: function is primarily used when the element of type <tt>ElemID</tt> is ! 6253: part of an aggregate or list, in which case the counter's value is the ! 6254: element's rank in its list or aggregate. Note that, unlike the ! 6255: <tt>Rank</tt> function for presentation schemas, the <tt>Page</tt> keyword ! 6256: cannot be used in place of the <tt>ElemID</tt>. ! 6257: <p>The type name <tt>ElemID</tt> can be followed by an integer. That ! 6258: number represents the relative level, among the ancestors of the concerned ! 6259: element, of the element whose rank is asked. If that relative level ! 6260: <i>n</i> is unsigned, the <i>n<sup>th</sup></i> element of type ! 6261: <tt>ElemID</tt> encountered when travelling the logical structure from the ! 6262: root to the concerned element is taken into account. If the relative ! 6263: level is negative, the logical structure is travelled in the other ! 6264: direction, from the concerned element to the root.</p> ! 6265: </li> ! 6266: <li><tt>Rlevel of ElemID</tt> indicates that the counter's values is the ! 6267: relative level in the tree of the element for which the counter is being ! 6268: evaluated. The counter counts the number of elements of type ! 6269: <tt>ElemID</tt> which are found on the path between the root of the ! 6270: document's logical structure tree and the element (inclusive).</li> ! 6271: <li><tt>Set n on Type1 Add m on Type2</tt> indicates that the counter's ! 6272: value is calculated as follows: in traversing the document from the ! 6273: beginning to the element for which the counter is being evaluated, the ! 6274: counter is set to the value <tt>n</tt> each time a <tt>Type1</tt> element ! 6275: is encountered and is incremented by the amount <tt>m</tt> each time a ! 6276: <tt>Type2</tt> element is encountered. The initial value <tt>n</tt> and ! 6277: the increment <tt>m</tt> are integers.</li> ! 6278: </ul> ! 6279: ! 6280: <p>As in a presentation schema, the <tt>Rank</tt> and <tt>Set</tt> functions ! 6281: can be modified by a numeric attribute which changes their initial value. This ! 6282: is indicated by the <tt>Init</tt> keyword followed by the numeric attribute's 1.18 cvs 6283: name. The <tt>Set</tt> function takes the value of the attribute instead of 6284: the <tt>InitValue</tt> (<tt>n</tt>). For the <tt>Rank</tt> function, the 1.1 cvs 6285: value of the attribute is considered to be the rank of the first element of 6286: the list (rather than the normal value of 1). Subsequent items in the list 6287: have their ranks shifted accordingly. In both cases, the attribute must be 1.18 cvs 6288: numeric and must be a local attribute of the root of the document itself.</p> 1.30 ! cvs 6289: <pre> CounterSeq = Counter < Counter > . 1.1 cvs 6290: Counter = CounterID [ ':' CounterFunc ] ';' . 6291: CounterID = NAME . 6292: CounterFunc = 'Rank' 'of' ElemID [ SLevelAsc ] 6293: [ 'Init' AttrID ] / 6294: 'Rlevel' 'of' ElemID / 6295: 'Set' InitValue 'On' ElemID 6296: 'Add' Increment 'On' ElemID 6297: [ 'Init' AttrID ] . 6298: SLevelAsc = [ '-' ] LevelAsc . 6299: LevelAsc = NUMBER . 6300: InitValue = NUMBER . 6301: Increment = NUMBER . 6302: ElemID = NAME . 1.18 cvs 6303: AttrID = NAME .</pre> 1.30 ! cvs 6304: 1.18 cvs 6305: <blockquote class="example"> 1.30 ! cvs 6306: <p><strong>Example:</strong></p> ! 6307: ! 6308: <p>If the body of a chapter is defined in the structure schema by:</p> ! 6309: <pre>Chapter_Body = LIST OF 1.1 cvs 6310: (Section = BEGIN 6311: Section_Title = Text; 6312: Section_Body = BEGIN 6313: Paragraphs; 6314: Section; 6315: END; 6316: END 1.18 cvs 6317: );</pre> 1.30 ! cvs 6318: ! 6319: <p>(sections are defined recursively), a counter can be defined giving the ! 6320: <a name="sectnum">number of a section</a> within its level in the ! 6321: hierarchy:</p> ! 6322: <pre>COUNTERS 1.18 cvs 6323: SectionNumber : Rank of Section;</pre> 1.30 ! cvs 6324: ! 6325: <p>A counter holding the hierarchic level of a section:</p> ! 6326: <pre> SectionLevel : Rlevel of Section;</pre> ! 6327: ! 6328: <p>A <a name="uniquenum">counter</a> which sequentially numbers all the ! 6329: document's sections, whatever their hierarchic level:</p> ! 6330: <pre> UniqueSectNum : Set 0 on Document Add 1 on Section;</pre> 1.18 cvs 6331: </blockquote> 6332: </div> 1.1 cvs 6333: 1.18 cvs 6334: <div class="subsection"> 1.30 ! cvs 6335: <h3><a name="sectc525">Constants</a></h3> 1.1 cvs 6336: 1.30 ! cvs 6337: <p>A common feature of translation rules is the generation of constant text. ! 6338: This text can be defined in the rule that generates it (see for example the <a 1.18 cvs 6339: href="#sectc5210"><tt>Create</tt></a> and <a 6340: href="#sectc5211"><tt>Write</tt></a> rules); but it can also be defined once 6341: in the constant declaration section and used many times in different rules. 6342: The latter option is preferable when the same text is used in several rules or 6343: several <a href="#sectc526">variables</a>.</p> 1.30 ! cvs 6344: ! 6345: <p>The <tt>CONST</tt> keyword begins the constant declaration section of the 1.1 cvs 6346: translation schema. It must be omitted if no constants are declared. Each 6347: constant declaration is composed of the constant name, an equals sign, and the 6348: constant's value, which is a character string between apostrophes. A constant 1.18 cvs 6349: declaration is terminated by a semicolon.</p> 1.30 ! cvs 6350: <pre> ConstSeq = Const < Const > . 1.1 cvs 6351: Const = ConstID '=' ConstValue ';' . 6352: ConstID = NAME . 1.18 cvs 6353: ConstValue = STRING .</pre> 1.30 ! cvs 6354: 1.18 cvs 6355: <blockquote class="example"> 1.30 ! cvs 6356: <p><strong><a name="levelexample">Example:</a></strong></p> ! 6357: ! 6358: <p>The following rule assigns the name <tt>TxtLevel</tt> to the character ! 6359: string ``Level'':</p> ! 6360: <pre>CONST 1.18 cvs 6361: TxtLevel = 'Level';</pre> 6362: </blockquote> 6363: </div> 1.1 cvs 6364: 1.18 cvs 6365: <div class="subsection"> 1.30 ! cvs 6366: <h3><a name="sectc526">Variables</a></h3> 1.1 cvs 6367: 1.30 ! cvs 6368: <p>Variables allow to define variable text which is generated by the 1.18 cvs 6369: <tt>Create</tt> and <tt>Write</tt> rules. They are also used to define file 6370: names which are used in the <tt>Create</tt>, <tt>ChangeMainFile</tt>, 6371: <tt>RemoveFile</tt>, and <tt>Indent</tt> rules. Variables can be defined 6372: either in the <tt>VAR</tt> section of the translation schema or directly in 6373: the rules which use them. Variables that define file names must be declared 6374: in the <tt>VAR</tt> section, and when the same variable is used several times 6375: in the translation schema, it makes sense to define it globally in the 6376: <tt>VAR</tt> section. This section is only present if at least one variable 6377: is defined globally.</p> 1.30 ! cvs 6378: ! 6379: <p>After the <tt>VAR</tt> keyword, each global variable is defined by its ! 6380: name, a colon separator and a sequence of functions (at least one function). ! 6381: Each variable definition is terminated by a semicolon. Functions determine the 1.1 cvs 6382: different parts which together give the value of the variable. The value is 6383: obtained by concatenating the strings produced by each of the functions. Seven 6384: types of functions are available. Each variable definition may use any number 1.18 cvs 6385: of functions of each type.</p> 6386: <ul> 1.30 ! cvs 6387: <li>The function <tt>Value(Counter)</tt>returns a string representing the ! 6388: value taken by the counter when it is evaluated for the element in whose ! 6389: rule the variable is used. The counter must have been declared in the ! 6390: <tt>COUNTERS</tt> section of the translation schema. When the counter is ! 6391: expressed in arabic numerals, the counter name can be followed by a colon ! 6392: and an integer indicating a minimum length (number of characters) for the ! 6393: string; if the counter's value is normally expressed with fewer characters ! 6394: than the required minimum, zeroes are added to the front of the string to ! 6395: achieve the minimum length. ! 6396: <p>By default, the counter value is written in arabic digits. If another ! 6397: representation of that value is needed, the counter name must be followed ! 6398: by a comma and one of the following keywords:</p> ! 6399: <ul> ! 6400: <li><tt>Arabic</tt>: arabic numerals (default value),</li> ! 6401: <li><tt>LRoman</tt>: lower-case roman numerals,</li> ! 6402: <li><tt>URoman</tt>: upper-case roman numerals,</li> ! 6403: <li><tt>Uppercase</tt>: upper-case letter,</li> ! 6404: <li><tt>Lowercase</tt>: lower-case letter.</li> ! 6405: </ul> ! 6406: </li> ! 6407: <li>The function <tt>FileDir</tt>, without parameter, returns a string ! 6408: representing the name of the directory of the output file that has been ! 6409: given as a parameter to the translation program. The string includes a ! 6410: character '/' at the end.</li> ! 6411: <li>The function <tt>FileName</tt>, without parameter, returns a string ! 6412: representing the name of the output file that has been given as a ! 6413: parameter to the translation program. The file extension (the character ! 6414: string that terminate the file name, after a dot) is not part of that ! 6415: string.</li> ! 6416: <li>The function <tt>Extension</tt>, without parameter, returns a string ! 6417: representing the extension of the file name. That string is empty if the ! 6418: file name that has been given as a parameter to the translation program ! 6419: has no extension. If there is an extension, its first character is a ! 6420: dot.</li> ! 6421: <li>The function <tt>DocumentName</tt>, without parameter, returns a string ! 6422: representing the name of the document being translated.</li> ! 6423: <li>The function <tt>DocumentDir</tt>, without parameter, returns a string ! 6424: representing the directory containing the document being translated.</li> ! 6425: <li>The function formed by the name of a constant returns that constant's ! 6426: value.</li> ! 6427: <li>The function formed by a character string between apostrophes returns ! 6428: that string.</li> ! 6429: <li>The function formed by the name of a buffer returns the contents of that ! 6430: buffer. If the named buffer is the picture buffer, then the name of the ! 6431: last picture encountered is returned. Otherwise, the buffer is a read ! 6432: buffer and the value returned is text previously read from the terminal. ! 6433: If the buffer is empty (no picture has been encountered or the ! 6434: <tt>Read</tt> rule has not been executed for the buffer), then the empty ! 6435: string is returned.</li> ! 6436: <li>The function formed by an attribute name takes the value of the ! 6437: indicated attribute for the element to which the variable applies. If the ! 6438: element does not have that attribute, then the element's ancestor are ! 6439: searched toward the root of the tree. If one of the ancestors does have ! 6440: the attribute then its value is used. If no ancestors have the attribute, ! 6441: then the value of the function is the empty string.</li> 1.18 cvs 6442: </ul> 1.30 ! cvs 6443: <pre> VariableSeq = Variable < Variable > . ! 6444: Variable = VarID ':' Function < Function > ';' . 1.1 cvs 6445: VarID = NAME . 6446: Function ='Value' '(' CounterID [ ':' Length ] 6447: [ ',' CounterStyle ] ')' / 6448: 'FileDir' / 'FileName' / 'Extension' / 6449: 'DocumentName' / 'DocumentDir' / 6450: ConstID / CharString / 6451: BufferID / AttrID . 6452: Length = NUMBER . 6453: CounterStyle= 'Arabic' / 'LRoman' / 'URoman' / 6454: 'Uppercase' / 'Lowercase' . 1.18 cvs 6455: CharString = STRING .</pre> 1.30 ! cvs 6456: 1.18 cvs 6457: <blockquote class="example"> 1.30 ! cvs 6458: <p><strong>Example:</strong></p> ! 6459: ! 6460: <p>To create, at the beginning of each section of the translated document, ! 6461: text composed of the string ``Section'' followed by the section number, the ! 6462: following <a name="varsectexample">variable definition</a> might be ! 6463: used:</p> ! 6464: <pre>VAR 1.18 cvs 6465: SectionVar : 'Section' Value(SectionNumber);</pre> 1.30 ! cvs 6466: ! 6467: <p>(see the definition of <a ! 6468: href="#sectnum"><tt>SectionNumber</tt></a>).</p> ! 6469: ! 6470: <p>The following variable definition can be used to create, at the beginning ! 6471: of each section, the text ``Level'' followed by the hierarchical level of ! 6472: the section. It used the constant defined above.</p> ! 6473: <pre> LevelVar : TxtLevel Value(SectionLevel);</pre> ! 6474: ! 6475: <p>(see the definitions of <a href="#sectnum"><tt>SectionLevel</tt></a> and ! 6476: of <a href="#levelexample"><tt>TxtLevel</tt></a>).</p> ! 6477: ! 6478: <p>To generate the translation of each section in a different file (see <a ! 6479: href="#sectc5220">rule <tt>ChangeMainFile</tt></a>), the name of these files ! 6480: might be defined by the following variable:</p> ! 6481: <pre> VarOutpuFile : FileName Value(SectionNumber) 1.18 cvs 6482: Extension;</pre> 1.30 ! cvs 6483: ! 6484: <p>If <tt>output.txt</tt> is the name of the <a name="varoutputfile">output ! 6485: file</a> specified when starting the translation program, translated ! 6486: sections are written in files <tt>output1.txt</tt>, <tt>output2.txt</tt>, ! 6487: etc.</p> 1.18 cvs 6488: </blockquote> 6489: </div> 6490: 6491: <div class="subsection"> 1.30 ! cvs 6492: <h3><a name="sectc527">Translating structure elements</a></h3> 1.18 cvs 6493: 1.30 ! cvs 6494: <p>The <tt>RULES</tt> keyword introduces the translation rules which will be 1.1 cvs 6495: applied to the various structured element types. Translation rules can be 6496: specified for each element type defined in the structure schema, including the 1.18 cvs 6497: base types defined implicitly, whose names are <tt>TEXT_UNIT</tt>, 6498: <tt>PICTURE_UNIT</tt>, <tt>SYMBOL_UNIT</tt>, <tt>GRAPHIC_UNIT</tt> and 6499: <tt>PAGE_UNIT</tt>. But it is not necessary to specify rules for every 6500: defined type.</p> 1.30 ! cvs 6501: ! 6502: <p>If there are no translation rules for an element type, the elements that it 1.1 cvs 6503: contains (and which may have rules themselves) will still be translated, but 6504: the translator will produce nothing for the element itself. To make the 1.18 cvs 6505: translator completely ignore the content of an element the <a 6506: href="#sectc5217"><tt>Remove</tt> rule</a> must be used.</p> 1.30 ! cvs 6507: ! 6508: <p>The translation rules for an element type defined in the structure schema ! 6509: are written using the name of the type followed by a colon and the list of 1.18 cvs 6510: applicable rules. When the element type is a <a href="#sectd3285">mark 6511: pair</a>, but only in this case, the type name must be preceded by the 6512: <tt>First</tt> or <tt>Second</tt> keyword. This keyword indicates whether the 6513: rules that follow apply to the first or second mark of the pair.</p> 1.30 ! cvs 6514: ! 6515: <p>The list of rules can take several forms. It may be a simple ! 6516: non-conditional rule. It can also be formed by a condition followed by one or ! 6517: more simple rules. Or it can be a block of rules beginning with the ! 6518: <tt>BEGIN</tt> keyword and ending with the <tt>END</tt> keyword and a ! 6519: semicolon. This block of rules can contain one or more simple rules and/or ! 6520: one or more conditions, each followed by one or more simple rules.</p> ! 6521: <pre> ElemSeq = TransType < TransType > . 1.1 cvs 6522: TransType = [ FirstSec ] ElemID ':' RuleSeq . 6523: FirstSec = 'First' / 'Second' . 1.30 ! cvs 6524: RuleSeq = Rule / 'BEGIN' < Rule > 'END' ';' . 1.1 cvs 6525: Rule = SimpleRule / ConditionBlock . 6526: ConditionBlock = 'IF' ConditionSeq SimpleRuleSeq . 1.30 ! cvs 6527: SimpleRuleSeq = 'BEGIN' < SimpleRule > 'END' ';' / 1.18 cvs 6528: SimpleRule .</pre> 6529: </div> 1.1 cvs 6530: 1.18 cvs 6531: <div class="subsection"> 1.30 ! cvs 6532: <h3><a name="sectc528">Conditional rules</a></h3> 1.1 cvs 6533: 1.30 ! cvs 6534: <p>In a translation schema, the translation rules are either associated with 1.1 cvs 6535: element types or with attribute values or with a specific presentation. They 6536: are applied by the translator each time an element of the corresponding type 6537: is encountered in the translated document or each time the attribute value is 6538: carried by an element or also, each time the specific translation is attached 6539: to an element. This systematic application of the rules can be relaxed: it is 6540: possible to add a condition to one or more rules, so that these rules are only 1.18 cvs 6541: applied when the condition is true.</p> 1.30 ! cvs 6542: ! 6543: <p>A condition begins with the keyword <tt>IF</tt>, followed by a sequence of 1.1 cvs 6544: elementary conditions. Elementary conditions are separated from each other by 1.18 cvs 6545: the <tt>AND</tt> keyword. If there is only one elementary condition, this 1.1 cvs 6546: keyword is absent. The rules are only applied if all the elementary 6547: conditions are true. The elementary condition can be negative; it is then 1.18 cvs 6548: preceded by the <tt>NOT</tt> keyword.</p> 1.30 ! cvs 6549: ! 6550: <p>When the translation rule(s) controlled by the condition apply to a ! 6551: reference element or a reference attribute, an elementary condition can also ! 6552: apply to element referred by this reference. The <tt>Target</tt> keyword is ! 6553: used for that purpose. It must appear before the keyword defining the ! 6554: condition type.</p> ! 6555: ! 6556: <p>Depending on their type, some conditions may apply either to the element ! 6557: with which they are associated, or to one of its ancestor. In the case of an 1.18 cvs 6558: ancestor, the key word <tt>Ancestor</tt> must be used, followed by</p> 6559: <ul> 1.30 ! cvs 6560: <li>either an integer which represents the number of levels in the tree ! 6561: between the element and the ancestor of interest,</li> ! 6562: <li>or the type name of the ancestor of interest. If that type is defined ! 6563: in a separate structure schema, the name of that schema must follow ! 6564: between parentheses.</li> 1.18 cvs 6565: </ul> 1.30 ! cvs 6566: ! 6567: <p>There is a special case for the parent element, which can be simply written 1.18 cvs 6568: <tt>Parent</tt> instead of <tt>Ancestor 1</tt>.</p> 1.30 ! cvs 6569: ! 6570: <p>Only conditions <tt>First</tt>, <tt>Last</tt>, <tt>Referred</tt>, 1.18 cvs 6571: <tt>Within</tt>, <tt>Attributes</tt>, <tt>Presentation</tt>, <tt>Comment</tt> 1.1 cvs 6572: and those concerning an attribute or a specific presentation can apply to an 1.18 cvs 6573: ancestor. Conditions <tt>Defined</tt>, <tt>FirstRef</tt>, <tt>LastRef</tt>, 6574: <tt>ExternalRef</tt>, <tt>Alphabet</tt>, <tt>FirstAttr</tt>, 6575: <tt>LastAttr</tt>, <tt>ComputedPage</tt>, <tt>StartPage</tt>, 6576: <tt>UserPage</tt>, <tt>ReminderPage</tt>, <tt>Empty</tt> cannot be preceded by 6577: keywords <tt>Parent</tt> or <tt>Ancestor</tt>.</p> 1.30 ! cvs 6578: ! 6579: <p>In condition <tt>Referred</tt> and in the condition that applies to a named 1.18 cvs 6580: attribute, a symbol '<tt>*</tt>' can indicate that the condition is related 1.5 cvs 6581: only to the element itself. If this symbol is not present, not only the 1.18 cvs 6582: element is considered, but also its ancestor, at any level.</p> 1.30 ! cvs 6583: ! 6584: <p>The form of an elementary condition varies according to the type of 1.18 cvs 6585: condition.</p> 1.1 cvs 6586: 1.18 cvs 6587: <div class="subsubsection"> 6588: <h4><a name="sectd5281">Conditions based on the logical position of the 6589: element</a></h4> 1.30 ! cvs 6590: ! 6591: <p>The condition can be on the position of the element in the document's ! 6592: logical structure tree. It is possible to test whether the element is the ! 6593: first (<tt>First</tt>) or last (<tt>Last</tt>) among its siblings or if it is ! 6594: not the first (<tt>NOT First</tt>) or not the last (<tt>NOT Last</tt>).</p> ! 6595: ! 6596: <p>It is also possible to test if the element is contained in an element of a 1.18 cvs 6597: given type (<tt>Within</tt>) or if it is not (<tt>NOT Within</tt>). If that 1.1 cvs 6598: element type is defined in a structure schema which is not the one which 6599: corresponds to the translation schema, the type name of this element must be 6600: followed, between parentheses, by the name of the structure schema which 1.18 cvs 6601: defines it.</p> 1.30 ! cvs 6602: ! 6603: <p>If the keyword <tt>Within</tt> is preceded by <tt>Immediately</tt>, the 1.18 cvs 6604: condition is satisfied only if the <em>parent</em> element has the type 6605: indicated. If the word <tt>Immediately</tt> is missing, the condition is 6606: satisfied if any <em>ancestor</em> has the type indicated.</p> 1.30 ! cvs 6607: ! 6608: <p>An integer <i>n</i> can appear between the keyword <tt>Within</tt> and the 1.1 cvs 6609: type. It specifies the number of ancestors of the indicated type that must be 6610: present for the condition to be satisfied. If the keyword 1.18 cvs 6611: <tt>Immediately</tt> is also present, the <i>n</i> immediate ancestors of the 6612: element must have the indicated type. The integer <i>n</i> must be positive 1.30 ! cvs 6613: or zero. It can be preceded by <tt><</tt> or <tt>></tt> to indicate a 1.1 cvs 6614: maximum or minimum number of ancestors. If these symbols are missing, the 1.18 cvs 6615: condition is satisfied only if it exists exactly <i>n</i> ancestors. When 1.30 ! cvs 6616: this number is missing, it is equivalent to > 0.</p> ! 6617: ! 6618: <p>If the condition applies to translation rules associated with an attribute, 1.18 cvs 6619: i.e. if it is in the <tt>ATTRIBUTES</tt> section of the presentation schema, 1.11 cvs 6620: the condition can be simply an element name. Translation rules are then 1.18 cvs 6621: executed only if the attribute is attached to an element of that type. The 6622: keyword <tt>NOT</tt> before the element name indicates that the translation 6623: rules must be executed only if the element is not of the type indicated.</p> 6624: </div> 1.1 cvs 6625: 1.18 cvs 6626: <div class="subsubsection"> 1.30 ! cvs 6627: <h4><a name="sectd5282">Conditions on references</a></h4> 1.1 cvs 6628: 1.30 ! cvs 6629: <p>References may be taken into account in conditions, which can be based on ! 6630: the fact that the element, or one of its ancestors (unless symbol <tt>*</tt> ! 6631: is present), is designated by a at least one reference (<tt>Referred</tt>) or ! 6632: by none (<tt>NOT Referred</tt>). If the element or attribute to which the 1.1 cvs 6633: condition is attached is a reference, the condition can be based on the fact 6634: that it acts as the first reference to the designated element 1.18 cvs 6635: (<tt>FirstRef</tt>), or as the last (<tt>LastRef</tt>), or as a reference to 6636: an element located in another document (<tt>ExternalRef</tt>). Like all 6637: conditions, conditions on references can be inverted by the <tt>NOT</tt> 6638: keyword.</p> 6639: </div> 6640: 6641: <div class="subsubsection"> 1.30 ! cvs 6642: <h4><a name="sectd5283">Conditions on the parameters</a></h4> 1.18 cvs 6643: 1.30 ! cvs 6644: <p>Elements which are <a href="#sectc326">parameters</a> can be given a 1.18 cvs 6645: particular condition which is based on whether or not the parameter is given a 6646: value in the document (<tt>Defined</tt> or <tt>NOT Defined</tt>, 6647: respectively).</p> 6648: </div> 1.1 cvs 6649: 1.18 cvs 6650: <div class="subsubsection"> 1.30 ! cvs 6651: <h4><a name="sectd5284">Conditions on the alphabets</a></h4> 1.1 cvs 6652: 1.30 ! cvs 6653: <p>The character string base type (and only this type) can use the condition 1.18 cvs 6654: <tt>Alphabet = a</tt> which indicates that the translation rule(s) should only 1.1 cvs 6655: apply if the alphabet of the character string is the one whose name appears 1.18 cvs 6656: after the equals sign (or is not, if there is a preceding <tt>NOT</tt> 1.1 cvs 6657: keyword). This condition cannot be applied to translation rules of an 1.18 cvs 6658: attribute.</p> 1.30 ! cvs 6659: ! 6660: <p>In the current implementation of Thot, the available alphabets are the 1.18 cvs 6661: <tt>Latin</tt> alphabet and the <tt>Greek</tt> alphabet.</p> 6662: </div> 1.1 cvs 6663: 1.18 cvs 6664: <div class="subsubsection"> 1.30 ! cvs 6665: <h4><a name="sectd5285">Conditions on page breaks</a></h4> 1.1 cvs 6666: 1.30 ! cvs 6667: <p>The page break base type (and only this type) can use the following 1.18 cvs 6668: conditions: <tt>ComputedPage</tt>, <tt>StartPage</tt>, <tt>UserPage</tt>, and 6669: <tt>ReminderPage</tt>. The <tt>ComputedPage</tt> condition indicates that the 1.1 cvs 6670: translation rule(s) should apply if the page break was created automatically 1.18 cvs 6671: by Thot; the <tt>StartPage</tt> condition is true if the page break is 6672: generated before the element by the <tt>Page</tt> rule of the P language; the 6673: <tt>UserPage</tt> condition applies if the page break was inserted by the 6674: user; and the <tt>ReminderPage</tt> is applied if the page break is a reminder 6675: of page breaking.</p> 6676: </div> 1.1 cvs 6677: 1.18 cvs 6678: <div class="subsubsection"> 1.30 ! cvs 6679: <h4><a name="sectd5286">Conditions on the element's content</a></h4> 1.1 cvs 6680: 1.30 ! cvs 6681: <p>The condition can be based on whether or not the element is empty. An ! 6682: element which has no children or whose leaves are all empty is considered to ! 6683: be empty itself. This condition is expressed by the <tt>Empty</tt> keyword, ! 6684: optionally preceded by the <tt>NOT</tt> keyword.</p> 1.18 cvs 6685: </div> 1.1 cvs 6686: 1.18 cvs 6687: <div class="subsubsection"> 1.30 ! cvs 6688: <h4><a name="sectd5287">Conditions on the presence of comments</a></h4> 1.1 cvs 6689: 1.30 ! cvs 6690: <p>The condition can be based on the presence or absence of comments ! 6691: associated with the translated element. This condition is expressed by the ! 6692: keyword <tt>Comment</tt>, optionally preceded by the keyword <tt>NOT</tt>.</p> 1.18 cvs 6693: </div> 1.1 cvs 6694: 1.18 cvs 6695: <div class="subsubsection"> 6696: <h4><a name="sectd5288">Conditions on the presence of specific presentation 6697: rules</a></h4> 1.30 ! cvs 6698: ! 6699: <p>The condition can be based on the presence or absence of specific ! 6700: presentation rules associated with the translated element, whatever the rules, ! 6701: their value or their number. This condition is expressed by the keyword 1.18 cvs 6702: <tt>Presentation</tt>, optionally preceded by the <tt>NOT</tt> keyword.</p> 6703: </div> 1.1 cvs 6704: 1.18 cvs 6705: <div class="subsubsection"> 6706: <h4><a name="sectd5289">Conditions on the presence of logical 6707: attributes</a></h4> 1.30 ! cvs 6708: ! 6709: <p>In the same way, the condition can be based on the presence or absence of 1.1 cvs 6710: attributes associated with the translated elements, no matter what the 1.18 cvs 6711: attributes or their values. The <tt>Attributes</tt> keyword expresses this 6712: condition.</p> 6713: </div> 1.1 cvs 6714: 1.18 cvs 6715: <div class="subsubsection"> 1.30 ! cvs 6716: <h4><a name="sectd52810">Conditions on logical attributes</a></h4> 1.1 cvs 6717: 1.30 ! cvs 6718: <p>If the condition appears in the translation rules of an attribute, the 1.18 cvs 6719: <tt>FirstAttr</tt> and <tt>LastAttr</tt> keywords can be used to indicate that 1.1 cvs 6720: the rules must only be applied if this attribute is the first attribute for 6721: the translated element or if it is the last (respectively). These conditions 1.18 cvs 6722: can also be inverted by the <tt>NOT</tt> keyword.</p> 1.30 ! cvs 6723: ! 6724: <p>Another type of condition can only be applied to the translation rules when 1.18 cvs 6725: the element being processed (or one of its ancestors if symbol <tt>*</tt> is 1.1 cvs 6726: missing) has a certain attribute, perhaps with a certain value or, in 6727: contrast, when the element does not have this attribute with this value. The 6728: condition is specified by writing the name of the attribute after the keyword 1.18 cvs 6729: <tt>IF</tt> or <tt>AND</tt>. The <tt>NOT</tt> keyword can be used to invert 1.1 cvs 6730: the condition. If the translation rules must be applied to any element which 6731: has this attribute (or does not have it, if the condition is inverted) no 6732: matter what the attribute's value, the condition is complete. If, in 6733: contrast, the condition applies to one or more values of the attribute, these 6734: are indicated after the name of the attribute, except for reference attributes 1.18 cvs 6735: which do not have values.</p> 1.30 ! cvs 6736: ! 6737: <p>The representation of the values of an <a name="relattr">attribute</a> in a 1.1 cvs 6738: condition depends on the attribute's type. For attributes with enumerated or 6739: textual types, the value (a name or character string between apostrophes, 6740: respectively) is simply preceded by an equals sign. For numeric attributes, 6741: the condition can be based on a single value or on a range of values. In the 6742: case of a unique value, this value (an integer) is simply preceded by an 1.18 cvs 6743: equals sign. Conditions based on ranges of values have several forms:</p> 6744: <ul> 1.30 ! cvs 6745: <li>all values less than a given value (the value is preceded by a ``less ! 6746: than'' sign).</li> ! 6747: <li>all values greater than a given value (the value is preceded by a ! 6748: ``greater than'' sign).</li> ! 6749: <li>all values falling in an interval, bounds included. The range of values ! 6750: is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>, where ! 6751: Minimum and Maximum are integers.</li> 1.18 cvs 6752: </ul> 1.30 ! cvs 6753: ! 6754: <p>All numeric values may be negative. The integer is simply preceded by a ! 6755: minus sign.</p> ! 6756: ! 6757: <p>Both local and global attributes can be used in conditions.</p> 1.18 cvs 6758: </div> 1.1 cvs 6759: 1.18 cvs 6760: <div class="subsubsection"> 1.30 ! cvs 6761: <h4><a name="sectd52811">Conditions on specific presentation rules</a></h4> 1.1 cvs 6762: 1.30 ! cvs 6763: <p>It is possible to apply translation rules only when the element being 1.1 cvs 6764: processed has or does not have a specific presentation rule, possibly with a 6765: certain value. The condition is specified by writing the name of the 1.18 cvs 6766: presentation rule after the keyword <tt>IF</tt> or <tt>AND</tt>. The 6767: <tt>NOT</tt> keyword can be used to invert the condition. If the translation 1.1 cvs 6768: rules must be applied to any element which has this presentation rule (or does 6769: not have it, if the condition is inverted) no matter what the rule's value, 6770: the condition is complete. If, in contrast, the condition applies to one or 6771: more values of the rule, these are indicated after the name of the 1.18 cvs 6772: attribute.</p> 1.30 ! cvs 6773: ! 6774: <p>The representation of presentation rule values in a condition is similar to 1.1 cvs 6775: that for attribute values. The representation of these values depend on the 6776: type of the presentation rule. There are three categories of presentation 1.18 cvs 6777: rules:</p> 6778: <ul> 1.30 ! cvs 6779: <li>those taking numeric values (<tt>Size, Indent, LineSpacing, ! 6780: LineWeight</tt>),</li> ! 6781: <li>those with values taken from a predefined list (<tt>Adjust, Justify, ! 6782: Hyphenate, Style, Weight, Font, UnderLine, Thickness, ! 6783: LineStyle</tt>),</li> ! 6784: <li>those whose value is a name (<tt>FillPattern, Background, ! 6785: Foreground</tt>).</li> 1.18 cvs 6786: </ul> 1.30 ! cvs 6787: ! 6788: <p>For presentation rules which take numeric values, the condition can take a 1.1 cvs 6789: unique value or a range of values. In the case of a unique value, this value 6790: (an integer) is simply preceded by an equals sign. Conditions based on ranges 1.18 cvs 6791: of values have several forms:</p> 6792: <ul> 1.30 ! cvs 6793: <li>all values less than a given value (the value is preceded by a ``less ! 6794: than'' sign).</li> ! 6795: <li>all values greater than a given value (the value is preceded by a ! 6796: ``greater than'' sign).</li> ! 6797: <li>all values falling in an interval, bounds included. The range of values ! 6798: is then specified <tt>IN [</tt>Minimum <tt>..</tt>Maximum<tt>]</tt>, where ! 6799: Minimum and Maximum are integers.</li> 1.18 cvs 6800: </ul> 1.30 ! cvs 6801: ! 6802: <p>Values for the <tt>Indent</tt>rule may be negative. The integer is then 1.2 cvs 6803: simply preceded by a minus sign and represents how far the first line starts 1.18 cvs 6804: to the left of the other lines.</p> 1.30 ! cvs 6805: ! 6806: <p>For presentation rules whose values are taken from predefined lists, the ! 6807: value which satisfies the condition is indicated by an equals sign followed by ! 6808: the name of the value.</p> ! 6809: ! 6810: <p>For presentation rule whose values are names, the value which satisfies the 1.1 cvs 6811: condition is indicated by the equals sign followed by the value's name. The 1.18 cvs 6812: names of fill patterns (the <tt>FillPattern</tt> rule) and of colors (the 6813: <tt>Foreground</tt> and <tt>Background</tt> rules) known to Thot are the same 6814: as in the P language.</p> 1.30 ! cvs 6815: ! 6816: <p>The syntax of conditions based on the specific presentation is the same as ! 6817: the syntax used to express the <a href="#sectc5224">translation of specific 1.18 cvs 6818: presentation rules</a>.</p> 1.30 ! cvs 6819: ! 6820: <p>When a condition has only one rule, the condition is simply followed by ! 6821: that rule. If it has several rules, they are placed after the condition ! 6822: between the keywords <tt>BEGIN</tt> and <tt>END</tt>.</p> 1.18 cvs 6823: <pre> ConditionSeq = Condition [ 'AND' Condition ] . 1.1 cvs 6824: Condition = [ 'NOT' ] [ 'Target' ] Cond . 6825: Cond = CondElem / CondAscend . 6826: CondElem ='FirstRef' / 'LastRef' / 6827: 'ExternalRef' / 6828: 'Defined' / 6829: 'Alphabet' '=' Alphabet / 6830: 'ComputedPage' / 'StartPage' / 6831: 'UserPage' / 'ReminderPage' / 6832: 'Empty' / 1.11 cvs 6833: ElemID / 1.1 cvs 6834: 'FirstAttr' / 'LastAttr' . 6835: CondAscend = [ Ascend ] CondOnAscend . 6836: Ascend = '*' / 'Parent' / 'Ancestor' LevelOrType . 6837: LevelOrType = CondRelLevel / ElemID [ ExtStruct ] . 6838: CondRelLevel = NUMBER . 6839: CondOnAscend ='First' / 'Last' / 6840: 'Referred' / 6841: [ 'Immediately' ] 'Within' [ NumParent ] 6842: ElemID [ ExtStruct ] / 6843: 'Attributes' / 6844: AttrID [ RelatAttr ] / 6845: 'Presentation' / 6846: PresRule / 6847: 'Comment' . 6848: NumParent = [ GreaterLess ] NParent . 1.30 ! cvs 6849: GreaterLess = '>' / '<' . 1.1 cvs 6850: NParent = NUMBER. 6851: ExtStruct = '(' ElemID ')' . 6852: Alphabet = NAME . 6853: RelatAttr ='=' Value / 1.30 ! cvs 6854: '>' [ '-' ] Minimum / 1.1 cvs 6855: '<' [ '-' ] Maximum / 6856: 'IN' '[' [ '-' ] MinInterval '..' 6857: [ '-' ] MaxInterval ']' . 6858: Value = [ '-' ] IntegerVal / TextVal / AttrValue . 6859: Minimum = NUMBER . 6860: Maximum = NUMBER . 6861: MinInterval = NUMBER . 6862: MaxInterval = NUMBER . 6863: IntegerVal = NUMBER . 6864: TextVal = STRING . 1.18 cvs 6865: AttrValue = NAME .</pre> 1.30 ! cvs 6866: 1.18 cvs 6867: <blockquote class="example"> 1.30 ! cvs 6868: <p><strong>Example:</strong></p> ! 6869: ! 6870: <p>Suppose that after each element of type Section_Title it is useful to ! 6871: produce the text <tt>\label{SectX}</tt> where <tt>X</tt> represents the ! 6872: section number, but only if the section is designated by one or more ! 6873: references in the document. The following conditional rule produces this ! 6874: effect:</p> ! 6875: <pre>RULES 1.1 cvs 6876: Section_Title : 6877: IF Referred 1.18 cvs 6878: Create ('\label{Sect' Value(UniqueSectNum) '}\12') After;</pre> 1.30 ! cvs 6879: ! 6880: <p>(the declaration of the <a href="#sectc5224"><tt>UniqueSectNum</tt> ! 6881: counter</a> is given above). The string <tt>\12</tt> represents a line ! 6882: break.</p> 1.18 cvs 6883: </blockquote> 1.30 ! cvs 6884: 1.18 cvs 6885: <blockquote class="example"> 1.30 ! cvs 6886: <p><strong>Example:</strong></p> ! 6887: ! 6888: <p>Suppose that for elements of the Elmnt type it would be useful to produce ! 6889: a character indicating the value of the numeric attribute Level associated ! 6890: with the element: an ``A'' for all values of Level less than 3, a ``B'' for ! 6891: values between 3 and 10 and a ``C'' for values greater than 10. This can be ! 6892: achieved by writing the following rules for the Elmnt type:</p> ! 6893: <pre>RULES 1.1 cvs 6894: Elmnt : 6895: BEGIN 6896: IF Level < 3 6897: Create 'A'; 6898: IF Level IN [3..10] 6899: Create 'B'; 1.30 ! cvs 6900: IF Level > 10 1.1 cvs 6901: Create 'C'; 1.18 cvs 6902: END;</pre> 6903: </blockquote> 6904: </div> 6905: </div> 1.1 cvs 6906: 1.18 cvs 6907: <div class="subsection"> 1.30 ! cvs 6908: <h3><a name="sectc529">Translation rules</a></h3> 1.1 cvs 6909: 1.30 ! cvs 6910: <p>Fifteen types of translation rules can be associated with element types and 1.18 cvs 6911: attribute values. They are the <tt>Create</tt>, <tt>Write</tt>, 6912: <tt>Read</tt>, <tt>Include</tt>, <tt>Get</tt>, <tt>Copy</tt>, <tt>Use</tt>, 6913: <tt>Remove</tt>, <tt>NoTranslation</tt>, <tt>NoLineBreak</tt>, 6914: <tt>ChangeMainFile</tt>, <tt>RemoveFile</tt>, <tt>Set</tt>, <tt>Add</tt>, 6915: <tt>Indent</tt>, rules. Each rule has its own syntax, although they are all 6916: based on very similar models.</p> 6917: <pre> SimpleRule = 'Create' [ 'IN' VarID ] Object 1.1 cvs 6918: [ Position ] ';' / 6919: 'Write' Object [ Position ] ';' / 6920: 'Read' BufferID [ Position ] ';' / 6921: 'Include' File [ Position ] ';' / 6922: 'Get' [ RelPosition ] ElemID 6923: [ ExtStruct ] 6924: [ Position ] ';' / 6925: 'Copy' [ RelPosition ] ElemID 6926: [ ExtStruct ] 6927: [ Position ] ';' / 6928: 'Use' TrSchema [ 'For' ElemID ] ';' / 6929: 'Remove' ';' / 6930: 'NoTranslation' ';' / 6931: 'NoLineBreak' ';' / 6932: 'ChangeMainFile' VarID [ Position ] ';' / 1.14 cvs 6933: 'RemoveFile' VarID [ Position ] ';' / 1.10 cvs 6934: 'Set' CounterID InitValue [ Position ] ';' / 6935: 'Add' CounterID Increment [ Position ] ';' / 1.25 cvs 6936: 'Indent' [ 'IN' VarID ] Indent [ Position ] ';' .</pre> 1.18 cvs 6937: </div> 6938: 6939: <div class="subsection"> 1.30 ! cvs 6940: <h3><a name="sectc5210">The <tt>Create</tt> rule</a></h3> 1.18 cvs 6941: 1.30 ! cvs 6942: <p>The most frequently used rule is undoubtedly the <tt>Create</tt> rule, ! 6943: which generates fixed or variable text (called an <em>object</em>) in the ! 6944: output file. The generated text can be made to appear either before or after ! 6945: the content of the element to which the rule applies. The rule begins with the 1.18 cvs 6946: <tt>Create</tt> keyword, followed by a specifier for the object and a keyword 6947: (<tt>Before</tt> or <tt>After</tt>) indicating the position of the generated 6948: text (<a href="#sectc5222">before or after</a> the element's content). If the 1.1 cvs 6949: position is not indicated, the object will be generated before the element's 6950: content. This rule, like all translation rules, is terminated by a 1.18 cvs 6951: semicolon.</p> 1.30 ! cvs 6952: ! 6953: <p>The <tt>Create</tt> keyword can be followed by the <tt>IN</tt> keyword and ! 6954: by the name of a variable. This means that the text generated by the rule ! 6955: must not be written in the main output file, but in the file whose name is 1.18 cvs 6956: specified by the variable.</p> 1.30 ! cvs 6957: ! 6958: <p>This allows the translation program to generate text in different files ! 6959: during the same run. These files do not need to be explicitely declared or ! 6960: opened. They do not need to be closed either, but if they contain temporary ! 6961: data, they can be removed (see the <a href="#sectc5220a"><tt>RemoveFile</tt> ! 6962: rule</a>). As soon as the translation program executes a <tt>Create</tt> rule ! 6963: for a file that is not yet open, it opens the file. These files are closed ! 6964: when the translation is finished.</p> 1.18 cvs 6965: <pre> 'Create' [ 'IN' VarID ] Object 1.1 cvs 6966: [ Position ] ';' 6967: Object = ConstID / CharString / 6968: BufferID / 6969: VarID / 1.30 ! cvs 6970: '(' Function < Function > ')' / 1.21 cvs 6971: [ 'Translated' ] AttrID / 1.1 cvs 6972: 'Value' / 6973: 'Content' / 6974: 'Comment' / 6975: 'Attributes' / 6976: 'Presentation' / 6977: 'RefId' / 6978: 'PairId' / 6979: 'FileDir' / 6980: 'FileName' / 6981: 'Extension' / 6982: 'DocumentName' / 6983: 'DocumentDir' / 6984: [ 'Referred' ] ReferredObject . 6985: Position ='After' / 'Before' . 6986: 6987: ReferredObject = VarID / 6988: ElemID [ ExtStruct ] / 6989: 'RefId' / 6990: 'DocumentName' / 1.18 cvs 6991: 'DocumentDir' .</pre> 1.30 ! cvs 6992: ! 6993: <p>The object to be generated can be:</p> 1.18 cvs 6994: <ul> 1.30 ! cvs 6995: <li>a constant string, specified by its name if it is declared in the ! 6996: schema's <tt>CONST</tt> section, or given directly as a value between ! 6997: apostrophes;</li> ! 6998: <li>the contents of a buffer, designated by the name of the buffer;</li> ! 6999: <li>a variable, designated by its name if it is declared in the translation ! 7000: schema's <tt>VAR</tt> section, or given directly between parentheses. The ! 7001: text generated is the value of that variable evaluated for the element to ! 7002: which the rule applies.</li> ! 7003: <li>the value of an attribute, if the element being translated has this ! 7004: attribute. The attribute is specified by its name. If it's a text ! 7005: attribute, it can be preceded by the <code>Translated</code> keyword, ! 7006: which causes the attribute value to be recoded using the text translation ! 7007: table defined by section <code><a ! 7008: href="#sectc5225">TEXTTRANSLATE</a></code>;</li> ! 7009: <li>the value of a specific presentation rule. This object can only be ! 7010: generated if the translation rule is for a <a href="#prestransl">specific ! 7011: presentation rule</a>. It is specified by the <tt>Value</tt> ! 7012: keyword;</li> ! 7013: <li>the element's content. That is, the content of the leaves of the ! 7014: subtree of the translated element. This is specified by the ! 7015: <tt>Content</tt> keyword;</li> ! 7016: <li>the comment attached to the element. When the element doesn't have a ! 7017: comment, nothing is generated. This is indicated by the <tt>Comment</tt> ! 7018: keyword;</li> ! 7019: <li>the translation of all attributes of the element (which is primarily ! 7020: used to apply the attribute translation rules <a ! 7021: href="#sectc5222">before</a> those of the element type). This is ! 7022: specified by the <tt>Attributes</tt> keyword.</li> ! 7023: <li>the translation of all of the element's specific presentation rules ! 7024: (which is primarily used to apply the translation rules for the specific ! 7025: presentation rules <a href="#sectc5222">before</a> those of the element or ! 7026: its attributes). This option is specified by the <tt>Presentation</tt> ! 7027: keyword;</li> ! 7028: <li>The value of the reference's identifier.<br> ! 7029: Thot associates a unique identifier with each element in a document. This ! 7030: identifier (called <em>reference's identifier</em> or <em>label</em>) is a ! 7031: character string containing the letter `L' followed by digits. Thot uses ! 7032: it in references for identifying the referred element.<br> ! 7033: The <tt>RefId</tt> keyword produces the reference's identifier of the ! 7034: element to which the translation rule is applied, or the reference's ! 7035: identifier of its first ancestor that is referred by a reference or that ! 7036: can be referred by a reference.</li> ! 7037: <li>the value of a mark pair's unique identifier. This may only be used for ! 7038: <a href="#sectd3285">mark pairs</a> and is indicated by the ! 7039: <tt>PairId</tt> keyword.</li> ! 7040: <li>the directory containing the file being generated (this string includes ! 7041: an ending '/', if it is not empty). This is indicated by the ! 7042: <tt>FileDir</tt> keyword.</li> ! 7043: <li>the name of the file being generated (only the name, without the ! 7044: directory and without the extension). This is indicated by the ! 7045: <tt>FileName</tt> keyword.</li> ! 7046: <li>the extension of the file being generated (this string starts with a ! 7047: dot, if it is not empty). This is indicated by the <tt>Extension</tt> ! 7048: keyword.</li> ! 7049: <li>the name of the document being translated. This is indicated by the ! 7050: <tt>DocumentName</tt> keyword.</li> ! 7051: <li>the directory containing the document being translated. This is ! 7052: indicated by the <tt>DocumentDir</tt> keyword.</li> 1.18 cvs 7053: </ul> 1.30 ! cvs 7054: ! 7055: <p>When the rule applies to a reference (an element or an attribute defined as ! 7056: a reference in the structure schema), it can generate a text related to the 1.21 cvs 7057: element referred by that reference. The rule name is then followed by the 1.18 cvs 7058: <tt>Referred</tt> keyword and a specification of the object to be generated 7059: for the referred element. This specification can be:</p> 7060: <ul> 1.30 ! cvs 7061: <li>the name of a variable. The rule generates the value of that variable, ! 7062: computed for the referred element.</li> ! 7063: <li>an element type. The rule generates the translation of the element of ! 7064: that type, which is in the subtree of the referred element. If this ! 7065: element is not defined in the structure schema which corresponds to the ! 7066: translation schema (that is, an object defined in another schema), the ! 7067: element's type name must be followed by the name of its structure schema ! 7068: between parentheses.</li> ! 7069: <li>the <tt>RefId</tt> keyword. The rule generates the reference's ! 7070: identifier of the referred element.</li> ! 7071: <li>the <tt>DocumentName</tt> keyword. The rule generates the name of the ! 7072: document to which the referred element belongs.</li> ! 7073: <li>the <tt>DocumentDir</tt> keyword. The rule generates the name of the ! 7074: directory that contains the document of the referred element.</li> 1.18 cvs 7075: </ul> 7076: </div> 1.1 cvs 7077: 1.18 cvs 7078: <div class="subsection"> 1.30 ! cvs 7079: <h3><a name="sectc5211">The <tt>Write</tt> rule</a></h3> 1.1 cvs 7080: 1.30 ! cvs 7081: <p>The <tt>Write</tt> has the same syntax as the <tt>Create</tt> rule. It ! 7082: also produces the same effect, but the generated text is displayed on the ! 7083: user's terminal during the translation of the document, instead of being ! 7084: produced in the translated document. This is useful for helping the user keep ! 7085: track of the progress of the translation and for prompting the user on the ! 7086: terminal for input required by the <tt>Read</tt> rule.</p> 1.18 cvs 7087: <pre> 'Write' Object [ Position ] ';'</pre> 1.30 ! cvs 7088: ! 7089: <p>Notice: if the translator is launched by the editor (by the ``Save as'' 1.18 cvs 7090: command), messages produced by the <tt>Write</tt> rule are not displayed.</p> 1.30 ! cvs 7091: 1.18 cvs 7092: <blockquote class="example"> 1.30 ! cvs 7093: <p><strong>Example:</strong></p> ! 7094: ! 7095: <p>To make the translator display the number of each section being ! 7096: translated on the user's terminal, the following rule is specified for the ! 7097: <tt>Section</tt> element type:</p> ! 7098: <pre>Section : BEGIN 1.1 cvs 7099: Write VarSection; 7100: ... 1.18 cvs 7101: END;</pre> 1.30 ! cvs 7102: ! 7103: <p>(see <a href="#varsectexample">above</a> for the definition of the ! 7104: <tt>VarSection</tt> variable).</p> ! 7105: ! 7106: <p>To display text on the terminal before issuing a read operation with the ! 7107: <tt>Read</tt> rule, the following rule is used:</p> ! 7108: <pre>BEGIN 1.1 cvs 7109: Write 'Enter the name of the destination: '; 7110: ... 1.18 cvs 7111: END;</pre> 7112: </blockquote> 7113: </div> 7114: 7115: <div class="subsection"> 1.30 ! cvs 7116: <h3><a name="sectc5212">The <tt>Read</tt> rule</a></h3> 1.18 cvs 7117: 1.30 ! cvs 7118: <p>The <tt>Read</tt> rule reads text from the terminal during the translation ! 7119: of the document and saves the text read in one of the buffers declared in the 1.18 cvs 7120: <tt>BUFFERS</tt> section of the schema. The buffer to be used is indicated by 7121: its name, after the <tt>READ</tt> keyword. This name can be followed, as in 7122: the <tt>Create</tt> and <tt>Write</tt> rules, by a keyword indicating if the 7123: read operation must be performed <tt>Before</tt> or <tt>After</tt> the 1.1 cvs 7124: translation of the element's content. If this keyword is absent, the read 7125: operation is done beforehand. The text is read into the buffer and remains 1.5 cvs 7126: there until a rule using the same buffer - possibly the same rule - is 1.18 cvs 7127: applied.</p> 7128: <pre> 'Read' BufferID [ Position ] ';'</pre> 1.30 ! cvs 7129: 1.18 cvs 7130: <blockquote class="example"> 1.30 ! cvs 7131: <p><strong>Example:</strong></p> ! 7132: ! 7133: <p>The following set of rules tells the user that the translator is waiting ! 7134: for the entry of some text, reads this text into a buffer and copies the ! 7135: text into the translated document.</p> ! 7136: <pre>BEGIN 1.1 cvs 7137: Write 'Enter the name of the destination: '; 7138: Read DestName; 7139: Create DestName; 7140: ... 1.18 cvs 7141: END;</pre> 1.30 ! cvs 7142: ! 7143: <p>(see <a href="#destname">above</a> the definition of ! 7144: <tt>DestName</tt>).</p> 1.18 cvs 7145: </blockquote> 7146: </div> 7147: 7148: <div class="subsection"> 1.30 ! cvs 7149: <h3><a name="sectc5213">The <tt>Include</tt> rule</a></h3> 1.18 cvs 7150: 1.30 ! cvs 7151: <p>The <tt>Include</tt> rule, like the <tt>Create</tt> rule, is used to ! 7152: produce text in the translated document. It inserts constant text which is ! 7153: not defined in the translation schema, but is instead taken from a file. The 1.18 cvs 7154: file's name is specified after the <tt>Include</tt> keyword, either directly 1.1 cvs 7155: as a character string between apostrophes or as the name of one of the buffers 1.18 cvs 7156: declared in the <tt>BUFFERS</tt> section of the schema. In the latter case, 1.1 cvs 7157: the buffer is assumed to contain the file's name. This can be used when the 7158: included file's name is known only at the moment of translation. This only 1.18 cvs 7159: requires that the <tt>Include</tt> rule is preceded by a <tt>Read</tt> rule 7160: which puts the name of the file desired by the user into the buffer.</p> 1.30 ! cvs 7161: ! 7162: <p>Like the other rules, it is possible to specify whether the inclusion will 1.1 cvs 7163: occur before or after the element's content, with the default being before. 7164: The file inclusion is only done at the moment of translation, not during the 7165: compilation of the translation schema. Thus, the file to be included need not 7166: exist during the compilation, but it must be accessible at the time of 7167: translation. Its contents can also be modified between two translations, thus 7168: producing different results, even if neither the document or the translation 1.18 cvs 7169: schema are modified.</p> 1.30 ! cvs 7170: ! 7171: <p>During translation, the file to be included is searched for along the ! 7172: schema directory path (indicated by the environment variable ! 7173: <tt>THOTSCH</tt>). The file name is normally only composed of a simple name, ! 7174: without specification of a complete file path. However, if the filename ! 7175: starts with a '/', it is considered as an absolute path.</p> 1.18 cvs 7176: <pre> 'Include' File [ Position ] ';' 1.6 cvs 7177: File = FileName / BufferID . 1.18 cvs 7178: FileName = STRING .</pre> 1.30 ! cvs 7179: 1.18 cvs 7180: <blockquote class="example"> 1.30 ! cvs 7181: <p><strong>Example:</strong></p> ! 7182: ! 7183: <p>Suppose that it is desirable to print documents of the Article class with ! 7184: a formatter which requires a number of declarations and definitions at the ! 7185: beginning of the file. The <tt>Include</tt>rule can be used to achieve ! 7186: this. All the declarations and definitions a replaced in a file called ! 7187: <tt>DeclarArt</tt> and then the <tt>Article</tt> element type is given the ! 7188: following rule:</p> ! 7189: <pre>Article : BEGIN 1.1 cvs 7190: Include 'DeclarArt' Before; 7191: ... 1.18 cvs 7192: END;</pre> 7193: </blockquote> 7194: </div> 7195: 7196: <div class="subsection"> 1.30 ! cvs 7197: <h3><a name="sectc5214">The <tt>Get</tt> rule</a></h3> 1.18 cvs 7198: 1.30 ! cvs 7199: <p>The <tt>Get</tt> rule is used to change the order in which the elements ! 7200: appear in the translated document. More precisely, it produces the ! 7201: translation of a specified element before or after the translation of the ! 7202: content of the element to which the rule applies. The <tt>Before</tt> and ! 7203: <tt>After</tt> keywords are placed at the end of the rule to specify whether ! 7204: the operation should be performed before or after translation of the rule's ! 7205: element (the default is before). The type of the element to be moved must be ! 7206: specified after the <tt>Get</tt> keyword, optionally preceded by a keyword ! 7207: indicating where the element will be found in the logical structure of the ! 7208: document:</p> 1.18 cvs 7209: <dl> 1.30 ! cvs 7210: <dt><tt>Included</tt></dt> ! 7211: <dd>The element to be moved is the first element of the indicated type ! 7212: which is found inside the element to which the rule applies.</dd> ! 7213: <dt><tt>Referred</tt></dt> ! 7214: <dd>This keyword can only be used if the rule applies to a reference ! 7215: element. The element to be moved is either the element designated by the ! 7216: reference (if that element is of the specified type), or the first ! 7217: element of the desired type contained within the element designated by ! 7218: the reference.</dd> ! 7219: <dt>no keyword</dt> ! 7220: <dd>If the element to be moved is an associated element, defined in the <a ! 7221: href="#sectc314"><tt>ASSOC</tt> section</a> of the structure schema, all ! 7222: associated elements of this type which have not been translated yet are ! 7223: then translated. Certain elements may in fact have already been ! 7224: translated by a <tt>Get Referred</tt> rule. ! 7225: <p>If the element to be moved is not an associated element, the ! 7226: translator takes the first element of the indicated type from among the ! 7227: siblings of the rule's element. This is primarily used to change the ! 7228: order of the components of an aggregate.</p> ! 7229: </dd> 1.18 cvs 7230: </dl> 1.30 ! cvs 7231: ! 7232: <p>If the element to be moved is defined in a structure schema which is not ! 7233: the one which corresponds to the translation schema (in the case of an ! 7234: included object with a different schema), the type name of this element must ! 7235: be followed, between parentheses, by the name of the structure schema which 1.18 cvs 7236: defines it.</p> 7237: <pre> 'Get' [ RelPosition ] ElemID 1.6 cvs 7238: [ ExtStruct ] 7239: [ Position ] ';' / 7240: RelPosition = 'Included' / 'Referred' . 1.18 cvs 7241: ExtStruct = '(' ElemID ')' .</pre> 1.30 ! cvs 7242: ! 7243: <p>The <tt>Get</tt> rule has no effect if the element which it is supposed to 1.1 cvs 7244: move has already been translated. Thus, the element will not be duplicated. 7245: It is generally best to associate the rule with the first element which will 7246: be encountered by the translator in its traversal of the document. Suppose an 1.18 cvs 7247: aggregate has two elements <tt>A</tt> and <tt>B</tt>, with <tt>A</tt> 1.1 cvs 7248: appearing first in the logical structure. To permute these two elements, a 1.18 cvs 7249: <tt>Get B before</tt> rule should be associated with the <tt>A</tt> element 7250: type, not the inverse. Similarly, a rule of the form <tt>Get Included X 7251: After</tt>, even though syntactically correct, makes no sense since, by the 1.1 cvs 7252: time it will be applied, after the translation of the contents of the element 1.18 cvs 7253: to which it is attached, the <tt>X</tt> element will already have been 7254: translated.</p> 1.30 ! cvs 7255: ! 7256: <p>The <tt>Get</tt> rule is the only way to obtain the translation of the 1.1 cvs 7257: associated elements. In fact, the translator only traverses the primary tree 7258: of the document and thus does not translate the associated elements, except 1.18 cvs 7259: when the translation is explicitly required by a <tt>Get Referred Type</tt> or 7260: <tt>Get Type</tt> rule where <tt>Type</tt> is an associated element type.</p> 1.30 ! cvs 7261: 1.18 cvs 7262: <blockquote class="example"> 1.30 ! cvs 7263: <p><strong>Example:</strong></p> ! 7264: ! 7265: <p>The structure schema defined figures as associated element which are ! 7266: composed of some content and a caption. Moreover, it is possible to make ! 7267: references to figures, using elements of the <tt>RefFigure</tt> type:</p> ! 7268: <pre> ... 1.1 cvs 7269: RefFigure = REFERENCE(Figure); 7270: ASSOC 1.6 cvs 7271: Figure = BEGIN 7272: Content = NATURE; 7273: Caption = Text; 7274: END; 1.18 cvs 7275: ...</pre> 1.30 ! cvs 7276: ! 7277: <p>Suppose it would be useful to make a figure appear in the translated ! 7278: document at the place in the text where the first reference to the figure is ! 7279: made. If some figures are not referenced, then they would appear at the end ! 7280: of the document. Also, each figure's caption should appear before the ! 7281: content. The following rules in the translation schema will produce this ! 7282: result:</p> ! 7283: <pre>Article : BEGIN 1.1 cvs 7284: ... 7285: Get Figures After; 7286: END; 7287: RefFigure : BEGIN 7288: If FirstRef Get Referred Figure; 7289: ... 7290: END; 7291: Content : BEGIN 7292: Get Caption Before; 7293: ... 1.18 cvs 7294: END;</pre> 7295: </blockquote> 7296: </div> 7297: 7298: <div class="subsection"> 1.30 ! cvs 7299: <h3><a name="sectc5215">The <tt>Copy</tt> rule</a></h3> 1.18 cvs 7300: 1.30 ! cvs 7301: <p>Like the <tt>Get</tt> rule, the <tt>Copy</tt> rule generates the ! 7302: translation of a specified element, but it acts even if the element has ! 7303: already been translated and it allows to copy it or to translate it later. ! 7304: Both rules have the same syntax.</p> 1.18 cvs 7305: <pre> 'Copy' [ RelPosition ] ElemID 7306: [ ExtStruct ] [ Position ] ';'</pre> 7307: </div> 7308: 7309: <div class="subsection"> 1.30 ! cvs 7310: <h3><a name="sectc5216">The <tt>Use</tt> rule</a></h3> 1.18 cvs 7311: 1.30 ! cvs 7312: <p>The <tt>Use</tt> rule specifies the translation schema to be applied to 1.1 cvs 7313: objects of a certain class that are part of the document. This rule only 7314: appears in the rules for the root element of the document (the first type 1.18 cvs 7315: defined after the <tt>STRUCT</tt> keyword in the structure schema) or the 1.1 cvs 7316: rules of an element defined by an external structure (by another structure 1.18 cvs 7317: schema). Also, the <tt>Use</tt> rule cannot be conditional.</p> 1.30 ! cvs 7318: ! 7319: <p>If the rule is applied to an element defined by an external structure, the 1.18 cvs 7320: <tt>Use</tt> keyword is simply followed by the name of the translation schema 1.1 cvs 7321: to be used for element constructed according to that external structure. If 7322: the rule is applied to the document's root element, it is formed by the 1.18 cvs 7323: <tt>Use</tt> keyword followed by the translation schema's name, the 7324: <tt>For</tt> keyword and the name of the external structure to which the 7325: indicated translation schema should be applied.</p> 7326: <pre> 'Use' TrSchema [ 'For' ElemID ] ';' 7327: TrSchema = NAME .</pre> 1.30 ! cvs 7328: ! 7329: <p>If no <tt>Use</tt> rule defines the translation schema to be used for an 1.1 cvs 7330: external structure which appears in a document, the translator asks the user, 7331: during the translation process, which schema should be used. Thus, it is not 1.18 cvs 7332: necessary to give the translation schema a <tt>Use</tt> rule for every 1.1 cvs 7333: external structure used, especially when the choice of translation schemas is 1.18 cvs 7334: to be left to the user.</p> 1.30 ! cvs 7335: ! 7336: <p>Notice: if the translator is launched by the editor (by the ``Save as'' 1.18 cvs 7337: command), prompts are not displayed.</p> 1.30 ! cvs 7338: 1.18 cvs 7339: <blockquote class="example"> 1.30 ! cvs 7340: <p><strong>Example:</strong></p> ! 7341: ! 7342: <p>The <tt>Article</tt> structure schema uses the <tt>Formula</tt> external ! 7343: structure, defined by another structure schema, for mathematical ! 7344: formulas:</p> ! 7345: <pre>STRUCTURE Article; 1.1 cvs 7346: ... 7347: STRUCT 7348: Article = ... 7349: ... 7350: Formula_in_text = Formula; 7351: Isolated_formula = Formula; 7352: ... 1.18 cvs 7353: END</pre> 1.30 ! cvs 7354: ! 7355: <p>Suppose that it would be useful to use the <tt>FormulaT</tt> translation ! 7356: schema for the formulas of an article. This can be expressed in two ! 7357: different ways in the <tt>Article</tt> class translation schema, using the ! 7358: rules:</p> ! 7359: <pre>RULES 1.1 cvs 7360: Article : 1.18 cvs 7361: Use FormulaT for Formula;</pre> 1.30 ! cvs 7362: ! 7363: <p>or:</p> ! 7364: <pre>RULES 1.1 cvs 7365: ... 7366: Formula : 1.18 cvs 7367: Use FormulaT;</pre> 7368: </blockquote> 7369: </div> 7370: 7371: <div class="subsection"> 1.30 ! cvs 7372: <h3><a name="sectc5217">The <tt>Remove</tt> rule</a></h3> 1.18 cvs 7373: 1.30 ! cvs 7374: <p>The <tt>Remove</tt> rule indicates that nothing should be generated, in the 1.1 cvs 7375: translated document, for the content of the element to which the rule applies. 7376: The content of that element is simply ignored by the translator. This does 7377: not prevent the generation of text for the element itself, using the 1.18 cvs 7378: <tt>Create</tt> or <tt>Include</tt> rules, for example.</p> 1.30 ! cvs 7379: ! 7380: <p>The <tt>Remove</tt> rule is simply written with the <tt>Remove</tt> ! 7381: keyword. It is terminated, like all rules, by a semicolon.</p> 1.18 cvs 7382: <pre> 'Remove' ';'</pre> 7383: </div> 7384: 7385: <div class="subsection"> 1.30 ! cvs 7386: <h3><a name="sectc5218">The <tt>NoTranslation</tt> rule</a></h3> 1.18 cvs 7387: 1.30 ! cvs 7388: <p>The <tt>NoTranslation</tt> rule indicates to the translator that it must ! 7389: not translate the content of the leaves of the element to which it applies. In 1.18 cvs 7390: contrast to the <tt>Remove</tt> rule, it does not suppress the content of the 1.1 cvs 7391: element, but it inhibits the translation of character strings, symbols, and 7392: graphical elements contained in the element. These are retrieved so that 1.18 cvs 7393: after the translation of the document, the rules of the <a 7394: href="#sectc5225"><tt>TEXTTRANSLATE</tt>, <tt>SYMBTRANSLATE</tt> and 7395: <tt>GRAPHTRANSLATE</tt> sections</a> will not be applied to them.</p> 1.30 ! cvs 7396: ! 7397: <p>The <tt>NoTranslation</tt> rule is written with the <tt>NoTranslation</tt> 1.18 cvs 7398: keyword followed by a semicolon.</p> 7399: <pre> 'NoTranslation' ';'</pre> 7400: </div> 7401: 7402: <div class="subsection"> 1.30 ! cvs 7403: <h3><a name="sectc5219">The <tt>NoLineBreak</tt> rule</a></h3> 1.18 cvs 7404: 1.30 ! cvs 7405: <p>The <tt>NoLineBreak</tt> rule indicates to the translator that it must not 1.1 cvs 7406: generate additional line breaks in the output produced for the element to 1.18 cvs 7407: which it applies. This is as if it was an <a href="#sectc522">instruction 7408: <tt>LINELENGTH 0;</tt></a> at the beginning of the translation schema, but 7409: only for the current element.</p> 1.30 ! cvs 7410: ! 7411: <p>The <tt>NoLineBreak</tt> rule is written with the <tt>NoLineBreak</tt> ! 7412: keyword followed by a semicolon.</p> 1.18 cvs 7413: <pre> 'NoLineBreak' ';'</pre> 7414: </div> 1.1 cvs 7415: 1.18 cvs 7416: <div class="subsection"> 1.30 ! cvs 7417: <h3><a name="sectc5220">The <tt>ChangeMainFile</tt> rule</a></h3> 1.1 cvs 7418: 1.30 ! cvs 7419: <p>When the translation program starts, it opens a main output file, whose ! 7420: name is given as a parameter of the translator. All <a 1.18 cvs 7421: href="#sectc5210"><tt>Create</tt> rules</a> without explicit indication of the 7422: output file write sequentially in this file. When a <tt>ChangeMainFile</tt> 7423: rule is executed, the main output file is closed and it is replaced by a new 7424: one, whose name is specified in the <tt>ChangeMainFile</tt> rule. The 7425: <tt>Create</tt> rules without indication of the output file that are then 7426: executed write in this new file. Several <tt>ChangeMainFile</tt> rules can be 7427: executed during the same translation, for dividing the main output into 7428: several files.</p> 1.30 ! cvs 7429: ! 7430: <p>This rule is written with the <tt>ChangeMainFile</tt> keyword followed by ! 7431: the name of a variable that specifies the name of the new main file. The ! 7432: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the rule ! 7433: to specify whether the operation should be performed before or after ! 7434: translation of the rule's element (the default is before). This rule, like all ! 7435: translation rules, is terminated by a semicolon.</p> 1.18 cvs 7436: <pre> 'ChangeMainFile' VarID [ Position ] ';'</pre> 1.30 ! cvs 7437: 1.18 cvs 7438: <blockquote class="example"> 1.30 ! cvs 7439: <p><strong>Example:</strong></p> ! 7440: ! 7441: <p>To generate the translation of each section in a different file, the ! 7442: following rule can be associated with type <tt>Section</tt>. That rule uses ! 7443: the <a href="#varoutputfile"><tt>VarOutpuFile</tt> variable</a> defined ! 7444: above.</p> ! 7445: <pre> Section: 1.18 cvs 7446: ChangeMainFile VarOutpuFile Before;</pre> 1.30 ! cvs 7447: ! 7448: <p>If <tt>output.txt</tt> is the name of the output file specified when ! 7449: starting the translation program, translated sections are written in files ! 7450: <tt>output1.txt</tt>, <tt>output2.txt</tt>, etc.</p> 1.18 cvs 7451: </blockquote> 7452: </div> 1.1 cvs 7453: 1.18 cvs 7454: <div class="subsection"> 1.30 ! cvs 7455: <h3><a name="sectc5220a">The <tt>RemoveFile</tt> rule</a></h3> 1.14 cvs 7456: 1.30 ! cvs 7457: <p>Files may be used for storing temporary data that are no longer needed when 1.18 cvs 7458: the translation of a document is complete. These files may be removed by the 7459: <tt>RemoveFile</tt> rule.</p> 1.30 ! cvs 7460: ! 7461: <p>This rule is written with the <tt>RemoveFile</tt> keyword followed by the ! 7462: name of a variable that specifies the name of the file to be removed. The ! 7463: keyword <tt>Before</tt> or <tt>After</tt> can be placed at the end of the rule ! 7464: to specify whether the operation should be performed before or after ! 7465: translation of the rule's element (the default is before). This rule, like ! 7466: all translation rules, is terminated by a semicolon.</p> 1.18 cvs 7467: <pre> 'RemoveFile' VarID [ Position ] ';'</pre> 7468: </div> 7469: 7470: <div class="subsection"> 1.30 ! cvs 7471: <h3><a name="sectc5221">The <tt>Set</tt> and <tt>Add</tt> rules</a></h3> 1.18 cvs 7472: 1.30 ! cvs 7473: <p>The <tt>Set</tt> and <tt>Add</tt> rules are used for modifying the value of 1.18 cvs 7474: counters that have no <a href="#sectc524">counting function</a>. Only this 7475: type of counter can be used in the <tt>Set</tt> and <tt>Add</tt> rules.</p> 1.30 ! cvs 7476: ! 7477: <p>Both rules have the same syntax: after the keyword <tt>Set</tt> or 1.18 cvs 7478: <tt>Add</tt> appear the counter name and the value to assign to the counter 7479: (<tt>Set</tt> rule) or the value to be added to the counter (<tt>Add</tt> 7480: rule). The keyword <tt>Before</tt> or <tt>After</tt> can follow that value to 1.1 cvs 7481: indicate when the rule must be applied: before or after the element's content 1.18 cvs 7482: is translated. By default, <tt>Before</tt> is assumed. A semicolon terminates 7483: the rule.</p> 7484: <pre> 'Set' CounterID InitValue [ Position ] ';' / 7485: 'Add' CounterID Increment [ Position ] ';'</pre> 7486: </div> 7487: 7488: <div class="subsection"> 1.30 ! cvs 7489: <h3><a name="sectc5221a">The <tt>Indent</tt> rule</a></h3> 1.18 cvs 7490: 1.30 ! cvs 7491: <p>The <tt>Indent</tt> rule is used to modify the value of text indentation in 1.18 cvs 7492: the output files.</p> 1.30 ! cvs 7493: ! 7494: <p>Each time the translator creates a new line in an output file, it generates ! 7495: a variable number of space characters at the beginning of the new line. By 1.25 cvs 7496: default, the number of these characters (the indentation value) is 0. It can 7497: be changed with the <tt>Indent</tt> rule.</p> 1.30 ! cvs 7498: ! 7499: <p>In its simple form, the rule begins with the <tt>Indent</tt> keyword, 1.25 cvs 7500: followed by the indentation sign (optional) and value and a keyword 1.30 ! cvs 7501: <tt>Before</tt> or <tt>After</tt> indicating that the indentation should be ! 7502: changed <a href="#sectc5222">before or after</a> the element's content is ! 7503: generated. If the position is not indicated, the indentation is changed 1.25 cvs 7504: before the element's content is generated. This rule, like all translation 7505: rules, is terminated by a semicolon.</p> 1.30 ! cvs 7506: ! 7507: <p>The indentation value is indicated by an integer, which is the number of ! 7508: space characters to be generated at the beginning of each new line. A sign 1.18 cvs 7509: (<tt>+</tt> or <tt>-</tt>) can appear before the integer to indicate that the 7510: value is relative: the current value of indentation is incremented (if sign is 7511: <tt>+</tt>) or decremented (if sign is <tt>-</tt>) by the specified value.</p> 1.30 ! cvs 7512: ! 7513: <p>Keyword <tt>Suspend</tt> or <tt>Resume</tt> can appear instead of the 1.25 cvs 7514: (possibly signed) identation value. <tt>Suspend</tt> means that the new 1.30 ! cvs 7515: indentation value to be used is zero until another <tt>Indent</tt> rule is ! 7516: executed and changes the indentation value. <tt>Resume</tt> means that the ! 7517: indentation value that was used before the last <tt>Indent Suspend</tt> was ! 7518: executed becomes the new value. Only one <tt>Suspend</tt> can be used before ! 7519: a <tt>Resume</tt>; <tt>Supend</tt>-<tt>Resume</tt> pairs can not be ! 7520: nested.</p> ! 7521: ! 7522: <p>Like the <a href="#sectc5210"><tt>Create</tt> rule</a>, the <tt>Indent</tt> 1.18 cvs 7523: keyword can be followed by the <tt>IN</tt> keyword and by the name of a <a 7524: href="#sectc526">variable</a>. This means that the rule must not change 1.10 cvs 7525: indentation in the main output file, but in the file whose name is specified 7526: by the variable (by default, indentation is changed in the main output 1.18 cvs 7527: file).</p> 1.25 cvs 7528: <pre> 'Indent' [ 'IN' VarID ] Indent [ Position ] ';' . 1.10 cvs 7529: 1.25 cvs 7530: Indent = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue . 1.10 cvs 7531: IndentSign = '+' / '-' . 1.18 cvs 7532: IndentValue = NUMBER .</pre> 7533: </div> 1.10 cvs 7534: 1.18 cvs 7535: <div class="subsection"> 1.30 ! cvs 7536: <h3><a name="sectc5222">Rule application order</a></h3> 1.1 cvs 7537: 1.30 ! cvs 7538: <p>The translator translates the elements which comprise the document in the 1.18 cvs 7539: order induced by the tree structure, except when the <tt>Get</tt> rule is used 1.1 cvs 7540: to change the order of translation. For each element, the translator first 7541: applies the rules specified for the element's type that must be applied before 1.18 cvs 7542: translation of the element's content (rules ending with the <tt>Before</tt> 1.1 cvs 7543: keyword or which have no position keyword). If several rules meet these 7544: criteria, the translator applies them in the order in where they appear in the 1.18 cvs 7545: translation schema.</p> 1.30 ! cvs 7546: ! 7547: <p>It then applies all <a href="#sectc5223">rules for the attributes</a> which 1.1 cvs 7548: the element has and which must be applied before the translation of the 1.18 cvs 7549: element's content (rules ending with the <tt>Before</tt> keyword or which have 1.1 cvs 7550: no position keyword). For one attribute value, the translator applies the 1.18 cvs 7551: rules in the order in which they are defined in the translation schema.</p> 1.30 ! cvs 7552: ! 7553: <p>The same procedure is followed with translation rules for specific 1.18 cvs 7554: presentations.</p> 1.30 ! cvs 7555: ! 7556: <p>Next, the element's content is translated, as long as a <tt>Remove</tt> ! 7557: rule does not apply.</p> ! 7558: ! 7559: <p>In the next step, the translator applies rules for the specific ! 7560: presentation of the element that are to be applied after translation of the ! 7561: content (rules which end with the <tt>After</tt> keyword). The rules for each ! 7562: type of presentation rule or each value are applied in the order in which the 1.18 cvs 7563: translation appear in the schema.</p> 1.30 ! cvs 7564: ! 7565: <p>Then, the same procedure is followed for translation rules for attributes ! 7566: of the element.</p> ! 7567: ! 7568: <p>Finally, the translator applies rules for the element which must be applied 1.1 cvs 7569: after translation of the element's content. These rules are applied in the 7570: order that they appear in the translation schema. When the translation of an 7571: element is done, the translator procedes to translate the following 1.18 cvs 7572: element.</p> 1.30 ! cvs 7573: ! 7574: <p>This order can be changed with the <tt>Attributes</tt> and 1.18 cvs 7575: <tt>Presentation</tt> options of the <a href="#sectc5210"><tt>Create</tt> 7576: rule</a>.</p> 7577: </div> 1.1 cvs 7578: 1.18 cvs 7579: <div class="subsection"> 1.30 ! cvs 7580: <h3><a name="sectc5223">Translation of logical attributes</a></h3> 1.1 cvs 7581: 1.30 ! cvs 7582: <p>After the rules for the element types, the translation schema defines rules 1.18 cvs 7583: for attribute values. This section begins with the <tt>ATTRIBUTES</tt> 1.1 cvs 7584: keyword and is composed of a sequence of rule blocks each preceded by an 1.18 cvs 7585: attribute name and an optional value or value range.</p> 1.30 ! cvs 7586: ! 7587: <p>If the attribute's name appears alone before the rule block, the rule are 1.1 cvs 7588: applied to all element which have the attribute, no matter what value the 7589: attribute has. In this case, the attribute name is followed by a colon before 1.18 cvs 7590: the beginning of the rule block.</p> 1.30 ! cvs 7591: ! 7592: <p>The attribute's name can be followed by the name of an element type between 1.1 cvs 7593: parentheses. This says, as in presentation schemas, that the rule block which 7594: follows applies not to the element which has the attribute, but to its 1.18 cvs 7595: descendants of the type indicated between the parentheses.</p> 1.30 ! cvs 7596: ! 7597: <p>If values are given after the attribute name (or after the name of the ! 7598: element type), the rules are applied only when the attribute has the indicated ! 7599: values. The same attribute can appear several times, with different values and 1.1 cvs 7600: different translation rules. Attribute values are indicated in the same way 1.18 cvs 7601: as in <a href="#sectc528">conditions</a> and are followed by a colon before 7602: the block of rules.</p> 1.30 ! cvs 7603: ! 7604: <p>The rule block associated with an attribute is either a simple rule or a 1.18 cvs 7605: sequence of rules delimited by the <tt>BEGIN</tt> and <tt>END</tt> keywords. 7606: Note that rules associated with attribute values cannot be conditional.</p> 1.30 ! cvs 7607: ! 7608: <p>Translation rules are not required for all attributes (or their values) 1.1 cvs 7609: defined in a structure schema. Only those attributes for which a particular 7610: action must be performed by the translator must have such rules. The rules 1.18 cvs 7611: that can be used are those described above, from <a 7612: href="#sectc5210"><tt>Create</tt></a> to <a 7613: href="#sectc5218"><tt>NoTranslation</tt></a>.</p> 1.30 ! cvs 7614: <pre> AttrSeq = TransAttr < TransAttr > . 1.1 cvs 7615: TransAttr = AttrID [ '(' ElemID ')' ] 7616: [ RelatAttr ] ':' RuleSeq . 7617: AttrID = NAME . 1.18 cvs 7618: ElemID = NAME .</pre> 1.30 ! cvs 7619: 1.18 cvs 7620: <blockquote class="example"> 1.30 ! cvs 7621: <p><strong>Example:</strong></p> ! 7622: ! 7623: <p>The structure defined the ``Language'' attribute which can take the ! 7624: values ``French'' and ``English''. To have the French parts of the original ! 7625: document removed and prevent the translation of the leaves of the English ! 7626: parts, the following rules would be used:</p> ! 7627: <pre>ATTRIBUTES 1.1 cvs 7628: Language=French : 7629: Remove; 7630: Language=English : 1.18 cvs 7631: NoTranslation;</pre> 7632: </blockquote> 7633: </div> 1.1 cvs 7634: 1.18 cvs 7635: <div class="subsection"> 1.30 ! cvs 7636: <h3><a name="sectc5224">Translation of specific presentations</a></h3> 1.1 cvs 7637: 1.30 ! cvs 7638: <p>After the rules for attributes, the translation schema defines rules for ! 7639: the specific presentation. This section begins with the <tt>PRESENTATION</tt> 1.1 cvs 7640: keyword and is composed of a sequence of translation rule blocks each preceded 7641: by a presentation rule name, optionally accompanied by a part which depends on 1.18 cvs 7642: the particular presentation rule.</p> 1.30 ! cvs 7643: ! 7644: <p>Each of these translation rule blocks is applied when the translator ! 7645: operates on an element which has a specific presentation rule of the type ! 7646: indicated at the head of the block. Depending on the type of the specific ! 7647: presentation rule, it is possible to specify values of the presentation rule ! 7648: for which the translation rule block should be applied.</p> ! 7649: ! 7650: <p>There are three categories of the presentation rules:</p> ! 7651: <ul> ! 7652: <li>rules taking numeric values: <tt>Size</tt>, <tt>Indent</tt>, ! 7653: <tt>LineSpacing</tt>, <tt>LineWeight</tt>,</li> ! 7654: <li>rules whose values are taken from a predefined list (i.e. whose type is ! 7655: an enumeration): <tt>Adjust</tt>, <tt>Justify</tt>, <tt>Hyphenate,/TT>, ! 7656: <tt>Style</tt>, <tt>Weight</tt>, <tt>Font</tt>, <tt>UnderLine</tt>, ! 7657: <tt>Thickness</tt>, <tt>LineStyle</tt>,</tt></li> ! 7658: <li>rules whose value is a name: <tt>FillPattern</tt>, <tt>Background</tt>, ! 7659: <tt>Foreground</tt>.</li> 1.18 cvs 7660: </ul> 1.30 ! cvs 7661: ! 7662: <p>For presentation rules of the first category, the values which provoke 1.1 cvs 7663: application of the translation rules are indicated in the same manner as for 1.18 cvs 7664: <a href="#relattr">numeric attributes</a>. This can be either a unique value 1.1 cvs 7665: or range of values. For a unique value, the value (an integer) is simply 7666: preceded by an equals sign. Value ranges can be specified in one of three 1.18 cvs 7667: ways:</p> 7668: <ul> 1.30 ! cvs 7669: <li>all values less than a given value (this value is preceded by a ``less ! 7670: than'' sign '<tt><</tt>'),</li> ! 7671: <li>all values greater than a given value (this value is preceded by a` ! 7672: `greater than'' sign '<tt>></tt>'),</li> ! 7673: <li>all values falling in an interval, bounds included. The range of values ! 7674: is then specified <tt>IN [</tt>Minimum<tt>..</tt>Maximum<tt>]</tt>, where ! 7675: Minimum and Maximum are integers.</li> 1.18 cvs 7676: </ul> 1.30 ! cvs 7677: ! 7678: <p>All numeric values can be negative, in which case the integer is preceded ! 7679: by a minus sign. All values must be given in typographers points.</p> ! 7680: ! 7681: <p>For presentation rules whose values are taken from a predefined list, the 1.1 cvs 7682: value which provokes application of the translation rules is simply indicated 1.18 cvs 7683: by the equals sign followed by the name of the value.</p> 1.30 ! cvs 7684: ! 7685: <p>For presentation rules whose values are names, the value which provokes the 1.1 cvs 7686: application of translation rules is simply indicated by the equals sign 7687: followed by the name of the value. The names of the fill patterns (the 1.18 cvs 7688: <tt>FillPattern</tt> rule) and of the colors (the <tt>Foreground</tt> and 7689: <tt>Background</tt> rules) used in Thot are the same as in the P language.</p> 1.30 ! cvs 7690: <pre> PresSeq = PresTrans < PresTrans > . 1.1 cvs 7691: PresTrans = PresRule ':' RuleSeq . 7692: PresRule = 'Size' [ PresRelation ] / 7693: 'Indent' [ PresRelation ] / 7694: 'LineSpacing' [ PresRelation ] / 7695: 'Adjust' [ '=' AdjustVal ] / 7696: 'Justify' [ '=' BoolVal ] / 7697: 'Hyphenate' [ '=' BoolVal ] / 7698: 'Style' [ '=' StyleVal ] / 1.24 cvs 7699: 'Weight' [ '=' WeightVal ] / 1.1 cvs 7700: 'Font' [ '=' FontVal ] / 7701: 'UnderLine' [ '=' UnderLineVal ] / 7702: 'Thickness' [ '=' ThicknessVal ] / 7703: 'LineStyle' [ '=' LineStyleVal ] / 7704: 'LineWeight' [ PresRelation ] / 7705: 'FillPattern' [ '=' Pattern ] / 7706: 'Background' [ '=' Color ] / 7707: 'Foreground' [ '=' Color ] . 7708: 7709: PresRelation = '=' PresValue / 1.30 ! cvs 7710: '>' [ '-' ] PresMinimum / 1.1 cvs 7711: '<' [ '-' ] PresMaximum / 7712: 'IN' '[' [ '-' ] PresIntervalMin '..' 7713: [ '-' ] PresIntervalMax ']' . 7714: AdjustVal = 'Left' / 'Right' / 'VMiddle' / 7715: 'LeftWithDots' . 7716: BoolVal = 'Yes' / 'No' . 1.24 cvs 7717: StyleVal = 'Roman' / 'Italics' / 'Oblique' . 7718: WeightVal = 'Normal' / 'Bold' . 1.1 cvs 7719: FontVal = 'Times' / 'Helvetica' / 'Courier' . 7720: UnderLineVal = 'NoUnderline' / 'UnderLined' / 7721: 'OverLined' / 'CrossedOut' . 7722: ThicknessVal = 'Thick' / 'Thin' . 1.6 cvs 7723: LineStyleVal = 'Solid' / 'Dashed' / 'Dotted' . 1.1 cvs 7724: Pattern = NAME . 7725: Color = NAME . 7726: PresMinimum = NUMBER . 7727: PresMaximum = NUMBER . 7728: PresIntervalMin= NUMBER . 7729: PresIntervalMax= NUMBER . 7730: PresValue = [ '-' ] PresVal . 1.18 cvs 7731: PresVal = NUMBER .</pre> 1.30 ! cvs 7732: ! 7733: <p>The <a name="prestransl">translation rules associated with specific 1.18 cvs 7734: presentation rules</a> can use the value of the specific presentation rule 1.1 cvs 7735: that causes them to be applied. This behavior is designated by the keyword 1.18 cvs 7736: <tt>Value</tt>. For numerically-valued presentation rules, the numeric value 1.1 cvs 7737: is produced. For other presentation rules, the name of the value is 1.18 cvs 7738: produced.</p> 1.30 ! cvs 7739: ! 7740: <p>It should be noted that modifications to the layout of the document's ! 7741: elements that are made using the combination of the control key and a mouse ! 7742: button will have no effect on the translation of the document.</p> ! 7743: ! 7744: <blockquote class="example"> ! 7745: <p><strong>Example:</strong></p> ! 7746: ! 7747: <p>Suppose that it is desirable to use the same font sizes as in the ! 7748: specific presentation, but the font size must be between 10 and 18 ! 7749: typographer's points. If font size is set in the translated document by the ! 7750: string <tt>pointsize=n</tt> where <tt>n</tt> is the font size in ! 7751: typographer's points then the following rules will suffice:</p> ! 7752: <pre>PRESENTATION 1.1 cvs 7753: Size < 10 : 7754: Create 'pointsize=10'; 7755: Size in [10..18] : 7756: BEGIN 7757: Create 'pointsize='; 7758: Create Value; 7759: END; 1.30 ! cvs 7760: Size > 18 : 1.18 cvs 7761: Create 'pointsize=18';</pre> 7762: </blockquote> 7763: </div> 1.1 cvs 7764: 1.18 cvs 7765: <div class="subsection"> 1.30 ! cvs 7766: <h3><a name="sectc5225">Recoding of characters, symbols and graphics</a></h3> 1.1 cvs 7767: 1.30 ! cvs 7768: <p>The coding of characters, graphical elements and symbols as defined in Thot 1.1 cvs 7769: does not necessarily correspond to what is required by an application to which 7770: a Thot document must be exported. Because of this the translator can recode 7771: these terminal elements of the documents structure. The last sections of a 7772: translation schema are intended for this purpose, each specifying the recoding 1.18 cvs 7773: rules for one type of terminal element.</p> 1.30 ! cvs 7774: ! 7775: <p>The recoding rules for character strings are grouped by alphabets. There is ! 7776: a group of rules for each alphabet of the Thot document that must be ! 7777: translated. Each such group of rules begins with the <tt>TEXTTRANSLATE</tt> ! 7778: keyword, followed by the specification of the alphabet to translate and the ! 7779: recoding rules, between the <tt>BEGIN</tt> and <tt>END</tt> keywords unless ! 7780: there is only one recoding rule for the alphabet. The specification of the ! 7781: alphabet is not required: by default it is assumed to the Latin alphabet (the ! 7782: ISO Latin-1 character set).</p> ! 7783: ! 7784: <p>Each recoding rule is formed by a source string between apostrophes and a 1.1 cvs 7785: target string, also between apostrophes, the two strings being separated by 1.30 ! cvs 7786: the arrow symbol (<tt>-></tt>), formed by the ``minus'' and ``greater ! 7787: than'' characters. The rule is terminated by a semi-colon.</p> 1.18 cvs 7788: <pre> TextTransSeq = [ Alphabet ] TransSeq . 1.1 cvs 7789: Alphabet = NAME . 1.30 ! cvs 7790: TransSeq ='BEGIN' < Translation > 'END' ';' / 1.1 cvs 7791: Translation . 1.30 ! cvs 7792: Translation = Source [ '->' Target ] ';' . 1.1 cvs 7793: Source = STRING . 1.18 cvs 7794: Target = STRING .</pre> 1.30 ! cvs 7795: ! 7796: <p>One such rule signifies that when the source string appears in a text leaf ! 7797: of the document being translated, the translator must replace it, in the 1.1 cvs 7798: translated document, with the target string. The source string and the target 7799: string can have different lengths and the target string can be empty. In this 7800: last case, the translator simply suppresses every occurrence of the source 1.18 cvs 7801: string in the translated document.</p> 1.30 ! cvs 7802: ! 7803: <p>For a given alphabet, the order of the rules is not important and has no 1.1 cvs 7804: significance because the T language compiler reorders the rules in ways that 7805: speed up the translator's work. The total number of recoding rules is limited 1.18 cvs 7806: by the compiler as is the maximum length of the source and target strings.</p> 1.30 ! cvs 7807: ! 7808: <p>The recoding rules for symbols and graphical elements are written in the ! 7809: same manner as the recoding rules for character strings. They are preceded, 1.18 cvs 7810: respectively, by the <tt>SYMBTRANSLATE</tt> and <tt>GRAPHTRANSLATE</tt> and so 1.1 cvs 7811: not require a specification of the alphabet. Their source string is limited to 7812: one character, since, in Thot, each symbol and each graphical element is 7813: represented by a single character. The symbol and graphical element codes are 1.18 cvs 7814: defined along with the <a href="#sect7">non-standard character codes</a>.</p> 1.30 ! cvs 7815: 1.18 cvs 7816: <blockquote class="example"> 1.30 ! cvs 7817: <p><strong>Example:</strong></p> ! 7818: ! 7819: <p>In a translation schema producing documents destined for use with the ! 7820: L<sup>A</sup>T<sub><big>E</big></sub>X formatter, the Latin characters``é'' ! 7821: (octal code 351 in Thot) and ``č'' (octal code 350 in Thot) must be ! 7822: converted to their representation in ! 7823: L<sup>A</sup>T<sub><big>E</big></sub>X:</p> ! 7824: <pre>TEXTTRANSLATE Latin 1.1 cvs 7825: BEGIN 1.30 ! cvs 7826: '\350' -> '\`{e}'; { e grave } ! 7827: '\351' -> '\''{e}'; { e acute } 1.18 cvs 7828: END;</pre> 7829: </blockquote> 7830: </div> 7831: </div> 7832: <hr> 7833: </div> 1.1 cvs 7834: 1.18 cvs 7835: <div class="chapter"> 1.30 ! cvs 7836: <h1><a name="sect6">Language grammars</a></h1> 1.1 cvs 7837: 1.30 ! cvs 7838: <p>This chapter gives the complete grammars of the languages of Thot. The 1.1 cvs 7839: grammars were presented and described in the preceding chapters, which also 7840: specify the semantics of the languages. This section gives only the 1.18 cvs 7841: syntax.</p> 1.1 cvs 7842: 1.18 cvs 7843: <div class="section"> 1.30 ! cvs 7844: <h2><a name="sectb61">The M meta-language</a></h2> 1.1 cvs 7845: 1.30 ! cvs 7846: <p>The language grammars are all expressed in the same formalism, the M 1.18 cvs 7847: meta-language, which is defined in this section.</p> 7848: <pre>{ Any text between braces is a comment. } 1.30 ! cvs 7849: Grammar = Rule < Rule > 'END' . ! 7850: { The < and > signs indicate zero } 1.1 cvs 7851: { or more repetitions. } 7852: { END marks the end of the grammar. } 7853: Rule = Ident '=' RightPart '.' . 7854: { The period indicates the end of a rule } 7855: RightPart = RtTerminal / RtIntermed . 7856: { The slash indicates a choice } 7857: RtTerminal ='NAME' / 'STRING' / 'NUMBER' . 7858: { Right part of a terminal rule } 1.30 ! cvs 7859: RtIntermed = Possibility < '/' Possibility > . 1.1 cvs 7860: { Right part of an intermediate rule } 1.30 ! cvs 7861: Possibility = ElemOpt < ElemOpt > . ! 7862: ElemOpt = Element / '[' Element < Element > ']' / ! 7863: '<' Element < Element > '>' . 1.1 cvs 7864: { Brackets delimit optional parts } 7865: Element = Ident / KeyWord . 7866: Ident = NAME . 7867: { Identifier, sequence of characters 7868: KeyWord = STRING . 7869: { Character string delimited by apostrophes } 1.18 cvs 7870: END</pre> 7871: </div> 1.1 cvs 7872: 1.18 cvs 7873: <div class="section"> 1.30 ! cvs 7874: <h2><a name="sectb62">The S language</a></h2> 1.1 cvs 7875: 1.30 ! cvs 7876: <p>The S language is used to write structure schemas, which contain the ! 7877: generic logical structures of document and object classes. It is described ! 7878: here in the M meta-language.</p> 1.18 cvs 7879: <pre>StructSchema = 'STRUCTURE' [ 'EXTENSION' ] ElemID ';' 1.1 cvs 7880: 'DEFPRES' PresID ';' 7881: [ 'ATTR' AttrSeq ] 7882: [ 'PARAM' RulesSeq ] 7883: [ 'STRUCT' RulesSeq ] 7884: [ 'EXTENS' ExtensRuleSeq ] 7885: [ 'ASSOC' RulesSeq ] 7886: [ 'UNITS' RulesSeq ] 7887: [ 'EXPORT' SkeletonSeq ] 7888: [ 'EXCEPT' ExceptSeq ] 7889: 'END' . 7890: 7891: ElemID = NAME . 7892: PresID = NAME . 7893: 1.30 ! cvs 7894: AttrSeq = Attribute < Attribute > . 1.1 cvs 7895: Attribute = AttrID '=' AttrType ';' . 7896: AttrType = 'INTEGER' / 'TEXT' / 7897: 'REFERENCE' '(' RefType ')' / 7898: ValueSeq . 7899: RefType = 'ANY' / 7900: [ FirstSec ] ElemID [ ExtStruct ] . 1.30 ! cvs 7901: ValueSeq = AttrVal < ',' AttrVal > . 1.1 cvs 7902: AttrID = NAME . 7903: FirstSec = 'First' / 'Second' . 7904: ExtStruct = '(' ElemID ')' . 7905: AttrVal = NAME . 7906: 1.30 ! cvs 7907: RulesSeq = Rule < Rule > . 1.1 cvs 7908: Rule = ElemID [ LocAttrSeq ] '=' 7909: DefWithAttr ';' . 7910: LocAttrSeq = '(' 'ATTR' LocalAttr 1.30 ! cvs 7911: < ';' LocalAttr > ')' . 1.1 cvs 7912: LocalAttr = [ '!' ] AttrID [ '=' AttrType ] . 7913: DefWithAttr = Definition 7914: [ '+' '(' ExtensionSeq ')' ] 7915: [ '-' '(' RestrictSeq ')' ] 7916: [ 'WITH' FixedAttrSeq ] . 1.30 ! cvs 7917: ExtensionSeq = ExtensionElem < ',' ExtensionElem > . 1.1 cvs 7918: ExtensionElem = ElemID / 'TEXT' / 'GRAPHICS' / 7919: 'SYMBOL' / 'PICTURE' . 1.30 ! cvs 7920: RestrictSeq = RestrictElem < ',' RestrictElem > . 1.1 cvs 7921: RestrictElem = ElemID / 'TEXT' / 'GRAPHICS' / 7922: 'SYMBOL' / 'PICTURE' . 1.30 ! cvs 7923: FixedAttrSeq = FixedAttr < ',' FixedAttr > . 1.1 cvs 7924: FixedAttr = AttrID [ FixedOrModifVal ] . 7925: FixedOrModifVal= [ '?' ] '=' FixedValue . 7926: FixedValue = [ '-' ] NumValue / TextValue / AttrVal . 7927: NumValue = NUMBER . 7928: TextValue = STRING . 7929: 7930: Definition = BaseType [ LocAttrSeq ] / Constr / 7931: Element . 7932: BaseType = 'TEXT' / 'GRAPHICS' / 'SYMBOL' / 7933: 'PICTURE' / 'UNIT' / 'NATURE' . 7934: Element = ElemID [ ExtOrDef ] . 7935: ExtOrDef = 'EXTERN' / 'INCLUDED' / 7936: [ LocAttrSeq ] '=' Definition . 7937: 7938: Constr = 'LIST' [ '[' min '..' max ']' ] 'OF' 7939: '(' DefWithAttr ')' / 7940: 'BEGIN' DefOptSeq 'END' / 7941: 'AGGREGATE' DefOptSeq 'END' / 7942: 'CASE' 'OF' DefSeq 'END' / 7943: 'REFERENCE' '(' RefType ')' / 7944: 'PAIR' . 7945: 7946: min = Integer / '*' . 7947: max = Integer / '*' . 7948: Integer = NUMBER . 7949: 1.30 ! cvs 7950: DefOptSeq = DefOpt ';' < DefOpt ';' > . 1.1 cvs 7951: DefOpt = [ '?' ] DefWithAttr . 7952: 1.30 ! cvs 7953: DefSeq = DefWithAttr ';' < DefWithAttr ';' > . 1.1 cvs 7954: 1.30 ! cvs 7955: SkeletonSeq = SkeletonElem < ',' SkeletonElem > ';' . 1.1 cvs 7956: SkeletonElem = ElemID [ 'WITH' Contents ] . 7957: Contents = 'Nothing' / ElemID [ ExtStruct ] . 7958: 1.30 ! cvs 7959: ExceptSeq = Except ';' < Except ';' > . 1.1 cvs 7960: Except = [ 'EXTERN' ] [ FirstSec ] ExcTypeOrAttr ':' 7961: ExcValSeq . 7962: ExcTypeOrAttr = ElemID / AttrID . 1.30 ! cvs 7963: ExcValSeq = ExcValue < ',' ExcValue > . 1.1 cvs 7964: ExcValue = 'NoCut' / 'NoCreate' / 7965: 'NoHMove' / 'NoVMove' / 'NoMove' / 7966: 'NoHResize' / 'NoVResize' / 'NoResize' / 1.18 cvs 7967: 'MoveResize' / 1.1 cvs 7968: 'NewWidth' / 'NewHeight' / 7969: 'NewHPos' / 'NewVPos' / 7970: 'Invisible' / 'NoSelect' / 7971: 'Hidden' / 'ActiveRef' / 7972: 'ImportLine' / 'ImportParagraph' / 1.9 cvs 7973: 'NoPaginate' / 'ParagraphBreak' / 7974: 'HighlightChildren' / 'ExtendedSelection' / 1.29 cvs 7975: 'ReturnCreateNL' / 'ReturnCreateWithin' . 1.1 cvs 7976: 1.30 ! cvs 7977: ExtensRuleSeq = ExtensRule ';' < ExtensRule ';' > . 1.1 cvs 7978: ExtensRule = RootOrElem [ LocAttrSeq ] 7979: [ '+' '(' ExtensionSeq ')' ] 7980: [ '-' '(' RestrictSeq ')' ] 7981: [ 'WITH' FixedAttrSeq ] . 7982: RootOrElem = 'Root' / ElemID . 7983: 1.18 cvs 7984: END</pre> 7985: </div> 1.1 cvs 7986: 1.18 cvs 7987: <div class="section"> 1.30 ! cvs 7988: <h2><a name="sectb63">The P language</a></h2> 1.1 cvs 7989: 1.30 ! cvs 7990: <p>The P language is used to write presentation schemas, which define the 1.1 cvs 7991: graphical presentation rules to be applied to different classes of documents 1.18 cvs 7992: and objects. It is described here in the M meta-language.</p> 7993: <pre>PresSchema = 'PRESENTATION' ElemID ';' 1.1 cvs 7994: [ 'VIEWS' ViewSeq ] 7995: [ 'PRINT' PrintViewSeq ] 7996: [ 'COUNTERS' CounterSeq ] 7997: [ 'CONST' ConstSeq ] 7998: [ 'VAR' VarSeq ] 7999: [ 'DEFAULT' ViewRuleSeq ] 8000: [ 'BOXES' BoxSeq ] 8001: [ 'RULES' PresentSeq ] 8002: [ 'ATTRIBUTES' PresAttrSeq ] 8003: [ 'TRANSMIT' TransmitSeq ] 8004: 'END' . 8005: 8006: ElemID = NAME . 8007: 8008: ViewSeq = ViewDeclaration 1.30 ! cvs 8009: < ',' ViewDeclaration > ';' . 1.1 cvs 8010: ViewDeclaration = ViewID [ 'EXPORT' ] . 8011: ViewID = NAME . 8012: 1.30 ! cvs 8013: PrintViewSeq = PrintView < ',' PrintView > ';' . 1.1 cvs 8014: PrintView = ViewID / ElemID . 8015: 1.30 ! cvs 8016: CounterSeq = Counter < Counter > . 1.1 cvs 8017: Counter = CounterID ':' CounterFunc ';' . 8018: CounterID = NAME . 8019: CounterFunc = 'RANK' 'OF' TypeOrPage [ SLevelAsc ] 8020: [ 'INIT' AttrID ] [ 'REINIT' AttrID ] / 1.30 ! cvs 8021: SetFunction < SetFunction > ! 8022: AddFunction < AddFunction > 1.1 cvs 8023: [ 'INIT' AttrID ] / 1.16 cvs 8024: 'RLEVEL' 'OF' ElemID . 1.1 cvs 8025: SLevelAsc = [ '-' ] LevelAsc . 8026: LevelAsc = NUMBER . 8027: SetFunction = 'SET' CounterValue 'ON' TypeOrPage . 8028: AddFunction = 'ADD' CounterValue 'ON' TypeOrPage . 8029: TypeOrPage = 'Page' [ '(' ViewID ')' ] / 1.16 cvs 8030: [ '*' ] ElemID . 1.1 cvs 8031: CounterValue = NUMBER . 8032: 1.30 ! cvs 8033: ConstSeq = Const < Const > . 1.1 cvs 8034: Const = ConstID '=' ConstType ConstValue ';' . 8035: ConstID = NAME . 8036: ConstType = 'Text' [ Alphabet ] / 'Symbol' / 8037: 'Graphics' / 'Picture' . 8038: ConstValue = STRING . 8039: Alphabet = NAME . 8040: 1.30 ! cvs 8041: VarSeq = Variable < Variable > . 1.1 cvs 8042: Variable = VarID ':' FunctionSeq ';' . 8043: VarID = NAME . 1.30 ! cvs 8044: FunctionSeq = Function < Function > . 1.1 cvs 8045: Function = 'DATE' / 'FDATE' / 8046: 'DocName' / 'DirName' / 8047: 'ElemName' / 'AttributeName' / 8048: ConstID / ConstType ConstValue / 8049: AttrID / 8050: 'VALUE' '(' PageAttrCtr ',' 8051: CounterStyle ')' . 8052: PageAttrCtr = 'PageNumber' [ '(' ViewID ')' ] / 8053: [ MinMax ] CounterID / AttrID . 8054: CounterStyle = 'Arabic' / 'LRoman' / 'URoman' / 8055: 'Uppercase' / 'Lowercase' . 8056: MinMax = 'MaxRangeVal' / 'MinRangeVal' . 8057: 1.30 ! cvs 8058: BoxSeq = Box < Box > . 1.1 cvs 8059: Box = 'FORWARD' BoxID ';' / 8060: BoxID ':' ViewRuleSeq . 8061: BoxID = NAME . 8062: 1.30 ! cvs 8063: PresentSeq = Present < Present > . 1.1 cvs 8064: Present = [ '*' ] [ FirstSec ] ElemID ':' 8065: ViewRuleSeq . 8066: FirstSec = 'First' / 'Second' . 8067: 1.30 ! cvs 8068: PresAttrSeq = PresAttr < PresAttr > . 1.1 cvs 8069: PresAttr = AttrID [ '(' [ FirstSec ] ElemID ')' ] 8070: [ AttrRelation ] ':' ViewRuleSeq . 8071: AttrID = NAME . 8072: AttrRelation = '=' AttrVal / 1.30 ! cvs 8073: '>' [ '-' ] MinValue / 1.1 cvs 8074: '<' [ '-' ] MaxValue / 8075: 'IN' '[' [ '-' ] LowerBound '..' 8076: [ '-' ] UpperBound ']' / 8077: 'GREATER' AttrID / 8078: 'EQUAL' AttrID / 8079: 'LESS' AttrID . 8080: AttrVal = [ '-' ] EqualNum / EqualText / AttrValue . 8081: MinValue = NUMBER . 8082: MaxValue = NUMBER . 8083: LowerBound = NUMBER . 8084: UpperBound = NUMBER. 8085: EqualNum = NUMBER . 8086: EqualText = STRING . 8087: AttrValue = NAME . 8088: 1.30 ! cvs 8089: ViewRuleSeq = 'BEGIN' < RulesAndCond > < ViewRules > 1.1 cvs 8090: 'END' ';' / 8091: ViewRules / CondRules / Rule . 8092: RulesAndCond = CondRules / Rule . 8093: ViewRules = 'IN' ViewID CondRuleSeq . 1.30 ! cvs 8094: CondRuleSeq = 'BEGIN' < RulesAndCond > 'END' ';' / 1.1 cvs 8095: CondRules / Rule . 1.30 ! cvs 8096: CondRules = CondRule < CondRule > 1.1 cvs 8097: [ 'Otherwise' RuleSeq ] . 8098: CondRule = 'IF' ConditionSeq RuleSeq . 1.30 ! cvs 8099: RulesSeq = 'BEGIN' Rule < Rule > 'END' ';' / Rule . 1.1 cvs 8100: 1.30 ! cvs 8101: ConditionSeq = Condition < 'AND' Condition > . 1.6 cvs 8102: Condition = [ 'NOT' ] [ 'Target' ] ConditionElem . 8103: ConditionElem = 'First' / 'Last' / 8104: [ 'Immediately' ] 'Within' [ NumParent ] 8105: ElemID [ ExtStruct ] / 8106: ElemID / 8107: 'Referred' / 'FirstRef' / 'LastRef' / 8108: 'ExternalRef' / 'InternalRef' / 'CopyRef' / 8109: 'AnyAttributes' / 'FirstAttr' / 'LastAttr' / 8110: 'UserPage' / 'StartPage' / 'ComputedPage' / 8111: 'Empty' / 8112: '(' [ MinMax ] CounterName CounterCond ')' / 8113: CondPage '(' CounterID ')' . 8114: NumParent = [ GreaterLess ] NParent . 1.30 ! cvs 8115: GreaterLess = '>' / '<' . 1.6 cvs 8116: NParent = NUMBER. 1.30 ! cvs 8117: CounterCond = '<' MaxCtrVal / '>' MinCtrVal / 1.6 cvs 8118: '=' EqCtrVal / 8119: 'IN' '[' ['-'] MinCtrBound '..' 8120: ['-'] MaxCtrBound ']' . 8121: PageCond = 'Even' / 'Odd' / 'One' . 8122: MaxCtrVal = NUMBER . 8123: MinCtrVal = NUMBER . 8124: EqCtrVal = NUMBER . 8125: MaxCtrBound = NUMBER . 8126: MinCtrBound = NUMBER . 1.1 cvs 8127: 8128: Rule = PresParam ';' / PresFunc ';' . 8129: PresParam = 'VertRef' ':' HorizPosition / 8130: 'HorizRef' ':' VertPosition / 8131: 'VertPos' ':' VPos / 8132: 'HorizPos' ':' HPos / 8133: 'Height' ':' Extent / 8134: 'Width' ':' Extent / 8135: 'VertOverflow' ':' Boolean / 8136: 'HorizOverflow' ':' Boolean / 1.26 cvs 8137: 'MarginTop' ':' MarginWidth / 8138: 'MarginRight' ':' MarginWidth / 8139: 'MarginBottom' ':' MarginWidth / 8140: 'MarginLeft' ':' MarginWidth / 8141: 'PaddingTop' ':' PaddingWidth / 8142: 'PaddingRight' ':' PaddingWidth / 8143: 'PaddingBottom' ':' PaddingWidth / 8144: 'PaddingLeft' ':' PaddingWidth / 8145: 'BorderTopWidth' ':' BorderWidth / 8146: 'BorderRightWidth' ':' BorderWidth / 8147: 'BorderBottomWidth' ':' BorderWidth / 8148: 'BorderLeftWidth' ':' BorderWidth / 8149: 'BorderTopColor' ':' BorderColor / 8150: 'BorderRightColor' ':' BorderColor / 8151: 'BorderBottomColor' ':' BorderColor / 8152: 'BorderLeftColor' ':' BorderColor / 8153: 'BorderTopStyle' ':' BorderStyle / 8154: 'BorderRightStyle' ':' BorderStyle / 8155: 'BorderBottomStyle' ':' BorderStyle / 8156: 'BorderLeftStyle' ':' BorderStyle . 1.1 cvs 8157: 'LineSpacing' ':' DistOrInherit / 8158: 'Indent' ':' DistOrInherit / 8159: 'Adjust' ':' AlignOrInherit / 8160: 'Justify' ':' BoolInherit / 8161: 'Hyphenate' ':' BoolInherit / 8162: 'PageBreak' ':' Boolean / 8163: 'LineBreak' ':' Boolean / 8164: 'InLine' ':' Boolean / 8165: 'NoBreak1' ':' AbsDist / 8166: 'NoBreak2' ':' AbsDist / 8167: 'Gather' ':' Boolean / 8168: 'Visibility' ':' NumberInherit / 8169: 'Size' ':' SizeInherit / 8170: 'Font' ':' NameInherit / 8171: 'Style' ':' StyleInherit / 1.23 cvs 8172: 'Weight' ':' WeightInherit / 1.1 cvs 8173: 'Underline' ':' UnderLineInherit / 8174: 'Thickness' ':' ThicknessInherit / 8175: 'Depth' ':' NumberInherit / 8176: 'LineStyle' ':' LineStyleInherit / 8177: 'LineWeight' ':' DistOrInherit / 8178: 'FillPattern' ':' NameInherit / 1.30 ! cvs 8179: 'Background' ':' Color / ! 8180: 'Foreground' ':' Color / 1.1 cvs 8181: 'Content' ':' VarConst . 8182: PresFunc = Creation '(' BoxID ')' / 8183: 'Line' / 8184: 'NoLine' / 8185: 'Page' '(' BoxID ')' / 1.13 cvs 8186: 'Copy' '(' BoxTypeToCopy ')' / 8187: 'ShowBox' / 1.18 cvs 8188: 'BackgroundPicture' ':' FileName / 8189: 'PictureMode' ':' PictMode . 1.1 cvs 8190: 8191: BoxTypeToCopy = BoxID [ ExtStruct ] / 8192: ElemID [ ExtStruct ] . 8193: ExtStruct = '(' ElemID ')' . 8194: 8195: Distance = [ Sign ] AbsDist . 8196: Sign = '+' / '-' . 8197: AbsDist = IntegerOrAttr [ '.' DecimalPart ] 8198: [ Unit ] . 8199: IntegerOrAttr = IntegerPart / AttrID . 8200: IntegerPart = NUMBER . 8201: DecimalPart = NUMBER . 8202: Unit = 'em' / 'ex' / 'cm' / 'mm' / 'in' / 'pt' / 8203: 'pc' / 'px' / '%' . 8204: 8205: HPos = 'nil' / VertAxis '=' HorizPosition 8206: [ 'UserSpecified' ] . 8207: VPos = 'nil' / HorizAxis '=' VertPosition 8208: [ 'UserSpecified' ] . 8209: VertAxis = 'Left' / 'VMiddle' / 'VRef' / 'Right' . 8210: HorizAxis = 'Top' / 'HMiddle' / 'HRef' / 'Bottom' . 8211: 1.6 cvs 8212: VertPosition = Reference '.' HorizAxis [ Distance ] . 8213: HorizPosition = Reference '.' VertAxis [ Distance ] . 8214: Reference = 'Enclosing' [ BoxTypeNot ] / 8215: 'Enclosed' [ BoxTypeNot ] / 8216: 'Previous' [ BoxTypeNot ] / 8217: 'Next' [ BoxTypeNot ] / 8218: 'Referred' [ BoxTypeNot ] / 8219: 'Creator' / 8220: 'Root' / 8221: '*' / 8222: BoxOrType . 8223: BoxOrType = BoxID / 8224: [ '*' ] [ FirstSec ] ElemID / 1.17 cvs 8225: 'AnyElem' / 'AnyBox' / 8226: 'ElemWithAttr' AttrID . 1.6 cvs 8227: BoxTypeNot = [ 'NOT' ] BoxOrType . 8228: 8229: Extent = Reference '.' HeightWidth 8230: [ Relation ] [ 'Min' ] / 8231: AbsDist [ 'UserSpecified' ] [ 'Min' ] / 8232: HPos / VPos . 8233: HeightWidth = 'Height' / 'Width' . 8234: Relation = '*' ExtentAttr '%' / Distance . 8235: ExtentAttr = ExtentVal / AttrID . 8236: ExtentVal = NUMBER . 1.26 cvs 8237: 8238: MarginWidth = InheritParent / 'Auto' / Distance . 8239: PaddingWidth = InheritParent / Distance . 8240: BorderWidth = InheritParent / 'Thin' / 'Medium' / 'Thick' / Distance . 8241: BorderColor = InheritParent / 'Transparent' / 'Foreground' / 8242: ColorName . 8243: BorderStyle = InheritParent / 8244: 'None' / 'Hidden' / 'Dotted' / 'Dashed' / 'Solid' / 8245: 'Double' / 'Groove' / 'Ridge' / 'Inset' / 'Outset' . 1.27 cvs 8246: InheritParent = 'Enclosing' '=' / 'Creator' '=' . 1.26 cvs 8247: ColorName = NAME . 1.6 cvs 8248: 8249: Inheritance = Kinship InheritedValue . 8250: Kinship = 'Enclosing' / 'GrandFather'/ 'Enclosed' / 8251: 'Previous' / 'Creator' . 8252: InheritedValue = '+' PosIntAttr [ 'Max' maximumA ] / 8253: '-' NegIntAttr [ 'Min' minimumA ] / 8254: '=' . 8255: PosIntAttr = PosInt / AttrID . 8256: PosInt = NUMBER . 8257: NegIntAttr = NegInt / AttrID . 8258: NegInt = NUMBER . 8259: maximumA = maximum / AttrID . 8260: maximum = NUMBER . 8261: minimumA = minimum / AttrID . 8262: minimum = NUMBER . 8263: 8264: AlignOrInherit = Kinship '=' / Alignment . 8265: Alignment = 'Left' / 'Right' / 'VMiddle' / 8266: 'LeftWithDots' . 1.1 cvs 8267: 1.6 cvs 8268: DistOrInherit = Kinship InheritedDist / Distance . 8269: InheritedDist = '=' / '+' AbsDist / '-' AbsDist . 1.1 cvs 8270: 1.6 cvs 8271: BoolInherit = Boolean / Kinship '=' . 8272: Boolean = 'Yes' / 'No' . 1.1 cvs 8273: 1.6 cvs 8274: NumberInherit = Integer / AttrID / Inheritance . 8275: Integer = NUMBER . 1.1 cvs 8276: 8277: LineStyleInherit= Kinship '=' / 'Solid' / 'Dashed' / 8278: 'Dotted' . 8279: 1.6 cvs 8280: SizeInherit = SizeAttr [ 'pt' ] / Kinship InheritedSize . 8281: InheritedSize = '+' SizeAttr [ 'pt' ] 8282: [ 'Max' MaxSizeAttr ] / 8283: '-' SizeAttr [ 'pt' ] 8284: [ 'Min' MinSizeAttr ] / 1.22 cvs 8285: '*' PercentSizeAttr '%' / 1.6 cvs 8286: '=' . 8287: SizeAttr = Size / AttrID . 8288: Size = NUMBER . 8289: MaxSizeAttr = MaxSize / AttrID . 8290: MaxSize = NUMBER . 8291: MinSizeAttr = MinSize / AttrID . 8292: MinSize = NUMBER . 1.22 cvs 8293: PercentSizeAttr = PercentSize / AttrID . 8294: PercentSize = NUMBER . 1.6 cvs 8295: 8296: NameInherit = Kinship '=' / FontName . 8297: FontName = NAME . 1.30 ! cvs 8298: Color = 'Transparent' / Kinship '=' / FontName . 1.6 cvs 8299: StyleInherit = Kinship '=' / 1.23 cvs 8300: 'Roman' / 'Italics' / 'Oblique' . 8301: WeightInherit = Kinship '=' / 8302: 'Normal' / 'Bold' . 1.1 cvs 8303: UnderLineInherit= Kinship '=' / 1.6 cvs 8304: 'NoUnderline' / 'Underlined' / 8305: 'Overlined' / 'CrossedOut' . 1.1 cvs 8306: ThicknessInherit= Kinship '=' / 'Thick' / 'Thin' . 1.13 cvs 8307: 8308: FileName = STRING . 8309: PictMode = 'NormalSize' / 'Scale' / 8310: 'RepeatXY' / 'RepeatX' / 'RepeatY' . 1.1 cvs 8311: 1.6 cvs 8312: VarConst = ConstID / ConstType ConstValue / 8313: VarID / '(' FunctionSeq ')' / 8314: ElemID . 8315: 8316: Creation = Create [ 'Repeated' ] . 8317: Create = 'CreateFirst' / 'CreateLast' / 8318: 'CreateBefore' / 'CreateAfter' / 8319: 'CreateEnclosing' . 8320: 1.30 ! cvs 8321: TransmitSeq = Transmit < Transmit > . 1.6 cvs 8322: Transmit = TypeOrCounter 'To' ExternAttr 8323: '(' ElemID ')' ';' . 8324: TypeOrCounter = CounterID / ElemID . 8325: ExternAttr = NAME . 1.1 cvs 8326: 1.18 cvs 8327: END</pre> 8328: </div> 1.1 cvs 8329: 1.18 cvs 8330: <div class="section"> 8331: <h2><a name="sectb64">The T language</a></h2> 8332: <pre>TransSchema = 'TRANSLATION' ElemID ';' 1.1 cvs 8333: [ 'LINELENGTH' LineLength ';' ] 8334: [ 'LINEEND' CHARACTER ';' ] 8335: [ 'LINEENDINSERT' STRING ';' ] 8336: [ 'BUFFERS' BufferSeq ] 8337: [ 'COUNTERS' CounterSeq ] 8338: [ 'CONST' ConstSeq ] 8339: [ 'VAR' VariableSeq ] 8340: 'RULES' ElemSeq 8341: [ 'ATTRIBUTES' AttrSeq ] 8342: [ 'PRESENTATION' PresSeq ] 1.30 ! cvs 8343: < 'TEXTTRANSLATE' TextTransSeq > 1.1 cvs 8344: [ 'SYMBTRANSLATE' TransSeq ] 8345: [ 'GRAPHTRANSLATE' TransSeq ] 8346: 'END' . 8347: 8348: LineLength = NUMBER . 8349: 1.30 ! cvs 8350: BufferSeq = Buffer < Buffer > . 1.1 cvs 8351: Buffer = BufferID [ '(' 'Picture' ')' ] ';' . 8352: BufferID = NAME . 8353: 1.30 ! cvs 8354: CounterSeq = Counter < Counter > . 1.1 cvs 8355: Counter = CounterID [ ':' CounterFunc ] ';' . 8356: CounterID = NAME . 8357: CounterFunc = 'Rank' 'of' ElemID [ SLevelAsc ] 8358: [ 'Init' AttrID ] / 8359: 'Rlevel' 'of' ElemID / 8360: 'Set' InitValue 'On' ElemID 8361: 'Add' Increment 'On' ElemID 8362: [ 'Init' AttrID ] . 8363: SLevelAsc = [ '-' ] LevelAsc . 8364: LevelAsc = NUMBER . 8365: InitValue = NUMBER . 8366: Increment = NUMBER . 8367: ElemID = NAME . 8368: AttrID = NAME . 8369: 1.30 ! cvs 8370: ConstSeq = Const < Const > . 1.1 cvs 8371: Const = ConstID '=' ConstValue ';' . 8372: ConstID = NAME . 8373: ConstValue = STRING . 8374: 1.30 ! cvs 8375: VariableSeq = Variable < Variable > . ! 8376: Variable = VarID ':' Function < Function > ';' . 1.1 cvs 8377: VarID = NAME . 8378: Function = 'Value' '(' CounterID [ ':' Length ] 8379: [ ',' CounterStyle ] ')' / 8380: 'FileDir' / 'FileName' / 'Extension' / 8381: 'DocumentName' / 'DocumentDir' / 8382: ConstID / CharString / 8383: BufferID / AttrID . 8384: Length = NUMBER . 8385: CounterStyle= 'Arabic' / 'LRoman' / 'URoman' / 8386: 'Uppercase' / 'Lowercase' . 8387: CharString = STRING . 8388: 1.30 ! cvs 8389: ElemSeq = TransType < TransType > . 1.1 cvs 8390: TransType = [ FirstSec ] ElemID ':' RuleSeq . 8391: FirstSec = 'First' / 'Second' . 1.30 ! cvs 8392: RuleSeq = Rule / 'BEGIN' < Rule > 'END' ';' . 1.1 cvs 8393: Rule = SimpleRule / ConditionBlock . 8394: ConditionBlock= 'IF' ConditionSeq SimpleRuleSeq . 1.30 ! cvs 8395: SimpleRuleSeq = 'BEGIN' < SimpleRule > 'END' ';' / 1.1 cvs 8396: SimpleRule . 8397: 8398: ConditionSeq = Condition [ 'AND' Condition ] . 8399: Condition = [ 'NOT' ] [ 'Target' ] Cond . 8400: Cond = CondElem / CondAscend . 8401: CondElem = 'FirstRef' / 'LastRef' / 8402: 'ExternalRef' / 8403: 'Defined' / 8404: 'Alphabet' '=' Alphabet / 8405: 'ComputedPage' / 'StartPage' / 8406: 'UserPage' / 'ReminderPage' / 8407: 'Empty' / 1.18 cvs 8408: ElemID / 1.1 cvs 8409: 'FirstAttr' / 'LastAttr' . 8410: CondAscend = [ Ascend ] CondOnAscend . 8411: Ascend = '*' / 'Parent' / 'Ancestor' LevelOrType . 8412: LevelOrType = CondRelLevel / ElemID [ ExtStruct ] . 8413: CondRelLevel = NUMBER . 8414: CondOnAscend = 'First' / 'Last' / 8415: 'Referred' / 8416: [ 'Immediately' ] 'Within' [ NumParent ] 8417: ElemID [ ExtStruct ] / 8418: 'Attributes' / 8419: AttrID [ RelatAttr ] / 8420: 'Presentation' / 8421: PresRule / 8422: 'Comment' . 8423: NumParent = [ GreaterLess ] NParent . 1.30 ! cvs 8424: GreaterLess = '>' / '<' . 1.1 cvs 8425: NParent = NUMBER. 8426: Alphabet = NAME . 8427: RelatAttr = '=' Value / 1.30 ! cvs 8428: '>' [ '-' ] Minimum / 1.1 cvs 8429: '<' [ '-' ] Maximum / 8430: 'IN' '[' [ '-' ] MinInterval '..' 8431: [ '-' ] MaxInterval ']' . 8432: Value = [ '-' ] IntegerVal / TextVal / AttrValue . 8433: Minimum = NUMBER . 8434: Maximum = NUMBER . 8435: MinInterval = NUMBER . 8436: MaxInterval = NUMBER . 8437: IntegerVal = NUMBER . 8438: TextVal = STRING . 8439: AttrValue = NAME . 8440: 8441: SimpleRule = 'Create' [ 'IN' VarID ] Object 8442: [ Position ] ';' / 8443: 'Write' Object [ Position ] ';' / 8444: 'Read' BufferID [ Position ] ';' / 8445: 'Include' File [ Position ] ';' / 1.6 cvs 8446: 'Get' [ RelPosition ] ElemID 8447: [ ExtStruct ] 8448: [ Position ] ';' / 1.1 cvs 8449: 'Copy' [ RelPosition ] ElemID 8450: [ ExtStruct ] 8451: [ Position ] ';' / 8452: 'Use' TrSchema [ 'For' ElemID ] ';' / 8453: 'Remove' ';' / 8454: 'NoTranslation' ';' / 8455: 'NoLineBreak' ';' / 8456: 'ChangeMainFile' VarID [ Position ] ';' / 1.14 cvs 8457: 'RemoveFile' VarID [ Position ] ';' / 1.10 cvs 8458: 'Set' CounterID InitValue [ Position ] ';' / 8459: 'Add' CounterID Increment [ Position ] ';' / 1.25 cvs 8460: 'Indent' [ 'IN' VarID ] Indent [ Position ] ';' . 1.10 cvs 8461: 1.25 cvs 8462: Indent = 'Suspend' / 'Resume' / [ IndentSign ] IndentValue . 1.10 cvs 8463: IndentSign = '+' / '-' . 8464: IndentValue = NUMBER . 1.1 cvs 8465: 8466: Object = ConstID / CharString / 8467: BufferID / 8468: VarID / 1.30 ! cvs 8469: '(' Function < Function > ')' / 1.21 cvs 8470: [ 'Translated' ] AttrID / 1.1 cvs 8471: 'Value' / 8472: 'Content' / 8473: 'Comment' / 8474: 'Attributes' / 8475: 'Presentation' / 8476: 'RefId' / 8477: 'PairId' / 8478: 'FileDir' / 'FileName' / 'Extension' / 8479: 'DocumentName' / 'DocumentDir' / 8480: [ 'Referred' ] ReferredObject . 8481: Position = 'After' / 'Before' . 8482: 1.6 cvs 8483: ReferredObject= VarID / 8484: ElemID [ ExtStruct ] / 8485: 'RefId' / 8486: 'DocumentName' / 'DocumentDir' . 1.1 cvs 8487: 1.6 cvs 8488: File = FileName / BufferID . 8489: FileName = STRING . 1.1 cvs 8490: 1.6 cvs 8491: RelPosition = 'Included' / 'Referred' . 8492: ExtStruct = '(' ElemID ')' . 1.1 cvs 8493: 1.6 cvs 8494: TrSchema = NAME . 8495: 1.30 ! cvs 8496: AttrSeq = TransAttr < TransAttr > . 1.6 cvs 8497: TransAttr = AttrID [ '(' ElemID ')' ] 8498: [ RelatAttr ] ':' RuleSeq . 8499: 1.30 ! cvs 8500: PresSeq = PresTrans < PresTrans > . 1.6 cvs 8501: PresTrans = PresRule ':' RuleSeq . 8502: PresRule = 'Size' [ PresRelation ] / 8503: 'Indent' [ PresRelation ] / 8504: 'LineSpacing' [ PresRelation ] / 8505: 'Adjust' [ '=' AdjustVal ] / 8506: 'Justify' [ '=' BoolVal ] / 8507: 'Hyphenate' [ '=' BoolVal ] / 8508: 'Style' [ '=' StyleVal ] / 1.24 cvs 8509: 'Weight' [ '=' WeightVal ] / 1.6 cvs 8510: 'Font' [ '=' FontVal ] / 8511: 'UnderLine' [ '=' UnderLineVal ] / 8512: 'Thickness' [ '=' ThicknessVal ] / 8513: 'LineStyle' [ '=' LineStyleVal ] / 8514: 'LineWeight' [ PresRelation ] / 8515: 'FillPattern' [ '=' Pattern ] / 8516: 'Background' [ '=' Color ] / 8517: 'Foreground' [ '=' Color ] . 8518: 8519: PresRelation = '=' PresValue / 1.30 ! cvs 8520: '>' [ '-' ] PresMinimum / 1.6 cvs 8521: '<' [ '-' ] PresMaximum / 8522: 'IN' '[' [ '-' ] PresIntervalMin '..' 8523: [ '-' ] PresIntervalMax ']' . 8524: AdjustVal = 'Left' / 'Right' / 'VMiddle' / 8525: 'LeftWithDots' . 8526: BoolVal = 'Yes' / 'No' . 1.24 cvs 8527: StyleVal = 'Roman' / 'Italics' / 'Oblique' . 8528: WeightVal = 'Normal' / 'Bold' . 1.6 cvs 8529: FontVal = 'Times' / 'Helvetica' / 'Courier' . 8530: UnderLineVal = 'NoUnderline' / 'UnderLined' / 8531: 'OverLined' / 'CrossedOut' . 8532: ThicknessVal = 'Thick' / 'Thin' . 8533: LineStyleVal = 'Solid' / 'Dashed' / 'Dotted' . 8534: Pattern = NAME . 8535: Color = NAME . 8536: PresMinimum = NUMBER . 8537: PresMaximum = NUMBER . 1.1 cvs 8538: PresIntervalMin= NUMBER . 8539: PresIntervalMax= NUMBER . 1.6 cvs 8540: PresValue = [ '-' ] PresVal . 8541: PresVal = NUMBER . 1.1 cvs 8542: 1.6 cvs 8543: TextTransSeq = [ Alphabet ] TransSeq . 8544: Alphabet = NAME . 1.30 ! cvs 8545: TransSeq = 'BEGIN' < Translation > 'END' ';' / 1.6 cvs 8546: Translation . 1.30 ! cvs 8547: Translation = Source [ '->' Target ] ';' . 1.6 cvs 8548: Source = STRING . 1.18 cvs 8549: Target = STRING .</pre> 8550: </div> 8551: <hr> 8552: </div> 1.1 cvs 8553: 1.18 cvs 8554: <div class="chapter"> 8555: <h1><a name="sect7">Character coding</a></h1> 1.1 cvs 8556: 1.18 cvs 8557: <div class="section"> 1.30 ! cvs 8558: <h2><a name="sectb71">Characters</a></h2> 1.1 cvs 8559: 1.30 ! cvs 8560: <p>The characters of the Latin alphabet follow the encoding defined in the ISO 1.5 cvs 8561: 8859-1 (ISO Latin-1) standard. The characters of the Greek alphabet follow 1.18 cvs 8562: the encoding defined by Adobe for its Symbol font (Adobe FontSpecific).</p> 1.30 ! cvs 8563: ! 8564: <p>Characters whose octal code is greater than 0200 are written in the form of 1.1 cvs 8565: their octal code preceded by a backslash character (``\''). For example, the 1.30 ! cvs 8566: French word 'Résumé' is written <tt>R\351sum\351</tt>.</p> ! 8567: ! 8568: <p>To the ISO 8859-1 encoding four characters with the following codes have ! 8569: been added:<br> 1.18 cvs 8570: <tt>212</tt>: line break<br> 8571: <tt>240</tt>: sticky space<br> 8572: <tt>201</tt>: thin space<br> 8573: <tt>202</tt>: en space</p> 1.30 ! cvs 8574: ! 8575: <p>The <tt>212</tt> character is a ``line break'' character which forces a ! 8576: line break. The <tt>240</tt> character is a ``sticky space'', which cannot be 1.18 cvs 8577: replaced by a line break.</p> 8578: </div> 1.1 cvs 8579: 1.18 cvs 8580: <div class="section"> 1.30 ! cvs 8581: <h2><a name="sectb72">Symbols</a></h2> 1.1 cvs 8582: 1.30 ! cvs 8583: <p>The table below gives the codes for the symbols of Thot. Symbols can be ! 8584: used in presentation schemas constants and in transcoding rules of translation 1.18 cvs 8585: schemas. Each symbol is represented by a single character.</p> 8586: <ul> 1.30 ! cvs 8587: <li><tt>r</tt>: a radical</li> ! 8588: <li><tt>i</tt>: a simple integral</li> ! 8589: <li><tt>c</tt>: a curvilinear integral</li> ! 8590: <li><tt>d</tt>: a double integral</li> ! 8591: <li><tt>t</tt>: a triple integral</li> ! 8592: <li><tt>S</tt>: the summation symbol</li> ! 8593: <li><tt>P</tt>: the product symbol</li> ! 8594: <li><tt>U</tt>: the union symbol</li> ! 8595: <li><tt>I</tt>: the intersection symbol</li> ! 8596: <li><tt>></tt>: a right arrow</li> ! 8597: <li><tt><</tt>: a left arrow</li> ! 8598: <li><tt>^</tt>: an up arrow</li> ! 8599: <li><tt>V</tt>: a down arrow</li> ! 8600: <li><tt>(</tt>: an opening parenthesis</li> ! 8601: <li><tt>)</tt>: a closing parenthesis</li> ! 8602: <li><tt>{</tt>: an opening brace</li> ! 8603: <li><tt>}</tt>: a closing brace</li> ! 8604: <li><tt>[</tt>: an opening bracket</li> ! 8605: <li><tt>]</tt>: a closing bracket</li> 1.18 cvs 8606: </ul> 8607: </div> 1.1 cvs 8608: 1.18 cvs 8609: <div class="section"> 1.30 ! cvs 8610: <h2><a name="sectb73">Graphical elements</a></h2> 1.1 cvs 8611: 1.30 ! cvs 8612: <p>The table below gives the codes for the graphical elements of Thot. These 1.1 cvs 8613: elements can be used in presentation schemas constants and in transcoding 8614: rules of translation schemas. Each graphical element is represented by a 1.18 cvs 8615: single character.</p> 8616: <ul> 1.30 ! cvs 8617: <li>a: a circle</li> ! 8618: <li><p><tt>A</tt>: an open curve with an arrow head at the end</p> ! 8619: </li> ! 8620: <li><tt>b</tt>: a horizontal line along the lower side of the box</li> ! 8621: <li><tt>B</tt>: an open curve</li> ! 8622: <li><tt>c</tt>: an ellipse inscribed in the box</li> ! 8623: <li><tt>C</tt>: a rectangle with rounded corners</li> ! 8624: <li><tt>D</tt>: an open curve with two arrow heads</li> ! 8625: <li><tt>e</tt>: The northwest/southeast diagonal of the box with an ! 8626: arrowhead at the bottom</li> ! 8627: <li><tt>E</tt>: The southwest/northeast diagonal of the box with an ! 8628: arrowhead at the top</li> ! 8629: <li><tt>F</tt>: an open curve with an arrow head at start</li> ! 8630: <li><tt>g</tt>: a line from the origin of the box to its opposite ! 8631: corner</li> ! 8632: <li><tt>h</tt>: a horizontal line as wide as the box and placed in its ! 8633: middle</li> ! 8634: <li><tt>l</tt>: a vertical line on the left side of the box</li> ! 8635: <li><tt>L</tt>: a lozenge</li> ! 8636: <li><tt>M</tt>: an open broken line with two arrow heads</li> ! 8637: <li><tt>N</tt>: an open broken line with an arrow head at start</li> ! 8638: <li><tt>o</tt>: The southwest/northeast diagonal of the box with an ! 8639: arrowhead at the bottom</li> ! 8640: <li><tt>O</tt>: The northwest/southeast diagonal of the box with an ! 8641: arrowhead at the top</li> ! 8642: <li><tt>p</tt>: a polygon</li> ! 8643: <li><tt>P</tt>: a rectangle with round corners and a horizontal bar at the ! 8644: top</li> ! 8645: <li><tt>Q</tt>: an ellipse with a horizontal bar at the top</li> ! 8646: <li><tt>r</tt>: a vertical line on the right side of the box</li> ! 8647: <li><tt>R</tt>: a rectangle which is the shape of the box</li> ! 8648: <li><tt>s</tt>: a closed curve</li> ! 8649: <li><tt>S</tt>: an open broken line</li> ! 8650: <li><tt>t</tt>: a horizontal line along the upper side of the box</li> ! 8651: <li><tt>U</tt>: an open broken line with an arrow head at the end</li> ! 8652: <li><tt>v</tt>: a vertical line as tall as the box and placed in its ! 8653: middle</li> ! 8654: <li><tt>V</tt>: a down arrow as tall as the box and in its middle</li> ! 8655: <li>w: a segment (2 points)</li> ! 8656: <li><tt>W</tt>: the upper right corner</li> ! 8657: <li>x: a segment (2 points) with an arrow head at the end</li> ! 8658: <li><tt>X</tt>: the lower right corner</li> ! 8659: <li>y: a segment (2 points) with an arrow head at the end</li> ! 8660: <li><tt>Y</tt>: the lower left corner</li> ! 8661: <li>z: a segment (2 points) with an arrow head at the end</li> ! 8662: <li><tt>Z</tt>: the upper left corner</li> ! 8663: <li><tt>space</tt>: a transparent element</li> ! 8664: <li><tt>^</tt>: an up arrow as tall as the box and in its middle</li> ! 8665: <li><tt>></tt>: a right arrow as long as the box's width and in its ! 8666: middle</li> ! 8667: <li><tt>></tt>: a left arrow as long as the box's width and in its ! 8668: middle</li> ! 8669: <li><tt>/</tt>: The southwest/northeast diagonal of the box</li> ! 8670: <li><tt>\</tt>: the northwest/southeast diagonal of the box</li> 1.18 cvs 8671: </ul> 8672: <hr> 8673: </div> 8674: </div> 8675: </body> 8676: </html>