home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume38 / lout / part31 < prev    next >
Text File  |  1993-08-11  |  76KB  |  1,879 lines

  1. Newsgroups: comp.sources.misc
  2. From: jeff@joyce.cs.su.oz.au (Jeff Kingston)
  3. Subject: v38i099:  lout - Lout document formatting system, v2.05, Part31/35
  4. Message-ID: <1993Aug10.132313.19055@sparky.sterling.com>
  5. X-Md4-Signature: 0483b9ceb813aa12690d65e07988c2d2
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Tue, 10 Aug 1993 13:23:13 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 99
  13. Archive-name: lout/part31
  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/s01 doc/tr.begin/s10 doc/tr.eq/s4
  22. #   doc/tr.fig/s2 doc/tr.fig/s6 doc/tr.impl/s1.0 doc/tr.impl/s5.4
  23. #   doc/tr.impl/s5.5 doc/tr.impl/s6.2 doc/tr.lout/ch3.03
  24. #   doc/tr.over/s4 doc/tr.over/s5 doc/tr.tab/s6 include/book
  25. #   include/tl
  26. # Wrapped by kent@sparky on Sun Aug  8 12:29:33 1993
  27. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  28. echo If this archive is complete, you will see the following message:
  29. echo '          "shar: End of archive 31 (of 35)."'
  30. if test -f 'doc/tr.begin/s01' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'doc/tr.begin/s01'\"
  32. else
  33.   echo shar: Extracting \"'doc/tr.begin/s01'\" \(4181 characters\)
  34.   sed "s/^X//" >'doc/tr.begin/s01' <<'END_OF_FILE'
  35. X@Section
  36. X   @Tag { intro }
  37. X   @Title { Introduction }
  38. X@Begin
  39. X@PP
  40. XThe Lout document formatting system has been designed with the
  41. Xneeds of the ordinary user very much in mind.  Although the features of Lout
  42. Xare virtually endless, and include mathematical equations, diagrams made
  43. Xfrom lines and shapes, bibliographic databases, and so on, the system is
  44. Xvery simple to use.
  45. X@PP
  46. XDocument formatting with Lout begins with the creation of a file like
  47. Xthe following:
  48. X@ID @Code {
  49. X"@Doc @Text @Begin"
  50. X"@Heading { Introduction }"
  51. X"@PP"
  52. X"For Virginia Woolf, @I Middlemarch"
  53. X"was `the magnificent book which"
  54. X"for all its imperfections is one"
  55. X"of the few English novels written"
  56. X"for grown-up people.'"
  57. X"@End @Text"
  58. X}
  59. XOrdinary words are mixed with symbols of special meaning, such as
  60. X{@Code "@Doc"}, {@Code "@Text"}, {@Code "@Heading"}, and
  61. X{@Code "@I"}.  Most symbols begin with {@Code "@"}, but some, like
  62. X{@Code "{"} and {@Code "}"}, do not.  It doesn't matter where the lines
  63. Xend:  the end of a line is treated the same as a single space.
  64. X@PP
  65. XThis file is then processed by the Basser Lout interpreter, for example
  66. Xby typing
  67. X@ID @Code "lout -idoc simple > simple.ps"
  68. Xon the Unix
  69. X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. &0io }
  70. Xoperating system, assuming that the file's name is
  71. X{@Code "simple"}.  The @Code "-idoc" part instructs Lout to include a
  72. Xspecial @I {setup file} called {@Code doc}, in which the symbols are
  73. Xdefined.  The output is the PostScript
  74. X@FootNote { PostScript is a trademark of Adobe Systems, Inc. &0io }
  75. Xfile {@Code "simple.ps"}, which is suitable for printing on most laser
  76. Xprinters and many other devices.  When printed, it will appear like this:
  77. X@ID {
  78. X@Heading { Introduction }
  79. X@PP
  80. XFor Virginia Woolf, @I Middlemarch was `the magnificent book which
  81. Xfor all its imperfections is one of the few English novels written
  82. Xfor grown-up people.'
  83. X}
  84. XThe meaning of each symbol is now clear.  @Code "@Doc @Text @Begin" and
  85. X@Code "@End @Text" have no visible effect, but they always bracket the
  86. Xdocument as a whole.  @Code "@Heading" makes the following thing into
  87. Xa heading; there is also @Code "@MajorHeading" for producing a large
  88. Xheading, and @Code "@MinorHeading" for a subheading.  The @Code "@PP"
  89. Xsymbol starts a paragraph whose first line is indented; also available
  90. Xare {@Code "@LP"} which omits the indent, {@Code "@DP"} which leaves the
  91. Xamount of vertical space used for displays, and {@Code "@NP"}, which
  92. Xstarts a new page or column (rarely used, since Lout does this
  93. Xautomatically when the old one fills).  Finally, @Code "@I" changes the
  94. Xfont of the following thing to {@I Italic}.
  95. X@PP
  96. XBraces are used to group parts of the document together so that nearby
  97. Xsymbols will affect the whole part.  For example,
  98. X@ID @Code "@I { Scenes of Clerical Life }"
  99. Xproduces {@I { Scenes of Clerical Life }}.  The braces around
  100. X@Code "Introduction" in the example above are not strictly necessary,
  101. Xsince a single word does not need to be grouped; but a longer heading
  102. Xwould require them.  Braces also help when a symbol must be immediately
  103. Xadjacent to another symbol or to a word:
  104. X@ID @Code "QuikWipe{@TradeMark}"
  105. Xhas result QuikWipe{@TradeMark}.  Without them Lout would confuse the
  106. Xtwo.  In a similar way, @Code "{@I Middlemarch}," produces
  107. X{@I Middlemarch}, with the comma not set in Italic.
  108. X@PP
  109. XCharacters like "{", which normally are symbols, will be
  110. Xtreated as ordinary words when enclosed in double quotes.  For example,
  111. X@Code "\"{\"" produces "{".  The characters
  112. X@ID @Code "/    |    &    {    }    #    @    ^"
  113. Xshould always be so enclosed, since otherwise they will have special
  114. Xeffects.
  115. X@PP
  116. XThe symbols described above form part of the {@I DocumentLayout @I package},
  117. Xa collection of symbols designed to make day-to-day document formatting
  118. Xeasy.  This package also provides symbols for producing displays and
  119. Xlists, numbered sections, subsections, and appendices, footnotes,
  120. Xfigures, tables, references, and cross references.  These are described
  121. Xin later sections of this report.  This same package may also be used to
  122. Xproduce technical reports and books, as described in Sections
  123. X@NumberOf reportlayout and {@NumberOf booklayout}.
  124. X@End @Section
  125. END_OF_FILE
  126.   if test 4181 -ne `wc -c <'doc/tr.begin/s01'`; then
  127.     echo shar: \"'doc/tr.begin/s01'\" unpacked with wrong size!
  128.   fi
  129.   # end of 'doc/tr.begin/s01'
  130. fi
  131. if test -f 'doc/tr.begin/s10' -a "${1}" != "-c" ; then 
  132.   echo shar: Will not clobber existing file \"'doc/tr.begin/s10'\"
  133. else
  134.   echo shar: Extracting \"'doc/tr.begin/s10'\" \(4136 characters\)
  135.   sed "s/^X//" >'doc/tr.begin/s10' <<'END_OF_FILE'
  136. X@Section
  137. X   @Tag { refs }
  138. X   @Title { References }
  139. X@Begin
  140. X@PP
  141. XThe method of handling references described in this section is rather
  142. Xelaborate, but it has many advantages.  The first step is to create a
  143. Xseparate @I {database file} containing @Code "@Reference" symbols.  Each
  144. Xis enclosed in braces, and has options chosen from
  145. X{@Code "@Tag"}, {@Code "@Type"}, {@Code "@Author"}, {@Code "@Title"},
  146. X{@Code "@Institution"}, {@Code "@Number"}, {@Code "@Publisher"},
  147. X{@Code "@Year"}, {@Code "@Proceedings"}, {@Code "@Journal"},
  148. X{@Code "@Volume"}, {@Code "@Pages"}, and {@Code "@Comment"}:
  149. X@IndentedList
  150. X@ListItem @Code {
  151. X"{ @Reference"
  152. X"     @Tag { strunk79 }"
  153. X"     @Type { Book }"
  154. X"     @Author { Strunk and White }"
  155. X"     @Title { The Elements of Style }"
  156. X"     @Publisher { MacMillan }"
  157. X"     @Year { 1979 }"
  158. X"}"
  159. X}
  160. X@ListItem @Code {
  161. X"{ @Reference"
  162. X"     @Tag { kingston92 }"
  163. X"     @Type { TechReport }"
  164. X"     @Author { Kingston, Jeffrey H. }"
  165. X"     @Title { Document Formatting"
  166. X"with Lout }"
  167. X"     @Number { 449 }"
  168. X"     @Institution { Basser Department"
  169. X"of Computer Science F09, University"
  170. X"of Sydney 2006, Australia }"
  171. X"     @Year { 1992 }"
  172. X"}"
  173. X}
  174. X@EndList
  175. XThe {@Code "@Tag"} and {@Code "@Type"} options are in fact compulsory; the
  176. Xfirst serves to name the reference, the second gives its type, which may
  177. Xbe {@Code "TechReport"}, {@Code "ConferencePaper"}, {@Code "JournalArticle"},
  178. X{@Code "PhD"}, or {@Code "Book"}, although a Lout expert will be able to add
  179. Xother types.  The type determines which other options must be present, as
  180. Xshown above, and how they will be printed.
  181. X@PP
  182. XSuppose this file is given the name @Code "myrefs.ld" (Basser Lout
  183. Xdatabase file names must end in {@Code ".ld"}).  To tell Lout to refer
  184. Xto this file as needed,
  185. X@ID @Code {
  186. X"@Database @Reference { myrefs }"
  187. X}
  188. Xis placed at the beginning of the document, before {@Code "@Doc"},
  189. X{@Code "@Report"}, or {@Code "@Book"}.
  190. X@PP
  191. XNow, with everything prepared,
  192. X@ID @Code {
  193. X"{@Ref kingston92}"
  194. X}
  195. Xfor example at any point in the document will cause the reference whose
  196. Xtag is @Code "kingston92" to be added to the nearest following
  197. Xreference list, indicated by the symbol {@Code "@ReferenceSection"}, unless
  198. Xit is already there.  Typically one would write
  199. X@ID @Code {
  200. X"... which ends our study."
  201. X"@DP"
  202. X"@ReferenceSection"
  203. X}
  204. Xat the very end of the document (although one could equally well have several
  205. X@Code "@ReferenceSection" symbols scattered through the document if desired);
  206. Xtechnical reports and books add @Code "@ReferenceSection" automatically
  207. Xwhen needed.  The references will appear in alphabetical order by tag, and
  208. Xthe @Code "@Ref" symbol will be replaced by the number of the reference,
  209. Xin this case {@Ref "kingston92"}.  @Code "@ReferenceSection" has a
  210. X@Code "@Title" option like {@Code "@Section"}, and it also has {@Code style},
  211. X{@Code indent}, {@Code gap} and {@Code start} options for contolling the
  212. Xappearance of the reference list, like {@Code "@RawIndentList"}.
  213. X@PP
  214. XIf a separate database file is not convenient for some reason, perhaps
  215. Xbecause it is desirable for the entire document to reside in one file,
  216. Xthe @Code "@Reference" symbols may be incorporated into the document
  217. Xitself, anywhere after {@Code "@Text @Begin"}.  Nothing will appear
  218. Xwhere they are typed in, but Lout will
  219. Xnotice them and treat them exactly as if they had come from a database
  220. Xfile.  In this case no @Code "@Database" symbol is needed.
  221. X@PP
  222. XA way to print references at any point in the document is provided by
  223. X{@Code "@RefPrint"}:
  224. X@ID @Code "{@RefPrint kingston92}"
  225. Xmight have result
  226. X@ID {@RefPrint kingston92}
  227. Xdepending on what references exist.
  228. X@PP
  229. XTo get section numbers, footnote numbers, cross references, and references
  230. Xright, Basser Lout has to process the document more than once (three times
  231. Xfor numbered references), and create special files whose names end
  232. Xin `.li' and `.ld'.  It will print warning messages on runs when this
  233. Xprocess is incomplete, and substitute question marks for the unknown
  234. Xvalues.  There should be only one document containing these features per
  235. XUnix directory, otherwise Basser Lout will confuse their special files.
  236. X@End @Section
  237. END_OF_FILE
  238.   if test 4136 -ne `wc -c <'doc/tr.begin/s10'`; then
  239.     echo shar: \"'doc/tr.begin/s10'\" unpacked with wrong size!
  240.   fi
  241.   # end of 'doc/tr.begin/s10'
  242. fi
  243. if test -f 'doc/tr.eq/s4' -a "${1}" != "-c" ; then 
  244.   echo shar: Will not clobber existing file \"'doc/tr.eq/s4'\"
  245. else
  246.   echo shar: Extracting \"'doc/tr.eq/s4'\" \(4293 characters\)
  247.   sed "s/^X//" >'doc/tr.eq/s4' <<'END_OF_FILE'
  248. X@Section
  249. X   @Title { Features from Standard Lout }
  250. X@Begin
  251. X@PP
  252. XIn this section we summarize those features of standard Lout of most
  253. Xrelevance to equation formatting.  All are freely available within
  254. Xequations.  Full details may be found in the Lout reference manual
  255. X[{@Ref kingston92}].
  256. X@PP
  257. XStandard Lout uses the symbols {@Code "#"}, {@Code "{"}, {@Code "}"},
  258. X{@Code "&"}, {@Code "|"}, and @Code "/" for special purposes (the braces
  259. Xare used for grouping, for example).  To get these characters into
  260. Xequations without using their full names, enclose them in double quotes:
  261. X{@Code "\"{\""}, {@Code "\"}\""}, etc.  Any sequence of characters
  262. Xincluding spaces but not newlines may be so enclosed, and the effect is
  263. Xto turn off any special meaning that the symbols within it might have.
  264. X@PP
  265. XEq sets letters in Slope (Lout's name for Italic), digits in Base (i.e.
  266. XRoman), and other symbols in various fonts, mostly the Symbol font.  To
  267. Xchange fonts, use the @Code "@Font" symbol:
  268. X@ID {
  269. X@Code "Slope @Font \"2\""
  270. X|7ct
  271. X@Eq { Slope @Font "2" }
  272. X}
  273. XIn Eq it will often be necessary to enclose the right parameter in
  274. Xdouble quotes, because the symbol 2 includes a built-in change back to
  275. XBase font.  Changing fonts makes white space between objects in the
  276. Xright parameter appear in the result.  The @Code "@Font" operator also
  277. Xdoes size changes:
  278. X@IL
  279. X@LI {
  280. X@Code "sum"
  281. X|7ct
  282. X@Eq { sum }
  283. X}
  284. X@LI {
  285. X@Code "\"+2p\" @Font sum"
  286. X|7ct
  287. X@Eq { "+2p" @Font sum }
  288. X}
  289. X@LI {
  290. X@Code "2.0f @Font sum"
  291. X|7ct
  292. X@Eq { 2.0f @Font sum }
  293. X}
  294. X@EL
  295. XHere @Code "\"+2p\" @Font" sets its right parameter in a font two points
  296. Xlarger than it would otherwise have been; @Code "2.0f @Font" sets its
  297. Xright parameter in a font twice the original size.  Sizes should always
  298. Xbe specified relative to the enclosing size as we have done here, since
  299. Xthen they don't need to be changed if a decision is made to set the entire
  300. Xdocument in a different size.  It is necessary to enclose @Code "+2p" in
  301. Xdouble quotes within Eq, because otherwise the @Code "+" will be taken as
  302. Xthe Eq symbol for {@Eq { + }}.  The right parameter may be any object.
  303. X@PP
  304. XWhenever similar equations or parts of equations are being typed
  305. Xrepeatedly, @I definitions should be used to save time.  Suppose for
  306. Xexample that @OneCol @Eq { p sub i ` log sub 2 ` p sub i } occurs
  307. Xfrequently.  Then
  308. X@ID @Code "def epi { p sub i ` log sub 2 ` p sub i }"
  309. Xmakes the symbol @Code "epi" stand for the object between the braces:
  310. X@ID {
  311. X@Code "big sum from i=1 to n ` epi"
  312. X|7ct
  313. X@Eq { big sum from i=1 to n ` epi }
  314. X}
  315. XSymbols may be given parameters:
  316. X@ID @Code {
  317. X"def ep"
  318. X"   right x"
  319. X"{ p sub x ` log sub 2 ` p sub x"
  320. X"}"
  321. X}
  322. XThe parameter @Code x will be replaced by the object just to the right
  323. Xof {@Code "ep"}:
  324. X@ID {
  325. X@Code {
  326. X"big sum from j=1 to k ` ep i +"
  327. X"big sum from j=k+1 to n ep j"
  328. X}
  329. X||7ct
  330. X@Eq {
  331. Xbig sum from j=1 to k ` ep i +
  332. Xbig sum from j=k+1 to n ep j
  333. X}
  334. X}
  335. XThe precedence of such symbols will be 100 by default.
  336. X@PP
  337. XTo make the symbols of Eq available within such definitions, each must be
  338. Xpreceded by {@Code "import @Eq"}.  The best place to keep them is in the
  339. Xsetup file, which might then look like this:
  340. X@ID @Code {
  341. X"@SysInclude { ft  }"
  342. X"@SysInclude { dl  }"
  343. X"@SysInclude { eq  }"
  344. X""
  345. X"import @Eq"
  346. X"def epi { p sub i ` log sub 2 ` p sub i }"
  347. X""
  348. X"import @Eq"
  349. X"def ep right x { p sub x ` log sub 2 ` p sub x }"
  350. X""
  351. X"@Use { @DocumentLayout }"
  352. X}
  353. XUse of @Code "epi" and @Code "ep" outside equations will cause an error.
  354. X@PP
  355. XEquations can appear within a paragraph of text, or they can be
  356. Xdisplayed.  Eq's job is to produce a Lout object containing the
  357. Xequation; it neither knows nor cares where this equation goes.  To get
  358. Xan equation within a paragraph, simply place @Code "@Eq { ... }" at the
  359. Xdesired point.  To prevent it spreading over two lines, use
  360. X{@Code "@OneCol @Eq { ... }"}.  To display an equation, use a display
  361. Xsymbol from some other Lout package.  For example, the DocumentLayout package
  362. X[{@Ref kingston92begin}] has @Code "@IndentedDisplay" or @Code "@ID" for an
  363. Xindented display, and @Code "@CentredDisplay" or @Code "@CD" for a centred
  364. Xdisplay, so
  365. X@ID @Code "@CD @Eq { int supp pi on 0 sin ` x = 0 }"
  366. Xproduces
  367. X@CD @Eq { int supp pi on 0 sin ` x = 0 }
  368. XDocumentLayout also provides display symbols that make it easy to
  369. Xproduce aligned and numbered equations.
  370. X@End @Section
  371. END_OF_FILE
  372.   if test 4293 -ne `wc -c <'doc/tr.eq/s4'`; then
  373.     echo shar: \"'doc/tr.eq/s4'\" unpacked with wrong size!
  374.   fi
  375.   # end of 'doc/tr.eq/s4'
  376. fi
  377. if test -f 'doc/tr.fig/s2' -a "${1}" != "-c" ; then 
  378.   echo shar: Will not clobber existing file \"'doc/tr.fig/s2'\"
  379. else
  380.   echo shar: Extracting \"'doc/tr.fig/s2'\" \(4595 characters\)
  381.   sed "s/^X//" >'doc/tr.fig/s2' <<'END_OF_FILE'
  382. X@Section
  383. X   @Title { Basic Shapes }
  384. X@Begin
  385. X@PP
  386. XFig has a repertoire of basic shapes, whose size varies depending on
  387. Xwhat they enclose:
  388. X@IL
  389. X@LI {
  390. X@Code "@Ellipse { hello, world }"
  391. X||7ct
  392. X@Fig {
  393. X@Ellipse { hello, world }
  394. X}
  395. X}
  396. X@LI {
  397. X@Code "@Box { 2c @High }"
  398. X||7ct
  399. X@Fig {
  400. X@Box { 2c @High }
  401. X}
  402. X}
  403. X@EL
  404. XThere are six such shapes: {@Code "@Box"}, {@Code "@Square"},
  405. X{@Code "@Diamond"}, {@Code "@Polygon"}, {@Code "@Ellipse"}, and
  406. X{@Code "@Circle"}; the result in each case is the right parameter,
  407. Xenclosed in a small margin, with the shape around it.
  408. X@PP
  409. XThere are options for changing the appearance of these shapes.  The
  410. Xboundary line's style may be {@Code solid}, {@Code dashed},
  411. X{@Code cdashed}, {@Code dotted}, or {@Code noline} (that is, no line is
  412. Xdrawn), and the length of the dashes may be changed:
  413. X@ID {
  414. X@Code {
  415. X"@Circle"
  416. X"   linestyle { cdashed }"
  417. X"   dashlength { 0.2 cm }"
  418. X"@Eq { X sub 2 }"
  419. X}
  420. X||7ct
  421. X@Fig {
  422. X@Circle
  423. X   linestyle { cdashed }
  424. X   dashlength { 0.2 cm }
  425. X@Eq { X sub 2 }
  426. X}
  427. X}
  428. XIf the line style is not mentioned, it becomes @Code solid by default.  The
  429. X@Code dashed option makes all dashes the same length; @Code cdashed
  430. Xhalves the length of the first and last dash on each segment, which
  431. Xlooks better in some cases.  The distance between dashes or dots will be
  432. Xat most {@Code dashlength}, reduced to make the dashes or dots fit evenly.
  433. X@PP
  434. XShapes may be painted {@Code black}, {@Code dark}, {@Code grey} or
  435. X{@Code gray}, {@Code light}, {@Code white}, or {@Code nopaint} (the default):
  436. X@ID {
  437. X@Code {
  438. X"@Box"
  439. X"   margin { 0c }"
  440. X"   paint { grey }"
  441. X"@Diamond"
  442. X"   linestyle { noline }"
  443. X"   paint { white }"
  444. X"{ hello, world }"
  445. X}
  446. X||7ct
  447. X@Fig {
  448. X@Box
  449. X   margin { 0c }
  450. X   paint { grey }
  451. X@Diamond
  452. X   linestyle { noline }
  453. X   paint { white }
  454. X{ hello, world }
  455. X}
  456. X}
  457. XHere, the right parameter of @Code "@Box" is a diamond containing
  458. X{@Code "hello, world"}.  There is no limit to the amount of this sort of
  459. Xnesting; the right parameter may be any Lout object.
  460. X@PP
  461. XWhen painting it is important to know what order things are done in,
  462. Xbecause anything put down earlier will disappear under the paint.  This
  463. Xis why @Code nopaint and @Code white are different.  Painting is done
  464. Xfirst, then boundaries, and finally the right parameter.
  465. X@PP
  466. XThe @Code "@Polygon" shape has a @Code sides option for specifying the number
  467. Xof sides, and an @Code angle option for specifying what angle anticlockwise
  468. Xfrom vertically beneath the centre the first corner will appear at:
  469. X@IL
  470. X@LI {
  471. X@Code {
  472. X"@Polygon"
  473. X"   sides { 5 }"
  474. X"{}"
  475. X}
  476. X||7ct
  477. X@Fig {
  478. X//0.5c 
  479. X@Polygon
  480. X   sides { 5 }
  481. X{}
  482. X}
  483. X}
  484. X
  485. X@LI {
  486. X@Code {
  487. X"@Polygon"
  488. X"   sides { 5 }"
  489. X"   angle { 0 dg }"
  490. X"{}"
  491. X}
  492. X||7ct
  493. X@Fig {
  494. X//0.5c 
  495. X@Polygon
  496. X   sides { 5 }
  497. X   angle { 0 dg }
  498. X{}
  499. X}
  500. X}
  501. X@EL
  502. XThe defaults are 3 sides and the angle that gives the polygon
  503. Xa horizontal base (i.e. 180 degrees divided by the number of sides).
  504. XThus the two cases with symmetry about a vertical axis are obtained 
  505. Xby the default angle and @Code "0 dg" respectively, which is convenient.
  506. X@PP
  507. XAlthough lines and arrows do not enclose things in the way that boxes
  508. Xand circles do, Fig treats them as it does the other shapes.  The line
  509. Xor arrow is drawn along the mark of the right parameter, either
  510. Xhorizontally or vertically:
  511. X@IL
  512. X@LI {
  513. X@Code "@HLine { //0.2c hello, world }"
  514. X||7ct
  515. X@Fig {
  516. X@HLine { //0.2c hello, world }
  517. X}
  518. X}
  519. X@LI {
  520. X@Code "@VArrow { 2c @High X ^|0.2c }"
  521. X||7ct
  522. X@Fig {
  523. X@VArrow { 2c @High X ^|0.2c }
  524. X}
  525. X}
  526. X@EL
  527. XThe usual line style options are available; the default margin is
  528. X{@Code "0c"}.  Arrows can be
  529. X{@Code forward} (the default), {@Code back}, {@Code both}, or
  530. X{@Code noarrow} (which just draws a line); the style of the arrowhead
  531. Xcan be {@Code open} (the default), {@Code halfopen}, or {@Code closed}:
  532. X@ID {
  533. X@Code {
  534. X"@HArrow"
  535. X"   arrow { both }"
  536. X"   headstyle { closed }"
  537. X"{ 3c @Wide }"
  538. X}
  539. X||7ct
  540. X@Fig {
  541. X@HArrow
  542. X   arrow { both }
  543. X   headstyle { closed }
  544. X{ 3c @Wide }
  545. X}
  546. X}
  547. XIt is also possible to change the shape of the arrowhead, using the
  548. X@Code headwidth and @Code headlength options:
  549. X@ID @Fig {
  550. X{
  551. X@Figure
  552. X   shape {
  553. X      {0 ysize} ** 0.4 @Label SB
  554. X      {0 ysize} ** 0.6 @Label ST
  555. X      {xsize 0} ** 0.7 @Label HB
  556. X      SB
  557. X      SB ++ HB
  558. X      HB
  559. X      {xsize 0} ++ {0 ysize} ** 0.5
  560. X      HB ++ {0 ysize}
  561. X      HB ++ ST
  562. X      ST
  563. X      SB
  564. X   }
  565. X   paint { grey }
  566. X{ 10c @Wide 3c @High }
  567. X//0.3c
  568. X7c @Wide {} & @HArrow headstyle { closed } arrow {both }
  569. X3c @Wide { //0.2c |0.5rt @I -2p @Font headlength }
  570. X} |0.3c @VArrow headstyle { closed } arrow {both }
  571. X1.5c @High { /0.5rt |0.2c @I -2p @Font headwidth |0io }
  572. X}
  573. XTheir default values are @Code "0.05 cm" and @Code "0.15 cm"
  574. Xrespectively.
  575. X@End @Section
  576. END_OF_FILE
  577.   if test 4595 -ne `wc -c <'doc/tr.fig/s2'`; then
  578.     echo shar: \"'doc/tr.fig/s2'\" unpacked with wrong size!
  579.   fi
  580.   # end of 'doc/tr.fig/s2'
  581. fi
  582. if test -f 'doc/tr.fig/s6' -a "${1}" != "-c" ; then 
  583.   echo shar: Will not clobber existing file \"'doc/tr.fig/s6'\"
  584. else
  585.   echo shar: Extracting \"'doc/tr.fig/s6'\" \(5044 characters\)
  586.   sed "s/^X//" >'doc/tr.fig/s6' <<'END_OF_FILE'
  587. X@Section
  588. X   @Title { Putting it all together }
  589. X@Begin
  590. X@PP
  591. XIn this section we consider the problem of linking individual shapes
  592. Xtogether to form complex diagrams like this one:
  593. X@ID @Fig {
  594. X@Frame { 10c @Wide 6c @High }
  595. X// X**0.1 ++ Y**0.4 @BaseOf A:: @Square { @I A }
  596. X// X**0.4 ++ Y**0.7 @BaseOf B:: @Square { @I B }
  597. X// X**0.6 ++ Y**0.1 @BaseOf C:: @Square { @I C }
  598. X// X**0.8 ++ Y**0.6 @BaseOf D:: @Square { @I D }
  599. X// A @JoinFigures arrow { forward } B
  600. X// A @JoinFigures arrow { forward } C
  601. X// B @JoinFigures arrow { forward } C
  602. X// B @JoinFigures arrow { forward } D
  603. X// C @JoinFigures arrow { forward } D
  604. X}
  605. XWe already have several aids to hand:  the standard Lout symbols,
  606. Xespecially horizontal and vertical concatenation, rotation and scaling;
  607. Xthe ability to nest text, equations, and other figures (in fact
  608. Xarbitrary Lout objects) within our shapes; and the standard Lout
  609. Xdefinition mechanism.
  610. X@PP
  611. XThe default values of the various options -- @Code "solid" for
  612. X{@Code linestyle}, @Code noarrow for {@Code arrow}, and so on -- may be
  613. Xchanged by giving options to the @Code "@Fig" symbol:
  614. X@ID {
  615. X@Code {
  616. X"@Fig"
  617. X"   linestyle { noline }"
  618. X"   paint { black }"
  619. X"{"
  620. X"   @Circle |1c @Square"
  621. X"   /1c @Diamond | @Polygon"
  622. X"}"
  623. X}
  624. X||7ct
  625. X@Fig
  626. X   linestyle { noline }
  627. X   paint { black }
  628. X{
  629. X    @Circle |1c @Square
  630. X   /1c
  631. X   @Diamond | @Polygon
  632. X}
  633. X}
  634. XA complete list of options is given in the next section.
  635. X@PP
  636. XFig provides an additional aid: the symbols {@Code "@BaseOf"} and
  637. X{@Code "@MarkOf"}.  The right parameter of {@Code "@BaseOf"} is an
  638. Xarbitrary object, and its left parameter is a point.  As far as Lout
  639. Xis concerned, the result of @Code "@BaseOf" is always an empty object;
  640. Xbut the right parameter will appear on the page with the bottom left-hand
  641. Xcorner of its base at the point denoted by the left parameter.  We stress
  642. Xthat Lout has no idea that this is happening, and so cannot prevent the
  643. Xshifted object from writing over other objects or even going off the edge
  644. Xof the page.  Of course, this lack of discipline is just what is needed
  645. Xvery often in diagrams.
  646. X@PP
  647. XThe @Code "@MarkOf" symbol works in a similar way, except that the point
  648. Xwhere the object's marks cross (rather than its bottom left-hand corner)
  649. Xwill appear on the page at the point denoted by the left parameter.
  650. X@PP
  651. XWe can set up a coordinate system for a figure:
  652. X@ID @Code {
  653. X"@Figure shape { xsize 0 @Label X  0 ysize @Label Y }"
  654. X"{ 10c @Wide 6c @High }"
  655. X}
  656. XIn fact, Fig contains this shape under the name {@Code "@Frame"}, so we
  657. Xneed only write
  658. X@ID @Code "@Frame { 10c @Wide 6c @High }"
  659. XOf course, the right parameter may contain an arbitrary Lout object.
  660. X@PP
  661. XOnce the frame is set up, we can specify points by their @Code X and
  662. X@Code Y coordinates, as fractions of the total width and height:
  663. X@ID @Code "X ** 0.5  ++  Y ** 0.8"
  664. XTo place the squares in the diagram above, we can use
  665. X@ID @Code {
  666. X"//  X**0.1 ++ Y**0.4  @BaseOf  A:: @Square { @I A }"
  667. X"//  X**0.4 ++ Y**0.7  @BaseOf  B:: @Square { @I B }"
  668. X"//  X**0.6 ++ Y**0.1  @BaseOf  C:: @Square { @I C }"
  669. X"//  X**0.8 ++ Y**0.6  @BaseOf  D:: @Square { @I D }"
  670. X}
  671. XThe symbols' precedences are chosen so that this very common situation
  672. Xrequires no braces.  The result of this is
  673. X@ID @Fig {
  674. X@Box margin { 0c } @Frame { 10c @Wide 6c @High }
  675. X// X**0.1 ++ Y**0.4 @BaseOf A:: @Square { @I A }
  676. X// X**0.4 ++ Y**0.7 @BaseOf B:: @Square { @I B }
  677. X// X**0.6 ++ Y**0.1 @BaseOf C:: @Square { @I C }
  678. X// X**0.8 ++ Y**0.6 @BaseOf D:: @Square { @I D }
  679. X}
  680. X{@PageMark sumpoints} where we have drawn a box with margin 0 around the
  681. Xframe to make its extent clear.
  682. X@PP
  683. XNow the arrow from @I A to @I B starts on the boundary of @I A at the
  684. Xangle of a line drawn between the centres of @I A and {@I B}:
  685. X@ID @Code "A@CTR ++ { {A@CTR @Angle B@CTR} A@CIRCUM }"
  686. Xand a similar expression will yield the endpoint of the arrow.  Such
  687. Xexpressions should be placed into definitions if they are to be used often:
  688. X@ID @Code {
  689. X"import @Fig"
  690. X"def @JoinFigures"
  691. X"   left A"
  692. X"   named linestyle { solid }"
  693. X"   named dashlength { 0.15 cm }"
  694. X"   named arrow { noarrow }"
  695. X"   named linewidth { 0.5 pt }"
  696. X"   right B"
  697. X"{  @Arrow"
  698. X"      from { A\"@CTR\" ++ {{A\"@CTR\" @Angle B\"@CTR\"} A\"@CIRCUM\"} }"
  699. X"      to   { B\"@CTR\" ++ {{B\"@CTR\" @Angle A\"@CTR\"} B\"@CIRCUM\"} }"
  700. X"      linestyle { linestyle }"
  701. X"      dashlength { dashlength }"
  702. X"      arrow { arrow }"
  703. X"      linewidth { linewidth }"
  704. X"   {}"
  705. X"}"
  706. X}
  707. XDefinitions preceded by @Code "import @Fig" may use the symbols of
  708. XFig within them; they may themselves be used only within
  709. X@Code "@Fig { ... }".  Now, to the figure above we can add
  710. X@ID @Code {
  711. X"// A @JoinFigures arrow { forward } B"
  712. X"// A @JoinFigures arrow { forward } C"
  713. X"// B @JoinFigures arrow { forward } C"
  714. X"// B @JoinFigures arrow { forward } D"
  715. X"// C @JoinFigures arrow { forward } D"
  716. X}
  717. Xto obtain the diagram as it appears at the beginning of this
  718. Xsection.  Definitions are the best means of managing complexity in
  719. Xdiagrams, and serious users maintain a file of definitions which is
  720. Xincluded automatically by an @Code "@Include" command.
  721. X@End @Section
  722. END_OF_FILE
  723.   if test 5044 -ne `wc -c <'doc/tr.fig/s6'`; then
  724.     echo shar: \"'doc/tr.fig/s6'\" unpacked with wrong size!
  725.   fi
  726.   # end of 'doc/tr.fig/s6'
  727. fi
  728. if test -f 'doc/tr.impl/s1.0' -a "${1}" != "-c" ; then 
  729.   echo shar: Will not clobber existing file \"'doc/tr.impl/s1.0'\"
  730. else
  731.   echo shar: Extracting \"'doc/tr.impl/s1.0'\" \(2523 characters\)
  732.   sed "s/^X//" >'doc/tr.impl/s1.0' <<'END_OF_FILE'
  733. X@Section
  734. X    @Title { Introduction }
  735. X@Begin
  736. X@PP
  737. XLout [1, 2] is a high-level language
  738. Xfor document formatting, designed and implemented by the author.  The
  739. Ximplementation, known as Basser Lout, is a fully operational production
  740. Xversion written in C for the Unix operating system,
  741. X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. }
  742. Xwhich translates Lout source code into PostScript,
  743. X@FootNote { PostScript is a trademark of Adobe Systems, Incorporated. }
  744. Xa device-independent graphics rendering language accepted by many
  745. Xhigh-resolution output devices, including most laser printers.  Basser
  746. XLout is available free of charge [3].  It includes
  747. Xinstallation instructions, C source, seven standard packages, and complete
  748. Xdocumentation in the form of six technical reports and a manual page.
  749. X@PP
  750. XThe Lout project arose out of the author's desire to bring to document
  751. Xformatting languages the elegance of expression found in programming
  752. Xlanguages like Algol-60 and Pascal.  This emphasis on expressiveness
  753. Xhas produced an order of magnitude reduction in the cost of developing
  754. Xdocument formatting applications.  For example, an equation formatting
  755. Xapplication, which may be difficult or impossible to add to other
  756. Xsystems, can be written in Lout in a few days.
  757. X@PP
  758. XWhen expert users can implement such applications quickly, non-experts
  759. Xbenefit.  Although Lout itself provides only a small kernel of carefully
  760. Xchosen primitives, packages written in Lout and distributed with Basser
  761. XLout provide an unprecedented array of advanced features in a form
  762. Xaccessible to non-expert users.  The features include rotation and scaling,
  763. Xfonts, paragraph and page breaking, displays and lists, floating figures
  764. Xand tables, footnotes, chapters and sections (automatically numbered),
  765. Xrunning page headers and footers, odd-even page layouts, automatically
  766. Xgenerated tables of contents, sorted indexes and reference lists,
  767. Xbibliographic and other databases (including databases of formats for
  768. Xprinting references), equations, tables, diagrams, formatting of
  769. XPascal programs, and automatically maintained cross references.
  770. X@PP
  771. XThis paper charts the evolution of Lout from conception in mid-1984 to the
  772. Xpublic release of Basser Lout in October 1991.  Lout is organized around
  773. Xfour key concepts -- objects, definitions, galleys, and cross references --
  774. Xand they were developed in the order listed, so this paper will treat each
  775. Xin turn, discussing its design, implementation, problems, and
  776. Xprospects for further improvement.
  777. X@End @Section
  778. END_OF_FILE
  779.   if test 2523 -ne `wc -c <'doc/tr.impl/s1.0'`; then
  780.     echo shar: \"'doc/tr.impl/s1.0'\" unpacked with wrong size!
  781.   fi
  782.   # end of 'doc/tr.impl/s1.0'
  783. fi
  784. if test -f 'doc/tr.impl/s5.4' -a "${1}" != "-c" ; then 
  785.   echo shar: Will not clobber existing file \"'doc/tr.impl/s5.4'\"
  786. else
  787.   echo shar: Extracting \"'doc/tr.impl/s5.4'\" \(4726 characters\)
  788.   sed "s/^X//" >'doc/tr.impl/s5.4' <<'END_OF_FILE'
  789. X@SubSection
  790. X    @Tag { lookahead }
  791. X    @Title { The limited lookahead problem }
  792. X@Begin
  793. X@PP
  794. XBasser Lout assumes that there will be enough internal memory to hold
  795. Xthe symbol table plus a few pages, but not an entire document.  This
  796. Xsection describes the consequent problems and how they were solved.
  797. XOther interpreters, notably interactive editors running on virtual
  798. Xmemory systems, would not necessarily need this assumption.
  799. X@PP
  800. XAlthough Basser Lout can read and format any legal input, its memory
  801. Xconsumption will be optimized when the bulk of the document resides in
  802. Xgalleys whose targets can be identified at the moment they are
  803. Xencountered.  Let us take the typical example of a root galley which
  804. Xis a list of pages, a @Code "@BodyText" galley targeted into the
  805. Xpages, @Code "@Chapter" galleys targeted into {@Code "@BodyText"},
  806. Xand @Code "@Section" galleys targeted into the @Code "@Chapter"
  807. Xgalleys:
  808. X@ID @Code {
  809. X"@PageList"
  810. X"//"
  811. X"@BodyText"
  812. X"//"
  813. X"@Chapter {"
  814. X"    @Section { ... }"
  815. X"    @Section { ... }"
  816. X"    ..."
  817. X"    @Section { ... }"
  818. X"}"
  819. X"@Chapter {"
  820. X"    ..."
  821. X"}"
  822. X}
  823. XBasser Lout is able to read and process such galleys one paragraph at
  824. Xa time (strictly, from one @Code "//" at the outer level of a galley
  825. Xto the next), as we now describe.
  826. X@PP
  827. XWhen the parser encounters the beginning of a galley, like @Code "@Chapter"
  828. Xor {@Code "@Section"}, it initiates a new galley process.  The special
  829. Xreceptive symbol @Code "@Input" is substituted for the as yet
  830. Xunread right parameter of the galley.  As each paragraph of the right
  831. Xparameter is read, it is deleted from the parse tree and injected into
  832. Xthe galley's {@Code "@Input"}.  The galley is then resumed.  The parser
  833. Xthus acts as an extra
  834. Xconcurrent process; it has low priority, so that input is read only when
  835. Xthere is nothing else to do.  Since galleys may be nested, a stack of
  836. X@Code "@Input" symbols is needed, each with its own environment and
  837. Xstyle.  If a galley is encountered for which a target is not immediately
  838. Xidentifiable (a footnote, for example), it is read in its entirety and
  839. Xhung in pure parse tree form from an @I UNATTACHED index in the usual way,
  840. Xwith an environment but without a style.  It will be flushed later
  841. Xwhen its component is promoted.
  842. X@PP
  843. XIn addition to producing a steady flow of components from input, we must
  844. Xalso ensure that receptive symbols do not unduly block their
  845. Xpromotion.  The @Code "@FootSect" symbol at the foot of each page is a
  846. Xtypical example:  until it is deleted the page cannot be printed.
  847. X@PP
  848. XReceptive symbols are expanded only on demand, so @Code "@FootSect" can
  849. Xbe deleted as soon as we can prove that it is not wanted.  The symbol
  850. Xtable can tell us that only @Code "@FootNote" galleys (with
  851. X@Code "@FootPlace&&following" targets) want it, so it might be possible
  852. Xto deduce that @Code "@FootSect" may be deleted as soon as body text
  853. Xenters the following page.
  854. X@PP
  855. XThe author was unable to make this work, so Basser Lout requires the
  856. Xuser to identify those galleys which will carry the bulk of the document
  857. X({@Code "@Chapter"}, {@Code "@Section"}, {@Code "@BodyText"}) as
  858. X{@I {forcing galleys}}, by writing @Code "force into" instead of
  859. X@Code "into" in their definitions.  As described in the previous
  860. Xsection, when a forcing galley attaches to a target, all receptive
  861. Xsymbols preceding the target in its galley are deleted, removing all
  862. Ximpediments to flushing.  For example, when a forcing body text galley
  863. Xenters a new page, the @Code "@FootSect" symbol on the preceding page
  864. Xwill be deleted.  It seems likely that a system which could afford to
  865. Xwait until all input was read before deleting any receptive symbols
  866. Xwould not need forcing galleys.
  867. X@PP
  868. XGalleys whose targets are a long way from their invocation points can be
  869. Xa problem.  If the direction is {@Code "following"}, such galleys are
  870. Xheld in internal memory for a long time, unless they are to be
  871. Xsorted.  If the direction is
  872. X{@Code "preceding"}, then either the entire intervening document must be
  873. Xheld in memory (prevented by the target from flushing), or else some
  874. Xforcing galley prematurely deletes the target, leaving the galley bereft.
  875. X@PP
  876. XThe typical example of the latter case occurs when the galley is an
  877. Xentry in the table of contents, launched backwards from the beginning of
  878. Xa chapter or section.  Its target in the table of contents will have
  879. Xbeen deleted long before, to permit the rest of the document to print,
  880. Xso the galley ultimately emerges as an unattached galley promoted out of
  881. Xthe root galley.  All such galleys are written to an auxiliary file,
  882. Xindexed by the missing target.  On the next run, just before that target
  883. Xis deleted, the auxiliary file is checked and any galleys for it are
  884. Xread in and flushed.
  885. X@End @SubSection
  886. END_OF_FILE
  887.   if test 4726 -ne `wc -c <'doc/tr.impl/s5.4'`; then
  888.     echo shar: \"'doc/tr.impl/s5.4'\" unpacked with wrong size!
  889.   fi
  890.   # end of 'doc/tr.impl/s5.4'
  891. fi
  892. if test -f 'doc/tr.impl/s5.5' -a "${1}" != "-c" ; then 
  893.   echo shar: Will not clobber existing file \"'doc/tr.impl/s5.5'\"
  894. else
  895.   echo shar: Extracting \"'doc/tr.impl/s5.5'\" \(4791 characters\)
  896.   sed "s/^X//" >'doc/tr.impl/s5.5' <<'END_OF_FILE'
  897. X@SubSection
  898. X    @Tag { horizontal }
  899. X    @Title { Horizontal galleys }
  900. X@Begin
  901. X@PP
  902. XThere is a strong analogy between breaking a column of text into
  903. Xpage-sized pieces, and breaking a paragraph into line-sized pieces.  In
  904. Xfact, the two differ only in direction:  vertical for body text,
  905. Xhorizontal for paragraphs.  In this section we define {@I{horizontal
  906. Xgalleys}}, and show how they provide an unlimited number of paragraph
  907. Xbreaking styles, as well as solve some other problems.  Regrettably,
  908. Xlack of time has prevented their incorporation into the Basser Lout
  909. Xinterpreter.
  910. X@PP
  911. XImagine a galley whose components are separated by horizontal
  912. Xconcatenation operators instead of vertical ones, perhaps indicated by a
  913. X@Code { horizontally into } clause.  Then all object breaking, including
  914. Xparagraph breaking, could be replaced by galley component promotion like
  915. Xthis:
  916. X@ID @Code {
  917. X"def @Paragraph right x"
  918. X"{"
  919. X"    def @LinePlace { @Galley }"
  920. X""
  921. X"    def @LineList"
  922. X"    {"
  923. X"        @HExpand @LinePlace"
  924. X"        //1vx  @LineList"
  925. X"    }"
  926. X""
  927. X"    def @Par horizontally into { @LinePlace&&preceding }"
  928. X"        right x"
  929. X"    { x }"
  930. X""
  931. X"    @LineList  //  @Par { 0.2i @Wide {}  &0i  x  &1rt }"
  932. X"}"
  933. X}
  934. XThe @Code "@HExpand" operator, which is a primitive of Basser Lout,
  935. Xhorizontally expands the gaps in its right parameter until the result
  936. Xfills the available space, thus implementing line adjustment, except
  937. Xwhen the parameter contains tabulation gaps like {@Code "&1rt"}, which
  938. Xcause the parameter to be already expanded.  The result of
  939. X@ID @Code "@Paragraph { A short paragraph of text. }"
  940. Xwould then be something like
  941. X@ID 1.5i @Wide {
  942. X0.2i @Wide {} & A short paragraph of text.
  943. X}
  944. Xdepending on the available horizontal space.  An unlimited range of
  945. Xparagraph breaking styles could be defined, including ragged right, ragged
  946. Xleft, break-and-center, and so on.
  947. X@PP
  948. XIn Basser Lout, indented paragraphs are produced by preceding them with
  949. Xa horizontal concatenation operator, for example {@Code "|0.5i"}.  This
  950. Xhas the unfortunate effect of making an indented paragraph into a single
  951. Xcomponent of the enclosing galley, so that it will always be kept
  952. Xtogether on one page.  Horizontal galleys solve this problem with a
  953. Xsimple change to {@Code "@LineList"}:
  954. X@ID @Code {
  955. X"def @LineList"
  956. X"{"
  957. X"    |0.5i  @HExpand @LinePlace"
  958. X"    //1vx  @LineList"
  959. X"}"
  960. X}
  961. Xshowing the flexibility that comes from bringing the full power of the
  962. XLout language to bear on paragraph layout.  It is easy to make provision
  963. Xfor a tag on the first line.
  964. X@PP
  965. XAlthough Basser Lout permits receptive symbols within paragraphs, they
  966. Xare of little use, because their available width is calculated after
  967. Xparagraph breaking, and the incoming galley cannot spread over more than
  968. Xone line.  With horizontal galleys, such symbols would have infinite
  969. Xavailable width, and we could easily produce a filled paragraph of
  970. Xfootnotes like this:
  971. X@ID 3.5i @Wide {
  972. X@OneRow { -2p @Font 1 ^/0.3vo } & See Jones and Saunders (1982). &2m
  973. X@OneRow { -2p @Font 2 ^/0.3vo } & Or so Jacobsen (1973) asserts. &2m
  974. X@OneRow { -2p @Font 3 ^/0.3vo } & {@I ibid}, p. 327.
  975. X}
  976. Xbased on an infinite horizontal sequence of @Code "@FootPlace" symbols
  977. Xinside a horizontal galley.
  978. X@PP
  979. XWhen body text is placed on pages, the length of each column varies
  980. Xdepending on the available vertical space.  Horizontal galleys could
  981. Xanalogously produce lines of varying length, and so could fill
  982. Xnon-rectangular shapes.
  983. X@PP
  984. XAn important theoretical benefit of horizontal galleys is that they
  985. Xwould permit horizontal and vertical to be treated in a perfectly
  986. Xsymmetrical way, whereas at present paragraph breaking is horizontal
  987. Xonly, and galley breaking is vertical only.  This must simplify the
  988. Xtreatment of non-European languages which fill in unusual directions,
  989. Xalthough it is not itself sufficient to implement them.
  990. X@PP
  991. XThere are a few minor problems with horizontal galleys.  First, the
  992. Xsyntactic overhead of enclosing each paragraph in @Code "@Paragraph { ... }"
  993. Xor whatever is unacceptable.  Permitting user-defined operators to have lower
  994. Xprecedence than the white space between two words might help here.  Second,
  995. Xthe built-in paragraph breaker includes hyphenation, and it permits line
  996. Xbreaks in the input to determine line breaks in the output, if
  997. Xdesired.  These features must somehow be preserved.  Finally, we have
  998. Xexplained how the Basser Lout interpreter assigns equal width to the
  999. Xwider columns of tables (Section {@NumberOf style}).  The equivalent
  1000. Xsituation in vertical galleys occurs when two receptive symbols compete
  1001. Xfor vertical space (e.g. @Code "@TextPlace" and {@Code "@FootSect"}),
  1002. Xand there it is conventional to grant as much as required to the first
  1003. Xarrival.  It is not clear to the author how these different approaches
  1004. Xcan be reconciled.
  1005. X@End @SubSection
  1006. END_OF_FILE
  1007.   if test 4791 -ne `wc -c <'doc/tr.impl/s5.5'`; then
  1008.     echo shar: \"'doc/tr.impl/s5.5'\" unpacked with wrong size!
  1009.   fi
  1010.   # end of 'doc/tr.impl/s5.5'
  1011. fi
  1012. if test -f 'doc/tr.impl/s6.2' -a "${1}" != "-c" ; then 
  1013.   echo shar: Will not clobber existing file \"'doc/tr.impl/s6.2'\"
  1014. else
  1015.   echo shar: Extracting \"'doc/tr.impl/s6.2'\" \(4579 characters\)
  1016.   sed "s/^X//" >'doc/tr.impl/s6.2' <<'END_OF_FILE'
  1017. X@SubSection
  1018. X    @Tag { cross.impl }
  1019. X    @Title { Implementation of cross references }
  1020. X@Begin
  1021. X@PP
  1022. XBefore an object can be sized and printed, the values of any cross
  1023. Xreferences within it must be known.  If they refer to invocations that
  1024. Xhave not yet been read, there is a problem.  Scribe [7]
  1025. Xsolves it by capitalizing on the fact that documents are formatted
  1026. Xrepeatedly during the drafting process.  All tagged invocations are
  1027. Xcopied to an auxiliary file during the first run, and indexed for quick
  1028. Xretrieval on the second.  A new auxiliary file is written during the second
  1029. Xrun, for retrieval on the third, and so on.  Cross references always lag
  1030. Xone run behind the rest of the document; a perfect copy may be produced
  1031. Xby formatting the same version twice, except in a few pathological cases
  1032. Xthat fail to converge.
  1033. X@PP
  1034. XCross referencing in Lout is implemented on top of a simple database
  1035. Xsystem.  Each database is either writable or readable but not both at
  1036. Xonce, and holds a set of key-value entries:  the keys are @S ASCII
  1037. Xstrings, and the values are Lout objects, possibly with environments,
  1038. Xwritten in Lout source.  Operations are provided for writing an entry,
  1039. Xconverting from writable to readable, retrieval by key, and sequential
  1040. Xretrieval in key order.
  1041. X@PP
  1042. XThe implementation, which is quite unsophisticated, employs one or more
  1043. X@S ASCII {@I{ database files}}, containing the values, and one @S ASCII
  1044. X{@I{ index file}} per database, containing the keys.  To write an entry,
  1045. Xthe value is first appended to a database file, then a line like
  1046. X@ID @Code "@Chapter&&intro  ch1.ld  57"
  1047. Xis appended to the index file, giving the file and offset where the value
  1048. Xis stored.  To convert from writable to readable, the index file is
  1049. Xsorted.  Then retrieval by key requires a binary search of the index
  1050. Xfile and one seek into a database file, and sequential retrieval by key
  1051. Xis trivial.
  1052. X@PP
  1053. XThis database system is used in several ways.  For an external database,
  1054. Xsay of bibliographic references, the user creates the database file of
  1055. Xvalues (without environments), Lout creates the index file whenever it
  1056. Xcannot find one, and retrievals by key proceed as usual.  Cross
  1057. Xreferences with tags other than @Code preceding and @Code following are
  1058. Xtreated as described above, by writing all tagged invocations (with
  1059. Xenvironments) to a single database, which is converted to readable at
  1060. Xthe end of the run for retrievals on the next run.  Sorted galleys, such
  1061. Xas index entries, are written out indexed by target and key and retrieved
  1062. Xsequentially on the next run.  Unsorted galleys with preceding targets
  1063. Xwhich pop off the top of the root galley without finding a target, such
  1064. Xas entries in tables of contents, are treated similarly, except that they
  1065. Xare indexed by target and a sequence number that preserves their relative
  1066. Xorder during the sort.
  1067. X@PP
  1068. XWhen Lout processes a multi-file document, one cross reference database
  1069. Xfile is written for each input file, but they share a common index
  1070. Xfile.  At end of run, the new index file is sorted and merged with the
  1071. Xold one in such a way as to preserve entries relating to files not read
  1072. Xon the current run.  This provides some support for piecemeal
  1073. Xformatting, but eventually the files must all be formatted together.
  1074. X@PP
  1075. XWhen a @Code preceding or @Code following cross reference is found,
  1076. Xit is attached to a galley index of type @Eq { CROSS_PREC } or
  1077. X{@Eq { CROSS_FOLL }}, together with an automatically generated tag composed
  1078. Xof the current file name and a sequence number.  When a tagged
  1079. Xinvocation is found, it is attached to a @Eq { CROSS_TARG } index.  These
  1080. Xgalley indexes are carried along through the dynamic tree, and
  1081. Xeventually pop off the top of the root galley, at which point it is easy
  1082. Xto determine which cross references refer to which invocations, since
  1083. Xthe indexes are now in final printed document order.  Each referenced
  1084. Xinvocation is then written to the cross reference database, multiply indexed 
  1085. Xby the generated tags of the associated cross references.  On the next
  1086. Xrun, when the same @Code preceding and @Code following cross references
  1087. Xare found, chances are good that the same tags will be generated, and
  1088. Xthe appropriate values can be retrieved from the database immediately.
  1089. X@PP
  1090. XThis approach was the genesis of the @Code "@Tagged" operator, whose
  1091. Ximplementation is now immediate: for each @Code "@Tagged" operator we
  1092. Xproduce one @Eq { CROSS_PREC } or @Eq { CROSS_FOLL } galley index,
  1093. Xreplacing the generated tag with the right parameter of the @Code "@Tagged"
  1094. Xoperator.  Nothing more is required.
  1095. X@End @SubSection
  1096. END_OF_FILE
  1097.   if test 4579 -ne `wc -c <'doc/tr.impl/s6.2'`; then
  1098.     echo shar: \"'doc/tr.impl/s6.2'\" unpacked with wrong size!
  1099.   fi
  1100.   # end of 'doc/tr.impl/s6.2'
  1101. fi
  1102. if test -f 'doc/tr.lout/ch3.03' -a "${1}" != "-c" ; then 
  1103.   echo shar: Will not clobber existing file \"'doc/tr.lout/ch3.03'\"
  1104. else
  1105.   echo shar: Extracting \"'doc/tr.lout/ch3.03'\" \(4887 characters\)
  1106.   sed "s/^X//" >'doc/tr.lout/ch3.03' <<'END_OF_FILE'
  1107. X@Section
  1108. X   @Title { "@Font" and "@Char" }
  1109. X   @Tag { font }
  1110. X@Begin
  1111. X@PP
  1112. XA @I font
  1113. Xfont. @Index { Fonts }
  1114. Xis a collection of characters which may be
  1115. Xprinted.  Many fonts come in {@I families},
  1116. Xfamily @Index { Family of a font }
  1117. Xface @Index { Face of a font }
  1118. Xwhich are groups of fonts that
  1119. Xhave been designed to go together.  For example, the Times family
  1120. Xincludes the following fonts:
  1121. X@ID { Times Base } @Font {
  1122. X    Base      @Font { Times Base }
  1123. X//1vx Slope     @Font { Times Slope }
  1124. X//1vx Bold       @Font { Times Bold }
  1125. X//1vx BoldSlope @Font { Times BoldSlope }
  1126. X}
  1127. XThus, each font has two names: its @I { family name } (Times,
  1128. XHelvetica, etc.) and its @I { face name } (Base, Slope, etc.).  Times
  1129. XBase is more commonly called Times Roman, and Times Slope is more
  1130. Xcommonly called Times Italic.  Lout avoids these names in favour of
  1131. Xgeneric names which can be applied to many font families.
  1132. X@PP
  1133. XLigatures,
  1134. Xligatures @Index Ligatures
  1135. Xsuch as fl for {@OneCol f}l and fi for {@OneCol f}i, are considered by
  1136. XBasser Lout to be an integral part of the font:  if the font definition
  1137. X(see below) mentions them, they will be used.  Enclosing one of the
  1138. Xletters in @@OneCol is one sure way to disable a ligature.
  1139. X@PP
  1140. XThe @@Font symbol
  1141. Xfont.sym @Index { @@Font symbol }
  1142. Xreturns its right parameter in a font and size specified by its left:
  1143. X@ID {
  1144. X@Code "{ Times Base 12p } @Font"  @I object
  1145. X}
  1146. XThe family and face names must have appeared together in a {@Code fontdef};
  1147. Xthe size is arbitrary and may be given in any one of the {@Code "c"},
  1148. X{@Code "i"}, {@Code "p"}, {@Code "m"}, {@Code "f"}, {@Code "s"}, and
  1149. X{@Code "v"} units of measurement (Section {@NumberOf concatenation}),
  1150. Xalthough @Code 10p and @Code 12p are the most common sizes for text.
  1151. X@PP
  1152. XWhen a @@Font symbol is nested inside the right parameter of
  1153. Xanother @@Font symbol, the inner one determines the font of its
  1154. Xown right parameter.  However, it may be abbreviated so as to inherit
  1155. Xpart of the outer symbol:
  1156. X@ID @Code {
  1157. X"{ Times Base 12p } @Font"
  1158. X"{ hello, Slope @Font hello, 15p @Font hello }"
  1159. X}
  1160. Xhas result
  1161. X@ID {
  1162. X{ Times Base 12p } @Font
  1163. X{ hello, Slope @Font hello, 15p @Font hello }
  1164. X}
  1165. XThe first inner @@Font inherits the outer family and size, changing only
  1166. Xthe face; the second inherits the outer family and face.  When a family
  1167. Xname is given, it must be followed immediately by a face name.  A size
  1168. Xchange always comes last.
  1169. X@PP
  1170. XSizes of the form +{@I length} and --{@I length} may also be used,
  1171. Xmeaning that the font size is to be @I length larger or smaller than
  1172. Xthe inherited value.  For example, --{@Code "2p"} is often used for
  1173. Xsuperscripts and subscripts.  These forms are highly recommended, since
  1174. Xthey don't need to be changed if a decision is made to alter the font
  1175. Xsize of the document as a whole.
  1176. X@PP
  1177. XWhen Lout runs, the first thing it reads is a list of font definitions,
  1178. Xfont.def @Index { @Code fontdef }
  1179. Xlike these:
  1180. X@ID {
  1181. X    @Code "fontdef  Times  Base   {"  @I implementation-dependent  @Code "}"
  1182. X//1vx @Code "fontdef  Times  Slope  {"  @I implementation-dependent  @Code "}"
  1183. X}
  1184. XEach line tells Lout of the existence of a font, and assigns it a family
  1185. Xname and a face name.  There are a few fonts which are the only members
  1186. Xof their families; even though these fonts do not need a face name, they
  1187. Xmust be given one by their {@Code fontdef}.  The part between braces may
  1188. Xvary with different implementations of Lout; it is supposed to contain
  1189. Xthe information Lout needs to work with the font.
  1190. X@PP
  1191. XIn Basser Lout Version 2.05, this implementation-dependent part consists of
  1192. Xa PostScript font name, an
  1193. Xadobe @Index { Adobe Systems, Inc. }
  1194. XAdobe Font Metrics (AFM) file whose FontName entry must agree with the
  1195. XPostScript font name just mentioned, the name of a character encoding
  1196. Xvector (CEV) file, and the word @Code Recode or {@Code NoRecode}, like this:
  1197. X@ID @Code
  1198. X"fontdef  Times  Base  {  Times-Roman  TimesRom.AFM  LoutLatin1.CEV  Recode }"
  1199. XThe files are searched for in standard places.  Consult the Adobe
  1200. XSystems Reference Manual [{@Ref adobe90}] for general information about
  1201. Xfonts and encoding vectors; briefly, an 8-bit character code @I c in
  1202. XLout's input is mapped to the character in the AFM file whose name appears
  1203. Xat position @I c in the CEV file.  If the word NoRecode appears, Lout
  1204. Xassumes that the given encoding vector is already associated with this font
  1205. Xin the PostScript interpreter, and optimizes its output accordingly.
  1206. X@PP
  1207. XThe @@Char symbol
  1208. Xchar @Index { @@Char symbol }
  1209. Xallows a character to be specified by its name (its PostScript name in
  1210. XBasser Lout) rather than by its code:
  1211. X@ID @Code "@Char  nine"
  1212. Xis equivalent to @Code "9" in most fonts.  This is useful as a
  1213. Xdocumentation aid and to be sure of getting the right character even if the
  1214. Xencoding vector of the font is changed.  However @@Char will fail if the
  1215. Xcharacter named is not in the encoding vector of the current font.
  1216. X@End @Section
  1217. END_OF_FILE
  1218.   if test 4887 -ne `wc -c <'doc/tr.lout/ch3.03'`; then
  1219.     echo shar: \"'doc/tr.lout/ch3.03'\" unpacked with wrong size!
  1220.   fi
  1221.   # end of 'doc/tr.lout/ch3.03'
  1222. fi
  1223. if test -f 'doc/tr.over/s4' -a "${1}" != "-c" ; then 
  1224.   echo shar: Will not clobber existing file \"'doc/tr.over/s4'\"
  1225. else
  1226.   echo shar: Extracting \"'doc/tr.over/s4'\" \(5064 characters\)
  1227.   sed "s/^X//" >'doc/tr.over/s4' <<'END_OF_FILE'
  1228. X@Section
  1229. X   @Title { Definitions }
  1230. X@Begin
  1231. X@PP
  1232. XLout permits the user to define operators which take objects as
  1233. Xparameters and return objects as results.  This feature, unremarkable
  1234. Xin itself, has some surprising applications, most notably to a problem
  1235. Xwhich is the litmus test of flexibility in document formatting:  the
  1236. Xspecification of page layout.
  1237. X@PP
  1238. XThe use of operators in document formatting seems to have been pioneered
  1239. Xby the eqn equation formatting language of Kernighan and Cherry
  1240. X[{@Ref kernighan75}].  In eqn, the mathematical formula
  1241. X@ID @Eq { { x sup 2 + 1 } over 4 }
  1242. Xfor example is expressed as
  1243. X@ID @Code "{ x sup 2 + 1 } over 4"
  1244. XThis identical expression is also used in Lout, but in Lout the operators
  1245. X({@Code "sup"}, {@Code over} and so on) have visible definitions which
  1246. Xare easy to modify and extend.
  1247. X@PP
  1248. XFor example, here is the definition of the @Code over operator as it
  1249. Xappears in the Eq equation formatting package [{@Ref kingston92eq}]:
  1250. X@ID @Code {
  1251. X"def over"
  1252. X"    precedence 54"
  1253. X"    associativity left"
  1254. X"    left x"
  1255. X"    right y"
  1256. X"{"
  1257. X"    @OneRow @OneCol"
  1258. X"    {"
  1259. X"        |0.5rt  x"
  1260. X"        ^//0.2f  @HLine"
  1261. X"        //0.2f  |0.5rt  y"
  1262. X"    }"
  1263. X"}"
  1264. X}
  1265. XInvocations of @Code over return the object between the braces, with the
  1266. Xformal parameters @Code x and @Code y replaced by actual parameters
  1267. Xwhich are objects found to the left and right of the @Code over symbol.
  1268. X@PP
  1269. XThe body of @Code over makes a good demonstration of the way in which
  1270. XLout's operators combine together.  All are Lout primitives except
  1271. X{@Code "@HLine"}, which calls upon Lout's graphics primitives to draw a
  1272. Xhorizontal line.  The @Code "//" and @Code "^//" operators are variants
  1273. Xof vertical concatenation which omit mark alignment; the separation
  1274. Xis 0.2 times the current font size.  The two @Code "|0.5rt" operators
  1275. Xcenter each parameter in the column.  Finally, the @Code "@OneRow" and
  1276. X@Code "^//" operators work together to ensure that only one horizontal
  1277. Xmark protrudes, rather than three; the result has the structure
  1278. X@ID @ShowMarks @Eq { { x sup 2 + 1 } over 4 }
  1279. Xand so will be aligned correctly with adjacent parts of the equation.
  1280. X@PP
  1281. XAs is usual in functional languages, sequences are obtained by recursive
  1282. Xdefinitions.  For example, the `leaders' often seen in tables of
  1283. Xcontents can be generated by the definition
  1284. X@ID @Code {
  1285. X"def @Leaders"
  1286. X"{"
  1287. X"    ..   @Leaders"
  1288. X"}"
  1289. X}
  1290. XWhite space after @Code "{" and before @Code "}" is not
  1291. Xsignificant.  The recursion stops when space runs out, so
  1292. X@ID @Code {
  1293. X"1.5i @Wide {"
  1294. X"Chapter 1  @Leaders  5"
  1295. X"}"
  1296. X}
  1297. Xhas result
  1298. X@ID {
  1299. X1.5i @Wide {
  1300. XChapter 1  @Leaders  5
  1301. X}
  1302. X}
  1303. XThe final invocation of @Code "@Leaders" is deleted along with any
  1304. Xpreceding concatenation operator (or white space in this case).
  1305. X@PP
  1306. XThe specification of page layout is a major problem for many document
  1307. Xformatters, because the model of a document as a sequence of pages is
  1308. Xbuilt-in, and an armada of tedious commands is required to communicate
  1309. Xwith this model:  commands for setting page width and height, margins,
  1310. Xcolumns, page header and footer lines, and so on.  Even with all these
  1311. Xcommands, the formatter will be unable to do such a simple thing as draw
  1312. Xa box around each page, if there is no command for it.
  1313. X@PP
  1314. XLout has no built-in model and no such commands.  Instead, a page is an
  1315. Xobject like any other:
  1316. X@ID @Code {
  1317. X"def @Page"
  1318. X"    right x"
  1319. X"{"
  1320. X"    8i @Wide 11i @High"
  1321. X"    {"
  1322. X"        //1i ||1i x ||1i"
  1323. X"        //1i"
  1324. X"    }"
  1325. X"}"
  1326. X}
  1327. XThe result of @Code "@Page" is an eight by eleven inch object containing
  1328. Xthe right parameter within one inch margins.  A document is a vertical
  1329. Xconcatenation of numbered pages:
  1330. X@ID @Code {
  1331. X"def @PageList"
  1332. X"    right @PageNum"
  1333. X"{"
  1334. X"    @Page"
  1335. X"    {"
  1336. X"        |0.5rt  - @PageNum -"
  1337. X"        //0.2i  @TextPlace"
  1338. X"        //1rt   @FootSect"
  1339. X"    }"
  1340. X"    //0i"
  1341. X"    @PageList"
  1342. X"        @Next @PageNum"
  1343. X"}"
  1344. X}
  1345. XThe @Code "@Next" operator is a Lout primitive that returns its right
  1346. Xparameter plus one; all automatic numbering is effected by combining
  1347. Xthis operator with recursion.  The result of @Code "@PageList 1" is
  1348. Xthe object
  1349. X@ID {
  1350. X@LittlePage {
  1351. X|0.5rt - 1 -
  1352. X//1.2vx @Code "@TextPlace"
  1353. X//1rt @Code "@FootSect"
  1354. X}
  1355. X//
  1356. X@LittlePage {
  1357. X|0.5rt - 2 -
  1358. X//1.2vx @Code "@TextPlace"
  1359. X//1rt @Code "@FootSect"
  1360. X}
  1361. X//0.2c
  1362. X8p @Font @Code "@PageList 3"
  1363. X}
  1364. Xwhich has the potential to expand to infinitely many pages.
  1365. X@PP
  1366. XWe conclude this example by defining @Code "@FootSect" to be a small
  1367. Xhoriz&-ontal line above a list of @Code "@FootPlace" symbols:
  1368. X@IL
  1369. X@LI @Code {
  1370. X"def @FootList"
  1371. X"{"
  1372. X"    @FootPlace"
  1373. X"    //0.1i @FootList"
  1374. X"}"
  1375. X}
  1376. X@LI @Code {
  1377. X"def @FootSect"
  1378. X"{"
  1379. X"    1i @Wide @HLine"
  1380. X"    //0.1i @FootList"
  1381. X"}"
  1382. X}
  1383. X@EL
  1384. XThis method of specifying page layout is infinitely more flexible than
  1385. Xthe other, since the full resources of the language may be brought to
  1386. Xbear.  Of course, the {@Code "@PageList"}, {@Code "@FootSect"}, and
  1387. X{@Code "@FootList"} symbols must be expanded only on demand, and we have
  1388. Xyet to see how the {@Code "@TextPlace"} and {@Code "@FootPlace"} symbols
  1389. Xcan be replaced by actual text and footnotes.
  1390. X@End @Section
  1391. END_OF_FILE
  1392.   if test 5064 -ne `wc -c <'doc/tr.over/s4'`; then
  1393.     echo shar: \"'doc/tr.over/s4'\" unpacked with wrong size!
  1394.   fi
  1395.   # end of 'doc/tr.over/s4'
  1396. fi
  1397. if test -f 'doc/tr.over/s5' -a "${1}" != "-c" ; then 
  1398.   echo shar: Will not clobber existing file \"'doc/tr.over/s5'\"
  1399. else
  1400.   echo shar: Extracting \"'doc/tr.over/s5'\" \(4210 characters\)
  1401.   sed "s/^X//" >'doc/tr.over/s5' <<'END_OF_FILE'
  1402. X@Section
  1403. X   @Title { Galleys }
  1404. X@Begin
  1405. X@PP
  1406. XThe fundamental problem with inserting text, footnotes, and floating
  1407. Xfigures into pages is that the process seems impossible to describe in
  1408. Xfunctional terms.  A footnote is entered within a paragraph of text, but
  1409. Xit appears somewhere else:  at the foot of a page.  Some new abstraction
  1410. Xis needed to explain this.
  1411. X@PP
  1412. XThe landscape of features that previous document formatting systems have
  1413. Xintro&-duced at this point can best be described metaphorically, as an
  1414. Xantediluvian swamp populated by dinosaurs and demons, whose air is
  1415. Xfilled with the piteous cries of docu&-ment format designers in torment.
  1416. X@PP
  1417. XLout's solution to this problem is a feature called the @I galley, after
  1418. Xthe metal trays used in manual typesetting.  A galley consists of an
  1419. Xobject plus an indication that the object is to appear somewhere other
  1420. Xthan its invocation point.  For example,
  1421. X@ID {
  1422. X@LittlePageList 1
  1423. X// @LittleEndRunPlace
  1424. X//
  1425. X@LittleText {
  1426. X@Heading { Galleys }
  1427. X@PP
  1428. XThe fundamental problem with inserting text, footnotes, and floating
  1429. Xfigures into pages is that the process seems impossible to describe in
  1430. Xfunctional terms.  A footnote is entered within a para&-graph of text, but
  1431. Xit appears somewhere else:  at the foot of a page.  Some new abstraction
  1432. Xis needed to explain this.
  1433. X}
  1434. X//
  1435. X@LittleEndRun
  1436. X}
  1437. Xis the result of the expression
  1438. X@ID @Code {
  1439. X"@PageList 1"
  1440. X"//"
  1441. X"@Text {"
  1442. X"@Heading { Galleys }"
  1443. X"@PP"
  1444. X"The fundamental ..."
  1445. X"... to explain this."
  1446. X"}"
  1447. X}
  1448. XThe only new definitions required are these:
  1449. X@ID @Code {
  1450. X"def @TextPlace { @Galley }"
  1451. X""
  1452. X"def @Text"
  1453. X"    into { @TextPlace&&preceding }"
  1454. X"    right x"
  1455. X"{ x }"
  1456. X}
  1457. XThey say that @Code "@TextPlace" (which the reader will recall as lying
  1458. Xwithin the pages of {@Code "@PageList"}) is a placeholder for an
  1459. Xincoming galley, and that @Code "@Text" is a galley whose result is to
  1460. Xappear, not where @Code "@Text" is invoked, but rather at some
  1461. X@Code "@TextPlace" preceding that point of invocation in the final
  1462. Xprinted document.
  1463. X@PP
  1464. XAlthough the abstraction can be understood in a static way, it is
  1465. Xhelpful to trace what happens when the Basser Lout batch formatter reads
  1466. Xthe expression above.
  1467. X@PP
  1468. XSince @Code "@PageList 1" indirectly con&-tains the special @Code "@Galley"
  1469. Xsymbol, it will be expanded only upon demand.  The discovery of the
  1470. X@Code "@Text" galley initiates a search for a {@Code "@TextPlace"},
  1471. Xwhich is found within {@Code "@PageList 1"} and so forces one such
  1472. Xexpansion.  The available width at this @Code "@TextPlace" is six
  1473. Xinches, so the @Code "@Text" galley is broken into six-inch components
  1474. Xwhich are promoted one by one until the available height (nine inches)
  1475. Xis exhausted.  Since the @Code "@Text" galley is not entirely consumed,
  1476. Xa forward search of the docu&-ment is made, another @Code "@TextPlace" is
  1477. Xfound within the as yet unexpanded {@Code "@PageList 2"}, and the
  1478. Xprocess is repeated.
  1479. X@PP
  1480. XThe treatment of footnotes is the same, except that
  1481. X@ID @Code {
  1482. X"def @FootNote"
  1483. X"    into { @FootPlace&&following }"
  1484. X}
  1485. Xis used to make the footnote appear later in the finished document than its
  1486. Xinvocation point.  Basser Lout suspends the promotion of text into pages
  1487. Xjust after the component containing the footnote's invocation point is
  1488. Xpromoted, switches to the placement of the footnote galley, then resumes
  1489. Xthe body text.
  1490. X@PP
  1491. XA collection of galleys all targeted to the same place may optionally
  1492. Xappear sorted on a designated key, thus implementing sorted reference
  1493. Xlists and indexes.  The author was obliged to make the sorting option a
  1494. Xprimitive feature, since it otherwise seems to require boolean operators
  1495. Xwhich he preferred to exclude.
  1496. X@PP
  1497. XThe @Code "@PageList" object which receives the @Code "@Text" galley
  1498. Xcan itself be viewed as a galley whose components are pages, and this
  1499. Xleads to a dynamic view of Lout document assembly as a tree of galleys, each
  1500. Xpromoting into its parent, with the root galley promoting into the
  1501. Xoutput file.  For example, the BookLayout package [{@Ref kingston92begin}]
  1502. Xhas @Code "@Section" galleys promoting into @Code "@Chapter" galleys
  1503. Xpromoting into a single @Code "@PageList" galley, which promotes into
  1504. Xthe output; no limit is imposed on the height of the tree.
  1505. X@End @Section
  1506. END_OF_FILE
  1507.   if test 4210 -ne `wc -c <'doc/tr.over/s5'`; then
  1508.     echo shar: \"'doc/tr.over/s5'\" unpacked with wrong size!
  1509.   fi
  1510.   # end of 'doc/tr.over/s5'
  1511. fi
  1512. if test -f 'doc/tr.tab/s6' -a "${1}" != "-c" ; then 
  1513.   echo shar: Will not clobber existing file \"'doc/tr.tab/s6'\"
  1514. else
  1515.   echo shar: Extracting \"'doc/tr.tab/s6'\" \(4658 characters\)
  1516.   sed "s/^X//" >'doc/tr.tab/s6' <<'END_OF_FILE'
  1517. X@Section
  1518. X   @Title { Rules, boxes, multi-page tables, etc. }
  1519. X@Begin
  1520. X@PP
  1521. XTab draws four kinds of rules.  @I {Above rules} go across the table
  1522. Xabove a specified row; @I {below rules} go across the table below a
  1523. Xrow.  @I {Between rules} go down the table between any two columns, but
  1524. Xnot before the first or after the last; and @I { side rules } go down
  1525. Xthe two sides:
  1526. X@ID @Code {
  1527. X"@Tab"
  1528. X"    above { no }"
  1529. X"    below { yes }"
  1530. X"    between { single }"
  1531. X"    side { double }"
  1532. X"    @Fmta { ... }"
  1533. X"..."
  1534. X}
  1535. XEach option may have the value @Code no (no rules), @Code yes or
  1536. X@Code single (draw single rules), or @Code double (draw double
  1537. Xrules).  Omitting an option is equivalent to giving it the value
  1538. X{@Code no}.  A rule below one row exactly overstrikes a rule above the
  1539. Xnext, unless a page break intervenes.
  1540. X@PP
  1541. XThese options to @Code "@Tab" will draw all possible rules of the given
  1542. Xtype.  If only some are wanted, there are {@Code above} and
  1543. X{@Code below} options (but no {@Code side} option) for each row symbol:
  1544. X@ID @Code {
  1545. X"@Rowf"
  1546. X"    above { yes }"
  1547. X"    below { double }"
  1548. X"    A { ... }"
  1549. X"    ..."
  1550. X}
  1551. Xand there is a @Code between option for the @Code "!" symbol that
  1552. Xseparates columns in the format options:
  1553. X@ID @Code "@Col A  ! between { double }  @Col B"
  1554. XThe symbols @Code "!!" and @Code "!!!" are abbreviations for
  1555. X@Code "! between { single }" and {@Code "! between { double }"}.  All
  1556. Xthese options override the corresponding @Code "@Tab" options when they
  1557. Xare present; when they are absent, the @Code "@Tab" options hold sway.
  1558. X@PP
  1559. XIt is not hard to assemble a single box around a table, using side
  1560. Xrules, a rule above the first row, and a rule below the last:
  1561. X@ID @Code {
  1562. X"@Tab"
  1563. X"    side { single }"
  1564. X"{"
  1565. X"    @Rowa above { single } ..."
  1566. X"    ..."
  1567. X"    @Rowj below { single } ..."
  1568. X"}"
  1569. X}
  1570. XDouble boxes around a table should be assembled using the following recipe:
  1571. X@ID @Code {
  1572. X"@Tab"
  1573. X"    side { double }"
  1574. X"{"
  1575. X"    @Rowa above { doubleboxabove } ..."
  1576. X"    ..."
  1577. X"    @Rowj below { doubleboxbelow } ..."
  1578. X"}"
  1579. X}
  1580. XThis is a little tedious, but the result is good.
  1581. X@PP
  1582. XThe symbols @Code "@Line" and @Code "@DoubleLine" produce horizontal
  1583. Xsingle and double lines of the width of the column.  Two other symbols,
  1584. X@Code "@Rule" and {@Code "@DoubleRule"}, produce lines which extend into
  1585. Xthe adjacent margins as well.  For example,
  1586. X@CD {
  1587. X@Tab
  1588. X    @Fmta { @Col A }
  1589. X{
  1590. X    @Rowa A { 5^.46 }
  1591. X    @Rowa A { 3^.4159 }
  1592. X    @Rowa A { 5772^ }
  1593. X    @Rowa A { @Line } vmargin { 0i }
  1594. X    @Rowa A { 5909^.0759 }
  1595. X}
  1596. X}
  1597. Xis produced by
  1598. X@ID @Code {
  1599. X"@Tab"
  1600. X"    @Fmta { @Col A }"
  1601. X"{"
  1602. X"    @Rowa A { 5^.46 }"
  1603. X"    @Rowa A { 3^.4159 }"
  1604. X"    @Rowa A { 5772^ }"
  1605. X"    @Rowa A { @Line } vmargin { 0i }"
  1606. X"    @Rowa A { 5909^.0759 }"
  1607. X"}"
  1608. X}
  1609. XOwing to problems behind the scenes, @Code "@Rule" and @Code "@DoubleRule"
  1610. Xfail in aligned columns.
  1611. X@PP
  1612. XThe @Code "@Tab" symbol has a @Code "linewidth" option which determines
  1613. Xthe thickness of all the lines:
  1614. X@ID @Code {
  1615. X"@Tab"
  1616. X"    linewidth { 0.5 pt }"
  1617. X}
  1618. Xshows the default value, 0.5 points.  This cannot be overridden within
  1619. Xthe table.  Double rules are drawn with their centres three line widths
  1620. Xapart.  Tab thinks that rules and double rules occupy no space, so thick
  1621. Xrules may require larger margins.
  1622. X@PP
  1623. XThe tables produced by Tab permit page breaks between any two rows.  The
  1624. Xchoice of page breaks can either be left to Lout, or it can be forced by
  1625. Xplacing the new page symbol @Code "@NP" between two rows.  To
  1626. Xensure that each part of a multi-page table is boxed, the rows preceding
  1627. Xthe page breaks must have @Code below rules, and the rows following them
  1628. Xmust have @Code above rules.  The @Code "@IndentedDisplay" and
  1629. X@Code "@CentredDisplay" symbols of the DocumentLayout package prevent
  1630. Xpage breaks in the thing displayed, so they cannot be used to display
  1631. Xmulti-page tables; a multi-page table should be displayed at the left
  1632. Xmargin by preceding and following it with {@Code "@DP"}.  To prevent
  1633. Xpage breaks within a small table, either use one of the
  1634. Xdisplay symbols just mentioned or else use @Code "@OneRow @Tab ...".
  1635. X@PP
  1636. XThe @Code "@HAdjust" symbol from standard Lout can be used to widen a
  1637. Xtable's columns until it occupies the full column width.  The
  1638. Xrecommended arrangement is
  1639. X@ID @Code {
  1640. X"@DP"
  1641. X"@HAdjust @Tab"
  1642. X"   ..."
  1643. X"@DP"
  1644. X}
  1645. Xsince @Code "@HAdjust" is not effective within displays.
  1646. X@PP
  1647. XExpert users might occasionally find a use for the @Code "@MarkRow"
  1648. Xsymbols.  There is one of them for each @Code "@Row" symbol
  1649. X({@Code "@MarkRowa"} for {@Code "@Rowa"}, etc.).  A @Code "@MarkRow"
  1650. Xsymbol causes the principal mark of the table to pass through its row,
  1651. Xpermitting that row to be aligned with horizontally adjacent objects.
  1652. X@End @Section
  1653. END_OF_FILE
  1654.   if test 4658 -ne `wc -c <'doc/tr.tab/s6'`; then
  1655.     echo shar: \"'doc/tr.tab/s6'\" unpacked with wrong size!
  1656.   fi
  1657.   # end of 'doc/tr.tab/s6'
  1658. fi
  1659. if test -f 'include/book' -a "${1}" != "-c" ; then 
  1660.   echo shar: Will not clobber existing file \"'include/book'\"
  1661. else
  1662.   echo shar: Extracting \"'include/book'\" \(4205 characters\)
  1663.   sed "s/^X//" >'include/book' <<'END_OF_FILE'
  1664. X
  1665. X###############################################################################
  1666. X#                                                                             #
  1667. X#  Setup file for invoking @DocumentLayout for books                          #
  1668. X#                                                                             #
  1669. X#  Jeffrey H. Kingston                                                        #
  1670. X#  22 December 1992                                                           #
  1671. X#                                                                             #
  1672. X###############################################################################
  1673. X
  1674. X@SysInclude { ft  }
  1675. X@SysInclude { dl  }
  1676. X# @SysInclude { eq  }
  1677. X# @SysInclude { tab }
  1678. X# @SysInclude { pas }
  1679. X# @SysInclude { fig }
  1680. X
  1681. X@Use { @DocumentLayout
  1682. X  # @InitialFont       {  Times Base 12p } # initial font
  1683. X  # @InitialBreak      {  adjust 1.20fx  } # initial break
  1684. X  # @Hyphenate         {  Yes            } # Want hyphenation? Yes or No
  1685. X  # @MajorHeadingFont  {  Bold 2.0f      } # font for major headings
  1686. X  # @HeadingFont       {  Bold           } # font for ordinary headings
  1687. X  # @MinorHeadingFont  {  Bold           } # font for minor headings
  1688. X  # @BookCoverFont     {  Helvetica Base } # font for book cover
  1689. X
  1690. X  # @ParaGap           {  1.30vx         } # gap between paragraphs
  1691. X  # @ParaIndent        {  2.00f          } # paragraph first-line indent
  1692. X
  1693. X  # @DispGap           {  1.00v          } # gap above and below displays
  1694. X  # @DispIndent        {  2.00f          } # @IndentedDisplay indent
  1695. X  # @DefaultIndent     {  0.5rt          } # @Display indent
  1696. X  # @WideIndent        {  4.00f          } # @WideTaggedList indent
  1697. X  # @VeryWideIndent    {  8.00f          } # @VeryWideTaggedList indent
  1698. X
  1699. X  # @PageWidth         { 21.00c          } # width of page
  1700. X  # @PageHeight        { 29.70c          } # height of page
  1701. X  # @PageMargin        {  2.50c          } # size of all four margins
  1702. X  # @Columns           {  Single         } # Single, Double, Multi
  1703. X  # @DoubleColWidth    {  7.50c          } # column width used by Double
  1704. X  # @MultiColWidth     {  4.67c          } # column width used by Multi
  1705. X  # @ColGap            {  1.00c          } # gap between columns
  1706. X  # @TopGap            {  0.75c          } # gap between figures
  1707. X  # @MidGap            {  0.75c          } # gap above and below body text
  1708. X
  1709. X  # @FootNoteFont      {  0.80f          } # font for footnotes
  1710. X  # @FootNoteBreak     {  1.20fx         } # break for footnotes
  1711. X  # @FootLen           {  2.00c          } # footnote line and indent size
  1712. X  # @ColFootLen        {  1.20c          } # @FootLen when Double, Multi
  1713. X  # @FootGap           {  0.20c          } # gap between footnotes
  1714. X
  1715. X    @MakeIndex         {  Yes            } # Want index? Yes or No
  1716. X  # @IndexColumns      {  Double         } # Single, Double, Multi
  1717. X
  1718. X    @TableOfContents   {  Yes            } # Want contents? Yes or No
  1719. X  # @MajorContentsGap  {  1.30v          } # gap above major entry
  1720. X  # @ContentsGap       {  1.00v          } # gap above ordinary entry
  1721. X
  1722. X  # @ChapterNumbers    {  Yes            } # Yes or No            
  1723. X  # @SectionNumbers    {  Yes            } # Yes or No            
  1724. X  # @SubSectionNumbers {  Yes            } # Yes or No            
  1725. X  # @AppendixNumbers   {  Yes            } # Yes or No            
  1726. X  # @SubAppendixNumbers{  Yes            } # Yes or No            
  1727. X  # @ChapterGap        {  1.10b          } # gap before each chapter
  1728. X  # @SectionGap        {  2.00v          } # gap before each section
  1729. X  # @SubSectionGap     {  1.50v          } # gap before each subsection
  1730. X    @AppendixGap       {  1.10b          } # gap before each appendix
  1731. X  # @SubAppendixGap    {  2.00v          } # gap before each subappendix
  1732. X
  1733. X  # @PageNumbers       {  Yes            } # Want page numbers? Yes or No
  1734. X  # @FirstPageNumber   {  1              } # Number of first page 
  1735. X  # @RunningTitles     {  Yes            } # Want running titles? Yes/No
  1736. X
  1737. X  # @PageOneTopFormat  { @Null               }
  1738. X  # @PageOneFootFormat { @Null               }
  1739. X  # @PageTopFormat     { |0.5rt - @PageNum - }
  1740. X  # @PageFootFormat    { @Null               }
  1741. X    @BookTitleFormat   { {Bold 2.0f} @Font {//2.0f @Title //0.5f} } 
  1742. X}
  1743. END_OF_FILE
  1744.   if test 4205 -ne `wc -c <'include/book'`; then
  1745.     echo shar: \"'include/book'\" unpacked with wrong size!
  1746.   fi
  1747.   # end of 'include/book'
  1748. fi
  1749. if test -f 'include/tl' -a "${1}" != "-c" ; then 
  1750.   echo shar: Will not clobber existing file \"'include/tl'\"
  1751. else
  1752.   echo shar: Extracting \"'include/tl'\" \(4161 characters\)
  1753.   sed "s/^X//" >'include/tl' <<'END_OF_FILE'
  1754. X
  1755. X###############################################################################
  1756. X#                                                                             #
  1757. X#  Lout @ToyLayout package (Jeff Kingston, July 1993)                         #
  1758. X#                                                                             #
  1759. X#  In response to a user request I have put together this tiny package for    #
  1760. X#  people to play with who want to start learning how to do page layout and   #
  1761. X#  galleys with Lout.  It produces a very simple sequence of pages.  To       #
  1762. X#  invoke the package, run "lout myfile > op" where myfile looks like this:   #
  1763. X#                                                                             #
  1764. X#     @SysInclude { tl }                                                      #
  1765. X#     @Use { @ToyLayout }                                                     #
  1766. X#     @Document                                                               #
  1767. X#     //                                                                      #
  1768. X#     @Text {                                                                 #
  1769. X#     Any text you like here, using @I, @B, @Heading, @PP, @LP, @DP,          #
  1770. X#     @LeftDisplay, @IndentedDisplay, and @CenteredDisplay just as in         #
  1771. X#     DocumentLayout.                                                         #
  1772. X#     }                                                                       #
  1773. X#                                                                             #
  1774. X###############################################################################
  1775. X
  1776. X@SysInclude { ft }
  1777. X
  1778. Xexport @I @B @Heading @PP @LP @DP @NP
  1779. X       @LeftDisplay @IndentedDisplay @CenteredDisplay
  1780. X       @Text @Document
  1781. X
  1782. Xdef @ToyLayout
  1783. X    named @PageWidth  { 21.0c }
  1784. X    named @PageHeight { 29.7c }
  1785. X@Begin
  1786. X
  1787. X    ###########################################################################
  1788. X    #                                                                         #
  1789. X    #  Font changes, headings, and paragraphs.                                #
  1790. X    #                                                                         #
  1791. X    ###########################################################################
  1792. X
  1793. X    def @I       right x { Slope @Font x      }
  1794. X    def @B       right x { Bold @Font x       }
  1795. X    def @Heading right x { ragged @Break @B x }
  1796. X
  1797. X    macro @PP        { //1.3vx 1.0f @Wide &0i }
  1798. X    macro @LP        { //1.3vx                }
  1799. X    macro @DP        { //0.5v                 }
  1800. X    macro @NP        { //1.1b                 }
  1801. X
  1802. X
  1803. X    ###########################################################################
  1804. X    #                                                                         #
  1805. X    #  Displays.                                                              #
  1806. X    #                                                                         #
  1807. X    ###########################################################################
  1808. X
  1809. X    def @DispPlace { @Galley }
  1810. X
  1811. X    def @Disp into { @DispPlace&&preceding }
  1812. X    right x
  1813. X    {
  1814. X    @OneRow x
  1815. X    }
  1816. X
  1817. X    macro @LeftDisplay     { @DP |       @DispPlace  |  @DP // @Disp   }
  1818. X    macro @IndentedDisplay { @DP |2f     @DispPlace  |  @DP // @Disp   }
  1819. X    macro @CenteredDisplay { @DP |0.5rt  @DispPlace  |  @DP // @Disp   }
  1820. X
  1821. X
  1822. X    ###########################################################################
  1823. X    #                                                                         #
  1824. X    #  Page layout.                                                           #
  1825. X    #                                                                         #
  1826. X    ###########################################################################
  1827. X
  1828. X    def @TextPlace { @Galley }
  1829. X
  1830. X    def @Text force into { @TextPlace&&preceding }
  1831. X        right x
  1832. X    {
  1833. X    x
  1834. X    }
  1835. X
  1836. X    def @Page right x
  1837. X    {    @PageWidth @Wide @PageHeight @High
  1838. X    { Times Base 12p } @Font
  1839. X    { adjust nohyphen 14px } @Break
  1840. X    {   //1i ||1i
  1841. X        @HExpand @VExpand x
  1842. X        ||1i //1i
  1843. X    }
  1844. X    }
  1845. X
  1846. X    def @PageList right num
  1847. X    {
  1848. X    @Page { |0.5rt - num - //0.4i @TextPlace }
  1849. X    //
  1850. X    @PageList @Next num
  1851. X    }
  1852. X
  1853. X    def @Document { @PageList 1 }
  1854. X
  1855. X@End @ToyLayout
  1856. END_OF_FILE
  1857.   if test 4161 -ne `wc -c <'include/tl'`; then
  1858.     echo shar: \"'include/tl'\" unpacked with wrong size!
  1859.   fi
  1860.   # end of 'include/tl'
  1861. fi
  1862. echo shar: End of archive 31 \(of 35\).
  1863. cp /dev/null ark31isdone
  1864. MISSING=""
  1865. 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
  1866.     if test ! -f ark${I}isdone ; then
  1867.     MISSING="${MISSING} ${I}"
  1868.     fi
  1869. done
  1870. if test "${MISSING}" = "" ; then
  1871.     echo You have unpacked all 35 archives.
  1872.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1873. else
  1874.     echo You still must unpack the following archives:
  1875.     echo "        " ${MISSING}
  1876. fi
  1877. exit 0
  1878. exit 0 # Just in case...
  1879.