###############################################################################
# #
# Lout @Graph package for drawing graphs (Version 1.1) #
# #
# Version 1.0 (December 1993). #
# Version 1.1 (adds @GraphSetup, June 2013) #
# Jeffrey H. Kingston #
# #
# This package draws graphs, the statistical kind not the graph-theoretical #
# kind. See the User's Guide for user info. #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either Version 3, or (at your option) #
# any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA #
# #
# As a special exception, when this file is read by Lout when processing #
# a Lout source document, you may use the result without restriction. #
# #
###############################################################################
@SysInclude { graphf.etc } # @GraphMath
@SysInclude { lengths } # @LoutLengths
@SysInclude { coltex } # @ColourCommand and @TextureCommand
@SysPrependGraphic { graphf.lpg }
###############################################################################
# #
# @GraphZZZ symbol - not for ordinary use #
# #
###############################################################################
def @GraphZZZ
left p
named margin { 0c }
named adj { 0 0 }
right x
{
@BackEnd @Case {
PostScript @Yield {
@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
}
}
# VT: PDF does nothing
PDF @Yield {
@Null & # kills previous white space
@HContract @VContract {
//0io ||0io @HContract @VContract
{ "% @GraphZZZ UNIMPLEMENTED" }
@Graphic { //margin ||margin x ||margin //margin }
||0io //0io
}
}
}
}
###############################################################################
# #
# @GraphSetup symbol #
# #
###############################################################################
export @GraphCross @GraphPlus @GraphSquare @GraphFilledSquare
@GraphDiamond @GraphFilledDiamond @GraphCircle @GraphFilledCircle
@GraphTriangle @GraphFilledTriangle
@GraphNoLine @GraphSolid @GraphDashed @GraphDotted @GraphDotDashed
@GraphDotDotDashed @GraphDotDotDotDashed
@Graph
def @GraphSetup
named style { frame }
named font { }
named xorigin named none { "false" } { none }
named yorigin named none { "false" } { none }
named xlog named none { "0" } { none }
named ylog named none { "0" } { none }
import @LoutLengths named width { 6.0c }
import @LoutLengths named height { 4.0c }
import @PSLengths named xextra { auto }
import @PSLengths named yextra { auto }
named xdecreasing { no }
named ydecreasing { no }
named leftcaption { }
named rightcaption { }
named abovecaption { }
named belowcaption { }
import @LoutLengths named leftgap { 1.5c }
import @LoutLengths named rightgap { 0.5c }
import @LoutLengths named abovegap { 0.5c }
import @LoutLengths named belowgap { 0.5c }
named hidecaptions { yes }
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 }
named rticksep named none { "0" } { none }
import @GraphMath named xticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ auto }
import @GraphMath named yticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ auto }
import @GraphMath named rticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ }
import @PSLengths named xticklength { 0.5f }
import @PSLengths named yticklength { 0.5f }
import @PSLengths named rticklength { 0.5f }
named objects
named @NW
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg ysize" } margin { margin } x }
named @SW
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 0" } margin { margin } x }
named @SE
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 0" } margin { margin } x }
named @NE
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 ysize" } margin { margin } x }
named @W
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg ysize 2 div" } margin { margin } x }
named @S
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 2 div 0" } margin { margin } x }
named @E
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 ysize 2 div" } margin { margin } x }
named @N
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 2 div ysize" } margin { margin } x }
named @CTR
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{at @GraphZZZ adj {"xsize neg 2 div ysize 2 div"} margin {margin} x}
{}
named save { no }
named points named none { "none" } { none }
import @PSLengths named symbolsize { 0.15f }
import @PSLengths named symbollinewidth { "currentlinewidth" }
named pairs named none { "none" } { none }
import @PSLengths named dashlength { 0.2f }
import @PSLengths named linewidth { "currentlinewidth" }
named colour color named none { "none" } { none }
named paint { no }
import @TextureImport named texture { solid }
named dataformat { xandy }
import @LoutLengths named osymbolsize { 0.15f }
import @PSLengths named osymbollinewidth { "currentlinewidth" }
import @PSLengths named odashlength { 0.2f }
import @PSLengths named olinewidth { "currentlinewidth" }
import @LoutLengths named olength { 1.0f }
{
def @GraphCross
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 0 moveto xsize ysize lineto 0 ysize moveto"
# "xsize 0 lineto [] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "docross"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{ "n [] 0 d 0 0 m __xsize __ysize l 0 __ysize m __xsize 0 l S"}
# uses S because PostScript version does NOT use closepath
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphPlus
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath xmark 0 moveto xmark ysize lineto 0 ymark moveto"
# "xsize ymark lineto [] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "doplus"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{ "n [] 0 d __xmark 0 m __xmark __ysize l 0 __ymark m __xsize __ymark l S"}
# uses S because PostScript version does NOT use closepath
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphSquare
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto"
# "0 ysize lineto closepath [] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "dosquare"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 0 __xsize __ysize re s"}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphFilledSquare
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize"
# "lineto closepath gsave [] 0 setdash stroke grestore fill"
"lgraphdict begin xmark ymark xmark"
symbollinewidth "dofilledsquare" // "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 0 __xsize __ysize re b"}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphDiamond
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 ymark moveto xmark 0 lineto xsize ymark lineto"
# "xmark ysize lineto closepath [] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "dodiamond"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 __ymark m __xmark 0 l __xsize __ymark l __xmark __ysize l s"}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphFilledDiamond
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 ymark moveto xmark 0 lineto xsize ymark lineto"
# "xmark ysize lineto closepath gsave [] 0 setdash stroke
# grestore fill"
"lgraphdict begin xmark ymark xmark"
symbollinewidth "dofilleddiamond" // "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 __ymark m __xmark 0 l __xsize __ymark l __xmark __ysize l b"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphCircle
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath xmark ymark xmark 0 360 arc"
# "[] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "docircle"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
#
# draw a circle whose centre is at (xmark, ymark) and whose radius is xmark units;
#
# for curveto to work, we need to calculate the control points of the Bezier curve
# as well as move the pen to the correct initial point. The circle is drawn as two
# arcs of 180 degrees
#
# pt0 = (xmark + xmark, ymark)
# pt1 = (xmark + xmark, ymark + 4/3 * xmark)
# pt2 = (0, ymark + 4/3 * xmark)
# pt3 = (0, ymark)
#
# pt0 = (0, ymark)
# pt1 = (0, ymark - 4/3 * xmark)
# pt2 = (xmark + xmark, ymark - 4/3 * xmark)
# pt3 = (xmark + xmark, ymark)
#
{"n [] 0 d"
"__mul(2, __xmark) __ymark m"
"__mul(2, __xmark) __add(__ymark, __div(__mul(4, __xmark), 3))" # pt1
"0 __add(__ymark, __div(__mul(4, __xmark), 3))" # pt2
"0 __ymark c" # pt3
"0 __sub(__ymark, __div(__mul(4, __xmark), 3))" # pt1
"__mul(2, __xmark) __sub(__ymark, __div(__mul(4, __xmark), 3))" # pt2
"__mul(2, __xmark) __ymark c S" # pt3
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphFilledCircle
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath xmark ymark xmark 0 360 arc"
# "gsave [] 0 setdash stroke grestore fill"
"lgraphdict begin xmark ymark xmark"
symbollinewidth "dofilledcircle" // "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
#
# draw a filled circle whose centre is at (xmark, ymark) and whose radius is xmark units;
#
# for curveto to work, we need to calculate the control points of the Bezier curve
# as well as move the pen to the correct initial point. The circle is drawn as two
# arcs of 180 degrees
#
# pt0 = (xmark + xmark, ymark)
# pt1 = (xmark + xmark, ymark + 4/3 * xmark)
# pt2 = (0, ymark + 4/3 * xmark)
# pt3 = (0, ymark)
#
# pt0 = (0, ymark)
# pt1 = (0, ymark - 4/3 * xmark)
# pt2 = (xmark + xmark, ymark - 4/3 * xmark)
# pt3 = (xmark + xmark, ymark)
#
# Note: this is not a strict translation because there is a setdash bracketed by
# gsave/grestore in the above PostScript but there is no closepath before it;
# but in PDF, it is not possible to execute a setdash within a path definition.
#
{"n [] 0 d"
"__mul(2, __xmark) __ymark m"
"__mul(2, __xmark) __add(__ymark, __div(__mul(4, __xmark), 3))" # pt1
"0 __add(__ymark, __div(__mul(4, __xmark), 3))" # pt2
"0 __ymark c" # pt3
"0 __sub(__ymark, __div(__mul(4, __xmark), 3))" # pt1
"__mul(2, __xmark) __sub(__ymark, __div(__mul(4, __xmark), 3))" # pt2
"__mul(2, __xmark) __ymark c b" # pt3
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphTriangle
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 0 moveto xsize 0 lineto xmark ysize 1.25 mul lineto"
# "closepath [] 0 setdash stroke"
"lgraphdict begin xmark ymark xmark" symbollinewidth "dotriangle"
// "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 0 m __xsize 0 l __xmark __mul(__ysize, 1.25) l s"}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphFilledTriangle
import @LoutLengths named symbolsize { osymbolsize }
import @PSLengths named symbollinewidth { osymbollinewidth }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{
# "newpath 0 0 moveto xsize 0 lineto xmark ysize 1.25 mul lineto"
# "closepath gsave [] 0 setdash stroke grestore fill"
"lgraphdict begin xmark ymark xmark"
symbollinewidth "dofilledtriangle" // "end"
}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
PDF @Yield {
@HContract @VContract
{"n [] 0 d 0 0 m __xsize 0 l __xmark __mul(__ysize, 1.25) l h b"}
@Graphic {symbolsize @High symbolsize @Wide ^|
symbolsize @Wide ^/ symbolsize @High}
}
}
}
def @GraphNoLine
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
length @Wide {}
}
def @GraphSolid
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
"/linewidth" linewidth "def xsize" dashlength "solid end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphSolid UNIMPLEMENTED" } @Graphic { length @Wide }
}
}
}
def @GraphDashed
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
"/linewidth" linewidth "def xsize" dashlength "dashed end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphDashed UNIMPLEMENTED" } @Graphic { olength @Wide }
}
}
}
def @GraphDotted
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
"/linewidth" linewidth "def xsize" dashlength "dotted end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphDotted UNIMPLEMENTED" } @Graphic { olength @Wide }
}
}
}
def @GraphDotDashed
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
"/linewidth" linewidth "def xsize" dashlength "dotdashed end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphDotDashed UNIMPLEMENTED" } @Graphic { length @Wide }
}
}
}
def @GraphDotDotDashed
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto"
"/linewidth" linewidth "def xsize" dashlength "dotdotdashed end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphDotDotDashed UNIMPLEMENTED" } @Graphic { length @Wide }
}
}
}
def @GraphDotDotDotDashed
import @PSLengths named dashlength { odashlength }
import @PSLengths named linewidth { olinewidth }
import @LoutLengths named length { olength }
{
@BackEnd @Case {
PostScript @Yield {
@HContract @VContract
{ "xsize 0 lgraphdict begin newpath 0 0 moveto lineto /linewidth"
linewidth "def xsize" dashlength "dotdotdotdashed end"
} @Graphic { length @Wide }
}
# VT: PDF does nothing
PDF @Yield {
@HContract @VContract
{ "% @GraphDotDotDotDashed UNIMPLEMENTED" } @Graphic { length @Wide }
}
}
}
export @Data
def @Graph
named style { style }
named font { font }
named xorigin named none { "false" } { xorigin }
named yorigin named none { "false" } { yorigin }
named xlog named none { "0" } { xlog }
named ylog named none { "0" } { ylog }
import @LoutLengths named width { width }
import @LoutLengths named height { height }
import @PSLengths named xextra { xextra }
import @PSLengths named yextra { yextra }
named xdecreasing { xdecreasing }
named ydecreasing { ydecreasing }
named leftcaption { leftcaption }
named rightcaption { rightcaption }
named abovecaption { abovecaption }
named belowcaption { belowcaption }
import @LoutLengths named leftgap { leftgap }
import @LoutLengths named rightgap { rightgap }
import @LoutLengths named abovegap { abovegap }
import @LoutLengths named belowgap { belowgap }
named hidecaptions { hidecaptions }
named xmin named none { "false" } { xmin }
named xmax named none { "false" } { xmax }
named ymin named none { "false" } { ymin }
named ymax named none { "false" } { ymax }
named xticksep named none { "0" } { xticksep }
named yticksep named none { "0" } { yticksep }
named rticksep named none { "0" } { rticksep }
import @GraphMath named xticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ xticks }
import @GraphMath named yticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ yticks }
import @GraphMath named rticks
named none { "false" }
named auto { "false" }
named "@" { " lgen" }
named "^" { "^" }
{ rticks }
import @PSLengths named xticklength { xticklength }
import @PSLengths named yticklength { yticklength }
import @PSLengths named rticklength { rticklength }
named objects
named @NW
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg ysize" } margin { margin } x }
named @SW
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 0" } margin { margin } x }
named @SE
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 0" } margin { margin } x }
named @NE
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 ysize" } margin { margin } x }
named @W
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg ysize 2 div" } margin { margin } x }
named @S
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 2 div 0" } margin { margin } x }
named @E
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "0 ysize 2 div" } margin { margin } x }
named @N
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{ at @GraphZZZ adj { "xsize neg 2 div ysize" } margin { margin } x }
named @CTR
import @GraphMath named at { 0 0 }
import @LoutLengths named margin { 0.3f }
right x
{at @GraphZZZ adj {"xsize neg 2 div ysize 2 div"} margin {margin} x}
{ objects }
named save { save }
named points named none { "none" } { points }
import @PSLengths named symbolsize { symbolsize }
import @PSLengths named symbollinewidth { symbollinewidth }
named pairs named none { "none" } { pairs }
import @PSLengths named dashlength { dashlength }
import @PSLengths named linewidth { linewidth }
named colour color named none { "none" } { colour }
named paint { paint }
import @TextureImport named texture { texture }
named dataformat { dataformat }
body @Body
{
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 }
import @PSLengths named symbolsize { symbolsize }
import @PSLengths named symbollinewidth { symbollinewidth }
named pairs named none { "none" } { pairs }
import @PSLengths named dashlength { dashlength }
import @PSLengths named linewidth { linewidth }
named colour color named none { "none" } { colour }
named paint { paint }
import @TextureImport named texture { texture }
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" }
dotdashed @Yield { "linesetup dotcdashed" @IfPt
"ilinesetup dotdashed" }
dotdotdashed @Yield { "linesetup dotdotcdashed" @IfPt
"ilinesetup dotdotdashed" }
dotdotdotdashed @Yield { "linesetup dotdotdotcdashed" @IfPt
"ilinesetup dotdotdotdashed" }
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
swapxandy @Yield swapxandy
yonly @Yield yonly
xonly @Yield xonly
}
}
def @Paint
{
paint @Case {
{ none no No } @Yield "false"
{ yes Yes } @Yield "true"
}
}
"[ [" data "]" dataformat
"{" @Points "}"
"{" @Pairs "}"
"{ /dashlength" dashlength "def"
" /linewidth" linewidth "def" @ColourCommand colour
" /symbolsize" symbolsize "def"
" /symbollinewidth" symbollinewidth "def }"
"{" @Paint "}"
"{" texture "}"
"]"
}
def @Style
{
style @Case {
frame @Yield { "framestyle" }
grid @Yield { "gridstyle" }
none @Yield { "nonestyle" }
axes @Yield { "axesstyle" }
}
}
def @XExtra
{
xextra @Case {
"auto" @Yield {
style @Case {
frame @Yield { "0.5 cm" }
grid @Yield { "0" }
none @Yield { "0" }
axes @Yield { "0" }
}
}
else @Yield xextra
}
}
def @YExtra
{
yextra @Case {
"auto" @Yield {
style @Case {
frame @Yield { "0.5 cm" }
grid @Yield { "0" }
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"
}
}
font @Font @AddCaptions width @Wide height @High
@BackEnd @Case {
PostScript @Yield {
{
"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"
rticks @Case {
"" @Yield "norset"
else @Yield {
rticksep "[" rticks "] 1 alldata" ymin ymax ylog
@YExtra @YDecreasing yorigin rticklength "rset"
}
}
"rundata" @Style // "end"
save @Case { { Yes yes } @Yield "restore" else @Yield {} }
} @Graphic { //1rt objects }
}
PDF @Yield { {"% @Graph UNIMPLEMENTED"} @Graphic { //1rt objects } }
}
}
}