%!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