############################################################################### # # # Lout @Fig package for drawing figures (Version 2.0) # # # # Version 1.0 by Jeffrey H. Kingston, October 1991. # # Version 2.0 by Jeffrey H. Kingston, 22 December 1992. # # Symbol names changed by JHK 5 March 1993 to avoid clashes with EPS files. # # @CurveBox and @ShadowBox added by JHK April 1995. # # # # See "Fig - a Lout package for drawing figures" for user information. # # # # This package is now obsolete, having been replaced by @Diag. # # # ############################################################################### @SysPrependGraphic { "figf.lpg" } export in cm pt em sp vs ft dg "<<" "**" "++" "--" @Max @Min @Distance @XDistance @YDistance @Angle @Prev "::" @Label @BaseOf @MarkOf @ShowLabels @Figure @Frame @Box @CurveBox @ShadowBox @Square @Diamond @Polygon @Ellipse @Circle @HLine @VLine @Line @HArrow @VArrow @Arrow @Arc def @Fig named maxlabels { 200 } named linestyle { solid } named linewidth { 0.5 pt } named linecap { round } named dashlength { 0.15 cm } named paint { nopaint } named margin { 0.4c } named arrow { noarrow } named headstyle { open } named headwidth { 0.05 cm } named headlength { 0.15 cm } body @Body @Begin # Like @Graphic, but affects the graphics state of right parameter def @InnerGraphic left ps right x { @BackEnd @Case { PostScript @Yield { { ps gsave // grestore } @Graphic x } PDF @Yield { } } } def in precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "in" } PDF @Yield { "__mul(__in, "x")" } } } def cm precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "cm" } PDF @Yield { "__mul(__cm, "x")" } } } def pt precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "pt" } PDF @Yield { "__mul(__pt, "x")" } } } def em precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "em" } PDF @Yield { "__mul(__em, "x")" } } } def sp precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "sp" } PDF @Yield { "__mul(__louts, "x")" } } } def vs precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "vs" } PDF @Yield { "__mul(__loutv, "x")" } } } def ft precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "ft" } PDF @Yield { "__mul(__loutf, "x")" } } } def dg precedence 39 left x { @BackEnd @Case { PostScript @Yield { x "dg" } PDF @Yield { } } } def "<<" precedence 38 left length right angle { @BackEnd @Case { PostScript @Yield { 0 0 length angle "lfigatangle" } PDF @Yield { } } } def "**" precedence 37 left point right length { @BackEnd @Case { PostScript @Yield { point length "lfigpmul" } PDF @Yield { } } } def "++" precedence 36 associativity left left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigpadd" } PDF @Yield { } } } def "--" precedence 36 associativity left left x right y { @BackEnd @Case { PostScript @Yield { y x "lfigpsub" } PDF @Yield { } } } def @Max precedence 36 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigpmax" } PDF @Yield { } } } def @Min precedence 36 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigpmin" } PDF @Yield { } } } def @Distance precedence 35 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigdistance" } PDF @Yield { } } } def @XDistance precedence 35 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigxdistance" } PDF @Yield { } } } def @YDistance precedence 35 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigydistance" } PDF @Yield { } } } def @Angle precedence 35 left x right y { @BackEnd @Case { PostScript @Yield { x y "lfigangle" } PDF @Yield { } } } def @Prev { @BackEnd @Case { PostScript @Yield { "lfigprevious" } PDF @Yield { } } } def "::" precedence 33 left name right x { @BackEnd @Case { PostScript @Yield { { "currentdict end" maxlabels "dict begin begin" // "("name") lfigpromotelabels" } @Graphic x } PDF @Yield { } } } def @Label right name { @BackEnd @Case { PostScript @Yield { "/"name "lfigpointdef" } PDF @Yield { } } } def @MarkOf precedence 32 left point right x { @BackEnd @Case { PostScript @Yield { { point "translate" } @InnerGraphic { /0io |0io @OneCol @OneRow x |0io /0io } } PDF @Yield { } } } def @BaseOf precedence 32 left point right x { @BackEnd @Case { PostScript @Yield { { point "translate" } @InnerGraphic { /0io |0io @OneRow @OneCol { | @OneCol @OneRow x ^/ } |0io /0io } } PDF @Yield { } } } def @ShowLabels { @BackEnd @Case { PostScript @Yield { "lfigshowlabels" @Graphic } PDF @Yield { } } } def @Figure named shape { } named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named arrow { arrow } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } named paint { paint } named margin { 0c } right x { @BackEnd @Case { PostScript @Yield { @HContract @VContract { #fill the shape paint @Case { nopaint @Yield {} { nochange darkblue blue lightblue darkgreen green lightgreen darkred red lightred darkcyan cyan lightcyan darkmagenta magenta lightmagenta darkyellow yellow lightyellow darkgray gray lightgray darkgrey grey lightgrey black white } @Yield { "/lfig"paint "[" shape "] gsave lfigpaintpath grestore" } } # stroke the path and add any arrowheads linestyle @Case { { solid dashed cdashed dotted noline } @Yield { linewidth "setlinewidth" "lfig"linecap "setlinecap" dashlength "/lfig"linestyle "[" shape "] lfigdopath" arrow @Case { noarrow @Yield { pop pop } { forward back both } @Yield { dashlength "/lfig"linestyle "/"lfigblack headstyle @Case { { open halfopen closed } @Yield "lfig"headstyle } headlength headwidth "lfig"arrow } } } } } @Graphic { ^/margin ^|margin @OneCol @OneRow x |margin /margin } } PDF @Yield { } } } def @Frame right x { @Figure shape {xsize 0 @Label X 0 ysize @Label Y} { x } } def @Box named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { # 0 0 @Label SW # xsize 0 @Label SE # xsize ysize @Label NE # 0 ysize @Label NW # SE ** 0.5 @Label S # NW ** 0.5 @Label W # W ++ SE @Label E # S ++ NW @Label N # NE ** 0.5 @Label CTR # SW SE NE NW SW lfigbox } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @CurveBox named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { lfigcurvebox } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } { 0c @HShift x } } def @ShadowBox named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } named shadow { 0.2f } right x { @BackEnd @Case { PostScript @Yield { @VContract @HContract 0c @HShift "lfigshadow" @Graphic { ^/shadow ^|shadow 0c @HShift @Figure shape { lfigbox } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } 0c @HShift x |shadow /shadow } } PDF @Yield { @VContract @HContract 0c @HShift # "lfigshadow" @Graphic is this: { "__mul(__xmark, 2) 0 m __xsize 0 l" # xmark 2 mul 0 moveto xsize 0 lineto "__xsize __sub(__ysize, __mul(__xmark, 2)) l" # xsize ysize xmark 2 mul sub lineto "__sub(__xsize, __xmark) __sub(ysize, __mul(__xmark, 2)) l" # xsize xmark sub ysize xmark 2 mul sub lineto "__sub(__xsize, __xmark) __xmark l" # xsize xmark sub xmark lineto "__mul(__xmark, 2) __xmark l h f" # xmark 2 mul xmark lineto closepath fill } @Graphic { ^/shadow ^|shadow 0c @HShift @Figure shape { lfigbox } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } 0c @HShift x |shadow /shadow } } } } def @Square named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { # {xsize ysize} ** 0.5 @Label CTR # CTR ++ {{xsize xsize} @Max {ysize ysize}}**0.5 @Label NE # CTR ++ { {CTR @Distance NE} << 135 } @Label NW # CTR ++ { {CTR @Distance NE} << 225 } @Label SW # CTR ++ { {CTR @Distance NE} << 315 } @Label SE # SW ** 0.5 ++ SE ** 0.5 @Label S # NW ** 0.5 ++ NE ** 0.5 @Label N # SW ** 0.5 ++ NW ** 0.5 @Label W # SE ** 0.5 ++ NE ** 0.5 @Label E # SW SE NE NW SW lfigsquare } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @Diamond named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { # {xsize 0} ** 0.5 @Label S # {0 ysize} ** 0.5 @Label W # S ++ W @Label CTR # CTR ++ W @Label N # CTR ++ S @Label E # S E N W S lfigdiamond } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @Polygon named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } named sides { 3 } named angle { "dup 180 exch div" } right x { @Figure shape { sides angle lfigpolygon } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @Ellipse named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { # {xsize 0} ** 0.5 @Label S # {0 ysize} ** 0.5 @Label W # S ++ W @Label CTR # CTR ++ W @Label N # CTR ++ S @Label E # CTR ++ {xsize 0} ** 0.3536 ++ {0 ysize} ** 0.3536 @Label NE # CTR ++ {xsize 0} ** 0.3536 -- {0 ysize} ** 0.3536 @Label SE # CTR -- {xsize 0} ** 0.3536 ++ {0 ysize} ** 0.3536 @Label NW # CTR -- {xsize 0} ** 0.3536 -- {0 ysize} ** 0.3536 @Label SW # S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S lfigellipse } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @Circle named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { margin } right x { @Figure shape { # {xsize ysize} **0.5 @Label CTR # CTR ++ {{xsize 0} @Max {ysize 0}}**0.5 @Label E # CTR ++ { {CTR @Distance E} << 45 } @Label NE # CTR ++ { {CTR @Distance E} << 90 } @Label N # CTR ++ { {CTR @Distance E} << 135 } @Label NW # CTR ++ { {CTR @Distance E} << 180 } @Label W # CTR ++ { {CTR @Distance E} << 225 } @Label SW # CTR ++ { {CTR @Distance E} << 270 } @Label S # CTR ++ { {CTR @Distance E} << 315 } @Label SE # S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S lfigcircle } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } x } def @HLine named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { arrow } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { # 0 ymark @Prev @Label FROM # xsize ymark @Prev @Label TO lfighline } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @VLine named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { arrow } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { # xmark ysize @Prev @Label FROM # xmark 0 @Prev @Label TO lfigvline } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @HArrow named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { forward } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { # 0 ymark @Prev @Label FROM # xsize ymark @Prev @Label TO lfighline } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @VArrow named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { forward } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { # xmark ysize @Prev @Label FROM # xmark 0 @Prev @Label TO lfigvline } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @Line named from { 0 ysize } named to { xsize 0 } named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { arrow } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { from @Prev @Label FROM to @Prev @Label TO } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @Arrow named from { 0 ysize } named to { xsize 0 } named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { forward } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { from @Prev @Label FROM to @Prev @Label TO } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } def @Arc named from { 0 ysize } named to { xsize 0 } named ctr { 0 0 } named direction { clockwise } named linestyle { linestyle } named linewidth { linewidth } named linecap { linecap } named dashlength { dashlength } named paint { paint } named margin { 0c } named arrow { noarrow } named headstyle { headstyle } named headwidth { headwidth } named headlength { headlength } right x { @Figure shape { from @Label FROM to @Label TO ctr @Label CTR FROM [ CTR direction @Case { {clockwise anticlockwise} @Yield direction } ] TO } linestyle { linestyle } linewidth { linewidth } linecap { linecap } dashlength { dashlength } paint { paint } margin { margin } arrow { arrow } headstyle { headstyle } headwidth { headwidth } headlength { headlength } x } @BackEnd @Case { PostScript @Yield { { "grestore save gsave" maxlabels "dict begin lfigdict begin" // "end end restore" } @Graphic @Body } PDF @Yield { } } @End @Fig