diff options
author | Jeffrey H. Kingston <jeff@it.usyd.edu.au> | 2010-09-14 20:37:12 +0000 |
---|---|---|
committer | Jeffrey H. Kingston <jeff@it.usyd.edu.au> | 2010-09-14 20:37:12 +0000 |
commit | a9f9ae0efa326dc2edc7f2d92ce270f5fdc15b60 (patch) | |
tree | 3f21ea75ffbd40fcd53bf1609782763af3953002 /doc/user | |
parent | 162643f981292504f375a7f834d408a4a0fa7f46 (diff) | |
download | lout-a9f9ae0efa326dc2edc7f2d92ce270f5fdc15b60.tar.gz |
Lout 3.23.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@15 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'doc/user')
-rw-r--r-- | doc/user/README | 13 | ||||
-rw-r--r-- | doc/user/all | 2 | ||||
-rw-r--r-- | doc/user/bas_par1 | 6 | ||||
-rw-r--r-- | doc/user/bas_star | 16 | ||||
-rw-r--r-- | doc/user/bgr_boxs | 4 | ||||
-rw-r--r-- | doc/user/bgr_colo | 6 | ||||
-rw-r--r-- | doc/user/dia | 9 | ||||
-rw-r--r-- | doc/user/dia_intr | 4 | ||||
-rw-r--r-- | doc/user/dia_node | 8 | ||||
-rw-r--r-- | doc/user/dia_summ | 9 | ||||
-rw-r--r-- | doc/user/equ_disp | 6 | ||||
-rw-r--r-- | doc/user/preface | 2 | ||||
-rw-r--r-- | doc/user/prg | 6 | ||||
-rw-r--r-- | doc/user/str_cros | 69 | ||||
-rw-r--r-- | doc/user/str_indx | 25 | ||||
-rw-r--r-- | doc/user/str_larg | 4 | ||||
-rw-r--r-- | doc/user/tbl_intr | 9 | ||||
-rw-r--r-- | doc/user/tbl_mult | 2 | ||||
-rw-r--r-- | doc/user/typ_apdf | 23 | ||||
-rw-r--r-- | doc/user/typ_book | 6 | ||||
-rw-r--r-- | doc/user/user.ps | 7070 |
21 files changed, 164 insertions, 7135 deletions
diff --git a/doc/user/README b/doc/user/README index e03e324..706b31f 100644 --- a/doc/user/README +++ b/doc/user/README @@ -6,10 +6,11 @@ type the command lout all > op -in this directory. This must be done six times to completely -resolve all cross references, although the PostScript file op is -printable after the first run. Auxiliary files with .li and .ld -suffixes will be created in this directory. +in this directory. Owing to some unfortunate page breaks in the +early runs, this must be done seven times to completely resolve +all cross references, although the PostScript file op is printable +after the first run. Auxiliary files with .li and .ld suffixes +will be created in this directory. The first run will produce a large number of error messages, nearly all beginning with "unresolved cross reference". These @@ -31,7 +32,7 @@ repeated failure to converge, caused by footnotes and floating figures close to large unbreakable displays. A copy of the final PostScript output file (A4 paper size) is -stored at "ftp://ftp.cs.su.oz.au/jeff/lout/lout-3.19.user.ps.gz". +stored at "ftp://ftp.cs.su.oz.au/jeff/lout/lout-3.23.user.ps.gz". Jeffrey H. Kingston -3 June 2000 +24 June 2000 diff --git a/doc/user/all b/doc/user/all index 46c35f5..e0f239c 100644 --- a/doc/user/all +++ b/doc/user/all @@ -21,7 +21,7 @@ Lout Document Formatting System } @Author { Jeffrey H. Kingston } - @Edition { Version 3.22 + @Edition { Version 3.23 June, 2000 } @Publisher { Copyright @CopyRight 1991, 2000 Jeffrey H. Kingston, diff --git a/doc/user/bas_par1 b/doc/user/bas_par1 index de3da37..0cee5f8 100644 --- a/doc/user/bas_par1 +++ b/doc/user/bas_par1 @@ -24,8 +24,8 @@ new line. If you are using it to create single lines, you need the The @Code "@DP" `display paragraph' symbol produces a somewhat larger dp. @Index @Code "@DP" vertical space, equal to the amount used before and after displays -(Section {@NumberOf displays}), with no indent. To get even larger -vertical spaces, use @Code "@DP" repeatedly. Another symbol, +(Section {@NumberOf displays}), with no indent. To get even more +space, use @Code "@DP" repeatedly. Another symbol, {@Code "@LOP"}, leaves a paragraph break the size of the gap left lop. @Index @Code "@LOP" outside (that is, before and after) lists (Section {@NumberOf lists}). This @@ -57,7 +57,7 @@ column for a heading and at least two lines of text. If so, @Code "@CNP" does nothing; if not, @Code "@CNP" causes a new page or column to be begun, like {@Code "@NP"}. The recommended arrangement is @ID @OneRow @Code { -"end of previous part." +# "end of previous part." "@DP" "@CNP" "@Heading { A Heading }" diff --git a/doc/user/bas_star b/doc/user/bas_star index ef65eb6..d2c6653 100644 --- a/doc/user/bas_star +++ b/doc/user/bas_star @@ -99,15 +99,15 @@ paragraph symbol. Lout will ordinarily take notice of how many spaces you type between words (Section {@NumberOf spaces}), but it will mimic the spacing rules of two other systems, troff and @TeX, if you prefer (Section {@NumberOf white}). @PP -When Lout runs, you might see some error messages beginning with +When Lout runs, you might see some error messages containing the words error.messages @Index { error messages } -`unresolved cross reference' -- not on file @Code "intro" above, but on -more complicated ones (anything with a footnote, for example). These -just mean that you have to run the @Code "lout" command again to finish off -the complicated things (Section {@NumberOf cross}), and they will gradually -go away. Of course, if you see error messages about missing braces, unknown -symbols, and so on, you need to revise your file. Lout will tell you the -line number of the problem, and how far along the line it is. +`unresolved cross reference' and `no destination point' -- not on file +@Code "intro" above, but on more complicated ones (anything with a footnote, +for example). These just mean that you have to run the @Code "lout" command +again to finish off the complicated things (Section {@NumberOf cross}), and +they will gradually go away. Of course, if you see error messages about +missing braces, unknown symbols, and so on, you need to revise your file. Lout +will tell you the line number of the problem, and how far along the line it is. @PP @BI { WARNING: } Lout allows documents to cause arbitrary system commands to be executed. These typically do useful things such as format computer diff --git a/doc/user/bgr_boxs b/doc/user/bgr_boxs index 39c6460..54b78a3 100644 --- a/doc/user/bgr_boxs +++ b/doc/user/bgr_boxs @@ -55,7 +55,9 @@ large everything is: as far as Lout is concerned, the line always has width zero. If you draw really thick lines you might need a larger margin and more space near the box. The default value of @Code linewidth is empty, which means to use whatever width the PostScript interpreter -in your output device thinks is a good default value. +in your output device thinks is a good default value. The special +value @Code "none" for @Code "linewidth" ensures that no line is drawn +around the box at all. @PP There is also a @Code "paint" option which paints a background of the nominated colour: diff --git a/doc/user/bgr_colo b/doc/user/bgr_colo index 4a48fb9..08d8d2a 100644 --- a/doc/user/bgr_colo +++ b/doc/user/bgr_colo @@ -44,5 +44,9 @@ nominal colour can look quite different on screen and on paper. The standard Lout @Code "@SetColour" symbol can provide many more colours setcolour. @Index @Code "@SetColour" @Cite { $kingston1995lout.expert}, although they must be specified -using numbers rather than names. +using numbers rather than names. For example, +@ID @Code "{ 0.5 0.5 1.0 } @SetColour Hello" +prints @Code Hello in a colour containing red at intensity 0.5, green +at intensity 0.5, and blue at intensity 1.0, which turns out, in the +strange world of colour coordinates, to be a light blue. @End @Section diff --git a/doc/user/dia b/doc/user/dia index 6462c88..9b0f8f9 100644 --- a/doc/user/dia +++ b/doc/user/dia @@ -9,9 +9,10 @@ diag. @Index { @@Diag } Starting with Version 3.18 of Lout, the @@Diag symbol was enhanced with the {@Code "@ANode"}, {@Code "@BNode"}, and {@Code "@CNode"} symbols described in Section {@NumberOf dia_node}, and with the symbols for -syntax diagrams described in Section {@NumberOf dia_synt}. These -enhancements are upwardly compatible, unless the user has defined -symbols with these same names and used them within diagrams. +syntax diagrams described in Section {@NumberOf dia_synt}. +#These +#enhancements are upwardly compatible, unless the user has defined +#symbols with these same names and used them within diagrams. @LP Prior to Version 3.09 of Lout, this chapter described a symbol called fig. @Index @Code "@Fig" @@ -35,7 +36,7 @@ diag. @Index @Code "@Diag" // @Link from { B } to { D } // @Arrow from { E } to { D } } -@@Diag offers nodes and links, arrows, labels, positioning using coordinates, +@@Diag offers nodes and links, arrows, labels, coordinates, tree diagrams, and syntax diagrams. @BeginSections @Include { dia_intr } diff --git a/doc/user/dia_intr b/doc/user/dia_intr index 52a9d49..4f1ee40 100644 --- a/doc/user/dia_intr +++ b/doc/user/dia_intr @@ -26,9 +26,7 @@ This provides everything you need for making diagrams. The result of the @@Diag symbol is an object in the usual way. A diagram is commonly made into a centred display, like this: @ID @OneRow @Code { -"@CentredDisplay @Diag {" -" ..." -"}" +"@CentredDisplay @Diag { ... }" } or into a floating figure, like this: @ID @OneRow @Code { diff --git a/doc/user/dia_node b/doc/user/dia_node index 8980978..4fd6159 100644 --- a/doc/user/dia_node +++ b/doc/user/dia_node @@ -279,6 +279,14 @@ to the first value again; this is why a single value is applied to all segments. Section {@NumberOf dia_summ} shows how each of the standard shapes is divided into segments. @PP +The node symbols of @Code "@Diag" are quite separate symbols from the +three basic box symbols of Section {@NumberOf boxes}. Although much +is the same, one obvious difference between the two is that to get no +outline in those boxes you use @Code { "linewidth { none }" }, whereas +to get no outline here you use @Code { "outlinestyle { noline }" }. The +basic boxes can only draw the outline solid or not at all, and their +options have been kept simple to reflect that. +@PP Nodes may be painted any of the colours listed in Section {@NumberOf colour}, using the @Code "paint" option: @ID @OneRow { diff --git a/doc/user/dia_summ b/doc/user/dia_summ index 4539785..8bf3b1d 100644 --- a/doc/user/dia_summ +++ b/doc/user/dia_summ @@ -862,10 +862,12 @@ A:: @Circle /0.8c |1.5c B:: @Circle /2f Here is the list of abbreviations for the standard paths (note that @Code curve and @Code acurve are the same). Each path also has an abbreviation which adds a forward arrow: -@ID @Tab - @Fmta { @Col @Code { path "{" A "}" } ! @Col @Code "@"B ! @Col @Code "@"C } +@DP +@Tab + @Fmta { @Col { @DisplayIndent @Wide & @Code { path "{" A "}" } } ! + @Col @Code "@"B ! @Col @Code "@"C } { -@Rowa +@FirstRowa A { line } B { Line } C { Arrow } @@ -942,6 +944,7 @@ path also has an abbreviation which adds a forward arrow: B { UWrapCurve } C { UWrapCurveArrow } } +@DP Here is the complete list of options to the @Code "@Link" symbol. The options related to {@Code xlabel}, {@Code ylabel}, and {@Code zlabel} have been omitted where they are the same as the {@Code linklabel} options. diff --git a/doc/user/equ_disp b/doc/user/equ_disp index 0167b8d..ea4af47 100644 --- a/doc/user/equ_disp +++ b/doc/user/equ_disp @@ -48,10 +48,10 @@ is called @ID @Code "@RawCentredAlignedNumberedDisplay" By leaving out some or all of {@Code Raw}, {@Code Aligned}, and {@Code Numbered}, and by changing or leaving out {@Code Centred}, -we get all these combinations. Here +we get all these combinations. The two displays numbereddisplay. @Index @Code "@NumberedDisplay" aligneddisplay. @Index @Code "@AlignedDisplay" -then is how the two displays given earlier were made: +given earlier were made like this: @ID @OneRow @Code { "... a first example of a numbered display:" "@BeginAlignedDisplays" @@ -89,7 +89,7 @@ Section {@NumberOf displays}, and the recommended solution was to use a list. However, there are no aligned or numbered (in this sense) lists. @PP -To solve this problem, each display symbol has a `raw' version, which +Fortunately, each display symbol has a `raw' version, which means that no space is inserted above or below the display. Instead, raw.displays @Index { raw displays } you must insert it yourself using paragraph symbols: diff --git a/doc/user/preface b/doc/user/preface index 9569cab..375999e 100644 --- a/doc/user/preface +++ b/doc/user/preface @@ -18,7 +18,7 @@ gnu. @Index { GNU Public License } primary source is directory @ID @Code "ftp://ftp.cs.usyd.edu.au/jeff/lout" in which may be found a gzipped tar file containing the main distribution -(currently {@Code "lout-3.22.tar.gz"}), and various other things including +(currently {@Code "lout-3.23.tar.gz"}), and various other things including a PostScript version of this guide. The distribution contains source code, libraries, documentation, license, and installation instructions. @PP diff --git a/doc/user/prg b/doc/user/prg index 792124c..d22a7b2 100644 --- a/doc/user/prg +++ b/doc/user/prg @@ -75,6 +75,12 @@ pod. @Index { Pod (for Perl) printing } C { "@Pod" } D { varying } E { No } +@Rowb + A { Python } + B { python } + C { "@Python" } + D { varying } + E { No } } C and C++ are handled together since, for formatting purposes, they differ only in that C++ has some additional keywords plus an extra diff --git a/doc/user/str_cros b/doc/user/str_cros index 7eb74c3..4bb391d 100644 --- a/doc/user/str_cros +++ b/doc/user/str_cros @@ -1,5 +1,5 @@ @Section - @Title { Cross references } + @Title { Cross references and links } @Tag { cross } @Begin @PP @@ -109,4 +109,71 @@ when switching from one document to another, by removing file lout.li @Index { @Code lout.li file } {@Code "lout.li"}. You should also remove this file if your document changes radically -- from a report to a book, say. +@PP +PDF viewers and recent versions of PostScript viewers offer a high-tech +version of cross references called {@I links}, which allow the user to +click on, say, the entry for a section in a table of contents and be +immediately transported to the page on which that section begins. In +principle, anything could happen when a link is clicked on, but Lout +only offers the kind of link that transports the user to some page +in the current document. +@PP +Lout automatically makes a link out of every page number it prints +in the table of contents and in the index, and every reference +citation. You can also insert your own links, using the +@Code "@CrossLink" symbol like this: +@ID @Code "See cross @CrossLink { Section @NumberOf cross }" +The @Code "@CrossLink" symbol consumes two objects, one to its left and the +other to its right, and we'll explain each of these now. +@PP +The object on the right (@Code "Section @NumberOf cross" in our +example) can be an arbitrary Lout object: you don't have to have +@Code "@NumberOf" or @Code "@PageOf" inside it, although in practice +you often will, since it makes sense to put a low-tech link wherever +you have a high-tech one, for the benefit of readers of paper +versions. This object on the right is what is printed, so the +overall result in this example is +@ID { See cross @CrossLink { Section @NumberOf cross } } +But, beyond this, clicking anywhere on this object on the screen will +invoke the link, transporting the user to some other page. +@PP +The object on the left (@Code cross in our example) must be a tag +that is acceptable to the @Code "@PageOf" symbol described earlier +in this section. The link will transport the user who clicks on +it to the page that @Code "@PageOf" would point to if given that +tag. You can ensure that your tag is acceptable in the usual +ways: by using {@Code "@PageMark"}, or by giving the tag as the +@Code "@Tag" option of a chapter, section, etc. as described earlier +in this section. +@PP +A moment ago we said that the object to the right of @Code "@CrossLink" +is what is printed by the @Code "@CrossLink" symbol. This is true by +default, but there is a @Code "@CrossLinkFormat" option in the setup +files which allows you to change the appearance of this printed +object. (See Section {@NumberOf setup} for a general description +of setup files and their options.) The default value of +@Code "@CrossLinkFormat" is +@ID @Code "@CrossLinkFormat { @Body }" +Within the @Code "@CrossLinkFormat" option, the @Code "@Body" symbol +stands for the object to the right of {@Code "@CrossLink"}. It is +actually the value of @Code "@CrossLinkFormat" that is printed, so, +for example, changing it to +@ID @Code "@CrossLinkFormat { blue @Colour @Underline @Body }" +causes all link objects to be printed in blue and underlined. If +you want a special format just for one link, there is a @Code "@Format" +option to @Code "@CrossLink" that overrides {@Code "@CrossLinkFormat"}: +@ID @Code "cross @CrossLink @Format { @CurveBox @Body } { Section @NumberOf cross }" +You can also give the formatting you want directly, since the object +to the right of @Code "@CrossLink" can be an arbitrary Lout object: +@ID @Code "cross @CrossLink @CurveBox { Section @NumberOf cross }" +However, in this form the @Code "@CrossLinkFormat" setup file option +is still applied. +@PP +At present, the @Code "@CrossLink" symbol behaves as though a @Code "@OneCol" +symbol encloses the object on its right. This means that that object +is kept together on one line of any enclosing paragraph, and inter-word +spaces within it are not adjusted along with the inter-word spaces of +any enclosing paragraph. This deficiency might be corrected in the +future, but meanwhile it means that it is best to keep your objects +on the right short. @End @Section diff --git a/doc/user/str_indx b/doc/user/str_indx index 3c15c09..b75c8db 100644 --- a/doc/user/str_indx +++ b/doc/user/str_indx @@ -40,14 +40,15 @@ automatically. The object preceding the @Code "@Index" symbol is a compulsory key which is used for sorting the index entries, @FootNote { -The collating sequence used to decide what comes after what is the -collating sequence used by the @Code "memcmp()" library routine (just -the underlying binary character codes). Alternatively, the version -of Lout installed on your system may use the @Code "strcoll()" -collating sequence, which understands accented characters and whose -effect depends on your locale. To find out whether @Code "strcoll()" -is in use or not, type @Code "lout -V" which prints out several lines -of this and similar information. +The collating sequence used to decide what comes after what is either +the collating sequence used by the @Code "memcmp()" library routine (just +the underlying binary character codes), or else the one used by the +@Code "strcoll()" collating sequence, which understands accented +characters and whose effect depends on your locale. To find out +whether @Code "strcoll()" is in use or not, type @Code "lout -V" which +prints out several lines of this and similar information, including +information about command line flags to switch between the two kinds of +collation. @PP If the sorting you get turns out to be not what you expected, the first thing to try is the replacement of all accented letters in index @@ -55,10 +56,10 @@ keys by unaccented ones. Sorting is quite an intractable problem: even if @Code "strcoll()" gets the sorting right for one language, there still remains the problem of sorting multilingual indexes. @PP -Lout's database mechanism assumes that the @I tab character is collated -before any character that could appear in a sorting key. It seems that -there are a few collating sequences in existence which do not satisfy this -condition, and in these cases Lout will fail to produce the correct index. +Older versions of Lout assumed that the @I tab character was collated +before any character that could appear in a sorting key, causing +problems when this was not so. Recent versions of Lout no longer +make this assumption. } but which is not itself printed anywhere. It is best to construct these sorting keys from lower-case letters and the . character only, beginning diff --git a/doc/user/str_larg b/doc/user/str_larg index 618e69f..2d244ae 100644 --- a/doc/user/str_larg +++ b/doc/user/str_larg @@ -48,7 +48,9 @@ This arrangement is reminiscent of the one for lists, and, as for lists, there may be no paragraph or new page symbols before, between, or after the sections. To change the gap between sections, you need to change the @Code "@SectionGap" option in the setup file, as explained -in Chapter {@NumberOf types}. +in Chapter {@NumberOf types}. If you just want a new page before one +section, not all sections, place @Code "@NP" at the very end of the +previous section, just before its {@Code "@End @Section"}. @PP The @Code "@Begin ... @End @Section" that brackets the body of each section may be abbreviated to {@Code "{ ... }"}. However, the long diff --git a/doc/user/tbl_intr b/doc/user/tbl_intr index 3f1f557..1c9160e 100644 --- a/doc/user/tbl_intr +++ b/doc/user/tbl_intr @@ -88,11 +88,10 @@ The result of the @Code "@Tbl" symbol is an object. As usual with Lout, this object may appear at any point in the document, @FootNote { In rare cases, when the table occupies an entire paragraph but is not -displayed, a bug in the current version of Basser Lout causes the second -column to appear much too far to the right. Until the problem is fixed, -the first thing to try if this occurs is to replace the very first -row symbol ({@Code "@Row"}, {@Code "@Rowa"}, {@Code "@Rowb"}, etc.) by -{@Code "@FirstRow"}, {@Code "@FirstRowa"}, {@Code "@FirstRowb"}, +displayed, a bug in Basser Lout causes the second column to appear much +too far to the right. If this occurs, replace +the very first row symbol ({@Code "@Row"}, {@Code "@Rowa"}, {@Code "@Rowb"}, +etc.) by {@Code "@FirstRow"}, {@Code "@FirstRowa"}, {@Code "@FirstRowb"}, etc. There are also {@Code "@HeaderFirstRow"}, {@Code "@HeaderFirstRowa"}, {@Code "@HeaderFirstRowb"} etc. symbols for replacing {@Code "@HeaderRow"}, {@Code "@HeaderRowa"}, {@Code "@HeaderRowb"}, etc., if required. diff --git a/doc/user/tbl_mult b/doc/user/tbl_mult index 3b83b8b..b523223 100644 --- a/doc/user/tbl_mult +++ b/doc/user/tbl_mult @@ -122,7 +122,7 @@ on each page. There is nothing equivalent to running headers at the bottom of the page -- nothing that would allow you to insert a rule after the last line of each page, but not elsewhere. (However, if you are using the @Code "@Table" -symbol, its @Code "@Enclose" option can be used to do this.) +symbol, its @Code "@Format" option can be used to do this.) @PP To prevent page breaks within a table, precede the @Code "@Tbl" symbol by {@Code "@OneRow"}: diff --git a/doc/user/typ_apdf b/doc/user/typ_apdf index 3203384..531f9c9 100644 --- a/doc/user/typ_apdf +++ b/doc/user/typ_apdf @@ -10,12 +10,19 @@ pdf. @Index { PDF documents } @ID @Code "lout -PDF simple > simple.pdf" No other changes are required. @PP -The PDF output is superior to PostScript in providing links: when viewed -with a PDF viewer, entries in tables of contents and indexes can be -clicked on and this transports the viewer to the part of the document -referenced by the link. (Recent versions of PostScript support this -feature too, but Lout's PostScript doesn't.) However, the PDF output -produced by Lout is inferior at graphics: the advanced features of the -@Code "@Diag" and @Code "@Graph" packages do not produce any output. One -can still format documents that contain them, but the results are disappointing. +When viewed with a PDF viewer, entries in tables of contents and indexes +can be clicked on and this transports the viewer to the part of the document +referenced by the link, as described in +cross @CrossLink { Section {@NumberOf cross} }. Recent versions of PostScript +support this feature too, via the @I pdfmark feature, and Lout's PostScript +contains links expressed in this way. Unfortunately, few PostScript viewers +know how to handle these links; those that don't just ignore them. +@PP +Regrettably, the PDF output produced by Lout is inferior at graphics: the +advanced features of the @Code "@Diag" and @Code "@Graph" packages do not +produce any output. One can still format documents that contain them, but +the results are disappointing. The only way to get the best of everything +is to produce PostScript, and then either pass it through a `distillation' +program to produce PDF, or else view it with a PostScript viewer that +understands links. @End @Section diff --git a/doc/user/typ_book b/doc/user/typ_book index 59d81e5..fd83483 100644 --- a/doc/user/typ_book +++ b/doc/user/typ_book @@ -307,8 +307,7 @@ as at the end of the book. Within the @Code "book" setup file there is a @Code "@BookSetup" booksetup. @Index @Code "@BookSetup" symbol whose options control the appearance of features specific to books -(in other words, the features described in this section). Here is a -representative sample of these options, showing their default values: +(in other words, the features described in this section): @ID @OneRow @Code { "@Use { @BookSetup" " # @TitlePageFont { Helvetica Base }" @@ -325,7 +324,8 @@ representative sample of these options, showing their default values: " # @ChapterInContents { Yes }" "}" } -Section {@NumberOf setup} explains how to make your own setup file and +This is just a representative sample of these options. Section +{@NumberOf setup} explains how to make your own setup file and change its options; here we just explain what the options do. @PP @Code "@TitlePageFont" is the font used on the title diff --git a/doc/user/user.ps b/doc/user/user.ps deleted file mode 100644 index 9cbcb3d..0000000 --- a/doc/user/user.ps +++ /dev/null @@ -1,7070 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: Basser Lout Version 3.20 (April 2000) -%%CreationDate: Mon Apr 24 13:08:28 2000 -%%DocumentData: Binary -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentMedia: A4 595 842 0 white () -%%PageOrder: Ascend -%%Pages: (atend) -%%BoundingBox: 0 0 595 842 -%%EndComments - -%%BeginProlog -%%BeginResource: procset LoutStartUp -/m { 3 1 roll moveto show } bind def -/mo { 3 1 roll moveto true charpath stroke } bind def -/s { exch currentpoint exch pop moveto show } bind def -/so { exch currentpoint exch pop moveto true charpath stroke } bind def -/k { exch neg 0 rmoveto show } bind def -/ko { exch neg 0 rmoveto true charpath stroke } bind def -/ul { gsave setlinewidth dup 3 1 roll - moveto lineto stroke grestore } bind def -/in { 1440 mul } def -/cm { 567 mul } def -/pt { 20 mul } def -/em { 120 mul } def -/sp { louts mul } def -/vs { loutv mul } def -/ft { loutf mul } def -/dg { } def - -/LoutGraphic { - /louts exch def - /loutv exch def - /loutf exch def - /ymark exch def - /xmark exch def - /ysize exch def - /xsize exch def -} def - -/LoutGr2 { gsave translate LoutGraphic gsave } def - -/LoutFont -{ findfont exch scalefont setfont -} bind def - -/LoutRecode { - { findfont dup length dict begin - {1 index /FID ne {def} {pop pop} ifelse} forall - /Encoding exch def - currentdict end definefont pop - } - stopped pop -} bind def - -/BeginEPSF { - /LoutEPSFState save def - /dict_count countdictstack def - /op_count count 1 sub def - userdict begin - /showpage { } def - 0 setgray 0 setlinecap - 1 setlinewidth 0 setlinejoin - 10 setmiterlimit [] 0 setdash newpath - /languagelevel where - { pop languagelevel - 1 ne - { false setstrokeadjust false setoverprint - } if - } if -} bind def - -/EndEPSF { - count op_count sub { pop } repeat - countdictstack dict_count sub { end } repeat - LoutEPSFState restore -} bind def -%%EndResource - -%%BeginResource: encoding vec2 -/vec2 [ -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright -/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash -/zero /one /two /three /four /five /six /seven -/eight /nine /colon /semicolon /less /equal /greater /question -/at /A /B /C /D /E /F /G -/H /I /J /K /L /M /N /O -/P /Q /R /S /T /U /V /W -/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore -/quoteleft /a /b /c /d /e /f /g -/h /i /j /k /l /m /n /o -/p /q /r /s /t /u /v /w -/x /y /z /braceleft /bar /braceright /asciitilde /.notdef -/quotesinglbase /quotedblbase /ellipsis /OE /oe /quotedblleft /quotedblright /fi -/fl /endash /emdash /bullet /dagger /daggerdbl /florin /fraction -/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent -/dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron -/space /exclamdown /cent /sterling /currency /yen /brokenbar /section -/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron -/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered -/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown -/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla -/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis -/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply -/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls -/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla -/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis -/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide -/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis -] def -%%EndResource - -%%BeginResource: procset LoutTabPrependGraphic -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/tabf.lpg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Tab % -% % -% To assist in avoiding name clashes, the names % -% of all these symbols begin with "ltab". % -% % -% Jeffrey H. Kingston % -% 24 September 1991 % -% 22 December 1992 % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% linewidth ltabhs - -% horizontal single line -/ltabhs -{ 0 0 moveto xsize 0 lineto - setlinewidth 0 setlinecap stroke -} def - -% linewidth ltabhsp - -% horizontal single line with projecting ends -/ltabhsp -{ 0 0 moveto xsize 0 lineto - setlinewidth 2 setlinecap stroke -} def - -% linewidth ltabhd - -% horizontal double line -/ltabhd -{ dup dup - 0 0 moveto xsize 0 lineto - 0 exch 3 mul moveto xsize exch 3 mul lineto - setlinewidth 0 setlinecap stroke -} def - -% linewidth ltabhdb - -% horizontal double line below mark -/ltabhdb -{ dup dup - 0 0 moveto xsize 0 lineto - 0 exch -3 mul moveto xsize exch -3 mul lineto - setlinewidth 0 setlinecap stroke -} def - -% linewidth ltabhdnw - -% horizontal double line with northwest corner -/ltabhdnw -{ dup dup dup dup - 0 0 moveto xsize 0 lineto - xsize exch 3 mul moveto - -3 mul exch 3 mul lineto - -3 mul 0 lineto - setlinewidth 0 setlinejoin 2 setlinecap stroke -} def - -% linewidth ltabhdne - -% horizontal double line with northeast corner -/ltabhdne -{ dup dup dup dup - 0 0 moveto xsize 0 lineto - 0 exch 3 mul moveto - 3 mul xsize add exch 3 mul lineto - 3 mul xsize add 0 lineto - setlinewidth 0 setlinejoin 2 setlinecap stroke -} def - -% linewidth ltabhdsw - -% horizontal double line with southwest corner -/ltabhdsw -{ dup dup dup dup - 0 0 moveto xsize 0 lineto - xsize exch -3 mul moveto - -3 mul exch -3 mul lineto - -3 mul 0 lineto - setlinewidth 0 setlinejoin 2 setlinecap stroke -} def - -% linewidth ltabhdse - -% horizontal double line with southeast corner -/ltabhdse -{ dup dup dup dup - 0 0 moveto xsize 0 lineto - 0 exch -3 mul moveto - 3 mul xsize add exch -3 mul lineto - 3 mul xsize add 0 lineto - setlinewidth 0 setlinejoin 2 setlinecap stroke -} def - -% linewidth ltabvs - -% vertical single line -/ltabvs -{ 0 0 moveto 0 ysize lineto - setlinewidth 0 setlinecap stroke -} def - -% linewidth ltabvd - -% vertical double line -/ltabvd -{ dup dup - 0 0 moveto 0 ysize lineto - -3 mul 0 moveto -3 mul ysize lineto - setlinewidth 0 setlinecap stroke -} def - -% linewidth ltabvdr - -% vertical double line to right of mark -/ltabvdr -{ dup dup - 0 0 moveto 0 ysize lineto - 3 mul 0 moveto 3 mul ysize lineto - setlinewidth 0 setlinecap stroke -} def -%%EndResource - -%%BeginResource: procset LoutTblPrependGraphic -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/tblf.lpg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Tbl Jeffrey H. Kingston % -% Version 1.0 June 1998 % -% % -% To assist in avoiding name clashes, the names of all symbols % -% defined here begin with "ltbl". % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% painting (i.e. filling): - ltblwhite - (etc.) -/ltblnopaint { } def -/ltblnochange { fill } def -/ltbldarkblue { 0.0 0.0 0.5 setrgbcolor fill } def -/ltblblue { 0.0 0.0 1.0 setrgbcolor fill } def -/ltbllightblue { 0.5 0.5 1.0 setrgbcolor fill } def -/ltbldarkgreen { 0.0 0.5 0.0 setrgbcolor fill } def -/ltblgreen { 0.0 1.0 0.0 setrgbcolor fill } def -/ltbllightgreen { 0.5 1.0 0.5 setrgbcolor fill } def -/ltbldarkred { 0.5 0.0 0.0 setrgbcolor fill } def -/ltblred { 1.0 0.0 0.0 setrgbcolor fill } def -/ltbllightred { 1.0 0.5 0.5 setrgbcolor fill } def -/ltbldarkcyan { 0.0 0.5 0.5 setrgbcolor fill } def -/ltblcyan { 0.0 1.0 1.0 setrgbcolor fill } def -/ltbllightcyan { 0.5 1.0 1.0 setrgbcolor fill } def -/ltbldarkmagenta { 0.5 0.0 0.5 setrgbcolor fill } def -/ltblmagenta { 1.0 0.0 1.0 setrgbcolor fill } def -/ltbllightmagenta { 1.0 0.5 1.0 setrgbcolor fill } def -/ltbldarkyellow { 0.5 0.5 0.0 setrgbcolor fill } def -/ltblyellow { 1.0 1.0 0.0 setrgbcolor fill } def -/ltbllightyellow { 1.0 1.0 0.5 setrgbcolor fill } def -/ltbldarkgray { 0.2 0.2 0.2 setrgbcolor fill } def -/ltblgray { 0.5 0.5 0.5 setrgbcolor fill } def -/ltbllightgray { 0.8 0.8 0.8 setrgbcolor fill } def -/ltbldarkgrey { 0.2 0.2 0.2 setrgbcolor fill } def -/ltblgrey { 0.5 0.5 0.5 setrgbcolor fill } def -/ltbllightgrey { 0.8 0.8 0.8 setrgbcolor fill } def -/ltblblack { 0.0 0.0 0.0 setrgbcolor fill } def -/ltblwhite { 1.0 1.0 1.0 setrgbcolor fill } def -%%EndResource - -%%BeginResource: procset LoutFigPrependGraphic -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/figf.lpg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Fig Jeffrey H. Kingston % -% Version 2.0 (includes CIRCUM label) January 1992 % -% % -% To assist in avoiding name clashes, the names of all symbols % -% defined here begin with "lfig". However, this is not feasible % -% with user-defined labels and some labels used by users. % -% % -% <point> is two numbers, a point. % -% <length> is one number, a length % -% <angle> is one number, an angle in degrees % -% <dashlength> is one number, the preferred length of a dash % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -errordict begin - /handleerror - { - { /Times-Roman findfont 8 pt scalefont setfont - 0 setgray 4 pt 4 pt moveto - $error /errorname get - dup lfigdict exch known - { lfigdict exch get } - { 30 string cvs } ifelse - show - ( Command: ) show - $error /command get 30 string cvs show - } stopped {} if - showpage stop - } def -end - -% concat strings: <string> <string> lfigconcat <string> -% must be defined outside lfigdict since used in lfigpromotelabels -/lfigconcat -{ 2 copy length exch length add string - dup 0 4 index putinterval - dup 3 index length 3 index putinterval - 3 1 roll pop pop -} def - -% <string> lfigdebugprint - -% must be defined outside lfigdict since used in arbitrary places -% /lfigdebugprint -% { print -% (; operand stack:\n) print -% count copy -% count 2 idiv -% { == -% (\n) print -% } repeat -% (\n) print -% } def - -/lfigdict 120 dict def -lfigdict begin - -% error messages -/dictfull (dictfull error: too many labels?) def -/dictstackoverflow (dictstackoverflow error: labels nested too deeply?) def -/execstackoverflow (execstackoverflow error: figure nested too deeply?) def -/limitcheck (limitcheck error: figure nested too deeply or too large?) def -/syntaxerror (syntaxerror error: syntax error in text of figure?) def -/typecheck (typecheck error: syntax error in text of figure?) def -/undefined (undefined error: unknown or misspelt label?) def -/VMError (VMError error: run out of memory?) def - -% push pi onto stack: - lfigpi <num> -/lfigpi 3.14159 def - -% arc directions -/clockwise false def -/anticlockwise true def - -% maximum of two numbers: <num> <num> lfigmax <num> -/lfigmax { 2 copy gt { pop } { exch pop } ifelse } def - -% minimum of two numbers: <num> <num> lfigmin <num> -/lfigmin { 2 copy lt { pop } { exch pop } ifelse } def - -% add two points: <point> <point> lfigpadd <point> -/lfigpadd { exch 3 1 roll add 3 1 roll add exch } def - -% subtract first point from second: <point> <point> lfigpsub <point> -/lfigpsub { 3 2 roll sub 3 1 roll exch sub exch } def - -% max two points: <point> <point> lfigpmax <point> -/lfigpmax { exch 3 1 roll lfigmax 3 1 roll lfigmax exch } def - -% min two points: <point> <point> lfigpmin <point> -/lfigpmin { exch 3 1 roll lfigmin 3 1 roll lfigmin exch } def - -% scalar multiplication: <point> <num> lfigpmul <point> -/lfigpmul { dup 3 1 roll mul 3 1 roll mul exch } def - -% point at angle and distance: <point> <length> <angle> lfigatangle <point> -/lfigatangle { 2 copy cos mul 3 1 roll sin mul lfigpadd } def - -% angle from one point to another: <point> <point> lfigangle <angle> -/lfigangle { lfigpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def - -% distance between two points: <point> <point> lfigdistance <length> -/lfigdistance { lfigpsub dup mul exch dup mul add sqrt } def - -% difference in x coords: <point> <point> lfigxdistance <length> -/lfigxdistance { pop 3 1 roll pop sub } def - -%difference in y coords: <point> <point> lfigydistance <length> -/lfigydistance { 3 1 roll pop sub exch pop } def - -% stroke a solid line: <length> <dashlength> lfigsolid - -/lfigsolid -{ pop pop [] 0 setdash stroke -} def - -% stroke a lfigdashed line: <length> <dashlength> lfigdashed - -/lfigdashed -{ 2 copy div 2 le 1 index 0 le or - { exch pop 1 pt lfigmax [ exch dup ] 0 setdash } - { dup [ exch 4 2 roll 2 copy div - 1 sub 2 div ceiling dup 4 1 roll - 1 add mul sub exch div ] 0 setdash - } ifelse stroke -} def - -% stroke a lfigcdashed line: <length> <dashlength> lfigcdashed - -/lfigcdashed -{ 2 copy le 1 index 0 le or - { exch pop 1 pt lfigmax [ exch dup ] dup 0 get 2 div setdash } - { dup [ 4 2 roll exch 2 copy exch div - 2 div ceiling div 1 index sub - ] exch 2 div setdash - } ifelse stroke -} def - -% stroke a dotted line: <length> <dashlength> lfigdotted - -/lfigdotted -{ 2 copy le 1 index 0 le or - { exch pop 1 pt lfigmax [ exch 0 exch ] 0 setdash } - { 1 index exch div ceiling div - [ 0 3 2 roll ] 0 setdash - } ifelse stroke -} def - -% stroke a noline line: <length> <dashlength> lfignoline - -/lfignoline -{ pop pop -} def - -% painting (i.e. filling): - lfigwhite - (etc.) -/lfignopaint { } def -/lfignochange { fill } def -/lfigdarkblue { 0.0 0.0 0.5 setrgbcolor fill } def -/lfigblue { 0.0 0.0 1.0 setrgbcolor fill } def -/lfiglightblue { 0.5 0.5 1.0 setrgbcolor fill } def -/lfigdarkgreen { 0.0 0.5 0.0 setrgbcolor fill } def -/lfiggreen { 0.0 1.0 0.0 setrgbcolor fill } def -/lfiglightgreen { 0.5 1.0 0.5 setrgbcolor fill } def -/lfigdarkred { 0.5 0.0 0.0 setrgbcolor fill } def -/lfigred { 1.0 0.0 0.0 setrgbcolor fill } def -/lfiglightred { 1.0 0.5 0.5 setrgbcolor fill } def -/lfigdarkcyan { 0.0 0.5 0.5 setrgbcolor fill } def -/lfigcyan { 0.0 1.0 1.0 setrgbcolor fill } def -/lfiglightcyan { 0.5 1.0 1.0 setrgbcolor fill } def -/lfigdarkmagenta { 0.5 0.0 0.5 setrgbcolor fill } def -/lfigmagenta { 1.0 0.0 1.0 setrgbcolor fill } def -/lfiglightmagenta { 1.0 0.5 1.0 setrgbcolor fill } def -/lfigdarkyellow { 0.5 0.5 0.0 setrgbcolor fill } def -/lfigyellow { 1.0 1.0 0.0 setrgbcolor fill } def -/lfiglightyellow { 1.0 1.0 0.5 setrgbcolor fill } def -/lfigdarkgray { 0.2 0.2 0.2 setrgbcolor fill } def -/lfiggray { 0.5 0.5 0.5 setrgbcolor fill } def -/lfiglightgray { 0.8 0.8 0.8 setrgbcolor fill } def -/lfigdarkgrey { 0.2 0.2 0.2 setrgbcolor fill } def -/lfiggrey { 0.5 0.5 0.5 setrgbcolor fill } def -/lfiglightgrey { 0.8 0.8 0.8 setrgbcolor fill } def -/lfigblack { 0.0 0.0 0.0 setrgbcolor fill } def -/lfigwhite { 1.0 1.0 1.0 setrgbcolor fill } def - -% line caps (and joins, not currently used) -/lfigbutt 0 def -/lfiground 1 def -/lfigprojecting 2 def -/lfigmiter 0 def -/lfigbevel 2 def - -% shape and labels of the @Box symbol -/lfigbox -{ - 0 0 /SW lfigpointdef - xsize 0 /SE lfigpointdef - xsize ysize /NE lfigpointdef - 0 ysize /NW lfigpointdef - SE 0.5 lfigpmul /S lfigpointdef - NW 0.5 lfigpmul /W lfigpointdef - W SE lfigpadd /E lfigpointdef - S NW lfigpadd /N lfigpointdef - NE 0.5 lfigpmul /CTR lfigpointdef - [ CTR NE lfigpsub /lfigboxcircum cvx ] lfigcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @CurveBox symbol -/lfigcurvebox -{ - - xsize 0.5 mul ysize 0.5 mul /CTR lfigpointdef - xsize 0.5 mul 0 /S lfigpointdef - xsize ysize 0.5 mul /E lfigpointdef - xsize 0.5 mul ysize /N lfigpointdef - 0 ysize 0.5 mul /W lfigpointdef - - xmark 0.293 mul xmark 0.293 mul /SW lfigpointdef - xsize xmark 0.293 mul sub xmark 0.293 mul /SE lfigpointdef - xsize xmark 0.293 mul sub ysize xmark 0.293 mul sub /NE lfigpointdef - xmark 0.293 mul ysize xmark 0.293 mul sub /NW lfigpointdef - - [ xsize ysize 0.5 lfigpmul xmark /lfigcurveboxcircum cvx ] lfigcircumdef - - xmark 0 - xsize xmark sub 0 - [ xsize xmark sub xmark ] - xsize xmark - xsize ysize xmark sub - [ xsize xmark sub ysize xmark sub ] - xsize xmark sub ysize - xmark ysize - [ xmark ysize xmark sub ] - 0 ysize xmark sub - 0 xmark - [ xmark xmark ] - xmark 0 -} def - -% shadow of the @ShadowBox symbol -% its shape and labels are done, somewhat inaccurately, with lfigbox -/lfigshadow -{ xmark 2 mul 0 moveto xsize 0 lineto - xsize ysize xmark 2 mul sub lineto - xsize xmark sub ysize xmark 2 mul sub lineto - xsize xmark sub xmark lineto - xmark 2 mul xmark lineto closepath fill -} def - -% shape and labels of the @Square symbol -/lfigsquare -{ - xsize ysize 0.5 lfigpmul /CTR lfigpointdef - CTR xsize xsize ysize ysize lfigpmax 0.5 lfigpmul lfigpadd /NE lfigpointdef - CTR 0 0 CTR NE lfigdistance 135 lfigatangle lfigpadd /NW lfigpointdef - CTR 0 0 CTR NE lfigdistance 225 lfigatangle lfigpadd /SW lfigpointdef - CTR 0 0 CTR NE lfigdistance 315 lfigatangle lfigpadd /SE lfigpointdef - SW 0.5 lfigpmul SE 0.5 lfigpmul lfigpadd /S lfigpointdef - NW 0.5 lfigpmul NE 0.5 lfigpmul lfigpadd /N lfigpointdef - SW 0.5 lfigpmul NW 0.5 lfigpmul lfigpadd /W lfigpointdef - SE 0.5 lfigpmul NE 0.5 lfigpmul lfigpadd /E lfigpointdef - [ CTR NE lfigpsub /lfigboxcircum cvx ] lfigcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @Diamond symbol -/lfigdiamond -{ - xsize 0 0.5 lfigpmul /S lfigpointdef - 0 ysize 0.5 lfigpmul /W lfigpointdef - S W lfigpadd /CTR lfigpointdef - CTR W lfigpadd /N lfigpointdef - CTR S lfigpadd /E lfigpointdef - [ xsize ysize 0.5 lfigpmul /lfigdiamondcircum cvx ] lfigcircumdef - S E N W S -} def - -% shape and labels of the @Ellipse symbol -/lfigellipse -{ - xsize 0 0.5 lfigpmul /S lfigpointdef - 0 ysize 0.5 lfigpmul /W lfigpointdef - S W lfigpadd /CTR lfigpointdef - CTR W lfigpadd /N lfigpointdef - CTR S lfigpadd /E lfigpointdef - CTR xsize 0 0.3536 lfigpmul lfigpadd 0 ysize 0.3536 lfigpmul lfigpadd /NE lfigpointdef - 0 ysize 0.3536 lfigpmul CTR xsize 0 0.3536 lfigpmul lfigpadd lfigpsub /SE lfigpointdef - xsize 0 0.3536 lfigpmul CTR lfigpsub 0 ysize 0.3536 lfigpmul lfigpadd /NW lfigpointdef - 0 ysize 0.3536 lfigpmul xsize 0 0.3536 lfigpmul CTR lfigpsub lfigpsub /SW lfigpointdef - [ xsize ysize 0.5 lfigpmul /lfigellipsecircum cvx ] lfigcircumdef - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @Circle symbol -/lfigcircle -{ - xsize ysize 0.5 lfigpmul /CTR lfigpointdef - CTR xsize 0 ysize 0 lfigpmax 0.5 lfigpmul lfigpadd /E lfigpointdef - CTR 0 0 CTR E lfigdistance 45 lfigatangle lfigpadd /NE lfigpointdef - CTR 0 0 CTR E lfigdistance 90 lfigatangle lfigpadd /N lfigpointdef - CTR 0 0 CTR E lfigdistance 135 lfigatangle lfigpadd /NW lfigpointdef - CTR 0 0 CTR E lfigdistance 180 lfigatangle lfigpadd /W lfigpointdef - CTR 0 0 CTR E lfigdistance 225 lfigatangle lfigpadd /SW lfigpointdef - CTR 0 0 CTR E lfigdistance 270 lfigatangle lfigpadd /S lfigpointdef - CTR 0 0 CTR E lfigdistance 315 lfigatangle lfigpadd /SE lfigpointdef - [ S E lfigpsub /lfigellipsecircum cvx ] lfigcircumdef - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @HLine and @HArrow symbols -/lfighline -{ - 0 ymark lfigprevious /FROM lfigpointdef - xsize ymark lfigprevious /TO lfigpointdef -} def - -% shape and labels of the @VLine and @VArrow symbols -/lfigvline -{ - xmark ysize lfigprevious /FROM lfigpointdef - xmark 0 lfigprevious /TO lfigpointdef -} def - -% points of a polygon around base with given no of sides, vert init angle: -% <sides> <angle> figpolygon <point> ... <point> -/lfigpolygon -{ xsize ysize 0.5 lfigpmul /CTR lfigpointdef - 90 sub CTR 2 copy lfigmax 5 3 roll - [ 4 copy pop /lfigpolycircum cvx ] lfigcircumdef - exch dup 360 exch div exch - 1 1 3 2 roll - { 4 string cvs (P) exch lfigconcat cvn - 6 copy pop pop lfigatangle 2 copy 10 2 roll - 3 2 roll lfigpointdef - dup 3 1 roll add exch - } for - pop lfigatangle -} def - -% next array element: <array> <index> lfiggetnext <array> <index> <any> true -% or <array> <index> false -/lfiggetnext -{ 2 copy exch length ge - { false } - { 2 copy get exch 1 add exch true } ifelse -} def - -% check whether thing is number: <any> lfigisnumbertype <any> <bool> -/lfigisnumbertype -{ dup type dup - /integertype eq exch /realtype eq or -} def - -% check whether thing is an array: <any> lfigisarraytype <any> <bool> -/lfigisarraytype { dup type /arraytype eq } def - -% get next item: <array> <index> lfiggetnextitem <array> <index> 0 -% or <array> <index> <array> 1 -% or <array> <index> <point> 2 -/lfiggetnextitem -{ lfiggetnext - { lfigisarraytype - { 1 - } - { lfigisnumbertype - { 3 1 roll - lfiggetnext - { lfigisnumbertype - { 4 3 roll exch 2 - } - { pop 3 2 roll pop 0 - } ifelse - } - { 3 2 roll pop 0 - } ifelse - } - { pop 0 - } ifelse - } ifelse - } - { 0 - } ifelse -} def - -% set arc path: bool x1 y1 x2 y2 x0 y0 lfigsetarc <angle> <angle> <dist> -% the path goes from x1 y1 to x2 y2 about centre x0 y0, -% anticlockwise if bool is true else clockwise. -% The orientations of backwards pointing and forwards pointing -% arrowheads are returned in the two angles, and -% the length of the arc is returned in <dist>. -/lfigsetarc -{ - 20 dict begin - matrix currentmatrix 8 1 roll - 2 copy translate 2 copy 8 2 roll - 4 2 roll lfigpsub 6 2 roll lfigpsub - dup /y1 exch def dup mul /y1s exch def - dup /x1 exch def dup mul /x1s exch def - dup /y2 exch def dup mul /y2s exch def - dup /x2 exch def dup mul /x2s exch def - - y1s y2s eq - { -1 - } - { y1s x2s mul y2s x1s mul sub y1s y2s sub div - } ifelse - /da exch def - - x1s x2s eq - { -1 - } - { x1s y2s mul x2s y1s mul sub x1s x2s sub div - } ifelse - /db exch def - - da 0 gt db 0 gt and - { /LMax da sqrt db sqrt lfigmax def - /scalex da sqrt LMax div def - /scaley db sqrt LMax div def - scalex scaley scale - 0 0 LMax - 0 0 x1 scalex mul y1 scaley mul lfigangle - 0 0 x2 scalex mul y2 scaley mul lfigangle - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - dup sin scaley mul exch cos scalex mul atan - 2 index 2 index - { 90 add } { 90 sub } ifelse - dup sin scaley mul exch cos scalex mul atan - 5 2 roll % res1 res2 ang1 ang2 anticlockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if lfigpi mul LMax mul 180 div - } - { 0 0 x1 y1 lfigdistance 0 0 x2 y2 lfigdistance eq - 0 0 x1 y1 lfigdistance 0 gt and - { 0 0 - 0 0 x1 y1 lfigdistance - 0 0 x1 y1 lfigangle - 0 0 x2 y2 lfigangle - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - 2 index 2 index - { 90 add } { 90 sub } ifelse - 5 2 roll % res1 res2 ang1 ang2 clockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if lfigpi mul 0 0 x1 y1 lfigdistance mul 180 div - } - { x2 y2 lineto pop - x2 y2 x1 y1 lfigangle - x1 y1 x2 y2 lfigangle - x1 y1 x2 y2 lfigdistance - } ifelse - } ifelse - 4 -1 roll setmatrix - end -} def - -% lfigsetcurve: set up a Bezier curve from x0 y0 to x3 y3 -% and return arrowhead angles and length of curve (actually 0) -% x0 y0 x1 y1 x2 y2 x3 y3 lfigsetcurve <angle> <angle> <length> -/lfigsetcurve -{ 8 copy curveto pop pop - lfigangle - 5 1 roll - 4 2 roll lfigangle - exch - 0 -} def - -% lfigpaintpath: paint a path of the given shape -% /paint [ shape ] lfigpaintpath - -/lfigpaintpath -{ - 10 dict begin - 0 newpath - /prevseen false def - /curveseen false def - { lfiggetnextitem - dup 0 eq { pop exit } - { 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /curveseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr - lfigsetcurve pop pop pop - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - lfigsetarc pop pop pop - } ifelse - } - { xcurr ycurr lineto - } ifelse - } - { xcurr ycurr moveto - } ifelse - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop pop pop cvx exec - end -} def - -% stroke a path of the given shape in the given linestyle and dash length. -% Return the origin and angle of the backward and forward arrow heads. -% dashlength /linestyle [shape] lfigdopath [<point> <angle>] [<point> <angle>] -/lfigdopath -{ - 10 dict begin - 0 - /prevseen false def - /curveseen false def - /backarrow [] def - /fwdarrow [] def - { - lfiggetnextitem - dup 0 eq { pop exit } - { - 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /prevseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { newpath xprev yprev moveto - curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr lfigsetcurve - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - lfigsetarc - } ifelse - } - { xcurr ycurr lineto - xcurr ycurr xprev yprev lfigangle dup 180 sub - xprev yprev xcurr ycurr lfigdistance - } ifelse - 6 index 6 index cvx exec - [ xprev yprev 5 -1 roll ] - backarrow length 0 eq - { /backarrow exch def } - { pop } ifelse - [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def - } if - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop - pop pop pop pop - backarrow length 0 eq { [ 0 0 0 ] } { backarrow } ifelse - fwdarrow length 0 eq { [ 0 0 0 ] } { fwdarrow } ifelse - end -} def - -% lfigdoarrow: draw an arrow head of given form -% dashlength /lstyle /pstyle hfrac height width [ <point> <angle> ] lfigdoarrow - -/lfigdoarrow -{ matrix currentmatrix 8 1 roll - dup 0 get 1 index 1 get translate - 2 get rotate - [ 2 index neg 2 index 0 0 - 3 index 3 index neg - 1 index 10 index mul 0 - 7 index 7 index ] - 4 1 roll pop pop pop - dup 3 1 roll - gsave lfigpaintpath grestore lfigdopath pop pop - setmatrix -} def - -% arrow head styles -/lfigopen 0.0 def -/lfighalfopen 0.5 def -/lfigclosed 1.0 def - -% stroke no arrows, forward, back, and both -/lfignoarrow { pop pop pop pop pop pop pop pop } def -/lfigforward { 7 -1 roll lfigdoarrow pop } def -/lfigback { 8 -2 roll pop lfigdoarrow } def -/lfigboth { 8 -1 roll 7 copy lfigdoarrow pop 7 -1 roll lfigdoarrow } def - -% lfigprevious: return previous point on path -/lfigprevious -{ lfigisnumbertype - { 2 copy } - { lfigisarraytype - { 2 index 2 index } - { 0 0 } - ifelse - } ifelse -} def - -% label a point in 2nd top dictionary: <point> /name lfigpointdef - -/lfigpointdef -{ - % (Entering lfigpointdef) lfigdebugprint - [ 4 2 roll transform - /itransform cvx ] cvx - currentdict end - 3 1 roll - % currentdict length currentdict maxlength lt - % { def } - % { exec moveto (too many labels) show stop } - % ifelse - def - begin - % (Leaving lfigpointdef) lfigdebugprint -} def - -% promote labels from second top to third top dictionary -% <string> lfigpromotelabels - -/lfigpromotelabels -{ - % (Entering lfigpromotelabels) lfigdebugprint - currentdict end exch currentdict end - { exch 20 string cvs 2 index - (@) lfigconcat exch lfigconcat cvn exch def - } forall pop begin - % (Leaving lfigpromotelabels) lfigdebugprint -} def - -% show labels (except CIRCUM): - lfigshowlabels - -/lfigshowlabels -{ - % (Entering lfigshowlabels) lfigdebugprint - currentdict end - currentdict - { 1 index 20 string cvs (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { pop cvx exec 2 copy - newpath 1.5 pt 0 360 arc - 0 setgray fill - /Times-Roman findfont 8 pt scalefont setfont - moveto 0.2 cm 0.1 cm rmoveto 20 string cvs show - } - ifelse - } forall - begin - % (Leaving lfigshowlabels) lfigdebugprint -} def - -% fix an angle to 0 <= res < 360: <angle> lfigfixangle <angle> -/lfigfixangle -{ - % (Entering lfigfixangle) lfigdebugprint - { dup 0 ge { exit } if - 360 add - } loop - { dup 360 lt { exit } if - 360 sub - } loop - % (Leaving lfigfixangle) lfigdebugprint -} def - -% find point on circumference of box: alpha a b lfigboxcircum x y -/lfigboxcircum -{ - % (Entering lfigboxcircum) lfigdebugprint - 4 dict begin - /b exch def - /a exch def - lfigfixangle /alpha exch def - 0 0 a b lfigangle /theta exch def - - % if alpha <= theta, return (a, a*tan(alpha)) - alpha theta le - { a a alpha sin mul alpha cos div } - { - % else if alpha <= 180 - theta, return (b*cot(alpha), b) - alpha 180 theta sub le - { b alpha cos mul alpha sin div b } - { - % else if alpha <= 180 + theta, return (-a, -a*tan(alpha)) - alpha 180 theta add le - { a neg a neg alpha sin mul alpha cos div } - { - % else if alpha <= 360 - theta, return (-b*cot(alpha), -b) - alpha 360 theta sub le - { b neg alpha cos mul alpha sin div b neg } - { - % else 360 - theta <= alpha, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } ifelse - } ifelse - } ifelse - } ifelse - end - % (Leaving lfigboxcircum) lfigdebugprint -} def - -% find quadratic roots (assume a != 0): a b c lfigqroots x1 x2 2 -% or x2 1 -% or 0 -/lfigqroots -{ - 4 dict begin - /c exch def - /b exch def - /a exch def - /disc b b mul 4 a c mul mul sub def - disc 0 lt - { 0 - } - { disc 0 eq - { b neg 2 a mul div - 1 - } - { b neg disc sqrt add 2 a mul div - b neg disc sqrt sub 2 a mul div - 2 - } - ifelse - } - ifelse - end -} def - -% work our which quadrant: <angle> lfigquadrant <0-3> -/lfigquadrant -{ dup 90 lt - { pop 0 - } - { dup 180 lt - { pop 1 - } - { 270 lt - { 2 - } - { 3 - } ifelse - } ifelse - } ifelse -} def - -% find curvebox circum, assuming upper right quadrant: alpha a b xmk lfigcb x y -/lfigcb -{ - 6 dict begin - /xmk exch def - /b exch def - /a exch def - /alpha exch def - /theta1 0 0 a b xmk sub lfigangle def - /theta2 0 0 a xmk sub b lfigangle def - alpha theta1 le - { % if alpha <= theta1, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } - { alpha theta2 ge - { % else if alpha > theta2, return (b*cot(alpha), b) - b alpha cos mul alpha sin div b - } - { - % else, return the intersection of line and circle - a xmk sub b xmk sub xmk 0 0 alpha lfigcircleintersect - dup 0 eq - { % should never happen, just return any reasonable point - pop - a b 0.5 lfigpmul - } - { 1 eq - { % should never happen, just return the point on top of stack - } - { % the usual case, two points on stack, return the larger - lfigpmax - } ifelse - } ifelse - } ifelse - } ifelse - end -} def - -% find point on circumference of curvebox: alpha a b xmk lfigcurveboxcircum x y -/lfigcurveboxcircum -{ - % (Entering lfigcurveboxcircum) lfigdebugprint - 5 dict begin - /xmk exch def - /b exch def - /a exch def - lfigfixangle /alpha exch def - - % work out which quadrant we are in, and reflect accordingly - /quad alpha lfigquadrant def - quad 0 eq - { alpha a b xmk lfigcb - } - { quad 1 eq - { 180 alpha sub a b xmk lfigcb exch neg exch - } - { quad 2 eq - { alpha 180 sub a b xmk lfigcb neg exch neg exch - } - { 360 alpha sub a b xmk lfigcb neg - } ifelse - } ifelse - } ifelse - end - % (Leaving lfigcurveboxcircum) lfigdebugprint -} def - -% find point on circumference of diamond: alpha a b lfigdiamondcircum x y -/lfigdiamondcircum -{ - % (Entering lfigdiamondcircum) lfigdebugprint - 4 dict begin - /b exch def - /a exch def - lfigfixangle /alpha exch def - b alpha cos abs mul a alpha sin abs mul add /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving lfigdiamondcircum) lfigdebugprint -} def - -% find point on circumference of ellipse: alpha a b lfigellipsecircum x y -/lfigellipsecircum -{ - % (Entering lfigellipsecircum) lfigdebugprint - 4 dict begin - /b exch def - /a exch def - lfigfixangle /alpha exch def - b alpha cos mul dup mul a alpha sin mul dup mul add sqrt /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving lfigellipsecircum) lfigdebugprint -} def - -% find point of intersection of two lines each defined by two points -% x1 y1 x2 y2 x3 y3 x4 y4 lfiglineintersect x y -/lfiglineintersect -{ - % (Entering lfiglineintersect) lfigdebugprint - 13 dict begin - /y4 exch def - /x4 exch def - /y3 exch def - /x3 exch def - /y2 exch def - /x2 exch def - /y1 exch def - /x1 exch def - x2 x1 sub /x21 exch def - x4 x3 sub /x43 exch def - y2 y1 sub /y21 exch def - y4 y3 sub /y43 exch def - y21 x43 mul y43 x21 mul sub /det exch def - - % calculate x - y21 x43 mul x1 mul - y43 x21 mul x3 mul sub - y3 y1 sub x21 mul x43 mul add - det div - - % calculate y - x21 y43 mul y1 mul - x43 y21 mul y3 mul sub - x3 x1 sub y21 mul y43 mul add - det neg div - - end - % (Leaving lfiglineintersect) lfigdebugprint -} def - -% find point on circumference of polygon -% alpha radius num theta lfigpolycircum x y -/lfigpolycircum -{ - % (Entering lfigpolycircum) lfigdebugprint - 13 dict begin - /theta exch def - /num exch def - /radius exch def - /alpha exch def - - % calculate delta, the angle from theta to alpha - alpha theta sub lfigfixangle - - % calculate the angle which is the multiple of 360/num closest to delta - 360 num div div truncate 360 num div mul theta add /anglea exch def - - % calculate the next multiple of 360/num after anglea - anglea 360 num div add /angleb exch def - - % intersect the line through these two points with the alpha line - anglea cos anglea sin angleb cos angleb sin - 0 0 alpha cos 2 mul alpha sin 2 mul - lfiglineintersect radius lfigpmul - - end - % (Leaving lfigpolycircum) lfigdebugprint -} def - -% find point of intersection of a point and a circle -% x0 y0 r x1 y1 theta lfigcircleintersect xa ya xb yb 2 -% or xb yb 1 -% or 0 -/lfigcircleintersect -{ - % (Entering lfigcircleintersect) lfigdebugprint - 15 dict begin - /theta exch def - /y1 exch def - /x1 exch def - /r exch def - /y0 exch def - /x0 exch def - - % if sin(theta) = 0 then line is horizontal and y must be y1 - theta sin abs 0.00001 lt - { - /a 1 def - /b -2 x0 mul def - /c x0 dup mul y1 y0 sub dup mul add r dup mul sub def - a b c lfigqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 1 - } - { y1 exch y1 2 - } ifelse - } ifelse - } - { - /ct theta cos theta sin div def - /a ct ct mul 1 add def - /b ct x1 x0 sub mul y1 add y0 sub 2 mul def - /c x1 x0 sub dup mul y1 y0 sub dup mul add r dup mul sub def - a b c lfigqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xb yb 1 - } - { y1 add /ya exch def - ya y1 sub ct mul x1 add /xa exch def - y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xa ya xb yb 2 - } ifelse - } ifelse - } ifelse - end - % (Leaving lfigcircleintersect) lfigdebugprint -} def - -% add CIRCUM operator with this body: <array> lfigcircumdef - -/lfigcircumdef -{ % (Entering lfigcircumdef) lfigdebugprint - /CIRCUM exch cvx - currentdict end - 3 1 roll - % currentdict length currentdict maxlength lt - % { def } - % { exec moveto (too many labels) show stop } - % ifelse - def - begin - % (Leaving lfigcircumdef) lfigdebugprint -} def - -end -%%EndResource - -%%BeginResource: procset LoutGraphPrependGraphic -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/graphf.lpg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Graph (Version 1.0) % -% % -% Version 1.0 by Jeffrey H. Kingston, December 1993. % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -errordict begin - /handleerror - { - { /Times-Roman findfont 8 pt scalefont setfont - 0 setgray 4 pt 4 pt moveto - $error /errorname get - dup lgraphdict exch known - { lgraphdict exch get } - { 30 string cvs } ifelse - show - ( Command: ) show - $error /command get 30 string cvs show - } stopped {} if - showpage stop - } def -end - -/lgraphdict 200 dict def -lgraphdict begin - -% error messages -/dictfull (dictfull error) def -/dictstackoverflow (dictstackoverflow error) def -/execstackoverflow (execstackoverflow error: expression too complex?) def -/limitcheck (limitcheck error: graph too complex or too large?) def -/syntaxerror (syntaxerror error: syntax error in text of graph?) def -/typecheck (typecheck error: syntax error in text of graph?) def -/undefined (undefined error: unknown or misspelt symbol?) def -/rangecheck (rangecheck error: undefined expression (e.g. divide by zero)?) def -/VMError (VMError error: run out of memory?) def - -% random number between x and y inclusive: x y dorand num -/dorand { 1 index sub 1 add rand exch mod add } def - -% log to given base: base num dolog num -/dolog { ln exch ln div } def - -% maximum of two numbers: <num> <num> max <num> -/max { 2 copy gt { pop } { exch pop } ifelse } def - -% add two points: <point> <point> padd <point> -/padd { exch 3 1 roll add 3 1 roll add exch } def - -% subtract first point from second: <point> <point> psub <point> -/psub { 3 2 roll sub 3 1 roll exch sub exch } def - -% distance between two points: <point> <point> distance <length> -/distance { psub dup mul exch dup mul add sqrt } def - -% point at angle and distance: <point> <length> <angle> atangle <point> -/atangle { 2 copy cos mul 3 1 roll sin mul padd } def - -% angle from one point to another: <point> <point> angle <angle> -/angle { psub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def - - -% set up for line -% - linesetup <length> <dashlength> -/linesetup -{ newpath - xcurr ycurr trpoint xprev yprev trpoint - 4 copy moveto lineto distance dashlength -} def - -% set up for icon-avoiding line -% - ilinesetup <length> <dashlength> -/ilinesetup -{ newpath - xprev yprev trpoint xcurr ycurr trpoint 4 copy - 4 copy angle symbolsize 1.5 mul exch 4 2 roll pop pop atangle - 6 2 roll 4 2 roll - 4 copy angle symbolsize 1.5 mul exch 4 2 roll pop pop atangle - 4 copy moveto lineto distance dashlength -} def - - -% stroke a solid line: <length> <dashlength> solid - -/solid -{ pop pop [] 0 setdash linewidth setlinewidth stroke -} def - -% stroke a dashed line: <length> <dashlength> dashed - -/dashed -{ 2 copy 2 mul le 1 index 0 le or - { exch pop 1 pt max [ exch dup ] 0 setdash } - { dup [ exch 4 2 roll 2 copy div - 1 sub 2 div ceiling dup 4 1 roll - 1 add mul sub exch div ] 0 setdash - } ifelse linewidth setlinewidth stroke -} def - -% stroke a cdashed line: <length> <dashlength> cdashed - -/cdashed -{ 2 copy le 1 index 0 le or - { exch pop 1 pt max [ exch dup ] dup 0 get 2 div setdash } - { dup [ 4 2 roll exch 2 copy exch div - 2 div ceiling div 1 index sub - ] exch 2 div setdash - } ifelse linewidth setlinewidth stroke -} def - -% stroke a dotted line: <length> <dashlength> dotted - -/dotted -{ 2 copy le 1 index 0 le or - { exch pop 1 pt max [ exch 0 exch ] 0 setdash } - { 1 index exch div ceiling div 0.99999 mul - [ 0 3 2 roll ] 0 setdash - } ifelse gsave 1 setlinecap linewidth setlinewidth stroke grestore newpath -} def - -% stroke a noline line: <length> <dashlength> noline - -/noline -{ pop pop -} def - -% stroke a y histogram: - yhisto - -/yhisto -{ xprev yleft trpoint yextra sub moveto - xprev yprev trpoint lineto - xcurr yprev trpoint lineto - xcurr yleft trpoint yextra sub lineto - linewidth setlinewidth stroke -} def - -% stroke an x histogram: - xhisto - -/xhisto -{ xleft yprev trpoint exch xextra sub exch moveto - xcurr yprev trpoint lineto - xcurr ycurr trpoint lineto - xleft ycurr trpoint exch xextra sub exch lineto - linewidth setlinewidth stroke -} def - -% stroke a surface y histogram: - surfaceyhisto - -/surfaceyhisto -{ firstpair - { xprev yleft trpoint yextra sub moveto - xprev yprev trpoint lineto - } - { xprev yprev trpoint moveto - } ifelse - xcurr yprev trpoint lineto - lastpair - { xcurr yleft trpoint yextra sub lineto - } - { xcurr ycurr trpoint lineto - } ifelse - linewidth setlinewidth stroke -} def - -% stroke a surface x histogram: - surfacexhisto - -/surfacexhisto -{ firstpair - { xleft yprev trpoint exch xextra sub exch moveto - } - { xprev yprev trpoint moveto - } ifelse - xcurr yprev trpoint lineto - xcurr ycurr trpoint lineto - lastpair - { xleft ycurr trpoint exch xextra sub exch lineto - } if - linewidth setlinewidth stroke -} def - -% stroke a filled y histogram: - filledyhisto - -/filledyhisto -{ - linewidth setlinewidth - xprev yleft trpoint exch currentlinewidth 2 div add exch yextra sub moveto - xprev yprev trpoint exch currentlinewidth 2 div add exch lineto - xcurr yprev trpoint exch currentlinewidth 2 div sub exch lineto - xcurr yleft trpoint exch currentlinewidth 2 div sub exch yextra sub lineto - closepath fill -} def - -% stroke a filled x histogram: - filledxhisto - -/filledxhisto -{ - linewidth setlinewidth - xleft yprev trpoint currentlinewidth 2 div add exch xextra sub exch moveto - xcurr yprev trpoint currentlinewidth 2 div add lineto - xcurr ycurr trpoint currentlinewidth 2 div sub lineto - xleft ycurr trpoint currentlinewidth 2 div sub exch xextra sub exch lineto - closepath fill -} def - - -% cross: show a small cross -/cross -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg symbolsize neg rmoveto - symbolsize 2 mul symbolsize 2 mul rlineto - 0 symbolsize -2 mul rmoveto - symbolsize -2 mul symbolsize 2 mul rlineto - [] 0 setdash stroke -} def - -% plus: show a small plus -/plus -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg 0 rmoveto - symbolsize 2 mul 0 rlineto - symbolsize neg symbolsize neg rmoveto - 0 symbolsize 2 mul rlineto - [] 0 setdash stroke -} def - -% square: show a small square -/square -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg symbolsize neg rmoveto - symbolsize 2 mul 0 rlineto - 0 symbolsize 2 mul rlineto - symbolsize -2 mul 0 rlineto - closepath [] 0 setdash stroke -} def - -% filledsquare: show a small filled square -/filledsquare -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg symbolsize neg rmoveto - symbolsize 2 mul 0 rlineto - 0 symbolsize 2 mul rlineto - symbolsize -2 mul 0 rlineto - closepath gsave [] 0 setdash stroke grestore fill -} def - -% diamond: show a small diamond -/diamond -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg 0 rmoveto - symbolsize symbolsize neg rlineto - symbolsize symbolsize rlineto - symbolsize neg symbolsize rlineto - closepath [] 0 setdash stroke -} def - -% filleddiamond: show a small filled diamond -/filleddiamond -{ newpath - xcurr ycurr trpoint moveto - symbolsize neg 0 rmoveto - symbolsize symbolsize neg rlineto - symbolsize symbolsize rlineto - symbolsize neg symbolsize rlineto - closepath gsave [] 0 setdash stroke grestore fill -} def - -% circle: show a small circle -/circle -{ newpath - xcurr ycurr trpoint symbolsize 0 360 arc [] 0 setdash stroke -} def - -% filledcircle: show a small filled circle -/filledcircle -{ newpath - xcurr ycurr trpoint symbolsize 0 360 arc gsave [] 0 setdash stroke grestore fill -} def - -% triangle: show a small triangle -/triangle -{ newpath - xcurr ycurr trpoint moveto - 0 symbolsize 1.5 mul rmoveto - symbolsize neg symbolsize -2.5 mul rlineto - symbolsize 2 mul 0 rlineto - closepath [] 0 setdash stroke -} def - -% filledtriangle: show a small filled triangle -/filledtriangle -{ newpath - xcurr ycurr trpoint moveto - 0 symbolsize 1.5 mul rmoveto - symbolsize neg symbolsize -2.5 mul rlineto - symbolsize 2 mul 0 rlineto - closepath gsave [] 0 setdash stroke grestore fill -} def - - -%plog: like log only with a base, and protected from failing if <= 0 -% base x plog res -/plog { dup 0 le { pop pop 0 } { ln exch ln div } ifelse } def - -% xtr: transform one x value logarithmically if xlog > 1 -% <num> xtr <num> -/xtr -{ xlog 1 gt - { xlog exch plog - } if -} def - -% ytr: transform one y value logarithmically if ylog > 1 -% <num> ytr <num> -/ytr -{ ylog 1 gt - { ylog exch plog - } if -} def - -% % trpoint: transform (x, y) in graph space into (x', y') in print space -% % x y trpoint x' y' -% /trpoint -% { exch xtr trxmin sub trxmax trxmin sub div xwidth mul xextra add -% exch ytr trymin sub trymax trymin sub div ywidth mul yextra add -% } def - - -% trpoint: transform (x, y) in graph space into (x', y') in print space -% x y trpoint x' y' -/trpoint -{ exch xtr xdecr { trxmax exch sub } { trxmin sub } ifelse - trxmax trxmin sub div xwidth mul xextra add - - exch ytr ydecr { trymax exch sub } { trymin sub } ifelse - trymax trymin sub div ywidth mul yextra add -} def - - -% yonly: interpolate x values 1, 2, ... into data -% [ data ] yonly [ newdata ] -/yonly -{ dup /tmp exch def - length [ exch 1 exch 1 exch - { dup tmp exch 1 sub get - } for - ] -} def - -% xonly: interpolate y values 1, 2, ... into data -% [ data ] yonly [ newdata ] -/xonly -{ dup /tmp exch def - length [ exch 1 exch 1 exch - { dup tmp exch 1 sub get exch - } for - ] -} def - -% xandy: no interpolation of x or y values -% [ data ] xandy [ data ] -/xandy {} def - - -% expstringwidth: calculate width of string containing optional exponent -% <string> expstringwidth <width> -/expstringwidth -{ (^) search - { exch pop stringwidth pop exch stringwidth pop 0.7 mul add } - { stringwidth pop } - ifelse -} def - -% expstringshow: show string containing optional exponent -% <string> expstringshow - -/expstringshow -{ (^) search - { exch pop show 0 0.5 ft rmoveto - gsave currentfont 0.7 scalefont setfont show grestore - } - { show - } - ifelse -} def - -% concatenate two strings: <string> <string> strconcat <string> -/strconcat -{ 2 copy length exch length add string - dup 0 4 index putinterval - dup 3 index length 3 index putinterval - 3 1 roll pop pop -} def - -% lgen: generate one label automatically -% num lgen num string -/lgen { dup 20 string cvs } def - -% loglgen: generate one logarithmic label (with exponent) -% <base> <exponent> loglgen <string> -/loglgen -{ 20 string cvs exch 20 string cvs - (^) strconcat exch strconcat -} def - - -% printxtick: print one x tick -% xpos printxtick - -/printxtick -{ newpath - yleft trpoint moveto 0 yextra neg rmoveto - 0 xticklength neg rlineto [] 0 setdash stroke -} def - -% printxlabel: print one x label -% (xlabel) xpos printxlabel - -/printxlabel -{ yleft trpoint moveto 0 yextra neg rmoveto - 0 xticklength neg rmoveto 0 0.9 ft neg rmoveto - xlog 1 gt { 0 0.3 ft neg rmoveto } if - dup expstringwidth -2 div 0 rmoveto expstringshow -} def - -% printytick: print one y tick -% ypos printytick - -/printytick -{ newpath - xleft exch trpoint moveto xextra neg 0 rmoveto - yticklength neg 0 rlineto [] 0 setdash stroke -} def - -% printylabel: print one y label -% (ylabel) ypos printylabel - -/printylabel -{ xleft exch trpoint moveto xextra neg 0 rmoveto - yticklength neg 0 rmoveto -0.3 ft -0.3 ft rmoveto - dup expstringwidth neg 0 rmoveto expstringshow -} def - -% printrtick: print one r tick -% ypos printrtick - -/printrtick -{ newpath - xright exch trpoint moveto xextra 0 rmoveto - rticklength 0 rlineto [] 0 setdash stroke -} def - -% printrlabel: print one r label -% (rlabel) ypos printrlabel - -/printrlabel -{ xright exch trpoint moveto xextra 0 rmoveto - rticklength 0 rmoveto 0.3 ft -0.3 ft rmoveto - expstringshow -} def - -% printticks: print ticks and labels -% /tickproc /labelproc [ tickandlabeldata ] min printticks - -/printticks -{ /prev exch def - { dup type dup dup /integertype eq exch /realtype eq or - { pop dup /prev exch def 2 index cvx exec - } - { /stringtype eq - { prev 2 index cvx exec - } - { pop - } ifelse - } ifelse - } forall - pop pop -} def - - -% printxaxistick: print one x axis tick -% xpos printxaxistick - -/printxaxistick -{ newpath - yaxis trpoint moveto 0 xticklength -2 div rmoveto - 0 xticklength rlineto [] 0 setdash stroke -} def - -% printxaxislabel: print one x axis label -% (xlabel) xpos printxaxislabel - -/printxaxislabel -{ yaxis trpoint moveto - 0 xticklength -2 div rmoveto 0 0.9 ft neg rmoveto - xlog 1 gt { 0 0.3 ft neg rmoveto } if - dup expstringwidth -2 div 0 rmoveto expstringshow -} def - -% printyaxistick: print one y axis tick -% ypos printyaxistick - -/printyaxistick -{ newpath - xaxis exch trpoint moveto - yticklength -2 div 0 rmoveto - yticklength 0 rlineto [] 0 setdash stroke -} def - -% printyaxislabel: print one y axis label -% (ylabel) ypos printyaxislabel - -/printyaxislabel -{ xaxis exch trpoint moveto - yticklength -2 div 0 rmoveto -0.3 ft -0.3 ft rmoveto - dup expstringwidth neg 0 rmoveto expstringshow -} def - - -% <val> minmax - -% perform minv := min(minv, val); maxv := max(maxv, val) -% allowing for the possibility of minv, maxv, val being false (undefined) -/minmax -{ dup false eq - { pop } - { minv false eq - { dup /minv exch def /maxv exch def } - { dup minv lt - { /minv exch def } - { dup maxv gt - { /maxv exch def } - { pop } - ifelse - } ifelse - } ifelse - } ifelse -} def - -% <ticks> ticksundef <ticks> <bool> -% returns true iff the ticks array is undefined (one false entry) -/ticksundef -{ dup length 1 eq - { dup 0 get false eq - } - { false } - ifelse -} def - -% <number> integral <boolean> -% true if the number has an integral value -/integral { dup round eq } def - -% ticksep ticks xory alldata minval maxval axis base ticksandlimits ticks min max base -% ticksandlimits: sort out value of x or y ticks and limits and log base -/ticksandlimits -{ /base exch def - /minv false def - /maxv false def - - % min and max of user-supplied minval, maxval, and axis - minmax minmax minmax - - % min and max of data points - { 0 get dup dup length 1 sub 3 index exch 2 exch - { get minmax dup - } for pop pop - } forall - pop dup - - % min and max of tick values - { dup type /stringtype eq - { pop } { minmax } ifelse - } forall - - % fix minv and maxv if undefined (false) or equal - minv false eq - { /minv -1 def /maxv 1 def } - { minv maxv eq - { minv 0 lt - { /minv 2 minv mul def /maxv 0 def - } - { minv 0 eq - { /minv -1 def /maxv 1 def - } - { /minv 0 def /maxv 2 maxv mul def - } ifelse - } ifelse - } if - } ifelse - - % invent ticks if undefined - ticksundef - { pop /ticksep exch def - - % if base is reasonable and minv is positive, logarithmic ticks - base 1 gt minv 0 gt and - { - % get integral log of minv and maxv - /logminv base minv plog floor cvi def - /logmaxv base maxv plog ceiling cvi def - - % if minv close to base, make it 1; reset minv and maxv - logminv 1 eq logmaxv 4 ge and { /logminv 0 def } if - /minv base logminv exp def - /maxv base logmaxv exp def - - % ticks := [ base**logminv, ... , base**logmaxv ] - [ logminv 1 logmaxv - { dup base exch exp - exch base exch loglgen - } for - ] - } - { % non-logarithmic ticks - { - % fix tick separation if undefined (0) or too small - /base 0 def - /delta maxv minv sub def - ticksep delta 30 div le - { /ticksep 10 delta log 1 sub ceiling exp def - ticksep delta 2 div ge - { /ticksep ticksep 2 div def } - { ticksep delta 5 div lt - { /ticksep 2 ticksep mul def - } if - } ifelse - } if - - % adjust minv and maxv to be multiples of ticksep - /minv minv ticksep div floor ticksep mul def - /maxv maxv ticksep div ceiling ticksep mul def - /delta maxv minv sub def - - % if minv or maxv near zero, move to zero and redo - minv ticksep eq - { /minv 0 def } - { maxv ticksep neg eq { /maxv 0 def } { exit } ifelse - } ifelse - } loop - - % if minv, maxv, and ticksep are all integral, set "makeint" to true - /makeint minv integral maxv integral ticksep integral and and def - - % ticks := [ minv, minv+ticksep, ... , maxv ] - [ 0 1 delta ticksep div round - { ticksep mul minv add makeint { cvi } if lgen } - for - ] - } ifelse - } - { exch pop - } ifelse - minv maxv base -} def - -% xset: set up all data for x axis, including limits and ticks -% xticksep xticks 0 alldata xmin xmax xlog xextra xdecr xaxis xticklength xset - -/xset -{ /xticklength exch def - /xaxis exch def - /xdecr exch def - /xextra exch def - xaxis exch ticksandlimits - /xlog exch def /xmax exch def /xmin exch def /xticks exch def - /xleft xdecr { xmax } { xmin } ifelse def - /xright xdecr { xmin } { xmax } ifelse def - /xwidth xsize xextra 2 mul sub def - /trxmin xmin xtr def /trxmax xmax xtr def -} def - -% yset: set up all data for y axis, including limits and yticks -% yticksep yticks 0 alldata ymin ymax ylog yextra ydecr yaxis yticklength yset - -/yset -{ /yticklength exch def - /yaxis exch def - /ydecr exch def - /yextra exch def - yaxis exch ticksandlimits - /ylog exch def /ymax exch def /ymin exch def /yticks exch def - /yleft ydecr { ymax } { ymin } ifelse def - /yright ydecr { ymin } { ymax } ifelse def - /ywidth ysize yextra 2 mul sub def - /trymin ymin ytr def /trymax ymax ytr def -} def - -% rset: set up all data for y axis (again), but including limits and rticks -% rticksep rticks 0 alldata ymin ymax ylog yextra ydecr yaxis rticklength rset - -/rset -{ /rticklength exch def - /yaxis exch def - /ydecr exch def - /yextra exch def - yaxis exch ticksandlimits - /ylog exch def /ymax exch def /ymin exch def /rticks exch def - /yleft ydecr { ymax } { ymin } ifelse def - /yright ydecr { ymin } { ymax } ifelse def - /ywidth ysize yextra 2 mul sub def - /trymin ymin ytr def /trymax ymax ytr def -} def - -% norset: set up data for no rticks -% - norset - -/norset -{ /rticklength 0 def - /rticks [] def -} def - -% framestyle: print a frame around the graph -/framestyle -{ 0 0 moveto xsize 0 lineto xsize ysize lineto - 0 ysize lineto closepath stroke - /printxtick /printxlabel xticks xleft printticks - /printytick /printylabel yticks ymin printticks - /printrtick /printrlabel rticks ymin printticks -} def - -% nonestyle: print nothing around the graph -/nonestyle -{ -} def - -% axesstyle: print axes for the graph (unless axis values missing) -/axesstyle -{ - xaxis false eq yaxis false eq or - { framestyle } - { xaxis yaxis trpoint dup 0 exch moveto xsize exch lineto - dup 0 moveto ysize lineto stroke - /printxaxistick /printxaxislabel xticks xleft printticks - /printyaxistick /printyaxislabel yticks ymin printticks - } ifelse -} def - -% rundata: run all data sets -/rundata -{ alldata - { gsave - dup dup dup dup - 4 get /dopaint exch def - 3 get /initrun exch def - 2 get /pairs exch def - 1 get /points exch def - 0 get /data exch def - dopaint - { data length 4 ge - { initrun - newpath - data 0 get ymin trpoint yextra sub moveto - 0 2 data length 2 sub - { dup 1 add - data exch get /ycurr exch def - data exch get /xcurr exch def - xcurr ycurr trpoint lineto - } for - data dup length 2 sub get ymin trpoint yextra sub lineto - closepath fill - } if - } if - initrun - data length 2 ge - { - /xcurr data 0 get def - /ycurr data 1 get def - points - data length 4 ge - { 2 2 data length 2 sub - { /xprev xcurr def - /yprev ycurr def - dup dup 2 eq /firstpair exch def - data length 2 sub eq /lastpair exch def - dup 1 add - data exch get /ycurr exch def - data exch get /xcurr exch def - pairs - points - } for - } if - } if - grestore - } forall -} def - -end -%%EndResource - -%%BeginResource: procset LoutFigPrependGraphic -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/diagf.lpg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% PostScript @SysPrependGraphic file for @Diag Jeffrey H. Kingston % -% Version 2.0 (includes CIRCUM label) September 1996 % -% % -% To assist in avoiding name clashes, the names of all symbols % -% defined here begin with "ldiag". However, this is not feasible % -% with user-defined labels and some labels used by users. % -% % -% <point> is two numbers, a point. % -% <length> is one number, a length % -% <angle> is one number, an angle in degrees % -% <dashlength> is one number, the preferred length of a dash % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -errordict begin - /handleerror - { - { /Times-Roman findfont 8 pt scalefont setfont - 0 setgray 4 pt 4 pt moveto - $error /errorname get - dup ldiagdict exch known - { ldiagdict exch get } - { 50 string cvs } ifelse - show - ( Command: ) show - $error /command get 50 string cvs show - } stopped {} if - showpage stop - } def -end - -% begin diagram: <maxlabels> ldiagbegin - -% must be defined outside ldiagdict since it loads it -/ldiagbegin -{ xsize 0 0 ysize ldiagdict begin - 5 -1 roll /ldiagmaxlabels exch def - (@Diag) ldiagpushtagdict - /OOY ldiagpointdef /OOX ldiagpointdef 0 0 /OOO ldiagpointdef -} def - -% end diagram: - ldiagend - -/ldiagend -{ ldiagpoptagdict end -} def - -% concat strings: <string> <string> ldiagconcat <string> -% must be defined outside ldiagdict since used in ldiagpromotelabels -/ldiagconcat -{ 2 copy length exch length add string - dup 0 4 index putinterval - dup 3 index length 3 index putinterval - 3 1 roll pop pop -} def - -/ldiagdebugposy 432 def -/ldiagdebugposx 72 def - -% <string> <int> ldiagdebugprint - -% must be defined outside ldiagdict since used in arbitrary places -% print count or <int> stack entries, which ever is the smaller -/ldiagdebugprint -{ - exch - gsave - initgraphics - ldiagdebugposy 72 lt - { /ldiagdebugposx ldiagdebugposx 144 add store - /ldiagdebugposy 432 store - } - { - /ldiagdebugposy ldiagdebugposy 12 sub store - } ifelse - ldiagdebugposx ldiagdebugposy moveto - /Times-Roman findfont 10 scalefont setfont - 0 setgray show - count 1 sub 2 copy lt { pop } { exch pop } ifelse 1 sub - 0 exch 1 exch - { - /ldiagdebugposy ldiagdebugposy 12 sub store - ldiagdebugposx 12 add ldiagdebugposy moveto - index 50 string cvs show - } for - grestore -} def - -/ldiagdict 200 dict def -ldiagdict begin - -% error messages -/dictfull (dictfull error: too many labels?) def -/dictstackoverflow (dictstackoverflow error: labels nested too deeply?) def -/execstackoverflow (execstackoverflow error: figure nested too deeply?) def -/limitcheck (limitcheck error: figure nested too deeply or too large?) def -/syntaxerror (syntaxerror error: syntax error in text of figure?) def -/typecheck (typecheck error: syntax error in text of figure?) def -/undefined (undefined error: unknown or misspelt label?) def -/VMError (VMError error: run out of memory?) def - -% push pi onto stack: - ldiagpi <num> -/ldiagpi 3.14159 def - -% push e onto stack: - ldiage <num> -/ldiage 2.71828 def - -% arc directions -/clockwise false def -/anticlockwise true def - -% test equality between two angles: <angle> <angle> ldiagangleeq <bool> -/ldiagangleeq { ldiagfixangle exch ldiagfixangle eq } def - -% test inequality between two angles: <angle> <angle> ldiaganglene <bool> -/ldiaganglene { ldiagangleeq not } def - -% maximum of two numbers: <num> <num> ldiagmax <num> -/ldiagmax { 2 copy gt { pop } { exch pop } ifelse } def - -% minimum of two numbers: <num> <num> ldiagmin <num> -/ldiagmin { 2 copy lt { pop } { exch pop } ifelse } def - -% add two points: <point> <point> ldiagpadd <point> -/ldiagpadd -{ - % (Entering padd) 4 ldiagdebugprint - exch 3 1 roll add 3 1 roll add exch - % (Leaving padd) 2 ldiagdebugprint -} def - -% subtract first point from second: <point> <point> ldiagpsub <point> -/ldiagpsub { 3 2 roll sub 3 1 roll exch sub exch } def - -% max two points: <point> <point> ldiagpmax <point> -/ldiagpmax { exch 3 1 roll ldiagmax 3 1 roll ldiagmax exch } def - -% min two points: <point> <point> ldiagpmin <point> -/ldiagpmin { exch 3 1 roll ldiagmin 3 1 roll ldiagmin exch } def - -% scalar multiplication: <point> <num> ldiagpmul <point> -/ldiagpmul { dup 3 1 roll mul 3 1 roll mul exch } def - -% point at angle and distance: <point> <length> <angle> ldiagatangle <point> -/ldiagatangle { 2 copy cos mul 3 1 roll sin mul ldiagpadd } def - -% angle from one point to another: <point> <point> ldiagangleto <angle> -/ldiagangleto { ldiagpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def - -% distance between two points: <point> <point> ldiagdistance <length> -/ldiagdistance { ldiagpsub dup mul exch dup mul add sqrt } def - -% stroke a solid line: <length> <dashlength> ldiagsolid - -/ldiagsolid -{ pop pop [] 0 setdash 1 setlinecap stroke -} def - -% stroke a dashed line: <length> <dashlength> ldiagdashed - -/ldiagdashed -{ 2 copy div 2 le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch dup ] 0 setdash } - { dup [ exch 4 2 roll 2 copy div - 1 sub 2 div ceiling dup 4 1 roll - 1 add mul sub exch div ] 0 setdash - } ifelse 0 setlinecap stroke -} def - -% stroke a cdashed line: <length> <dashlength> ldiagcdashed - -/ldiagcdashed -{ % (Entering ldiagcdashed) 2 ldiagdebugprint - 2 copy le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch dup ] dup 0 get 2 div setdash } - { dup [ 4 2 roll exch 2 copy exch div - 2 div ceiling div 1 index sub - ] exch 2 div setdash - } ifelse 0 setlinecap stroke - % (Leaving ldiagcdashed) 0 ldiagdebugprint -} def - -% stroke a dotted line: <length> <dashlength> ldiagdotted - -/ldiagdotted -{ 2 copy le 1 index 0 le or - { exch pop 1 pt ldiagmax [ exch 0 exch ] 0 setdash } - { 1 index exch div ceiling div - [ 0 3 2 roll ] 0 setdash - } ifelse 1 setlinecap stroke -} def - -% stroke a noline line: <length> <dashlength> ldiagnoline - -/ldiagnoline -{ pop pop -} def - -% painting (i.e. filling): - ldiagwhite - (etc.) -/ldiagnopaint { } def -/ldiagnochange { fill } def -/ldiagdarkblue { 0.0 0.0 0.5 setrgbcolor fill } def -/ldiagblue { 0.0 0.0 1.0 setrgbcolor fill } def -/ldiaglightblue { 0.5 0.5 1.0 setrgbcolor fill } def -/ldiagdarkgreen { 0.0 0.5 0.0 setrgbcolor fill } def -/ldiaggreen { 0.0 1.0 0.0 setrgbcolor fill } def -/ldiaglightgreen { 0.5 1.0 0.5 setrgbcolor fill } def -/ldiagdarkred { 0.5 0.0 0.0 setrgbcolor fill } def -/ldiagred { 1.0 0.0 0.0 setrgbcolor fill } def -/ldiaglightred { 1.0 0.5 0.5 setrgbcolor fill } def -/ldiagdarkcyan { 0.0 0.5 0.5 setrgbcolor fill } def -/ldiagcyan { 0.0 1.0 1.0 setrgbcolor fill } def -/ldiaglightcyan { 0.5 1.0 1.0 setrgbcolor fill } def -/ldiagdarkmagenta { 0.5 0.0 0.5 setrgbcolor fill } def -/ldiagmagenta { 1.0 0.0 1.0 setrgbcolor fill } def -/ldiaglightmagenta { 1.0 0.5 1.0 setrgbcolor fill } def -/ldiagdarkyellow { 0.5 0.5 0.0 setrgbcolor fill } def -/ldiagyellow { 1.0 1.0 0.0 setrgbcolor fill } def -/ldiaglightyellow { 1.0 1.0 0.5 setrgbcolor fill } def -/ldiagdarkgray { 0.2 0.2 0.2 setrgbcolor fill } def -/ldiaggray { 0.5 0.5 0.5 setrgbcolor fill } def -/ldiaglightgray { 0.8 0.8 0.8 setrgbcolor fill } def -/ldiagdarkgrey { 0.2 0.2 0.2 setrgbcolor fill } def -/ldiaggrey { 0.5 0.5 0.5 setrgbcolor fill } def -/ldiaglightgrey { 0.8 0.8 0.8 setrgbcolor fill } def -/ldiagblack { 0.0 0.0 0.0 setrgbcolor fill } def -/ldiagwhite { 1.0 1.0 1.0 setrgbcolor fill } def - -% shape and labels of the @Box symbol -/ldiagbox -{ - 0 0 /SW ldiagpointdef - xsize 0 /SE ldiagpointdef - xsize ysize /NE ldiagpointdef - 0 ysize /NW ldiagpointdef - SE 0.5 ldiagpmul /S ldiagpointdef - NW 0.5 ldiagpmul /W ldiagpointdef - W SE ldiagpadd /E ldiagpointdef - S NW ldiagpadd /N ldiagpointdef - NE 0.5 ldiagpmul /CTR ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @CurveBox symbol -% <margin> ldiagcurvebox <shape> -/ldiagcurvebox -{ - - % (Entering ldiagcurvebox) 1 ldiagdebugprint - ldiagdecodelength /cbmgn exch def - - xsize 0.5 mul ysize 0.5 mul /CTR ldiagpointdef - xsize 0.5 mul 0 /S ldiagpointdef - xsize ysize 0.5 mul /E ldiagpointdef - xsize 0.5 mul ysize /N ldiagpointdef - 0 ysize 0.5 mul /W ldiagpointdef - - cbmgn 0.293 mul cbmgn 0.293 mul /SW ldiagpointdef - xsize cbmgn 0.293 mul sub cbmgn 0.293 mul /SE ldiagpointdef - xsize cbmgn 0.293 mul sub ysize cbmgn 0.293 mul sub /NE ldiagpointdef - cbmgn 0.293 mul ysize cbmgn 0.293 mul sub /NW ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ xsize ysize 0.5 ldiagpmul cbmgn /ldiagcurveboxcircum cvx ] ldiagcircumdef - - cbmgn 0 - xsize cbmgn sub 0 - [ xsize cbmgn sub cbmgn ] - xsize cbmgn - xsize ysize cbmgn sub - [ xsize cbmgn sub ysize cbmgn sub ] - xsize cbmgn sub ysize - cbmgn ysize - [ cbmgn ysize cbmgn sub ] - 0 ysize cbmgn sub - 0 cbmgn - [ cbmgn cbmgn ] - cbmgn 0 - - % (Leaving ldiagcurvebox) 0 ldiagdebugprint -} def - -% shadow of the @ShadowBox symbol -% its shape and labels are done, somewhat inaccurately, with ldiagbox -% <shadowmargin> ldiagshadow - -/ldiagshadow -{ - /lfshm exch def - - lfshm 0 moveto - 0 lfshm neg rlineto - xsize 0 rlineto - 0 ysize rlineto - lfshm neg 0 rlineto - xsize 0 lineto - closepath fill - -} def - -% shape and labels of the @Square symbol -/ldiagsquare -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - CTR xsize xsize ysize ysize ldiagpmax 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef - CTR 0 0 CTR NE ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef - SW 0.5 ldiagpmul SE 0.5 ldiagpmul ldiagpadd /S ldiagpointdef - NW 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /N ldiagpointdef - SW 0.5 ldiagpmul NW 0.5 ldiagpmul ldiagpadd /W ldiagpointdef - SE 0.5 ldiagpmul NE 0.5 ldiagpmul ldiagpadd /E ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - [ CTR NE ldiagpsub /ldiagboxcircum cvx ] ldiagcircumdef - SW SE NE NW SW -} def - -% shape and labels of the @Diamond symbol -/ldiagdiamond -{ - xsize 0 0.5 ldiagpmul /S ldiagpointdef - 0 ysize 0.5 ldiagpmul /W ldiagpointdef - S W ldiagpadd /CTR ldiagpointdef - CTR W ldiagpadd /N ldiagpointdef - CTR S ldiagpadd /E ldiagpointdef - E N ldiagpadd 0.5 ldiagpmul /NE ldiagpointdef - N W ldiagpadd 0.5 ldiagpmul /NW ldiagpointdef - S W ldiagpadd 0.5 ldiagpmul /SW ldiagpointdef - S E ldiagpadd 0.5 ldiagpmul /SE ldiagpointdef - - 0 dg /S@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - S E ldiagangleto /SE@ANGLE ldiagangledef - E N ldiagangleto /NE@ANGLE ldiagangledef - N W ldiagangleto /NW@ANGLE ldiagangledef - W S ldiagangleto /SW@ANGLE ldiagangledef - - [ xsize ysize 0.5 ldiagpmul /ldiagdiamondcircum cvx ] ldiagcircumdef - S E N W S -} def - -% shape and labels of the @Ellipse symbol -/ldiagellipse -{ - xsize 0 0.5 ldiagpmul /S ldiagpointdef - 0 ysize 0.5 ldiagpmul /W ldiagpointdef - S W ldiagpadd /CTR ldiagpointdef - CTR W ldiagpadd /N ldiagpointdef - CTR S ldiagpadd /E ldiagpointdef - CTR xsize 0 0.3536 ldiagpmul ldiagpadd 0 ysize 0.3536 ldiagpmul ldiagpadd /NE ldiagpointdef - 0 ysize 0.3536 ldiagpmul CTR xsize 0 0.3536 ldiagpmul ldiagpadd ldiagpsub /SE ldiagpointdef - xsize 0 0.3536 ldiagpmul CTR ldiagpsub 0 ysize 0.3536 ldiagpmul ldiagpadd /NW ldiagpointdef - 0 ysize 0.3536 ldiagpmul xsize 0 0.3536 ldiagpmul CTR ldiagpsub ldiagpsub /SW ldiagpointdef - [ xsize ysize 0.5 ldiagpmul /ldiagellipsecircum cvx ] ldiagcircumdef - - 0 dg /S@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - - S E ldiagangleto /SE@ANGLE ldiagangledef - E N ldiagangleto /NE@ANGLE ldiagangledef - N W ldiagangleto /NW@ANGLE ldiagangledef - W S ldiagangleto /SW@ANGLE ldiagangledef - - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @Circle symbol -/ldiagcircle -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - CTR xsize 0 ysize 0 ldiagpmax 0.5 ldiagpmul ldiagpadd /E ldiagpointdef - CTR 0 0 CTR E ldiagdistance 45 ldiagatangle ldiagpadd /NE ldiagpointdef - CTR 0 0 CTR E ldiagdistance 90 ldiagatangle ldiagpadd /N ldiagpointdef - CTR 0 0 CTR E ldiagdistance 135 ldiagatangle ldiagpadd /NW ldiagpointdef - CTR 0 0 CTR E ldiagdistance 180 ldiagatangle ldiagpadd /W ldiagpointdef - CTR 0 0 CTR E ldiagdistance 225 ldiagatangle ldiagpadd /SW ldiagpointdef - CTR 0 0 CTR E ldiagdistance 270 ldiagatangle ldiagpadd /S ldiagpointdef - CTR 0 0 CTR E ldiagdistance 315 ldiagatangle ldiagpadd /SE ldiagpointdef - [ S E ldiagpsub /ldiagellipsecircum cvx ] ldiagcircumdef - - 0 dg /S@ANGLE ldiagangledef - 45 dg /SE@ANGLE ldiagangledef - 90 dg /E@ANGLE ldiagangledef - 135 dg /NE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 225 dg /NW@ANGLE ldiagangledef - 270 dg /W@ANGLE ldiagangledef - 315 dg /SW@ANGLE ldiagangledef - - S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S -} def - -% shape and labels of the @VLine and @VArrow symbols -/ldiagvline -{ - xmark ysize ldiagprevious /FROM ldiagpointdef - xmark 0 ldiagprevious /TO ldiagpointdef -} def - -% points of a polygon around base with given no of sides, vert init angle: -% <sides> <angle> ldiagpolygon <point> ... <point> -/ldiagpolygon -{ exch round cvi exch - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - 90 sub CTR 2 copy ldiagmax 5 3 roll - [ 4 copy pop /ldiagpolycircum cvx ] ldiagcircumdef - exch dup 360 exch div exch - 1 1 3 2 roll - { 4 string cvs (P) exch ldiagconcat - 3 copy exch pop (@ANGLE) ldiagconcat cvn exch 90 add exch ldiagangledef - cvn 6 copy pop pop ldiagatangle 2 copy 10 2 roll - 3 2 roll ldiagpointdef - dup 3 1 roll add exch - } for - pop ldiagatangle -} def - -% shape and labels of the @Isosceles triangle symbol -/ldiagisosceles -{ - xsize ysize 0.5 ldiagpmul /CTR ldiagpointdef - 0 0 /SW ldiagpointdef - xsize 0 /SE ldiagpointdef - xsize 0.5 mul ysize /N ldiagpointdef - xsize 0.5 mul 0 /S ldiagpointdef - SE 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NE ldiagpointdef - SW 0.5 ldiagpmul N 0.5 ldiagpmul ldiagpadd /NW ldiagpointdef - - [ xsize ysize /ldiagisoscelescircum cvx ] ldiagcircumdef - - 0 dg /SW@ANGLE ldiagangledef - 0 dg /SE@ANGLE ldiagangledef - 180 dg /N@ANGLE ldiagangledef - 0 dg /S@ANGLE ldiagangledef - SE N ldiagangleto /NE@ANGLE ldiagangledef - N SW ldiagangleto /NW@ANGLE ldiagangledef - - SW SE N SW -} def - -% next array element: <array> <index> ldiaggetnext <array> <index> <any> true -% or <array> <index> false -/ldiaggetnext -{ 2 copy exch length ge - { false } - { 2 copy get exch 1 add exch true } ifelse -} def - -% check whether thing is number: <any> ldiagisnumbertype <any> <bool> -/ldiagisnumbertype -{ dup type dup - /integertype eq exch /realtype eq or -} def - -% check whether thing is an array: <any> ldiagisarraytype <any> <bool> -/ldiagisarraytype { dup type /arraytype eq } def - -% check whether thing is an array: <any> ldiagisnametype <any> <bool> -/ldiagisnametype { dup type /nametype eq } def - -% get next item: <array> <index> ldiaggetnextitem <array> <index> 0 -% or <array> <index> <array> 1 -% or <array> <index> <point> 2 -/ldiaggetnextitem -{ ldiaggetnext - { ldiagisarraytype - { 1 - } - { ldiagisnumbertype - { 3 1 roll - ldiaggetnext - { ldiagisnumbertype - { 4 3 roll exch 2 - } - { pop 3 2 roll pop 0 - } ifelse - } - { 3 2 roll pop 0 - } ifelse - } - { pop 0 - } ifelse - } ifelse - } - { 0 - } ifelse -} def - -% approximate equality: num1 num2 approxeq <boolean> -/approxeq -{ dup 0 eq - { pop 0 eq - } - { dup 3 1 roll sub exch div abs 0.001 lt - } ifelse -} def - -% set arc path: bool x1 y1 x2 y2 x0 y0 ldiagsetarc <angle> <angle> <dist> -% the path goes from x1 y1 to x2 y2 about centre x0 y0, -% anticlockwise if bool is true else clockwise. -% The orientations of backwards pointing and forwards pointing -% arrowheads are returned in the two angles, and -% the length of the arc is returned in <dist>. -/ldiagsetarc -{ - % (Entering ldiagsetarc) 7 ldiagdebugprint - 20 dict begin - matrix currentmatrix 8 1 roll - 2 copy translate 2 copy 8 2 roll - 4 2 roll ldiagpsub 6 2 roll ldiagpsub - dup /y1 exch def dup mul /y1s exch def - dup /x1 exch def dup mul /x1s exch def - dup /y2 exch def dup mul /y2s exch def - dup /x2 exch def dup mul /x2s exch def - /dist1 0 0 x1 y1 ldiagdistance def - /dist2 0 0 x2 y2 ldiagdistance def - - y1s y2s approxeq - { -1 - } - { y1s x2s mul y2s x1s mul sub y1s y2s sub div - } ifelse - /da exch def - - x1s x2s approxeq - { -1 - } - { x1s y2s mul x2s y1s mul sub x1s x2s sub div - } ifelse - /db exch def - - da 0 gt db 0 gt and - { - % ( case 1, ellipse) 0 ldiagdebugprint - /LMax da sqrt db sqrt ldiagmax def - /scalex da sqrt LMax div def - /scaley db sqrt LMax div def - scalex scaley scale - 0 0 LMax - 0 0 x1 scalex mul y1 scaley mul ldiagangleto - 0 0 x2 scalex mul y2 scaley mul ldiagangleto - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - dup sin scaley mul exch cos scalex mul atan - 2 index 2 index - { 90 add } { 90 sub } ifelse - dup sin scaley mul exch cos scalex mul atan - 5 2 roll % res1 res2 ang1 ang2 anticlockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if ldiagpi mul LMax mul 180 div - } - { - dist1 dist2 approxeq - % x1 y1 dist1 ( x1 y1, d) 3 ldiagdebugprint pop pop pop - % x2 y2 dist2 ( x2 y2, d) 3 ldiagdebugprint pop pop pop - { - % ( case 2, circle) 0 ldiagdebugprint - 0 0 - dist1 - 0 0 x1 y1 ldiagangleto - 0 0 x2 y2 ldiagangleto - 2 copy eq { 360 add } if - 2 copy 8 2 roll - 5 index { arc } { arcn } ifelse - 2 index 1 index - { 90 sub } { 90 add } ifelse - 2 index 2 index - { 90 add } { 90 sub } ifelse - 5 2 roll % res1 res2 ang1 ang2 clockwise - { exch sub } { sub } ifelse - dup 0 le { 360 add } if - ldiagpi mul dist1 mul 180 div - } - { - % ( case 3, line) 0 ldiagdebugprint - x2 y2 lineto pop - x2 y2 x1 y1 ldiagangleto - x1 y1 x2 y2 ldiagangleto - x1 y1 x2 y2 ldiagdistance - } ifelse - } ifelse - 4 -1 roll setmatrix - end - % (Leaving ldiagsetarc) 3 ldiagdebugprint -} def - -% ldiagsetcurve: set up a Bezier curve from x0 y0 to x3 y3 -% and return arrowhead angles and length of curve (actually 0) -% x0 y0 x1 y1 x2 y2 x3 y3 ldiagsetcurve <angle> <angle> <length> -/ldiagsetcurve -{ 8 copy curveto pop pop - ldiagangleto - 5 1 roll - 4 2 roll ldiagangleto - exch - 0 -} def - -% ldiagsetpath: convert a Diag path into a PostScript path -% [ shape ] ldiagsetpath -/ldiagsetpath -{ - 10 dict begin - 0 newpath - /prevseen false def - /curveseen false def - { ldiaggetnextitem - dup 0 eq { pop exit } - { 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /curveseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr - ldiagsetcurve pop pop pop - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc pop pop pop - } ifelse - } - { xcurr ycurr lineto - } ifelse - } - { xcurr ycurr moveto - } ifelse - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop pop pop - end -} def - -% ldiagpaintpath: paint a path of the given shape -% /paint [ shape ] ldiagpaintpath - -/ldiagpaintpath -{ - ldiagsetpath cvx exec -} def - -% stroke a path of the given shape in the given linestyle and dash length. -% Return the origin and angle of the backward and forward arrow heads. -% dashlength /linestyle [shape] ldiagdopath [<point> <angle>] [<point> <angle>] -/ldiagdopath -{ - 10 dict begin - 0 - /prevseen false def - /curveseen false def - /backarrow [] def - /fwdarrow [] def - { - ldiaggetnextitem - dup 0 eq { pop exit } - { - 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /prevseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { newpath xprev yprev moveto - curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr ldiagsetcurve - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc - } ifelse - } - { xcurr ycurr lineto - xcurr ycurr xprev yprev ldiagangleto dup 180 sub - xprev yprev xcurr ycurr ldiagdistance - } ifelse - 6 index 6 index cvx exec - [ xprev yprev 5 -1 roll ] - backarrow length 0 eq - { /backarrow exch def } - { pop } ifelse - [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def - } if - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop - pop pop pop pop - backarrow length 0 eq { [ 0 0 0 ] } { backarrow } ifelse - fwdarrow length 0 eq { [ 0 0 0 ] } { fwdarrow } ifelse - end -} def - - -% stroke a path of the given shape in the given linestyle and dash length. -% dashlength [ /linestyle ] [shape] ldiagdosegpath - -/ldiagdosegpath -{ - 12 dict begin - 1 index /seg exch def - 1 index length /seglength exch def - 0 /segcount exch def - 0 - /prevseen false def - /curveseen false def - /backarrow [] def - /fwdarrow [] def - { - ldiaggetnextitem - dup 0 eq { pop exit } - { - 1 eq - { /curveseen true def - /curve exch def - curve length 0 eq { /prevseen false def } if - } - { /ycurr exch def - /xcurr exch def - prevseen - { newpath xprev yprev moveto - curveseen - { curve length 4 eq - { xprev yprev - curve 0 get curve 1 get - curve 2 get curve 3 get - xcurr ycurr ldiagsetcurve - } - { xprev yprev xcurr ycurr - curve length 1 ge { curve 0 get } { 0 } ifelse - curve length 2 ge { curve 1 get } { 0 } ifelse - curve length 3 ge { curve 2 get } { true } ifelse - 7 1 roll - ldiagsetarc - } ifelse - } - { xcurr ycurr lineto - xcurr ycurr xprev yprev ldiagangleto dup 180 sub - xprev yprev xcurr ycurr ldiagdistance - } ifelse - 6 index seg segcount seglength mod get cvx exec - /segcount segcount 1 add def - [ xprev yprev 5 -1 roll ] - backarrow length 0 eq - { /backarrow exch def } - { pop } ifelse - [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def - } if - /xprev xcurr def - /yprev ycurr def - /prevseen true def - /curveseen false def - } ifelse - } ifelse - } loop - pop pop pop pop - end -} def - -% ldiagnodebegin: start of node parameters -% ldiagnodebegin - -/ldiagnodebegin -{ % (Entering ldiagnodebegin) 0 ldiagdebugprint - ldiagmaxlabels dict begin -} def - -% ldiagnodeend: end of node parameters (so do the node) -% <outline> <dashlength> <style> <linewidth> <paint> ldiagnodeend - -/ldiagnodeend -{ - % (Entering ldiagnodeend) 0 ldiagdebugprint - end % matches begin in ldiagnodebegin - 4 index gsave ldiagpaintpath grestore - 3 index ldiagsetpath clip newpath - 2 mul setlinewidth - 3 -1 roll ldiagdosegpath - % (Leaving ldiagnodeend) 0 ldiagdebugprint -} def - -% ldiaglinkbegin: start of link parameters -% <direct> ldiaglinkbegin - -/ldiaglinkbegin -{ ldiagmaxlabels dict begin - 1 eq /direct exch def -} def - -% ldiaglinkend: end of link parameters (so do the link) -% <outline> <dashlength> <style> <linewidth> ldiaglinkend - -/ldiaglinkend -{ - end % matches begin in ldiaglinkbegin - setlinewidth - 3 -1 roll ldiagdosegpath -} def - -% ldiagdoarrow: draw an arrow head of given form -% dashlength /lstyle /pstyle hfrac height width [ <point> <angle> ] ldiagdoarrow - -/ldiagdoarrow -{ matrix currentmatrix 8 1 roll - dup 0 get 1 index 1 get translate - 2 get rotate - [ 2 index neg 2 index 0 0 - 3 index 3 index neg - 1 index 10 index mul 0 - 7 index 7 index ] - 4 1 roll pop pop pop - dup 3 1 roll - gsave ldiagpaintpath grestore ldiagdopath pop pop - setmatrix -} def - -% arrow head styles -/ldiagopen 0.0 def -/ldiaghalfopen 0.5 def -/ldiagclosed 1.0 def - -% stroke no arrows, forward, back, and both -/ldiagnoarrow { pop pop pop pop pop pop pop pop } def -/ldiagforward { 7 -1 roll ldiagdoarrow pop } def -/ldiagback { 8 -2 roll pop ldiagdoarrow } def -/ldiagboth { 8 -1 roll 7 copy ldiagdoarrow pop 7 -1 roll ldiagdoarrow } def - -% ldiagprevious: return previous point on path -/ldiagprevious -{ ldiagisnumbertype - { 2 copy } - { ldiagisarraytype - { 2 index 2 index } - { 0 0 } - ifelse - } ifelse -} def - -% Tag dictionary operators -% -% Diag's tag dictionaries are kept on the same stack as other dictionaries, -% since there is nowhere else to put them. However, they are managed like -% a separate stack using the following operators: -% -% <tag> ldiagpushtagdict - Push a new, empty tag dictionary -% ldiagtoptagdict dict Find the top tag dictionary -% ldiagpoptagdict - Pop and destroy the top tag dictionary -% ldiagpopuptagdict - Pop top tag dict and promote its entries -% ldiagdebugtagdict - Debug print of dictionary stack -% -% They are distinguished from other dictionaries by containing /ldiagtagdict, -% whose value is the <tag> which is used by ldiagpopuptagdict, -% and they are hopefully never the target of any non-tag definition because -% they are never the top dictionary, since push places the new dict second. - -/ldiagpushtagdict -{ ldiagmaxlabels dict dup - currentdict end exch begin begin - exch /ldiagtagdict exch put -} def - -/ldiagtoptagdict -{ /ldiagtagdict where not - { (Diag internal error: no tag dictionary) show stop - } if -} def - -/ldiagpoptagdict -{ - % (Entering poptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict - mark - { currentdict end - dup /ldiagtagdict known - { exit - } if - } loop - pop - counttomark - { begin - } repeat - pop - % (Leaving poptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict -} def - -% promote labels from top tag dictionary to second top tag dictionary -% each prefixed by <string>@ if <string> (value of /ldiagtagdict) is not empty -% - ldiagpopuptagdict - -/ldiagpopuptagdict -{ - ldiagtagdict - % (Entering ldiagpopuptagdict) 1 ldiagdebugprint - % ldiagdebugtagdict - ldiagtoptagdict ldiagpoptagdict ldiagtoptagdict exch - { exch 50 string cvs 3 index - dup length 0 ne - { (@) ldiagconcat - } if - exch ldiagconcat cvn exch 2 index 3 1 roll put - } forall - pop pop - % (Leaving ldiagpopuptagdict) 0 ldiagdebugprint - % ldiagdebugtagdict -} def - -% debug tag dictionary stack -/ldiagdebugtagdict -{ (Entering ldiagdebugtagdict) 0 ldiagdebugprint - 30 array dictstack - { dup /ldiagtagdict known - { dup /ldiagtagdict get 0 ldiagdebugprint - { pop 50 string cvs ( ) exch ldiagconcat - dup 0 ldiagdebugprint - pop - } - forall - } - { pop (other) 0 ldiagdebugprint - } ifelse - } forall - (Leaving ldiagdebugtagdict) 0 ldiagdebugprint -} def - -% label a point in top tag dictionary: <point> /name ldiagpointdef - -/ldiagpointdef -{ - % (Entering ldiagpointdef) 3 ldiagdebugprint - [ 4 2 roll transform /itransform cvx ] cvx - ldiagtoptagdict 3 1 roll put - % (Leaving ldiagpointdef) 0 ldiagdebugprint -} def - -% label an angle in top tag dictionary: <angle> /name ldiagangledef - -/ldiagangledef -{ - % (Entering ldiagangledef) 2 ldiagdebugprint - exch ldiagfixangle ldiagtoptagdict 3 1 roll put - % (Leaving ldiagangledef) 0 ldiagdebugprint -} def - -% add CIRCUM operator with this body: <array> ldiagcircumdef - -/ldiagcircumdef -{ % (Entering ldiagcircumdef) 1 ldiagdebugprint - /CIRCUM exch cvx - ldiagtoptagdict 3 1 roll put - % currentdict end - % 3 1 roll - % def - % begin - % (Leaving ldiagcircumdef) 0 ldiagdebugprint -} def - -% show points (except CIRCUM and ANGLE): - ldiagshowpoints - -/ldiagshowpoints -{ - % (Entering ldiagshowpoints) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 50 string cvs - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (ANGLE) search % if ANGLE in key - { - pop pop pop pop pop - } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - pop cvx exec - newpath 2.0 pt 0 360 arc 0 setgray fill pop - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowpoints) 0 ldiagdebugprint -} def - - -/ldiagshowtags -{ - % (Entering ldiagshowtags) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 50 string cvs - % dup 0 ldiagdebugprint - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (ANGLE) search % if ANGLE in key - { - pop pop pop pop pop - } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - pop cvx exec 2 copy - gsave - newpath 2.0 pt 0 360 arc 0 setgray fill - /Times-Roman findfont 8 pt scalefont setfont - translate 40 rotate 0.2 cm 0.1 cm moveto 20 string cvs show - grestore - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowtags) 0 ldiagdebugprint -} def - - -% show angles: - ldiagshowangles - -/ldiagshowangles -{ - % (Entering ldiagshowangles) 0 ldiagdebugprint - ldiagtoptagdict - { 1 index 20 string cvs - % dup 0 ldiagdebugprint - (ldiagdebugpos) search - { pop pop pop pop pop } - { - (ldiagtagdict) search - { - pop pop pop pop pop - } - { - (CIRCUM) search % if CIRCUM in key - { pop pop pop pop pop } - { - (@ANGLE) search % if ANGLE in key, draw the angle at the point - { - % (showing ANGLE) 5 ldiagdebugprint - gsave exch pop exch pop cvx - % (about to execute) 1 ldiagdebugprint - exec translate rotate 0.8 0.8 scale pop - newpath 0 0 2.0 pt 0 360 arc 0 setgray fill - newpath 4 pt 0 moveto 9 pt 0 lineto - 9 pt 1.5 pt lineto 11 pt 0 lineto 9 pt -1.5 pt lineto - 9 pt 0 lineto [] 0 setdash 4 pt setlinewidth 0 setlinejoin - stroke grestore - % (finished ANGLE) 5 ldiagdebugprint - } - { - % else must be a point, we aren't showing those - pop pop pop - } ifelse - } ifelse - } ifelse - } ifelse - } forall - % (Leaving ldiagshowangles) 0 ldiagdebugprint -} def - -% fix an angle to 0 <= res < 360: <angle> ldiagfixangle <angle> -/ldiagfixangle -{ - % (Entering ldiagfixangle) 1 ldiagdebugprint - { dup 0 ge { exit } if - 360 add - } loop - { dup 360 lt { exit } if - 360 sub - } loop - % (Leaving ldiagfixangle) 1 ldiagdebugprint -} def - -% find point on circumference of box: alpha a b ldiagboxcircum x y -/ldiagboxcircum -{ - % (Entering ldiagboxcircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - 0 0 a b ldiagangleto /theta exch def - - % if alpha <= theta, return (a, a*tan(alpha)) - alpha theta le - { a a alpha sin mul alpha cos div } - { - % else if alpha <= 180 - theta, return (b*cot(alpha), b) - alpha 180 theta sub le - { b alpha cos mul alpha sin div b } - { - % else if alpha <= 180 + theta, return (-a, -a*tan(alpha)) - alpha 180 theta add le - { a neg a neg alpha sin mul alpha cos div } - { - % else if alpha <= 360 - theta, return (-b*cot(alpha), -b) - alpha 360 theta sub le - { b neg alpha cos mul alpha sin div b neg } - { - % else 360 - theta <= alpha, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } ifelse - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagboxcircum) 2 ldiagdebugprint -} def - -% find quadratic roots (assume a != 0): a b c ldiagqroots x1 x2 2 -% or x2 1 -% or 0 -/ldiagqroots -{ - 4 dict begin - /c exch def - /b exch def - /a exch def - /disc b b mul 4 a c mul mul sub def - disc 0 lt - { 0 - } - { disc 0 eq - { b neg 2 a mul div - 1 - } - { b neg disc sqrt add 2 a mul div - b neg disc sqrt sub 2 a mul div - 2 - } - ifelse - } - ifelse - end -} def - -% work our which quadrant: <angle> ldiagquadrant <0-3> -/ldiagquadrant -{ dup 90 lt - { pop 0 - } - { dup 180 lt - { pop 1 - } - { 270 lt - { 2 - } - { 3 - } ifelse - } ifelse - } ifelse -} def - -% find curvebox circum, assuming upper right quadrant: alpha a b xmk ldiagcb x y -/ldiagcb -{ - 6 dict begin - /xmk exch def - /b exch def - /a exch def - /alpha exch def - /theta1 0 0 a b xmk sub ldiagangleto def - /theta2 0 0 a xmk sub b ldiagangleto def - alpha theta1 le - { % if alpha <= theta1, return (a, a*tan(alpha)) - a a alpha sin mul alpha cos div - } - { alpha theta2 ge - { % else if alpha > theta2, return (b*cot(alpha), b) - b alpha cos mul alpha sin div b - } - { - % else, return the intersection of line and circle - a xmk sub b xmk sub xmk 0 0 alpha ldiagcircleintersect - dup 0 eq - { % should never happen, just return any reasonable point - pop - a b 0.5 ldiagpmul - } - { 1 eq - { % should never happen, just return the point on top of stack - } - { % the usual case, two points on stack, return the larger - ldiagpmax - } ifelse - } ifelse - } ifelse - } ifelse - end -} def - -% find point on circumference of curvebox: alpha a b xmk ldiagcurveboxcircum x y -/ldiagcurveboxcircum -{ - % (Entering ldiagcurveboxcircum) 4 ldiagdebugprint - 5 dict begin - /xmk exch def - /b exch def - /a exch def - ldiagfixangle /alpha exch def - - % work out which quadrant we are in, and reflect accordingly - /quad alpha ldiagquadrant def - quad 0 eq - { alpha a b xmk ldiagcb - } - { quad 1 eq - { 180 alpha sub a b xmk ldiagcb exch neg exch - } - { quad 2 eq - { alpha 180 sub a b xmk ldiagcb neg exch neg exch - } - { 360 alpha sub a b xmk ldiagcb neg - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagcurveboxcircum) 2 ldiagdebugprint -} def - -% find point on circumference of diamond: alpha a b ldiagdiamondcircum x y -/ldiagdiamondcircum -{ - % (Entering ldiagdiamondcircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - b alpha cos abs mul a alpha sin abs mul add /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving ldiagdiamondcircum) 2 ldiagdebugprint -} def - -% find point on circumference of ellipse: alpha a b ldiagellipsecircum x y -/ldiagellipsecircum -{ - % (Entering ldiagellipsecircum) 3 ldiagdebugprint - 4 dict begin - /b exch def - /a exch def - ldiagfixangle /alpha exch def - b alpha cos mul dup mul a alpha sin mul dup mul add sqrt /denom exch def - a b mul alpha cos mul denom div - a b mul alpha sin mul denom div - end - % (Leaving ldiagellipsecircum) 2 ldiagdebugprint -} def - -% find point on circumference of isosceles: alpha a b ldiagisoscelescircum x y -/ldiagisoscelescircum -{ - % (Entering ldiagisoscelescircum) 3 ldiagdebugprint - 7 dict begin - /b exch def - /a exch def - /alpha exch ldiagfixangle def - /theta1 90 def - /theta2 a b 0.5 ldiagpmul 0 0 ldiagangleto def - /theta3 a b 0.5 ldiagpmul a 0 ldiagangleto def - alpha theta1 ge alpha theta2 le and - { 0 0 a 2 div b - } - { alpha theta2 ge alpha theta3 le and - { 0 0 a 0 - } - { a 0 a 2 div b - } ifelse - } ifelse - a 2 div b 2 div 2 copy 1 ft alpha ldiagatangle ldiaglineintersect - a 2 div b 2 div 4 2 roll ldiagpsub - end - % (Leaving ldiagisoscelescircum) 2 ldiagdebugprint -} def - -% find point of intersection of two lines each defined by two points -% x1 y1 x2 y2 x3 y3 x4 y4 ldiaglineintersect x y -/ldiaglineintersect -{ - % (Entering ldiaglineintersect) 8 ldiagdebugprint - 13 dict begin - /y4 exch def - /x4 exch def - /y3 exch def - /x3 exch def - /y2 exch def - /x2 exch def - /y1 exch def - /x1 exch def - x2 x1 sub /x21 exch def - x4 x3 sub /x43 exch def - y2 y1 sub /y21 exch def - y4 y3 sub /y43 exch def - y21 x43 mul y43 x21 mul sub /det exch def - - % calculate x - y21 x43 mul x1 mul - y43 x21 mul x3 mul sub - y3 y1 sub x21 mul x43 mul add - det div - - % calculate y - x21 y43 mul y1 mul - x43 y21 mul y3 mul sub - x3 x1 sub y21 mul y43 mul add - det neg div - - end - % (Leaving ldiaglineintersect) 2 ldiagdebugprint -} def - -% find point on circumference of polygon -% alpha radius num theta ldiagpolycircum x y -/ldiagpolycircum -{ - % (Entering ldiagpolycircum) 4 ldiagdebugprint - 13 dict begin - /theta exch def - /num exch def - /radius exch def - /alpha exch def - - % calculate delta, the angle from theta to alpha - alpha theta sub ldiagfixangle - - % calculate the angle which is the multiple of 360/num closest to delta - 360 num div div truncate 360 num div mul theta add /anglea exch def - - % calculate the next multiple of 360/num after anglea - anglea 360 num div add /angleb exch def - - % intersect the line through these two points with the alpha line - anglea cos anglea sin angleb cos angleb sin - 0 0 alpha cos 2 mul alpha sin 2 mul - ldiaglineintersect radius ldiagpmul - - end - % (Leaving ldiagpolycircum) 2 ldiagdebugprint -} def - -% find point of intersection of a line and a circle -% x0 y0 r x1 y1 theta ldiagcircleintersect xa ya xb yb 2 -% or xb yb 1 -% or 0 -/ldiagcircleintersect -{ - % (Entering ldiagcircleintersect) 6 ldiagdebugprint - 15 dict begin - /theta exch def - /y1 exch def - /x1 exch def - /r exch def - /y0 exch def - /x0 exch def - - % if sin(theta) = 0 then line is horizontal and y must be y1 - theta sin abs 0.00001 lt - { - /a 1 def - /b -2 x0 mul def - /c x0 dup mul y1 y0 sub dup mul add r dup mul sub def - a b c ldiagqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 1 - } - { y1 exch y1 2 - } ifelse - } ifelse - } - { - /ct theta cos theta sin div def - /a ct ct mul 1 add def - /b ct x1 x0 sub mul y1 add y0 sub 2 mul def - /c x1 x0 sub dup mul y1 y0 sub dup mul add r dup mul sub def - a b c ldiagqroots dup - 0 eq - { pop - 0 - } - { 1 eq - { y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xb yb 1 - } - { y1 add /ya exch def - ya y1 sub ct mul x1 add /xa exch def - y1 add /yb exch def - yb y1 sub ct mul x1 add /xb exch def - xa ya xb yb 2 - } ifelse - } ifelse - } ifelse - end - % (Leaving ldiagcircleintersect) 1 ldiagdebugprint -} def - -% find line which is the perpendicular bisector of two points, defined -% by two points -% x1 y1 x2 y2 ldiaglinebetween x3 y3 x4 y4 -/ldiaglinebetween -{ % (Entering ldiaglinebetween) 4 ldiagdebugprint - /y2 exch def /x2 exch def - /y1 exch def /x1 exch def - - % let x3, y3 be the point halfway between the two points - x1 y1 x2 y2 ldiagpadd 0.5 ldiagpmul - /y3 exch def /x3 exch def - - % find a point perpendicular to x3, y3 - x3 y3 50 x1 y1 x2 y2 ldiagangleto 90 dg add ldiagatangle - - % plus x3 y3 gives the two points - x3 y3 - - % (Leaving ldiaglinebetween) 4 ldiagdebugprint -} def - -% find <proc>@<string>: <proc> <string> ldiagfindlabel <any> true -% <proc> <string> false -/ldiagfindlabel -{ - % (Entering ldiagfindlabel) 2 ldiagdebugprint - exch dup length 1 ne - { exch false - % (Leaving ldiagfindabel (length not 1)) 3 ldiagdebugprint - } - { dup 0 get type /nametype ne - { exch false - % (Leaving ldiagfindabel (not a name)) 3 ldiagdebugprint - } - { dup 0 get 50 string cvs (@) ldiagconcat 2 index ldiagconcat dup where - { exch get exch pop exch pop cvx exec true - % (Leaving ldiagfindlabel with success) 100 ldiagdebugprint - } - { - pop exch false - % (Leaving ldiagfindabel (concat not sensible)) 3 ldiagdebugprint - } ifelse - } ifelse - } ifelse -} bind def - -% execute <proc>@<string> or else default: <proc> <string> ldiagdolabel <various> -/ldiagdolabel -{ - % (Entering ldiagdolabel) 2 ldiagdebugprint - ldiagfindlabel not - { - dup (CIRCUM) eq - { pop pop pop 0 0 - } - { - dup (ANGLE) eq - { pop pop 0 - } - { pop cvx exec - } ifelse - } ifelse - } if - % (Leaving ldiagdolabel) 2 ldiagdebugprint -} bind def - -% execute a proc depending on whether number is negative, zero, or positive -% procneg proczero procpos number ldiagsigncase <anything> -/ldiagsigncase -{ - % (Entering ldiagsigncase) 4 ldiagdebugprint - dup 0 lt - { pop pop pop exec - } - { 0 gt - { exch pop exch pop exec - } - { pop exch pop exec - } ifelse - } ifelse - % (Leaving ldiagsigncase) 0 ldiagdebugprint -} bind def - -% execute proci if angle is in ith quadrant -% proc45 proc270 proc180 proc90 proc0 proc315 proc225 proc135 angle ldiagquadcase <anything> -/ldiagquadcase -{ - % (Entering ldiagquadcase) 9 ldiagdebugprint - round ldiagfixangle cvi dup 90 mod 0 eq - { 90 idiv 4 add } { 90 idiv } ifelse - 8 exch roll pop pop pop pop pop pop pop exec - % (Leaving ldiagquadcase) 0 ldiagdebugprint -} bind def - -% decode Lout length into PostScript length -% <string> ldiagdecodelength <number> -/ldiagdecodelength -{ - % (Entering ldiagdecodelength) 1 ldiagdebugprint - (f) search - { exch pop exch pop cvr ft - } - { (c) search - { exch pop exch pop cvr cm - } - { (p) search - { exch pop exch pop cvr pt - } - { (m) search - { exch pop exch pop cvr em - } - { (s) search - { exch pop exch pop cvr sp - } - { (v) search - { exch pop exch pop cvr vs - } - { (i) search - { exch pop exch pop cvr in - } - { pop 0 - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - } ifelse - % (Leaving ldiagdecodelength) 1 ldiagdebugprint -} def - -% implement aabout function -% logical form: <circum> <extra> <centre> aabout <point> -% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx aabout <point> -/ldiagaabout -{ - /centre exch def - /extra exch def - /circum exch def - - /ZXCTR [ centre ] cvx def - /ZFCTR [ circum (CTR) ldiagdolabel ] cvx def - /ZAREF ZFCTR ZXCTR ldiagangleto def - /ZAMIN 0 dg def - /ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMIN sub ldiagatangle - ldiagpadd ] cvx def - - /ZAMAX 90 dg def - /ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMAX sub ldiagatangle - ldiagpadd ] cvx def - - 1 1 20 - { /xval exch def - /ZAMID ZAMIN ZAMAX add 0.5 mul def - /ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID sub - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMID sub ldiagatangle - ldiagpadd ] cvx def - ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt - { - /ZAMAX [ ZAMID ] cvx def - /ZPMAX [ ZPMID ] cvx def - } - { - /ZAMIN [ ZAMID ] cvx def - /ZPMIN [ ZPMID ] cvx def - } ifelse - } for - ZPMID -} def - -% implement cabout function -% logical form: <circum> <extra> <centre> cabout <point> -% actual form: { <labelorpoint> } cvlit <length> [ <point> ] cvx cabout <point> -/ldiagcabout -{ - /centre exch def - /extra exch def - /circum exch def - - /ZXCTR [ centre ] cvx def - /ZFCTR [ circum (CTR) ldiagdolabel ] cvx def - /ZAREF ZFCTR ZXCTR ldiagangleto def - /ZAMIN 0 dg def - /ZPMIN [ circum (CTR) ldiagdolabel ZAREF ZAMIN add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMIN add ldiagatangle - ldiagpadd ] cvx def - - /ZAMAX 90 dg def - /ZPMAX [ circum (CTR) ldiagdolabel ZAREF ZAMAX add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMAX add ldiagatangle - ldiagpadd ] cvx def - - 1 1 20 - { /xval exch def - /ZAMID ZAMIN ZAMAX add 0.5 mul def - /ZPMID [ circum (CTR) ldiagdolabel ZAREF ZAMID add - circum (CIRCUM) ldiagdolabel ldiagpadd - 0 0 extra ZAREF ZAMID add ldiagatangle - ldiagpadd ] cvx def - ZPMID ZXCTR ldiagdistance ZFCTR ZXCTR ldiagdistance gt - { - /ZAMAX [ ZAMID ] cvx def - /ZPMAX [ ZPMID ] cvx def - } - { - /ZAMIN [ ZAMID ] cvx def - /ZPMIN [ ZPMID ] cvx def - } ifelse - } for - ZPMID -} def - -% fromarrowlength toarrowlength { from } { to } xindent zindent ldiaglinepath - -/ldiaglinepath -{ - % (entering ldiaglinepath) 0 ldiagdebugprint - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto - /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - FROM@ANGLE /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef - - FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - FROM@ANGLE /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - 0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef - FROM@ANGLE /LTO@ANGLE ldiagangledef - - direct { FROM TO } { FROM LFROM LMID LTO TO } ifelse - - % (leaving ldiaglinepath) 0 ldiagdebugprint -} def - -% fromarrowlength toarrowlength { from } { to } xindent zindent pathgap ldiagdoublelinepath - -/ldiagdoublelinepath -{ - % (entering ldiagdoublelinepath) 0 ldiagdebugprint - /pathgap exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagangleto - /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - FROM@ANGLE /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg sub to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TO@ANGLE 180 dg sub ldiagatangle ldiagpadd /TO ldiagpointdef - - FROM 0.5 ldiagpmul TO 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - FROM@ANGLE /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - 0 0 ZINDENT FROM@ANGLE ldiagatangle TO ldiagpsub /LTO ldiagpointdef - FROM@ANGLE /LTO@ANGLE ldiagangledef - - direct { - FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - [] - FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - } - { - FROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LFROM pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LMID pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - LTO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg sub ldiagatangle - [] - FROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LFROM pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LMID pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - LTO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - TO pathgap 2 div FROM@ANGLE 90 dg add ldiagatangle - } ifelse - - % (leaving ldiagdoublelinepath) 0 ldiagdebugprint -} def - -% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagacurvepath - -/ldiagacurvepath -{ - % (entering ldiagacurvepath) 0 ldiagdebugprint - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - %/B1 bias 0.02 ft ldiagmax def - %/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def - %/BIAS B1 B2 ldiagmin def - /BIAS bias 0.02 ft ldiagmax def - /XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul - to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def - /XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto 90 dg sub ldiagatangle ldiagpadd ] cvx def - /CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween - to (CTR) ldiagdolabel XTOP ldiaglinebetween - ldiaglineintersect ] cvx def - - from fromarrowlength [ CTR ] cvx ldiagaabout /FROM ldiagpointdef - from (CTR) ldiagdolabel FROM ldiagdistance 0 gt - { from (CTR) ldiagdolabel FROM ldiagangleto - } - { CTR FROM ldiagangleto 90 dg add - } ifelse /FROM@ANGLE ldiagangledef - - to toarrowlength [ CTR ] cvx ldiagcabout /TO ldiagpointdef - TO to (CTR) ldiagdolabel ldiagdistance 0 gt - { TO to (CTR) ldiagdolabel ldiagangleto - } - { CTR TO ldiagangleto 90 dg add - } ifelse /TO@ANGLE ldiagangledef - - /RADIUS CTR FROM ldiagdistance def - CTR 0 0 RADIUS CTR FROM ldiagangleto 360 dg CTR TO ldiagangleto - add CTR FROM ldiagangleto sub cvi 360 mod 0.5 mul add - ldiagatangle ldiagpadd /LMID ldiagpointdef - CTR LMID ldiagangleto 90 dg add /LMID@ANGLE ldiagangledef - - /XINDENT xindent FROM LMID ldiagdistance ldiagmin def - CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle - ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef - CTR LFROM ldiagangleto 90 dg add /LFROM@ANGLE ldiagangledef - - /ZINDENT zindent TO LMID ldiagdistance ldiagmin def - CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add - ldiagatangle ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef - CTR LTO ldiagangleto 90 dg add /LTO@ANGLE ldiagangledef - - direct - { FROM [CTR] TO } - { FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO } - ifelse - - % (leaving ldiagacurvepath) 0 ldiagdebugprint -} def - -% fromarrowlen toarrowlen { from } { to } xindent zindent bias ldiagccurvepath - -/ldiagccurvepath -{ - % (entering ldiagccurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - %/B1 bias 0.02 ft ldiagmax def - %/B2 from (CTR) ldiagdolabel to (CTR) ldiagdolabel ldiagdistance 0.5 mul def - %/BIAS B1 B2 ldiagmin def - /BIAS bias 0.02 ft ldiagmax def - /XMID [ from (CTR) ldiagdolabel 0.5 ldiagpmul - to (CTR) ldiagdolabel 0.5 ldiagpmul ldiagpadd ] cvx def - /XTOP [ XMID 0 0 BIAS from (CTR) ldiagdolabel to (CTR) ldiagdolabel - ldiagangleto 90 dg add ldiagatangle ldiagpadd ] cvx def - /CTR [ from (CTR) ldiagdolabel XTOP ldiaglinebetween - to (CTR) ldiagdolabel XTOP ldiaglinebetween ldiaglineintersect ] cvx def - - from fromarrowlength [ CTR ] cvx ldiagcabout /FROM ldiagpointdef - from (CTR) ldiagdolabel FROM ldiagdistance 0 gt - { from (CTR) ldiagdolabel FROM ldiagangleto } - { CTR FROM ldiagangleto 90 dg sub } - ifelse /FROM@ANGLE ldiagangledef - - to toarrowlength [ CTR ] cvx ldiagaabout /TO ldiagpointdef - TO to (CTR) ldiagdolabel ldiagdistance 0 gt - { TO to (CTR) ldiagdolabel ldiagangleto } - { CTR TO ldiagangleto 90 dg sub } - ifelse /TO@ANGLE ldiagangledef - - /RADIUS [ CTR FROM ldiagdistance ] cvx def - CTR 0 0 RADIUS CTR TO ldiagangleto 360 dg CTR FROM ldiagangleto add - CTR TO ldiagangleto sub cvi 360 cvi mod 2 div add ldiagatangle - ldiagpadd /LMID ldiagpointdef - CTR LMID ldiagangleto 90 dg sub /LMID@ANGLE ldiagangledef - - /XINDENT [ xindent FROM LMID ldiagdistance ldiagmin ] cvx def - CTR 0 0 RADIUS CTR FROM 0 0 XINDENT FROM@ANGLE ldiagatangle ldiagpadd - ldiagangleto ldiagatangle ldiagpadd /LFROM ldiagpointdef - CTR LFROM ldiagangleto 90 dg sub /LFROM@ANGLE ldiagangledef - - /ZINDENT [ zindent TO LMID ldiagdistance ldiagmin ] cvx def - CTR 0 0 RADIUS CTR TO 0 0 ZINDENT TO@ANGLE 180 dg add ldiagatangle - ldiagpadd ldiagangleto ldiagatangle ldiagpadd /LTO ldiagpointdef - CTR LTO ldiagangleto 90 dg sub /LTO@ANGLE ldiagangledef - - direct - { FROM [CTR clockwise] TO } - { FROM [CTR clockwise] LFROM [CTR clockwise] - LMID [CTR clockwise] LTO [CTR clockwise] TO } - ifelse - % (leaving ldiagccurvepath) 0 ldiagdebugprint -} def - - -% farr tarr { from } { to } xindent zindent [frompt] [topt] ldiagbezierpath - -/ldiagbezierpath -{ - % (entering ldiagbezierpath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - cvx /topt exch def - cvx /frompt exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel frompt ldiagangleto /FROM@ANGLE ldiagangledef - from (CTR) ldiagdolabel FROM@ANGLE from (CIRCUM) ldiagdolabel - ldiagpadd 0 0 fromarrowlength FROM@ANGLE ldiagatangle ldiagpadd - /FROM ldiagpointdef - - topt to (CTR) ldiagdolabel ldiagangleto /TO@ANGLE ldiagangledef - to (CTR) ldiagdolabel TO@ANGLE 180 dg add to (CIRCUM) ldiagdolabel - ldiagpadd 0 0 toarrowlength TO@ANGLE 180 dg add ldiagatangle ldiagpadd - /TO ldiagpointdef - - FROM 0 0 xindent FROM@ANGLE ldiagatangle ldiagpadd - /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - - TO 0 0 zindent TO@ANGLE 180 dg add ldiagatangle ldiagpadd - /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - FROM TO ldiagpadd frompt ldiagpadd topt ldiagpadd 0.25 ldiagpmul - /LMID ldiagpointdef - - FROM [frompt topt] TO - - % (leaving ldiagbezierpath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent ldiagvhlinepath - -/ldiagvhlinepath -{ - % (entering ldiagvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /XINDENT [ xindent FDIST ldiagmin ] cvx def - /ZINDENT [ zindent TDIST ldiagmin ] cvx def - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - CTR /LMID ldiagpointdef - 0 0 1 ft FANG 180 dg add ldiagatangle - 0 0 1 ft TANG 180 dg add ldiagatangle - ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM LMID LTO TO - - % (leaving ldiagvhlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent radius ldiagvhcurvepath - -/ldiagvhcurvepath -{ - % (entering ldiagvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def - /XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def - /ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def - - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - /FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def - /TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - /XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd - 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd - /LMID ldiagpointdef - FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM FCTR - {[XCTR clockwise]} {} {} {} {} {[XCTR]} {[XCTR clockwise]} {[XCTR]} - FCTR TCTR ldiagangleto ldiagquadcase - TCTR LTO TO - - % (leaving ldiagvhcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent ldiaghvlinepath - -/ldiaghvlinepath -{ - % (entering ldiaghvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /XINDENT [ xindent FDIST ldiagmin ] cvx def - /ZINDENT [ zindent TDIST ldiagmin ] cvx def - - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - CTR /LMID ldiagpointdef - 0 0 1 ft FANG 180 dg add ldiagatangle - 0 0 1 ft TANG 180 dg add ldiagatangle ldiagangleto - /LMID@ANGLE ldiagangledef - - FROM LFROM LMID LTO TO - - % (leaving ldiaghvlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent radius ldiaghvcurvepath - -/ldiaghvcurvepath -{ - % (entering ldiaghvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /CTR [ to (CTR) ldiagdolabel pop from (CTR) ldiagdolabel exch pop ] cvx def - /FANG [ from (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - /TANG [ to (CTR) ldiagdolabel CTR ldiagangleto ] cvx def - - from (CTR) ldiagdolabel FANG from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength FANG ldiagatangle ldiagpadd /FROM ldiagpointdef - FANG /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel TANG to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength TANG ldiagatangle ldiagpadd /TO ldiagpointdef - TANG 180 dg add /TO@ANGLE ldiagangledef - - /FDIST [ FROM CTR ldiagdistance ] cvx def - /TDIST [ TO CTR ldiagdistance ] cvx def - /RADIUS [ radius FDIST TDIST ldiagmin ldiagmin ] cvx def - /XINDENT [ xindent FDIST RADIUS sub ldiagmin ] cvx def - /ZINDENT [ zindent TDIST RADIUS sub ldiagmin ] cvx def - FROM 0 0 XINDENT FANG ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - TO 0 0 ZINDENT TANG ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - - /FCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd ] cvx def - /TCTR [ CTR 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - /XCTR [ CTR 0 0 RADIUS FROM@ANGLE 180 dg add ldiagatangle ldiagpadd - 0 0 RADIUS TO@ANGLE ldiagatangle ldiagpadd ] cvx def - XCTR 0 0 RADIUS XCTR CTR ldiagangleto ldiagatangle ldiagpadd - /LMID ldiagpointdef - FCTR TCTR ldiagangleto /LMID@ANGLE ldiagangledef - - FROM LFROM FCTR - {[XCTR]} {} {} {} {} {[XCTR clockwise]} {[XCTR]} {[XCTR clockwise]} - FCTR TCTR ldiagangleto ldiagquadcase - TCTR LTO TO - - % (leaving ldiaghvcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias ldiaglvrlinepath - -/ldiaglvrlinepath -{ - % (entering ldiaglvrlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 180 dg /FROM@ANGLE ldiagangledef - - to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 0 dg /TO@ANGLE ldiagangledef - - /XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def - XLEFT FROM exch pop /P1 ldiagpointdef - XLEFT TO exch pop /P2 ldiagpointdef - /VERT [ P1 P2 ldiagangleto ] cvx def - P1 P1 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef - P2 P2 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef - - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef - 180 dg /LFROM@ANGLE ldiagangledef - ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef - 0 dg /LTO@ANGLE ldiagangledef - - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiaglvrlinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias radius ldiaglvrcurvepath - -/ldiaglvrcurvepath -{ - % (entering ldiaglvrcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 180 dg from (CIRCUM) ldiagdolabel ldiagpadd 0 0 - fromarrowlength 180 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 180 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 180 dg to (CIRCUM) ldiagdolabel ldiagpadd 0 0 - toarrowlength 180 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 0 dg /TO@ANGLE ldiagangledef - /XLEFT [ FROM pop TO pop ldiagmin bias sub ] cvx def - /XP1 [ XLEFT FROM exch pop ] cvx def - /XP2 [ XLEFT TO exch pop ] cvx def - /VERT [ XP1 XP2 ldiagangleto ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - XINDENT 0 FROM ldiagpsub /LFROM ldiagpointdef - 180 dg /LFROM@ANGLE ldiagangledef - ZINDENT 0 TO ldiagpsub /LTO ldiagpointdef - 0 dg /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 2 div ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd - /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RADIUS 0 dg ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd - /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - FROM LFROM XP1PRE - { } { [XP1CTR] P1 [XP1CTR] } { } { [XP1CTR clockwise] P1 [XP1CTR clockwise] } - { } { } { } { } VERT round ldiagquadcase - XP1POST LMID XP2PRE - { } { [XP2CTR] P2 [XP2CTR] } { } { [XP2CTR clockwise] P2 [XP2CTR clockwise] } - { } { } { } { } VERT round ldiagquadcase - XP2POST LTO TO - - % (leaving ldiaglvrcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias ldiagrvllinepath - -/ldiagrvllinepath -{ - % (entering ldiagrvllinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 0 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 180 dg /TO@ANGLE ldiagangledef - /XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def - XRIGHT FROM exch pop /P1 ldiagpointdef - XRIGHT TO exch pop /P2 ldiagpointdef - /VERT [ P1 P2 ldiagangleto ] cvx def - P1 P1 0 0 1 ft 0 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P1@ANGLE ldiagangledef - P2 P2 0 0 1 ft 180 dg ldiagatangle ldiagpadd 0 0 1 ft VERT ldiagatangle - ldiagpadd ldiagangleto /P2@ANGLE ldiagangledef - P1 0.5 ldiagpmul P2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent P2 TO ldiagdistance ldiagmin ] cvx def - FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef - 0 dg /LFROM@ANGLE ldiagangledef - TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef - 180 dg /LTO@ANGLE ldiagangledef - FROM LFROM P1 LMID P2 LTO TO - - % (leaving ldiagrvllinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - - -% farr tarr { from } { to } xindent zindent bias radius ldiagrvlcurvepath - -/ldiagrvlcurvepath -{ - % (entering ldiagrvlcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - from (CTR) ldiagdolabel 0 dg from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength 0 dg ldiagatangle ldiagpadd /FROM ldiagpointdef - 0 dg /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel 0 dg to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength 0 dg ldiagatangle ldiagpadd /TO ldiagpointdef - 180 dg /TO@ANGLE ldiagangledef - /XRIGHT [ FROM pop TO pop ldiagmax bias add ] cvx def - /XP1 [ XRIGHT FROM exch pop ] cvx def - /XP2 [ XRIGHT TO exch pop ] cvx def - /VERT [ XP1 XP2 ldiagangleto ] cvx def - XP1 0.5 ldiagpmul XP2 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - VERT /LMID@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1 ldiagdistance ldiagmin ] cvx def - /ZINDENT [ zindent XP2 TO ldiagdistance ldiagmin ] cvx def - FROM XINDENT 0 ldiagpadd /LFROM ldiagpointdef - 0 dg /LFROM@ANGLE ldiagangledef - TO ZINDENT 0 ldiagpadd /LTO ldiagpointdef - 180 dg /LTO@ANGLE ldiagangledef - /RADIUS [ radius XP1 XP2 ldiagdistance 0.5 mul ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RADIUS VERT ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RADIUS XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd - /P1 ldiagpointdef - XP1PRE XP1POST ldiagangleto /P1@ANGLE ldiagangledef - /XP2PRE [ 0 0 RADIUS VERT ldiagatangle XP2 ldiagpsub ] cvx def - /XP2POST [ XP2 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RADIUS 180 dg ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RADIUS XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd - /P2 ldiagpointdef - XP2PRE XP2POST ldiagangleto /P2@ANGLE ldiagangledef - FROM LFROM XP1PRE - {} {[XP1CTR clockwise] P1 [XP1CTR clockwise]} {} {[XP1CTR] P1 [XP1CTR]} - {} {} {} {} VERT round ldiagquadcase - XP1POST LMID XP2PRE - {} {[XP2CTR clockwise] P2 [XP2CTR clockwise]} {} {[XP2CTR] P2 [XP2CTR]} - {} {} {} {} VERT round ldiagquadcase - XP2POST LTO TO - - % (leaving ldiagrvlcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias ldiagdwraplinepath - -/ldiagdwraplinepath -{ - % (entering ldiagdwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop - lt { 180 dg } { 0 dg } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd 0 0 - fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P1@ANGLE ldiagangledef - TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd - /P4 ldiagpointdef - DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P4@ANGLE ldiagangledef - /YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmin bias 0 ldiagmax sub ] cvx def - P1 pop YC /P2 ldiagpointdef - P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef - P4 pop YC /P3 ldiagpointdef - P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - /ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - FROM P1 P2 P3 P4 TO - - % (leaving ldiagdwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias radius -% ldiagdwrapcurvepath - -/ldiagdwrapcurvepath -{ - % (entering ldiagdwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - /CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { anticlockwise } { clockwise } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - /XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def - /XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def - /YC [ from (CTR) ldiagdolabel 270 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 270 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmin bias 0 ldiagmax sub ] cvx def - /XP2 [ XP1 pop YC ] cvx def - /XP3 [ XP4 pop YC ] cvx def - /RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1CTR P1 ldiagangleto DIRN add 90 dg sub /P1@ANGLE ldiagangledef - /RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2CTR P2 ldiagangleto DIRN add 90 dg sub /P2@ANGLE ldiagangledef - /RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef - XP3CTR P3 ldiagangleto DIRN add 90 dg sub /P3@ANGLE ldiagangledef - /RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance - ldiagmin ldiagmin ] cvx def - /XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef - XP4CTR P4 ldiagangleto DIRN add 90 dg sub /P4@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - /ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - FROM LFROM - XP1PRE [XP1CTR CLOCK] XP1POST - XP2PRE [XP2CTR CLOCK] XP2POST - LMID - XP3PRE [XP3CTR CLOCK] XP3POST - XP4PRE [XP4CTR CLOCK] XP4POST - LTO TO - - % (leaving ldiagdwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias ldiaguwraplinepath - -/ldiaguwraplinepath -{ - % (entering ldiaguwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd /P1 ldiagpointdef - DIRN 180 dg eq { 135 dg } { 45 dg } ifelse /P1@ANGLE ldiagangledef - TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd - /P4 ldiagpointdef - DIRN 180 dg eq { 225 dg } { -45 dg } ifelse /P4@ANGLE ldiagangledef - /YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmax bias 0 ldiagmax add ] cvx def - P1 pop YC /P2 ldiagpointdef - P4@ANGLE 180 dg sub /P2@ANGLE ldiagangledef - P4 pop YC /P3 ldiagpointdef - P1@ANGLE 180 dg sub /P3@ANGLE ldiagangledef - /XINDENT [ xindent FROM P1 ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - /ZINDENT [ zindent TO P4 ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - P2 0.5 ldiagpmul P3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - FROM P1 P2 P3 P4 TO - - % (leaving ldiaguwraplinepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% farr tarr { from } { to } xindent zindent bias fbias tbias radius -% ldiaguwrapcurvepath - -/ldiaguwrapcurvepath -{ - % (entering ldiaguwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop - /radius exch def - /tbias exch def - /fbias exch def - /bias exch def - /zindent exch def - /xindent exch def - cvlit /to exch def - cvlit /from exch def - /toarrowlength exch def - /fromarrowlength exch def - - /DIRN [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { 180 dg } { 0 dg } ifelse ] cvx def - /CLOCK [ from (CTR) ldiagdolabel pop to (CTR) ldiagdolabel pop lt - { clockwise } { anticlockwise } ifelse ] cvx def - from (CTR) ldiagdolabel DIRN from (CIRCUM) ldiagdolabel ldiagpadd - 0 0 fromarrowlength DIRN ldiagatangle ldiagpadd /FROM ldiagpointdef - DIRN /FROM@ANGLE ldiagangledef - to (CTR) ldiagdolabel DIRN 180 dg add to (CIRCUM) ldiagdolabel ldiagpadd - 0 0 toarrowlength DIRN 180 dg add ldiagatangle ldiagpadd /TO ldiagpointdef - DIRN /TO@ANGLE ldiagangledef - /XP1 [ FROM 0 0 fbias 0 ldiagmax DIRN ldiagatangle ldiagpadd ] cvx def - /XP4 [ TO 0 0 tbias 0 ldiagmax DIRN 180 dg add ldiagatangle ldiagpadd ] cvx def - /YC [ from (CTR) ldiagdolabel 90 dg from (CIRCUM) ldiagdolabel ldiagpadd - exch pop to (CTR) ldiagdolabel 90 dg to (CIRCUM) ldiagdolabel ldiagpadd - exch pop ldiagmax bias 0 ldiagmax add ] cvx def - /XP2 [ XP1 pop YC ] cvx def - /XP3 [ XP4 pop YC ] cvx def - /RP1 [ radius XP1 FROM ldiagdistance XP1 XP2 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP1PRE [ XP1 0 0 RP1 XP1 FROM ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1POST [ XP1 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP1CTR [ XP1PRE 0 0 RP1 XP1 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP1CTR 0 0 RP1 XP1CTR XP1 ldiagangleto ldiagatangle ldiagpadd /P1 ldiagpointdef - XP1CTR P1 ldiagangleto DIRN add 90 dg add /P1@ANGLE ldiagangledef - /RP2 [ radius XP1 XP2 ldiagdistance 2 div XP2 XP3 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP2PRE [ XP2 0 0 RP2 XP2 XP1 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2POST [ XP2 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP2CTR [ XP2PRE 0 0 RP2 XP2 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP2CTR 0 0 RP2 XP2CTR XP2 ldiagangleto ldiagatangle ldiagpadd /P2 ldiagpointdef - XP2CTR P2 ldiagangleto DIRN add 90 dg add /P2@ANGLE ldiagangledef - /RP3 [ radius XP2 XP3 ldiagdistance 2 div XP3 XP4 ldiagdistance 2 div - ldiagmin ldiagmin ] cvx def - /XP3PRE [ XP3 0 0 RP3 XP3 XP2 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3POST [ XP3 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP3CTR [ XP3PRE 0 0 RP3 XP3 XP4 ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP3CTR 0 0 RP3 XP3CTR XP3 ldiagangleto ldiagatangle ldiagpadd /P3 ldiagpointdef - XP3CTR P3 ldiagangleto DIRN add 90 dg add /P3@ANGLE ldiagangledef - /RP4 [ radius XP4 XP3 ldiagdistance 2 div XP4 TO ldiagdistance - ldiagmin ldiagmin ] cvx def - /XP4PRE [ XP4 0 0 RP4 XP4 XP3 ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4POST [ XP4 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - /XP4CTR [ XP4PRE 0 0 RP4 XP4 TO ldiagangleto ldiagatangle ldiagpadd ] cvx def - XP4CTR 0 0 RP4 XP4CTR XP4 ldiagangleto ldiagatangle ldiagpadd /P4 ldiagpointdef - XP4CTR P4 ldiagangleto DIRN add 90 dg add /P4@ANGLE ldiagangledef - /XINDENT [ xindent FROM XP1PRE ldiagdistance ldiagmin ] cvx def - FROM 0 0 XINDENT DIRN ldiagatangle ldiagpadd /LFROM ldiagpointdef - FROM@ANGLE /LFROM@ANGLE ldiagangledef - XP2 0.5 ldiagpmul XP3 0.5 ldiagpmul ldiagpadd /LMID ldiagpointdef - DIRN 180 dg sub /LMID@ANGLE ldiagangledef - /ZINDENT [ zindent TO XP4POST ldiagdistance ldiagmin ] cvx def - TO 0 0 ZINDENT DIRN 180 dg add ldiagatangle ldiagpadd /LTO ldiagpointdef - TO@ANGLE /LTO@ANGLE ldiagangledef - FROM LFROM - XP1PRE [XP1CTR CLOCK] XP1POST - XP2PRE [XP2CTR CLOCK] XP2POST - LMID - XP3PRE [XP3CTR CLOCK] XP3POST - XP4PRE [XP4CTR CLOCK] XP4POST - LTO TO - - % (leaving ldiaguwrapcurvepath) 0 ldiagdebugprint - % count ( stack size is) 1 ldiagdebugprint pop -} def - -% shape and labels of the @SolidArrowHead symbol -% - ldiagsolidarrowhead - -/ldiagsolidarrowhead -{ - 0 0 xsize ysize 0.5 mul 0 ysize -} def - -% shape and labels of the @OpenArrowHead symbol -% <pathwidth> ldiagopenarrowhead - -/ldiagopenarrowhead -{ - /pathwidth exch def - /PSW [ 0 0 ] cvx def - /PNW [ 0 ysize ] cvx def - /PE [ xsize ysize 0.5 mul ] cvx def - /REL [ 0 0 pathwidth PE PNW ldiagangleto 90 add ldiagatangle ] cvx def - /PNA [ 0 ysize 0.5 mul pathwidth 0.5 mul add ] cvx def - /PSA [ 0 ysize 0.5 mul pathwidth 0.5 mul sub ] cvx def - /PNI [ PNA PNA xsize 0 ldiagpadd PNW REL ldiagpadd - PE REL ldiagpadd ldiaglineintersect ] cvx def - /PSI [ 0 pathwidth PNI ldiagpsub ] cvx def - - PSW PE PNW PNI PNA PSA PSI PSW -} def - -% shape and labels of the @HalfOpenArrowHead symbol -% <pathwidth> ldiaghalfopenarrowhead - -/ldiaghalfopenarrowhead -{ - /pathwidth exch def - 0 0 - xsize ysize 0.5 mul - 0 ysize - xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul add - 0 ysize 0.5 mul pathwidth 0.5 mul add - 0 ysize 0.5 mul pathwidth 0.5 mul sub - xsize 0.3 mul ysize 0.5 mul pathwidth 0.5 mul sub - 0 0 -} def - -% shape and labels of the @SolidCurvedArrowHead symbol -% - ldiagsolidcurvedarrowhead - -/ldiagsolidcurvedarrowhead -{ - 0 0 - [0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect clockwise] - xsize ysize 0.5 mul - [xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect clockwise] - 0 ysize -} def - -% shape and labels of the @OpenCurvedArrowHead symbol -% <pathwidth> ldiagopencurvedarrowhead - -/ldiagopencurvedarrowhead -{ - /pathwidth exch def - /LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /PW2 [ pathwidth 0.5 mul ] cvx def - /UMID [ - 0 ysize 0.5 mul PW2 add - xsize ysize 0.5 mul PW2 add - 0 ysize 0 0 1 ft UR 0 ysize ldiagangleto 90 add ldiagatangle - ldiagpadd 0 ysize ldiaglineintersect - ] cvx def - /LMID [ 0 pathwidth UMID ldiagpsub ] cvx def - 0 0 - [LR clockwise] - xsize ysize 0.5 mul - [UR clockwise] - 0 ysize - UMID - 0 ysize 0.5 mul PW2 add - 0 ysize 0.5 mul PW2 sub - LMID - 0 0 -} def - -% shape and labels of the @HalfOpenCurvedArrowHead symbol -% <pathwidth> ldiaghalfopencurvedarrowhead - -/ldiaghalfopencurvedarrowhead -{ - /pathwidth exch def - /LR [ 0 0 xsize ysize 0.5 mul ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /UR [ xsize ysize 0.5 mul 0 ysize ldiaglinebetween - xsize 0 xsize ysize ldiaglineintersect - ] cvx def - /BR [ 0 0 LR 0 ysize UR ldiaglineintersect ] cvx def - /BRAD [ 0 0 BR ldiagdistance ] cvx def - /PW2 [ pathwidth 0.5 mul ] cvx def - /XDIST [ BRAD dup mul PW2 dup mul sub sqrt ] cvx def - /UMID [ BR XDIST PW2 ldiagpadd ] cvx def - /LMID [ BR XDIST 0 PW2 sub ldiagpadd ] cvx def - 0 0 - [LR clockwise] - xsize ysize 0.5 mul - [UR clockwise] - 0 ysize - [BR clockwise] - UMID - 0 ysize 0.5 mul PW2 add - 0 ysize 0.5 mul PW2 sub - LMID - [BR clockwise] - 0 0 -} def - -end -%%EndResource - -%%BeginResource: procset LoutBasicSetup -% @PrependGraphic file /export/home/6monthspace/jeff/lout.lib/include/bsf.lpg - -% width height linethickness louteuro - -% draw a Euro symbol of this width and height with this line thickness -/louteuro { - 20 dict begin - /eurothick exch def - /euroheight exch def - /eurowidth exch def - /eurostrokewidth euroheight 0.8 mul def - /eurostep eurothick 60 cos mul 60 sin div def - /eurotheta 40 def - - % llx lly width thickness louteurobox - - % draw angled box starting at (llx, lly) with given width and thickness - /louteurobox - { - /euroboxthick exch def - /euroboxwidth exch def - newpath moveto euroboxwidth 0 rlineto - eurostep euroboxthick rlineto - euroboxwidth neg 0 rlineto closepath fill - } def - - % lower cross stroke - 0 euroheight 2 div eurothick 1.5 mul sub - eurostrokewidth eurothick louteurobox - - % upper cross stroke - 0 euroheight 2 div eurothick 0.5 mul add - eurostrokewidth eurostep 2 mul add eurothick louteurobox - - % circular part - /eurohctr eurowidth euroheight 2 div eurotheta cos mul sub def - /eurovctr euroheight 2 div def - newpath - eurohctr eurovctr eurovctr eurotheta 350 eurotheta sub arc - eurohctr eurovctr eurovctr eurothick sub 365 eurotheta sub eurotheta arcn - closepath fill - end -} def - -% path for @FullWidthRule symbol -/LoutRule -{ 0 0 moveto xsize 0 lineto -} def - -% path for @Box symbol -/LoutBox -{ 0 0 moveto xsize 0 lineto - xsize ysize lineto 0 ysize lineto - closepath -} def - -% path for @CurveBox symbol -/LoutCurveBox -{ xmark 0 moveto - xsize xmark sub xmark xmark 270 360 arc - xsize xmark sub ysize xmark sub xmark 0 90 arc - xmark ysize xmark sub xmark 90 180 arc - xmark xmark xmark 180 270 arc - closepath -} def - -% path for @ShadowBox symbol -/LoutShadowBox -{ xmark 2 mul 0 moveto xsize 0 lineto - xsize ysize xmark 2 mul sub lineto - xsize xmark sub ysize xmark 2 mul sub lineto - xsize xmark sub xmark lineto - xmark 2 mul xmark lineto - closepath -} def - -% set up dictionary containing margin note data: parity LoutMargSet - -/LoutMargSet -{ /LoutMargDict 12 dict def - LoutMargDict begin - /parity exch def - /matr matrix currentmatrix def - /rightx xsize def - /lefty ysize def % highest allowable point for top of next left note - /righty ysize def % highest allowable point for top of next right note - /max { 2 copy gt { pop } { exch pop } ifelse } def - /min { 2 copy lt { pop } { exch pop } ifelse } def - end -} def - -%translate coordinate system for marginal notes: type LoutMargShift - -% where type 0 is left margin, 1 is right margin, 2 is outer, 3 is inner -/LoutMargShift -{ LoutMargDict begin - - % y coordinate of top of note, in margin coords, before vertical adjust - 0 ysize transform matr itransform exch pop - - % decide whether left or right margin based on type and parity - exch [ 0 1 parity 1 parity sub ] exch get 0 eq - { - % left margin: adjust top of note downwards if overlaps previous note - lefty min - - % bottom of note is new lefty position and also translate position - ysize sub dup /lefty exch def - - % want right edge of note at coordinate zero - xsize neg exch - } - { - % right margin: adjust top of note downwards if overlaps previous note - righty min - - % bottom of note is new righty position and also translate position - ysize sub dup /righty exch def - - % want left edge of note at coordinate rightx - rightx exch - } ifelse - - % stack now contains coord of bottom left corner in margin coordinates - matr setmatrix translate - end -} def - -% create LoutPageDict with left, right, foot, top for @Place symbol users -/LoutPageSet -{ - /LoutPageDict 5 dict def - LoutPageDict begin - /matr matrix currentmatrix def - /left 0 def - /right xsize def - /foot 0 def - /top ysize def - end - -} def - -%%EndResource - -%%EndProlog - -%%BeginSetup -%%IncludeResource: font Times-Roman -/Times-Romanfnt82 vec2 /Times-Roman LoutRecode -/fnt82 { /Times-Romanfnt82 LoutFont } def -%%IncludeResource: font Helvetica -/Helveticafnt35 vec2 /Helvetica LoutRecode -/fnt35 { /Helveticafnt35 LoutFont } def -%%IncludeResource: font Symbol -/fnt78 { /Symbol LoutFont } def -%%EndSetup - -%%Page: i 1 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Helvetica -%%+ font Symbol -/pgsave save def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup - -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -600 fnt35 1751 12125(A)m 2310(User')s 30(s)k 4123(Guide)s -5863(to)s 6507(the)s 3956 10685(Lout)m 616 9245(Document)m 3500(F)s 18(or)k -15(matting)k -6490(System)s 240 fnt35 3544 6059(Jeffre)m 4(y)k 4321(H.)s -4606(Kingston)s 3883 4395(V)m 19(ersion)k 4726(3.20)s 3974 4107(Apr)m -3(il,)k -4567(2000)s 0 340(Cop)m 7(yr)k -3(ight)k 240 fnt78 -1080 342(\343)m 240 fnt35 1323 340(1991,)m 1967(2000)s 2558(Jeffre)s 4(y)k -3335(H.)s 3620(Kingston,)s 4663(Basser)s 5475(Depar)s -9(tment)k -6793(of)s 7055(Computer)s 8171(Science)s 3(,)k 0 52(The)m -469(Univ)s 6(ersity)k 1577(of)s 1839(Sydne)s 4(y)k -2698(2006,)s 3342(A)s 7(ustr)k 2(alia.)k 4441(ISBN)s -5048(0)s 5239(86758)s 5961(951)s 6379(5.)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: ii 2 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -480 fnt84 0 12955(Contents)m 240 fnt84 0 11982(Chapter)m 908(1)s -240 fnt82 1015 11983(.)m 240 fnt84 1179 11982(Computer)m 2286(Pr)s 4(ograms)k -240 fnt82 3770 11983(..)m 4114(..)s 4458(..)s 4802(..)s -5146(..)s 5490(..)s 5834(..)s 6178(..)s 6522(..)s -6866(..)s 7210(..)s 7554(..)s 7898(..)s 8242(..)s -8971(1)s 720 11638(1.1.)m 1184(T)s 19(ypesetting)k 2347(computer)s -3310(programs)s 4264(independently)s 5674(of)s 5945(an)s 3(y)k -6342(document)s 7554(..)s 7898(..)s 8242(..)s 8971(1)s -720 11293(1.2.)m 1184(T)s 19(ypesetting)k 2347(computer)s 3310(programs)s -4264(as)s 4514(part)s 4945(of)s 5216(a)s 5382(lar)s 4(ger)k -5994(document)s 7210(..)s 7554(..)s 7898(..)s 8242(..)s -8952(2)s 720 10948(1.3.)m 1184(Changing)s 2169(the)s 2517(appearance)s -3648(of)s 3919(a)s 4085(program)s 5146(..)s 5490(..)s -5834(..)s 6178(..)s 6522(..)s 6866(..)s 7210(..)s -7554(..)s 7898(..)s 8242(..)s 8952(4)s 720 10603(1.4.)m -1184(Changing)s 2169(the)s 2517(appearance)s 3648(of)s 3919(all)s -4212(programs)s 5166(simultaneously)s 6866(..)s 7210(..)s 7554(..)s -7898(..)s 8242(..)s 8953(6)s 720 10258(1.5.)m 1184(Dealing)s -1994(with)s 2476(tab)s 2821(characters)s 3839(in)s 4082(programs)s -5490(..)s 5834(..)s 6178(..)s 6522(..)s 6866(..)s -7210(..)s 7554(..)s 7898(..)s 8242(..)s 8959(8)s -720 9913(1.6.)m 1184(Dealing)s 1994(with)s 2476(formfeed)s 3409(characters)s -4427(in)s 4670(programs)s 5834(..)s 6178(..)s 6522(..)s -6866(..)s 7210(..)s 7554(..)s 7898(..)s 8242(..)s -8955(9)s 720 9568(1.7.)m 1184(Embedding)s 2341(Lout)s 2853(commands)s -3941(within)s 4609(program)s 5479(comments)s 6866(..)s 7210(..)s -7554(..)s 7898(..)s 8242(..)s 8831(10)s 720 9223(1.8.)m -1184(Embedding)s 2341(program)s 3211(te)s 3(xt)k 3626(within)s -4294(program)s 5164(comments)s 6522(..)s 6866(..)s 7210(..)s -7554(..)s 7898(..)s 8242(..)s 8831(10)s 720 8878(1.9.)m -1184(Reading)s 2035(and)s 2439(selecting)s 3341(program)s 4211(te)s 3(xt)k -4626(from)s 5150(separate)s 5988(\207les)s 6866(..)s 7210(..)s -7554(..)s 7898(..)s 8242(..)s 8851(11)s 720 8533(1.10.)m -1304(Error)s 1867(messages)s 3082(..)s 3426(..)s 3770(..)s -4114(..)s 4458(..)s 4802(..)s 5146(..)s 5490(..)s -5834(..)s 6178(..)s 6522(..)s 6866(..)s 7210(..)s -7554(..)s 7898(..)s 8242(..)s 8832(12)s 720 8188(1.11.)m -1304(Notes)s 1913(on)s 2210(Perl)s 2649(and)s 3053(Pod)s -3770(..)s 4114(..)s 4458(..)s 4802(..)s 5146(..)s -5490(..)s 5834(..)s 6178(..)s 6522(..)s 6866(..)s -7210(..)s 7554(..)s 7898(..)s 8242(..)s 8832(12)s -240 fnt84 0 7558(Refer)m 4(ences)k 240 fnt82 1362 7559(..)m -1706(..)s 2050(..)s 2394(..)s 2738(..)s 3082(..)s -3426(..)s 3770(..)s 4114(..)s 4458(..)s 4802(..)s -5146(..)s 5490(..)s 5834(..)s 6178(..)s 6522(..)s -6866(..)s 7210(..)s 7554(..)s 7898(..)s 8242(..)s -8840(15)s 240 fnt84 0 6930(Index)m 240 fnt82 1018 6931(..)m -1362(..)s 1706(..)s 2050(..)s 2394(..)s 2738(..)s -3082(..)s 3426(..)s 3770(..)s 4114(..)s 4458(..)s -4802(..)s 5146(..)s 5490(..)s 5834(..)s 6178(..)s -6522(..)s 6866(..)s 7210(..)s 7554(..)s 7898(..)s -8242(..)s 8833(16)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 1 3 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Helvetica -%%+ font Times-Italic -%%+ font Times-Italic -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt90 vec2 /Times-Italic LoutRecode -/fnt90 { /Times-Italicfnt90 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -480 fnt84 0 12955(Chapter)m 1819(1.)s 2400(Computer)s 4618(Pr)s 8(ograms)k -240 fnt82 0 12003(This)m 471(chapter)s 1228(describes)s 2162(ho)s 6(w)k -2617(to)s 2850(typeset)s 3581(computer)s 4538(program)s 5403(te)s 3(xt)k -5812(using)s 6378(Lout)s 6884(in)s 7121(conjunction)s 8302(with)s -8778(the)s 220 fnt35 0 11712(prg2lout)m 153 fnt82 788 11804(1)m -240 fnt82 908 11715(\207lter)m 1418(program,)s 2335(which)s 2977(is)s -3187(al)s 2(w)k 2(ays)k 3898(installed)s 4765(where)s 6(v)k 3(er)k -5705(Lout)s 6217(is.)s 480 11341(It)m 680(is)s 884(possible)s -1719(to)s 1952(simply)s 2652(print)s 3157(out)s 3518(one)s -3914(or)s 4168(more)s 4709(program)s 5574(\207les)s 6017(independently)s -7422(of)s 7687(an)s 3(y)k 8078(document.)s 0 11053(Alternati)m 6(v)k 3(ely)k 15(,)k -1355(the)s 1715(program)s 2598(te)s 3(xt)k 3025(may)s -3503(be)s 3798(printed)s 4545(as)s 4807(part)s 5251(of)s -5534(a)s 5712(lar)s 4(ger)k 6337(Lout)s 6861(document.)s -7981(Either)s 8637(w)s 2(ay)k 15(,)k 0 10765(Lout)m -525(does)s 1028(not)s 1407(lay)s 1767(out)s 2146(the)s -2507(programs)s 3475(in)s 3731(the)s 4092(sense)s 4679(of)s -4964(choosing)s 5895(line)s 6322(breaks)s 7011(and)s 7428(indenting;)s -8457(it)s 8663(uses)s 0 10477(whate)m 6(v)k 3(er)k -942(line)s 1371(breaks)s 2061(and)s 2480(indenting)s 3452(you)s -3882(gi)s 6(v)k 3(e)k 4356(to)s 4610(the)s -4973(program.)s 5962(What)s 6555(Lout)s 7082(does)s 7587(do)s -7895(is)s 8120(cope)s 8644(with)s 0 10189(characters)m 1044(in)s -1313(the)s 1688(program)s 2584(te)s 3(xt)k 3026(that)s -3470(it)s 3689(w)s 2(ould)k 4370(ordinarily)s 5393(either)s -6022(reject)s 6638(or)s 6923(interpret)s 7818(in)s 8087(some)s -8675(w)s 2(ay)k 0 9901(\(braces)m 729(and)s 1121(so)s -1375(on\),)s 1790(ensuring)s 2655(that)s 3061(you)s 3464(can)s -3842(include)s 4590(program)s 5448(te)s 3(xts)k 5936(with)s -6406(absolutely)s 7431(no)s 7712(modi\207cations;)s 0 9613(plus,)m 506(if)s -723(you)s 1138(wish,)s 1697(Lout)s 2209(will)s 2635(print)s -3146(k)s 2(e)k 3(yw)k 2(ords)k 4121(in)s -4364(bold,)s 4897(identi\207ers)s 5903(in)s 6146(italics,)s 6822(add)s -7226(line)s 7640(numbers,)s 8571(etc.)s 480 9239(At)m 779(the)s -1127(time)s 1607(of)s 1878(writing,)s 2675(the)s 3023(a)s 4(v)k 6(ailable)k -3931(programming)s 5286(languages)s 6294(are:)s 1808 12 0 12 240 288 60 635 8599 LoutGr2 -LoutBox ltblblack -grestore - -grestore -240 fnt90 779 8703(Langua)m 2(g)k 2(e)k -1787(name)s gsave -2443 8599 translate -240 fnt82 1730 12 0 12 240 288 60 LoutGraphic -gsave -LoutBox ltblblack -grestore - -grestore -2587(Setup)s 3172(\207le)s 3517(name)s gsave -4173 8599 translate -240 fnt82 1469 12 0 12 240 288 60 LoutGraphic -gsave -LoutBox ltblblack -grestore - -grestore -4317(Lout)s -4820(symbol)s gsave -5642 8599 translate -240 fnt82 1499 12 0 12 240 288 60 LoutGraphic -gsave -LoutBox ltblblack -grestore - -grestore -5786(Default)s 6567(style)s gsave -7141 8599 translate -240 fnt82 1290 12 0 12 240 288 60 LoutGraphic -gsave -LoutBox ltblblack -grestore - -grestore -7285(`)s 7419(')s -7548(escapes)s 240 fnt82 779 8413(C,)m 1046(C++)s 220 fnt35 -2587 8410(cpr)m -3(int)k 4317(@CP)s 5786(\207x)s 6(ed)k -240 fnt82 7285 8413(No)m 779 8125(Eif)m 6(fel)k 220 fnt35 -2587 8122(eiff)m 6(el)k 4317(@Eiff)s 6(el)k 5786(v)s 5(ar)k -6(ying)k -240 fnt82 7285 8125(Y)m 24(es)k 779 7837(Blue)m 220 fnt35 -2587 7834(b)m 4(lue)k 4317(@Blue)s 5786(v)s 5(ar)k -6(ying)k -240 fnt82 7285 7837(Y)m 24(es)k 779 7549(Perl)m 220 fnt35 -2587 7546(per)m -3(l)k 4317(@P)s 11(er)k -3(l)k -5786(\207x)s 6(ed)k 240 fnt82 7285 7549(No)m 779 7261(Pod)m -220 fnt35 2587 7258(pod)m 4317(@P)s 11(od)k 5786(v)s 5(ar)k -6(ying)k -240 fnt82 7285 7261(No)m 0 6720(C)m 213(and)s 619(C++)s -1103(are)s 1452(handled)s 2270(together)s 3114(since,)s 3714(for)s -4054(formatting)s 5116(purposes,)s 6076(the)s 3(y)k 6540(dif)s 6(fer)k -7125(only)s 7607(in)s 7851(that)s 8271(C++)s 8756(has)s -0 6432(some)m 558(additional)s 1566(k)s 2(e)k 3(yw)k 2(ords)k -2538(plus)s 2985(an)s 3265(e)s 3(xtra)k 3796(w)s 2(ay)k -4244(to)s 4480(mak)s 2(e)k 5049(comments.)s 6193(Whene)s 6(v)k 3(er)k -7224(we)s 7556(mention)s 8394(C)s 8602(from)s 0 6144(no)m 6(w)k -465(on,)s 816(we)s 1156(mean)s 1735(both)s 2223(C)s -2439(and)s 2848(C++.)s 3446(See)s 3852(Section)s 4630(1.11)s -5089(for)s 5432(more)s 5983(on)s 6285(Perl)s 6728(and)s -7137(its)s 7417(handmaiden)s 8649(Pod.)s 0 5856(The)m 428(second)s -1151(to)s 1390(\207fth)s 1845(columns)s 2707(of)s 2978(this)s -3374(table)s 3894(will)s 4320(be)s 4602(e)s 3(xplained)k -5587(at)s 5819(v)s 6(arious)k 6568(points)s 7204(later)s -7687(in)s 7930(this)s 8326(chapter)s 13(.)k 480 5482(The)m -913(list)s 1270(of)s 1547(languages)s 2560(is)s 2776(lik)s 2(ely)k -3378(to)s 3623(e)s 3(xpand,)k 4424(because)s 5243(the)s -220 fnt35 5597 5479(prg2lout)m 240 fnt82 6450 5482(program)m 7326(has)s -7702(been)s 8217(designed)s 0 5194(to)m 252(mak)s 2(e)k -838(it)s 1044(relati)s 6(v)k 3(ely)k 2004(easy)s -2497(to)s 2750(add)s 3168(ne)s 6(w)k 3629(languages)s -4651(\(you)s 5159(don')s 4(t)k 5734(ha)s 4(v)k 3(e)k -6249(to)s 6502(write)s 7062(e)s 3(x)k 3(ecutable)k -8148(code,)s 8721(just)s 0 4906(declare)m 768(a)s 957(lot)s -1292(of)s 1586(records)s 2363(describing)s 3435(your)s 3957(language\).)s -5087(Consult)s 5915(the)s 6286(instructions)s 7475(at)s 7730(the)s -8101(top)s 8483(of)s 8778(the)s 0 4618(source)m 680(\207le)s -1041(of)s 1312(that)s 1730(program)s 2600(\()s 240 fnt83 -2673 4620(pr)m 8(g2lout.c)k 240 fnt82 3652 4618(\))m 3780(if)s -3997(you)s 4412(w)s 2(ant)k 4935(to)s 5174(try)s -5493(it)s 5685(yourself.)s 240 fnt84 0 3825(1.1.)m 471(T)s 17(ypesetting)k -1705(computer)s 2745(pr)s 4(ograms)k 3792(independently)s 5295(of)s -5567(any)s 5996(document)s 240 fnt82 480 3348(Printing)m 1299(of)s -1566(program)s 2432(\207les)s 2876(independently)s 4282(of)s 4549(an)s 3(y)k -4942(document)s 5941(is)s 6147(accomplished)s 7516(by)s 7806(the)s -8149(follo)s 6(wing)k 0 3060(Unix)m 534(pipeline:)s 220 fnt35 -480 2559(prg2lout -l language options \207les | lout -s > out.ps)m 240 fnt82 0 2060(where)m 220 fnt35 626 2057(language)m -240 fnt82 1566 2060(stands)m 2201(for)s 2525(an)s 3(y)k -2908(one)s 3296(of)s 3553(the)s 3886(programming)s 5227(language)s -6133(names)s 6781(in)s 7010(the)s 7344(\207rst)s 7761(column)s -8522(of)s 8778(the)s 1134 0 0 0 240 288 60 0 1553 LoutGr2 -0 0 moveto xsize 0 lineto stroke -grestore - -grestore -122 fnt82 0 1358(1)m 192 fnt82 -62 1288(Prior)m 496(to)s 693(V)s 21(ersion)k 1328(3.18)s -1707(of)s 1928(Lout,)s 2380(this)s 2702(chapter)s 3318(described)s -4103(ho)s 4(w)k 4477(to)s 4674(typeset)s 5268(programs)s -6036(written)s 6628(in)s 6828(the)s 7112(C)s 7287(programming)s -8377(language)s 0 1058(using)m 487(the)s 172 fnt35 795 1057(c2lout)m -192 fnt82 1326 1058(\207lter)m 7(,)k 1794(and)s 2148(Eif)s 4(fel)k -2651(programs)s 3444(using)s 3931(the)s 172 fnt35 4240 1057(eif2lout)m -192 fnt82 4864 1058(\207lter)m 10(.)k 5375(These)s 5906(ha)s 3(v)k 2(e)k -6338(no)s 4(w)k 6736(been)s 7174(withdra)s 2(wn)k -8065(and)s 8419(replaced)s 0 828(by)m 172 fnt35 270 827(prg2lout)m -192 fnt82 884 828(,)m 1005(which)s 1553(handles)s 2214(multiple)s -2931(languages.)s 3863(Ordinary)s 4631(Lout)s 5076(documents)s 5981(require)s -6602(no)s 6871(modi\207cations)s 7989(as)s 8223(a)s 8391(result)s -8898(of)s 0 598(this)m 317(change.)s 192 fnt84 4490 0(1)m - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 2 4 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(2)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt82 0 13205(table)m 509(abo)s 3(v)k 3(e.)k -1228(As)s 1533(usual)s 2082(with)s 2553(Lout,)s 3100(the)s -3437(output)s 4098(will)s 4512(be)s 4783(a)s 4938(PostScript)s -5968(\207le.)s 6426(Each)s 6950(input)s 7490(\207le)s 7840(will)s -8255(be)s 3(gin)k 8829(on)s 0 12917(a)m 170(ne)s 6(w)k -622(page)s 1135(of)s 1411(the)s 1764(output,)s 2488(starting)s -3262(with)s 3749(its)s 4030(name)s 4609(in)s 4857(bold)s -5346(type.)s 5927(The)s 6360(options)s 7121(pro)s 3(vide)k -7910(control)s 8647(o)s 3(v)k 3(er)k 0 12629(the)m -348(\207nal)s 828(appearance,)s 2010(as)s 2260(follo)s 6(ws:)k -220 fnt35 0 12121(-p)m 240 fnt83 187 12126(style)m 240 fnt82 -960 12124(Select)m 1630(a)s 1823(printing)s 2661(style.)s 3303(Y)s 26(our)k -3856(choices)s 4652(are)s 220 fnt35 5026 12121(-p\207x)m 6(ed)k -240 fnt82 5667 12124(,)m 220 fnt35 5801 12121(-pv)m 5(ar)k -6(ying)k -240 fnt82 6692 12124(,)m 6827(and)s 220 fnt35 7258 12121(-psymbol)m -240 fnt82 8134 12124(,)m 8268(with)s 8778(the)s 960 11836(def)m 2(ault)k -1707(v)s 6(alue)k 2302(v)s 6(arying)k 3106(with)s -3615(the)s 3990(language)s 4936(as)s 5213(gi)s 6(v)k 3(en)k -5820(in)s 6089(the)s 6464(fourth)s 7132(column)s 7933(of)s -8231(the)s 8606(table)s 960 11548(abo)m 3(v)k 3(e.)k -1690(Consult)s 2495(Section)s 3269(1.2)s 3623(for)s 3961(e)s 3(xamples)k -4912(of)s 5183(these)s 5730(styles.)s 220 fnt35 0 11042(-n)m -240 fnt82 960 11045(Do)m 1306(not)s 1672(print)s 2183(\207le)s -2544(names.)s 220 fnt35 0 10539(-f)m 240 fnt83 131 10544(font)m -240 fnt82 960 10542(Select)m 1589(a)s 1740(Lout)s 2237(font)s -2667(f)s 2(amily)k 15(.)k 3423(The)s 3836(def)s 2(ault)k -4542(is)s 220 fnt35 4737 10539(-fCour)m -3(ier)k 240 fnt82 -5637 10542(for)m 220 fnt35 5961 10539(-p\207x)m 6(ed)k 240 fnt82 -6602 10542(,)m 6694(and)s 220 fnt35 7083 10539(-fTimes)m 240 fnt82 -7852 10542(for)m 220 fnt35 8175 10539(-pv)m 5(ar)k -6(ying)k -240 fnt82 960 10254(and)m 220 fnt35 1364 10251(-psymbol)m 240 fnt82 -2240 10254(.)m 220 fnt35 0 9750(-v)m 240 fnt83 182 9755(vsize)m -240 fnt82 960 9753(Select)m 1594(an)s 1867(inter)s 4(-line)k -2783(spacing)s 3557(size)s 3975(in)s 4208(Lout)s 4710(units.)s -5329(The)s 5747(def)s 2(ault)k 6459(is)s 220 fnt35 -6659 9750(-v1.1fx)m 240 fnt82 7366 9753(meaning)m 8233(1.1)s 8558(times)s -960 9465(the)m 1308(font)s 1753(size)s 2180(measured)s 3154(from)s -3678(baseline)s 4517(to)s 4756(baseline.)s 220 fnt35 0 9007(-L)m -240 fnt83 191 9012(number)m 240 fnt82 960 9010(Add)m 1478(line)s -1939(numbers)s 2861(to)s 3147(the)s 3542(program)s 4459(print,)s -5064(starting)s 5880(with)s 240 fnt83 6409 9012(number)m 240 fnt82 -7146 9010(,)m 7300(or)s 7606(1)s 7808(if)s 240 fnt83 -8072 9012(number)m 240 fnt82 8916 9010(is)m 960 8722(omitted.)m 220 fnt35 -0 8264(-S)m 240 fnt83 209 8269(\207le)m 240 fnt82 960 8267(Use)m -240 fnt83 1389 8269(\207le)m 240 fnt82 1736 8267(as)m 1988(the)s -2337(setup)s 2897(\207le)s 3260(for)s 3599(printing)s 4411(your)s -4912(language.)s 5941(This)s 6419(allo)s 6(ws)k 7090(you)s -7506(to)s 7747(change)s 8483(all)s 8778(the)s 960 7979(options)m -1716(mentioned)s 2784(in)s 3027(subsequent)s 4151(sections,)s 5028(rather)s -5644(than)s 6113(just)s 6518(the)s 6866(fe)s 6(w)k -7272(gi)s 6(v)k 3(en)k 7852(here.)s 0 7474(There)m -613(are)s 960(also)s 220 fnt35 1398 7471(-t)m 240 fnt82 -1588 7474(and)m 220 fnt35 1992 7471(-T)m 240 fnt82 2256 7474(options)m -3012(for)s 3350(dealing)s 4107(with)s 4589(tab)s 4934(characters)s -5952(\(Section)s 6805(1.5\).)s 240 fnt84 0 6681(1.2.)m 471(T)s 17(ypesetting)k -1705(computer)s 2745(pr)s 4(ograms)k 3792(as)s 4059(part)s -4557(of)s 4829(a)s 5007(lar)s 2(ger)k 5687(document)s -240 fnt82 480 6204(When)m 1097(the)s 1432(program)s 2289(te)s 3(xts)k -2775(are)s 3109(to)s 3336(be)s 3605(part)s 4023(of)s -4281(a)s 4434(lar)s 4(ger)k 5034(Lout)s 5533(document,)s -6571(the)s 6906(procedure)s 7905(is)s 8102(some)s 6(what)k -0 5916(dif)m 6(ferent.)k 979(Y)s 26(ou)k 1421(need)s -1931(to)s 2170(include)s 2930(the)s 3278(setup)s 3836(\207le)s -4197(appropriate)s 5341(to)s 5580(your)s 6079(language,)s 7050(lik)s 2(e)k -7462(this:)s 220 fnt35 480 5415(@SysInclude { cpr)m -3(int })k 480 5127(@SysInclude { doc })m -480 4839(@Doc @T)m 26(e)k 6(xt @Begin)k 480 4551(...)m 480 4263(@End @T)m 26(e)k 6(xt)k -240 fnt82 0 3808(The)m 220 fnt35 422 3805(cpr)m -3(int)k -240 fnt82 1011 3808(setup)m 1563(\207le)s 1917(includes)s 2759(e)s 6(v)k 3(erything)k -3820(needed)s 4549(to)s 4782(set)s 5101(up)s 5387(for)s -5719(C)s 5925(program)s 6788(formatting;)s 7902(for)s 8234(the)s -8575(other)s 0 3520(languages,)m 1064(consult)s 1815(the)s 2163(second)s -2886(column)s 3661(of)s 3932(the)s 4280(table)s 4800(at)s -5032(the)s 5380(start)s 5850(of)s 6121(this)s 6517(chapter)s 13(.)k -480 3146(The)m 914(program)s 1791(te)s 3(xts)k 2297(within)s -2972(the)s 3327(Lout)s 3846(document)s 4857(are)s 5210(enclosed)s -6112(in)s 6362(braces)s 7030(preceded)s 7958(by)s 8259(the)s -8614(Lout)s 0 2858(symbol)m 760(from)s 1284(the)s 1632(third)s -2141(column)s 2916(of)s 3187(the)s 3535(table,)s 4106(lik)s 2(e)k -4518(this)s 4914(for)s 5252(the)s 5600(C)s 5812(language:)s - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 3 5 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Helvetica -%%+ font Courier -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Courier -/Courierfnt29 vec2 /Courier LoutRecode -/fnt29 { /Courierfnt29 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.2.)m 454(T)s 17(ypesetting)k 1593(computer)s -2562(pr)s 10(o)k 2(gr)k 3(ams)k 3534(as)s -3802(part)s 4265(of)s 4546(a)s 4721(lar)s 8(g)k 2(er)k -5374(document)s 240 fnt84 8953 13840(3)m 220 fnt35 480 13207(@IndentedDispla)m 6(y @CP {)k -480 12919(#include <stdio)m 8(.h>)k 480 12343(treepr)m -3(int\(p\) /* pr)k -3(int tree p recursiv)k 5(ely */)k -480 12055(str)m -3(uct tnode *p;)k 480 11767({)m 480 11479( if \(p != NULL\) {)m 480 11191( treepr)m -3(int\(p->left\);)k -480 10903( pr)m -3(intf\("%4d %s\\n", p->count, p->w)k 2(ord\);)k 480 10615( treepr)m -3(int\(p->r)k -3(ight\);)k -480 10327( })m 480 10039(})m 480 9751(})m 240 fnt82 0 9257(Although)m -962(computer)s 1925(programs)s 2879(violate)s 3584(the)s 3932(rules)s -4447(of)s 4718(le)s 3(g)k 1(al)k 5232(Lout)s -5744(input)s 6296(in)s 6539(man)s 3(y)k 7121(w)s 2(ays,)k -7718(these)s 8265(rules)s 8779(are)s 0 8969(suspended)m 1042(by)s -1322(the)s 220 fnt35 1655 8966(@CP)m 240 fnt82 2173 8969(,)m -220 fnt35 2266 8966(@Eiff)m 6(el)k 240 fnt82 3000 8969(etc.)m -3368(symbols,A)s 4441(allo)s 6(wing)k 5311(the)s 5645(program)s -6500(te)s 3(xt)k 6901(to)s 7125(be)s 7393(incorporated)s -8644(with)s 0 8681(absolutely)m 1037(no)s 1330(modi\207cations.)s 2796(The)s -3224(result)s 3814(is)s 220 fnt29 480 8198(#include)m 1668(<stdio.h>)s -480 7622(treeprint\(p\))m 3120(/*)s 3516(print)s 4308(tree)s 4968(p)s -5232(recursively)s 6816(*/)s 480 7334(struct)m 1404(tnode)s 2196 7291(*)m -2328 7334(p;)m 480 7046({)m 1536 6758(if)m 1932(\(p)s 2328(!=)s -2724(NULL\))s 3516({)s 2592 6470(treeprint\(p->left\);)m 2592 6182(printf\("%4d)m 4176(%s\\n",)s -5100(p->count,)s 6420(p->word\);)s 2592 5894(treeprint\(p->right\);)m 1536 5606(})m 480 5318(})m -240 fnt82 0 4843(W)m 19(e)k 393(ha)s 4(v)k 3(e)k -919(chosen)s 1665(to)s 1929(use)s 2328(the)s 220 fnt35 -2701 4840(@IndentedDispla)m 6(y)k 240 fnt82 4572 4843(symbol)m 5357(from)s -5905(Section)s 6704(??)s 6993(to)s 7257(obtain)s 7936(an)s -8244(indented)s 0 4555(display)m 15(,)k 780(b)s 4(ut)k -1138(in)s 1378(f)s 2(act)k 220 fnt35 1789 4552(@CP)m -240 fnt82 2307 4555(,)m 220 fnt35 2411 4552(@Eiff)m 6(el)k -240 fnt82 3156 4555(and)m 3557(the)s 3901(rest)s 4301(may)s -4764(appear)s 5457(an)s 3(ywhere)k 6437(at)s 6665(all:)s -7066(the)s 7410(result)s 7997(is)s 8203(an)s 8482(object)s -0 4267(in)m 247(the)s 599(usual)s 1163(w)s 2(ay)k 15(,)k -1656(which)s 2302(may)s 2772(go)s 3069(an)s 3(ywhere.)k -4164(When)s 4797(including)s 5758(a)s 5928(program)s 6802(te)s 3(xt)k -7221(within)s 7893(a)s 8063(paragraph,)s 0 3979(use)m 220 fnt35 -365 3976(@OneCol @CP { ...)m 13( })k 240 fnt82 2459 3979(\(or)m 220 fnt35 -2787 3976(@OneCol @Eiff)m 6(el { ...)k 13( })k 240 fnt82 5057 3979(etc.)m -5429(for)s 5757(other)s 6298(languages\))s 7373(to)s 7602(pre)s 6(v)k 3(ent)k -8360(it)s 8541(being)s 0 3691(brok)m 2(en)k 720(across)s -1368(tw)s 2(o)k 1778(lines,)s 2336(if)s 2553(desired.)s -480 3317(In)m 732(cases)s 1282(where)s 1917(the)s 2260(program)s -3125(te)s 3(xt)k 3535(has)s 3900(unbalanced)s 5043(braces,)s -5755(it)s 5942(is)s 6147(necessary)s 7125(to)s 7359(use)s -7729(the)s 8072(alternati)s 6(v)k 3(e)k 0 3029(form)m -220 fnt35 514 3026(@CP @Begin ...)m 13( @End @CP)k 240 fnt82 3418 3029(\(or)m -3746(the)s 4083(equi)s 6(v)k 6(alent)k 5117(for)s -5444(other)s 5984(languages\),)s 7117(so)s 7372(that)s 7780(Lout)s -8281(does)s 8760(not)s 0 2741(confuse)m 793(program)s 1656(braces)s -2309(with)s 2784(Lout)s 3288(braces.)s 4055(In)s 4303(that)s -4714(case)s 5173(the)s 5514(program)s 6376(te)s 3(xt)k -6784(must)s 7301(not)s 7660(contain)s 220 fnt35 8413 2738(@End)m -240 fnt82 9014 2741(;)m 0 2453(and)m 412(in)s 663(either)s -1275(case)s 1750(the)s 2106(program)s 2985(te)s 3(xt)k -3408(must)s 3941(not)s 4316(include)s 220 fnt35 5084 2450(@Include)m -240 fnt82 6074 2453(or)m 220 fnt35 6342 2450(@SysInclude)m 240 fnt82 -7698 2453(unless)m 8355(you)s 8779(are)s 0 2165(really)m 597(including)s -1554(a)s 1720(\207le)s 2081(at)s 2313(that)s 2731(point)s -3283(\(Section)s 4136(1.9\).)s 480 1791(If)m 763(your)s 1316(Lout)s -1882(document)s 2939(contains)s 3841(program)s 4765(te)s 3(xts)k -5317(in)s 5614(se)s 6(v)k 3(eral)k 6390(languages,)s -7507(simply)s 8266(add)s 8724(one)s 220 fnt35 0 1500(@SysInclude)m -240 fnt82 1342 1503(line)m 1749(for)s 2080(each)s 2569(of)s -2833(them)s 3364(and)s 3761(proceed)s 4570(as)s 4813(before.)s -5580(If)s 5803(your)s 6296(programming)s 7644(language)s 8557(is)s -8760(not)s 0 1215(currently)m 916(supported,)s 1967(a)s 2133(viable)s -2773(alternati)s 6(v)k 3(e)k 3827(is)s 220 fnt35 -480 714(@F @V)m 17(erbatim { ...)k 13( })k 240 fnt82 0 220(These)m -612(symbols)s 1445(cause)s 2017(the)s 2349(te)s 3(xt)k -2749(between)s 3587(braces)s 4233(to)s 4456(be)s 4722(set)s -5032(v)s 3(erbatim)k 5922(in)s 6150(a)s 6300(\207x)s 3(ed-)k -6844(width)s 7431(font,)s 7907(as)s 8141(e)s 3(xplained)k - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 4 6 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(4)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt82 0 13205(else)m 6(where)k 1008(in)s 1254(this)s -1653(guide.)s 2352(This)s 2831(f)s 2(allback)k 3662(method)s -4442(will)s 4871(not)s 5240(handle)s 5937(tab)s 6285(and)s -6692(formfeed)s 7628(characters)s 8650(v)s 3(ery)k 0 12917(well.)m -571(Ag)s 1(ain,)k 1257(use)s 220 fnt35 1628 12914(@V)m 17(erbatim @Begin ...)k 13( @End @V)k 17(erbatim)k -240 fnt82 5645 12917(if)m 5858(your)s 6352(program)s 7218(te)s 3(xt)k -7628(contains)s 8471(unbal)s 8998(-)s 0 12629(anced)m 616(braces.)s -240 fnt84 0 11886(1.3.)m 471(Changing)s 1525(the)s 1899(appearance)s -3138(of)s 3410(a)s 3588(pr)s 4(ogram)k 240 fnt82 -480 11409(The)m 220 fnt35 915 11406(@CP)m 240 fnt82 1433 11409(,)m -220 fnt35 1548 11406(@Eiff)m 6(el)k 240 fnt82 2305 11409(etc.)m -2695(symbols)s 3551(ha)s 4(v)k 3(e)k 4060(a)s -4234(number)s 5033(of)s 5312(options)s 6075(for)s 6421(changing)s -7360(the)s 7716(appearance)s 8855(of)s 0 11121(the)m 357(printed)s -1102(program.)s 2086(These)s 2723(options)s 3489(are)s 3846(the)s -4204(same)s 4761(for)s 5109(all)s 5412(symbols,)s 6327(although)s -7232(their)s 7739(def)s 2(ault)k 8470(v)s 6(alues)k -0 10833(may)m 468(v)s 6(ary)k 15(.)k 1039(The)s -220 fnt35 1470 10830(style)m 240 fnt82 1976 10833(option)m 2648(changes)s -3473(the)s 3824(printing)s 4637(style;)s 5203(its)s 5482(v)s 6(alue)k -6053(may)s 6522(be)s 220 fnt35 6807 10830(\207x)m 6(ed)k -240 fnt82 7316 10833(\(\207x)m 3(ed-width)k 8555(font\),)s 220 fnt35 -0 10542(v)m 5(ar)k -6(ying)k 240 fnt82 777 10545(\(v)m 6(arying-width)k -2284(font\),)s 2876(or)s 220 fnt35 3157 10542(symbol)m 240 fnt82 -3919 10545(\(v)m 6(arying-width)k 5426(font)s 5892(with)s 6396(mathematical)s -7758(symbols)s 8629(used)s 0 10257(for)m 342(some)s 907(operators\).)s -2043(Its)s 2336(def)s 2(ault)k 3061(v)s 6(alue)k -3633(depends)s 4473(on)s 4774(the)s 5126(language,)s 6101(and)s -6509(may)s 6979(be)s 7265(found)s 7886(in)s 8133(the)s -8485(fourth)s 0 9969(column)m 775(of)s 1045(the)s 1392(table)s -1911(at)s 2143(the)s 2490(start)s 2959(of)s 3229(this)s -3624(chapter)s 13(.)k 4478(The)s 4905(e)s 3(xample)k -5767(in)s 6009(the)s 6357(pre)s 6(vious)k 7225(section)s -7958(w)s 2(as)k 8378(in)s 220 fnt35 8620 9966(\207x)m 6(ed)k -240 fnt82 0 9681(style;)m 563(we)s 898(can)s 1287(switch)s -1968(styles)s 2563(lik)s 2(e)k 2975(this:)s 220 fnt35 -480 9180(@CP)m 480 8892( style { v)m 5(ar)k -6(ying })k 480 8604({)m -480 8316(#include <stdio)m 8(.h>)k 480 7740(treepr)m -3(int\(p\) /* pr)k -3(int tree p recursiv)k 5(ely */)k -480 7452(str)m -3(uct tnode *p;)k 480 7164({)m 480 6876( if \(p != NULL\) {)m 480 6588( treepr)m -3(int\(p->left\);)k -480 6300( pr)m -3(intf\("%4d %s\\n", p->count, p->w)k 2(ord\);)k 480 6012( treepr)m -3(int\(p->r)k -3(ight\);)k -480 5724( })m 480 5436(})m 480 5148(})m 240 fnt82 0 4654(The)m -428(result)s 1018(in)s 1261(this)s 1657(case)s 2124(will)s -2550(be)s 480 4198(#)m 240 fnt83 600 4200(include)m 240 fnt82 -1357 4198(<)m 240 fnt83 1486 4200(stdio)m 240 fnt82 1944 4198(.)m -240 fnt83 1988 4200(h)m 240 fnt82 2103 4198(>)m 240 fnt83 -480 3624(tr)m 8(eeprint)k 240 fnt82 1312 3622(\()m 240 fnt83 -1385 3624(p)m 240 fnt82 1498 3622(\))m 2046(/*)s 2276(print)s -2787(tree)s 3200(p)s 3373(recursi)s 6(v)k 3(ely)k -4479(*/)s 240 fnt84 480 3333(struct)m 240 fnt83 1136 3336(tnode)m -240 fnt82 1721 3280(*)m 240 fnt83 1825 3336(p)m 240 fnt82 -1938 3334(;)m 480 3046({)m 240 fnt84 960 2757(if)m 240 fnt82 -1178 2758(\()m 240 fnt83 1251 2760(p)m 240 fnt82 1424 2758(!=)m -240 fnt83 1691 2760(NULL)m 240 fnt82 2290 2758(\))m 2418({)s -240 fnt83 1440 2472(tr)m 8(eeprint)k 240 fnt82 2272 2470(\()m -240 fnt83 2345 2472(p)m 240 fnt82 2458 2470(->)m 240 fnt83 -2666 2472(left)m 240 fnt82 2974 2470(\);)m 240 fnt83 1440 2184(printf)m -240 fnt82 2006 2182(\()m 240 fnt83 2079 2184("%4d)m 2684(%s\\n")s -240 fnt82 3264 2182(,)m 240 fnt83 3371 2184(p)m 240 fnt82 -3484 2182(->)m 240 fnt83 3692 2184(count)m 240 fnt82 4228 2182(,)m -240 fnt83 4335 2184(p)m 240 fnt82 4448 2182(->)m 240 fnt83 -4656 2184(wor)m 8(d)k 240 fnt82 5147 2182(\);)m 240 fnt83 -1440 1896(tr)m 8(eeprint)k 240 fnt82 2272 1894(\()m 240 fnt83 -2345 1896(p)m 240 fnt82 2458 1894(->)m 240 fnt83 2666 1896(right)m -240 fnt82 3135 1894(\);)m 960 1606(})m 480 1318(})m 0 824(If)m -230(we)s 565(use)s 220 fnt35 940 821(style { symbol })m 240 fnt82 -2466 824(we)m 2801(get)s 3153(this:)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 5 7 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Symbol -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.3.)m 454(Changing)s 1454(the)s 1799(appear)s 3(ance)k -2980(of)s 3261(a)s 3436(pr)s 10(o)k 2(gr)k 3(am)k -240 fnt84 8953 13840(5)m 240 fnt82 480 13203(#)m 240 fnt83 -600 13205(include)m 240 fnt78 1357 13197(<)m 240 fnt83 1482 13205(stdio)m -240 fnt82 1940 13203(.)m 240 fnt83 1984 13205(h)m 240 fnt78 -2099 13197(>)m 240 fnt83 480 12629(tr)m 8(eeprint)k 240 fnt82 -1312 12627(\()m 240 fnt83 1385 12629(p)m 240 fnt82 1498 12627(\))m -2046(/*)s 2276(print)s 2787(tree)s 3200(p)s 3373(recursi)s 6(v)k 3(ely)k -4479(*/)s 240 fnt84 480 12338(struct)m 240 fnt83 1136 12341(tnode)m -240 fnt82 1721 12285(*)m 240 fnt83 1825 12341(p)m 240 fnt82 -1938 12339(;)m 480 12051({)m 240 fnt84 960 11762(if)m 240 fnt82 -1178 11763(\()m 240 fnt83 1251 11765(p)m 240 fnt78 1424 11757(\271)m -240 fnt83 1613 11765(NULL)m 240 fnt82 2212 11763(\))m 2340({)s -240 fnt83 1440 11477(tr)m 8(eeprint)k 240 fnt82 2272 11475(\()m -240 fnt83 2345 11477(p)m 240 fnt78 2458 11469(\256)m 240 fnt83 -2688 11477(left)m 240 fnt82 2996 11475(\);)m 240 fnt83 1440 11189(printf)m -240 fnt82 2006 11187(\()m 240 fnt83 2079 11189("%4d)m 2684(%s\\n")s -240 fnt82 3264 11187(,)m 240 fnt83 3371 11189(p)m 240 fnt78 -3484 11181(\256)m 240 fnt83 3714 11189(count)m 240 fnt82 4250 11187(,)m -240 fnt83 4357 11189(p)m 240 fnt78 4470 11181(\256)m 240 fnt83 -4700 11189(wor)m 8(d)k 240 fnt82 5191 11187(\);)m 240 fnt83 -1440 10901(tr)m 8(eeprint)k 240 fnt82 2272 10899(\()m 240 fnt83 -2345 10901(p)m 240 fnt78 2458 10893(\256)m 240 fnt83 2688 10901(right)m -240 fnt82 3157 10899(\);)m 960 10611(})m 480 10323(})m 0 9829(with)m -482(mathematical)s 1823(symbols)s 2672(replacing)s 3614(some)s 4175(of)s -4446(the)s 4794(operators.)s 480 9455(The)m 220 fnt35 901 9452(@CP)m -240 fnt82 1419 9455(,)m 220 fnt35 1519 9452(@Eiff)m 6(el)k -240 fnt82 2261 9455(etc.)m 2636(symbols)s 3478(ha)s 4(v)k 3(e)k -3972(additional)s 4976(options)s 5725(which)s 6360(allo)s 6(w)k -6932(a)s 7091(\207ner)s 7582(control)s 8307(o)s 3(v)k 3(er)k -8778(the)s 0 9167(style.)m 615(Here)s 1135(the)s 3(y)k -1598(all)s 1891(are,)s 2289(with)s 2771(their)s 3268(def)s 2(ault)k -3989(v)s 6(alues:)k 220 fnt35 480 8666(@CP [ or @Eiff)m 6(el, @Blue)k 3(, etc.)k 13( ])k -480 8378( style { \207x)m 6(ed })k 480 8090( n)m 2(umbered { No })k 480 7802( f)m 6(ont { Cour)k -3(ier })k -480 7514( siz)m 3(e { -1.0p })k 480 7226( line { 1.0vx })m 480 6938( tabin { 8 })m 480 6650( tabout { 8s })m -480 6362( identi\207ers { Base })m 480 6074( k)m 4(e)k 4(yw)k 2(ords { Base })k -480 5786( oper)m 2(ators { Base })k 480 5498( n)m 2(umbers { Base })k 480 5210( str)m -3(ings { Base })k -480 4922( comments { Base })m 480 4634({)m 480 4346( ...)m 480 4058(})m 240 fnt82 -0 3564(W)m 19(e)k 387(are)s 753(already)s 1529(f)s 2(amiliar)k -2360(with)s 220 fnt35 2861 3561(style)m 240 fnt82 3304 3564(.)m -3487(After)s 4069(that)s 4506(comes)s 220 fnt35 5187 3561(n)m 2(umbered)k -240 fnt82 6161 3564(,)m 6287(whose)s 6974(v)s 6(alue)k -7561(may)s 8046(be)s 220 fnt35 8347 3561(No)m 240 fnt82 -8699 3564(\(the)m 0 3276(def)m 2(ault\),)k 220 fnt35 842 3273(Y)m 30(es)k -240 fnt82 1183 3276(,)m 1285(or)s 1538(a)s 1699(number)s 9(,)k -2522(and)s 2921(which)s 3557(determines)s 4651(whether)s 5475(or)s -5729(not)s 6089(line)s 6498(numbers)s 7367(are)s 7709(to)s -7942(be)s 8219(added)s 8843(an)s 0 2988(if)m 217(so)s -482(the)s 829(v)s 6(alue)k 1397(of)s 1667(the)s -2014(\207rst)s 2444(one.)s 2954(Ne)s 3(xt)k 3475(we)s -3809(ha)s 4(v)k 3(e)k 220 fnt35 4309 2985(f)m 6(ont)k -240 fnt82 4665 2988(,)m 4772(which)s 5413(determines)s 6511(the)s -6858(font)s 7303(f)s 2(amily)k 7977(to)s 8215(use,)s -220 fnt35 8640 2985(siz)m 3(e)k 240 fnt82 9019 2988(,)m -0 2700(the)m 347(font)s 791(size)s 1217(to)s 1455(use,)s -1880(and)s 220 fnt35 2283 2697(line)m 240 fnt82 2615 2700(,)m -2721(the)s 3068(inter)s 4(-line)k 3992(spacing.)s 4886(The)s -5313(def)s 2(ault)k 6033(v)s 6(alue)k 6600(for)s -220 fnt35 6937 2697(siz)m 3(e)k 240 fnt82 7375 2700(asks)m -7837(for)s 8174(one)s 8574(point)s 0 2412(smaller)m 765(than)s -1238(in)s 1485(the)s 1837(surrounding)s 3051(document;)s 4111(this)s -4511(w)s 2(as)k 4936(done)s 5462(to)s 5705(compensate)s -6894(for)s 7236(Courier')s 13(s)k 8180(relati)s 6(v)k 3(ely)k -0 2124(lar)m 4(ge)k 529(appearance)s 1660(compared)s 2661(to)s -2900(other)s 3451(fonts)s 3980(of)s 4251(the)s 4599(same)s -5146(nominal)s 5985(size.)s 480 1750(The)m 220 fnt35 919 1747(tabin)m -240 fnt82 1451 1750(and)m 220 fnt35 1866 1747(tabout)m 240 fnt82 -2543 1750(options)m 3310(are)s 3668(the)s 4027(subject)s 4775(of)s -5057(Section)s 5842(1.5.)s 6317(After)s 6891(them)s 7440(come)s -8025(six)s 8370(options)s 0 1462(gi)m 6(ving)k 701(the)s -1091(particular)s 2107(font)s 2594(f)s 2(aces)k 3175(in)s -3461(which)s 4145(to)s 4426(print)s 4979(identi\207ers,)s 6083(k)s 2(e)k 3(yw)k 2(ords,)k -7156(operators,)s 8195(numbers,)s 0 1174(strings,)m 741(and)s 1141(comments.)s -220 fnt35 2285 1171(Base)m 240 fnt82 2833 1174(means)m 3492(the)s -3836(basic)s 4377(f)s 2(ace;)k 4880(other)s 5428(commonly)s -6502(a)s 4(v)k 6(ailable)k 7407(choices)s 8171(are)s -220 fnt35 8514 1171(Slope)m 240 fnt82 0 886(and)m 220 fnt35 -415 883(Bold)m 240 fnt82 841 886(.)m 1016(These)s 1654(options)s -2421(may)s 2898(all)s 3202(be)s 3495(set)s 3831(to)s -4081(dif)s 6(ferent)k 4967(f)s 2(aces)k 5517(if)s -5745(desired.)s 6610(The)s 7049(def)s 2(ault)k 7781(v)s 6(alues)k -8449(sho)s 6(wn)k 0 598(are)m 347(correct)s 1069(for)s -220 fnt35 1407 595(style { \207x)m 6(ed })k 240 fnt82 2696 598(only;)m -3234(the)s 3582(other)s 4133(styles)s 4728(ha)s 4(v)k 3(e)k -5229(other)s 5780(def)s 2(aults)k 6585(\(Section)s 7438(1.4\).)s - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 6 8 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(6)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt84 0 13203(1.4.)m 471(Changing)s 1525(the)s 1899(appearance)s -3138(of)s 3410(all)s 3717(pr)s 4(ograms)k 4764(simultaneously)s -240 fnt82 480 12726(W)m 19(e)k 853(ha)s 4(v)k 3(e)k -1358(just)s 1767(seen)s 2253(that)s 2675(the)s 220 fnt35 -3027 12723(@CP)m 240 fnt82 3545 12726(,)m 220 fnt35 3656 12723(@Eiff)m 6(el)k -240 fnt82 4409 12726(etc.)m 4795(symbols)s 5648(ha)s 4(v)k 3(e)k -6153(man)s 3(y)k 6740(options)s 7500(for)s 7842(changing)s -8778(the)s 0 12438(appearance)m 1130(of)s 1399(the)s 1746(program)s -2614(te)s 3(xt.)k 3131(Ho)s 6(we)k 6(v)k 3(er)k 9(,)k -4090(most)s 4613(people)s 5306(w)s 2(ould)k 5959(not)s -6323(w)s 2(ant)k 6845(to)s 7082(ha)s 4(v)k 3(e)k -7582(a)s 7746(dif)s 6(ferent)k 8619(style)s 0 12150(for)m -333(e)s 6(v)k 3(ery)k 903(program)s 1768(te)s 3(xt)k -2177(in)s 2415(their)s 2906(document;)s 3957(the)s 3(y)k -4414(w)s 2(ant)k 4931(to)s 5165(de\207ne)s 5800(the)s -6143(style)s 6644(once)s 7147(at)s 7373(the)s 7716(start,)s -8227(and)s 8625(ha)s 4(v)k 3(e)k 0 11862(all)m -281(their)s 765(program)s 1622(te)s 3(xts)k 2109(come)s -2670(out)s 3023(in)s 3254(that)s 3659(style)s 4153(without)s -4932(laboriously)s 6049(setting)s 6726(options)s 7470(on)s 7754(e)s 6(v)k 3(ery)k -8317(symbol.)s 0 11574(Y)m 26(ou)k 442(do)s 735(this)s -1131(by)s 1425(cop)s 2(ying)k 2248(the)s 2596(setup)s -3154(\207le)s 3515(and)s 3919(changing)s 4850(it.)s 480 11200(F)m 3(or)k -882(general)s 1653(information)s 2852(about)s 3457(ho)s 6(w)k -3932(to)s 4184(mak)s 2(e)k 4770(your)s 5282(o)s 6(wn)k -5759(setup)s 6331(\207le,)s 6756(consult)s 7521(Section)s 8308(??.)s -8698(The)s 0 10912(options)m 775(that)s 1212(determine)s 2242(the)s -2609(def)s 2(ault)k 3349(v)s 6(alues)k 4024(are)s -4390(in)s 4652(the)s 220 fnt35 5019 10909(@Use)m 240 fnt82 -5703 10912(clause)m 6375(which)s 7036(occupies)s 7943(most)s 8487(of)s -8778(the)s 0 10624(setup)m 558(\207le.)s 1027(Here)s 1547(is)s -1757(part)s 2188(of)s 2459(the)s 220 fnt35 2807 10621(@Use)m -240 fnt82 3472 10624(clause)m 4125(from)s 220 fnt35 4649 10621(cpr)m -3(int)k -240 fnt82 5184 10624(:)m 220 fnt35 612 10083(@Use { @CPSetup)m 612 9795( #)m -1034(pipe)s 3565({)s 4675(})s 612 9507( #)m 1034(n)s 2(umbered)k -3565({)s 3690(No)s 4675(})s 612 9219( #)m 1034(style)s -3565({)s 3690(\207x)s 6(ed)k 4675(})s 612 8643( #)m -1034(\207x)s 6(edf)k 6(ont)k 3565({)s 3690(Cour)s -3(ier)k -4675(})s 612 8355( #)m 1034(\207x)s 6(edsiz)k 3(e)k -3565({)s 3690(-1.0p)s 4675(})s 612 8067( #)m 1034(\207x)s 6(edline)k -3565({)s 3690(1.0vx)s 4675(})s 612 7779( #)m 1034(\207x)s 6(edtabin)k -3565({)s 3690(8)s 4675(})s 612 7491( #)m 1034(\207x)s 6(edtabout)k -3565({)s 3690(8s)s 4675(})s 612 6915( #)m 1034(\207x)s 6(edidenti\207ers)k -3565({)s 3690(Base)s 4675(})s 612 6627( #)m 1034(\207x)s 6(edk)k 4(e)k 4(yw)k 2(ords)k -3565({)s 3690(Base)s 4675(})s 612 6339( #)m 1034(\207x)s 6(edoper)k 2(ators)k -3565({)s 3690(Base)s 4675(})s 612 6051( #)m 1034(\207x)s 6(edn)k 2(umbers)k -3565({)s 3690(Base)s 4675(})s 612 5763( #)m 1034(\207x)s 6(edstr)k -3(ings)k -3565({)s 3690(Base)s 4675(})s 612 5475( #)m 1034(\207x)s 6(edcomments)k -3565({)s 3690(Base)s 4675(})s 612 5187( #)m 1034(\207x)s 6(edlinen)k 2(umbers)k -3565({)s 3690(Base)s 4675(})s 612 4611( #)m 1034(\207x)s 6(edidenti\207ersf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 4323( #)m 1034(\207x)s 6(edk)k 4(e)k 4(yw)k 2(ordsf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 4035( #)m 1034(\207x)s 6(edoper)k 2(atorsf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 3747( #)m 1034(\207x)s 6(edn)k 2(umbersf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 3459( #)m 1034(\207x)s 6(edstr)k -3(ingsf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 3171( #)m 1034(\207x)s 6(edcommentsf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 2883( #)m 1034(\207x)s 6(edlinen)k 2(umbersf)k 6(or)k -5(mat)k -3565({)s 3690(@Body)s 4675(})s 612 2307(...)m 612 1731(})m -240 fnt82 0 1193(The)m 220 fnt35 448 1190(pipe)m 240 fnt82 -934 1193(option)m 1623(will)s 2069(be)s 2371(e)s 3(xplained)k -3376(in)s 3639(Section)s 4434(1.9.)s 4918(The)s 5366(options)s -6142(whose)s 6830(name)s 7424(be)s 3(gins)k 8117(with)s -220 fnt35 8620 1190(\207x)m 6(ed)k 240 fnt82 0 905(apply)m -600(only)s 1094(when)s 220 fnt35 1685 902(style)m 240 fnt82 -2202 905(is)m 220 fnt35 2427 902(\207x)m 6(ed)k 240 fnt82 -2873 905(;)m 2999(there)s 3547(are)s 3908(corresponding)s 5344(options,)s -6171(not)s 6551(sho)s 6(wn,)k 7293(which)s 7949(apply)s -8550(when)s 220 fnt35 0 614(style)m 240 fnt82 503 617(is)m -220 fnt35 713 614(v)m 5(ar)k -6(ying)k 240 fnt82 -1469 617(and)m 220 fnt35 1873 614(symbol)m 240 fnt82 2554 617(.)m -480 243(W)m 19(e)k 849(can)s 1238(see)s 1599(in)s -1841(this)s 2237(e)s 3(xtract)k 2943(that)s 3360(the)s -3708(def)s 2(ault)k 4429(v)s 6(alue)k 4996(of)s -220 fnt35 5267 240(style)m 240 fnt82 5770 243(is)m 220 fnt35 -5979 240(\207x)m 6(ed)k 240 fnt82 6425 243(,)m 6532(and)s -6936(of)s 220 fnt35 7206 240(n)m 2(umbers)k 240 fnt82 -8111 243(is)m 220 fnt35 8321 240(No)m 240 fnt82 8594 243(.)m -8757(W)s 19(e)k -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 7 9 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.4.)m 454(Changing)s 1454(the)s 1799(appear)s 3(ance)k -2980(of)s 3261(all)s 3573(pr)s 10(o)k 2(gr)k 3(ams)k -4545(simultaneously)s 240 fnt84 8951 13840(7)m 240 fnt82 0 13205(can)m -396(also)s 842(see)s 1211(the)s 1567(def)s 2(ault)k -2296(font)s 2749(f)s 2(amily)k 15(,)k 3470(font)s -3923(f)s 2(ace,)k 4433(font)s 4886(size,)s 5372(line)s -5794(spacing,)s 6640(and)s 7052(tab)s 7405(settings)s 8194(when)s -8778(the)s 0 12917(style)m 502(is)s 220 fnt35 706 12914(\207x)m 6(ed)k -240 fnt82 1152 12917(.)m 1311(The)s 1733(font)s 2173(f)s 2(amily)k -2842(name)s 3411(for)s 220 fnt35 3743 12914(\207x)m 6(ed)k -240 fnt82 4244 12917(style)m 4745(is)s 220 fnt35 4950 12914(Cour)m -3(ier)k -240 fnt82 5671 12917(,)m 5772(b)s 4(ut)k 6129(for)s -6461(the)s 6804(other)s 7349(styles)s 7939(\(not)s 8378(sho)s 6(wn\))k -0 12629(it)m 188(is)s 393(empty)s 15(.)k 1135(This)s -1606(causes)s 2276(the)s 220 fnt35 2619 12626(\207x)m 6(ed)k -240 fnt82 3120 12629(style)m 3622(to)s 3856(al)s 2(w)k 2(ays)k -4563(switch)s 5239(to)s 5473(Courier)s 9(,)k 6296(and)s -6695(the)s 7038(other)s 7584(styles)s 8174(to)s 8408(use)s -8778(the)s 0 12341(same)m 547(font)s 992(f)s 2(amily)k -1667(as)s 1917(in)s 2160(the)s 2508(surrounding)s 3718(document.)s -480 11967(The)m 895(options)s 1637(from)s 220 fnt35 2147 11964(\207x)m 6(edidenti\207ers)k -240 fnt82 3582 11967(to)m 220 fnt35 3807 11964(\207x)m 6(edlinen)k 2(umbers)k -240 fnt82 5497 11967(allo)m 6(w)k 6062(you)s 6463(to)s -6688(set)s 6999(the)s 7334(font)s 7765(f)s 2(ace)k -8202(to)s 8427(use)s 8788(for)s 0 11679(each)m 481(of)s -738(these)s 1270(parts)s 1771(of)s 2027(your)s 2512(program.)s -3471(People)s 4164(who)s 4616(w)s 2(ant)k 5124(\207x)s 3(ed-width)k -6267(fonts)s 6781(do)s 7060(not)s 7411(usually)s 8142(w)s 2(ant)k -8650(v)s 3(ery)k 0 11391(e)m 3(xciting)k 813(font)s -1251(f)s 2(aces)k 1783(either)s 9(,)k 2417(so)s -2676(the)s 3017(def)s 2(ault)k 3731(v)s 6(alues)k -4380(abo)s 3(v)k 3(e)k 4995(are)s 5335(all)s -220 fnt35 5621 11388(Base)m 240 fnt82 6113 11391(,)m 6213(b)s 4(ut)k -6568(for)s 6899(the)s 220 fnt35 7240 11388(v)m 5(ar)k -6(ying)k -240 fnt82 7989 11391(and)m 220 fnt35 8385 11388(symbol)m 240 fnt82 -0 11103(styles,)m 657(the)s 1011(def)s 2(ault)k 1738(identi\207er)s -2667(f)s 2(ace)k 3124(is)s 220 fnt35 3340 11100(Slope)m -240 fnt82 3892 11103(,)m 4006(the)s 4360(def)s 2(ault)k -5087(k)s 2(e)k 3(yw)k 2(ord)k 5982(f)s 2(ace)k -6440(is)s 220 fnt35 6656 11100(Bold)m 240 fnt82 7082 11103(,)m -7195(and)s 7606(so)s 7878(on.)s 8288(Y)s 26(ou)k -8737(can)s 0 10815(actually)m 818(gi)s 6(v)k 3(e)k -1286(a)s 1460(f)s 2(amily)k 2144(name)s 2726(before)s -3401(the)s 3757(f)s 2(ace)k 4217(name)s 4800(in)s -5051(these)s 5607(options,)s 6427(allo)s 6(wing)k 7320(you)s -7743(to)s 7991(switch)s 8681(font)s 0 10527(f)m 2(amilies)k -817(for)s 1155(dif)s 6(ferent)k 2030(parts)s 2545(of)s -2816(the)s 3164(program)s 4034(if)s 4251(you)s 4666(wish.)s -480 10153(The)m 220 fnt35 900 10150(\207x)m 6(edidenti\207ersf)k 6(or)k -5(mat)k -240 fnt82 2964 10153(option)m 3624(allo)s 6(ws)k 4284(you)s -4690(to)s 4920(mak)s 2(e)k 5483(a)s 5641(more)s -6179(radical)s 6874(change)s 7599(to)s 7829(the)s 8168(format)s -8855(of)s 0 9865(identi\207ers)m 997(than)s 1456(just)s 1851(the)s -2190(font.)s 2729(W)s 9(ithin)k 3431(this)s 3817(option,)s -220 fnt35 4527 9862(@Body)m 240 fnt82 5298 9865(stands)m 5937(for)s -6266(the)s 6604(identi\207er)s 7516(being)s 8091(formatted,)s 0 9577(and)m -404(by)s 698(applying)s 1589(Lout)s 2101(symbols)s 2950(to)s -3189(it,)s 3428(you)s 3843(apply)s 4429(them)s 4967(to)s -5206(e)s 6(v)k 3(ery)k 5782(identi\207er)s 13(.)k -6795(F)s 3(or)k 7184(e)s 3(xample,)k 220 fnt35 -480 9076(\207x)m 6(edidenti\207ersf)k 6(or)k -5(mat { red @Colour @Body })k 240 fnt82 -0 8549(will)m 444(cause)s 1049(identi\207ers)s 2073(to)s 2330(be)s -2630(printed)s 3383(red.)s 153 fnt82 3732 8638(1)m 240 fnt82 -3930 8549(If)m 4178(you)s 4611(do)s 4922(use)s 5315(e)s 3(xotic)k -5967(formats,)s 6821(remember)s 7867(that)s 8303(in)s 8565(some)s -0 8261(programming)m 1347(languages,)s 2403(comments)s 3428(and)s 3824(e)s 6(v)k 3(en)k -4316(strings)s 4995(may)s 5453(occup)s 2(y)k 6188(more)s -6727(than)s 7188(one)s 7581(line:)s 220 fnt35 8097 8258(@Bo)m 6(x)k -240 fnt82 8690 8261(,)m 8788(for)s 0 7973(e)m 3(xample,)k -914(will)s 1340(gi)s 6(v)k 3(e)k 1799(a)s -1965(logical)s 2670(b)s 4(ut)k 3032(probably)s 3937(unw)s 2(anted)k -4924(result)s 5514(when)s 6090(formatting)s 7151(a)s 7317(multi-line)s -8314(string.)s 480 7599(As)m 795(al)s 2(w)k 2(ays)k -1504(with)s 1983(setup)s 2539(\207les,)s 3041(to)s 3278(change)s -4009(a)s 4173(def)s 2(ault)k 4892(v)s 6(alue,)k -5508(delete)s 6132(the)s 6477(preceding)s 220 fnt35 7471 7596(#)m -240 fnt82 7645 7599(and)m 8047(change)s 8778(the)s 0 7311(part)m -432(between)s 1288(braces.)s 2064(F)s 3(or)k 2455(e)s 3(xample,)k -3371(suppose)s 4200(you)s 4617(are)s 4966(happ)s 2(y)k -5606(with)s 220 fnt35 6090 7308(\207x)m 6(ed)k 240 fnt82 -6597 7311(e)m 3(xcept)k 7280(that)s 7700(you)s 8117(w)s 2(ant)k -8642(bold)s 0 7023(k)m 2(e)k 3(yw)k 2(ords.)k -1088(Then)s 1637(one)s 2039(line)s 2453(needs)s 3049(to)s -3288(be)s 3570(changed,)s 4475(to)s 220 fnt35 480 6524(\207x)m 6(edk)k 4(e)k 4(yw)k 2(ords { Bold })k -240 fnt82 0 6026(Or)m 307(suppose)s 1130(you)s 1540(lik)s 2(e)k -220 fnt35 1947 6023(v)m 5(ar)k -6(ying)k 240 fnt82 -2698 6026(as)m 2943(it)s 3130(stands,)s 3830(b)s 4(ut)k -4187(w)s 2(ould)k 4836(lik)s 2(e)k 5243(it)s -5430(to)s 5664(be)s 5941(the)s 6284(def)s 2(ault)k -7000(style)s 7502(rather)s 8113(than)s 220 fnt35 8576 6023(\207x)m 6(ed)k -240 fnt82 9022 6026(.)m 0 5738(Ag)m 1(ain,)k 691(only)s -1171(one)s 1573(line)s 1987(needs)s 2583(to)s 2822(be)s -3104(changed,)s 4009(to)s 220 fnt35 4248 5735(style { v)m 5(ar)k -6(ying })k -240 fnt82 5727 5738(.)m 480 5364(It)m 708(is)s 942(probably)s -1871(not)s 2261(a)s 2451(good)s 3013(idea)s 3495(to)s -3758(change)s 4516(the)s 4888(def)s 2(ault)k 5633(v)s 6(alue)k -6225(of)s 220 fnt35 6520 5361(n)m 2(umbered)k 240 fnt82 -7578 5364(to)m 220 fnt35 7841 5361(Y)m 30(es)k 240 fnt82 -8182 5364(,)m 8313(because)s 0 5076(small)m 572(fragments)s 1578(of)s -1848(code)s 2356(within)s 3024(paragraphs)s 4123(will)s 4549(then)s -5018(get)s 5369(line)s 5783(numbers)s 6658(as)s 6907(well)s -7373(as)s 7623(lar)s 4(ge)k 8151(displayed)s 0 4788(programs.)m -1078(If)s 1319(you)s 1746(do)s 2050(ha)s 4(v)k 3(e)k -2562(man)s 3(y)k 3157(lar)s 4(ge)k 3697(numbered)s -4723(programs)s 5689(as)s 5950(well)s 6427(as)s 6689(small)s -7272(fragments,)s 8345(a)s 8523(better)s 0 4500(approach)m 934(w)s 2(ould)k -1589(be)s 1871(to)s 2110(place)s 220 fnt35 480 3999(impor)m -8(t @CPSetup)k -480 3711(macro @NCP { @CP n)m 2(umbered { )k 19(Y)k 30(es } })k 240 fnt82 -0 3217(\(or)m 336(the)s 681(equi)s 6(v)k 6(alent)k -1723(for)s 2058(your)s 2555(language\))s 3544(in)s 3785(your)s -220 fnt35 4281 3214(m)m 3(ydefs)k 240 fnt82 5037 3217(\207le,)m -5446(so)s 5710(that)s 6125(you)s 6538(can)s 6924(type)s -220 fnt35 7390 3214(@NCP)m 240 fnt82 8123 3217(instead)m 8855(of)s -220 fnt35 0 2926(@CP n)m 2(umbered { )k 19(Y)k 30(es })k -240 fnt82 2223 2929(.)m 480 2555(The)m 905(setup)s 1460(\207les)s -1906(for)s 2241(the)s 2586(other)s 3134(languages)s 4139(are)s -4483(identical)s 5357(to)s 5593(this)s 5986(one,)s 6436(e)s 3(xcept)k -7114(that)s 7529(the)s 7874(symbol)s 8630(after)s 220 fnt35 -0 2264(@Use)m 240 fnt82 666 2267(is)m 878(dif)s 6(ferent,)k -1801(and)s 2207(some)s 2770(of)s 3042(the)s 3392(def)s 2(ault)k -4114(v)s 6(alues)k 4772(may)s 5240(be)s 5523(dif)s 6(ferent.)k -6504(Changing)s 7490(an)s 7775(option)s 8446(af)s 6(fects)k -0 1979(only)m 480(the)s 828(language)s 1749(of)s 2020(that)s -2438(setup)s 2997(\207le;)s 3414(if)s 3632(you)s 4047(ha)s 4(v)k 3(e)k -4548(multiple)s 5401(languages)s 6409(you)s 6824(can)s 7214(ha)s 4(v)k 3(e)k -7715(multiple)s 8568(setup)s 1134 0 0 0 240 288 60 0 1457 LoutGr2 -0 0 moveto xsize 0 lineto stroke -grestore - -grestore -122 fnt82 0 1262(1)m 172 fnt35 -56 1191(@Colour)m 192 fnt82 779 1192(is)m 945(not)s 1235(a)s -1365(Lout)s 1773(primiti)s 4(v)k 2(e)k 2510(lik)s 1(e,)k -2879(say)s 12(,)k 172 fnt35 3206 1191(@F)m 5(ont)k -192 fnt82 3714 1192(;)m 3801(it)s 3952(is)s 4118(de\207ned)s -4726(when)s 5184(you)s 5514(write)s 172 fnt35 5948 1191(@SysInclude { doc })m -192 fnt82 7528 1192(or)m 7733(the)s 8009(equi)s 4(v)k 4(alent)k -8844(for)s 0 962(the)m 279(other)s 720(document)s 1524(types.)s -2060(This)s 2441(is)s 2609(true)s 2952(of)s 3168(quite)s -3596(a)s 3729(fe)s 4(w)k 4055(generally)s 4811(useful)s -5322(symbols,)s 6047(including)s 172 fnt35 6814 961(@Bo)m 5(x)k -192 fnt82 7325 962(and)m 172 fnt35 7649 961(@I)m 192 fnt82 -7855 962(.)m 7987(If)s 8170(you)s 8502(w)s 1(ant)k -8922(to)s 0 732(use)m 300(these)s 738(symbols)s 1417(here,)s -1832(you)s 2164(must)s 2583(include)s 3192(your)s 3591(setup)s -4038(\207le)s 192 fnt83 4327 733(after)m 172 fnt35 4740 731(@SysInclude { doc })m -192 fnt82 6322 732(or)m 6529(whate)s 4(v)k 2(er)k 7(,)k -7303(the)s 7582(re)s 4(v)k 2(erse)k 8172(of)s -8388(the)s 8666(usual)s 0 502(arrangement,)m 1044(so)s 1260(that)s -1597(the)s 2(y)k 1972(are)s 2253(de\207ned)s 2866(before)s -3402(Lout)s 3814(reads)s 4261(your)s 4663(setup)s 5112(\207le.)s -5490(This)s 5873(re)s 4(v)k 2(ersal)k 6518(is)s -6689(carried)s 7268(out)s 7564(automatically)s 8653(when)s 0 272(formatting)m -841(programs)s 1594(independently)s 2715(of)s 2921(an)s 2(y)k -3230(document,)s 4063(so)s 4266(you)s 4588(can)s 4891(use)s -5181(these)s 5609(symbols)s 6279(in)s 6464(a)s 6587(setup)s -7025(\207le)s 7304(gi)s 4(v)k 2(en)k 7760(by)s -7987(a)s 172 fnt35 8110 271(-S)m 192 fnt82 8311 272(command)m -0 42(line)m 332(\210ag.)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 8 10 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(8)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt82 0 13205(\207les)m 449(and)s 853(change)s 1587(their)s -2084(options)s 2840(quite)s 3374(independently)s 4784(of)s 5055(each)s -5550(other)s 13(.)k 240 fnt84 0 12412(1.5.)m 471(Dealing)s -1311(with)s 1817(tab)s 2201(characters)s 3330(in)s 3585(pr)s 4(ograms)k -240 fnt82 480 11935(T)m 19(ab)k 896(characters)s 1924(pro)s 3(vide)k -2718(a)s 2894(con)s 9(v)k 3(enient)k 4002(w)s 2(ay)k -4463(to)s 4712(indent)s 5380(and)s 5794(align)s 6339(parts)s -6864(of)s 7145(computer)s 8119(programs.)s 0 11647(W)m 9(ith)k -526(care,)s 1030(this)s 1426(alignment)s 2442(can)s 2831(be)s -3113(preserv)s 3(ed)k 4097(in)s 4340(the)s 4688(\207nal)s -5168(print)s 5679(e)s 6(v)k 3(en)k 6179(with)s -6661(v)s 6(arying-width)k 8067(fonts.)s 480 11273(The)m 896(distance)s -1723(between)s 2565(tw)s 2(o)k 2962(tab)s 3295(stops)s -3826(in)s 4056(the)s 4392(program)s 5250(te)s 3(xt)k -5653(is)s 5850(by)s 6132(def)s 2(ault)k 6841(tak)s 2(en)k -7401(to)s 7628(be)s 7898(8)s 8052(characters,)s 0 10985(which)m -642(is)s 852(standard)s 1720(for)s 2058(Unix.)s 2701(This)s -3177(can)s 3566(be)s 3848(changed)s 4704(with)s 5186(the)s -220 fnt35 5534 10982(tabin)m 240 fnt82 6055 10985(option.)m 6831(F)s 3(or)k -7220(e)s 3(xample,)k 220 fnt35 480 10484(@CP tabin { 4 })m 240 fnt82 -0 9990(informs)m 789(Lout)s 1296(that)s 1709(tab)s 2049(stops)s -2587(occur)s 3173(e)s 6(v)k 3(ery)k 3744(4)s -3913(characters)s 4926(in)s 5164(the)s 5507(program)s 6372(te)s 3(xt.)k -6886(All)s 7241(the)s 7584(symbols)s 8428(\()s 220 fnt35 -8501 9987(@CP)m 240 fnt82 9019 9990(,)m 220 fnt35 0 9699(@Eiff)m 6(el)k -240 fnt82 689 9702(,)m 785(etc.\))s 1240(and)s 1633(their)s -2118(setup)s 2665(\207les)s 3103(ha)s 4(v)k 3(e)k -3593(this)s 3977(option)s 4635(and)s 5028(the)s 5364(ne)s 3(xt;)k -5874(b)s 4(ut)k 6225(to)s 6453(sa)s 4(v)k 3(e)k -6915(repetition)s 7876(we)s 8200(will)s 8614(stick)s 0 9414(with)m -482(C)s 694(for)s 1032(the)s 1380(rest)s 1784(of)s -2055(this)s 2451(section.)s 480 9040(The)m 916(distance)s 1764(between)s -2627(tw)s 2(o)k 3046(tab)s 3399(stops)s 3951(on)s -4257(the)s 4614(printed)s 5357(page)s 5874(is)s 6093(quite)s -6636(a)s 6810(dif)s 6(ferent)k 7694(thing,)s 8302(and)s -8715(it)s 8916(is)s 0 8752(determined)m 1133(by)s 1427(the)s -1775(v)s 6(alue)k 2343(of)s 2614(the)s 220 fnt35 -2962 8749(tabout)m 240 fnt82 3628 8752(option,)m 4347(which)s 4989(must)s -5514(be)s 5796(a)s 5962(Lout)s 6474(length.)s 7236(F)s 3(or)k -7625(e)s 3(xample,)k 220 fnt35 480 8251(@CP tabout { 0.5i })m 240 fnt82 -0 7757(requests)m 857(that)s 1298(tab)s 1666(stops)s 2232(be)s -2537(placed)s 3243(at)s 3498(half-inch)s 4440(interv)s 6(als.)k -5443(In)s 5722(other)s 6297(w)s 2(ords,)k 7010(a)s -7199(distance)s 8061(of)s 8355(one)s 8781(tab)s 0 7469(stop)m -474(in)s 739(the)s 1109(program)s 2001(te)s 3(xt)k -2439(will)s 2887(be)s 3191(equi)s 6(v)k 6(alent)k -4257(to)s 4519(a)s 4707(distance)s 5568(of)s 5861(half)s -6326(an)s 6632(inch)s 7123(on)s 7442(the)s 7812(printed)s -8570(page.)s 0 7181(F)m 3(or)k 389(e)s 3(xample,)k -220 fnt35 480 6680(@CP style { v)m 5(ar)k -6(ying } tabout { 3f } n)k 2(umbered { )k 19(Y)k 30(es })k -240 fnt82 0 6181(might)m 659(produce)s 1527(the)s 1916(follo)s 6(wing,)k -2989(where)s 3670(tab)s 4056(characters)s 5116(in)s 5400(the)s -5789(program)s 6700(te)s 3(xt)k 7157(ha)s 4(v)k 3(e)k -7699(been)s 8249(used)s 8788(for)s 0 5893(indenting)m 957(and)s -1361(also)s 1799(to)s 2038(align)s 2573(the)s 2921(comments:)s -480 5388(1)m 240 fnt84 1200 5387(struct)m 240 fnt83 1856 5390(tnode)m -240 fnt82 2441 5388({)m 4080(/*)s 4310(the)s 4658(basic)s -5202(node)s 5724(*/)s 480 5100(2)m 240 fnt84 1920 5099(char)m -240 fnt82 2443 5046(*)m 240 fnt83 2547 5102(wor)m 8(d)k -240 fnt82 3038 5100(;)m 4080(/*)s 4310(points)s 4946(to)s -5185(the)s 5533(te)s 3(xt)k 5948(*/)s 480 4812(3)m -240 fnt84 1920 4811(int)m 240 fnt83 2258 4814(count)m 240 fnt82 -2794 4812(;)m 4080(/*)s 4310(number)s 5101(of)s 5372(occurrences)s -6564(*/)s 480 4524(4)m 240 fnt84 1920 4523(struct)m 240 fnt83 -2576 4526(tnode)m 240 fnt82 3161 4470(*)m 240 fnt83 3265 4526(left)m -240 fnt82 3573 4524(;)m 4080(/*)s 4310(left)s 4687(child)s -5223(*/)s 480 4236(5)m 240 fnt84 1920 4235(struct)m 240 fnt83 -2576 4238(tnode)m 240 fnt82 3161 4182(*)m 240 fnt83 3265 4238(right)m -240 fnt82 3734 4236(;)m 4080(/*)s 4310(right)s 4821(child)s -5357(*/)s 480 3948(6)m 1200(};)s 0 3454(W)m 19(e')k 12(v)k 3(e)k -672(used)s 220 fnt35 1183 3451(n)m 2(umbered { )k 19(Y)k 30(es })k -240 fnt82 2891 3454(to)m 3144(demonstrate)s 4381(that)s 4813(the)s -5174(features)s 5994(for)s 6345(dealing)s 7116(with)s 7611(tabs)s -8061(w)s 2(ork)k 8626(e)s 6(v)k 3(en)k -0 3166(with)m 471(line)s 873(numbers.)s 1850(The)s 2266(v)s 6(alue)k -220 fnt35 2823 3163(3f)m 240 fnt82 3051 3166(means)m 3702(three)s -4223(times)s 4780(the)s 5116(current)s 5841(font)s 6274(size,)s -6741(and)s 7133(it)s 7314(is)s 7512(the)s 7849(def)s 2(ault)k -8558(v)s 6(alue)k 0 2878(of)m 220 fnt35 273 2875(tabout)m -240 fnt82 942 2878(for)m 1282(the)s 220 fnt35 1633 2875(v)m 5(ar)k -6(ying)k -240 fnt82 2391 2878(and)m 220 fnt35 2798 2875(symbol)m 240 fnt82 -3541 2878(styles)m 4139(\(Section)s 4994(1.4\).)s 5540(In)s 5798(a)s -5967(12)s 6263(point)s 6818(font)s 7265(this)s 7664(is)s -7876(36)s 8172(points,)s 8867(or)s 0 2590(half)m 443(an)s -726(inch.)s 480 2216(If)m 220 fnt35 710 2213(tabout)m 240 fnt82 -1376 2216(is)m 1586(too)s 1945(small,)s 2569(there)s 3102(is)s -3312(a)s 3478(danger)s 4189(that)s 4607(the)s 4955(alignment)s -5971(might)s 6589(f)s 2(ail.)k 7068(F)s 3(or)k -7457(e)s 3(xample,)k 220 fnt35 480 1715(@CP style { v)m 5(ar)k -6(ying } tabout { 0.2i })k -240 fnt82 0 1216(produces)m -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 9 11 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Courier -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Courier -/Courierfnt29 vec2 /Courier LoutRecode -/fnt29 { /Courierfnt29 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.5.)m 454(Dealing)s 1279(with)s 1746(tab)s -2106(c)s 3(har)k 3(acter)k 2(s)k 3176(in)s -3416(pr)s 10(o)k 2(gr)k 3(ams)k 240 fnt84 -8952 13840(9)m 480 13202(struct)m 240 fnt83 1136 13205(tnode)m 240 fnt82 -1721 13203({)m 1805(/*)s 2035(the)s 2383(basic)s 2927(node)s -3449(*/)s 240 fnt84 768 12914(char)m 240 fnt82 1291 12861(*)m -240 fnt83 1395 12917(wor)m 8(d)k 240 fnt82 1886 12915(;)m -1938(/*)s 2168(points)s 2804(to)s 3043(the)s 3391(te)s 3(xt)k -3806(*/)s 240 fnt84 768 12626(int)m 240 fnt83 1106 12629(count)m -240 fnt82 1642 12627(;)m 1694(/*)s 1924(number)s 2715(of)s -2986(occurrences)s 4178(*/)s 240 fnt84 768 12338(struct)m 240 fnt83 -1424 12341(tnode)m 240 fnt82 2009 12285(*)m 240 fnt83 2113 12341(left)m -240 fnt82 2421 12339(;)m 2473(/*)s 2703(left)s 3080(child)s -3616(*/)s 240 fnt84 768 12050(struct)m 240 fnt83 1424 12053(tnode)m -240 fnt82 2009 11997(*)m 240 fnt83 2113 12053(right)m 240 fnt82 -2582 12051(;)m 2634(/*)s 2864(right)s 3375(child)s 3911(*/)s -480 11763(};)m 0 11269(gi)m 6(v)k 3(en)k 590(the)s -948(same)s 1505(C)s 1727(te)s 3(xt)k 2153(as)s -2413(the)s 2771(pre)s 6(vious)k 3650(e)s 3(xample.)k -4632(The)s 5070(problem)s 5937(here)s 6414(is)s 6634(that)s -7063(we)s 7408(are)s 7765(asking)s 8453(for)s 220 fnt29 -8802 11277(/*)m 240 fnt82 71 10981(to)m 321(appear)s 1029(four)s -1498(tab)s 1854(stops)s 2408(or)s 2678(0.8)s 3036(inches)s -3709(from)s 4244(the)s 4603(left)s 4991(edge,)s 5561(and)s -5976(yet)s 6339(the)s 6698(material)s 7545(to)s 7795(its)s -8082(left)s 8470(on)s 8778(the)s 0 10693(line)m 419(is)s -634(wider)s 1244(than)s 1718(this.)s 2232(This)s 2714(causes)s -220 fnt29 3394 10701(/*)m 240 fnt82 3861 10693(to)m 4105(be)s -4393(shifted)s 5106(further)s 5820(to)s 6065(the)s 6418(right)s -6934(than)s 7409(e)s 3(xpected,)k 8368(and)s 8778(the)s -0 10405(alignment)m 1016(is)s 1226(lost.)s 1735(The)s 2163(only)s -2643(solution)s 3471(is)s 3681(to)s 3920(increase)s 220 fnt35 -4758 10402(tabout)m 240 fnt82 5364 10405(.)m 480 10031(When)m 1108(typesetting)s -2208(computer)s 3169(program)s 4038(te)s 3(xts)k 4535(independently)s -5943(of)s 6213(an)s 3(y)k 6608(document,)s 7657(there)s -8189(are)s 220 fnt35 8534 10028(-t)m 240 fnt82 8722 10031(and)m -220 fnt35 0 9740(-T)m 240 fnt82 289 9743(options)m 1070(to)s -1335(the)s 220 fnt35 1708 9740(prg2lout)m 240 fnt82 2581 9743(program)m -3477(equi)s 6(v)k 6(alent)k 4546(to)s 220 fnt35 -4811 9740(tabin)m 240 fnt82 5357 9743(and)m 220 fnt35 5786 9740(tabout)m -240 fnt82 6478 9743(respecti)m 6(v)k 3(ely)k 15(.)k -7797(F)s 3(or)k 8212(e)s 3(xample,)k 220 fnt35 -0 9452(-T0.5i)m 240 fnt82 606 9455(produces)m 1521(a)s 1687(half-inch)s -2606(tab)s 2951(width.)s 240 fnt84 0 8662(1.6.)m 471(Dealing)s -1311(with)s 1817(f)s 6(ormfeed)k 2794(characters)s 3923(in)s -4178(pr)s 4(ograms)k 240 fnt82 480 8185(The)m 900(formfeed)s -1824(\(Control-L\))s 2978(character)s 3904(is)s 4105(traditionally)s 5317(tak)s 2(en)k -5881(to)s 6112(be)s 6385(a)s 6542(request)s 7283(to)s -7514(start)s 7975(a)s 8132(ne)s 6(w)k 8570(page.)s -0 7897(This)m 476(is)s 686(e)s 3(xplicitly)k 1639(recognized)s -2746(by)s 3040(the)s 3388(formal)s 4079(de\207nition)s 5054(of)s -5325(the)s 5673(C)s 5885(language)s 6805(and)s 7209(man)s 3(y)k -7792(others,)s 8484(which)s 0 7609(treat)m 486(this)s 886(character)s -1823(as)s 2077(white)s 2667(space)s 3258(from)s 3785(a)s -3955(language)s 4878(point)s 5434(of)s 5708(vie)s 6(w)k 15(,)k -6263(with)s 6748(the)s 7100(understanding)s 8512(that)s 8934(it)s -0 7321(will)m 426(cause)s 1013(a)s 1179(page)s 1687(break)s -2279(when)s 2855(printed.)s 480 6947(There)m 1086(are)s 1426(no)s -220 fnt35 1712 6944(prg2lout)m 240 fnt82 2553 6947(options)m 3302(for)s -3633(dealing)s 4383(with)s 4858(formfeed)s 5784(characters.)s 6908(The)s 3(y)k -7444(will)s 7863(be)s 8137(con)s 9(v)k 3(erted)k -0 6659(into)m 220 fnt35 425 6656(@NP)m 240 fnt82 1003 6659(\(ne)m 6(w)k -1529(page\))s 2109(symbols,)s 3014(causing)s 3798(a)s 3964(ne)s 6(w)k -4411(page)s 4919(or)s 5178(column)s 5953(to)s 6192(be)s -6474(be)s 3(gun)k 7114(in)s 7357(the)s 7705(printing.)s -480 6285(Whether)m 1386(formfeed)s 2342(characters)s 3383(end)s 3810(their)s -4330(line)s 4767(or)s 5050(not)s 5439(is)s 5672(a)s -5861(problem.)s 6845(Consider)s 7792(this)s 8212(e)s 3(xample,)k -0 5997(where)m 220 fnt35 640 5994(^L)m 240 fnt82 921 5997(stands)m -1570(for)s 1908(one)s 2310(formfeed)s 3243(character:)s 220 fnt35 -480 5549(abc)m 480 5261(def^Lghi)m 480 4973(jhk)m 240 fnt82 0 4476(Ho)m 6(w)k -532(man)s 3(y)k 1134(lines)s 1654(does)s 2163(this)s -2577(e)s 3(xample)k 3459(contain?)s 4401(Y)s 26(our)k -4945(te)s 3(xt)k 5379(editor)s 6014(w)s 2(ould)k -6688(probably)s 7611(say)s 8003(`three',)s 8764(b)s 4(ut)k -0 4188(when)m 571(you)s 980(print)s 1486(it)s 1672(you)s -2081(will)s 2502(see)s 2857(four)s 13(.)k 3400(It)s -3600(is)s 3804(not)s 4164(desirable)s 5077(to)s 5310(ha)s 4(v)k 3(e)k -5805(printed)s 6535(programs)s 7483(\(especially)s 8565(those)s 0 3900(with)m -465(line)s 861(numbers)s 1718(attached\))s 2624(disagreeing)s 3761(with)s -4225(te)s 3(xt)k 4623(editors)s 5306(about)s 5880(line)s -6276(numbers.)s 7246(The)s 7656(solution)s 8466(adopt)s 8998(-)s -0 3612(ed)m 297(by)s 220 fnt35 604 3609(prg2lout)m 240 fnt82 -1466 3612(to)m 1718(this)s 2128(problem)s 2998(is)s 3222(to)s -3474(treat)s 3971(the)s 4332(formfeed)s 5279(character)s 6226(as)s -6490(including)s 7460(a)s 7640(ne)s 6(wline,)k 8511(b)s 4(ut)k -8887(to)s 0 3324(assign)m 647(the)s 987(same)s 1526(line)s -1932(number)s 2715(to)s 2946(both)s 3421(parts)s 3928(of)s -4191(the)s 4531(original)s 5321(line)s 5727(\(the)s 6146(parts)s -6653(before)s 7311(and)s 7707(after)s 8195(the)s 8534(form)s -8998(-)s 0 3036(feed\).)m 664(If)s 905(the)s 1264(part)s -1705(after)s 2212(the)s 2571(formfeed)s 3514(is)s 3735(empty)s -4398(\(that)s 4905(is,)s 5182(if)s 5410(the)s 5768(formfeed)s -6712(character)s 7657(is)s 7878(immediately)s 0 2748(follo)m 6(wed)k -913(by)s 1219(a)s 1397(ne)s 6(wline)k 2216(or)s -2487(another)s 3276(formfeed\),)s 4349(and)s 4765(if)s 4994(the)s -5354(formfeed)s 6299(is)s 6521(not)s 6899(inside)s 7538(an)s 3(y)k -7947(le)s 3(xical)k 8647(unit,)s 0 2460(then)m 469(the)s -817(empty)s 1469(line)s 1883(after)s 2379(the)s 2727(formfeed)s -3660(will)s 4086(not)s 4452(be)s 4734(printed)s 5469(at)s -5701(all.)s 480 2086(The)m 901(most)s 1419(common)s 2307(case)s -2767(is)s 2970(that)s 3381(of)s 3645(a)s 3804(formfeed)s -4729(character)s 9(,)k 5694(outside)s 6434(an)s 3(y)k -6824(le)s 3(xical)k 7505(unit,)s 7977(on)s 8267(a)s -8426(line)s 8832(by)s 0 1798(itself.)m 640(Let')s 13(s)k -1168(see)s 1529(what)s 2054(this)s 2450(rule)s 2877(produces)s -3792(in)s 4035(the)s 4383(follo)s 6(wing)k 5360(e)s 3(xample)k -6223(of)s 6494(this)s 6890(case:)s 220 fnt35 480 1301(abc)m -480 1013(def)m 480 725(^L)m 480 437(ghi)m -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 10 12 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(10)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt82 0 13205(There)m 615(will)s 1043(be)s 1328(one)s -1732(blank)s 2327(line)s 2744(numbered)s 3761(3)s 3927(at)s -4162(the)s 4512(end)s 4918(of)s 5192(the)s 5542(\207rst)s -5975(page,)s 6537(and)s 6943(a)s 7111(line)s 7528(numbered)s -8545(4)s 8722(and)s 0 12917(containing)m 220 fnt35 1065 12914(ghi)m -240 fnt82 1405 12917(at)m 1639(the)s 1989(start)s 2461(of)s -2734(the)s 3084(ne)s 3(xt)k 3555(page.)s 4173(The)s -4603(blank)s 5198(line)s 5614(is)s 5826(a)s 5994(necessity)s 15(,)k -6964(at)s 7198(least)s 7697(when)s 8275(lines)s 8779(are)s -0 12629(being)m 596(numbered,)s 1671(because)s 2496(we)s 2842(w)s 2(ant)k -3377(the)s 3736(last)s 4139(line)s 4564(in)s 4819(the)s -5178(e)s 3(xample)k 6053(to)s 6303(be)s 6597(numbered)s -7623(4)s 7809(to)s 8059(agree)s 8644(with)s 0 12341(te)m 3(xt)k -414(editors,)s 1169(b)s 4(ut)k 1529(we)s 1862(don')s 4(t)k -2422(w)s 2(ant)k 2943(the)s 3289(line)s 3701(numbers)s -4575(on)s 4870(our)s 5247(print)s 5756(to)s 5994(skip)s -6444(from)s 6966(2)s 7138(on)s 7434(the)s 7780(\207rst)s -8209(page)s 8715(to)s 8952(4)s 0 12053(on)m 297(the)s -644(second,)s 1415(because)s 2227(that)s 2644(w)s 2(ould)k -3298(mak)s 2(e)k 3869(readers)s 4609(anxious)s 5404(about)s -5995(the)s 6342(apparently)s 7404(missing)s 8200(line)s 8613(3.)s -8896(If)s 0 11765(you)m 415(don')s 4(t)k 976(w)s 2(ant)k -1499(that)s 1917(empty)s 2569(line,)s 3034(mo)s 3(v)k 3(e)k -3616(the)s 3964(formfeed)s 4897(character)s 5831(to)s 6070(the)s -6418(end)s 6822(of)s 7093(the)s 7441(preceding)s 8437(line.)s -240 fnt84 0 10972(1.7.)m 471(Embedding)s 1710(Lout)s 2262(commands)s -3419(within)s 4125(pr)s 4(ogram)k 5081(comments)s 240 fnt82 -480 10495(It)m 712(is)s 949(possible)s 1817(to)s 2083(embed)s -2806(Lout)s 3346(te)s 3(xt)k 3788(inside)s 4442(program)s -5340(comments.)s 6514(Ho)s 6(w)k 7055(this)s 7479(is)s -7716(done)s 8265(could)s 8883(in)s 0 10207(principle)m 916(v)s 6(ary)k -1401(from)s 1936(language)s 2868(to)s 3118(language,)s 4101(b)s 4(ut)k -4474(in)s 4729(e)s 6(v)k 3(ery)k 5317(language)s -6248(supported)s 7262(so)s 7539(f)s 2(ar)k 7873(it)s -8076(is)s 8298(done)s 8832(by)s 0 9919(starting)m 757(of)s 6(f)k -1089(the)s 1424(comment)s 2362(with)s 2831(an)s 220 fnt35 -3102 9916(@)m 240 fnt82 3341 9919(character)m 13(.)k 4353(If)s -4571(the)s 4906(language)s 5814(has)s 6172(se)s 6(v)k 3(eral)k -6881(w)s 2(ays)k 7410(to)s 7636(get)s 7976(a)s -8129(comment,)s 0 9631(this)m 408(will)s 847(w)s 2(ork)k -1411(e)s 6(v)k 3(ery)k 2000(w)s 2(ay)k 15(.)k -2559(The)s 3000(entire)s 3612(comment)s 4575(after)s 5083(the)s -220 fnt35 5444 9628(@)m 240 fnt82 5708 9631(character)m 6655(should)s -7365(then)s 7847(be)s 8142(Lout)s 8667(te)s 3(xt.)k -0 9343(F)m 3(or)k 389(e)s 3(xample,)k 1303(to)s -1542(force)s 2088(Lout)s 2600(to)s 2839(start)s 3309(a)s -3475(ne)s 6(w)k 3922(page)s 4430(at)s 4662(some)s -5223(point)s 5775(within)s 6443(a)s 6609(C)s 6821(program,)s -7738(place)s 220 fnt35 480 8842(/*@ @NP */)m 240 fnt82 0 8387(at)m -234(that)s 655(point.)s 1314(\(In)s 1652(this)s 2051(case)s -2521(you)s 2939(can)s 3331(also)s 3772(simply)s 4480(include)s -5243(a)s 5412(formfeed)s 6348(character)s 9(,)k 7323(control-L,)s -8335(without)s 0 8099(an)m 3(y)k 414(comment;)s 1433(see)s -1811(Section)s 2602(1.6)s 2972(for)s 3328(more)s 3892(on)s -4206(this.\))s 4816(Or)s 9(,)k 5183(to)s 5439(mak)s 2(e)k -6029(a)s 6212(heading)s 7040(in)s 7300(an)s 7600(Eif)s 6(fel)k -8209(program,)s 0 7811(do)m 293(this:)s 220 fnt35 480 7360(--@ @Displa)m 6(y @Heading { treepr)k -3(int })k -240 fnt82 0 6861(\(Eif)m 6(fel)k 658(comments)s 1680(be)s 3(gin)k -2254(with)s 220 fnt35 2724 6858(--)m 240 fnt82 2909 6861(and)m -3300(end)s 3692(at)s 3912(the)s 4248(end)s 4640(of)s -4899(the)s 5234(line.\))s 5828(Other)s 6420(possible)s 7248(uses)s -7699(for)s 8025(this)s 8408(feature)s 0 6573(include)m 760(inde)s 3(x)k -1344(entries)s 2031(and)s 2435(mar)s 4(gin)k 3165(notes.)s -3834(Incredible)s 4858(as)s 5108(it)s 5300(may)s 5766(seem,)s -6364(you)s 6779(can)s 7168(e)s 6(v)k 3(en)k -7668(write)s 220 fnt35 480 6072(/*@ @CD @Heading { Function @CP { treepr)m -3(int\(\) } } */)k 240 fnt82 -0 5573(with)m 500(a)s 220 fnt35 684 5570(@CP)m 240 fnt82 -1280 5573(symbol)m 2058(and)s 2481(some)s 3060(C)s 3290(code)s -3816(inside)s 4462(the)s 4828(Lout)s 5358(code)s 5884(inside)s -6530(the)s 6896(C)s 7126(code.)s 7760(Y)s 26(ou)k -8221(probably)s 0 5285(can')m 4(t)k 566(go)s 892(further)s 9(,)k -1673(ho)s 6(we)k 6(v)k 3(er)k 9(,)k -2613(at)s 2879(least)s 3409(not)s 3808(in)s 4085(C,)s -4385(since)s 4966(that)s 5417(w)s 2(ould)k 6105(require)s -6871(a)s 7070(C)s 7316(comment)s 8299(inside)s 8960(a)s -0 4997(C)m 212(comment.)s 240 fnt84 0 4253(1.8.)m 471(Embedding)s -1710(pr)s 4(ogram)k 2666(text)s 3110(within)s 3816(pr)s 4(ogram)k -4772(comments)s 240 fnt82 480 3776(The)m 902(standard)s 1763(reference)s -2699(for)s 3030(the)s 3371(Eif)s 6(fel)k 3955(language)s -4869([1)s 5043(])s 5154(speci\207es)s 6021(that)s 6432(identi\207ers)s -7431(within)s 8092(comments)s 0 3488(may)m 466(or)s 725(should)s -1422(be)s 1704(enclosed)s 2599(in)s 2842(`)s 2963(and)s -3367(')s 3479(so)s 3745(that)s 4163(the)s 3(y)k -4626(may)s 5092(be)s 5374(noticed)s 6136(and)s 6540(printed)s -7275(in)s 7518(an)s 7801(italic)s 8330(font:)s 220 fnt35 -480 2987(@ID @Eiff)m 6(el {)k 480 2699(deposit\(amount:)m 11( REAL\) is)k 480 2411( -- deposit )m 13(`amount')k 15( dollars)k -480 2123(})m 240 fnt82 0 1629(produces)m 240 fnt83 480 1126(deposit)m -240 fnt82 1175 1124(\()m 240 fnt83 1248 1126(amount)m 240 fnt82 -1971 1124(:)m 240 fnt83 2077 1126(REAL)m 240 fnt82 2648 1124(\))m -240 fnt84 2776 1123(is)m 240 fnt82 1200 836(--)m 1407(deposit)s -240 fnt83 2158 838(amount)m 240 fnt82 2941 836(dollars)m 0 333(This)m -463(has)s 819(been)s 1315(generalized)s 2460(in)s 2690(Lout:)s -3294(arbitrary)s 4156(te)s 3(xt)k 4557(within)s 5212(an)s -5481(Eif)s 6(fel)k 6059(comment)s 6995(between)s 7836(`)s -7943(and)s 8334(')s 8432(will)s 8844(be)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 11 13 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.8.)m 454(Embedding)s 1599(pr)s 10(o)k 2(gr)k 3(am)k -2479(te)s 4(xt)k 2883(within)s 3535(pr)s 10(o)k 2(gr)k 3(am)k -4415(comments)s 240 fnt84 8839 13840(11)m 240 fnt82 0 13205(treated)m -707(as)s 957(Eif)s 6(fel)k 1548(te)s 3(xt)k -1963(and)s 2367(printed)s 3102(accordingly)s 15(.)k 4380(Some)s -4981(other)s 5532(languages)s 6540(may)s 7006(also)s 7444(of)s 6(fer)k -7961(this)s 8358(feature:)s 0 12917(see)m 377(the)s 742(\207fth)s -1214(column)s 2006(of)s 2294(the)s 2659(table)s 3195(at)s -3444(the)s 3809(start)s 4296(of)s 4584(this)s 4997(chapter)s 13(.)k -5867(In)s 6140(principle)s 7062(the)s 7427(precise)s 8176(means)s -8855(of)s 0 12629(getting)m 707(it)s 889(could)s 1469(v)s 6(ary)k -1932(from)s 2445(language)s 3355(to)s 3584(language,)s 4545(b)s 4(ut)k -4897(the)s 5234(languages)s 6232(a)s 4(v)k 6(ailable)k -7130(at)s 7352(the)s 7690(moment)s 8523(either)s 0 12341(do)m -293(not)s 659(ha)s 4(v)k 3(e)k 1160(it)s -1352(at)s 1584(all,)s 1929(or)s 2188(else)s 2615(the)s 3(y)k -3078(use)s 3453(`)s 3574(and)s 3978(')s 4090(lik)s 2(e)k -4502(Eif)s 6(fel.)k 480 11967(On)m 847(the)s 1213(subject)s -1967(of)s 2256(Eif)s 6(fel,)k 2917(the)s 3282(Eif)s 6(fel)k -3891(reference)s 4852([1)s 5026(])s 5161(has)s 5549(some)s -6128(quite)s 6679(detailed)s 7511(style)s 8036(guidelines,)s 0 11679(and)m -436(these)s 1016(ha)s 4(v)k 3(e)k 1550(been)s -2091(closely)s 2855(follo)s 6(wed)k 3790(in)s 4066(the)s -4446(implementation)s 6036(of)s 6340(the)s 220 fnt35 6720 11676(@Eiff)m 6(el)k -240 fnt82 7502 11679(symbol.)m 8404(In)s 8693(par)s 8998(-)s -0 11391(ticular)m 9(,)k 220 fnt35 744 11388(@Eiff)m 6(el)k -240 fnt82 1531 11391(prints)m 2164(dots)s 2651(lar)s 4(ger)k -3301(than)s 3808(usual)s 4406(when)s 5019(the)s 3(y)k -5520(denote)s 6252(feature)s 7007(calls,)s 7589(as)s 7877(the)s -8263(e)s 3(xample)k 240 fnt83 0 11105(account)m 336 fnt82 -762 11095(.)m 240 fnt83 835 11105(deposit)m 240 fnt82 1530 11103(\(20\))m -1977(sho)s 6(ws.)k 240 fnt84 0 10314(1.9.)m 471(Reading)s -1378(and)s 1819(selecting)s 2750(pr)s 4(ogram)k 3706(text)s -4150(fr)s 4(om)k 4706(separate)s 5625(\207les)s 240 fnt82 -480 9837(W)m 19(e)k 852(ha)s 4(v)k 3(e)k -1356(said)s 1802(that)s 2223(program)s 3096(te)s 3(xt)k -3514(within)s 220 fnt35 4186 9834(@CP { ...)m 13( })k 240 fnt82 -5266 9837(and)m 5673(the)s 6024(other)s 6578(symbols)s 7430(is)s -7643(passed)s 8343(directly)s 0 9549(to)m 220 fnt35 272 9546(prg2lout)m -240 fnt82 1153 9549(for)m 1525(analysis.)s 2492(Ho)s 6(we)k 6(v)k 3(er)k 9(,)k -3485(there)s 4052(is)s 4295(an)s 4611(e)s 3(xception.)k -5736(The)s 6197(program)s 7100(te)s 3(xt)k 7549(may)s -8048(contain)s 8843(an)s 220 fnt35 0 9258(@Include)m 240 fnt82 -985 9261(or)m 220 fnt35 1248 9258(@SysInclude)m 240 fnt82 2599 9261(command,)m -3654(which,)s 4349(as)s 4603(for)s 4945(the)s 220 fnt35 -5296 9258(@V)m 17(erbatim)k 240 fnt82 6429 9261(symbol)m 7192(\(Section)s -8049(??\),)s 8451(causes)s 0 8973(Lout)m 512(to)s 751(tak)s 2(e)k -1203(the)s 1551(program)s 2421(te)s 3(xt)k 2836(from)s -3360(a)s 3526(\207le:)s 220 fnt35 480 8472(@Eiff)m 6(el)k -480 8184({)m 480 7896( @Include { "/usr/staff/jeff/Eiff)m 6(el/hash.e" })k 480 7608(})m 240 fnt82 -0 7114(The)m 421(included)s 1296(\207le)s 1649(is)s 1852(not)s -2211(e)s 3(xamined)k 3188(for)s 3519(balanced)s 4419(braces)s -5073(or)s 220 fnt35 5325 7111(@End)m 240 fnt82 5978 7114(or)m -220 fnt35 6230 7111(@Include)m 240 fnt82 7152 7114(;)m 7257(it)s -7441(is)s 7644(treated)s 8343(entirely)s 0 6826(v)m 3(erbatim)k -895(and)s 1288(passed)s 1973(straight)s 2738(on)s 3024(to)s -220 fnt35 3252 6823(prg2lout)m 240 fnt82 4040 6826(.)m 4193(There)s -4795(may)s 5250(be)s 5521(se)s 6(v)k 3(eral)k -220 fnt35 6232 6823(@Include)m 240 fnt82 7203 6826(commands,)m 8336(and)s -8729(an)s 3(y)k 0 6538(amount)m 778(of)s 1049(program)s -1919(te)s 3(xt)k 2334(as)s 2584(well,)s 3102(within)s -220 fnt35 3770 6535(@CP { ...)m 13( })k 240 fnt82 4847 6538(and)m -5251(the)s 5599(rest.)s 480 6164(When)m 1109(including)s 2066(\207les)s -2515(in)s 2758(this)s 3153(w)s 2(ay)k 3604(it)s -3796(often)s 4344(happens)s 5179(that)s 5597(only)s 6077(part)s -6508(of)s 6778(an)s 7061(actual)s 7686(program)s 8556(\207le)s -8916(is)s 0 5876(w)m 2(anted)k 753(for)s 1098(display)s 15(.)k -1945(Rather)s 2649(than)s 3125(placing)s 3888(the)s 4243(w)s 2(anted)k -4997(part)s 5435(in)s 5685(a)s 5857(separate)s 6702(\207le,)s -7121(which)s 7770(is)s 7987(error)s 4(-prone)k 0 5588(and)m -404(tedious)s 1147(when)s 1724(the)s 2073(program)s 2944(is)s -3154(changing,)s 4140(Unix)s 4675(users)s 5218(can)s 5608(use)s -5984(the)s 220 fnt35 6332 5585(pipe)m 240 fnt82 6799 5588(option)m -7469(to)s 7709(pipe)s 8178(the)s 8527(entire)s 0 5300(\207le)m -369(through)s 1180(an)s 1472(arbitrary)s 2355(sequence)s 3297(of)s -3577(Unix)s 4119(commands,)s 5272(which)s 5923(may)s 6397(be)s -6688(used)s 7194(to)s 7441(mak)s 2(e)k 8022(the)s -8379(w)s 2(anted)k 0 5012(selection)m 906(before)s 1572(the)s -1920(program)s 2790(te)s 3(xt)k 3205(is)s 3415(passed)s -4111(to)s 220 fnt35 4350 5009(prg2lout)m 240 fnt82 5138 5012(.)m -480 4638(F)m 3(or)k 868(e)s 3(xample,)k 1780(suppose)s -2606(that)s 3022(all)s 3313(your)s 3810(Eif)s 6(fel)k -4399(routines)s 5218(be)s 3(gin)k 5802(with)s 6282(the)s -6628(routine)s 7359(name)s 7931(one)s 8331(tab)s 8674(stop)s -0 4350(from)m 524(the)s 872(left)s 1249(mar)s 4(gin)k -1979(and)s 2383(end)s 2787(at)s 3019(the)s 3367(\207rst)s -3798(follo)s 6(wing)k 240 fnt84 4775 4349(end)m 240 fnt82 -5202 4350(indented)m 6084(tw)s 2(o)k 6494(tab)s 6839(stops.)s -7495(Then)s 220 fnt35 480 3849(@Eiff)m 6(el)k 480 3561( pipe { "sed -n /^.inser)m -8(t/,/^..end/p" })k -480 3273({)m 480 2985( @Include { "/usr/staff/jeff/Eiff)m 6(el/hash.e" })k 480 2697(})m 240 fnt82 -0 2203(will)m 417(select)s 1010(just)s 1406(the)s 240 fnt83 -1744 2205(insert)m 240 fnt82 2342 2203(routine)m 3066(from)s 3580(the)s -220 fnt35 3918 2200(hash.e)m 240 fnt82 4620 2203(\207le.)m 5079(Assuming)s -6094(that)s 6502(your)s 6991(program)s 7852(te)s 3(xt)k -8257(has)s 8617(been)s 0 1915(laid)m 413(out)s 775(in)s -1014(a)s 1176(disciplined)s 2279(manner)s 9(,)k 3090(e)s 6(v)k 3(ery)k -3663(line)s 4073(of)s 4340(the)s 4684(selection)s 5586(will)s -6008(be)s 3(gin)k 6591(with)s 7069(a)s 7231(tab)s -7572(character)s 8502(that)s 8916(is)s 0 1627(not)m 366(w)s 2(anted)k -1113(in)s 1356(this)s 1752(display)s 15(,)k 2535(so)s -2801(an)s 3084(e)s 6(v)k 3(en)k 3584(better)s -4187(pipe)s 4655(is)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 12 14 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(12)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -220 fnt35 480 13207(@Eiff)m 6(el)k 480 12919( pipe { "sed -n /^.inser)m -8(t/,/^..end/p | cut -c2-" })k -480 12631({)m 480 12343( @Include { "/usr/staff/jeff/Eiff)m 6(el/hash.e" })k 480 12055(})m 240 fnt82 -0 11561(since)m 584(it)s 813(cuts)s 1286(a)s 3(w)k 2(ay)k -1878(the)s 2263(unw)s 2(anted)k 3287(tab)s 3670(characters.)s -4838(Unfortunately)s 15(,)k 6308(we)s 6680(can')s 4(t)k -7251(sho)s 6(w)k 7842(the)s 8227(result)s 8855(of)s -0 11273(this)m 430(on)s 761(an)s 1078(actual)s 1737(e)s 3(xample,)k -2685(since)s 3266(that)s 3718(w)s 2(ould)k 4407(pre)s 6(v)k 3(ent)k -5209(this)s 5639(manual)s 6432(from)s 6990(being)s 7609(formatted)s -8629(on)s 8960(a)s 0 10985(non-Unix)m 973(system.)s 240 fnt84 -0 10193(1.10.)m 591(Err)s 4(or)k 1243(messages)s 240 fnt82 -480 9716(In)m 739(order)s 1307(to)s 1550(understand)s 2662(the)s -3013(error)s 3540(messages)s 4498(produced)s 5451(by)s 5749(program)s -6622(printing,)s 7490(it)s 7686(is)s 7900(necessary)s 8887(to)s -0 9428(understand)m 1113(that)s 1536(Lout')s 13(s)k 2203(\207rst)s -2639(step)s 3082(when)s 3663(gi)s 6(v)k 3(en)k -4248(a)s 4419(program)s 5294(te)s 3(xt)k 5714(is)s -5929(to)s 6173(pass)s 6641(it)s 6838(to)s 7082(the)s -7435(separate)s 220 fnt35 8278 9425(prg2lout)m 240 fnt82 0 9140(program)m -917(for)s 1303(analysis.)s 2285(This)s 2809(separate)s 3695(program)s -4613(is)s 4871(the)s 5266(source)s 5994(of)s 6313(most)s -6886(of)s 7205(the)s 7601(error)s 8172(messages)s 0 8852(associated)m -1040(with)s 1522(program)s 2392(printing.)s 480 8478(The)m 220 fnt35 -907 8475(prg2lout)m 240 fnt82 1753 8478(program)m 2622(is)s 2830(quite)s -3362(happ)s 2(y)k 3999(to)s 4236(format)s 4931(a)s -5095(fragment)s 6015(of)s 6285(a)s 6449(computer)s 7411(program:)s -8385(there)s 8916(is)s 0 8190(no)m 278(need)s 773(to)s -997(supply)s 1675(a)s 1826(complete)s 2743(routine,)s 3512(or)s -3756(a)s 3907(complete)s 4824(statement,)s 5831(or)s 6075(an)s 3(y)k -6457(such)s 6938(thing.)s 7579(Ho)s 6(we)k 6(v)k 3(er)k 9(,)k -8524(it)s 8700(will)s 0 7902(complain)m 944(if)s 1157(you)s -1568(supply)s 2258(only)s 2734(a)s 2896(fragment)s 3815(of)s -4082(one)s 4480(le)s 3(xical)k 5164(unit,)s 5640(such)s -6132(as)s 6378(a)s 6541(comment)s 7487(or)s 7742(string)s -8335(without)s 0 7614(its)m 276(terminating)s 1431(delimiter)s 13(.)k -2444(It)s 2650(will)s 3077(also)s 3515(complain)s 4463(if)s -4681(there)s 5215(is)s 5426(a)s 5592(character)s 6527(that)s -6946(cannot)s 7645(be)s 7928(classi\207ed)s 8876(as)s 0 7326(part)m -432(of)s 705(an)s 990(identi\207er)s 9(,)k 1952(number)s 9(,)k -2782(etc.)s 3166(according)s 4164(to)s 4405(the)s 4754(rules)s -5271(of)s 5544(the)s 5894(language)s 6815(as)s 7067(the)s 3(y)k -7532(ha)s 4(v)k 3(e)k 8035(been)s 8546(gi)s 6(v)k 3(en)k -0 7038(to)m 220 fnt35 259 7035(prg2lout)m 240 fnt82 1127 7038(by)m -1442(the)s 1810(implementer)s 13(.)k 3189(Irrespecti)s 6(v)k 3(e)k -4382(of)s 4673(the)s 5042(language)s 5982(rules,)s 220 fnt35 -6574 7035(prg2lout)m 240 fnt82 7442 7038(al)m 2(w)k 2(ays)k -8174(interprets)s 0 6750(spaces,)m 731(tabs,)s 1223(ne)s 6(wlines,)k -2174(and)s 2578(formfeed)s 3511(characters)s 4529(in)s 4772(the)s -5120(usual)s 5680(w)s 2(ay)k 15(.)k 480 6376(If)m -738(an)s 1050(error)s 1601(message)s 2496(is)s 2735(generated)s -3750(by)s 220 fnt35 4073 6373(prg2lout)m 240 fnt82 4861 6376(,)m -4996(it)s 5217(will)s 5672(contain)s 6461(a)s 6656(line)s -7098(and)s 7531(column)s 8335(number)s 0 6088(counting)m 891(from)s -1415(the)s 1763(start)s 2233(of)s 2504(the)s 2852(program)s -3722(te)s 3(xt)k 4137(in)s 9(v)k 4(olv)k 3(ed.)k -5123(Lout)s 5635(will)s 6061(precede)s 6860(this)s 7256(error)s -7779(message)s 8644(with)s 0 5800(a)m 175(\207le)s 545(name,)s -1179(line)s 1602(number)s 9(,)k 2441(and)s 2854(column)s -3638(number)s 4438(pointing)s 5298(to)s 5547(the)s 5904(Lout)s -6425(symbol)s 7194(\()s 220 fnt35 7267 5797(@CP)m 240 fnt82 -7785 5800(,)m 220 fnt35 7901 5797(@Eiff)m 6(el)k 240 fnt82 -8660 5800(etc.\))m 0 5512(whose)m 668(program)s 1538(te)s 3(xt)k -1953(caused)s 2662(the)s 3010(error)s 3533(message,)s 4450(lik)s 2(e)k -4862(this:)s 220 fnt35 480 5012(lout \207le "prg_tabs" \(from "prg" line 96, from "all" line 46\):)m 480 4724( 56,23:)m 11( prg2lout 2,1:)k 11( prog)k 2(r)k 2(am te)k 6(xt ended within comment)k -240 fnt82 0 4225(This)m 476(is)s 686(an)s 970(actual)s -1595(message)s 2462(produced)s 3411(when)s 3988(formatting)s 5049(this)s -5445(chapter)s 13(.)k 6300(The)s 6728(program)s 7599(te)s 3(xt)k -8014(in)s 8258(question)s 0 3937(has)m 369(only)s 848(one)s -1249(line,)s 1713(containing)s 2775(an)s 3057(incomplete)s 4174(comment,)s -5169(so)s 5434(when)s 220 fnt35 6009 3934(prg2lout)m 240 fnt82 -6856 3937(tried)m 7350(to)s 7588(start)s 8057(the)s 8403(second)s -0 3649(line)m 408(and)s 805(found)s 1416(nothing,)s 2248(it)s -2434(complained)s 3601(as)s 3845(sho)s 6(wn.)k 4622(In)s -4872(general,)s 5675(then,)s 6188(you)s 6596(ha)s 4(v)k 3(e)k -7091(to)s 7323(add)s 220 fnt35 7721 3646(prg2lout)m 240 fnt82 -8509 3649(')m 13(s)k 8712(line)s 0 3361(number)m 791(to)s -1030(Lout')s 13(s)k 1692(line)s 2106(number)s 9(,)k -2935(and)s 3339(use)s 3714(some)s 4275(initiati)s 6(v)k 3(e,)k -5221(to)s 5460(\207nd)s 5891(the)s 6239(precise)s 6971(point)s -7523(of)s 7794(the)s 8142(problem.)s 240 fnt84 0 2569(1.11.)m -591(Notes)s 1216(on)s 1525(P)s 4(erl)k 2000(and)s -2441(P)s 4(od)k 240 fnt82 480 2137(The)m 923(Perl)s -1378(programming)s 2749(language)s 153 fnt82 3609 2226(1)m 240 fnt82 -3744 2137(is)m 3970(quite)s 4520(a)s 4702(dif\207cult)s 5533(one)s -5951(for)s 6305(the)s 220 fnt35 6668 2134(prg2lout)m 240 fnt82 -7532 2137(program)m 8418(to)s 8673(deal)s 0 1849(with,)m 526(and)s -924(our)s 1297(boast)s 1855(that)s 2267(programs)s 3215(can)s -3598(be)s 3873(included)s 4749(with)s 5225(`absolutely)s 6335(no)s -6621(modi\207cations')s 8029(is)s 8233(not)s 8592(quite)s 0 1561(true)m -427(for)s 765(Perl.)s 480 1187(Here)m 992(is)s 1194(the)s -1534(complete)s 2458(list)s 2801(of)s 3064(problem)s 3913(areas.)s -4559(In)s 4807(most)s 5324(cases)s 5871(their)s 6360(ef)s 6(fect)k -6948(is)s 7150(to)s 7381(get)s 7725(the)s 8065(formatting)s -0 899(wrong)m 675(o)s 3(v)k 3(er)k 1164(a)s -1341(short)s 1889(re)s 3(gion,)k 2615(which)s 3267(is)s -3488(not)s 3864(perhaps)s 4670(so)s 4946(disastrous;)s 6025(and)s -6439(it)s 6642(should)s 7349(be)s 7642(easy)s 8131(to)s -8381(modify)s 1134 0 0 0 240 288 60 0 307 LoutGr2 -0 0 moveto xsize 0 lineto stroke -grestore - -grestore -122 fnt82 0 112(1)m 192 fnt82 58 42(My)m -368(thanks)s 909(to)s 1101(Mark)s 1563(Summer\207eld)s 2598(for)s -2868(help)s 3241(with)s 3627(Perl)s 3978(and)s 4302(Pod.)s - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 13 15 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Courier -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Courier -/Courierfnt29 vec2 /Courier LoutRecode -/fnt29 { /Courierfnt29 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -240 fnt83 0 13843(1.11.)m 574(Notes)s 1174(on)s 1468(P)s 19(erl)k -1920(and)s 2346(P)s 19(od)k 240 fnt84 8833 13840(13)m -240 fnt82 0 13249(your)m 507(Perl)s 955(program)s 1834(without)s -2634(changing)s 3574(its)s 3859(meaning,)s 4799(to)s 5046(w)s 2(ork)k -5606(around)s 6338(these)s 6894(problems.)s 7957(After)s 8529(all,)s -8883(in)s 0 12961(Perl)m 439(there)s 972(is)s 1182(al)s 2(w)k 2(ays)k -1893(more)s 2440(than)s 2909(one)s 3311(w)s 2(ay)k -3762(to)s 4001(do)s 4294(it.)s 0 12456(1.)m 240 fnt83 -480 12458(Her)m 8(e-documents)k 240 fnt82 2108 12456(such)m 2604(as)s -960 12004(<<"EOF")m 960 11716(These lines will be read as though)m 960 11428(enclosed in double quotes)m 960 11140(EOF)m 480 10686(will)m -893(be)s 1162(handled)s 1964(correctly)s 2853(only)s 3320(if)s -3523(the)s 3858(string)s 4442(appearing)s 5424(immediately)s 6659(after)s -7142(the)s 220 fnt29 7476 10694(<<)m 240 fnt82 7787 10686(operator)m -8629(\(that)s 480 10398(is,)m 748(the)s 1098(string)s 1697(used)s -2197(to)s 2438(terminate)s 3397(the)s 3747(here-document\))s 5312(is)s -5524(one)s 5928(of)s 220 fnt29 6201 10406(EOF)m 240 fnt82 -6597 10398(,)m 220 fnt29 6707 10406(EOT)m 240 fnt82 7103 10398(,)m -220 fnt29 7212 10406(END)m 240 fnt82 7608 10398(,)m 7717(and)s -8123(the)s 8474(empty)s 480 10110(string,)m 1116(all)s 1393(optionally)s -2401(enclosed)s 3281(in)s 3508(quotes)s 4168(of)s 4424(an)s 3(y)k -4805(of)s 5060(the)s 5392(three)s 5910(kinds.)s 6577(If)s -6791(this)s 7172(condition)s 8117(is)s 8311(not)s 8661(met,)s -480 9822(then)m 942(the)s 1283(here-document)s 2770(will)s 3189(be)s -3464(treated)s 4163(as)s 4406(Perl)s 4838(program)s 5701(te)s 3(xt.)k -6213(If)s 6435(the)s 6776(condition)s 7730(is)s 7933(met,)s -8391(there)s 8916(is)s 480 9534(still)m 885(another)s 1655(problem:)s -2610(the)s 220 fnt29 2951 9542(<<)m 240 fnt82 3268 9534(symbol)m -4020(and)s 4417(e)s 6(v)k 3(erything)k 5476(after)s -5965(it)s 6150(on)s 6439(the)s 6780(same)s 7320(line)s -7726(will)s 8145(be)s 8419(treated)s 480 9246(\(incorrectly\))m 1715(as)s -1958(a)s 2117(string.)s 2819(The)s 3240(w)s 2(orst)k -3822(consequence)s 5095(of)s 5359(this)s 5748(is)s 5952(that)s -6363(stack)s 2(ed)k 7129(here-documents)s 8700(will)s 480 8958(not)m -846(be)s 1128(printed)s 1863(properly)s 15(.)k 0 8455(2.)m -480(When)s 220 fnt35 1118 8452(prg2lout)m 240 fnt82 1976 8455(is)m -2196(scanning)s 3110(the)s 3468(program)s 4347(te)s 3(xt)k -4772(looking)s 5567(for)s 5915(the)s 6273(be)s 3(ginning)k -7290(of)s 7571(a)s 7747(le)s 3(xical)k 8445(unit,)s -8934(it)s 480 8167(may)m 939(come)s 1505(upon)s 2034(a)s -220 fnt35 2192 8164(/)m 240 fnt82 2309 8167(character)m 9(,)k -3273(and)s 3669(this)s 240 fnt83 4057 8169(initial)m 220 fnt35 -4680 8164(/)m 240 fnt82 4796 8167(\(not)m 5233(subsequent)s 6349(ones)s -6832(in)s 7067(the)s 7407(same)s 7946(le)s 3(xical)k -8626(unit\))s 480 7879(it)m 691(\207nds)s 1227(dif\207cult)s 2062(to)s -2320(interpret,)s 3254(since)s 3820(it)s 4031(may)s 4517(be)s -4818(the)s 5185(be)s 3(ginning)k 6212(of)s 6502(a)s -6687(re)s 3(gular)k 7439(e)s 3(xpression,)k 8585(to)s -8844(be)s 480 7591(formatted)m 1460(lik)s 2(e)k 1865(a)s -2024(string,)s 2668(or)s 2920(it)s 3105(may)s 3564(be)s -3839(a)s 3998(complete)s 4923(le)s 3(xical)k 5604(unit)s -6029(denoting)s 6913(di)s 6(vision.)k 7835(The)s 8256(program)s -480 7303(chooses)m 1308(the)s 1675(re)s 3(gular)k 2427(e)s 3(xpression)k -3524(\(or)s 3881(equi)s 6(v)k 6(alently)k 15(,)k -5162(string\))s 5853(interpretation)s 7216(if)s 7452(the)s 220 fnt35 -7819 7300(/)m 240 fnt82 7962 7303(character)m 8916(is)s 480 7015(immediately)m -1714(preceded)s 2620(by)s 220 fnt35 2900 7012(q)m 240 fnt82 -3009 7015(,)m 220 fnt35 3101 7012(qq)m 240 fnt82 3332 7015(,)m -220 fnt35 3424 7012(qx)m 240 fnt82 3654 7015(,)m 220 fnt35 -3747 7012(qw)m 240 fnt82 4025 7015(,)m 220 fnt35 4117 7012(qr)m -240 fnt82 4312 7015(,)m 220 fnt35 4405 7012(m)m 240 fnt82 -4574 7015(,)m 220 fnt35 4666 7012(s)m 240 fnt82 4769 7015(,)m -220 fnt35 4861 7012(y)m 240 fnt82 4969 7015(,)m 5062(or)s -220 fnt35 5306 7012(tr)m 240 fnt82 5440 7015(.)m 5590(It)s -5780(also)s 6203(chooses)s 6998(the)s 7331(re)s 3(gular)k -8049(e)s 3(xpression)k 480 6727(interpretation)m 1818(if)s 2029(the)s -220 fnt35 2371 6724(/)m 240 fnt82 2489 6727(character)m 3417(appears)s -4192(at)s 4418(the)s 4760(start)s 5225(of)s 5490(a)s -5650(line,)s 6109(or)s 6362(if)s 6573(it)s 6759(is)s -6963(immediately)s 8205(preceded)s 480 6439(by)m 787(zero,)s 1319(one,)s -1786(or)s 2059(tw)s 2(o)k 2482(space)s 3083(or)s -3356(tab)s 3715(characters,)s 4802(which)s 5458(are)s 5819(themselv)s 3(es)k -6943(immediately)s 8205(preceded)s 480 6151(by)m 784(a)s 961(complete)s -1903(le)s 3(xical)k 2602(unit)s 3044(which)s 3697(is)s -3918(one)s 4330(of)s 220 fnt35 4612 6148(\()m 240 fnt82 -4678 6151(,)m 220 fnt35 4795 6148(=)m 240 fnt82 4915 6151(,)m -220 fnt35 5033 6148(=~)m 240 fnt82 5276 6151(,)m 220 fnt35 -5393 6148(!~)m 240 fnt82 5569 6151(,)m 220 fnt35 5687 6148(split)m -240 fnt82 6072 6151(,)m 220 fnt35 6190 6148(if)m 240 fnt82 -6296 6151(,)m 220 fnt35 6413 6148(and)m 240 fnt82 6767 6151(,)m -220 fnt35 6885 6148(&&)m 240 fnt82 7173 6151(,)m 220 fnt35 -7290 6148(or)m 240 fnt82 7485 6151(,)m 220 fnt35 7603 6148(||)m -240 fnt82 7697 6151(,)m 220 fnt35 7814 6148(not)m 240 fnt82 -8115 6151(,)m 220 fnt35 8233 6148(!)m 240 fnt82 8274 6151(,)m -220 fnt35 8392 6148(unless)m 240 fnt82 9019 6151(,)m 220 fnt35 -480 5860(f)m 6(or)k 240 fnt82 730 5863(,)m 220 fnt35 -849 5860(f)m 6(oreach)k 240 fnt82 1561 5863(,)m 1681(and)s -220 fnt35 2098 5860(while)m 240 fnt82 2588 5863(.)m 2765(Otherwise)s -3816(it)s 4021(chooses)s 4843(the)s 5204(di)s 6(vision)k -6039(interpretation.)s 7502(In)s 7771(the)s 8132(rare)s 8571(cases)s -480 5575(where)m 1120(this)s 1517(rule)s 1945(f)s 2(ails,)k -2460(you)s 2876(can)s 3266(force)s 220 fnt35 3812 5572(prg2lout)m -240 fnt82 4661 5575(to)m 4901(choose)s 5622(the)s 5971(re)s 3(gular)k -6705(e)s 3(xpression)k 7783(interpretation)s 480 5287(by)m 777(placing)s -1537(an)s 220 fnt35 1823 5284(m)m 240 fnt82 2055 5287(in)m -2301(front)s 2829(of)s 3103(the)s 3454(initial)s 220 fnt35 -4068 5284(/)m 240 fnt82 4195 5287(\(this)m 4673(does)s 5167(not)s -5536(change)s 6273(the)s 6624(meaning)s 7504(of)s 7778(the)s -8130(program\),)s 480 4999(and)m 910(you)s 1352(can)s 1768(force)s -2341(the)s 2716(di)s 6(vision)k 3565(interpretation)s 4935(by)s -5256(placing)s 6040(at)s 6299(least)s 6823(three)s 7383(spaces)s -8085(before)s 8778(the)s 220 fnt35 480 4708(/)m 240 fnt82 -604 4711(character)m 13(.)k 0 4253(3.)m 480(Substitution)s 1701(e)s 3(xpressions,)k -2930(e)s 6(v)k 3(en)k 3439(such)s 3943(le)s 3(xically)k -4825(comple)s 3(x)k 5710(ones)s 6208(as)s 220 fnt29 -6467 4261(s{{@D}}[{@I}])m 240 fnt82 8183 4253(,)m 8299(are)s 8655(han)s -8998(-)s 480 3965(dled)m 942(correctly)s 15(.)k 1931(Ho)s 6(we)k 6(v)k 3(er)k 9(,)k -220 fnt35 2883 3962(prg2lout)m 240 fnt82 3723 3965(does)m 4205(not)s -4563(understand)s 5663(that)s 6073(the)s 6413(letters)s 220 fnt35 -7038 3962(gimosx)m 240 fnt82 7783 3965(in)m 8018(an)s 3(y)k -8406(combi)s 8998(-)s 480 3677(nation)m 1135(appearing)s 2131(immediately)s -3378(after)s 3874(a)s 4040(substitution)s 5212(e)s 3(xpression)k -6289(are)s 6636(part)s 7066(of)s 7337(it;)s 7581(it)s -7772(treats)s 8339(them)s 8876(as)s 480 3389(the)m 825(start)s -1291(of)s 1558(a)s 1721(ne)s 6(w)k 2164(le)s 3(xical)k -2848(unit.)s 3380(This)s 3853(ne)s 6(w)k 4296(unit)s -4724(will)s 5147(usually)s 5888(be)s 6166(tak)s 2(en)k -6735(to)s 6971(be)s 7249(an)s 7528(identi\207er)s 9(,)k -8484(which)s 480 3101(is)m 690(harmless)s 1590(enough,)s 2403(b)s 4(ut)k -2765(occasionally)s 4014(it)s 4206(is)s 4416(tak)s 2(en)k -4989(to)s 5228(be)s 5510(something)s 6560(else.)s 7095(F)s 3(or)k -7484(e)s 3(xample,)k 8398(in)s 220 fnt35 960 2600(s///s;)m -240 fnt82 480 2117(the)m 838(trailing)s 220 fnt35 1591 2114(s)m -240 fnt82 1765 2117(will)m 2201(be)s 2494(mistak)s 2(en)k -3423(for)s 3771(the)s 4130(start)s 4611(of)s 4892(a)s -5069(ne)s 6(w)k 5527(substitution)s 6710(e)s 3(xpression,)k -7848(with)s 220 fnt35 8341 2114(;)m 240 fnt82 8454 2117(delim)m -8998(-)s 480 1829(iting)m 976(the)s 1329(\207rst)s 1766(pattern.)s -2598(This)s 3080(particular)s 4059(e)s 3(xample)k 4927(can)s -5322(be)s 5609(\207x)s 3(ed)k 6149(by)s 6448(inserting)s -7342(a)s 7514(space)s 8106(before)s 8778(the)s 480 1541(semicolon.)m -0 1088(Further)m 763(w)s 2(ork)k 1314(may)s 1780(eliminate)s -2724(some)s 3285(of)s 3556(these)s 4103(problems.)s 480 714(The)m -953(Pod)s 1429(language)s 2394(is)s 2650(used)s 3192(by)s -3531(Perl)s 4015(programmers)s 5386(for)s 5769(creating)s 6636(documentation,)s -8210(and)s 8660(may)s 0 426(be)m 313(found)s 961(within)s -1660(Perl)s 2131(programs)s 3116(or)s 3406(standing)s 4301(alone.)s -5015(Lout)s 5558(supports)s 6451(both)s 6965(arrangements)s 8335(without)s -0 138(an)m 3(y)k 418(special)s 1157(action)s 1819(by)s -2134(the)s 2503(user)s 13(.)k 3073(At)s 3393(the)s -3762(be)s 3(ginning)k 4792(of)s 5084(the)s 220 fnt35 -5453 135(per)m -3(l)k 240 fnt82 5888 138(setup)m 6467(line,)s -6953(the)s 7322(follo)s 6(wing)k 8320(line)s 8756(has)s - -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 14 16 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -240 fnt84 0 13840(14)m 240 fnt83 5981 13843(Chapter)m 6831(1.)s -7105(Computer)s 8128(Pr)s 10(o)k 2(gr)k 3(ams)k -240 fnt82 0 13205(been)m 509(placed:)s 220 fnt35 480 12704(@SysInclude { pod })m -240 fnt82 0 12206(Thus,)m 576(asking)s 1244(for)s 1571(Perl)s -2000(al)s 2(w)k 2(ays)k 2700(gi)s 6(v)k 3(es)k -3237(you)s 3641(Pod)s 4062(as)s 4301(well.)s 4866(If)s -5085(you)s 5490(are)s 5826(using)s 6388(your)s 6876(o)s 6(wn)k -7330(setup)s 7877(\207les)s 8316(for)s 8643(both)s 0 11918(languages,)m -1068(it)s 1265(is)s 1480(probably)s 2390(better)s 2998(to)s -3242(break)s 3839(this)s 4240(connection)s 5352(by)s 5651(deleting)s -6479(this)s 6880(line)s 7299(from)s 7828(your)s 8332(cop)s 2(y)k -8855(of)s 0 11630(the)m 220 fnt35 348 11627(per)m -3(l)k -240 fnt82 762 11630(setup)m 1320(\207le)s 1681(and)s 2085(placing)s -220 fnt35 480 11129(@Include { m)m 3(ypod })k 480 10841(@Include { m)m 3(yper)k -3(l })k -240 fnt82 0 10343(at)m 232(the)s 580(start)s 1050(of)s -1321(your)s 1820(document)s 2824(in)s 3067(the)s 3415(usual)s -3975(w)s 2(ay)k 15(.)k 480 9969(Because)m 1341(Pod)s -1781(is)s 2000(a)s 2174(documentation)s 3662(language)s 4591(rather)s -5215(than)s 5693(a)s 5868(programming)s 7231(language,)s 8211(the)s -8568(setup)s 0 9681(\207le)m 363(options)s 1121(listed)s 1699(in)s -1944(Section)s 2720(1.4)s 3077(do)s 3372(not)s 3740(really)s -4340(apply)s 15(.)k 5023(So)s 5331(for)s 5672(Pod)s -6105(only)s 6587(these)s 7137(ha)s 4(v)k 3(e)k -7640(been)s 8152(discarded)s 0 9393(and)m 435(replaced)s 1333(by)s -1658(a)s 1855(completely)s 3002(dif)s 6(ferent)k 3908(set)s -4264(of)s 4566(options,)s 5409(controlling)s 6542(such)s 7069(things)s -7736(as)s 8017(the)s 8396(size)s 8855(of)s 0 9105(headings)m -902(and)s 1306(the)s 1654(g)s 1(aps)k 2143(between)s -2997(list)s 3348(items,)s 3972(which)s 4614(you)s 5029(can)s -5418(\207nd)s 5849(documented)s 7077(in)s 7320(the)s 220 fnt35 -7668 9102(pod)m 240 fnt82 8082 9105(setup)m 8640(\207le.)s 480 8731(If)m -710(you)s 1126(ask)s 1506(for)s 1845(line)s 2259(numbers)s -3135(on)s 3432(a)s 3599(Pod)s 4030(program,)s 4948(or)s -5207(on)s 5505(a)s 5671(Perl)s 6111(program)s 6981(that)s -7400(contains)s 8248(Pod,)s 8729(an)s 3(y)k 0 8443(te)m 3(xt)k -432(blocks)s 1126(in)s 1387(the)s 1753(Pod)s 2202(that)s -2638(w)s 2(ould)k 3311(otherwise)s 4313(ha)s 4(v)k 3(e)k -4832(appeared)s 5771(as)s 6039(\207lled)s 6606(paragraphs)s 7724(will)s -8168(come)s 8760(out)s 0 8155(with)m 484(the)s 834(line)s -1250(breaks)s 1927(in)s 2172(the)s 2522(source)s 3204(respected,)s -4215(and)s 4621(lines)s 5125(numbered)s 6142(accordingly)s 15(.)k -7422(Because)s 220 fnt35 8278 8152(prg2lout)m 240 fnt82 0 7867(attaches)m -814(line)s 1222(numbers)s 2090(before)s 2750(Lout)s 3255(breaks)s -3924(paragraphs,)s 5074(it)s 5259(is)s 5463(not)s 5822(possible)s -6656(to)s 6889(numnber)s 7793(the)s 8135(lines)s 8630(after)s -0 7579(paragraph)m 1013(breaking.)s 480 7205(Owing)m 1185(to)s 1423(problems)s -2363(behind)s 3072(the)s 3419(scenes,)s 4150(if)s 4366(a)s -4531(Pod)s 4961(inclusion)s 5894(in)s 6137(a)s 6302(Perl)s -6740(program)s 7609(has)s 7978(unbalanced)s 0 6917(braces,)m 220 fnt35 -714 6914(prg2lout)m 240 fnt82 1559 6917(is)m 1766(forced)s 2431(to)s -2667(insert)s 3254(braces)s 3912(into)s 4334(the)s 4678(Pod)s -5106(te)s 3(xt)k 5518(to)s 5754(mak)s 2(e)k -6323(them)s 6858(balance.)s 7749(It)s 7951(will)s 8374(insert)s -8960(a)s 0 6629(left)m 377(brace)s 950(directly)s 1734(before)s -2400(an)s 3(y)k 2798(unbalanced)s 3946(right)s 4458(brace,)s -5082(and)s 5487(it)s 5679(will)s 6106(insert)s 6696(right)s -7208(braces)s 7869(at)s 8102(the)s 8450(end)s 8855(of)s -0 6341(the)m 347(Pod)s 777(inclusion)s 1710(to)s 1948(balance)s -2733(an)s 3(y)k 3129(preceding)s 4124(unbalanced)s 5271(left)s -5646(braces.)s 6419(It)s 6623(will)s 7048(tell)s 7406(you)s -7820(if)s 8036(it)s 8227(has)s 8596(to)s 8833(do)s -0 6053(this.)m 509(This)s 985(problem)s 1842(does)s 2332(not)s -2698(af\210ict)s 3314(Pod)s 3745(when)s 4321(used)s 4818(as)s -5068(a)s 5234(separate)s 6072(language.)s -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 15 17 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Times-Italic -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -%%IncludeResource: font Times-Italic -/Times-Italicfnt83 vec2 /Times-Italic LoutRecode -/fnt83 { /Times-Italicfnt83 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -1 LoutMargSet -grestore -480 fnt84 0 12955(Refer)m 8(ences)k 240 fnt82 0 12358([1])m -480(Bertrand)s 1374(Me)s 3(yer)k 13(.)k 240 fnt83 -2146 12360(Eif)m 4(fel:)k 2840(The)s 3252(Langua)s 2(g)k 2(e)k -240 fnt82 4200 12358(.)m 4364(Prentice-Hall)s 5631(,)s 5738(1992)s -6212(.)s 192 fnt84 4439 1(15)m -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Page: 16 18 -%%BeginPageSetup -%%PageResources: font Times-Roman -%%+ font Times-Bold -%%+ font Helvetica -/pgsave save def -%%IncludeResource: font Times-Bold -/Times-Boldfnt84 vec2 /Times-Bold LoutRecode -/fnt84 { /Times-Boldfnt84 LoutFont } def -0.0500 dup scale 10 setlinewidth -%%EndPageSetup -gsave -0 0 translate -240 fnt82 0.0 0.0 0.0 setrgbcolor 11900 16840 0 16840 240 288 60 LoutGraphic -gsave -LoutPageSet -grestore -gsave -0 16840 translate -0.0000 rotate -9066 14006 0 14006 240 288 60 1417 -15423 LoutGr2 -0 LoutMargSet -grestore -480 fnt84 0 12962(Index)m 240 fnt82 0 12367(Blue)m 508(program)s -1378(printing)s 2135(,)s 2242(1)s 0 12079(C)m 212(and)s -616(C++)s 1099(program)s 1969(printing)s 2726(,)s 2833(1)s -220 fnt35 0 11788(@CPSetup)m 240 fnt82 1099 11791(,)m 1206(6)s -0 11503(Eif)m 6(fel)k 591(program)s 1461(printing)s 2218(,)s -2325(1)s 0 11215(Perl)m 439(program)s 1309(printing)s 2066(,)s -2173(1)s 0 10927(Pod)m 431(\(for)s 848(Perl\))s 1360(printing)s -2117(,)s 2224(1)s 220 fnt35 0 10636(prg2lout)m 240 fnt82 -848 10639(\207lter)m 1358(program)s 2175(,)s 2282(1)s 0 10351(tab)m -345(characters)s 1363(in)s 1606(programs)s 2507(,)s 2614(8)s -192 fnt84 4439 2(16)m -grestore - -grestore - -grestore - -pgsave restore -showpage - -%%Trailer -%%DocumentNeededResources: font Courier -%%+ font Helvetica -%%+ font Symbol -%%+ font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%+ font Times-Italic -%%DocumentSuppliedResources: procset LoutStartUp -%%+ procset LoutTabPrependGraphic -%%+ procset LoutTblPrependGraphic -%%+ procset LoutFigPrependGraphic -%%+ procset LoutGraphPrependGraphic -%%+ procset LoutFigPrependGraphic -%%+ procset LoutBasicSetup -%%+ encoding vec2 -%%Pages: 18 -%%EOF |