diff options
Diffstat (limited to 'doc/expert/exa_bibl')
-rw-r--r-- | doc/expert/exa_bibl | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/doc/expert/exa_bibl b/doc/expert/exa_bibl new file mode 100644 index 0000000..f1e1930 --- /dev/null +++ b/doc/expert/exa_bibl @@ -0,0 +1,238 @@ +@Section + @Title { Bibliographies } + @Tag { biblio } +@Begin +@PP +bibliographies @Index { Bibliographies } +The first step in the production of a bibliography is to create a +database of references based on the definition +reference.example @Index { @Code "@Reference" example } +@ID @Code { + "export @Type @Author @Title @Institution @Number @Publisher" +//1vx " @Year @Proceedings @Journal @Volume @Pages @Comment" +//1vx "" +//1vx "def @Reference" +//1vx " named @Tag" |2f "{ TAG? }" + /1vx " named @Type" | "{ TYPE? }" + /1vx " named @Author" | "{ AUTHOR? }" + /1vx " named @Title" | "{ TITLE? }" + /1vx " named @Institution" | "{ INSTITUTION? }" + /1vx " named @Number" | "{ NUMBER? }" + /1vx " named @Publisher" | "{ PUBLISHER? }" + /1vx " named @Year" | "{ YEAR? }" + /1vx " named @Proceedings" | "{ PROCEEDINGS? }" + /1vx " named @Journal" | "{ JOURNAL? }" + /1vx " named @Volume" | "{ VOLUME? }" + /1vx " named @Pages" | "{ PAGES? }" + /1vx " named @Comment" | "{ @Null }" +//1vx "{ @Null }" +} +For example, the database might contain +@IL +@LI @Code { +"{ @Reference" +" @Tag { strunk1979style }" +" @Type { Book }" +" @Author { Strunk, William and White, E. B. }" +" @Title { The Elements of Style }" +" @Publisher { MacMillan, third edition }" +" @Year { 1979 }" +"}" +} + +@LI @Code { +"{ @Reference" +" @Tag { kingston92 }" +" @Type { TechReport }" +" @Author { Kingston, Jeffrey H. }" +" @Title { Document Formatting with Lout (Second Edition) }" +" @Number { 449 }" +" @Institution { Basser Department of Computer" +"Science F09, University of Sydney 2006, Australia }" +" @Year { 1992 }" +"}" +} +@EL +Since named parameters are optional, we have one for every conceivable +type of attribute, and simply leave out those that do not apply in any +particular reference. We can print a reference by using the @@Open +symbol to get at its attributes: +@ID @Code { +"@Reference&&strunk1979style @Open" +"{ @Author, {Slope @Font @Title}. @Publisher, @Year. }" +} +The right parameter of @@Open may use the exported parameters of the +left, and so the result is +@ID { +@Reference&&strunk1979style @Open +{ @Author, {Slope @Font @Title}. @Publisher, @Year. } &0io +} +Incidentally, we are not limited to just one database of references; +several @@Database symbols can nominate the same symbol, and invocations of +that symbol can appear in the document itself as well if we wish. +@PP +The second step is to create a database of print styles for the various +types of reference (Book, TechReport, etc.), based on the following +definition: +@ID @Code { +"export @Style" +"def @RefStyle" +" left @Tag" +" named @Style right reftag {}" +"{}" +} +Notice that the named parameter @Code "@Style" has a right parameter +{@Code "reftag"}. The style database has one entry for each type of +reference: +@ID @Code { +"{ Book @RefStyle @Style" +" { @Reference&&reftag @Open" +" { @Author, {Slope @Font @Title}. @Publisher, @Year. @Comment }" +" }" +"}" +"" +"{ TechReport @RefStyle @Style" +" { @Reference&&reftag @Open" +" { @Author, {Slope @Font @Title}. Tech. Rep. @Number (@Year)," +"@Institution. @Comment }" +" }" +"}" +} +and so on. The following prints the reference whose tag is +@Code strunk1979style in the Book style: +@ID @Code { +"@RefStyle&&Book @Open { @Style strunk1979style }" +} +It has result +@ID { +@RefStyle&&Book @Open { @Style strunk1979style } &0io +} +Notice how the @Code "@Style" parameter of @Code "@RefStyle" is given the +parameter {@Code strunk1979style}, which it uses to open the appropriate +reference. +@PP +We can consult the @Code "@Type" attribute of a reference to find out +its style, which brings us to the following definition for printing out +a reference in the style appropriate to it: +@ID @Code { +"def @RefPrint" +" right reftag" +"{ @RefStyle&&{ @Reference&&reftag @Open { @Type } }" +" @Open { @Style reftag }" +"}" +} +For example, to evaluate {@Code "@RefPrint strunk1979style"}, Lout first +evaluates +@ID @Code { +"@Reference&&strunk1979style @Open { @Type }" +} +whose result is {@Code { @Reference&&strunk1979style @Open { @Type } }}, +and then evaluates +@ID @Code { +"@RefStyle&&Book @Open { @Style strunk1979style }" +} +as before. Complicated as this is, with its two databases and clever +passing about of tags, the advantages of separating references from +printing styles are considerable: printing styles may be changed +easily, and non-expert users need never see them. +@PP +Finally, we come to the problem of printing out a numbered list of +references, and referring to them by number in the body of the +document. The first step is to create a numbered list of places that +galleys containing references may attach to: +referencesection.example @Index { @Code "@ReferenceSection" example } +@ID @Code { +"def @ReferenceSection" +" named @Tag {}" +" named @Title { References }" +" named @RunningTitle { dft }" +" named style right tag { tag. }" +" named headstyle right @Title { @Heading @Title }" +" named indent { @DispIndent }" +" named gap { @DispGap }" +" named start { 1 }" +"{" +" def @RefList right num" +" {" +" @NumberMarker num & indent @Wide {style num} | @RefPlace" +" //gap @RefList @Next num" +" }" +"" +" @Protect headstyle @Title" +" // @PageMarker&&preceding @Tagged @Tag" +" // @Title @MajorContentsEntry {@PageOf @Tag}" +" // @Runner" +" @FootEven { |0.5rt 0.8f @Font @B @PageNum }" +" @FootOdd { |0.5rt 0.8f @Font @B @PageNum }" +" //@DispGap @RefList start" +" // @Runner" +" @TopEven { @B @PageNum }" +" @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }" +"}" +} +We place the expression @Code "@ReferenceSection" at the point where we +want the list of references to appear; its value is something like +@ID @Code { +"1. @RefPlace" +"2. @RefPlace" +"3. @RefPlace" +"..." +} +where @Code "@RefPlace" is @Code "@Galley" as usual. We can scatter +multiple lists of references through the document if we wish (at the end +of each chapter, for example), simply by placing @Code "@ReferenceSection" +at each point. +@PP +Our task is completed by the following definition: +ref.example @Index { @Code "@Ref" example } +@ID @Code { +"def @Ref right x" +"{" +" def sendref into { @RefPlace&&following }" +" right @Key" +" {" +" @NumberMarker&&preceding @Tagged x &" +" @PageMarker&&preceding @Tagged x &" +" @RefPrint x" +" }" +"" +" @NumberMarker&&x @Open { @Tag } sendref x" +"}" +} +Given this definition, the invocation {@Code "@Ref strunk1979style"} has result +@ID @Code "@NumberMarker&&strunk1979style @Open { @Tag }" +plus the galley {@Code "sendref strunk1979style"}. We first +follow what happens to the galley. +@PP +According to its @Code into clause, the galley will replace a +@Code "@RefPlace" in the nearest following {@Code "@ReferenceSection"}. If +every such galley is a sorted galley whose key is the reference's tag, as +this one is, they will appear sorted by tag. The galley's object is +@ID @Code { +"@NumberMarker&&preceding @Tagged strunk1979style &" +"@PageMarker&&preceding @Tagged strunk1979style &" +"@RefPrint strunk1979style" +} +The result of the @@Tagged symbol is always @@Null, so this prints the +@Code strunk1979style reference in the appropriate style at the +{@Code "@RefPlace"}, as desired. +@PP +Now @Code "@NumberMarker&&preceding" is the nearest preceding invocation of +@Code "@NumberMarker" in the final document. This must be the invocation of +@Code "@NumberMarker" just before the @Code "@RefPlace" that received +the galley, and so this invocation of @Code "@NumberMarker" is given @Code +strunk1979style as an additional tag by the @@Tagged symbol. Its original tag +was the number of the reference place, which means that +@ID @Code { +"@NumberMarker&&strunk1979style @Open { @Tag }" +} +has for its result the number of the reference place that received the +@Code strunk1979style galley, and this is the desired result of +{@Code "@Ref strunk1979style"}. +@PP +It might seem that if we refer to the @Code strunk1979style reference twice, +two copies will be sent to the reference list and it will appear +twice. However, when more than one sorted galley with the same key is sent +to the same place, only one of them is printed (Section {@NumberOf galleys}); +so provided that sorted galleys are used there is no problem. +@End @Section |