%!PS-Adobe-3.0 %%Creator: Basser Lout Version 3.08 (May 1996) %%CreationDate: Fri Jan 8 15:03:21 1999 %%DocumentData: Binary %%DocumentNeededResources: (atend) %%DocumentSuppliedResources: (atend) %%Pages: (atend) %%BoundingBox: 0 0 595 842 %%EndComments %%BeginProlog %%BeginResource: procset LoutStartUp /m { 3 1 roll moveto show } bind def /s { exch currentpoint exch pop moveto show } bind def /k { exch neg 0 rmoveto show } 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 /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 /.notdef /.notdef /.notdef /.notdef /.notdef /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 /usr/local/lib/lout/include/tab.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 LoutFigPrependGraphic % @PrependGraphic file /usr/local/lib/lout/include/fig.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. % % % % is two numbers, a point. % % is one number, a length % % is one number, an angle in degrees % % 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: lfigconcat % 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 % 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 /lfigpi 3.14159 def % arc directions /clockwise false def /anticlockwise true def % maximum of two numbers: lfigmax /lfigmax { 2 copy gt { pop } { exch pop } ifelse } def % minimum of two numbers: lfigmin /lfigmin { 2 copy lt { pop } { exch pop } ifelse } def % add two points: lfigpadd /lfigpadd { exch 3 1 roll add 3 1 roll add exch } def % subtract first point from second: lfigpsub /lfigpsub { 3 2 roll sub 3 1 roll exch sub exch } def % max two points: lfigpmax /lfigpmax { exch 3 1 roll lfigmax 3 1 roll lfigmax exch } def % min two points: lfigpmin /lfigpmin { exch 3 1 roll lfigmin 3 1 roll lfigmin exch } def % scalar multiplication: lfigpmul /lfigpmul { dup 3 1 roll mul 3 1 roll mul exch } def % point at angle and distance: lfigatangle /lfigatangle { 2 copy cos mul 3 1 roll sin mul lfigpadd } def % angle from one point to another: lfigangle /lfigangle { lfigpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def % distance between two points: lfigdistance /lfigdistance { lfigpsub dup mul exch dup mul add sqrt } def % difference in x coords: lfigxdistance /lfigxdistance { pop 3 1 roll pop sub } def %difference in y coords: lfigydistance /lfigydistance { 3 1 roll pop sub exch pop } def % stroke a solid line: lfigsolid - /lfigsolid { pop pop [] 0 setdash stroke } def % stroke a lfigdashed line: 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: 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: 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: 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: % figpolygon ... /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: lfiggetnext true % or false /lfiggetnext { 2 copy exch length ge { false } { 2 copy get exch 1 add exch true } ifelse } def % check whether thing is number: lfigisnumbertype /lfigisnumbertype { dup type dup /integertype eq exch /realtype eq or } def % check whether thing is an array: lfigisarraytype /lfigisarraytype { dup type /arraytype eq } def % get next item: lfiggetnextitem 0 % or 1 % or 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 % 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 . /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 /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 [ ] [ ] /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 [ ] 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: /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 % 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: lfigfixangle /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: 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: 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 LoutMarginNotes % @PrependGraphic file /usr/local/lib/lout/include/dl.lpg % 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 Palatino-Roman /Palatino-Romanfnt67 vec2 /Palatino-Roman LoutRecode /fnt67 { /Palatino-Romanfnt67 LoutFont } def %%IncludeResource: font Palatino-Italic /Palatino-Italicfnt68 vec2 /Palatino-Italic LoutRecode /fnt68 { /Palatino-Italicfnt68 LoutFont } def %%IncludeResource: font Symbol /fnt78 { /Symbol LoutFont } def %%IncludeResource: font Courier /Courierfnt29 vec2 /Courier LoutRecode /fnt29 { /Courierfnt29 LoutFont } def %%EndSetup %%Page: 1 1 %%BeginPageSetup %%PageResources: font Palatino-Roman %%+ font Palatino-Italic %%+ font Symbol %%+ font Courier /pgsave save def 0.0500 dup scale 10 setlinewidth %%EndPageSetup gsave 0 0 translate 240 fnt67 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 grestore grestore gsave 0 16840 translate 0.0000 rotate gsave 1417 -15423 translate 240 fnt67 0.0 0.0 0.0 setrgbcolor 9066 14006 0 14006 240 288 60 LoutGraphic gsave 1 LoutMargSet grestore 240 fnt67 0.0 0.0 0.0 setrgbcolor 0 13832(Hello,)m 480 13458(The)m 948(following)s 2042(line)s 2502(has)s 2931(err)s 4(ors.)k 3674(\(The)s 4222('-signs)s 4979(ar)s 4(e)k 5372(neither)s 6189(displayed)s 7300(in)s 7582(deeper)s 8379(zooms)s 0 13170(nor)m 419(printed:)s 240 fnt68 480 12795(y)m 240 fnt78 610 12792(\242)m 677(\()s 240 fnt68 761 12795(x)m 240 fnt78 890 12792(\))m 1028(-)s 167 fnt78 1345 12894(3)m 240 fnt68 1228 12795(x)m 240 fnt78 1490 12792(\327)m 240 fnt68 1603 12795(y)m 240 fnt78 1733 12792(\262)m 1843(\()s 240 fnt68 1927 12795(x)m 240 fnt78 2056 12792(\))m 2206(=)s 167 fnt78 2536 12894(3)m 240 fnt68 2419 12795(x)m 240 fnt78 2681 12792(\327)m 167 fnt78 3413 12951(3)m gsave 0 12855 translate 1.0000 1.5583 scale 240 fnt78 0.0 0.0 0.0 setrgbcolor 2794 -60(\()m grestore 240 fnt68 0.0 0.0 0.0 setrgbcolor 2902 12806(y)m 240 fnt78 3032 12803(\()m 240 fnt68 3116 12806(x)m 240 fnt78 3245 12803(\))m gsave 0 12855 translate 1.0000 1.5583 scale 240 fnt78 0.0 0.0 0.0 setrgbcolor 3347 -60(\))m grestore 240 fnt67 0.0 0.0 0.0 setrgbcolor 0 12508(What)m 636(is)s 859(wr)s 4(ong?)k 0 11823(My)m 418(system:)s 480 11449(Linux)m 1157(2.0.36)s 1810(\(K5-166;)s 2735(32)s 3028(MB)s 3453(RAM\))s 480 11075(Lout)m 1038(version:)s 1925(Basser)s 2656(Lout)s 3214(V)s 26(ersion)k 4067(3.08)s 4539(\(May)s 5156(1996\))s 480 10701(GS-V)m 26(ersion:)k 1767(4.03)s 0 9921(Can)m 487(you)s 950(\207x)s 1274(this)s 1714(bug?)s 2278(Thank)s 3015(you.)s 480 9547(Lars)m 994(R.)s 220 fnt29 1258 9557()m grestore grestore pgsave restore showpage %%Trailer %%DocumentNeededResources: font Courier %%+ font Palatino-Roman %%+ font Palatino-Italic %%+ font Symbol %%DocumentSuppliedResources: procset LoutStartUp %%+ procset LoutTabPrependGraphic %%+ procset LoutFigPrependGraphic %%+ procset LoutMarginNotes %%+ encoding vec2 %%Pages: 1 %%EOF