| |
| ############################################################################### |
| # # |
| # 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 |