
###############################################################################
#                                                                             #
#  Lout @Graph package for drawing graphs (Version 1.0)                       #
#                                                                             #
#  Version 1.0 by Jeffrey H. Kingston, December 1993.                         #
#                                                                             #
#  This package draws graphs, the statistical kind not the graph-theoretical  #
#  kind.  See the User's Guide (Advanced Graphics) for user info.             #
#                                                                             #
###############################################################################

@SysPrependGraphic { graph.lpg }
@SysInclude { graph.etc }

def @GraphObj
    left p
    named margin { 0c }
    named adj { 0 0 }
    right x
{
    @Null &  # kills previous white space
    @HContract @VContract {
	//0io ||0io @HContract @VContract 
	{ p "trpoint translate" adj "translate gsave" // "grestore" }
	@Graphic { //margin ||margin x ||margin //margin }
	||0io //0io
    }
}

def @GraphCross
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 0 moveto xsize ysize lineto 0 ysize moveto"
      "xsize 0 lineto [] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphPlus
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath xmark 0 moveto xmark ysize lineto 0 ymark moveto"
      "xsize ymark lineto [] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphSquare
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto"
      "0 ysize lineto closepath [] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphFilledSquare
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto"
      "0 ysize lineto closepath gsave [] 0 setdash stroke grestore fill"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphDiamond
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 ymark moveto xmark 0 lineto xsize ymark lineto"
      "xmark ysize lineto closepath [] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphFilledDiamond
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 ymark moveto xmark 0 lineto xsize ymark lineto"
      "xmark ysize lineto closepath gsave [] 0 setdash stroke grestore fill"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphCircle
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath xmark ymark xmark 0 360 arc"
      "[] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphFilledCircle
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath xmark ymark xmark 0 360 arc"
      "gsave [] 0 setdash stroke grestore fill"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphTriangle
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 0 moveto xsize 0 lineto xmark ysize 1.25 mul lineto"
      "closepath [] 0 setdash stroke"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphFilledTriangle
    named symbolsize
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 0.15 ft }
{
    @HContract @VContract
    { "newpath 0 0 moveto xsize 0 lineto xmark ysize 1.25 mul lineto"
      "closepath gsave [] 0 setdash stroke grestore fill"
    }
    @Graphic
    {symbolsize @High symbolsize @Wide ^| symbolsize @Wide ^/ symbolsize @High}
}

def @GraphNoLine
    named dashlength { 0.2 ft }
    named linewidth  { "currentlinewidth" }
    named length
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 1.0 ft }
{
    length @Wide {}
}

def @GraphSolid
    named dashlength { 0.2 ft }
    named linewidth  { "currentlinewidth" }
    named length
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 1.0 ft }
{
    @HContract @VContract
    { "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
       "/linewidth" linewidth "def xsize" dashlength "solid end"
    } @Graphic { length @Wide }
}

def @GraphDashed
    named dashlength { 0.2 ft }
    named linewidth  { "currentlinewidth" }
    named length
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 1.0 ft }
{
    @HContract @VContract
    { "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
       "/linewidth" linewidth "def xsize" dashlength "dashed end"
    } @Graphic { length @Wide }
}

def @GraphDotted
    named dashlength { 0.2 ft }
    named linewidth  { "currentlinewidth" }
    named length
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
    { 1.0 ft }
{
    @HContract @VContract
    { "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
       "/linewidth" linewidth "def xsize" dashlength "dotted end"
    } @Graphic { length @Wide }
}


export @Data
def @Graph
    named save         { no       }
    named style        { frame    }
    named width
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 6.0 cm   }
    named height
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 4.0 cm   }
    named xextra       { "none"   }
    named yextra       { "none"   }
    named xdecreasing  { no       }
    named ydecreasing  { no       }
    named leftcaption  {          }
    named rightcaption {          }
    named abovecaption {          }
    named belowcaption {          }
    named leftgap
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 1.5 cm   }
    named rightgap
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 0.5 cm   }
    named abovegap
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 0.5 cm   }
    named belowgap
	named cm left x { x"c" }
	named in left x { x"i" }
	named em left x { x"m" }
	named pt left x { x"p" }
	named ft left x { x"f" }
	named sp left x { x"s" }
	named vs left x { x"v" }
		       { 0.5 cm   }
    named hidecaptions { yes       }
    named objects
	named @NW
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg ysize" } margin { margin } x }
	named @SW
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg 0" } margin { margin } x }
	named @SE
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "0 0" } margin { margin } x }
	named @NE
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "0 ysize" } margin { margin } x }
	named @W
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg ysize 2 div" } margin { margin } x }
	named @S
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg 2 div 0" } margin { margin } x }
	named @E
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "0 ysize 2 div" } margin { margin } x }
	named @N
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg 2 div ysize" } margin { margin } x }
	named @CTR
	    import @GraphMath named at { 0 0 }
	    named margin
		named cm left x { x"c" }
		named in left x { x"i" }
		named em left x { x"m" }
		named pt left x { x"p" }
		named ft left x { x"f" }
		named sp left x { x"s" }
		named vs left x { x"v" }
	    { 0.3 ft }
	    right x
	{ at @GraphObj adj { "xsize neg 2 div ysize 2 div" } margin {margin} x }
		       {}
    named xorigin  named none { "false" }           { none           }
    named yorigin  named none { "false" }           { none           }
    named xlog     named none { "0" }               { none           }
    named ylog     named none { "0" }               { none           }
    named points   named none { "none" }            { none           }
    named pairs    named none { "none" }            { none           }
    named colour   named none { "none" }            { none           }
    named color    named none { "none" }            { none           }
    named paint    named none { "none"  }           { none           }
    named xmin     named none { "false" }           { none           }
    named xmax     named none { "false" }           { none           }
    named ymin     named none { "false" }           { none           }
    named ymax     named none { "false" }           { none           }
    named xticksep named none { "0" }               { none           }
    named yticksep named none { "0" }               { none           }
    import @GraphMath named xticks
	named none                                  { "false"        }
	named "@"                                   { " lgen"        }
	named "^"                                   { "^"            }
		       { false    }
    import @GraphMath named yticks
	named none                                  { "false"        }
	named "@"                                   { " lgen"        }
	named "^"                                   { "^"            }
		       { false    }
    named xticklength                               { 0.5 ft   }
    named yticklength                               { 0.5 ft   }
    named dataformat                                { xandy    }
    named dashlength                                { 0.2 ft   }
    named linewidth				    { "currentlinewidth"   }
    named symbolsize                                { 0.15 ft  }
    body @Body
@Begin

    def @Above
    {
	abovecaption @Case {
	    ""   @Yield {}
	    else @Yield @OneCol { ||0.5rt clines @Break abovecaption || //abovegap }
	}
    }

    def @Below
    {
	belowcaption @Case {
	    ""   @Yield {}
	    else @Yield @OneCol { //belowgap ||0.5rt clines @Break belowcaption || }
	}
    }

    def @Left
    {
	leftcaption @Case {
	    ""   @Yield {}
	    else @Yield @OneCol @OneRow {
		 { //0.5rt @OneRow clines @Break leftcaption // } ^||leftgap }
	}
    }

    def @Right
    {
	rightcaption @Case {
	    ""   @Yield {}
	    else @Yield @OneCol @OneRow {
		 ||rightgap { //0.5rt @OneRow lines @Break rightcaption // } }
	}
    }

    def @ZeroWidth
	right x
    {
	hidecaptions @Case {
	    { No  no  } @Yield x
	    { Yes yes } @Yield @OneCol { ||0io x ||0io }
	}
    }

    def @AddCaptions right x
    {
	def belowextra
	{
	    xticks @Case {
		""   @Yield { 0i }
		else @Yield { 1.7f }
	    }
	}

	@HContract @VContract
	{
	                       | @Above    |
	    / @ZeroWidth @Left | &0.5rt x  | @ZeroWidth @Right
	    /belowextra        | @Below    |
	}
    }

    export pi e sqrt abs ceiling floor truncate round cos sin atan exp log rand
	   "*" "/" idiv mod "-" "-0" "-1" "-2" "-3" "-4" "-5" "-6" "-7" "-8"
	   "-9" "-." "+" "=" "!=" "<" "<=" ">" ">=" not and xor or
	   if xloop yloop zloop

    def @Data
	named points   named none { "none" }            { points     }
	named pairs    named none { "none" }            { pairs      }
	named colour   named none { "none" }            { colour     }
	named color    named none { "none" }            { color      }
	named paint    named none { "none" }            { paint      }
	named dashlength                                { dashlength }
	named linewidth                                 { linewidth  }
	named symbolsize                                { symbolsize }
	named dataformat                                { dataformat }
	body data
    {
	def pi                                    {     "3.14159"  }
	def e                                     {     "2.71828"  }
	def sqrt     precedence 40        right y {   y "sqrt"     }
	def abs      precedence 40        right y {   y "abs"      }
	def ceiling  precedence 40        right y {   y "ceiling"  }
	def floor    precedence 40        right y {   y "floor"    }
	def truncate precedence 40        right y {   y "truncate" }
	def round    precedence 40        right y {   y "round"    }
	def cos      precedence 40        right y {   y "cos"      }
	def sin      precedence 40        right y {   y "sin"      }
	def atan     precedence 39 left x right y { x y "atan"     }
	def exp      precedence 38 left x right y { x y "exp"      }
	def log      precedence 37 left x right y { x y "dolog"    }
	def rand     precedence 36 left x right y { x y "dorand"   }
	def "*"      precedence 35 left x right y { x y "mul"      }
	def "/"      precedence 34 left x right y { x y "div"      }
	def idiv     precedence 34 left x right y { x y "idiv"     }
	def mod      precedence 34 left x right y { x y "mod"      }
	def "-"      precedence 33 left x right y
	{ x @Case { "" @Yield {y "neg"} else @Yield { x y "sub" } }  }
	def "-0"				    {     "-0"       }
	def "-1"				    {     "-1"       }
	def "-2"				    {     "-2"       }
	def "-3"				    {     "-3"       }
	def "-4"				    {     "-4"       }
	def "-5"				    {     "-5"       }
	def "-6"				    {     "-6"       }
	def "-7"				    {     "-7"       }
	def "-8"				    {     "-8"       }
	def "-9"				    {     "-9"       }
	def "-."				    {     "-."       }
	def "+"      precedence 32 left x right y
	{ x @Case { "" @Yield { y }     else @Yield { x y "add" } }  }
	def "="      precedence 30 left x right y { x y "eq"       }
	def "!="     precedence 30 left x right y { x y "ne"       }
	def "<"      precedence 30 left x right y { x y "lt"       }
	def "<="     precedence 30 left x right y { x y "le"       }
	def ">"      precedence 30 left x right y { x y "gt"       }
	def ">="     precedence 30 left x right y { x y "ge"       }
	def not      precedence 25        right y {   y "not"      }
	def and      precedence 24 left x right y { x y "and"      }
	def xor      precedence 23 left x right y { x y "xor"      }
	def or       precedence 22 left x right y { x y "or"       }
	def if
	    named cond { true }
	    named then {}
	    named else {}
	{ cond "{" then "} {" else "} ifelse" }
	def xloop
	    named from { 0 }
	    named to { 0 }
	    named by { 1 }
	    named do named x { "xval" } {}
	{ from by to "{ /xval exch def" do "} for" }
	def yloop
	    named from { 0 }
	    named to { 0 }
	    named by { 1 }
	    named do named y { "yval" } {}
	{ from by to "{ /yval exch def" do "} for" }
	def zloop
	    named from { 0 }
	    named to { 0 }
	    named by { 1 }
	    named do named z { "zval" } {}
	{ from by to "{ /zval exch def" do "} for" }

	def @IfPt
	   left no
	   right yes
	{
	    points @Case {
		none @Yield no
		else @Yield yes
	    }
	}

	def @Points
	{
	    points @Case {
		none            @Yield ""
		plus            @Yield "plus"
		cross           @Yield "cross"
		square          @Yield "square"
		filledsquare    @Yield "filledsquare"
		diamond         @Yield "diamond"
		filleddiamond   @Yield "filleddiamond"
		circle          @Yield "circle"
		filledcircle    @Yield "filledcircle"
		triangle        @Yield "triangle"
		filledtriangle  @Yield "filledtriangle"
	    }
	}

	def @Pairs
	{
	  pairs @Case {
	    none       @Yield {}
	    solid      @Yield { "linesetup solid"   @IfPt "ilinesetup solid"  }
	    dashed     @Yield { "linesetup cdashed" @IfPt "ilinesetup dashed" }
	    dotted     @Yield { "linesetup dotted"  @IfPt "ilinesetup dotted" }
	    surfacexhisto @Yield { "surfacexhisto" }
	    surfaceyhisto @Yield { "surfaceyhisto" }
	    xhisto        @Yield { "xhisto" }
	    yhisto        @Yield { "yhisto" }
	    filledxhisto  @Yield { "filledxhisto" }
	    filledyhisto  @Yield { "filledyhisto" }
	  }
	}

        def @DataFormat
        {
	    dataformat @Case {
	        xandy     @Yield xandy
	        yonly     @Yield yonly
	        xonly     @Yield xonly
	    }
        }

	def @Col
	{
	    { colour @Case { "none" @Yield color else @Yield colour } } @Case {
		none		@Yield	{                         }
		nochange	@Yield	{                         }
		darkblue	@Yield	{ 0.0 0.0 0.5 setrgbcolor }
		blue		@Yield	{ 0.0 0.0 1.0 setrgbcolor }
		lightblue	@Yield	{ 0.5 0.5 1.0 setrgbcolor }
		darkgreen	@Yield	{ 0.0 0.5 0.0 setrgbcolor }
		green		@Yield	{ 0.0 1.0 0.0 setrgbcolor }
		lightgreen	@Yield	{ 0.5 1.0 0.5 setrgbcolor }
		darkred		@Yield	{ 0.5 0.0 0.0 setrgbcolor }
		red		@Yield	{ 1.0 0.0 0.0 setrgbcolor }
		lightred	@Yield	{ 1.0 0.5 0.5 setrgbcolor }
		darkcyan	@Yield	{ 0.0 0.5 0.5 setrgbcolor }
		cyan		@Yield	{ 0.0 1.0 1.0 setrgbcolor }
		lightcyan	@Yield	{ 0.5 1.0 1.0 setrgbcolor }
		darkmagenta	@Yield	{ 0.5 0.0 0.5 setrgbcolor }
		magenta		@Yield	{ 1.0 0.0 1.0 setrgbcolor }
		lightmagenta	@Yield	{ 1.0 0.5 1.0 setrgbcolor }
		darkyellow	@Yield	{ 0.5 0.5 0.0 setrgbcolor }
		yellow		@Yield	{ 1.0 1.0 0.0 setrgbcolor }
		lightyellow	@Yield	{ 1.0 1.0 0.5 setrgbcolor }
		darkgray	@Yield	{ 0.2 0.2 0.2 setrgbcolor }
		gray		@Yield	{ 0.5 0.5 0.5 setrgbcolor }
		lightgray	@Yield	{ 0.7 0.7 0.7 setrgbcolor }
		darkgrey	@Yield	{ 0.2 0.2 0.2 setrgbcolor }
		grey		@Yield	{ 0.5 0.5 0.5 setrgbcolor }
		lightgrey	@Yield	{ 0.7 0.7 0.7 setrgbcolor }
		black		@Yield	{ 0.0 0.0 0.0 setrgbcolor }
		white		@Yield	{ 1.0 1.0 1.0 setrgbcolor }
	    }
	}

	def @Paint
	{
	    paint @Case {
	       { none no No } @Yield "false"
	       { yes Yes } @Yield "true"
	    }
	}

       "[ [" data "]" dataformat
	  "{" @Points "}"
	  "{" @Pairs "}"
	  "{ /dashlength" dashlength "def"
	  "  /linewidth"  linewidth  "def" @Col
	  "  /symbolsize" symbolsize "def }"
	  "{" @Paint "}"
       "]"
    }

    def @Style
    {
	style @Case {
	    frame    @Yield { "framestyle" }
	    none     @Yield { "nonestyle"  }
	    axes     @Yield { "axesstyle"  }
	}
    }

    def @XExtra
    {
	xextra @Case {
	    "none" @Yield {
		style @Case {
	            frame    @Yield { "0.5 cm" }
	            none     @Yield { "0"  }
	            axes     @Yield { "0"  }
		}
	    }
	    else @Yield xextra
	}
    }

    def @YExtra
    {
	yextra @Case {
	    "none" @Yield {
		style @Case {
	            frame @Yield { "0.5 cm" }
	            none  @Yield { "0"  }
	            axes  @Yield { "0"  }
		}
	    }
	    else @Yield yextra
	}
    }

    def @XDecreasing
    {
	xdecreasing @Case {
	    { No no } @Yield "false"
	    { Yes yes } @Yield "true"
	}
    }

    def @YDecreasing
    {
	ydecreasing @Case {
	    { No no } @Yield "false"
	    { Yes yes } @Yield "true"
	}
    }

    @AddCaptions width @Wide height @High
    {
	{
	    "grestore"
	    save @Case { { Yes yes } @Yield "save" else @Yield {} }
	    "gsave xsize ysize lgraphdict begin /ysize exch def /xsize exch def"
	    "/alldata [" @Body "] def"
	    xticksep "[" xticks "] 0 alldata" xmin xmax xlog
	      @XExtra @XDecreasing xorigin xticklength "xset"
	    yticksep "[" yticks "] 1 alldata" ymin ymax ylog
	      @YExtra @YDecreasing yorigin yticklength "yset"
	    "rundata" @Style // "end"
	    save @Case { { Yes yes } @Yield "restore" else @Yield {} }
	} @Graphic { //1rt objects }
    }

@End @Graph                  
