home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume38 / lout / part26 < prev    next >
Encoding:
Text File  |  1993-08-11  |  74.1 KB  |  2,041 lines

  1. Newsgroups: comp.sources.misc
  2. From: jeff@joyce.cs.su.oz.au (Jeff Kingston)
  3. Subject: v38i094:  lout - Lout document formatting system, v2.05, Part26/35
  4. Message-ID: <1993Aug10.132121.18626@sparky.sterling.com>
  5. X-Md4-Signature: 648b4be7cd28fd903e1504e79dece980
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Tue, 10 Aug 1993 13:21:21 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: jeff@joyce.cs.su.oz.au (Jeff Kingston)
  12. Posting-number: Volume 38, Issue 94
  13. Archive-name: lout/part26
  14. Environment: UNIX
  15. Supersedes: lout: Volume 37, Issue 99-128
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # Contents:  doc/tr.begin/s02 doc/tr.impl/s2.3 doc/tr.impl/s5.2
  22. #   doc/tr.impl/setup doc/tr.lout/ch3.02 gnu.gpl
  23. # Wrapped by kent@sparky on Sun Aug  8 12:29:31 1993
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  25. echo If this archive is complete, you will see the following message:
  26. echo '          "shar: End of archive 26 (of 35)."'
  27. if test -f 'doc/tr.begin/s02' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'doc/tr.begin/s02'\"
  29. else
  30.   echo shar: Extracting \"'doc/tr.begin/s02'\" \(5199 characters\)
  31.   sed "s/^X//" >'doc/tr.begin/s02' <<'END_OF_FILE'
  32. X@Section
  33. X   @Tag { displays }
  34. X   @Title { Displays }
  35. X@Begin
  36. X@PP
  37. XThe @Code "@Display" symbol displays the following thing in the centre
  38. Xof the page or column:
  39. X@ID @Code "@Display @I Centred"
  40. Xhas result
  41. X@Display @I Centred
  42. XNotice that @Code "@I Centred" does not have to be grouped within braces;
  43. Xit is already a single thing.  Spaces (@Code "@DP" symbols) are inserted
  44. Xautomatically above and below the display, so no paragraph symbols are
  45. Xneeded anywhere near the display.
  46. X@PP
  47. XThe display can be made to appear at the left margin by using the
  48. X{@Code "@LeftDisplay"} symbol instead of {@Code "@Display"}, or indented
  49. Xby using {@Code "@IndentedDisplay"}.  There are also @Code "@CentredDisplay"
  50. Xand @Code "@CenteredDisplay" symbols which are the same as
  51. X{@Code "@Display"}.  In general, the word @Code Centred may be spelt
  52. X@Code Centered wherever it appears.
  53. X@PP
  54. XEach display symbol has a `raw' version, which means that no space is
  55. Xinserted above or below; the user must therefore add paragraph symbols:
  56. X@ID @Code {
  57. X"... preceding text."
  58. X"@DP"
  59. X"@RawIndentedDisplay @I Emma"
  60. X"@DP"
  61. X"@RawIndentedDisplay @I"
  62. X"{ Mansfield Park }"
  63. X"@DP"
  64. X"following text ..."
  65. X}
  66. Xhas result
  67. X@ID {
  68. X... preceding text.
  69. X@DP
  70. X@RawIndentedDisplay @I Emma
  71. X@DP
  72. X@RawIndentedDisplay @I { Mansfield Park }
  73. X@DP
  74. Xfollowing text ...
  75. X}
  76. XThe point of this particular example is that two consecutive non-raw
  77. Xdisplays would be separated by two @Code "@DP" symbols, which is too
  78. Xmuch.  A better way to do this, using a list, will be presented in the
  79. Xnext section.
  80. X@PP
  81. XDisplays may be {@I aligned}, which means that nominated points within a
  82. Xsequence of displays are made to appear directly beneath each
  83. Xother.  Displays may also be {@I numbered}, which means that an
  84. Xautomatically generated number is placed at the right-hand margin.  For
  85. Xexample, here is a first display:
  86. X@BeginNumberedDisplays
  87. X@BeginAlignedDisplays
  88. X@CentredAlignedNumberedDisplay
  89. X  @Tag { fibeq }
  90. X@Eq { F sub n ^= F sub n-1 + F sub n-2 }
  91. Xand here is a second display, which is aligned on its @Eq {equal} sign
  92. Xwith the first, and also numbered in sequence with it:
  93. X@CentredAlignedNumberedDisplay
  94. X@Eq { F sub n - F sub n-1 ^= F sub n-2 }
  95. X@EndNumberedDisplays
  96. X@EndAlignedDisplays
  97. XMathematical examples have been chosen because they are the most common
  98. Xaligned and numbered displays; but any kind of display may be aligned or
  99. Xnumbered.
  100. X@PP
  101. XNotice that the two displays are centred as a block as well as
  102. Xaligned.  Altogether then we have four ways in which displays vary:
  103. X@BL
  104. X@LI { A display can be raw or not raw; }
  105. X@LI { It can be a {@Code "@Display"}, {@Code "@LeftDisplay"},
  106. X{@Code "@IndentedDisplay"}, {@Code "@CentredDisplay"} or
  107. X{@Code "@CenteredDisplay"}; }
  108. X@LI { It can be aligned or not aligned; }
  109. X@LI { It can be numbered or not numbered. }
  110. X@EL
  111. XAll possible combinations are allowed.  The display that has everything
  112. Xis called
  113. X@ID @Code { "@RawCentredAlignedNumberedDisplay" &0io }
  114. XBy leaving out some or all of {@Code Raw}, {@Code Aligned}, and
  115. X{@Code Numbered}, and by changing or leaving out {@Code Centred},
  116. Xwe get all these combinations.
  117. X@PP
  118. XWhen aligned displays are used, it is necessary to indicate where the
  119. Xaligned group begins and ends, by inserting @Code "@BeginAlignedDisplays"
  120. Xjust before the first, and @Code "@EndAlignedDisplays" just after the
  121. Xlast.  The alignment points are indicated by preceding them by the
  122. Xsymbol {@Code "^"}.  Numbered displays are similarly bracketed by
  123. X@Code "@BeginNumberedDisplays" and {@Code "@EndNumberedDisplays"}.  So
  124. Xthen, with the help of the @Code "@Eq" equation formatting package
  125. X[{@Ref kingston92eq}], here is the input for the two displays given
  126. Xearlier:
  127. X@ID @Code {
  128. X"... a first display:"
  129. X"@BeginNumberedDisplays"
  130. X"@BeginAlignedDisplays"
  131. X"@CentredAlignedNumberedDisplay"
  132. X"  @Tag { fibeq }"
  133. X@OneCol { "@Eq { F sub n ^= F sub n-1 + F sub n-2 }" &0io }
  134. X"and ... in sequence with it:"
  135. X"@CentredAlignedNumberedDisplay"
  136. X@OneCol { "@Eq { F sub n - F sub n-1 ^= F sub n-2 }" &0io }
  137. X"@EndNumberedDisplays"
  138. X"@EndAlignedDisplays"
  139. X"Mathematical examples ..."
  140. X}
  141. XNo braces need enclose @Code "@Eq { ... }" because it is already a
  142. Xsingle entity.  The @Code "@Tag { fibeq }" part is optional and is
  143. Xexplained in Section {@NumberOf cross}.  Alignment and numbering work
  144. Xquite independently; they don't have to start or end together, and there
  145. Xcan be non-aligned and non-numbered displays among the others.
  146. X@PP
  147. X@Code "@BeginNumberedDisplays" has two {@I options}:  subsidiary
  148. Xsymbols which modify the result.  For example,
  149. X@ID @Code {
  150. X"@BeginNumberedDisplays"
  151. X"   style { [tag] }"
  152. X"   start { 12.5 }"
  153. X}
  154. Xwill cause the associated numbered displays to be labelled [12.5],
  155. X[12.6], and so on.  The first label is the @Code style option with
  156. X@Code tag replaced by the @Code start option.  Font changes and other
  157. Xsymbols are acceptable within the @Code style option.  When omitted, the
  158. Xoptions have default values @Code "(tag)" and @Code "1" respectively.
  159. X@PP
  160. XEvery symbol introduced in this section has an abbreviated form
  161. Xconsisting of @Code "@" followed by its capital letters only.  For
  162. Xexample, @Code "@BeginNumberedDisplays" can be abbreviated to {@Code "@BND"},
  163. Xand the display that has everything to {@Code "@RCAND"}.
  164. X@End @Section
  165. END_OF_FILE
  166.   if test 5199 -ne `wc -c <'doc/tr.begin/s02'`; then
  167.     echo shar: \"'doc/tr.begin/s02'\" unpacked with wrong size!
  168.   fi
  169.   # end of 'doc/tr.begin/s02'
  170. fi
  171. if test -f 'doc/tr.impl/s2.3' -a "${1}" != "-c" ; then 
  172.   echo shar: Will not clobber existing file \"'doc/tr.impl/s2.3'\"
  173. else
  174.   echo shar: Extracting \"'doc/tr.impl/s2.3'\" \(12558 characters\)
  175.   sed "s/^X//" >'doc/tr.impl/s2.3' <<'END_OF_FILE'
  176. X@SubSection
  177. X    @Tag { objects }
  178. X    @Title { Basic structural operators }
  179. X@Begin
  180. X@PP
  181. XA programming language may be considered complete when it attains the
  182. Xpower of a Turing machine, but no such criterion seems relevant to
  183. Xdocument formatting.  Instead, as the language develops and new
  184. Xapplications are attempted, deficiencies are exposed and the operator set is
  185. Xrevised to overcome them.
  186. X@PP
  187. XLout has a repertoire of 23 primitive operators
  188. X(Figure {@NumberOf primitives}),
  189. X
  190. X@Figure
  191. X   @Caption { The 23 primitive operators of Lout, in order of
  192. Xincreasing precedence. }
  193. X   @Tag { primitives }
  194. X@Tab
  195. X   vmargin { 0.5vx }
  196. X   @Fmta { @Col @I A ! @Col B }
  197. X{
  198. X@Rowa
  199. X   A { object  {@Code "/"}gap  object }
  200. X   B { Vertical concatenation with mark alignment }
  201. X@Rowa
  202. X   A { object  {@Code "//"}gap  object }
  203. X   B { Vertical concatenation with left justification }
  204. X@Rowa
  205. X   A { object  {@Code "|"}gap  object }
  206. X   B { Horizontal concatenation with mark alignment }
  207. X@Rowa
  208. X   A { object  {@Code "||"}gap  object }
  209. X   B { Horizontal concatenation with top-justification }
  210. X@Rowa
  211. X   A { object  {@Code "&"}gap  object }
  212. X   B { Horizontal concatenation within paragraphs }
  213. X@Rowa
  214. X   A { {@Code "@OneCol"}  object }
  215. X   B { Hide all but one column mark of @I object }
  216. X@Rowa
  217. X   A { {@Code "@OneRow"}  object }
  218. X   B { Hide all but one row mark of @I object }
  219. X@Rowa
  220. X   A { font  @Code "@Font"  object }
  221. X   B { Render @I object in nominated font }
  222. X@Rowa
  223. X   A { breakstyle  @Code "@Break"  object}
  224. X   B { Break paragraphs of @I object in nominated style }
  225. X@Rowa
  226. X   A { spacestyle  @Code "@Space"  object }
  227. X   B { Render spaces between words in nominated style }
  228. X@Rowa
  229. X   A { length  {@Code "@Wide"}  object }
  230. X   B { Render @I object to width @I length }
  231. X@Rowa
  232. X   A { length  {@Code "@High"}  object }
  233. X   B { Render @I object to height @I length }
  234. X@Rowa
  235. X   A { {@Code "@HExpand"}  object}
  236. X   B { Expand horizontal gaps to fill available space }
  237. X@Rowa
  238. X   A { {@Code "@VExpand"}  object}
  239. X   B { Expand vertical gaps to fill available space }
  240. X@Rowa
  241. X   A { {@Code "@HScale"}  object }
  242. X   B { Horizontal geometrical scaling to fill available space }
  243. X@Rowa
  244. X   A { {@Code "@VScale"}  object }
  245. X   B { Vertical geometrical scaling to fill available space }
  246. X@Rowa
  247. X   A { angle  {@Code "@Rotate"}  object }
  248. X   B { Rotate @I object by @I angle }
  249. X@Rowa
  250. X   A { PostScript  {@Code "@Graphic"}  object }
  251. X   B { Escape to graphics language }
  252. X@Rowa
  253. X   A { @Code "@Next"  object }
  254. X   B { Add 1 to an object denoting a number }
  255. X@Rowa
  256. X   A { object  @Code "@Case"  alternatives }
  257. X   B { Select from a set of alternative objects }
  258. X@Rowa
  259. X   A { identifier  @Code "&&"  object }
  260. X   B { Cross reference }
  261. X@Rowa
  262. X   A { cross-reference  @Code "@Open"  object }
  263. X   B { Retrieve value from cross reference }
  264. X@Rowa
  265. X   A { cross-reference  @Code "@Tagged"  object}
  266. X   B { Attach cross referencing tag to object }
  267. X}
  268. X
  269. Xwhich has proven adequate for a wide variety of features, including equations,
  270. Xtables, and page layout, and so seems to be reasonably complete in this
  271. Xpragmatic sense.  In this section we introduce the eight concatenation and
  272. Xmark-hiding operators.  To them falls the basic task of assembling complex
  273. Xobjects from simple ones, and they were the first
  274. Xto be designed and implemented.
  275. X@PP
  276. XMany of the operators of Eqn can be viewed as building small tables.  A
  277. Xbuilt-up fraction, for example, has one column and three rows
  278. X(numerator, line, and denominator).  Numerous investigations of this
  279. Xkind convinced the author that operators capable of assembling the rows
  280. Xand columns of tables would suffice for building all kinds of objects.
  281. X@PP
  282. XThe simplest objects are empty objects and literal words like
  283. X{@Code metempsychosis}, which have one column mark and one row mark:
  284. X@ID {
  285. X@ShowMarks metempsychosis
  286. X}
  287. XTo place two arbitrary objects side by side, we use the infix
  288. Xoperator {@Code "|"}, denoting horizontal concatenation.  For
  289. Xexample,
  290. X@ID {
  291. X@Code "USA  |0.2i  Australia"
  292. X}
  293. Xproduces the object
  294. X@ID {
  295. X@ShowMarks USA |0.2i @ShowMarks Australia
  296. X}
  297. XThe row marks are merged into one, fixing the vertical position of
  298. Xthe objects relative to each other; their horizontal separation is
  299. Xdetermined by the @I gap attached to the operator, in this case 0.2
  300. Xinches.  We think of the gap as part of the operator, although
  301. Xstrictly it is a third parameter.  It may be omitted, defaulting to
  302. X{@Code "0i"}.
  303. X@PP
  304. X@I {Vertical concatenation} & , denoted by the infix operator {@Code "/"},
  305. Xis the same apart from the change of direction:
  306. X@ID {
  307. X@Code "Australia  /0.1i  USA"
  308. X}
  309. Xproduces the object
  310. X@ID {
  311. X@ShowMarks Australia /0.1i
  312. X@ShowMarks USA
  313. X}
  314. Xwith column marks merged and a 0.1 inch gap.
  315. X@PP
  316. XConsider now what happens when horizontal and vertical are combined:
  317. X@ID  @Code {
  318. X             |1m  "{"  USA         |1m  "|0.2i" |1m   Australia  "}"
  319. X/1vx "/0.1i" |    "{"  Washington  |    "|"     |     Canberra  "}"
  320. X}
  321. XThe two parameters of @Code "/" now have two column marks each, and
  322. Xthey will be merged with the corresponding marks in the other
  323. Xparameter, yielding the object
  324. X@ID {
  325. X      @ShowMarks USA &
  326. X      { 0 ymark moveto xsize 10 pt add ymark lineto [ 3 pt ] 0 setdash stroke }
  327. X      @Graphic {1c @Wide }
  328. X      |0.2i @ShowMarks Australia
  329. X/0.1i @ShowMarks Washington  |     @ShowMarks Canberra
  330. X}
  331. XThe @Code "0.2i" gap separates columns, not individual items in
  332. Xcolumns, so a gap attached to the second @Code "|" would serve no
  333. Xpurpose; any such gap is ignored.  If the number of marks to be merged
  334. Xdiffers, empty columns are added at the right to equalize the number.  The
  335. Xfour marks protruding from the result are all available for merging
  336. Xwith neighbouring marks by other concatenation operators.  The precedence
  337. Xof @Code "|" is higher than the precedence of {@Code "/"}, so the braces
  338. Xcould be omitted.
  339. X@PP
  340. XWhen lines of text are concatenated, it is conventional to measure
  341. Xtheir separation from baseline to baseline (mark to mark in Lout),
  342. Xrather than from edge to edge as above.  This idea of different
  343. Xreference points for measurement evolved over the years into a
  344. Xsystem of six @I {gap modes} (Figure {@NumberOf gapmodes}), expressed
  345. Xby appending a letter to the length.  For example, @Code "|0.2i" is
  346. Xan abbreviation for {@Code "|0.2ie"}, meaning 0.2 inches measured
  347. Xfrom edge to edge; @Code "|0.3ix"
  348. Xproduces a 0.3 inch gap measured from mark to mark and widened if
  349. Xnecessary to prevent overstriking; and @Code "|2.5it" places its right
  350. Xparameter 2.5 inches from the current left margin, irrespective of
  351. Xthe position of the left parameter.  There is also a choice of
  352. Xeleven units of measurement (inches, centimetres, multiples of the
  353. Xcurrent font size, etc.), the most interesting being
  354. Xthe @Code r unit:  one @Code r is the column width minus the width of
  355. Xthe following object, so that @Code "|1rt" produces sufficient space
  356. Xto right justify the following object, and @Code "|0.5rt" to center
  357. Xit.  These features implement spacings needed in practice rather
  358. Xthan suggested by theory.  They work with all five concatenation
  359. Xoperators, horizontal and vertical.
  360. X
  361. X@Figure
  362. X   @Tag { gapmodes }
  363. X   @Caption { The six gap modes (@I length is any length).  Hyphenation
  364. Xmode has an extra property not shown here. }
  365. X@Fig {
  366. X{ /2.5vx Edge-to-edge |0.3i   {@Code "|"} &1p {@I length} &1p {@Code e}
  367. X  /4.2vx Hyphenation    |0.3i   {@Code "|"} &1p {@I length} &1p {@Code h}
  368. X  /4.2vx Overstrike     |0.3i   {@Code "|"} &1p {@I length} &1p {@Code o}
  369. X  /4.2vx Mark-to-mark   |0.3i   {@Code "|"} &1p {@I length} &1p {@Code x}
  370. X  /4.2vx Kerning        |0.3i   {@Code "|"} &1p {@I length} &1p {@Code k}
  371. X  /4.2vx Tabulation     |0.3i   {@Code "|"} &1p {@I length} &1p {@Code t}
  372. X}
  373. X||0.5i
  374. X@Box margin { 0c } 6c @Wide 13.5c @High 9p @Font
  375. X{
  376. X  @OneRow {
  377. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  378. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  379. X     @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
  380. X     @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I length } }
  381. X  }
  382. X  //4vx
  383. X  @OneRow {
  384. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  385. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  386. X     @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
  387. X     @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I length } }
  388. X  }
  389. X  //4vx
  390. X  @OneRow {
  391. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  392. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  393. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  394. X     @At { 1.2c @Wide 1.7c @High } @Put { 3.3c @Wide { &0.5rt @I length } }
  395. X  }
  396. X  //4vx
  397. X  @OneRow {
  398. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  399. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  400. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  401. X     @At { 1.2c @Wide 1.7c @High }
  402. X    @Put 3.3c @Wide { |0.5rt @Eq { max(length, a+b) } }
  403. X     @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
  404. X     @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
  405. X     @At { 4c   @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
  406. X     @At { 4c   @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
  407. X  }
  408. X  //4.5vx
  409. X  @OneRow {
  410. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  411. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  412. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  413. X     @At { 1.2c @Wide 1.7c @High }
  414. X    @Put { 3.3c @Wide { |0.5rt @Eq { max(length, a, b) } } }
  415. X     @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
  416. X     @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
  417. X     @At { 4c   @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
  418. X     @At { 4c   @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
  419. X  }
  420. X  //4vx
  421. X  @OneRow {
  422. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  423. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  424. X     @At { 0.0c @Wide 1.6c @High } @Put { @DoubleArrow 4.0c }
  425. X     @At { 2.8c @Wide 1.8c @High } @Put { @I length }
  426. X  }
  427. X  //5vx
  428. X  @DoubleArrow 6c
  429. X  //0.1c |0.5rt @I { current bound }
  430. X}
  431. X}
  432. X
  433. X@PP
  434. XWhen we construct a built-up fraction, the result has three row marks, but
  435. Xonly the second should be visible outside the object:
  436. X@ID @Eq { @ShowMarks { X over Y } }
  437. XThis is a common problem, and accordingly a @Code "@OneRow" operator was
  438. Xintroduced for hiding all but one of the row marks of its
  439. Xparameter.  Normally, the first mark is the survivor, but a later mark can
  440. Xbe chosen by prefixing @Code "^" to the preceding concatenation operator:
  441. X@ID @Code "@OneRow { X  ^/2p  @HLine  /2p  Y }"
  442. Xhas the desired result, where {@Code "2p"} is two points and @Code "@HLine"
  443. Xis an easy combination of Lout's graphics operators.  A similar operator,
  444. X{@Code "@OneCol"}, hides column marks.
  445. X@PP
  446. XA variant of @Code "/" called @Code "//" is provided which performs
  447. Xvertical concatenation but ignores all column marks and simply
  448. Xleft-justifies its two parameters:
  449. X@ID @Code {
  450. X"Heading  //0.1i"
  451. X"A  |0.2i  B  /0.1i"
  452. X"C  |  D"
  453. X}
  454. Xhas result
  455. X@ID { Heading //0.1i  A  |0.2i  B  /0.1i  C  |  D }
  456. Xshowing that spanning columns in tables motivate the inclusion of this
  457. Xoperator.  There is an analogous @Code "||" operator.  The author
  458. Xwould have preferred to leave out these operators, since they
  459. Xcomplicate the implementation, and it is interesting to examine the
  460. Xprospects of doing so.
  461. X@PP
  462. XThe @Code "//" operator is formally redundant, because in general
  463. Xthe expression @Code "x // y" can be replaced by
  464. X@ID @Code {
  465. X"@OneCol {  |  x  }   /"
  466. X"@OneCol {  |  y  }"
  467. X}
  468. Xfor any objects {@Code x} and {@Code y}.  By concatenating an empty
  469. Xobject at the left of @Code x and hiding all but that empty object's
  470. Xcolumn mark, we effectively shift {@Code x}'s column mark to its left
  471. Xedge.  The same goes for {@Code y}, so the @Code "/" operator has just
  472. Xone column mark to merge, at the extreme left, and its effect is
  473. Xindistinguishable from {@Code "//"}.
  474. X@PP
  475. XUnfortunately, if @Code y consists of two rows separated by {@Code "/"},
  476. Xas in the example above, both rows must be placed inside the
  477. X{@Code "@OneCol"}, and the table cannot be entered in the simple
  478. Xrow-by-row manner that non-expert users naturally expect.  Another
  479. Xadvantage of @Code "//" is that its left parameter can be printed
  480. Xbefore its right parameter is known; this is important when the left
  481. Xparameter is an entire page.
  482. X@PP
  483. XThe fifth and final concatenation operator, {@Code "&"}, is an explicit
  484. Xversion of the horizontal concatenation operator interpolated when
  485. Xobjects are separated by white space.  It is formally identical to
  486. X@Code "|" except for taking higher precedence and being subject to
  487. Xreplacement by @Code "//1vx" during paragraph breaking
  488. X(Section {@NumberOf style}).
  489. X@End @SubSection
  490. END_OF_FILE
  491.   if test 12558 -ne `wc -c <'doc/tr.impl/s2.3'`; then
  492.     echo shar: \"'doc/tr.impl/s2.3'\" unpacked with wrong size!
  493.   fi
  494.   # end of 'doc/tr.impl/s2.3'
  495. fi
  496. if test -f 'doc/tr.impl/s5.2' -a "${1}" != "-c" ; then 
  497.   echo shar: Will not clobber existing file \"'doc/tr.impl/s5.2'\"
  498. else
  499.   echo shar: Extracting \"'doc/tr.impl/s5.2'\" \(14105 characters\)
  500.   sed "s/^X//" >'doc/tr.impl/s5.2' <<'END_OF_FILE'
  501. X@SubSection
  502. X    @Tag { flushing }
  503. X    @Title { The galley flushing algorithm }
  504. X@Begin
  505. X@PP
  506. XGalley components are promoted one by one into the point of appearance in
  507. Xthe dynamic parent galley, then carried along with it, ultimately to the
  508. Xroot galley and the output file.  This process is called @I galley
  509. X{@I flushing}: the galleys are rivers running together to the sea, and
  510. Xeach component is a drop of water.
  511. X@PP
  512. XHere is a snapshot of a small dynamic tree, based on the @Code "@PageList"
  513. Xdefinitions of Section {@NumberOf recursion}:
  514. X@ID @Fig {
  515. X
  516. X@I 10p @Font { output file } A:: @Box linestyle { noline } margin { 0c }
  517. X
  518. X||2c
  519. X
  520. X{
  521. X@I 10p @Font { root galley }
  522. X//0.2c
  523. XB:: @Box margin { 0c } linestyle { noline }
  524. X//
  525. X@LittlePage {
  526. X|0.5rt - 1 -
  527. X//1.2vx &2m A small
  528. X//1.2vx @Code "@Galley" * C:: @Box margin { 0.01c } linestyle { noline }
  529. X//1rt @Code "@FootSect"
  530. X}
  531. X//
  532. X@Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@PageList 2"
  533. X}
  534. X
  535. X||2c
  536. X
  537. X{
  538. X//0.9c  @I 10p @Font { body text }
  539. X//0.2c  D:: @Box margin { 0.3c } 2.8c @Wide 8p @Font paragraph
  540. X//      @Box margin { 0.3c } 2.8c @Wide 8p @Font { of text. }
  541. X//      @Box margin { 0.3c } 2.8c @Wide @Code 8p @Font "@Input"
  542. X}
  543. X
  544. X// @Arrow from { B@W } to { A@E }
  545. X// @Arrow from { D@W } to { C@E }
  546. X
  547. X}
  548. XThe components of the body text galley are lines, except for the special
  549. Xreceptive symbol @Code "@Input" which is a placeholder for as yet unread
  550. Xinput (Section {@NumberOf lookahead}).  The components of the root galley are
  551. Xpages, except for the concluding unexpanded invocation of {@Code "@PageList"},
  552. Xwhich is an inexhaustible source of more pages, expanded on demand.
  553. X@PP
  554. XThe concrete data structure used by Basser Lout permits the galley
  555. Xflushing algorithm to navigate the dynamic tree and find significant
  556. Xfeatures quickly:
  557. X@ID 10p @Font @Fig maxlabels { 100 } {
  558. X
  559. XA:: @Ellipse @I { HEAD }
  560. X
  561. X||1.5c
  562. X
  563. X@OneCol @OneRow {
  564. XB:: @Ellipse @I { RECEIVING * }
  565. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W  A@CIRCUM} } to { B@W  }
  566. X//0.6c
  567. XC:: @Ellipse @I { RECEPTIVE }
  568. X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W  A@CIRCUM} } to { C@W  }
  569. X//0.6c
  570. XD:: @Box margin { 0c } linestyle { noline }
  571. X// @Arrow from { A@CTR ++ {A@CTR @Angle D@NW  A@CIRCUM} } to { D@NW  }
  572. X//
  573. X@LittlePage {
  574. X|0.5rt - 1 -
  575. X//1.2vx &2m A small
  576. X//1.2vx  E:: @Box margin { 0c } linestyle { noline } @Code "@Galley "
  577. X//1rt    F:: @Box margin { 0c } linestyle { noline } @Code "@FootSect "
  578. X}
  579. X// @FunnyArrow arrow { forward } from { B@E } to { E@E }
  580. X// @FunnyArrow arrow { forward } from { C@E } to { F@E }
  581. X//0.6c
  582. XC:: @Ellipse @I { GAP }
  583. X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W  A@CIRCUM} } to { C@W  }
  584. X//0.6c
  585. XC:: @Ellipse @I { RECEPTIVE }
  586. X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W  A@CIRCUM} } to { C@W  }
  587. X//0.6c
  588. XD:: @Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@PageList 2"
  589. X//  @Arrow from { A@CTR ++ {A@CTR @Angle D@NW  A@CIRCUM} } to { D@NW  }
  590. X//  @FunnyArrow from { C@E } to { D@W ++ { 1.8 cm 0 } }
  591. X}
  592. X
  593. X||1.0c
  594. X
  595. XA:: @Ellipse @I { HEAD }
  596. X& @Arrow from { B@E } to { A@W }
  597. X
  598. X||1.5c
  599. X
  600. X@OneCol @OneRow {
  601. XB:: @Box margin { 0.3c } 2.8c @Wide 8p @Font paragraph
  602. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
  603. X//0.6c
  604. XB:: @Ellipse @I { GAP }
  605. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
  606. X//0.6c
  607. XB:: @Box margin { 0.3c } 2.8c @Wide 8p @Font { of text. }
  608. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@NW A@CIRCUM} } to { B@NW }
  609. X//0.6c
  610. XB:: @Ellipse @I { GAP }
  611. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
  612. X//0.6c
  613. XB:: @Ellipse @I { RECEPTIVE }
  614. X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
  615. X//0.6c
  616. XC:: @Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@Input"
  617. X// @Arrow from { A@CTR ++ {A@CTR @Angle C@NW A@CIRCUM} } to { C@NW }
  618. X// @FunnyArrow from { B@E } to { C@W ++ { 1.2 cm 0 } }
  619. X}
  620. X
  621. X}
  622. XEach galley has a @Eq { HEAD } node whose children are its component
  623. Xobjects, separated by @Eq { GAP } nodes recording the inter-component
  624. Xgaps.
  625. X@PP
  626. XEach component is preceded by zero or more @I {galley index nodes} of
  627. Xvarious types.  Every receptive symbol has a @Eq { RECEPTIVE } index pointing
  628. Xto it, so that it can be found without searching through its
  629. Xcomponent.  If the symbol is currently the target of a galley, it has a
  630. X@Eq { RECEIVING } index instead which is also linked to the incoming
  631. Xgalley.  Galleys that are currently without a target are linked to the
  632. Xdynamic tree by @Eq { UNATTACHED } galley indexes, either just after their
  633. Xmost recent target if there has been one, or else at their point of
  634. Xinvocation.
  635. X@PP
  636. XEach galley should be thought of as a concurrent process, although the
  637. Ximplementation in C uses coroutines implemented by procedures.  A galley
  638. Xmay promote its first component only if it has a target, sufficient space
  639. Xis available at the target to receive the component, and the component
  640. Xcontains no receptive symbols.  This last condition seems to be the key
  641. Xto galley synchronization:  it forces a bottom-up promotion regime,
  642. Xpreventing pages from flushing to output before text flushes into them,
  643. Xfor example.
  644. X@PP
  645. XEach galley contains a number of binary semaphores, shown as asterisks
  646. Xin our snapshots when set.  At any given moment, a galley process is
  647. Xeither running or else is suspended on one of its own semaphores.  The
  648. X@Eq { HEAD } node contains a semaphore which is set when the galley has tried
  649. Xto find a target and failed.  Each receptive symbol has a semaphore
  650. Xwhich is set when that symbol is preventing the first component from
  651. Xbeing promoted.
  652. X@PP
  653. XFor example, in the snapshot at the beginning of this section, the root
  654. Xgalley is suspended on the @Code "@Galley" symbol, but the text galley
  655. Xis running.  It will suspend on the @Code "@Input" symbol after the
  656. Xfirst two components are promoted.
  657. X@PP
  658. XEvery galley {@I G}, be it a list of pages, body text, a footnote, or
  659. Xwhatever, executes the following algorithm in parallel with every other
  660. Xgalley:
  661. X@DP
  662. X1.  Initially @I G is unattached.  Search forwards or backwards from its
  663. X@Eq { UNATTACHED } index as required, to find a receptive symbol @I S which
  664. Xcan expand to reveal a target for {@I G}.
  665. X@DP
  666. X2.  If no @I S can be found, suspend on the attachment semaphore.  Resume
  667. Xlater from step 1.
  668. X@DP
  669. X3.  Expand @I S to reveal the target of {@I G}.  Preserve {@I S}'s
  670. Xsemaphore by moving it to the first receptive symbol within the
  671. Xexpansion of {@I S}.
  672. X@DP
  673. X4.  Calculate the available width and height at the target, and if
  674. X@I G is still a pure parse tree, use the environment attached to @I G
  675. Xand the style information from the target to evaluate @I G as in
  676. XSection {@NumberOf functional}.
  677. X@DP
  678. X5.  Examine the components of @I G one by one.  For each component there
  679. Xare three possibilities:
  680. X@PP
  681. X@I ACCEPT.  If the component fits into the available space, and has
  682. Xno other problems, then promote it into the target.  If this is the
  683. Xfirst component promoted into this target, and @I G is a forcing
  684. Xgalley (Section {@NumberOf lookahead}), delete every receptive symbol
  685. Xpreceding the target in the parent galley.  If @I G is the root galley,
  686. Xrender the component on the output file and dispose it;
  687. X@PP
  688. X@I REJECT.  If the component is too large for the available space, or a
  689. X@Eq { FOLLOWS } index (described below) forbids its promotion into this
  690. Xtarget, then detach @I G from the target.  If this was the first component
  691. Xat this target, @I S has been a complete failure, so undo step 3 (Basser
  692. XLout is not able to undo step 4); otherwise delete the target.  Return to
  693. Xstep 1 and continue immediately;
  694. X@PP
  695. X@I SUSPEND.  If the component contains a receptive symbol, it cannot be
  696. Xpromoted yet.  If this symbol is the target of a galley that was written
  697. Xto an auxiliary file on a previous run, read in that galley and flush
  698. Xit.  Otherwise suspend on the receptive symbol's semaphore; resume later
  699. Xfrom step 4.
  700. X@DP
  701. X6.  Terminate when the galley is empty.
  702. X@DP
  703. XAt various points in this algorithm, receptive symbols (and their
  704. Xsemaphores) are deleted in the dynamic parent galley, possibly
  705. Xpermitting it to resume flushing.  When this happens, Basser Lout resumes
  706. Xthe parent immediately after @I G suspends or terminates.  Also,
  707. Xwhenever a component is promoted, any child galleys connected to
  708. Xit by @Eq { UNATTACHED } indexes must be resumed, since these
  709. Xgalleys may be able to find a target now.  A good example of this
  710. Xsituation occurs when a line of body text with one or more footnotes
  711. Xis promoted onto a page.  Basser Lout gives priority to such children,
  712. Xsuspending @I G while each is given a chance to flush.
  713. X@PP
  714. XBasser Lout searches for the first target of @I G only in regions of the
  715. Xdynamic tree that will clearly precede or follow {@I G}'s invocation
  716. Xpoint in the final printed document, whichever is specified in the
  717. X@Code into clause; subsequent targets are sought later in the same
  718. Xgalley as the first.  An exception to this rule, whose necessity will
  719. Xbe made clear later, is that a first @Code following target will be
  720. Xsought within a dynamic sibling galley preceding {@I G}'s invocation
  721. Xpoint:
  722. X@ID 10p @Font @Fig {
  723. X
  724. X{
  725. X@I { dynamic parent }
  726. X//0.2c
  727. X@Box 2.8c @Wide 4.5c @High
  728. X{
  729. X   //0.5c A:: @Box margin { 0c } linestyle { noline } @Code "@XTarget"
  730. X   //1.0c C:: @Box margin { 0c } linestyle { noline } @Eq { UNATTACHED }
  731. X   //1.3c @Code "@XTarget"
  732. X}
  733. X}
  734. X
  735. X||1.5c
  736. X
  737. X{
  738. X//0.6c
  739. XB:: @Box margin {0c} linestyle {noline} @Code "X into { @XTarget&&following }"
  740. X//0.2c
  741. X@Box 2.8c @Wide 1.5c @High { //0.8c @Code "@GTarget" }
  742. X//1.0c
  743. XD:: @Box margin {0c} linestyle {noline} @Code "G into { @GTarget&&following }"
  744. X//0.2c
  745. X@Box 2.8c @Wide 2.5c @High {}
  746. X}
  747. X
  748. X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
  749. X// @Arrow from { C@E ++ {0.2 cm 0} } to { D@W -- {0.2 cm 0} }
  750. X
  751. X}
  752. XHere @I G will find the @Code "@GTarget" target within {@I X}.  This is
  753. Xdangerous, since if the first component of @I G is then promoted via
  754. X@I X into the first {@Code "@XTarget"} rather than into the second,
  755. X{@I G}'s target will not appear later in the final printed document than
  756. Xits invocation point, as required by the @Code into clause.
  757. X@PP
  758. XAccordingly, when such a target is chosen, two special galley indexes
  759. Xare inserted and linked together: a @Eq { PRECEDES } index at {@I G}'s
  760. Xinvocation point, and a @Eq { FOLLOWS } index at the first component of
  761. X{@I G}.  The algorithm checks before promoting any @Eq { FOLLOWS } index
  762. Xthat its promotion would not place it earlier than the corresponding
  763. X@Eq { PRECEDES } index in the same galley, and rejects the component if
  764. Xit would.  Since @Eq { PRECEDES } and @Eq { FOLLOWS } indexes are rarely used,
  765. Xthis check can be implemented by linear search.
  766. X@PP
  767. XWhen two components are separated by {@Code "/"}, as opposed to the more
  768. Xusual {@Code "//"}, each influences the horizontal position of the
  769. Xother.  Because of this, the @I SUSPEND action is in fact taken if a
  770. Xreceptive symbol occurs in any component separated from the first by
  771. X{@Code "/"} operators only.  Again, linear search forwards to the first
  772. X{@Code "//"} suffices for this check.
  773. X@PP
  774. XA good illustration of these unusual cases is afforded by the
  775. X@Code "@Align" symbols from the standard DocumentLayout package.  These
  776. Xare used to produce displayed equations, aligned on their equals signs
  777. Xdespite being separated by arbitrary body text.
  778. X@PP
  779. XThe @Code "@Align" symbols are packaged neatly for the convenience of
  780. Xthe non-expert user, but we will show just the essence of the
  781. Ximplementation here.  First, an @Code "@AlignList" galley is created
  782. Xwhich contains an infinite supply of @Code "@AlignPlace" receptive
  783. Xsymbols separated by @Code "/" operators:
  784. X@ID @Fig {
  785. X
  786. X{
  787. X@I { body text galley }
  788. X//0.2c
  789. X@Box 2.8c @Wide 4.0c @High
  790. X{ //1.5c
  791. X  A:: @Box margin { 0c } linestyle { noline } @Code "@Galley"
  792. X}
  793. X}
  794. X
  795. X||1.5c
  796. X
  797. X{
  798. X//2.4c
  799. XB:: @Box margin { 0c } linestyle { noline } @Code "@AlignList"
  800. X//0.2c
  801. X@Box {
  802. X      @Code "@AlignPlace"
  803. X//1vx @Code "@AlignPlace"
  804. X//1vx @Code "..."
  805. X//1vx @Code "@EndAlignList"
  806. X}
  807. X
  808. X}
  809. X
  810. X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
  811. X}
  812. XThen equations like
  813. X@ID @ShowMarks @Eq { f(x) ^= g(x) + 2 }
  814. Xare created and sent to @Code "@AlignPlace&&following" targets.  They
  815. Xcollect in the @Code "@AlignList" galley and are aligned there:
  816. X@ID @Fig {
  817. X
  818. X{
  819. X@I { body text galley }
  820. X//0.2c
  821. X@Box 2.8c @Wide 4.0c @High
  822. X{ //1.5c
  823. X  A:: @Box margin { 0c } linestyle { noline } @Code "@Galley"
  824. X}
  825. X}
  826. X
  827. X||1.5c
  828. X
  829. X{
  830. X//2.4c
  831. XB:: @Box margin { 0c } linestyle { noline } @Code "@AlignList"
  832. X//0.2c
  833. X@Box {
  834. X   @Line linestyle { dashed } from { xmark ysize } to { xmark 0 }
  835. X   {
  836. X         @Eq { f(x) ^= g(x) + 2 }
  837. X    /1vx @Eq { f(x) - g(x) ^= 2 }
  838. X    /1vx @Code "..."
  839. X    /1vx @Code "@EndAlignList"
  840. X   }
  841. X}
  842. X
  843. X}
  844. X
  845. X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
  846. X}
  847. XThe @Code "@AlignList" galley does not flush, because its first
  848. Xcomponent is connected to a receptive symbol by @Code "/" operators.
  849. X@PP
  850. XAfter the last equation, an empty forcing galley is sent to
  851. X{@Code "@EndAlignList"}, deleting the two remaining receptive symbols from
  852. Xthe @Code "@AlignList" galley and permitting it to flush.  @Eq { FOLLOWS }
  853. Xindexes ensure that each equation finds a target placed in the body text
  854. Xjust after its point of invocation, so the equations return, aligned, to
  855. Xapproximately the points where they were invoked.  Notice that the flushing
  856. Xof body text is suspended until the list of equations is completed, as it
  857. Xmust be, since the horizontal position of the first equation cannot
  858. Xbe known until the last equation is added to the list.
  859. X@PP
  860. XLayout quality can occasionally be improved by rejecting a component
  861. Xthat could be promoted -- for example, a component of body text that
  862. Xcarries a footnote too large to fit on the current page.  Since Lout
  863. Xdoes not specify how breaking decisions are made, beyond the basic
  864. Xconstraints imposed by available space and @Code into clauses, in
  865. Xprinciple such high quality breaking could be added to the
  866. Ximplementation with no change to the language.  However, the
  867. Xgenerality of the galley flushing algorithm, and its already
  868. Xconsiderable complexity, make this a daunting problem in practice,
  869. Xalthough a fascinating one.  @TeX [9], with its unnested
  870. Xset of `floating insertions' clearly identifiable as each page is begun,
  871. Xhas the advantage in this respect.
  872. X@End @SubSection
  873. END_OF_FILE
  874.   if test 14105 -ne `wc -c <'doc/tr.impl/s5.2'`; then
  875.     echo shar: \"'doc/tr.impl/s5.2'\" unpacked with wrong size!
  876.   fi
  877.   # end of 'doc/tr.impl/s5.2'
  878. fi
  879. if test -f 'doc/tr.impl/setup' -a "${1}" != "-c" ; then 
  880.   echo shar: Will not clobber existing file \"'doc/tr.impl/setup'\"
  881. else
  882.   echo shar: Extracting \"'doc/tr.impl/setup'\" \(13290 characters\)
  883.   sed "s/^X//" >'doc/tr.impl/setup' <<'END_OF_FILE'
  884. X
  885. X######################################################
  886. X#                                                    #
  887. X#  Lout setup file for design and imp. paper         #
  888. X#                                                    #
  889. X#  Jeffrey H. Kingston                               #
  890. X#  13 January 1992                                   #
  891. X#                                                    #
  892. X######################################################
  893. X
  894. X@SysInclude { ft  }
  895. X@SysInclude { dl  }
  896. X@SysInclude { tab }
  897. X@SysInclude { eq  }
  898. X@SysInclude { pas }
  899. X@SysInclude { fig }
  900. X
  901. Xdef @TeX { T{ /0.2fo E}X }
  902. X
  903. Xdef @Code
  904. X    right x
  905. X{   { Helvetica Base -1p } @Font lines @Break x
  906. X}
  907. X
  908. X######################################################
  909. X#                                                    #
  910. X#  Nodes and trees.                                  #
  911. X#                                                    #
  912. X######################################################
  913. X
  914. Ximport @Fig
  915. Xdef @FBox
  916. X    named width  { 0.6c }
  917. X    named height { 0.4c }
  918. X    named margin { 0.1c }
  919. X    right x
  920. X{
  921. X    @Box margin { margin }
  922. X    {    width @Wide height @High
  923. X    { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
  924. X    }
  925. X    }
  926. X}
  927. X
  928. Ximport @Fig
  929. Xdef @FEllipse
  930. X    named width  { 0.6c }
  931. X    named height { 0.4c }
  932. X    named margin { 0.1c }
  933. X    right x
  934. X{
  935. X    @Ellipse margin { margin }
  936. X    {    height @High
  937. X    { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
  938. X    }
  939. X    }
  940. X}
  941. X
  942. Ximport @Fig
  943. Xdef @FCircle
  944. X    named width  { 0.4c }
  945. X    named height { 0.4c }
  946. X    named margin { 0.1c }
  947. X    right x
  948. X{
  949. X    @Circle margin { margin }
  950. X    {    width @Wide height @High
  951. X    { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
  952. X    }
  953. X    }
  954. X}
  955. X
  956. Ximport @Fig
  957. Xdef @JoinFigures
  958. X    left A
  959. X    named linestyle  { solid   }
  960. X    named linewidth  { 0.5 pt  }
  961. X    named linecap    { round   }
  962. X    named dashlength { 0.15 cm }
  963. X    named arrow      { noarrow }
  964. X    named headstyle  { open    }
  965. X    named headwidth  { 0.05 cm }
  966. X    named headlength { 0.15 cm }
  967. X    right B
  968. X{
  969. X    @Line
  970. X    from       { {A"@CTR"} ++ {{A"@CTR"} @Angle {B"@CTR"} A"@CIRCUM"} }
  971. X    to         { {B"@CTR"} ++ {{B"@CTR"} @Angle {A"@CTR"} B"@CIRCUM"} }
  972. X    linestyle  { linestyle  }
  973. X    linewidth  { linewidth  }
  974. X    linecap    { linecap    }
  975. X    dashlength { dashlength }
  976. X    arrow      { arrow      }
  977. X    headstyle  { headstyle  }
  978. X    headwidth  { headwidth  }
  979. X    headlength { headlength }
  980. X    {}
  981. X}
  982. X
  983. Ximport @Fig
  984. Xexport @LeftSub @RightSub @FirstSub @NextSub @StubSub @Node
  985. Xdef @Tree
  986. X    named hmargin    { 0.2c    }
  987. X    named vmargin    { 0.3c    }
  988. X    named linestyle  { solid   }
  989. X    named linewidth  { 0.5 pt  }
  990. X    named linecap    { round   }
  991. X    named dashlength { 0.15 cm }
  992. X    named arrow      { noarrow }
  993. X    named headstyle  { open    }
  994. X    named headwidth  { 0.05 cm }
  995. X    named headlength { 0.15 cm }
  996. X    body x
  997. X@Begin
  998. X
  999. X    def @LeftSub
  1000. X    precedence 90
  1001. X    associativity left
  1002. X    left root
  1003. X    named hmargin    { hmargin    }
  1004. X    named linestyle  { linestyle  }
  1005. X    named linewidth  { linewidth  }
  1006. X    named linecap    { linecap    }
  1007. X    named dashlength { dashlength }
  1008. X    named arrow      { arrow      }
  1009. X    named headstyle  { headstyle  }
  1010. X    named headwidth  { headwidth  }
  1011. X    named headlength { headlength }
  1012. X    right x
  1013. X    {
  1014. X    { /vmargin {L::x} } |hmargin  root |
  1015. X    L@T @JoinFigures
  1016. X            linestyle  { linestyle  }
  1017. X            linewidth  { linewidth  }
  1018. X            linecap    { linecap    }
  1019. X            dashlength { dashlength }
  1020. X            arrow      { arrow      }
  1021. X            headstyle  { headstyle  }
  1022. X            headwidth  { headwidth  }
  1023. X            headlength { headlength }
  1024. X    T
  1025. X    }
  1026. X
  1027. X    def fixroot
  1028. X    precedence 90
  1029. X    left root
  1030. X    {
  1031. X    |0.5rt root
  1032. X    }
  1033. X
  1034. X    def firstsub
  1035. X    precedence 90
  1036. X    associativity left
  1037. X    named hmargin    { hmargin    }
  1038. X    named linestyle  { linestyle  }
  1039. X    named linewidth  { linewidth  }
  1040. X    named linecap    { linecap    }
  1041. X    named dashlength { dashlength }
  1042. X    named arrow      { arrow      }
  1043. X    named headstyle  { headstyle  }
  1044. X    named headwidth  { headwidth  }
  1045. X    named headlength { headlength }
  1046. X    right x
  1047. X    {
  1048. X    S::x &
  1049. X    S@T @JoinFigures
  1050. X        linestyle  { linestyle  }
  1051. X        linewidth  { linewidth  }
  1052. X        linecap    { linecap    }
  1053. X        dashlength { dashlength }
  1054. X        arrow      { arrow      }
  1055. X        headstyle  { headstyle  }
  1056. X        headwidth  { headwidth  }
  1057. X        headlength { headlength }
  1058. X    T
  1059. X    }
  1060. X
  1061. X    macro @FirstSub { fixroot //vmargin |0.5rt firstsub }
  1062. X
  1063. X    def @NextSub
  1064. X    precedence 90
  1065. X    associativity left
  1066. X    left others
  1067. X    named hmargin    { hmargin    }
  1068. X    named linestyle  { linestyle  }
  1069. X    named linewidth  { linewidth  }
  1070. X    named linecap    { linecap    }
  1071. X    named dashlength { dashlength }
  1072. X    named arrow      { arrow      }
  1073. X    named headstyle  { headstyle  }
  1074. X    named headwidth  { headwidth  }
  1075. X    named headlength { headlength }
  1076. X    right x
  1077. X    {
  1078. X    others &hmargin S::x &
  1079. X    S@T @JoinFigures
  1080. X        linestyle  { linestyle  }
  1081. X        linewidth  { linewidth  }
  1082. X        linecap    { linecap    }
  1083. X        dashlength { dashlength }
  1084. X        arrow      { arrow      }
  1085. X        headstyle  { headstyle  }
  1086. X        headwidth  { headwidth  }
  1087. X        headlength { headlength }
  1088. X    T
  1089. X    }
  1090. X
  1091. X    def @RightSub
  1092. X    precedence 90
  1093. X    associativity left
  1094. X    left root
  1095. X    named hmargin    { hmargin    }
  1096. X    named linestyle  { linestyle  }
  1097. X    named linewidth  { linewidth  }
  1098. X    named linecap    { linecap    }
  1099. X    named dashlength { dashlength }
  1100. X    named arrow      { arrow      }
  1101. X    named headstyle  { headstyle  }
  1102. X    named headwidth  { headwidth  }
  1103. X    named headlength { headlength }
  1104. X    right x
  1105. X    {
  1106. X    root |hmargin  { /vmargin {R::x} } |
  1107. X    R@T @JoinFigures
  1108. X        linestyle  { linestyle  }
  1109. X        linewidth  { linewidth  }
  1110. X        linecap    { linecap    }
  1111. X        dashlength { dashlength }
  1112. X        arrow      { arrow      }
  1113. X        headstyle  { headstyle  }
  1114. X        headwidth  { headwidth  }
  1115. X        headlength { headlength }
  1116. X    T
  1117. X    }
  1118. X
  1119. X    def @StubSub
  1120. X    precedence 90
  1121. X    associativity left
  1122. X    left root
  1123. X    named linestyle  { linestyle  }
  1124. X    named linewidth  { linewidth  }
  1125. X    named linecap    { linecap    }
  1126. X    named dashlength { dashlength }
  1127. X    {
  1128. X    root |
  1129. X    @Figure
  1130. X        shape { T@SW
  1131. X            T@W -- { 0.1 cm 0.7 cm }
  1132. X            T@E -- {-0.1 cm 0.7 cm }
  1133. X            T@SE
  1134. X          }
  1135. X        linestyle  { linestyle  }
  1136. X        linewidth  { linewidth  }
  1137. X        linecap    { linecap    }
  1138. X        dashlength { dashlength }
  1139. X    { @Null }
  1140. X    }
  1141. X
  1142. X    def @Node
  1143. X    # named mark {}
  1144. X    right root
  1145. X    {
  1146. X    T:: root
  1147. X    # & T@W ++ { -0.2 cm 0.1 cm } @BaseOf mark
  1148. X    }
  1149. X
  1150. X    @OneCol @OneRow x
  1151. X
  1152. X@End @Tree
  1153. X
  1154. X
  1155. Xdef @ShowMarks
  1156. X    named linewidth  { 0.015 cm }
  1157. X    named linestyle  { dashed   }
  1158. X    named dashlength { 0.15 cm  }
  1159. X    named paint      { light    }
  1160. X    named marks      { both     } # none, horizontal, vertical, or both
  1161. X    right x
  1162. X{
  1163. X    @Fig
  1164. X    {    @Box margin { 0c } linewidth { linewidth } paint { paint }
  1165. X    {   @Figure
  1166. X        shape {
  1167. X            marks @Case {
  1168. X                { horizontal both } @Yield
  1169. X                { -0.3 cm ymark {xsize ymark} ++ {0.3 cm 0} }
  1170. X                else @Yield {}
  1171. X            }
  1172. X            marks @Case {
  1173. X            both @Yield []
  1174. X            else @Yield {}
  1175. X            }
  1176. X            marks @Case {
  1177. X            { vertical both } @Yield
  1178. X                { xmark -0.3 cm {xmark ysize} ++ {0 0.3 cm} }
  1179. X            else @Yield {}
  1180. X            }
  1181. X        }
  1182. X        linewidth { linewidth }
  1183. X        linestyle { linestyle }
  1184. X        dashlength { dashlength }
  1185. X          x
  1186. X    }
  1187. X    }
  1188. X}
  1189. X
  1190. X   import @Fig
  1191. X   def @DagBox
  1192. X      named top {}
  1193. X      named mid {}
  1194. X      named base {}
  1195. X   {
  1196. X      @OneRow {
  1197. X       TOP::  @FBox top
  1198. X    // MID::  @FBox mid
  1199. X    // BASE:: @FBox base
  1200. X      }
  1201. X   }
  1202. X
  1203. X   import @Fig
  1204. X   def @BlackDot
  1205. X      named diameter { 0.07c }
  1206. X   {
  1207. X      @Circle
  1208. X    margin { 0c }
  1209. X    paint { black }
  1210. X      { diameter @Wide diameter @High {}
  1211. X      }
  1212. X   }
  1213. X
  1214. X   import @Fig
  1215. X   def @TVShape   # television shape enclosing points ne, nw, se, sw
  1216. X       named nw {}
  1217. X       named ne {}
  1218. X       named sw {}
  1219. X       named se {}
  1220. X       named delta { 0.5 cm }
  1221. X   {
  1222. X       @Figure
  1223. X       shape {
  1224. X        { {nw @Min sw @Min ne @Min se} -- { delta 0 } } @Label BL
  1225. X        { {nw @Max sw @Max ne @Max se} ++ { delta 0 } } @Label TR
  1226. X        BL ++ { 0 BL @YDistance TR } @Label TL
  1227. X        BL ++ { BL @XDistance TR 0 } @Label BR
  1228. X        BL
  1229. X        BR            [ BR ++ {0 delta} ]
  1230. X        BR ++ {delta delta}
  1231. X        TR ++ {delta -delta}    [ TR -- {0 delta} ]
  1232. X        TR
  1233. X        TL            [ TL -- {0 delta} ]
  1234. X        TL -- {delta delta}
  1235. X        BL ++ {-delta delta}    [ BL ++ {0 delta} ]
  1236. X        BL
  1237. X       }
  1238. X       {}
  1239. X   }
  1240. X
  1241. X   import @Fig
  1242. X   def @FunnyArrow
  1243. X      named from {}
  1244. X      named to {}
  1245. X      named arrow { forward }
  1246. X   {
  1247. X      @Figure
  1248. X         shape {from from ++ {0 from @YDistance to} to}
  1249. X         arrow { arrow }
  1250. X      {}
  1251. X   }
  1252. X
  1253. X   def "->" { {Symbol Base} @Font "\256" } #174 decimal
  1254. X   def "=>" { {Symbol Base} @Font "\336" } #222 decimal
  1255. X   macro @JP    { /0.5v  }
  1256. X
  1257. X   ###################################################
  1258. X   #                                                 #
  1259. X   #  Lout keywords.                                 #
  1260. X   #                                                 #
  1261. X   ###################################################
  1262. X
  1263. X   def @@Begin         { @Code "@Begin"        }
  1264. X   def @@Break         { @Code "@Break"        }
  1265. X   def @@Case          { @Code "@Case"         }
  1266. X   def @@Database      { @Code "@Database"     }
  1267. X   def @@End           { @Code "@End"          }
  1268. X   def @@Font          { @Code "@Font"         }
  1269. X   def @@Galley        { @Code "@Galley"       }
  1270. X   def @@Graphic       { @Code "@Graphic"      }
  1271. X   def @@HExpand       { @Code "@HExpand"      }
  1272. X   def @@HScale        { @Code "@HScale"       }
  1273. X   def @@High          { @Code "@High"         }
  1274. X   def @@Include       { @Code "@Include"      }
  1275. X   def @@Key           { @Code "@Key"          }
  1276. X   def @@LClos         { @Code "@LClos"        }
  1277. X   def @@LEnv          { @Code "@LEnv"         }
  1278. X   def @@LInput        { @Code "@LInput"       }
  1279. X   def @@Moment        { @Code "@Moment"       }
  1280. X   def @@Next          { @Code "@Next"         }
  1281. X   def @@Null          { @Code "@Null"         }
  1282. X   def @@OneCol        { @Code "@OneCol"       }
  1283. X   def @@OneRow        { @Code "@OneRow"       }
  1284. X   def @@Open          { @Code "@Open"         }
  1285. X   def @@Prepend       { @Code "@Prepend"      }
  1286. X   def @@Rotate        { @Code "@Rotate"       }
  1287. X   def @@Space         { @Code "@Space"        }
  1288. X   def @@SysDatabase   { @Code "@SysDatabase"  }
  1289. X   def @@SysInclude    { @Code "@SysInclude"   }
  1290. X   def @@SysPrepend    { @Code "@SysPrepend"   }
  1291. X   def @@Tag           { @Code "@Tag"          }
  1292. X   def @@Tagged        { @Code "@Tagged"       }
  1293. X   def @@Use           { @Code "@Use"          }
  1294. X   def @@VExpand       { @Code "@VExpand"      }
  1295. X   def @@VScale        { @Code "@VScale"       }
  1296. X   def @@Yield         { @Code "@Yield"        }
  1297. X   def @@Wide          { @Code "@Wide"         }
  1298. X
  1299. X
  1300. X   ###################################################
  1301. X   #                                                 #
  1302. X   #  Miscellaneous, mostly graphical definitions.   #
  1303. X   #                                                 #
  1304. X   ###################################################
  1305. X
  1306. X   def @Leaders
  1307. X   { ..   @Leaders
  1308. X   }
  1309. X
  1310. X   def @HLine {
  1311. X     { 0 0 moveto xsize 0 lineto stroke }
  1312. X     @Graphic {}
  1313. X   }
  1314. X
  1315. X   def @VDashLine
  1316. X      right length
  1317. X   {
  1318. X      length @High
  1319. X      { 0 0 moveto 0 ysize lineto [ 3 pt ] 0 setdash stroke }
  1320. X      @Graphic {}
  1321. X   }
  1322. X
  1323. X   def @LBox
  1324. X      right offset
  1325. X   {  @OneCol @OneRow
  1326. X      {
  1327. X        {  //0.2c
  1328. X           0.6c @High 1.2c @Wide
  1329. X           { 0 0 moveto xsize 0 lineto
  1330. X         xsize ysize lineto 0 ysize lineto closepath
  1331. X         gsave 0.9 setgray fill grestore stroke }
  1332. X           @Graphic {}
  1333. X        }
  1334. X        ||offset @VDashLine 1c
  1335. X      }
  1336. X   }
  1337. X
  1338. X   def @Arrow
  1339. X      right length
  1340. X   {  @OneCol @OneRow
  1341. X      {
  1342. X       30d @Rotate {0.12c @Wide @HLine}
  1343. X       //
  1344. X       length @Wide @HLine
  1345. X       //
  1346. X       "-30d" @Rotate {0.12c @Wide @HLine}
  1347. X      }
  1348. X   }
  1349. X
  1350. X   def @DoubleArrow
  1351. X      right length
  1352. X   {  @OneCol @OneRow
  1353. X      { 
  1354. X         & 180d @Rotate @Arrow length
  1355. X         |0io @Arrow length
  1356. X      }
  1357. X   }
  1358. X
  1359. X   def @Put
  1360. X     left coord
  1361. X     right x
  1362. X   { @OneCol @OneRow
  1363. X     { coord / | @OneCol @OneRow x
  1364. X     }
  1365. X   }
  1366. X   
  1367. X   macro @At { //0io }
  1368. X
  1369. X
  1370. X   ###################################################
  1371. X   #                                                 #
  1372. X   #  Interpolated example documents.                #
  1373. X   #                                                 #
  1374. X   ###################################################
  1375. X
  1376. X   def @LittleEndRunPlace { @Galley }
  1377. X   def @LittleEndRun
  1378. X      force into { @LittleEndRunPlace&&preceding }
  1379. X   {}
  1380. X
  1381. X   def @LittleTextPlace { @Galley }
  1382. X   def @LittleText into { @LittleTextPlace&&preceding }
  1383. X      right x
  1384. X   { x
  1385. X   }
  1386. X
  1387. X   def @LittleFootPlace { @Galley }
  1388. X   def @LittleFootNote into { @LittleFootPlace&&following }
  1389. X      right x
  1390. X   { x
  1391. X   }
  1392. X
  1393. X   def @LittlePageColumn
  1394. X      right x
  1395. X   {
  1396. X        9px @Break 8p @Font
  1397. X        2.8c @Wide x
  1398. X   }
  1399. X
  1400. X   def @LittlePage
  1401. X      right x
  1402. X   {
  1403. X      @HContract @VContract
  1404. X      { 0 0 moveto xsize 0 lineto xsize ysize lineto
  1405. X    0 ysize lineto closepath stroke } @Graphic
  1406. X      {  //0.3c ||0.3c
  1407. X         9px @Break 8p @Font
  1408. X         2.8c @Wide 3.8c @High x
  1409. X         ||0.3c //0.3c
  1410. X      }
  1411. X   }
  1412. X
  1413. X   def @LittleFootSect
  1414. X   {  1c @Wide @HLine
  1415. X      //0.3v @LittleFootPlace ||0.5c
  1416. X   }
  1417. X
  1418. X   def @LittlePageList
  1419. X     right @PageNum
  1420. X   {
  1421. X      @LittlePage { # |0.5rt @PageNum //0.8v
  1422. X        //0.3v @LittleTextPlace
  1423. X        //1rt @LittleFootSect
  1424. X         }
  1425. X      //
  1426. X      @LittlePageList @Next @PageNum
  1427. X   }
  1428. X
  1429. X   def @LittleDocument
  1430. X   {  @LittlePage
  1431. X      {  @LittleTextPlace
  1432. X         //1rt @LittleFootSect
  1433. X      }
  1434. X      // @LittlePageList 2
  1435. X      // @LittleEndRunPlace
  1436. X   }
  1437. X        
  1438. X   def @Strange
  1439. X       named @Format right @Val { [@Val] }
  1440. X       right x
  1441. X   {   @Format x
  1442. X   }
  1443. X
  1444. X
  1445. X@Use { @DocumentLayout
  1446. X    @MinorHeadingFont { Slope }
  1447. X}
  1448. X
  1449. X@Database @Reference { oldrefs }
  1450. END_OF_FILE
  1451.   if test 13290 -ne `wc -c <'doc/tr.impl/setup'`; then
  1452.     echo shar: \"'doc/tr.impl/setup'\" unpacked with wrong size!
  1453.   fi
  1454.   # end of 'doc/tr.impl/setup'
  1455. fi
  1456. if test -f 'doc/tr.lout/ch3.02' -a "${1}" != "-c" ; then 
  1457.   echo shar: Will not clobber existing file \"'doc/tr.lout/ch3.02'\"
  1458. else
  1459.   echo shar: Extracting \"'doc/tr.lout/ch3.02'\" \(12218 characters\)
  1460.   sed "s/^X//" >'doc/tr.lout/ch3.02' <<'END_OF_FILE'
  1461. X@Section
  1462. X   @Title { Concatenation symbols and paragraphs }
  1463. X   @Tag { concatenation }
  1464. X@Begin
  1465. X@PP
  1466. XThere are ten concatenation symbols, in three families:
  1467. Xconcatenation. @Index { Concatenation symbols }
  1468. X@ID @Tab
  1469. X   vmargin { 0.5vx }
  1470. X   @Fmta { @Col @Code A ! @Col @Code B ! @Col @Code C ! @Col @Code D ! @Col E }
  1471. X{
  1472. X@Rowa A { "/" } B { "^/" } C { "//" } D { "^//" } E { Vertical concatenation }
  1473. X@Rowa A { "|" } B { "^|" } C { "||" } D { "^||" } E { Horizontal concatenation }
  1474. X@Rowa A { "&" } B { "^&" } C {      } D {       } E {In-paragraph concatenation}
  1475. X}
  1476. XEach symbol produces an object which combines together the two
  1477. Xparameters.  The right parameter must be separated from the symbol by at
  1478. Xleast one white space character.
  1479. X@PP
  1480. XThe vertical concatenation symbol @Code "/" places its left parameter
  1481. Xvertical.concatenation @Index { Vertical concatenation }
  1482. Xabove its right parameter with their column marks aligned.  If one
  1483. Xparameter has more column marks than the other, empty columns are
  1484. Xinserted at the right to equalize the numbers.  The variant @Code "//"
  1485. Xignores column marks and left-justifies the objects.
  1486. X@PP
  1487. XThe horizontal concatenation symbols @Code "|" and @Code "||" are horizontal
  1488. Xhorizontal.concatenation @Index { Horizontal concatenation }
  1489. Xanalogues of @Code "/" and {@Code "//"}:  they place their two parameters side
  1490. Xby side, with row mark alignment or top-justification respectively.  The
  1491. Xin.paragraph.concatenation @Index { In-paragraph concatenation }
  1492. Xin-paragraph concatenation symbol @Code "&" produces horizontal concatenation
  1493. Xwithin a paragraph; its special properties are treated in detail at the
  1494. Xend of this section.
  1495. X@PP
  1496. XThe concatenation symbols in any one family are {@I{mutually associative}},
  1497. Xwhich means that
  1498. X@ID {
  1499. X@Code "{"  @I x  {@Code "|"}{@I p}  @I y  @Code "}"  {@Code "|"}{@I q}  @I z
  1500. X}
  1501. Xis always the same as
  1502. X@ID {
  1503. X@I x  {@Code "|"}{@I p}  @Code "{"  @I y  {@Code "|"}{@I q}  @I z  @Code "}"
  1504. X}
  1505. Xfor any objects {@I x}, {@I y}, and {@I z}, any gaps @I p and @I q (defined
  1506. Xbelow), and any choice of {@Code "|"}, {@Code "^|"}, {@Code "||"}, and
  1507. X{@Code "^||"}.  In practice we always omit such braces, since they are
  1508. Xredundant and can be misleading.  The result of the complete sequence of
  1509. Xconcatenations will be called the {@I{whole concatenation object}}, and
  1510. Xthe objects which make it up will be called the {@I components}.
  1511. X@PP
  1512. XOne mark is designated as the {@I {principal mark}}, usually the mark of
  1513. Xprincipal.mark @Index { Principal mark }
  1514. Xthe first component.  A later mark can be chosen for this honour by
  1515. Xattaching {@Code "^"} to the preceding concatenation symbol.  See Section
  1516. X{@NumberOf onerow} for examples.
  1517. X@PP
  1518. XA {@I gap},
  1519. Xgap @Index Gap
  1520. Xspecifying the distance between the two
  1521. Xparameters, may follow any concatenation symbol.  There may be no spaces
  1522. Xbetween a concatenation symbol and its gap.  A missing gap is taken
  1523. Xto be {@Code 0ie}.  The gap is effectively a third parameter of the
  1524. Xconcatenation symbol, and it may be an arbitrary object provided that it
  1525. Xevaluates to a juxtaposition of simple words.  In general, the gap must
  1526. Xbe enclosed in braces, like this:
  1527. X@ID @Code {
  1528. X"//{  @Style&&mystyle @Open { @TopMargin }  }"
  1529. X}
  1530. Xbut the braces may be omitted when the object is a juxtaposition of
  1531. Xsimple words or an invocation of a symbol without parameters, as in
  1532. X@Code "//0.3vx" and {@Code "||@Indent"}.
  1533. X@PP
  1534. XA gap consists of a length plus a gap mode.  A @I length
  1535. Xlength @Index { Length }
  1536. Xis represented by an decimal number (which may not be negative) followed
  1537. Xby a unit of measurement.  For example, @Code "2.5c" represents the
  1538. Xlength 2.5 centimetres.  Figure {@NumberOf units} gives the full selection
  1539. Xof units of measurement.
  1540. Xc.unit @Index { @Code c unit }
  1541. Xp.unit @Index { @Code p unit }
  1542. Xm.unit @Index { @Code m unit }
  1543. Xf.unit @Index { @Code f unit }
  1544. Xs.unit @Index { @Code s unit }
  1545. Xv.unit @Index { @Code v unit }
  1546. Xw.unit @Index { @Code w unit }
  1547. Xb.unit @Index { @Code b unit }
  1548. Xr.unit @Index { @Code r unit }
  1549. Xd.unit @Index { @Code d unit }
  1550. X
  1551. X@BeginFigures
  1552. X@Figure
  1553. X   @Caption { The eleven units of measurement provided by Lout. }
  1554. X   @Tag { units }
  1555. X@Begin
  1556. X   @Tab
  1557. X      vmargin { 0.3v }
  1558. X      side { yes }
  1559. X      @Fmta { @Col @Code A ! @Col B }
  1560. X   {
  1561. X      @Rowa above { yes } A { c } B { Centimetres. }
  1562. X      @Rowa A { i } B { Inches.
  1563. X}
  1564. X      @Rowa A { p } B { Points ({@Code 72p} = {@Code 1i}).
  1565. X}
  1566. X      @Rowa A { m } B { Ems ({@Code 12m} = {@Code 1i}).
  1567. X}
  1568. X      @Rowa A { f } B {
  1569. XOne @Code f equals the size of the current font, as specified by
  1570. Xthe @@Font symbol (Section {@NumberOf font}).  This unit is
  1571. Xappropriate for lengths that should change with the font size.
  1572. X}
  1573. X      @Rowa A { s } B {
  1574. XOne @Code s equals the preferred gap between two words in the
  1575. Xcurrent font, as specified in the definition of the font, or by the
  1576. X@@Space symbol (Section {@NumberOf break}).
  1577. X}
  1578. X      @Rowa A { v } B {
  1579. XOne @Code v equals the current gap between lines introduced during
  1580. Xparagraph breaking, as specified by the @@Break symbol (Section
  1581. X{@NumberOf break}).  This unit is appropriate for lengths, such as the
  1582. Xspaces between paragraphs, which should change with the inter-line gap.
  1583. X}
  1584. X      @Rowa A { w } B {
  1585. XOne @Code w equals the width of the following component, or its height if the
  1586. Xsymbol is vertical concatenation.
  1587. X}
  1588. X      @Rowa A { b } B {
  1589. XOne @Code b equals the width of the whole concatenation object,
  1590. Xor its height if the symbol is vertical concatenation.
  1591. X}
  1592. X      @Rowa A { r } B {
  1593. XOne @Code r equals one @Code b minus one {@Code w}.  This unit is used
  1594. Xfor centring and right justification.
  1595. X}
  1596. X      @Rowa below { yes } A { d } B {
  1597. XDegrees.  This unit may only be used with the @Code "@Rotate" symbol.
  1598. X}
  1599. X   }
  1600. X@End @Figure
  1601. X
  1602. X@PP
  1603. XA gap concludes with a {@I {gap mode}},
  1604. Xgap.mode @Index { Gap mode }
  1605. Xwhich is a single letter following the length, indicating how the length
  1606. Xis to be measured.  As shown in Figure {@NumberOf gapmodes},
  1607. X
  1608. X@Figure
  1609. X   @Tag { gapmodes }
  1610. X   @Caption { The six gap modes provided by Lout. }
  1611. X@Begin
  1612. X@Fig {
  1613. X{ /2.5vx Edge-to-edge |0.3i   {@Code "|"} &1p {@I l} &1p {@Code e}
  1614. X  /4vx Hyphenation    |0.3i   {@Code "|"} &1p {@I l} &1p {@Code h}
  1615. X  /4vx Overstrike     |0.3i   {@Code "|"} &1p {@I l} &1p {@Code o}
  1616. X  /4vx Mark-to-mark   |0.3i   {@Code "|"} &1p {@I l} &1p {@Code x}
  1617. X  /4vx Kerning        |0.3i   {@Code "|"} &1p {@I l} &1p {@Code k}
  1618. X  /4vx Tabulation     |0.3i   {@Code "|"} &1p {@I l} &1p {@Code t}
  1619. X}
  1620. X||0.5i
  1621. X@Box margin { 0c } 6c @Wide 13.2c @High 9p @Font
  1622. X{
  1623. X  @OneRow {
  1624. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1625. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1626. X     @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
  1627. X     @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } }
  1628. X  }
  1629. X  //4vx
  1630. X  @OneRow {
  1631. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1632. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1633. X     @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
  1634. X     @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } }
  1635. X  }
  1636. X  //4vx
  1637. X  @OneRow {
  1638. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1639. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1640. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  1641. X     @At { 1.2c @Wide 1.7c @High } @Put { 3.3c @Wide { &0.5rt @I l } }
  1642. X  }
  1643. X  //4vx
  1644. X  @OneRow {
  1645. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1646. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1647. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  1648. X     @At { 1.2c @Wide 1.7c @High }
  1649. X    @Put 3.3c @Wide { |0.5rt { max( {@I {l, a+b}}) } }
  1650. X     @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
  1651. X     @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
  1652. X     @At { 4c   @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
  1653. X     @At { 4c   @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
  1654. X  }
  1655. X  //4vx
  1656. X  @OneRow {
  1657. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1658. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1659. X     @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
  1660. X     @At { 1.2c @Wide 1.7c @High }
  1661. X    @Put { 3.3c @Wide { |0.5rt max( {@I {l, a, b}})}}
  1662. X     @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
  1663. X     @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
  1664. X     @At { 4c   @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
  1665. X     @At { 4c   @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
  1666. X  }
  1667. X  //4vx
  1668. X  @OneRow {
  1669. X     @At { 1c   @Wide 0.5c @High } @Put { @LBox 0.2co }
  1670. X     @At { 4c   @Wide 0.5c @High } @Put { @LBox 0.5co }
  1671. X     @At { 0.0c @Wide 1.6c @High } @Put { @DoubleArrow 4.0c }
  1672. X     @At { 2.8c @Wide 1.8c @High } @Put { @I l }
  1673. X  }
  1674. X  //5vx
  1675. X  @DoubleArrow 6c
  1676. X  //0.1c |0.5rt @I { current bound }
  1677. X}
  1678. X
  1679. X}
  1680. X@End @Figure
  1681. X@EndFigures
  1682. Xwith edge-to-edge gap mode
  1683. Xedge.to.edge @Index { Edge-to-edge gap mode }
  1684. Xe.gap.mode @Index { @Code e gap mode }
  1685. Xthe length @I l is measured from the trailing edge
  1686. Xof the first object to the leading edge of the second.  Edge-to-edge is the
  1687. Xdefault mode:  the @Code e may be omitted.  Hyphenation gap mode is
  1688. Xhyphenation.gap @Index { Hyphenation gap mode }
  1689. Xh.gap.mode @Index { @Code h gap mode }
  1690. Xsimilar, except as explained at the end of this section.
  1691. X@PP
  1692. XMark-to-mark,
  1693. Xmark.to.mark @Index { Mark-to-mark gap mode }
  1694. Xx.gap.mode @Index { @Code x gap mode }
  1695. Xoverstrike,
  1696. Xoverstrike @Index { Overstrike gap mode }
  1697. Xo.gap.mode @Index { @Code o gap mode }
  1698. Xand kerning
  1699. Xkerning @Index { Kerning gap mode }
  1700. Xk.gap.mode @Index { @Code k gap mode }
  1701. Xmeasure the length from the last mark
  1702. Xof the first object to the first mark of the second.  In the case of
  1703. Xmark-to-mark, if the length is too small to prevent the objects
  1704. Xoverlapping, it is widened until they no longer do.  Kerning also
  1705. Xwidens, with the aim of preventing the mark of either object from
  1706. Xoverlapping the other object; this mode is used for subscripts and
  1707. Xsuperscripts.
  1708. X@PP
  1709. Xtabulation @Index { Tabulation gap mode }
  1710. Xt.gap.mode @Index { @Code t gap mode }
  1711. Xcentring @Index { Centring }
  1712. Xright.justif @Index { Right justification }
  1713. XTabulation ignores the first object and places the leading edge of the
  1714. Xsecond object at a distance @I l from the left edge of the whole
  1715. Xconcatenation object.  It is the main user of the @Code b and @Code r
  1716. Xunits of measurement; for example, @Code "|1rt" will right-justify the
  1717. Xfollowing component, and @Code "|0.5rt" will centre it.
  1718. X@PP
  1719. XWhen two objects are separated only by zero or more white space
  1720. Xwhite.space.when @SubIndex { when significant }
  1721. Xspace.f.when @SubIndex { when significant }
  1722. Xcharacters (spaces, tabs, and newlines), Lout inserts
  1723. X{@Code "&"}{@I k}{@Code "s"} between the two objects, where @I k is the
  1724. Xnumber of spaces.  Precisely, @I k is determined by discarding all space
  1725. Xcharacters and tabs that precede newlines (these are invisible so are
  1726. Xbetter ignored), then counting 1 for each newline or space, and 8 for
  1727. Xeach tab character.
  1728. X@PP
  1729. XA sequence of two or more objects separated by @Code "&" symbols is a
  1730. Xparagraph.breaking.in.detail @SubIndex { in detail }
  1731. X{@I paragraph}.  Lout breaks paragraphs into lines automatically as
  1732. Xrequired, by converting some of the @Code "&" symbols into
  1733. X{@Code "//1vx"}.  Gaps of length 0 (other than hyphenation gaps) are not
  1734. Xeligible for this conversion.  `Optimal' line breaks are chosen, using a
  1735. Xmethod adapted from @TeX [{@Ref knuth84}].
  1736. Xtex @RawIndex { @TeX }
  1737. Xtex.optimal @SubIndex { optimal paragraph breaking }
  1738. X@PP
  1739. XIf an @Code "&" symbol whose gap has hyphenation mode
  1740. Xhyphenation @Index { Hyphenation gap mode }
  1741. Xtex.hyphenation @SubIndex { hyphenation }
  1742. Xis chosen for replacement by {@Code "//1vx"}, a hyphen will be appended to
  1743. Xthe preceding object, unless that object is a word which already ends with
  1744. Xa hyphen.  For example,
  1745. X@ID @Code {
  1746. XLong words may be "hyph &0ih enat &0ih ed."
  1747. X}
  1748. Xcould have the following result, depending where the line breaks fall:
  1749. X@ID 2i @Wide {
  1750. XLong words may be hyph &0ih enat &0ih ed.
  1751. X}
  1752. XBasser Lout inserts hyphenation gaps automatically as required, again
  1753. Xfollowing the method of @TeX, which approximates the hyphenations in
  1754. XWebster's dictionary.  To prevent the hyphenation of a single word,
  1755. Xenclose it in quotes.  Further control over paragraph breaking and
  1756. Xhyphenation is provided by the @@Break and @@Space symbols (Sections
  1757. X{@NumberOf break} and {@NumberOf space}).
  1758. X@End @Section
  1759. END_OF_FILE
  1760.   if test 12218 -ne `wc -c <'doc/tr.lout/ch3.02'`; then
  1761.     echo shar: \"'doc/tr.lout/ch3.02'\" unpacked with wrong size!
  1762.   fi
  1763.   # end of 'doc/tr.lout/ch3.02'
  1764. fi
  1765. if test -f 'gnu.gpl' -a "${1}" != "-c" ; then 
  1766.   echo shar: Will not clobber existing file \"'gnu.gpl'\"
  1767. else
  1768.   echo shar: Extracting \"'gnu.gpl'\" \(12487 characters\)
  1769.   sed "s/^X//" >'gnu.gpl' <<'END_OF_FILE'
  1770. X            GNU GENERAL PUBLIC LICENSE
  1771. X             Version 1, February 1989
  1772. X
  1773. X Copyright (C) 1989 Free Software Foundation, Inc.
  1774. X                    675 Mass Ave, Cambridge, MA 02139, USA
  1775. X Everyone is permitted to copy and distribute verbatim copies
  1776. X of this license document, but changing it is not allowed.
  1777. X
  1778. X                Preamble
  1779. X
  1780. X  The license agreements of most software companies try to keep users
  1781. Xat the mercy of those companies.  By contrast, our General Public
  1782. XLicense is intended to guarantee your freedom to share and change free
  1783. Xsoftware--to make sure the software is free for all its users.  The
  1784. XGeneral Public License applies to the Free Software Foundation's
  1785. Xsoftware and to any other program whose authors commit to using it.
  1786. XYou can use it for your programs, too.
  1787. X
  1788. X  When we speak of free software, we are referring to freedom, not
  1789. Xprice.  Specifically, the General Public License is designed to make
  1790. Xsure that you have the freedom to give away or sell copies of free
  1791. Xsoftware, that you receive source code or can get it if you want it,
  1792. Xthat you can change the software or use pieces of it in new free
  1793. Xprograms; and that you know you can do these things.
  1794. X
  1795. X  To protect your rights, we need to make restrictions that forbid
  1796. Xanyone to deny you these rights or to ask you to surrender the rights.
  1797. XThese restrictions translate to certain responsibilities for you if you
  1798. Xdistribute copies of the software, or if you modify it.
  1799. X
  1800. X  For example, if you distribute copies of a such a program, whether
  1801. Xgratis or for a fee, you must give the recipients all the rights that
  1802. Xyou have.  You must make sure that they, too, receive or can get the
  1803. Xsource code.  And you must tell them their rights.
  1804. X
  1805. X  We protect your rights with two steps: (1) copyright the software, and
  1806. X(2) offer you this license which gives you legal permission to copy,
  1807. Xdistribute and/or modify the software.
  1808. X
  1809. X  Also, for each author's protection and ours, we want to make certain
  1810. Xthat everyone understands that there is no warranty for this free
  1811. Xsoftware.  If the software is modified by someone else and passed on, we
  1812. Xwant its recipients to know that what they have is not the original, so
  1813. Xthat any problems introduced by others will not reflect on the original
  1814. Xauthors' reputations.
  1815. X
  1816. X  The precise terms and conditions for copying, distribution and
  1817. Xmodification follow.
  1818. X
  1819. X            GNU GENERAL PUBLIC LICENSE
  1820. X   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  1821. X
  1822. X  0. This License Agreement applies to any program or other work which
  1823. Xcontains a notice placed by the copyright holder saying it may be
  1824. Xdistributed under the terms of this General Public License.  The
  1825. X"Program", below, refers to any such program or work, and a "work based
  1826. Xon the Program" means either the Program or any work containing the
  1827. XProgram or a portion of it, either verbatim or with modifications.  Each
  1828. Xlicensee is addressed as "you".
  1829. X
  1830. X  1. You may copy and distribute verbatim copies of the Program's source
  1831. Xcode as you receive it, in any medium, provided that you conspicuously and
  1832. Xappropriately publish on each copy an appropriate copyright notice and
  1833. Xdisclaimer of warranty; keep intact all the notices that refer to this
  1834. XGeneral Public License and to the absence of any warranty; and give any
  1835. Xother recipients of the Program a copy of this General Public License
  1836. Xalong with the Program.  You may charge a fee for the physical act of
  1837. Xtransferring a copy.
  1838. X
  1839. X  2. You may modify your copy or copies of the Program or any portion of
  1840. Xit, and copy and distribute such modifications under the terms of Paragraph
  1841. X1 above, provided that you also do the following:
  1842. X
  1843. X    a) cause the modified files to carry prominent notices stating that
  1844. X    you changed the files and the date of any change; and
  1845. X
  1846. X    b) cause the whole of any work that you distribute or publish, that
  1847. X    in whole or in part contains the Program or any part thereof, either
  1848. X    with or without modifications, to be licensed at no charge to all
  1849. X    third parties under the terms of this General Public License (except
  1850. X    that you may choose to grant warranty protection to some or all
  1851. X    third parties, at your option).
  1852. X
  1853. X    c) If the modified program normally reads commands interactively when
  1854. X    run, you must cause it, when started running for such interactive use
  1855. X    in the simplest and most usual way, to print or display an
  1856. X    announcement including an appropriate copyright notice and a notice
  1857. X    that there is no warranty (or else, saying that you provide a
  1858. X    warranty) and that users may redistribute the program under these
  1859. X    conditions, and telling the user how to view a copy of this General
  1860. X    Public License.
  1861. X
  1862. X    d) You may charge a fee for the physical act of transferring a
  1863. X    copy, and you may at your option offer warranty protection in
  1864. X    exchange for a fee.
  1865. X
  1866. XMere aggregation of another independent work with the Program (or its
  1867. Xderivative) on a volume of a storage or distribution medium does not bring
  1868. Xthe other work under the scope of these terms.
  1869. X
  1870. X  3. You may copy and distribute the Program (or a portion or derivative of
  1871. Xit, under Paragraph 2) in object code or executable form under the terms of
  1872. XParagraphs 1 and 2 above provided that you also do one of the following:
  1873. X
  1874. X    a) accompany it with the complete corresponding machine-readable
  1875. X    source code, which must be distributed under the terms of
  1876. X    Paragraphs 1 and 2 above; or,
  1877. X
  1878. X    b) accompany it with a written offer, valid for at least three
  1879. X    years, to give any third party free (except for a nominal charge
  1880. X    for the cost of distribution) a complete machine-readable copy of the
  1881. X    corresponding source code, to be distributed under the terms of
  1882. X    Paragraphs 1 and 2 above; or,
  1883. X
  1884. X    c) accompany it with the information you received as to where the
  1885. X    corresponding source code may be obtained.  (This alternative is
  1886. X    allowed only for noncommercial distribution and only if you
  1887. X    received the program in object code or executable form alone.)
  1888. X
  1889. XSource code for a work means the preferred form of the work for making
  1890. Xmodifications to it.  For an executable file, complete source code means
  1891. Xall the source code for all modules it contains; but, as a special
  1892. Xexception, it need not include source code for modules which are standard
  1893. Xlibraries that accompany the operating system on which the executable
  1894. Xfile runs, or for standard header files or definitions files that
  1895. Xaccompany that operating system.
  1896. X
  1897. X  4. You may not copy, modify, sublicense, distribute or transfer the
  1898. XProgram except as expressly provided under this General Public License.
  1899. XAny attempt otherwise to copy, modify, sublicense, distribute or transfer
  1900. Xthe Program is void, and will automatically terminate your rights to use
  1901. Xthe Program under this License.  However, parties who have received
  1902. Xcopies, or rights to use copies, from you under this General Public
  1903. XLicense will not have their licenses terminated so long as such parties
  1904. Xremain in full compliance.
  1905. X
  1906. X  5. By copying, distributing or modifying the Program (or any work based
  1907. Xon the Program) you indicate your acceptance of this license to do so,
  1908. Xand all its terms and conditions.
  1909. X
  1910. X  6. Each time you redistribute the Program (or any work based on the
  1911. XProgram), the recipient automatically receives a license from the original
  1912. Xlicensor to copy, distribute or modify the Program subject to these
  1913. Xterms and conditions.  You may not impose any further restrictions on the
  1914. Xrecipients' exercise of the rights granted herein.
  1915. X
  1916. X  7. The Free Software Foundation may publish revised and/or new versions
  1917. Xof the General Public License from time to time.  Such new versions will
  1918. Xbe similar in spirit to the present version, but may differ in detail to
  1919. Xaddress new problems or concerns.
  1920. X
  1921. XEach version is given a distinguishing version number.  If the Program
  1922. Xspecifies a version number of the license which applies to it and "any
  1923. Xlater version", you have the option of following the terms and conditions
  1924. Xeither of that version or of any later version published by the Free
  1925. XSoftware Foundation.  If the Program does not specify a version number of
  1926. Xthe license, you may choose any version ever published by the Free Software
  1927. XFoundation.
  1928. X
  1929. X  8. If you wish to incorporate parts of the Program into other free
  1930. Xprograms whose distribution conditions are different, write to the author
  1931. Xto ask for permission.  For software which is copyrighted by the Free
  1932. XSoftware Foundation, write to the Free Software Foundation; we sometimes
  1933. Xmake exceptions for this.  Our decision will be guided by the two goals
  1934. Xof preserving the free status of all derivatives of our free software and
  1935. Xof promoting the sharing and reuse of software generally.
  1936. X
  1937. X                NO WARRANTY
  1938. X
  1939. X  9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  1940. XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  1941. XOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  1942. XPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  1943. XOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  1944. XMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  1945. XTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  1946. XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  1947. XREPAIR OR CORRECTION.
  1948. X
  1949. X  10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  1950. XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  1951. XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  1952. XINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  1953. XOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  1954. XTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  1955. XYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  1956. XPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  1957. XPOSSIBILITY OF SUCH DAMAGES.
  1958. X
  1959. X             END OF TERMS AND CONDITIONS
  1960. X
  1961. X    Appendix: How to Apply These Terms to Your New Programs
  1962. X
  1963. X  If you develop a new program, and you want it to be of the greatest
  1964. Xpossible use to humanity, the best way to achieve this is to make it
  1965. Xfree software which everyone can redistribute and change under these
  1966. Xterms.
  1967. X
  1968. X  To do so, attach the following notices to the program.  It is safest to
  1969. Xattach them to the start of each source file to most effectively convey
  1970. Xthe exclusion of warranty; and each file should have at least the
  1971. X"copyright" line and a pointer to where the full notice is found.
  1972. X
  1973. X    <one line to give the program's name and a brief idea of what it does.>
  1974. X    Copyright (C) 19yy  <name of author>
  1975. X
  1976. X    This program is free software; you can redistribute it and/or modify
  1977. X    it under the terms of the GNU General Public License as published by
  1978. X    the Free Software Foundation; either version 1, or (at your option)
  1979. X    any later version.
  1980. X
  1981. X    This program is distributed in the hope that it will be useful,
  1982. X    but WITHOUT ANY WARRANTY; without even the implied warranty of
  1983. X    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1984. X    GNU General Public License for more details.
  1985. X
  1986. X    You should have received a copy of the GNU General Public License
  1987. X    along with this program; if not, write to the Free Software
  1988. X    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1989. X
  1990. XAlso add information on how to contact you by electronic and paper mail.
  1991. X
  1992. XIf the program is interactive, make it output a short notice like this
  1993. Xwhen it starts in an interactive mode:
  1994. X
  1995. X    Gnomovision version 69, Copyright (C) 19xx name of author
  1996. X    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  1997. X    This is free software, and you are welcome to redistribute it
  1998. X    under certain conditions; type `show c' for details.
  1999. X
  2000. XThe hypothetical commands `show w' and `show c' should show the
  2001. Xappropriate parts of the General Public License.  Of course, the
  2002. Xcommands you use may be called something other than `show w' and `show
  2003. Xc'; they could even be mouse-clicks or menu items--whatever suits your
  2004. Xprogram.
  2005. X
  2006. XYou should also get your employer (if you work as a programmer) or your
  2007. Xschool, if any, to sign a "copyright disclaimer" for the program, if
  2008. Xnecessary.  Here a sample; alter the names:
  2009. X
  2010. X  Yoyodyne, Inc., hereby disclaims all copyright interest in the
  2011. X  program `Gnomovision' (a program to direct compilers to make passes
  2012. X  at assemblers) written by James Hacker.
  2013. X
  2014. X  <signature of Ty Coon>, 1 April 1989
  2015. X  Ty Coon, President of Vice
  2016. X
  2017. XThat's all there is to it!
  2018. END_OF_FILE
  2019.   if test 12487 -ne `wc -c <'gnu.gpl'`; then
  2020.     echo shar: \"'gnu.gpl'\" unpacked with wrong size!
  2021.   fi
  2022.   # end of 'gnu.gpl'
  2023. fi
  2024. echo shar: End of archive 26 \(of 35\).
  2025. cp /dev/null ark26isdone
  2026. MISSING=""
  2027. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ; do
  2028.     if test ! -f ark${I}isdone ; then
  2029.     MISSING="${MISSING} ${I}"
  2030.     fi
  2031. done
  2032. if test "${MISSING}" = "" ; then
  2033.     echo You have unpacked all 35 archives.
  2034.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2035. else
  2036.     echo You still must unpack the following archives:
  2037.     echo "        " ${MISSING}
  2038. fi
  2039. exit 0
  2040. exit 0 # Just in case...
  2041.