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.LOUT / ch4.05 < prev    next >
Text File  |  1994-01-25  |  8KB  |  239 lines

  1. @Section
  2.    @Title { Bibliographies }
  3.    @Tag { biblio }
  4. @Begin
  5. @PP
  6. bibliographies @Index { Bibliographies }
  7. The first step in the production of a bibliography is to create a
  8. database of references based on the definition
  9. reference.example @Index { @Code "@Reference" example }
  10. @ID @Code {
  11.       "export @Type @Author @Title @Institution @Number @Publisher"
  12. //1vx "       @Year @Proceedings @Journal @Volume @Pages @Comment"
  13. //1vx ""
  14. //1vx "def @Reference"
  15. //1vx "   named @Tag"         |2f  "{ TAG? }"
  16.  /1vx "   named @Type"        |    "{ TYPE? }"
  17.  /1vx "   named @Author"      |    "{ AUTHOR? }"
  18.  /1vx "   named @Title"       |    "{ TITLE? }"
  19.  /1vx "   named @Institution" |    "{ INSTITUTION? }"
  20.  /1vx "   named @Number"      |    "{ NUMBER? }"
  21.  /1vx "   named @Publisher"   |    "{ PUBLISHER? }"
  22.  /1vx "   named @Year"        |    "{ YEAR? }"
  23.  /1vx "   named @Proceedings" |    "{ PROCEEDINGS? }"
  24.  /1vx "   named @Journal"     |    "{ JOURNAL? }"
  25.  /1vx "   named @Volume"      |    "{ VOLUME? }"
  26.  /1vx "   named @Pages"       |    "{ PAGES? }"
  27.  /1vx "   named @Comment"     |    "{ @Null }"
  28. //1vx "{ @Null }"
  29. }
  30. For example, the database might contain
  31. @IL
  32. @LI @Code {
  33. "{ @Reference"
  34. "     @Tag { strunk79 }"
  35. "     @Type { Book }"
  36. "     @Author { Strunk, William and White, E. B. }"
  37. "     @Title { The Elements of Style }"
  38. "     @Publisher { MacMillan, third edition }"
  39. "     @Year { 1979 }"
  40. "}"
  41. }
  42.  
  43. @LI @Code {
  44. "{ @Reference"
  45. "     @Tag { kingston92 }"
  46. "     @Type { TechReport }"
  47. "     @Author { Kingston, Jeffrey H. }"
  48. "     @Title { Document Formatting with Lout (Second Edition) }"
  49. "     @Number { 449 }"
  50. "     @Institution { Basser Department of Computer"
  51. "Science F09, University of Sydney 2006, Australia }"
  52. "     @Year { 1992 }"
  53. "}"
  54. }
  55. @EL
  56. Since named parameters are optional, we have one for every conceivable
  57. type of attribute, and simply leave out those that do not apply in any
  58. particular reference.  We can print a reference by using the @@Open
  59. symbol to get at its attributes:
  60. @ID @Code {
  61. "@Reference&&strunk79 @Open"
  62. "{  @Author,  {Slope @Font @Title}.  @Publisher, @Year.  }"
  63. }
  64. The right parameter of @@Open may use the exported parameters of the
  65. left, and so the result is
  66. @ID {
  67. @Reference&&strunk79 @Open
  68. {  @Author,  {Slope @Font @Title}.  @Publisher, @Year.  } &0io
  69. }
  70. Incidentally, we are not limited to just one database of references;
  71. several @@Database symbols can nominate the same symbol, and invocations of
  72. that symbol can appear in the document itself as well if we wish.
  73. @PP
  74. The second step is to create a database of print styles for the various
  75. types of reference (Book, TechReport, etc.), based on the following
  76. definition:
  77. @ID @Code {
  78. "export @Style"
  79. "def @RefStyle"
  80. "   left @Tag"
  81. "   named @Style right reftag {}"
  82. "{}"
  83. }
  84. Notice that the named parameter @Code "@Style" has a right parameter
  85. {@Code "reftag"}.  The style database has one entry for each type of
  86. reference:
  87. @ID @Code {
  88. "{ Book @RefStyle @Style"
  89. "  {  @Reference&&reftag @Open"
  90. "     { @Author,  {Slope @Font @Title}.  @Publisher, @Year.  @Comment }"
  91. "  }"
  92. "}"
  93. ""
  94. "{ TechReport @RefStyle @Style"
  95. "  {  @Reference&&reftag @Open"
  96. "     { @Author,  {Slope @Font @Title}.  Tech. Rep. @Number (@Year),"
  97. "@Institution.  @Comment }"
  98. "  }"
  99. "}"
  100. }
  101. and so on.  The following prints the reference whose tag is
  102. @Code strunk79 in the Book style:
  103. @ID @Code {
  104. "@RefStyle&&Book @Open { @Style strunk79 }"
  105. }
  106. It has result
  107. @ID {
  108. @RefStyle&&Book @Open { @Style strunk79 } &0io
  109. }
  110. Notice how the @Code "@Style" parameter of @Code "@RefStyle" is given the
  111. parameter {@Code strunk79}, which it uses to open the appropriate
  112. reference.
  113. @PP
  114. We can consult the @Code "@Type" attribute of a reference to find out
  115. its style, which brings us to the following definition for printing out
  116. a reference in the style appropriate to it:
  117. @ID @Code {
  118. "def @RefPrint"
  119. "   right reftag"
  120. "{  @RefStyle&&{ @Reference&&reftag @Open { @Type } }"
  121. "   @Open { @Style reftag }"
  122. "}"
  123. }
  124. For example, to evaluate {@Code "@RefPrint strunk79"}, Lout first
  125. evaluates
  126. @ID @Code {
  127. "@Reference&&strunk79  @Open  { @Type }"
  128. }
  129. whose result is {@Code { @Reference&&strunk79  @Open  { @Type } }},
  130. and then evaluates
  131. @Code {
  132. "@RefStyle&&Book @Open { @Style strunk79 }"
  133. }
  134. as before.  Complicated as this is, with its two databases and clever
  135. passing about of tags, the advantages of separating references from
  136. printing styles are considerable:  printing styles may be changed
  137. easily, and non-expert users need never see them.
  138. @PP
  139. Finally, we come to the problem of printing out a numbered list of
  140. references, and referring to them by number in the body of the
  141. document.  The first step is to create a numbered list of places that
  142. galleys containing references may attach to:
  143. referencesection.example @Index { @Code "@ReferenceSection" example }
  144. @ID @Code {
  145. "def @ReferenceSection"
  146. "    named @Tag {}"
  147. "    named @Title { References }"
  148. "    named @RunningTitle { dft }"
  149. "    named style right tag { tag. }"
  150. "    named headstyle right @Title { @Heading @Title }"
  151. "    named indent { @DispIndent }"
  152. "    named gap { @DispGap }"
  153. "    named start { 1 }"
  154. "{"
  155. "    def @RefList right num"
  156. "    {"
  157. "        @NumberMarker num  &  indent @Wide {style num}  |  @RefPlace"
  158. "        //gap @RefList @Next num"
  159. "    }"
  160. ""
  161. "        @Protect headstyle @Title"
  162. "    //  @PageMarker&&preceding @Tagged @Tag"
  163. "    //  @Title @MajorContentsEntry {@PageOf @Tag}"
  164. "    //  @Runner"
  165. "            @FootEven { |0.5rt 0.8f @Font @B @PageNum }"
  166. "            @FootOdd  { |0.5rt 0.8f @Font @B @PageNum }"
  167. "    //@DispGap  @RefList start"
  168. "    //  @Runner"
  169. "            @TopEven { @B @PageNum }"
  170. "            @TopOdd  { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }"
  171. "}"
  172. }
  173. We place the expression @Code "@ReferenceSection" at the point where we
  174. want the list of references to appear; its value is something like
  175. @ID @Code {
  176. "1.   @RefPlace"
  177. "2.   @RefPlace"
  178. "3.   @RefPlace"
  179. "..."
  180. }
  181. where @Code "@RefPlace" is @Code "@Galley" as usual.  We can scatter
  182. multiple lists of references through the document if we wish (at the end
  183. of each chapter, for example), simply by placing @Code "@ReferenceSection"
  184. at each point.
  185. @PP
  186. Our task is completed by the following definition:
  187. ref.example @Index { @Code "@Ref" example }
  188. @ID @Code {
  189. "def @Ref right x"
  190. "{"
  191. "    def sendref into { @RefPlace&&following }"
  192. "        right @Key"
  193. "    {"
  194. "        @NumberMarker&&preceding @Tagged x  &"
  195. "        @PageMarker&&preceding @Tagged x  &"
  196. "        @RefPrint x"
  197. "    }"
  198. ""
  199. "    @NumberMarker&&x @Open { @Tag } sendref x"
  200. "}"
  201. }
  202. Given this definition, the invocation {@Code "@Ref strunk79"} has result
  203. @ID @Code "@NumberMarker&&strunk79 @Open { @Tag }"
  204. plus the galley {@Code "sendref strunk79"}.  We first
  205. follow what happens to the galley.
  206. @PP
  207. According to its @Code into clause, the galley will replace a
  208. @Code "@RefPlace" in the nearest following {@Code "@ReferenceSection"}.  If
  209. every such galley is a sorted galley whose key is the reference's tag, as
  210. this one is, they will appear sorted by tag.  The galley's object is
  211. @ID @Code {
  212. "@NumberMarker&&preceding @Tagged strunk79  &"
  213. "@PageMarker&&preceding @Tagged strunk79  &"
  214. "@RefPrint strunk79"
  215. }
  216. The result of the @@Tagged symbol is always @@Null, so this prints the
  217. @Code strunk79 reference in the appropriate style at the
  218. {@Code "@RefPlace"}, as desired.
  219. @PP
  220. Now @Code "@NumberMarker&&preceding" is the nearest preceding invocation of
  221. @Code "@NumberMarker" in the final document.  This must be the invocation of
  222. @Code "@NumberMarker" just before the @Code "@RefPlace" that received
  223. the galley, and so this invocation of @Code "@NumberMarker" is given @Code
  224. strunk79 as an additional tag by the @@Tagged symbol.  Its original tag
  225. was the number of the reference place, which means that
  226. @ID @Code {
  227. "@NumberMarker&&strunk79 @Open { @Tag }"
  228. }
  229. has for its result the number of the reference place that received the
  230. @Code strunk79 galley, and this is the desired result of
  231. {@Code "@Ref strunk79"}.
  232. @PP
  233. It might seem that if we refer to the @Code strunk79 reference twice,
  234. two copies will be sent to the reference list and it will appear
  235. twice.  However, when more than one sorted galley with the same key is sent
  236. to the same place, only one of them is printed (Section {@NumberOf galleys});
  237. so provided that sorted galleys are used there is no problem.
  238. @End @Section
  239.