home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / lout2.lzh / LOUT2 / DOC / TR.OVER / s4 < prev    next >
Text File  |  1994-01-25  |  5KB  |  164 lines

  1. @Section
  2.    @Title { Definitions }
  3. @Begin
  4. @PP
  5. Lout permits the user to define operators which take objects as
  6. parameters and return objects as results.  This feature, unremarkable
  7. in itself, has some surprising applications, most notably to a problem
  8. which is the litmus test of flexibility in document formatting:  the
  9. specification of page layout.
  10. @PP
  11. The use of operators in document formatting seems to have been pioneered
  12. by the eqn equation formatting language of Kernighan and Cherry
  13. [{@Ref kernighan75}].  In eqn, the mathematical formula
  14. @ID @Eq { { x sup 2 + 1 } over 4 }
  15. for example is expressed as
  16. @ID @Code "{ x sup 2 + 1 } over 4"
  17. This identical expression is also used in Lout, but in Lout the operators
  18. ({@Code "sup"}, {@Code over} and so on) have visible definitions which
  19. are easy to modify and extend.
  20. @PP
  21. For example, here is the definition of the @Code over operator as it
  22. appears in the Eq equation formatting package [{@Ref kingston92eq}]:
  23. @ID @Code {
  24. "def over"
  25. "    precedence 54"
  26. "    associativity left"
  27. "    left x"
  28. "    right y"
  29. "{"
  30. "    @OneRow @OneCol"
  31. "    {"
  32. "        |0.5rt  x"
  33. "        ^//0.2f  @HLine"
  34. "        //0.2f  |0.5rt  y"
  35. "    }"
  36. "}"
  37. }
  38. Invocations of @Code over return the object between the braces, with the
  39. formal parameters @Code x and @Code y replaced by actual parameters
  40. which are objects found to the left and right of the @Code over symbol.
  41. @PP
  42. The body of @Code over makes a good demonstration of the way in which
  43. Lout's operators combine together.  All are Lout primitives except
  44. {@Code "@HLine"}, which calls upon Lout's graphics primitives to draw a
  45. horizontal line.  The @Code "//" and @Code "^//" operators are variants
  46. of vertical concatenation which omit mark alignment; the separation
  47. is 0.2 times the current font size.  The two @Code "|0.5rt" operators
  48. center each parameter in the column.  Finally, the @Code "@OneRow" and
  49. @Code "^//" operators work together to ensure that only one horizontal
  50. mark protrudes, rather than three; the result has the structure
  51. @ID @ShowMarks @Eq { { x sup 2 + 1 } over 4 }
  52. and so will be aligned correctly with adjacent parts of the equation.
  53. @PP
  54. As is usual in functional languages, sequences are obtained by recursive
  55. definitions.  For example, the `leaders' often seen in tables of
  56. contents can be generated by the definition
  57. @ID @Code {
  58. "def @Leaders"
  59. "{"
  60. "    ..   @Leaders"
  61. "}"
  62. }
  63. White space after @Code "{" and before @Code "}" is not
  64. significant.  The recursion stops when space runs out, so
  65. @ID @Code {
  66. "1.5i @Wide {"
  67. "Chapter 1  @Leaders  5"
  68. "}"
  69. }
  70. has result
  71. @ID {
  72. 1.5i @Wide {
  73. Chapter 1  @Leaders  5
  74. }
  75. }
  76. The final invocation of @Code "@Leaders" is deleted along with any
  77. preceding concatenation operator (or white space in this case).
  78. @PP
  79. The specification of page layout is a major problem for many document
  80. formatters, because the model of a document as a sequence of pages is
  81. built-in, and an armada of tedious commands is required to communicate
  82. with this model:  commands for setting page width and height, margins,
  83. columns, page header and footer lines, and so on.  Even with all these
  84. commands, the formatter will be unable to do such a simple thing as draw
  85. a box around each page, if there is no command for it.
  86. @PP
  87. Lout has no built-in model and no such commands.  Instead, a page is an
  88. object like any other:
  89. @ID @Code {
  90. "def @Page"
  91. "    right x"
  92. "{"
  93. "    8i @Wide 11i @High"
  94. "    {"
  95. "        //1i ||1i x ||1i"
  96. "        //1i"
  97. "    }"
  98. "}"
  99. }
  100. The result of @Code "@Page" is an eight by eleven inch object containing
  101. the right parameter within one inch margins.  A document is a vertical
  102. concatenation of numbered pages:
  103. @ID @Code {
  104. "def @PageList"
  105. "    right @PageNum"
  106. "{"
  107. "    @Page"
  108. "    {"
  109. "        |0.5rt  - @PageNum -"
  110. "        //0.2i  @TextPlace"
  111. "        //1rt   @FootSect"
  112. "    }"
  113. "    //0i"
  114. "    @PageList"
  115. "        @Next @PageNum"
  116. "}"
  117. }
  118. The @Code "@Next" operator is a Lout primitive that returns its right
  119. parameter plus one; all automatic numbering is effected by combining
  120. this operator with recursion.  The result of @Code "@PageList 1" is
  121. the object
  122. @ID {
  123. @LittlePage {
  124. |0.5rt - 1 -
  125. //1.2vx @Code "@TextPlace"
  126. //1rt @Code "@FootSect"
  127. }
  128. //
  129. @LittlePage {
  130. |0.5rt - 2 -
  131. //1.2vx @Code "@TextPlace"
  132. //1rt @Code "@FootSect"
  133. }
  134. //0.2c
  135. 8p @Font @Code "@PageList 3"
  136. }
  137. which has the potential to expand to infinitely many pages.
  138. @PP
  139. We conclude this example by defining @Code "@FootSect" to be a small
  140. horiz&-ontal line above a list of @Code "@FootPlace" symbols:
  141. @IL
  142. @LI @Code {
  143. "def @FootList"
  144. "{"
  145. "    @FootPlace"
  146. "    //0.1i @FootList"
  147. "}"
  148. }
  149. @LI @Code {
  150. "def @FootSect"
  151. "{"
  152. "    1i @Wide @HLine"
  153. "    //0.1i @FootList"
  154. "}"
  155. }
  156. @EL
  157. This method of specifying page layout is infinitely more flexible than
  158. the other, since the full resources of the language may be brought to
  159. bear.  Of course, the {@Code "@PageList"}, {@Code "@FootSect"}, and
  160. {@Code "@FootList"} symbols must be expanded only on demand, and we have
  161. yet to see how the {@Code "@TextPlace"} and {@Code "@FootPlace"} symbols
  162. can be replaced by actual text and footnotes.
  163. @End @Section
  164.