aboutsummaryrefslogtreecommitdiffstats
path: root/include/diagf
diff options
context:
space:
mode:
authorJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
committerJeffrey H. Kingston <jeff@it.usyd.edu.au>2010-09-14 19:21:41 +0000
commit71bdb35d52747e6d7d9f55df4524d57c2966be94 (patch)
tree480ee5eefccc40d5f3331cc52d66f722fd19bfb9 /include/diagf
parentb41263ea7578fa9742486135c762803b52794105 (diff)
downloadlout-71bdb35d52747e6d7d9f55df4524d57c2966be94.tar.gz
Lout 3.17.
git-svn-id: http://svn.savannah.nongnu.org/svn/lout/trunk@2 9365b830-b601-4143-9ba8-b4a8e2c3339c
Diffstat (limited to 'include/diagf')
-rw-r--r--include/diagf3845
1 files changed, 3845 insertions, 0 deletions
diff --git a/include/diagf b/include/diagf
new file mode 100644
index 0000000..18b888a
--- /dev/null
+++ b/include/diagf
@@ -0,0 +1,3845 @@
+
+###############################################################################
+# #
+# Lout @Diag package for drawing diagrams #
+# Version 1.0 (July 1996) #
+# Jeffrey H. Kingston #
+# #
+# Based on Version 2.0 of the @Fig package (Jeffrey H. Kingston, Dec 1992). #
+# #
+###############################################################################
+
+@SysPrependGraphic { diagf.lpg }
+@SysInclude { diagf.etc }
+
+export @Diag
+def @DiagSetup
+ named save { no }
+ named maxlabels { 200 }
+
+ import @Geometry named outline
+ named margin {}
+ named shadow {}
+ named sides {}
+ named angle {}
+ { box }
+ named margin { 0.6f }
+ import @Geometry named shadow { 0.4f }
+ import @Geometry named sides { 3 }
+ import @Geometry named angle { "dup 180 exch div" }
+ named translate { }
+ named outlinestyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { solid }
+ import @Geometry named outlinedashlength { 0.2f }
+ import @Geometry named outlinewidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { thin }
+ named paint { nopaint }
+ named font { }
+ named break { }
+ named format right @Body { @Body }
+
+ named valign { ctr }
+ named vsize { }
+ named vindent { ctr }
+ named vstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { no }
+ named vmargin { }
+ named topmargin { }
+ named footmargin { }
+
+ named halign { ctr }
+ named hsize { }
+ named hindent { ctr }
+ named hstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { no }
+ named hmargin { }
+ named leftmargin { }
+ named rightmargin { }
+
+ named nodelabel { }
+ named nodelabelmargin { 0.2f }
+ named nodelabelfont { -2p }
+ named nodelabelbreak { ragged nohyphen }
+ named nodelabelformat right @Body { @Body }
+ import @Geometry named nodelabelpos { }
+ named nodelabelprox { outside }
+ import @Geometry named nodelabelangle { horizontal }
+ named nodelabelctr { no }
+ import @Geometry named nodelabeladjust { 0 0 }
+
+ named alabel { }
+ named alabelmargin { }
+ named alabelfont { }
+ named alabelbreak { }
+ named alabelformat right @Body { }
+ import @Geometry named alabelpos { NE }
+ named alabelprox { }
+ import @Geometry named alabelangle { }
+ named alabelctr { }
+ import @Geometry named alabeladjust { }
+
+ named blabel { }
+ named blabelmargin { }
+ named blabelfont { }
+ named blabelbreak { }
+ named blabelformat right @Body { }
+ import @Geometry named blabelpos { NW }
+ named blabelprox { }
+ import @Geometry named blabelangle { }
+ named blabelctr { }
+ import @Geometry named blabeladjust { }
+
+ named clabel { }
+ named clabelmargin { }
+ named clabelfont { }
+ named clabelbreak { }
+ named clabelformat right @Body { }
+ import @Geometry named clabelpos { SW }
+ named clabelprox { }
+ import @Geometry named clabelangle { }
+ named clabelctr { }
+ import @Geometry named clabeladjust { }
+
+ named dlabel { }
+ named dlabelmargin { }
+ named dlabelfont { }
+ named dlabelbreak { }
+ named dlabelformat right @Body { }
+ import @Geometry named dlabelpos { SE }
+ named dlabelprox { }
+ import @Geometry named dlabelangle { }
+ named dlabelctr { }
+ import @Geometry named dlabeladjust { }
+
+ import @Geometry named path
+ named from {}
+ named to {}
+ named bias {}
+ named fbias {}
+ named tbias {}
+ named radius {}
+ named xindent {}
+ named zindent {}
+ named frompt {}
+ named topt {}
+ named arrow {}
+ named arrowlength {}
+ { line }
+ import @Geometry named from { 0,0 }
+ import @Geometry named to { 1,1 }
+ import @Geometry named bias { 2.0f }
+ import @Geometry named fbias { 2.0f }
+ import @Geometry named tbias { 2.0f }
+ import @Geometry named radius { 1.0f }
+ import @Geometry named xindent { 0.8f }
+ import @Geometry named zindent { 0.8f }
+ import @Geometry named frompt { 0 0 }
+ import @Geometry named topt { 0 0 }
+ named pathstyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { solid }
+ import @Geometry named pathdashlength { 0.2f }
+ import @Geometry named pathwidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { thin }
+ import @Geometry named pathgap
+ named thin { 0.08 ft }
+ named medium { 0.16 ft }
+ named thick { 0.24 ft }
+ { thin }
+ named arrow { no }
+ named arrowstyle { solid }
+ named arrowwidth { 0.3f }
+ named arrowlength { 0.5f }
+
+ named linklabel { }
+ named linklabelmargin { 0.2f }
+ named linklabelfont { -2p }
+ named linklabelbreak { ragged nohyphen }
+ named linklabelformat right @Body { @Body }
+ import @Geometry named linklabelpos { }
+ named linklabelprox { above }
+ import @Geometry named linklabelangle { horizontal }
+ named linklabelctr { no }
+ import @Geometry named linklabeladjust { 0 0 }
+
+ named xlabel { }
+ named xlabelmargin { }
+ named xlabelfont { }
+ named xlabelbreak { }
+ named xlabelformat right @Body { }
+ import @Geometry named xlabelpos { LFROM }
+ named xlabelprox { }
+ import @Geometry named xlabelangle { }
+ named xlabelctr { }
+ import @Geometry named xlabeladjust { }
+
+ named ylabel { }
+ named ylabelmargin { }
+ named ylabelfont { }
+ named ylabelbreak { }
+ named ylabelformat right @Body { }
+ import @Geometry named ylabelpos { LMID }
+ named ylabelprox { }
+ import @Geometry named ylabelangle { }
+ named ylabelctr { yes }
+ import @Geometry named ylabeladjust { }
+
+ named zlabel { }
+ named zlabelmargin { }
+ named zlabelfont { }
+ named zlabelbreak { }
+ named zlabelformat right @Body { }
+ import @Geometry named zlabelpos { LTO }
+ named zlabelprox { }
+ import @Geometry named zlabelangle { }
+ named zlabelctr { }
+ import @Geometry named zlabeladjust { }
+
+ named fromlabel { }
+ named fromlabelmargin { 0f }
+ named fromlabelfont { }
+ named fromlabelbreak { ragged nohyphen }
+ named fromlabelformat right @Body { @Body }
+ import @Geometry named fromlabelpos { FROM }
+ named fromlabelprox { W }
+ import @Geometry named fromlabelangle { antiparallel }
+ named fromlabelctr { no }
+ import @Geometry named fromlabeladjust { 0 0 }
+
+ named tolabel { }
+ named tolabelmargin { 0f }
+ named tolabelfont { }
+ named tolabelbreak { ragged nohyphen }
+ named tolabelformat right @Body { @Body }
+ import @Geometry named tolabelpos { TO }
+ named tolabelprox { W }
+ import @Geometry named tolabelangle { parallel }
+ named tolabelctr { no }
+ import @Geometry named tolabeladjust { 0 0 }
+
+ named treehsep { 0.5f }
+ named treevsep { 0.5f }
+ named treehindent
+ named left { 0.0rt }
+ named ctr { 0.5rt }
+ named right { 1.0rt }
+ { ctr }
+ named treevindent
+ named top { 0.0rt }
+ named ctr { 0.5rt }
+ named foot { 1.0rt }
+ { ctr }
+
+{
+
+ export "::" @ShowPoints @ShowTags @ShowDirections @CatchTags @Transform
+
+ @Tree @HTree
+
+ @Node
+ @Box @CurveBox @ShadowBox @Square @Diamond @Polygon
+ @Isosceles @Ellipse @Circle
+ @ArrowHead @SolidArrowHead @OpenArrowHead @HalfOpenArrowHead
+ @SolidCurvedArrowHead @OpenCurvedArrowHead @HalfOpenCurvedArrowHead
+ @CircleArrowHead @BoxArrowHead
+
+ @Link
+ @Line @DoubleLine @Arrow @DoubleArrow @Curve @CurveArrow
+ @ACurve @ACurveArrow @CCurve @CCurveArrow
+ @Bezier @BezierArrow
+ @HVLine @HVArrow @VHLine @VHArrow
+ @HVCurve @HVCurveArrow @VHCurve @VHCurveArrow
+ @LVRLine @LVRArrow @RVLLine @RVLArrow
+ @LVRCurve @LVRCurveArrow @RVLCurve @RVLCurveArrow
+ @DWrapLine @DWrapArrow @UWrapLine @UWrapArrow
+ @DWrapCurve @DWrapCurveArrow @UWrapCurve @UWrapCurveArrow
+
+ def @Diag
+ named save { save }
+ named maxlabels { maxlabels }
+
+ import @Geometry named outline
+ named margin {}
+ named shadow {}
+ named sides {}
+ named angle {}
+ { outline
+ margin { margin }
+ shadow { shadow }
+ sides { sides }
+ angle { angle }
+ }
+ named margin { margin }
+ import @Geometry named shadow { shadow }
+ import @Geometry named sides { sides }
+ import @Geometry named angle { angle }
+ named translate { translate }
+ named nodetag { }
+ named outlinestyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { outlinestyle }
+ import @Geometry named outlinedashlength{ outlinedashlength }
+ import @Geometry named outlinewidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { outlinewidth }
+ named paint { paint }
+ named font { font }
+ named break { break }
+ named format right @Body { format @Body }
+ named valign { valign }
+ named vsize { vsize }
+ named vindent { vindent }
+ named vstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { vstrut }
+ named vmargin { vmargin }
+ named topmargin { topmargin }
+ named footmargin { footmargin }
+ named halign { halign }
+ named hsize { hsize }
+ named hindent { hindent }
+ named hstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { hstrut }
+ named hmargin { hmargin }
+ named leftmargin { leftmargin }
+ named rightmargin { rightmargin }
+
+ import @Geometry named path
+ named from {}
+ named to {}
+ named bias {}
+ named fbias {}
+ named tbias {}
+ named radius {}
+ named xindent {}
+ named zindent {}
+ named frompt {}
+ named topt {}
+ named arrow {}
+ named arrowlength {}
+ { path
+ from { from }
+ to { to }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ arrow { arrow }
+ arrowlength { arrowlength }
+ }
+ import @Geometry named from { from }
+ import @Geometry named to { to }
+ import @Geometry named bias { bias }
+ import @Geometry named fbias { fbias }
+ import @Geometry named tbias { tbias }
+ import @Geometry named radius { radius }
+ import @Geometry named xindent { xindent }
+ import @Geometry named zindent { zindent }
+ import @Geometry named frompt { frompt }
+ import @Geometry named topt { topt }
+ named pathstyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { pathstyle }
+ import @Geometry named pathdashlength { pathdashlength }
+ import @Geometry named pathwidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { pathwidth }
+ import @Geometry named pathgap
+ named thin { 0.08 ft }
+ named medium { 0.16 ft }
+ named thick { 0.24 ft }
+ { pathgap }
+ named arrow { arrow }
+ named arrowstyle { arrowstyle }
+ named arrowwidth { arrowwidth }
+ named arrowlength { arrowlength }
+
+ named nodelabel { nodelabel }
+ named nodelabelmargin { nodelabelmargin }
+ named nodelabelfont { nodelabelfont }
+ named nodelabelbreak { nodelabelbreak }
+ named nodelabelformat right @Body { nodelabelformat @Body }
+ import @Geometry named nodelabelpos { nodelabelpos }
+ named nodelabelprox { nodelabelprox }
+ import @Geometry named nodelabelangle { nodelabelangle }
+ named nodelabelctr { nodelabelctr }
+ import @Geometry named nodelabeladjust { nodelabeladjust }
+
+ named alabel { alabel }
+ named alabelmargin { alabelmargin }
+ named alabelfont { alabelfont }
+ named alabelbreak { alabelbreak }
+ named alabelformat right @Body { alabelformat @Body }
+ import @Geometry named alabelpos { alabelpos }
+ named alabelprox { alabelprox }
+ import @Geometry named alabelangle { alabelangle }
+ named alabelctr { alabelctr }
+ import @Geometry named alabeladjust { alabeladjust }
+
+ named blabel { blabel }
+ named blabelmargin { blabelmargin }
+ named blabelfont { blabelfont }
+ named blabelbreak { blabelbreak }
+ named blabelformat right @Body { blabelformat @Body }
+ import @Geometry named blabelpos { blabelpos }
+ named blabelprox { blabelprox }
+ import @Geometry named blabelangle { blabelangle }
+ named blabelctr { blabelctr }
+ import @Geometry named blabeladjust { blabeladjust }
+
+ named clabel { clabel }
+ named clabelmargin { clabelmargin }
+ named clabelfont { clabelfont }
+ named clabelbreak { clabelbreak }
+ named clabelformat right @Body { clabelformat @Body }
+ import @Geometry named clabelpos { clabelpos }
+ named clabelprox { clabelprox }
+ import @Geometry named clabelangle { clabelangle }
+ named clabelctr { clabelctr }
+ import @Geometry named clabeladjust { clabeladjust }
+
+ named dlabel { dlabel }
+ named dlabelmargin { dlabelmargin }
+ named dlabelfont { dlabelfont }
+ named dlabelbreak { dlabelbreak }
+ named dlabelformat right @Body { dlabelformat @Body }
+ import @Geometry named dlabelpos { dlabelpos }
+ named dlabelprox { dlabelprox }
+ import @Geometry named dlabelangle { dlabelangle }
+ named dlabelctr { dlabelctr }
+ import @Geometry named dlabeladjust { dlabeladjust }
+
+ named fromlabel { fromlabel }
+ named fromlabelmargin { fromlabelmargin }
+ named fromlabelfont { fromlabelfont }
+ named fromlabelbreak { fromlabelbreak }
+ named fromlabelformat right @Body { fromlabelformat @Body }
+ import @Geometry named fromlabelpos { fromlabelpos }
+ named fromlabelprox { fromlabelprox }
+ import @Geometry named fromlabelangle { fromlabelangle }
+ named fromlabelctr { fromlabelctr }
+ import @Geometry named fromlabeladjust { fromlabeladjust }
+
+ named linklabel { linklabel }
+ named linklabelmargin { linklabelmargin }
+ named linklabelfont { linklabelfont }
+ named linklabelbreak { linklabelbreak }
+ named linklabelformat right @Body { linklabelformat @Body }
+ import @Geometry named linklabelpos { linklabelpos }
+ named linklabelprox { linklabelprox }
+ import @Geometry named linklabelangle { linklabelangle }
+ named linklabelctr { linklabelctr }
+ import @Geometry named linklabeladjust { linklabeladjust }
+
+ named xlabel { xlabel }
+ named xlabelmargin { xlabelmargin }
+ named xlabelfont { xlabelfont }
+ named xlabelbreak { xlabelbreak }
+ named xlabelformat right @Body { xlabelformat @Body }
+ import @Geometry named xlabelpos { xlabelpos }
+ named xlabelprox { xlabelprox }
+ import @Geometry named xlabelangle { xlabelangle }
+ named xlabelctr { xlabelctr }
+ import @Geometry named xlabeladjust { xlabeladjust }
+
+ named ylabel { ylabel }
+ named ylabelmargin { ylabelmargin }
+ named ylabelfont { ylabelfont }
+ named ylabelbreak { ylabelbreak }
+ named ylabelformat right @Body { ylabelformat @Body }
+ import @Geometry named ylabelpos { ylabelpos }
+ named ylabelprox { ylabelprox }
+ import @Geometry named ylabelangle { ylabelangle }
+ named ylabelctr { ylabelctr }
+ import @Geometry named ylabeladjust { ylabeladjust }
+
+ named zlabel { zlabel }
+ named zlabelmargin { zlabelmargin }
+ named zlabelfont { zlabelfont }
+ named zlabelbreak { zlabelbreak }
+ named zlabelformat right @Body { zlabelformat @Body }
+ import @Geometry named zlabelpos { zlabelpos }
+ named zlabelprox { zlabelprox }
+ import @Geometry named zlabelangle { zlabelangle }
+ named zlabelctr { zlabelctr }
+ import @Geometry named zlabeladjust { zlabeladjust }
+
+ named tolabel { tolabel }
+ named tolabelmargin { tolabelmargin }
+ named tolabelfont { tolabelfont }
+ named tolabelbreak { tolabelbreak }
+ named tolabelformat right @Body { tolabelformat @Body }
+ import @Geometry named tolabelpos { tolabelpos }
+ named tolabelprox { tolabelprox }
+ import @Geometry named tolabelangle { tolabelangle }
+ named tolabelctr { tolabelctr }
+ import @Geometry named tolabeladjust { tolabeladjust }
+
+ named treehsep { treehsep }
+ named treevsep { treevsep }
+ named treehindent
+ named left { 0.0rt }
+ named ctr { 0.5rt }
+ named right { 1.0rt }
+ { treehindent }
+ named treevindent
+ named top { 0.0rt }
+ named ctr { 0.5rt }
+ named foot { 1.0rt }
+ { treevindent }
+ 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 {
+ { ps q // Q } @Graphic x
+ }
+ }
+ }
+
+ def @BoxLabels right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "[ ldiagbox ] pop" @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @IfNonEmpty
+ left x
+ right y
+ {
+ x @Case {
+ "" @Yield @Null
+ else @Yield y
+ }
+ }
+
+ def @Else
+ precedence 20
+ associativity right
+ left x
+ right y
+ {
+ x @Case {
+ "" @Yield y
+ else @Yield x
+ }
+ }
+
+ def @ShowTags
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {
+ "() ldiagpushtagdict"
+ // "ldiagshowtags ldiagpopuptagdict"
+ } @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @ShowPoints
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {
+ "() ldiagpushtagdict"
+ // "ldiagshowpoints ldiagpopuptagdict"
+ } @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @ShowDirections
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "() ldiagpushtagdict"
+ // "ldiagshowangles ldiagpopuptagdict" } @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def "::"
+ precedence 33
+ associativity right
+ left name
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ { "("name") ldiagpushtagdict"
+ // "ldiagpopuptagdict" } @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @CatchTags
+ precedence 33
+ associativity right
+ right x
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {
+ "() ldiagpushtagdict"
+ // "ldiagpoptagdict"
+ }
+ @Graphic x
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @ZeroWidth right x
+ {
+ @HContract @VContract {
+ ^|0io @HContract @VContract x |0io
+ }
+ }
+
+ def @ZeroSize right x
+ {
+ @HContract @VContract {
+ ^/0io ^|0io @HContract @VContract x |0io /0io
+ }
+ }
+
+ def @FromArrowLength
+ left arrow
+ right arrowlength
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ arrow @Case {
+ { no yes forward } @Yield 0
+ { back both } @Yield {"("arrowlength") ldiagdecodelength"}
+ }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @ToArrowLength
+ left arrow
+ right arrowlength
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ arrow @Case {
+ { no back } @Yield 0
+ { yes forward both } @Yield {"("arrowlength") ldiagdecodelength"}
+ }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @AddMargins
+ named mtop {}
+ named mfoot {}
+ named mleft {}
+ named mright {}
+ right x
+ {
+
+ @HContract @VContract {
+ ^|mleft |mright
+ ^/mtop | x |
+ /mfoot | |
+ }
+ }
+
+ def @Transform
+ precedence 32
+ import @Geometry named translate
+# named to precedence 10 left x right y { x y "ldiagpsub" }
+ named to precedence 10 left x right y {
+ @BackEnd @Case {
+ PostScript @Yield { x y "ldiagpsub" }
+ PDF @Yield {""}
+ }
+ }
+ {}
+ import @Geometry named rotate { 0d }
+ named scale { 1 1 }
+ right x
+ {
+ @BackEnd @Case {
+
+ PostScript @Yield {
+ { rotate "rotate" scale "scale newpath clip" }
+ @InnerGraphic
+ {
+ @ZeroSize x
+ }
+ //
+ # { rotate "rotate" scale "scale" translate "translate" }
+ { translate "translate" rotate "rotate" scale "scale" }
+ @InnerGraphic
+ {
+ @ZeroSize x
+ }
+ }
+
+ PDF @Yield { # presume that "rotate", "scale" and "translate" are not matrices
+ { "__cos("rotate") __sin("rotate") __sub(0, __sin("rotate")) __cos("rotate") 0 0 cm"
+ "__pick(1, "scale") 0 0 __pick(2, "scale") 0 0 cm n W" }
+ @InnerGraphic
+ {
+ @ZeroSize x
+ }
+ //
+ # { rotate "rotate" scale "scale" translate "translate" }
+ { "1 0 0 1 "translate" cm"
+ "__cos("rotate") __sin("rotate") __sub(0, __sin("rotate")) __cos("rotate") 0 0 cm"
+ "__pick(1, "scale") 0 0 __pick(2, "scale") 0 0 cm" }
+ @InnerGraphic
+ {
+ @ZeroSize x
+ }
+ }
+
+ }
+ }
+
+ def @DoLabel
+ named which {}
+ named labeltag { LABEL }
+ named label {}
+ named labelmargin {}
+ named labelfont {}
+ named labelbreak {}
+ named labelformat right @Body {}
+ named labelpos {}
+ named labelprox {}
+ named labelangle {}
+ named labelctr {}
+ named labeladjust {}
+ {
+
+ import @Geometry
+ def alignedangle
+ {
+ labelpos??"ANGLE" quadcase
+ 0 { labelpos??"ANGLE" }
+ 0-90 { labelpos??"ANGLE" }
+ 90 { labelpos??"ANGLE" }
+ 90-180 { labelpos??"ANGLE" + 180d }
+ 180 { labelpos??"ANGLE" + 180d }
+ 180-270 { labelpos??"ANGLE" + 180d }
+ 270 { labelpos??"ANGLE" + 180d }
+ 270-360 { labelpos??"ANGLE" }
+ }
+
+ import @Geometry
+ def perpalignedangle
+ {
+ labelpos??"ANGLE" quadcase
+ 0 { labelpos??"ANGLE" - 90d }
+ 0-90 { labelpos??"ANGLE" - 90d }
+ 90 { labelpos??"ANGLE" - 90d }
+ 90-180 { labelpos??"ANGLE" - 90d }
+ 180 { labelpos??"ANGLE" + 90d }
+ 180-270 { labelpos??"ANGLE" + 90d }
+ 270 { labelpos??"ANGLE" + 90d }
+ 270-360 { labelpos??"ANGLE" + 90d }
+
+ }
+
+ import @Geometry
+ def finalangle
+ {
+ labelangle @Case {
+
+ "horizontal" @Yield { 0d }
+ "aligned" @Yield { alignedangle }
+ "perpendicular" @Yield { perpalignedangle }
+ "parallel" @Yield { labelpos??"ANGLE" }
+ "antiparallel" @Yield { labelpos??"ANGLE" + 180d }
+ else @Yield labelangle
+ }
+ }
+
+ import @Geometry
+ def @AlignedAboveProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (SE) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (SE) }
+ }
+ else @Yield (S)
+ }
+ }
+
+ import @Geometry
+ def @AlignedBelowProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (NE) }
+ 180 { (NE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (NW) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (NE) }
+ }
+ else @Yield (N)
+ }
+ }
+
+ import @Geometry
+ def @AlignedLeftProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (NE) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (NW) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (NE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (S) }
+ 90 { (S) }
+ 90-180 { (N) }
+ 180 { (S) }
+ 180-270 { (S) }
+ 270 { (S) }
+ 270-360 { (N) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @AlignedRightProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (SE) }
+ 180 { (SE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (SE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (N) }
+ 90 { (N) }
+ 90-180 { (S) }
+ 180 { (S) }
+ 180-270 { (N) }
+ 270 { (N) }
+ 270-360 { (S) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @AlignedInsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (NE) }
+ 180 { (NE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (NW) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (SE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (S) }
+ 90 { (S) }
+ 90-180 { (N) }
+ 180 { (N) }
+ 180-270 { (N) }
+ 270 { (N) }
+ 270-360 { (S) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @AlignedOutsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (SE) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (NE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (N) }
+ 0-90 { (N) }
+ 90 { (N) }
+ 90-180 { (S) }
+ 180 { (S) }
+ 180-270 { (S) }
+ 270 { (S) }
+ 270-360 { (N) }
+ }
+ }
+ }
+
+
+ import @Geometry
+ def @PerpendicularAboveProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (SW) }
+ 180 { (NE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (NW) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (SW) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (E) }
+ 0-90 { (E) }
+ 90 { (E) }
+ 90-180 { (W) }
+ 180 { (E) }
+ 180-270 { (E) }
+ 270 { (E) }
+ 270-360 { (W) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @PerpendicularBelowProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (SE) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (NE) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (SE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (W) }
+ 0-90 { (W) }
+ 90 { (W) }
+ 90-180 { (E) }
+ 180 { (W) }
+ 180-270 { (W) }
+ 270 { (W) }
+ 270-360 { (E) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @PerpendicularLeftProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (SE) }
+ 180 { (NE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (NE) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (SE) }
+ }
+ else @Yield (E)
+ }
+ }
+
+ import @Geometry
+ def @PerpendicularRightProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (SW) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (NW) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (SW) }
+ }
+ else @Yield (W)
+ }
+ }
+
+ import @Geometry
+ def @PerpendicularInsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (SE) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (NW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NE) }
+ 90 { (NE) }
+ 90-180 { (NE) }
+ 180 { (SW) }
+ 180-270 { (SW) }
+ 270 { (SW) }
+ 270-360 { (SW) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (E) }
+ 0-90 { (E) }
+ 90 { (E) }
+ 90-180 { (E) }
+ 180 { (W) }
+ 180-270 { (W) }
+ 270 { (W) }
+ 270-360 { (W) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @PerpendicularOutsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SW) }
+ 90 { (SW) }
+ 90-180 { (SW) }
+ 180 { (NE) }
+ 180-270 { (NE) }
+ 270 { (NE) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (NW) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (SE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (W) }
+ 0-90 { (W) }
+ 90 { (W) }
+ 90-180 { (W) }
+ 180 { (E) }
+ 180-270 { (E) }
+ 270 { (E) }
+ 270-360 { (E) }
+ }
+ }
+ }
+
+
+ import @Geometry
+ def @OtherAboveProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SE) }
+ 90 { (SW) }
+ 90-180 { (SW) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (NW) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (NW) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (SE) }
+ 270 { (SW) }
+ 270-360 { (SW) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (SE) }
+ 90 { (W) }
+ 90-180 { (SW) }
+ 180 { (S) }
+ 180-270 { (SE) }
+ 270 { (W) }
+ 270-360 { (SW) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @OtherBelowProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (SW) }
+ 90-180 { (NE) }
+ 180 { (NE) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (NE) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (SW) }
+ 270-360 { (NE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (N) }
+ 0-90 { (NW) }
+ 90 { (W) }
+ 90-180 { (NE) }
+ 180 { (N) }
+ 180-270 { (NW) }
+ 270 { (W) }
+ 270-360 { (NE) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @OtherLeftProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (NE) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (NE) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (NE) }
+ 90-180 { (NE) }
+ 180 { (SW) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (NE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (SE) }
+ 90 { (E) }
+ 90-180 { (NE) }
+ 180 { (S) }
+ 180-270 { (SE) }
+ 270 { (E) }
+ 270-360 { (NE) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @OtherRightProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (NW) }
+ 90 { (SW) }
+ 90-180 { (SW) }
+ 180 { (SE) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (NW) }
+ 270 { (SW) }
+ 270-360 { (SW) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (NW) }
+ 90 { (W) }
+ 90-180 { (SW) }
+ 180 { (S) }
+ 180-270 { (NW) }
+ 270 { (W) }
+ 270-360 { (SW) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @OtherInsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (SW) }
+ 0-90 { (SE) }
+ 90 { (SE) }
+ 90-180 { (NE) }
+ 180 { (NE) }
+ 180-270 { (NW) }
+ 270 { (NW) }
+ 270-360 { (SW) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (SE) }
+ 0-90 { (SE) }
+ 90 { (NE) }
+ 90-180 { (NE) }
+ 180 { (NW) }
+ 180-270 { (NW) }
+ 270 { (SW) }
+ 270-360 { (SW) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (S) }
+ 0-90 { (SE) }
+ 90 { (E) }
+ 90-180 { (NE) }
+ 180 { (N) }
+ 180-270 { (NW) }
+ 270 { (W) }
+ 270-360 { (SW) }
+ }
+ }
+ }
+
+ import @Geometry
+ def @OtherOutsideProximity
+ {
+ which @Case {
+ { x f } @Yield { labelpos??ANGLE quadcase
+ 0 { (NW) }
+ 0-90 { (NW) }
+ 90 { (SW) }
+ 90-180 { (SW) }
+ 180 { (SE) }
+ 180-270 { (SE) }
+ 270 { (NE) }
+ 270-360 { (NE) }
+ }
+ { z t } @Yield { labelpos??ANGLE quadcase
+ 0 { (NE) }
+ 0-90 { (NW) }
+ 90 { (NW) }
+ 90-180 { (SW) }
+ 180 { (SW) }
+ 180-270 { (SE) }
+ 270 { (SE) }
+ 270-360 { (NE) }
+ }
+ else @Yield { labelpos??ANGLE quadcase
+ 0 { (N) }
+ 0-90 { (NW) }
+ 90 { (W) }
+ 90-180 { (SW) }
+ 180 { (S) }
+ 180-270 { (SE) }
+ 270 { (E) }
+ 270-360 { (NE) }
+ }
+ }
+ }
+
+
+ import @Geometry
+ def @AboveProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedAboveProximity
+ "perpendicular" @Yield @PerpendicularAboveProximity
+ else @Yield @OtherAboveProximity
+ }
+ }
+
+ import @Geometry
+ def @BelowProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedBelowProximity
+ "perpendicular" @Yield @PerpendicularBelowProximity
+ else @Yield @OtherBelowProximity
+ }
+ }
+
+ import @Geometry
+ def @LeftProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedLeftProximity
+ "perpendicular" @Yield @PerpendicularLeftProximity
+ else @Yield @OtherLeftProximity
+ }
+ }
+
+ import @Geometry
+ def @RightProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedRightProximity
+ "perpendicular" @Yield @PerpendicularRightProximity
+ else @Yield @OtherRightProximity
+ }
+ }
+
+ import @Geometry
+ def @InsideProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedInsideProximity
+ "perpendicular" @Yield @PerpendicularInsideProximity
+ else @Yield @OtherInsideProximity
+ }
+ }
+
+ import @Geometry
+ def @OutsideProximity
+ {
+ labelangle @Case {
+ "aligned" @Yield @AlignedOutsideProximity
+ "perpendicular" @Yield @PerpendicularOutsideProximity
+ else @Yield @OtherOutsideProximity
+ }
+ }
+
+ import @Geometry
+ def proximity
+ {
+ labelprox @Case {
+ above @Yield @AboveProximity
+ below @Yield @BelowProximity
+ left @Yield @LeftProximity
+ right @Yield @RightProximity
+ inside @Yield @InsideProximity
+ outside @Yield @OutsideProximity
+ else @Yield { "("labelprox")" }
+ }
+ }
+
+ import @Geometry
+ def dorotate
+ left point
+ right angle
+ {
+ { {0 0} distance point } atangle { {0 0} angleto point + angle }
+ }
+
+ import @Geometry
+ def translation
+ {
+ labelctr @Case {
+ { no No } @Yield {
+ labelpos -- labeltag?!?proximity
+ }
+ { yes Yes } @Yield {
+ #P0 := labelpos
+ #P1 := labeltag?!?proximity -- P0
+ #P2 := labeltag??CTR -- P0
+ #TH := labelpos??ANGLE
+ #P1A := P1 dorotate { 0 - TH }
+ #P2A := P2 dorotate { 0 - TH }
+ #PRA := { 0 - xcoord P2A 0 - ycoord P1A }
+ #PRA dorotate TH ++ P0
+ XP1 := labeltag?!?proximity
+ XP2 := labeltag??CTR
+ XANG := labelpos??ANGLE
+ XTH := XANG - 90d - { XP1 angleto XP2 }
+ XDIST := { XP1 distance XP2 } * sin XTH
+ labelpos -- XP1 ++ XDIST atangle XANG
+ }
+ }
+ }
+
+ @CatchTags @ZeroSize @Transform
+ translate { translation ++ labeladjust }
+ rotate { finalangle }
+ scale { 1 1 }
+ labeltag:: @BoxLabels @CatchTags @AddMargins
+ mtop { labelmargin }
+ mfoot { labelmargin }
+ mleft { labelmargin }
+ mright { labelmargin }
+ labelfont @Font labelbreak @Break labelformat label
+ }
+
+
+ def @Node
+ import @Geometry named translate
+# named to precedence 10 left x right y { x y "ldiagpsub" }
+ named to precedence 10 left x right y {
+ @BackEnd @Case {
+ PostScript @Yield { x y "ldiagpsub" }
+ PDF @Yield {""}
+ }
+ }
+ {}
+ import @Geometry named rotate { 0d }
+ import @Geometry named outline
+ named margin {}
+ named shadow {}
+ named sides {}
+ named angle {}
+ { outline
+ margin { margin }
+ shadow { shadow }
+ sides { sides }
+ angle { angle }
+ }
+ named margin { margin }
+ import @Geometry named shadow { shadow }
+ import @Geometry named sides { sides }
+ import @Geometry named angle { angle }
+ named nodetag { nodetag }
+ named outlinestyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { outlinestyle }
+ import @Geometry named outlinedashlength { outlinedashlength}
+ import @Geometry named outlinewidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { outlinewidth }
+ named paint { paint }
+ named font { font }
+ named break { break }
+ named format right @Body { format @Body }
+ named valign { valign }
+ named vsize { vsize }
+ named vindent { vindent }
+ named vstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { vstrut }
+ named vmargin { vmargin }
+ named topmargin { topmargin }
+ named footmargin { footmargin }
+
+ named halign { halign }
+ named hsize { hsize }
+ named hindent { hindent }
+ named hstrut
+ named no { 0.0f }
+ named yes { 1.0f }
+ { hstrut }
+ named hmargin { hmargin }
+ named leftmargin { leftmargin }
+ named rightmargin { rightmargin }
+
+ named nodelabel { nodelabel }
+ named nodelabelmargin { nodelabelmargin }
+ named nodelabelfont { nodelabelfont }
+ named nodelabelbreak { nodelabelbreak }
+ named nodelabelformat right @Body { nodelabelformat @Body }
+ import @Geometry named nodelabelpos { nodelabelpos }
+ named nodelabelprox { nodelabelprox }
+ import @Geometry named nodelabelangle { nodelabelangle }
+ named nodelabelctr { nodelabelctr }
+ import @Geometry named nodelabeladjust { nodelabeladjust }
+
+ named alabel { alabel }
+ named alabelmargin { alabelmargin }
+ named alabelfont { alabelfont }
+ named alabelbreak { alabelbreak }
+ named alabelformat right @Body { alabelformat @Body }
+ import @Geometry named alabelpos { alabelpos }
+ named alabelprox { alabelprox }
+ import @Geometry named alabelangle { alabelangle }
+ named alabelctr { alabelctr }
+ import @Geometry named alabeladjust { alabeladjust }
+
+ named blabel { blabel }
+ named blabelmargin { blabelmargin }
+ named blabelfont { blabelfont }
+ named blabelbreak { blabelbreak }
+ named blabelformat right @Body { blabelformat @Body }
+ import @Geometry named blabelpos { blabelpos }
+ named blabelprox { blabelprox }
+ import @Geometry named blabelangle { blabelangle }
+ named blabelctr { blabelctr }
+ import @Geometry named blabeladjust { blabeladjust }
+
+ named clabel { clabel }
+ named clabelmargin { clabelmargin }
+ named clabelfont { clabelfont }
+ named clabelbreak { clabelbreak }
+ named clabelformat right @Body { clabelformat @Body }
+ import @Geometry named clabelpos { clabelpos }
+ named clabelprox { clabelprox }
+ import @Geometry named clabelangle { clabelangle }
+ named clabelctr { clabelctr }
+ import @Geometry named clabeladjust { clabeladjust }
+
+ named dlabel { dlabel }
+ named dlabelmargin { dlabelmargin }
+ named dlabelfont { dlabelfont }
+ named dlabelbreak { dlabelbreak }
+ named dlabelformat right @Body { dlabelformat @Body }
+ import @Geometry named dlabelpos { dlabelpos }
+ named dlabelprox { dlabelprox }
+ import @Geometry named dlabelangle { dlabelangle }
+ named dlabelctr { dlabelctr }
+ import @Geometry named dlabeladjust { dlabeladjust }
+
+ right @Body
+ {
+
+ def @LabelPos
+ left x
+ right y
+ {
+ nodelabelpos @Case {
+ x @Yield y
+ else @Yield ""
+ }
+ }
+
+ def @If
+ left cond
+ right x
+ {
+ cond @Case {
+ { yes Yes } @Yield x
+ else @Yield ""
+ }
+ }
+
+
+ def @Strut right x
+ {
+ def vs { 0.5w @VShift { vstrut @High } }
+ def hs { hstrut @Wide }
+
+ @HContract @VContract {
+ @HContract @VContract x | vs / hs |
+ }
+ }
+
+ def @Indent right x
+ {
+ x @Case {
+ { top left } @Yield 0.0rt
+ { ctr } @Yield 0.5rt
+ { foot right } @Yield 1.0rt
+ { mctr } @Yield 0.5bx
+ else @Yield x
+ }
+ }
+
+ def @VSize right x
+ {
+ vsize @Case {
+ "" @Yield x
+ else @Yield { vsize @High { /{@Indent vindent} x / } }
+ }
+ }
+
+ def @HSize right x
+ {
+ hsize @Case {
+ "" @Yield x
+ else @Yield { hsize @Wide { |{@Indent hindent} x | } }
+ }
+ }
+
+ def @Align right x
+ {
+ x @Case {
+ { top left } @Yield 0.0w
+ { ctr } @Yield 0.5w
+ { foot right } @Yield 1.0w
+ { mark } @Yield "+0i"
+ else @Yield x
+ }
+ }
+
+ def @ALabel
+ {
+ @DoLabel
+ which { "a" }
+ label { alabel @Else nodelabel }
+ labelmargin { alabelmargin @Else nodelabelmargin }
+ labelfont { alabelfont @Else nodelabelfont }
+ labelbreak { alabelbreak @Else nodelabelbreak }
+ labelformat { alabelformat @Body @Else nodelabelformat @Body}
+ labelpos { alabelpos @Else nodelabelpos }
+ labelprox { alabelprox @Else nodelabelprox }
+ labelangle { alabelangle @Else nodelabelangle }
+ labelctr { alabelctr @Else nodelabelctr }
+ labeladjust { alabeladjust @Else nodelabeladjust }
+ }
+
+ def @BLabel
+ {
+ @DoLabel
+ which { "b" }
+ label { blabel @Else nodelabel }
+ labelmargin { blabelmargin @Else nodelabelmargin }
+ labelfont { blabelfont @Else nodelabelfont }
+ labelbreak { blabelbreak @Else nodelabelbreak }
+ labelformat { blabelformat @Body @Else nodelabelformat @Body}
+ labelpos { blabelpos @Else nodelabelpos }
+ labelprox { blabelprox @Else nodelabelprox }
+ labelangle { blabelangle @Else nodelabelangle }
+ labelctr { blabelctr @Else nodelabelctr }
+ labeladjust { blabeladjust @Else nodelabeladjust }
+ }
+
+ def @CLabel
+ {
+ @DoLabel
+ which { "c" }
+ label { clabel @Else nodelabel }
+ labelmargin { clabelmargin @Else nodelabelmargin }
+ labelfont { clabelfont @Else nodelabelfont }
+ labelbreak { clabelbreak @Else nodelabelbreak }
+ labelformat { clabelformat @Body @Else nodelabelformat @Body}
+ labelpos { clabelpos @Else nodelabelpos }
+ labelprox { clabelprox @Else nodelabelprox }
+ labelangle { clabelangle @Else nodelabelangle }
+ labelctr { clabelctr @Else nodelabelctr }
+ labeladjust { clabeladjust @Else nodelabeladjust }
+ }
+
+ def @DLabel
+ {
+ @DoLabel
+ which { "d" }
+ label { dlabel @Else nodelabel }
+ labelmargin { dlabelmargin @Else nodelabelmargin }
+ labelfont { dlabelfont @Else nodelabelfont }
+ labelbreak { dlabelbreak @Else nodelabelbreak }
+ labelformat { dlabelformat @Body @Else nodelabelformat @Body}
+ labelpos { dlabelpos @Else nodelabelpos }
+ labelprox { dlabelprox @Else nodelabelprox }
+ labelangle { dlabelangle @Else nodelabelangle }
+ labelctr { dlabelctr @Else nodelabelctr }
+ labeladjust { dlabeladjust @Else nodelabeladjust }
+ }
+
+ import @Geometry
+ def @OutLine
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ outline @Case {
+ box @Yield { "ldiagbox" }
+ curvebox @Yield { "("margin") ldiagcurvebox" }
+ shadowbox @Yield { shadow "ldiagshadow ldiagbox" }
+ square @Yield { "ldiagsquare" }
+ diamond @Yield { "ldiagdiamond" }
+ polygon @Yield { sides angle "ldiagpolygon" }
+ isosceles @Yield { "ldiagisosceles" }
+ ellipse @Yield { "ldiagellipse" }
+ circle @Yield { "ldiagcircle" }
+ else @Yield {
+ outline
+ margin { "("margin") ldiagdecodelength" }
+ shadow { shadow }
+ sides { sides }
+ angle { angle }
+ }
+ }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @Value
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ @HContract @VContract
+ {
+ {
+ "ldiagnodebegin [" @OutLine "]"
+ outlinedashlength "[" outlinestyle "]"
+ outlinewidth "/ldiag"paint "ldiagnodeend"
+ "(IN) ldiagpushtagdict"
+ //
+ "ldiagpopuptagdict"
+ }
+ @Graphic
+ {
+ {@Align valign} @VShift {@Align halign} @HShift
+ @AddMargins
+ mtop { topmargin @Else vmargin @Else margin }
+ mfoot { footmargin @Else vmargin @Else margin }
+ mleft { leftmargin @Else hmargin @Else margin }
+ mright { rightmargin @Else hmargin @Else margin }
+ @HSize @VSize @HContract @VContract
+ font @Font break @Break format @Strut @Body
+ }
+ / {alabel @Else nodelabel} @IfNonEmpty @ALabel
+ / {blabel @Else nodelabel} @IfNonEmpty @BLabel
+ / {clabel @Else nodelabel} @IfNonEmpty @CLabel
+ / {dlabel @Else nodelabel} @IfNonEmpty @DLabel
+ }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ def @TValue
+ {
+ nodetag @Case {
+ "" @Yield @Value
+ else @Yield { nodetag:: @Value }
+ }
+ }
+
+ translate @Case {
+ "" @Yield @TValue
+ else @Yield {
+ @Null & # so that preceding space gets chewed up
+ @Transform translate { translate } rotate { rotate } @TValue
+ }
+ }
+ }
+
+ macro @@Node { @Node }
+ macro @Box { @Node outline { box } }
+ macro @CurveBox { @Node outline { curvebox } }
+ macro @ShadowBox { @Node outline { shadowbox } }
+ macro @Square { @Node outline { square } }
+ macro @Diamond { @Node outline { diamond } }
+ macro @Polygon { @Node outline { polygon } }
+ macro @Isosceles { @Node outline { isosceles } }
+ macro @Ellipse { @Node outline { ellipse } }
+ macro @Circle { @Node outline { circle } }
+
+
+ macro @InsulatedNode {
+ @Node
+ topmargin { 0i }
+ footmargin { 0i }
+ leftmargin { 0i }
+ rightmargin { 0i }
+ alabel {}
+ blabel {}
+ clabel {}
+ dlabel {}
+ hsize {}
+ vsize {}
+ vstrut { no }
+ hstrut { no }
+ }
+
+ def @SolidArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ paint { nochange }
+ outlinestyle { noline }
+ outlinewidth { pathwidth }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "ldiagsolidarrowhead"
+ # 0 0 xsize ysize * 0.5 0 ysize
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @OpenArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinewidth { pathwidth }
+ outlinestyle { noline }
+ paint { nochange }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ pathwidth "ldiagopenarrowhead"
+
+ # PSW := { 0 0 }
+ # PNW := { 0 ysize }
+ # PE := { xsize ysize*0.5 }
+ # REL := pathwidth atangle { PE angleto PNW + 90d }
+ # PNA := { 0 ysize*0.5 + pathwidth*0.5 }
+ # PSA := { 0 ysize*0.5 - pathwidth*0.5 }
+ # PNI := {
+ # PNA PNA ++ { xsize 0 }
+ # PNW ++ REL PE ++ REL ldiaglineintersect
+ # }
+ # PSI := PNI -- { 0 pathwidth }
+ #
+ # PSW PE PNW PNI PNA PSA PSI PSW
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @HalfOpenArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ paint { nochange }
+ outlinestyle { noline }
+ outlinewidth { pathwidth }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ pathwidth "ldiaghalfopenarrowhead"
+
+ # 0 0
+ # xsize ysize * 0.5
+ # 0 ysize
+ # xsize*0.3 ysize*0.5 + pathwidth*0.5
+ # 0 ysize*0.5 + pathwidth*0.5
+ # 0 ysize*0.5 - pathwidth*0.5
+ # xsize*0.3 ysize*0.5 - pathwidth*0.5
+ # 0 0
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @SolidCurvedArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinestyle { noline }
+ paint { nochange }
+ outlinewidth { pathwidth }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ "ldiagsolidcurvedarrowhead"
+ # 0 0
+ # [0 0 xsize ysize * 0.5 "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" clockwise]
+ # xsize ysize * 0.5
+ # [xsize ysize * 0.5 0 ysize "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" clockwise]
+ # 0 ysize
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @OpenCurvedArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinestyle { noline }
+ paint { nochange }
+ outlinewidth { pathwidth }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ pathwidth "ldiagopencurvedarrowhead"
+ # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" }
+ # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" }
+ # PW2 := pathwidth * 0.5
+ # UMID := {
+ # 0 ysize * 0.5 + PW2 xsize ysize * 0.5 + PW2
+ # {0 ysize} ++ 1f atangle { UR angleto {0 ysize} + 90d }
+ # { 0 ysize } ldiaglineintersect
+ # }
+ # LMID := UMID -- { 0 pathwidth }
+ # 0 0
+ # [LR clockwise]
+ # xsize ysize * 0.5
+ # [UR clockwise]
+ # 0 ysize
+ # UMID
+ # 0 ysize * 0.5 + PW2
+ # 0 ysize * 0.5 - PW2
+ # LMID
+ # 0 0
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @HalfOpenCurvedArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinestyle { noline }
+ paint { nochange }
+ outlinewidth { pathwidth }
+ outline {
+ @BackEnd @Case {
+ PostScript @Yield {
+ pathwidth "ldiaghalfopencurvedarrowhead"
+ # LR:= { 0 0 xsize ysize * 0.5 "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" }
+ # UR:= { xsize ysize * 0.5 0 ysize "ldiaglinebetween"
+ # xsize 0 xsize ysize "ldiaglineintersect" }
+ # BR:= { 0 0 LR 0 ysize UR "ldiaglineintersect" }
+ # BRAD := { 0 0 } distance BR
+ # PW2 := pathwidth * 0.5
+ # XDIST := sqrt { BRAD*BRAD - PW2*PW2 }
+ # UMID := BR ++ { XDIST PW2 }
+ # LMID := BR ++ { XDIST 0 - PW2 }
+ # 0 0
+ # [LR clockwise]
+ # xsize ysize * 0.5
+ # [UR clockwise]
+ # 0 ysize
+ # [BR clockwise ]
+ # UMID
+ # 0 ysize * 0.5 + PW2
+ # 0 ysize * 0.5 - PW2
+ # LMID
+ # [BR clockwise ]
+ # 0 0
+ }
+ PDF @Yield {}
+ }
+ }
+ {
+ length @Wide width @High
+ }
+ }
+
+ def @CircleArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinestyle { noline }
+ paint { nochange }
+ outlinewidth { pathwidth }
+ outline { circle }
+ { length @Wide length @High }
+ }
+
+ def @BoxArrowHead
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ @InsulatedNode
+ outlinestyle { noline }
+ paint { nochange }
+ outlinewidth { pathwidth }
+ outline { box }
+ { length @Wide width @High }
+ }
+
+ def @ArrowHead
+ named style { arrowstyle }
+ named width { arrowwidth }
+ named length { arrowlength }
+ named pathwidth { pathwidth }
+ {
+ style @Case {
+ solid @Yield @SolidArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ halfopen @Yield @HalfOpenArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ open @Yield @OpenArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ curvedsolid @Yield @SolidCurvedArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ curvedhalfopen @Yield @HalfOpenCurvedArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ curvedopen @Yield @OpenCurvedArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ circle @Yield @CircleArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ box @Yield @BoxArrowHead
+ width { width } length { length }
+ pathwidth { pathwidth }
+ }
+ }
+
+ def @Link
+ import @Geometry named path
+ named from {}
+ named to {}
+ named bias {}
+ named fbias {}
+ named tbias {}
+ named radius {}
+ named xindent {}
+ named zindent {}
+ named frompt {}
+ named topt {}
+ named arrow {}
+ named arrowlength {}
+ { path
+ from { from }
+ to { to }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ arrow { arrow }
+ arrowlength { arrowlength }
+ }
+ import @Geometry named from { from }
+ import @Geometry named to { to }
+ import @Geometry named bias { bias }
+ import @Geometry named fbias { fbias }
+ import @Geometry named tbias { tbias }
+ import @Geometry named radius { radius }
+ import @Geometry named xindent { xindent }
+ import @Geometry named zindent { zindent }
+ import @Geometry named frompt { frompt }
+ import @Geometry named topt { topt }
+ named pathstyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { pathstyle }
+ import @Geometry named pathdashlength { pathdashlength }
+ import @Geometry named pathwidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { pathwidth }
+ import @Geometry named pathgap
+ named thin { 0.08 ft }
+ named medium { 0.16 ft }
+ named thick { 0.24 ft }
+ { pathgap }
+
+ named arrow { arrow }
+ named arrowstyle { arrowstyle }
+ named arrowwidth { arrowwidth }
+ named arrowlength { arrowlength }
+
+ named linklabel { linklabel }
+ named linklabelmargin { linklabelmargin }
+ named linklabelfont { linklabelfont }
+ named linklabelbreak { linklabelbreak }
+ named linklabelformat right @Body { linklabelformat @Body }
+ import @Geometry named linklabelpos { linklabelpos }
+ named linklabelprox { linklabelprox }
+ import @Geometry named linklabelangle { linklabelangle }
+ named linklabelctr { linklabelctr }
+ import @Geometry named linklabeladjust { linklabeladjust }
+
+ named xlabel { xlabel }
+ named xlabelmargin { xlabelmargin }
+ named xlabelfont { xlabelfont }
+ named xlabelbreak { xlabelbreak }
+ named xlabelformat right @Body { xlabelformat @Body }
+ import @Geometry named xlabelpos { xlabelpos }
+ named xlabelprox { xlabelprox }
+ import @Geometry named xlabelangle { xlabelangle }
+ named xlabelctr { xlabelctr }
+ import @Geometry named xlabeladjust { xlabeladjust }
+
+ named ylabel { ylabel }
+ named ylabelmargin { ylabelmargin }
+ named ylabelfont { ylabelfont }
+ named ylabelbreak { ylabelbreak }
+ named ylabelformat right @Body { ylabelformat @Body }
+ import @Geometry named ylabelpos { ylabelpos }
+ named ylabelprox { ylabelprox }
+ import @Geometry named ylabelangle { ylabelangle }
+ named ylabelctr { ylabelctr }
+ import @Geometry named ylabeladjust { ylabeladjust }
+
+ named zlabel { zlabel }
+ named zlabelmargin { zlabelmargin }
+ named zlabelfont { zlabelfont }
+ named zlabelbreak { zlabelbreak }
+ named zlabelformat right @Body { zlabelformat @Body }
+ import @Geometry named zlabelpos { zlabelpos }
+ named zlabelprox { zlabelprox }
+ import @Geometry named zlabelangle { zlabelangle }
+ named zlabelctr { zlabelctr }
+ import @Geometry named zlabeladjust { zlabeladjust }
+
+ named fromlabel { fromlabel }
+ named fromlabelmargin { fromlabelmargin }
+ named fromlabelfont { fromlabelfont }
+ named fromlabelbreak { fromlabelbreak }
+ named fromlabelformat right @Body { fromlabelformat @Body }
+ import @Geometry named fromlabelpos { fromlabelpos }
+ named fromlabelprox { fromlabelprox }
+ import @Geometry named fromlabelangle { fromlabelangle }
+ named fromlabelctr { fromlabelctr }
+ import @Geometry named fromlabeladjust { fromlabeladjust }
+
+ named tolabel { tolabel }
+ named tolabelmargin { tolabelmargin }
+ named tolabelfont { tolabelfont }
+ named tolabelbreak { tolabelbreak }
+ named tolabelformat right @Body { tolabelformat @Body }
+ import @Geometry named tolabelpos { tolabelpos }
+ named tolabelprox { tolabelprox }
+ import @Geometry named tolabelangle { tolabelangle }
+ named tolabelctr { tolabelctr }
+ import @Geometry named tolabeladjust{ tolabeladjust }
+
+ {
+ def @XLabel
+ {
+ @DoLabel
+ which { "x" }
+ label { xlabel @Else linklabel }
+ labelmargin { xlabelmargin @Else linklabelmargin }
+ labelfont { xlabelfont @Else linklabelfont }
+ labelbreak { xlabelbreak @Else linklabelbreak }
+ labelformat { xlabelformat @Body @Else linklabelformat @Body}
+ labelpos { xlabelpos @Else linklabelpos }
+ labelprox { xlabelprox @Else linklabelprox }
+ labelangle { xlabelangle @Else linklabelangle }
+ labelctr { xlabelctr @Else linklabelctr }
+ labeladjust { xlabeladjust @Else linklabeladjust }
+ }
+
+ def @YLabel
+ {
+ @DoLabel
+ which { "y" }
+ label { ylabel @Else linklabel }
+ labelmargin { ylabelmargin @Else linklabelmargin }
+ labelfont { ylabelfont @Else linklabelfont }
+ labelbreak { ylabelbreak @Else linklabelbreak }
+ labelformat { ylabelformat @Body @Else linklabelformat @Body}
+ labelpos { ylabelpos @Else linklabelpos }
+ labelprox { ylabelprox @Else linklabelprox }
+ labelangle { ylabelangle @Else linklabelangle }
+ labelctr { ylabelctr @Else linklabelctr }
+ labeladjust { ylabeladjust @Else linklabeladjust }
+ }
+
+ def @ZLabel
+ {
+ @DoLabel
+ which { "z" }
+ label { zlabel @Else linklabel }
+ labelmargin { zlabelmargin @Else linklabelmargin }
+ labelfont { zlabelfont @Else linklabelfont }
+ labelbreak { zlabelbreak @Else linklabelbreak }
+ labelformat { zlabelformat @Body @Else linklabelformat @Body}
+ labelpos { zlabelpos @Else linklabelpos }
+ labelprox { zlabelprox @Else linklabelprox }
+ labelangle { zlabelangle @Else linklabelangle }
+ labelctr { zlabelctr @Else linklabelctr }
+ labeladjust { zlabeladjust @Else linklabeladjust }
+ }
+
+ def @FromArrow
+ {
+ arrow @Case {
+ { back both } @Yield {
+ @ArrowHead
+ style { arrowstyle }
+ width { arrowwidth }
+ length { arrowlength }
+ pathwidth { pathwidth }
+ }
+ else @Yield ""
+ }
+ }
+
+ def @ToArrow
+ {
+ arrow @Case {
+ { yes forward both } @Yield {
+ @ArrowHead
+ style { arrowstyle }
+ width { arrowwidth }
+ length { arrowlength }
+ pathwidth { pathwidth }
+ }
+ else @Yield ""
+ }
+ }
+
+ import @Geometry
+ def @LinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent "ldiaglinepath"
+ # FROM :< {from??CTR angleto to??CTR}
+ # FROM :: from boundaryatangle FROM@ANGLE
+ # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE
+ # TO :< FROM@ANGLE
+ # TO :: to boundaryatangle { TO@ANGLE - 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d}
+ #
+ # LMID :: FROM ** 0.5 ++ TO ** 0.5
+ # LMID :< FROM@ANGLE
+ # XINDENT := xindent min { FROM distance LMID }
+ # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE
+ # LFROM :< FROM@ANGLE
+ # ZINDENT := zindent min { TO distance LMID }
+ # LTO :: TO -- ZINDENT atangle FROM@ANGLE
+ # LTO :< FROM@ANGLE
+ #
+ # if cond { direct }
+ # then { FROM TO }
+ # else { FROM LFROM LMID LTO TO }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @DoubleLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent pathgap "ldiagdoublelinepath"
+ # FROM :< {from??CTR angleto to??CTR}
+ # FROM :: from boundaryatangle FROM@ANGLE
+ # ++ {arrow @FromArrowLength arrowlength}atangle FROM@ANGLE
+ # TO :< FROM@ANGLE
+ # TO :: to boundaryatangle { TO@ANGLE - 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle {TO@ANGLE - 180d}
+ #
+ # LMID :: FROM ** 0.5 ++ TO ** 0.5
+ # LMID :< FROM@ANGLE
+ # XINDENT := xindent min { FROM distance LMID }
+ # LFROM :: FROM ++ XINDENT atangle FROM@ANGLE
+ # LFROM :< FROM@ANGLE
+ # ZINDENT := zindent min { TO distance LMID }
+ # LTO :: TO -- ZINDENT atangle FROM@ANGLE
+ # LTO :< FROM@ANGLE
+ #
+ # if cond { direct }
+ # then { FROM TO }
+ # else { FROM LFROM LMID LTO TO }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @ACurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias "ldiagacurvepath"
+ # #B1 := bias max 0.02f
+ # #B2 := { from??CTR distance to??CTR } * 0.5
+ # #BIAS := B1 min B2
+ # BIAS := bias max 0.02f
+ # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5
+ # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR - 90d}
+ # CTR := { from??CTR XTOP ldiaglinebetween
+ # to??CTR XTOP ldiaglinebetween ldiaglineintersect }
+ # FROM :: aabout
+ # circum { from }
+ # extra { arrow @FromArrowLength arrowlength }
+ # centre { CTR }
+ # FROM :< if cond { from??CTR distance FROM > 0 }
+ # then { from??CTR angleto FROM }
+ # else { CTR angleto FROM + 90d }
+ # TO :: cabout
+ # circum { to }
+ # extra { arrow @ToArrowLength arrowlength }
+ # centre { CTR }
+ # TO :< if cond { TO distance to??CTR > 0 }
+ # then { TO angleto to??CTR }
+ # else { CTR angleto TO + 90d }
+ #
+ # RADIUS := CTR distance FROM
+ # LMID :: CTR ++ RADIUS atangle {
+ # CTR angleto FROM +
+ # { {360d + {CTR angleto TO} - {CTR angleto FROM}} mod 360 } / 2
+ # }
+ # LMID :< CTR angleto LMID + 90d
+ #
+ # XINDENT := xindent min { FROM distance LMID }
+ # LFROM :: CTR ++ RADIUS atangle {
+ # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } }
+ # LFROM :< CTR angleto LFROM + 90d
+ # ZINDENT := zindent min { TO distance LMID }
+ # LTO :: CTR ++ RADIUS atangle {
+ # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}}
+ # LTO :< CTR angleto LTO + 90d
+ #
+ # if cond { direct }
+ # then { FROM [CTR] TO }
+ # else { FROM [CTR] LFROM [CTR] LMID [CTR] LTO [CTR] TO }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @CCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias "ldiagccurvepath"
+ # #B1 := bias max 0.02f
+ # #B2 := { from??CTR distance to??CTR } * 0.5
+ # #BIAS := B1 min B2
+ # BIAS := bias max 0.02f
+ # XMID := from??CTR ** 0.5 ++ to??CTR ** 0.5
+ # XTOP := XMID ++ BIAS atangle {from??CTR angleto to??CTR + 90d}
+ # CTR := { from??CTR XTOP ldiaglinebetween
+ # to??CTR XTOP ldiaglinebetween ldiaglineintersect }
+ # FROM :: cabout
+ # circum { from }
+ # extra { arrow @FromArrowLength arrowlength }
+ # centre { CTR }
+ # FROM :< if cond { from??CTR distance FROM > 0 }
+ # then { from??CTR angleto FROM }
+ # else { CTR angleto FROM - 90d }
+ # TO :: aabout
+ # circum { to }
+ # extra { arrow @ToArrowLength arrowlength }
+ # centre { CTR }
+ # TO :< if cond { TO distance to??CTR > 0 }
+ # then { TO angleto to??CTR }
+ # else { CTR angleto TO - 90d }
+ #
+ # RADIUS := CTR distance FROM
+ # LMID :: CTR ++ RADIUS atangle {
+ # CTR angleto TO +
+ # { {360d + {CTR angleto FROM} - {CTR angleto TO} } mod 360 } / 2
+ # }
+ # LMID :< CTR angleto LMID - 90d
+ #
+ # XINDENT := xindent min { FROM distance LMID }
+ # LFROM :: CTR ++ RADIUS atangle {
+ # CTR angleto { FROM ++ XINDENT atangle FROM@ANGLE } }
+ # LFROM :< CTR angleto LFROM - 90d
+ # ZINDENT := zindent min { TO distance LMID }
+ # LTO :: CTR ++ RADIUS atangle {
+ # CTR angleto { TO ++ ZINDENT atangle {TO@ANGLE+180d}}}
+ # LTO :< CTR angleto LTO - 90d
+ #
+ # if cond { direct }
+ # then { FROM [CTR clockwise] TO }
+ # else { FROM [CTR clockwise] LFROM [CTR clockwise]
+ # LMID [CTR clockwise] LTO [CTR clockwise] TO }
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @BezierPath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent [ frompt ] [ topt ] "ldiagbezierpath"
+ # FROM :< from??CTR angleto frompt
+ # FROM :: from boundaryatangle FROM@ANGLE
+ # ++ {arrow @FromArrowLength arrowlength} atangle FROM@ANGLE
+ # TO :< topt angleto to??CTR
+ # TO :: to boundaryatangle { TO@ANGLE + 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle { TO@ANGLE + 180d }
+ # LFROM :: FROM ++ { xindent atangle FROM@ANGLE }
+ # LFROM :< FROM@ANGLE
+ # LTO :: TO ++ zindent atangle { TO@ANGLE + 180d }
+ # LTO :< TO@ANGLE
+ # LMID :: { FROM ++ TO ++ frompt ++ topt } ** 0.25
+ # FROM [frompt topt] TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @VHLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent "ldiagvhlinepath"
+ # CTR := { {xcoord from??CTR} {ycoord to??CTR} }
+ # FANG := from??CTR angleto CTR
+ # TANG := to??CTR angleto CTR
+ # FROM :: from boundaryatangle FANG
+ # ++ {arrow @FromArrowLength arrowlength} atangle FANG
+ # FROM :< FANG
+ # TO :: to boundaryatangle TANG
+ # ++ {arrow @ToArrowLength arrowlength} atangle TANG
+ # TO :< TANG + 180d
+ # FDIST := FROM distance CTR
+ # TDIST := TO distance CTR
+ # XINDENT := xindent min FDIST
+ # ZINDENT := zindent min TDIST
+ # LFROM :: FROM ++ XINDENT atangle FANG
+ # LFROM :< FROM@ANGLE
+ # LTO :: TO ++ ZINDENT atangle TANG
+ # LTO :< TO@ANGLE
+ # LMID :: CTR
+ # LMID :< {1f atangle {FANG + 180d}} angleto
+ # {1f atangle {TANG + 180d}}
+ # FROM LFROM LMID LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @VHCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent radius "ldiagvhcurvepath"
+ # CTR := { {xcoord from??CTR} {ycoord to??CTR} }
+ # FANG := from??CTR angleto CTR
+ # TANG := to??CTR angleto CTR
+ # FROM :: from boundaryatangle FANG
+ # ++ {arrow @FromArrowLength arrowlength} atangle FANG
+ # FROM :< FANG
+ # TO :: to boundaryatangle TANG
+ # ++ {arrow @ToArrowLength arrowlength} atangle TANG
+ # TO :< TANG + 180d
+ # FDIST := FROM distance CTR
+ # TDIST := TO distance CTR
+ # RADIUS := radius min FDIST min TDIST
+ # XINDENT := xindent min { FDIST - RADIUS }
+ # ZINDENT := zindent min { TDIST - RADIUS }
+ # LFROM :: FROM ++ XINDENT atangle FANG
+ # LFROM :< FROM@ANGLE
+ # LTO :: TO ++ ZINDENT atangle TANG
+ # LTO :< TO@ANGLE
+ # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d }
+ # TCTR := CTR ++ RADIUS atangle { TO@ANGLE }
+ # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d }
+ # ++ RADIUS atangle { TO@ANGLE }
+ # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR }
+ # LMID :< FCTR angleto TCTR
+ # FROM LFROM FCTR
+ # { FCTR angleto TCTR } quadcase
+ # 0 { }
+ # 0-90 { [XCTR clockwise] }
+ # 90 { }
+ # 90-180 { [XCTR] }
+ # 180 { }
+ # 180-270 { [XCTR clockwise] }
+ # 270 { }
+ # 270-360 { [XCTR] }
+ # TCTR LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @HVLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent "ldiaghvlinepath"
+ # CTR := { {xcoord to??CTR} {ycoord from??CTR} }
+ # FANG := from??CTR angleto CTR
+ # TANG := to??CTR angleto CTR
+ # FROM :: from boundaryatangle FANG
+ # ++ {arrow @FromArrowLength arrowlength} atangle FANG
+ # FROM :< FANG
+ # TO :: to boundaryatangle TANG
+ # ++ {arrow @ToArrowLength arrowlength} atangle TANG
+ # TO :< TANG + 180d
+ # FDIST := FROM distance CTR
+ # TDIST := TO distance CTR
+ # XINDENT := xindent min FDIST
+ # ZINDENT := zindent min TDIST
+ # LFROM :: FROM ++ XINDENT atangle FANG
+ # LFROM :< FROM@ANGLE
+ # LTO :: TO ++ ZINDENT atangle TANG
+ # LTO :< TO@ANGLE
+ # LMID :: CTR
+ # LMID :< {1f atangle {FANG + 180d}} angleto
+ # {1f atangle {TANG + 180d}}
+ # FROM LFROM LMID LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @HVCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent radius "ldiaghvcurvepath"
+ # CTR := { {xcoord to??CTR} {ycoord from??CTR} }
+ # FANG := from??CTR angleto CTR
+ # TANG := to??CTR angleto CTR
+ # FROM :: from boundaryatangle FANG
+ # ++ {arrow @FromArrowLength arrowlength} atangle FANG
+ # FROM :< FANG
+ # TO :: to boundaryatangle TANG
+ # ++ {arrow @ToArrowLength arrowlength} atangle TANG
+ # TO :< TANG + 180d
+ # FDIST := FROM distance CTR
+ # TDIST := TO distance CTR
+ # RADIUS := radius min FDIST min TDIST
+ # XINDENT := xindent min { FDIST - RADIUS }
+ # ZINDENT := zindent min { TDIST - RADIUS }
+ # LFROM :: FROM ++ XINDENT atangle FANG
+ # LFROM :< FROM@ANGLE
+ # LTO :: TO ++ ZINDENT atangle TANG
+ # LTO :< TO@ANGLE
+ # FCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d }
+ # TCTR := CTR ++ RADIUS atangle { TO@ANGLE }
+ # XCTR := CTR ++ RADIUS atangle { FROM@ANGLE + 180d }
+ # ++ RADIUS atangle { TO@ANGLE }
+ # LMID :: XCTR ++ RADIUS atangle { XCTR angleto CTR }
+ # LMID :< FCTR angleto TCTR
+ # FROM LFROM FCTR
+ # { FCTR angleto TCTR } quadcase
+ # 0 { }
+ # 0-90 { [XCTR] }
+ # 90 { }
+ # 90-180 { [XCTR clockwise] }
+ # 180 { }
+ # 180-270 { [XCTR] }
+ # 270 { }
+ # 270-360 { [XCTR clockwise] }
+ # TCTR LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @LVRLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias "ldiaglvrlinepath"
+ # FROM :: from boundaryatangle 180d
+ # ++ {arrow @FromArrowLength arrowlength} atangle 180d
+ # FROM :< 180d
+ # TO :: to boundaryatangle 180d
+ # ++ {arrow @ToArrowLength arrowlength} atangle 180d
+ # TO :< 0d
+ # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias
+ # P1 :: { XLEFT ycoord FROM }
+ # P2 :: { XLEFT ycoord TO }
+ # VERT := P1 angleto P2
+ # P1 :< P1 angleto {P1++{1f atangle 180d}++{1f atangle VERT}}
+ # P2 :< P2 angleto {P2++{1f atangle 0d} ++{1f atangle VERT}}
+ # LMID :: P1 ** 0.5 ++ P2 ** 0.5
+ # LMID :< VERT
+ # XINDENT := xindent min {FROM distance P1}
+ # ZINDENT := zindent min {P2 distance TO}
+ # LFROM :: FROM -- { XINDENT 0 }
+ # LFROM :< 180d
+ # LTO :: TO -- { ZINDENT 0 }
+ # LTO :< 0d
+ # FROM LFROM P1 LMID P2 LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @LVRCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias radius "ldiaglvrcurvepath"
+ # FROM :: from boundaryatangle 180d
+ # ++ {arrow @FromArrowLength arrowlength} atangle 180d
+ # FROM :< 180d
+ # TO :: to boundaryatangle 180d
+ # ++ {arrow @ToArrowLength arrowlength} atangle 180d
+ # TO :< 0d
+ # XLEFT := {{xcoord FROM} min {xcoord TO}} - bias
+ # XP1 := { XLEFT ycoord FROM }
+ # XP2 := { XLEFT ycoord TO }
+ # VERT := XP1 angleto XP2
+ # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5
+ # LMID :< VERT
+ # XINDENT := xindent min {FROM distance XP1}
+ # ZINDENT := zindent min {XP2 distance TO}
+ # LFROM :: FROM -- { XINDENT 0 }
+ # LFROM :< 180d
+ # LTO :: TO -- { ZINDENT 0 }
+ # LTO :< 0d
+ # RADIUS := radius min { { XP1 distance XP2 } / 2 }
+ # XP1PRE := XP1 ++ { RADIUS atangle 0d }
+ # XP1POST := XP1 ++ { RADIUS atangle VERT }
+ # XP1CTR := XP1PRE ++ { RADIUS atangle VERT }
+ # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } }
+ # P1 :< XP1PRE angleto XP1POST
+ # XP2PRE := XP2 -- { RADIUS atangle VERT }
+ # XP2POST := XP2 ++ { RADIUS atangle 0d }
+ # XP2CTR := XP2PRE ++ { RADIUS atangle 0d }
+ # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } }
+ # P2 :< XP2PRE angleto XP2POST
+ # FROM LFROM XP1PRE
+ # {round VERT} quadcase
+ # 90 { [XP1CTR clockwise] P1 [XP1CTR clockwise] }
+ # 270 { [XP1CTR] P1 [XP1CTR] }
+ # XP1POST LMID XP2PRE
+ # {round VERT} quadcase
+ # 90 { [XP2CTR clockwise] P2 [XP2CTR clockwise] }
+ # 270 { [XP2CTR] P2 [XP2CTR] }
+ # XP2POST LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @RVLLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias "ldiagrvllinepath"
+ # FROM :: from boundaryatangle 0d
+ # ++ {arrow @FromArrowLength arrowlength} atangle 0d
+ # FROM :< 0d
+ # TO :: to boundaryatangle 0d
+ # ++ {arrow @ToArrowLength arrowlength} atangle 0d
+ # TO :< 180d
+ # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias
+ # P1 :: { XRIGHT ycoord FROM }
+ # P2 :: { XRIGHT ycoord TO }
+ # VERT := P1 angleto P2
+ # P1 :< P1 angleto {P1++{1f atangle 0d} ++{1f atangle VERT}}
+ # P2 :< P2 angleto {P2++{1f atangle 180d}++{1f atangle VERT}}
+ # LMID :: P1 ** 0.5 ++ P2 ** 0.5
+ # LMID :< VERT
+ # XINDENT := xindent min {FROM distance P1}
+ # ZINDENT := zindent min {P2 distance TO}
+ # LFROM :: FROM ++ { XINDENT 0 }
+ # LFROM :< 0d
+ # LTO :: TO ++ { ZINDENT 0 }
+ # LTO :< 180d
+ # FROM LFROM P1 LMID P2 LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @RVLCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias radius "ldiagrvlcurvepath"
+ # FROM :: from boundaryatangle 0d
+ # ++ {arrow @FromArrowLength arrowlength} atangle 0d
+ # FROM :< 0d
+ # TO :: to boundaryatangle 0d
+ # ++ {arrow @ToArrowLength arrowlength} atangle 0d
+ # TO :< 180d
+ # XRIGHT := {{xcoord FROM} max {xcoord TO}} + bias
+ # XP1 := { XRIGHT ycoord FROM }
+ # XP2 := { XRIGHT ycoord TO }
+ # VERT := XP1 angleto XP2
+ # LMID :: XP1 ** 0.5 ++ XP2 ** 0.5
+ # LMID :< VERT
+ # XINDENT := xindent min {FROM distance XP1}
+ # ZINDENT := zindent min {XP2 distance TO}
+ # LFROM :: FROM ++ { XINDENT 0 }
+ # LFROM :< 0d
+ # LTO :: TO ++ { ZINDENT 0 }
+ # LTO :< 180d
+ # RADIUS := radius min { { XP1 distance XP2 } * 0.5 }
+ # XP1PRE := XP1 ++ { RADIUS atangle 180d }
+ # XP1POST := XP1 ++ { RADIUS atangle VERT }
+ # XP1CTR := XP1PRE ++ { RADIUS atangle VERT }
+ # P1 :: XP1CTR ++ { RADIUS atangle { XP1CTR angleto XP1 } }
+ # P1 :< XP1PRE angleto XP1POST
+ # XP2PRE := XP2 -- { RADIUS atangle VERT }
+ # XP2POST := XP2 ++ { RADIUS atangle 180d }
+ # XP2CTR := XP2PRE ++ { RADIUS atangle 180d }
+ # P2 :: XP2CTR ++ { RADIUS atangle { XP2CTR angleto XP2 } }
+ # P2 :< XP2PRE angleto XP2POST
+ # FROM LFROM XP1PRE
+ # {round VERT} quadcase
+ # 90 { [XP1CTR] P1 [XP1CTR] }
+ # 270 { [XP1CTR clockwise] P1 [XP1CTR clockwise] }
+ # XP1POST LMID XP2PRE
+ # {round VERT} quadcase
+ # 90 { [XP2CTR] P2 [XP2CTR] }
+ # 270 { [XP2CTR clockwise] P2 [XP2CTR clockwise] }
+ # XP2POST LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @DWrapLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias fbias tbias "ldiagdwraplinepath"
+ # DIRN := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { 180d } else { 0d }
+ # FROM :: from boundaryatangle DIRN
+ # ++ {arrow @FromArrowLength arrowlength} atangle DIRN
+ # FROM :< DIRN
+ # TO :: to boundaryatangle { DIRN + 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d }
+ # TO :< DIRN
+ # P1 :: FROM ++ {fbias max 0} atangle DIRN
+ # P1 :< if cond { DIRN = 180d } then { 225d } else { -45d }
+ # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d }
+ # P4 :< if cond { DIRN = 180d } then { 135d } else { 45d }
+ # YC := ycoord { from boundaryatangle 270d } min
+ # ycoord { to boundaryatangle 270d }
+ # - { bias max 0 }
+ # P2 :: { xcoord P1 YC }
+ # P2 :< P4@ANGLE - 180d
+ # P3 :: { xcoord P4 YC }
+ # P3 :< P1@ANGLE - 180d
+ # XINDENT := xindent min { FROM distance P1 }
+ # LFROM :: FROM ++ XINDENT atangle DIRN
+ # LFROM :< FROM@ANGLE
+ # ZINDENT := zindent min { TO distance P4 }
+ # LTO :: TO ++ ZINDENT atangle { DIRN + 180d }
+ # LTO :< TO@ANGLE
+ # LMID :: P2 ** 0.5 ++ P3 ** 0.5
+ # LMID :< DIRN - 180d
+ # FROM P1 P2 P3 P4 TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @DWrapCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias fbias tbias radius "ldiagdwrapcurvepath"
+ # DIRN := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { 180d } else { 0d }
+ # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { anticlockwise } else { clockwise }
+ # FROM :: from boundaryatangle DIRN
+ # ++ {arrow @FromArrowLength arrowlength} atangle DIRN
+ # FROM :< DIRN
+ # TO :: to boundaryatangle { DIRN + 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d }
+ # TO :< DIRN
+ #
+ # XP1 := FROM ++ {fbias max 0} atangle DIRN
+ # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d }
+ # YC := ycoord { from boundaryatangle 270d } min
+ # ycoord { to boundaryatangle 270d }
+ # - { bias max 0 }
+ # XP2 := { xcoord XP1 YC }
+ # XP3 := { xcoord XP4 YC }
+ #
+ # RP1 := radius min { XP1 distance FROM } min
+ # { { XP1 distance XP2 } / 2 }
+ # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM }
+ # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 }
+ # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 }
+ # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 }
+ # P1 :< XP1CTR angleto P1 + DIRN - 90d
+ #
+ # RP2 := radius min { { XP1 distance XP2 } / 2 }
+ # min { { XP2 distance XP3 } / 2 }
+ # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 }
+ # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 }
+ # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 }
+ # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 }
+ # P2 :< XP2CTR angleto P2 + DIRN - 90d
+ #
+ # RP3 := radius min { { XP2 distance XP3 } / 2 }
+ # min { { XP3 distance XP4 } / 2 }
+ # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 }
+ # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 }
+ # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 }
+ # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 }
+ # P3 :< XP3CTR angleto P3 + DIRN - 90d
+ #
+ # RP4 := radius min { { XP4 distance XP3 } / 2 }
+ # min { XP4 distance TO }
+ # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 }
+ # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO }
+ # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO }
+ # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 }
+ # P4 :< XP4CTR angleto P4 + DIRN - 90d
+ #
+ # XINDENT := xindent min { FROM distance XP1PRE }
+ # LFROM :: FROM ++ XINDENT atangle DIRN
+ # LFROM :< FROM@ANGLE
+ #
+ # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5
+ # LMID :< DIRN - 180d
+ #
+ # ZINDENT := zindent min { TO distance XP4POST }
+ # LTO :: TO ++ ZINDENT atangle { DIRN + 180d }
+ # LTO :< TO@ANGLE
+ #
+ # FROM LFROM
+ # XP1PRE [XP1CTR CLOCK] XP1POST
+ # XP2PRE [XP2CTR CLOCK] XP2POST
+ # LMID
+ # XP3PRE [XP3CTR CLOCK] XP3POST
+ # XP4PRE [XP4CTR CLOCK] XP4POST
+ # LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @UWrapLinePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias fbias tbias "ldiaguwraplinepath"
+ # DIRN := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { 180d } else { 0d }
+ # FROM :: from boundaryatangle DIRN
+ # ++ {arrow @FromArrowLength arrowlength} atangle DIRN
+ # FROM :< DIRN
+ # TO :: to boundaryatangle { DIRN + 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d }
+ # TO :< DIRN
+ # P1 :: FROM ++ {fbias max 0} atangle DIRN
+ # P1 :< if cond { DIRN = 180d } then { 135d } else { 45d }
+ # P4 :: TO ++ {tbias max 0} atangle { DIRN + 180d }
+ # P4 :< if cond { DIRN = 180d } then { 225d } else { -45d }
+ # YC := ycoord { from boundaryatangle 90d } max
+ # ycoord { to boundaryatangle 90d }
+ # + { bias max 0 }
+ # P2 :: { xcoord P1 YC }
+ # P2 :< P4@ANGLE - 180d
+ # P3 :: { xcoord P4 YC }
+ # P3 :< P1@ANGLE - 180d
+ # XINDENT := xindent min { FROM distance P1 }
+ # LFROM :: FROM ++ XINDENT atangle DIRN
+ # LFROM :< FROM@ANGLE
+ # ZINDENT := zindent min { TO distance P4 }
+ # LTO :: TO ++ ZINDENT atangle { DIRN + 180d }
+ # LTO :< TO@ANGLE
+ # LMID :: P2 ** 0.5 ++ P3 ** 0.5
+ # LMID :< DIRN - 180d
+ # FROM P1 P2 P3 P4 TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @UWrapCurvePath
+ {
+ @BackEnd @Case {
+ PostScript @Yield {
+ {arrow @FromArrowLength arrowlength}
+ {arrow @ToArrowLength arrowlength}
+ "{" from "}" "{" to "}"
+ xindent zindent bias fbias tbias radius "ldiaguwrapcurvepath"
+ # DIRN := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { 180d } else { 0d }
+ # CLOCK := if cond { xcoord from??CTR < xcoord to??CTR }
+ # then { clockwise } else { anticlockwise }
+ # FROM :: from boundaryatangle DIRN
+ # ++ {arrow @FromArrowLength arrowlength} atangle DIRN
+ # FROM :< DIRN
+ # TO :: to boundaryatangle { DIRN + 180d }
+ # ++ {arrow @ToArrowLength arrowlength} atangle { DIRN + 180d }
+ # TO :< DIRN
+ #
+ # XP1 := FROM ++ {fbias max 0} atangle DIRN
+ # XP4 := TO ++ {tbias max 0} atangle { DIRN + 180d }
+ # YC := ycoord { from boundaryatangle 90d } max
+ # ycoord { to boundaryatangle 90d }
+ # + { bias max 0 }
+ # XP2 := { xcoord XP1 YC }
+ # XP3 := { xcoord XP4 YC }
+ #
+ # RP1 := radius min { XP1 distance FROM } min
+ # { { XP1 distance XP2 } / 2 }
+ # XP1PRE := XP1 ++ RP1 atangle { XP1 angleto FROM }
+ # XP1POST := XP1 ++ RP1 atangle { XP1 angleto XP2 }
+ # XP1CTR := XP1PRE ++ RP1 atangle { XP1 angleto XP2 }
+ # P1 :: XP1CTR ++ RP1 atangle { XP1CTR angleto XP1 }
+ # P1 :< XP1CTR angleto P1 + DIRN + 90d
+ #
+ # RP2 := radius min { { XP1 distance XP2 } / 2 }
+ # min { { XP2 distance XP3 } / 2 }
+ # XP2PRE := XP2 ++ RP2 atangle { XP2 angleto XP1 }
+ # XP2POST := XP2 ++ RP2 atangle { XP2 angleto XP3 }
+ # XP2CTR := XP2PRE ++ RP2 atangle { XP2 angleto XP3 }
+ # P2 :: XP2CTR ++ RP2 atangle { XP2CTR angleto XP2 }
+ # P2 :< XP2CTR angleto P2 + DIRN + 90d
+ #
+ # RP3 := radius min { { XP2 distance XP3 } / 2 }
+ # min { { XP3 distance XP4 } / 2 }
+ # XP3PRE := XP3 ++ RP3 atangle { XP3 angleto XP2 }
+ # XP3POST := XP3 ++ RP3 atangle { XP3 angleto XP4 }
+ # XP3CTR := XP3PRE ++ RP3 atangle { XP3 angleto XP4 }
+ # P3 :: XP3CTR ++ RP3 atangle { XP3CTR angleto XP3 }
+ # P3 :< XP3CTR angleto P3 + DIRN + 90d
+ #
+ # RP4 := radius min { { XP4 distance XP3 } / 2 }
+ # min { XP4 distance TO }
+ # XP4PRE := XP4 ++ RP4 atangle { XP4 angleto XP3 }
+ # XP4POST := XP4 ++ RP4 atangle { XP4 angleto TO }
+ # XP4CTR := XP4PRE ++ RP4 atangle { XP4 angleto TO }
+ # P4 :: XP4CTR ++ RP4 atangle { XP4CTR angleto XP4 }
+ # P4 :< XP4CTR angleto P4 + DIRN + 90d
+ #
+ # XINDENT := xindent min { FROM distance XP1PRE }
+ # LFROM :: FROM ++ XINDENT atangle DIRN
+ # LFROM :< FROM@ANGLE
+ #
+ # LMID :: XP2 ** 0.5 ++ XP3 ** 0.5
+ # LMID :< DIRN - 180d
+ #
+ # ZINDENT := zindent min { TO distance XP4POST }
+ # LTO :: TO ++ ZINDENT atangle { DIRN + 180d }
+ # LTO :< TO@ANGLE
+ #
+ # FROM LFROM
+ # XP1PRE [XP1CTR CLOCK] XP1POST
+ # XP2PRE [XP2CTR CLOCK] XP2POST
+ # LMID
+ # XP3PRE [XP3CTR CLOCK] XP3POST
+ # XP4PRE [XP4CTR CLOCK] XP4POST
+ # LTO TO
+ }
+ PDF @Yield {}
+ }
+ }
+
+ import @Geometry
+ def @Path
+ {
+ path @Case {
+ line @Yield @LinePath
+ doubleline @Yield @DoubleLinePath
+ { acurve curve } @Yield @ACurvePath
+ ccurve @Yield @CCurvePath
+ bezier @Yield @BezierPath
+ vhline @Yield @VHLinePath
+ vhcurve @Yield @VHCurvePath
+ hvline @Yield @HVLinePath
+ hvcurve @Yield @HVCurvePath
+ lvrline @Yield @LVRLinePath
+ lvrcurve @Yield @LVRCurvePath
+ rvlline @Yield @RVLLinePath
+ rvlcurve @Yield @RVLCurvePath
+ dwrapline @Yield @DWrapLinePath
+ dwrapcurve @Yield @DWrapCurvePath
+ uwrapline @Yield @UWrapLinePath
+ uwrapcurve @Yield @UWrapCurvePath
+ else @Yield {
+ path
+ from { from }
+ to { to }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ arrow { arrow }
+ arrowlength { arrowlength }
+ }
+ }
+ }
+
+ def @FromLabel
+ {
+ @DoLabel
+ which { "f" }
+ label { fromlabel @Else @FromArrow }
+ labelmargin { fromlabelmargin }
+ labelfont { fromlabelfont }
+ labelbreak { fromlabelbreak }
+ labelformat { fromlabelformat @Body }
+ labelpos { fromlabelpos }
+ labelprox { fromlabelprox }
+ labelangle { fromlabelangle }
+ labelctr { fromlabelctr }
+ labeladjust { fromlabeladjust }
+ }
+
+ def @ToLabel
+ {
+ @DoLabel
+ which { "t" }
+ label { tolabel @Else @ToArrow }
+ labelmargin { tolabelmargin }
+ labelfont { tolabelfont }
+ labelbreak { tolabelbreak }
+ labelformat { tolabelformat @Body }
+ labelpos { tolabelpos }
+ labelprox { tolabelprox }
+ labelangle { tolabelangle }
+ labelctr { tolabelctr }
+ labeladjust { tolabeladjust }
+ }
+
+ def @Direct
+ {
+ pathstyle @Case {
+ { "/ldiagsolid" "/ldiagdashed" "/ldiagcdashed"
+ "/ldiagdotted" "/ldiagnoline" } @Yield 1
+ else @Yield 0
+ }
+ }
+
+ @BackEnd @Case {
+ PostScript @Yield {
+
+ @Null & # so that preceding space gets chewed up
+ {
+ @Direct "ldiaglinkbegin [" @Path "]" pathdashlength
+ "[" pathstyle "]" pathwidth "ldiaglinkend"
+ }
+ @Graphic
+ {
+ / { fromlabel @Else @FromArrow} @IfNonEmpty @FromLabel
+ / { xlabel @Else linklabel } @IfNonEmpty @XLabel
+ / { ylabel @Else linklabel } @IfNonEmpty @YLabel
+ / { zlabel @Else linklabel } @IfNonEmpty @ZLabel
+ / { tolabel @Else @ToArrow } @IfNonEmpty @ToLabel
+ }
+
+ }
+ PDF @Yield {}
+ }
+ }
+
+
+ def @ObjectLink
+ precedence 90
+ associativity left
+ left x
+ named treehsep { treehsep }
+ named treevsep { treevsep }
+ named format
+ named x {}
+ named y {}
+ named insinuatelink {}
+ named treehsep {}
+ named treevsep {}
+ { x | y | insinuatelink }
+ import @Geometry named path
+ named from {}
+ named to {}
+ named bias {}
+ named fbias {}
+ named tbias {}
+ named radius {}
+ named xindent {}
+ named zindent {}
+ named frompt {}
+ named topt {}
+ named arrow {}
+ named arrowlength {}
+ { path
+ from { from }
+ to { to }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ arrow { arrow }
+ arrowlength { arrowlength }
+ }
+ import @Geometry named basefrom { }
+ import @Geometry named baseto { }
+ import @Geometry named from { }
+ import @Geometry named to { }
+ import @Geometry named bias { bias }
+ import @Geometry named fbias { fbias }
+ import @Geometry named tbias { tbias }
+ import @Geometry named radius { radius }
+ import @Geometry named xindent { xindent }
+ import @Geometry named zindent { zindent }
+ import @Geometry named frompt { frompt }
+ import @Geometry named topt { topt }
+ named pathstyle
+ named solid { "/ldiagsolid" }
+ named dashed { "/ldiagdashed" }
+ named cdashed { "/ldiagcdashed" }
+ named dotted { "/ldiagdotted" }
+ named noline { "/ldiagnoline" }
+ { pathstyle }
+ import @Geometry named pathdashlength { pathdashlength }
+ import @Geometry named pathwidth
+ named thin { 0.04 ft }
+ named medium { 0.08 ft }
+ named thick { 0.12 ft }
+ { pathwidth }
+ import @Geometry named pathgap
+ named thin { 0.08 ft }
+ named medium { 0.16 ft }
+ named thick { 0.24 ft }
+ { pathgap }
+
+ named arrow { arrow }
+ named arrowstyle { arrowstyle }
+ named arrowwidth { arrowwidth }
+ named arrowlength { arrowlength }
+
+ named linklabel { linklabel }
+ named linklabelmargin { linklabelmargin }
+ named linklabelfont { linklabelfont }
+ named linklabelbreak { linklabelbreak }
+ named linklabelformat right @Body { linklabelformat @Body }
+ import @Geometry named linklabelpos { linklabelpos }
+ named linklabelprox { linklabelprox }
+ import @Geometry named linklabelangle { linklabelangle }
+ named linklabelctr { linklabelctr }
+ import @Geometry named linklabeladjust { linklabeladjust }
+
+ named xlabel { xlabel }
+ named xlabelmargin { xlabelmargin }
+ named xlabelfont { xlabelfont }
+ named xlabelbreak { xlabelbreak }
+ named xlabelformat right @Body { xlabelformat @Body }
+ import @Geometry named xlabelpos { xlabelpos }
+ named xlabelprox { xlabelprox }
+ import @Geometry named xlabelangle { xlabelangle }
+ named xlabelctr { xlabelctr }
+ import @Geometry named xlabeladjust { xlabeladjust }
+
+ named ylabel { ylabel }
+ named ylabelmargin { ylabelmargin }
+ named ylabelfont { ylabelfont }
+ named ylabelbreak { ylabelbreak }
+ named ylabelformat right @Body { ylabelformat @Body }
+ import @Geometry named ylabelpos { ylabelpos }
+ named ylabelprox { ylabelprox }
+ import @Geometry named ylabelangle { ylabelangle }
+ named ylabelctr { ylabelctr }
+ import @Geometry named ylabeladjust { ylabeladjust }
+
+ named zlabel { zlabel }
+ named zlabelmargin { zlabelmargin }
+ named zlabelfont { zlabelfont }
+ named zlabelbreak { zlabelbreak }
+ named zlabelformat right @Body { zlabelformat @Body }
+ import @Geometry named zlabelpos { zlabelpos }
+ named zlabelprox { zlabelprox }
+ import @Geometry named zlabelangle { zlabelangle }
+ named zlabelctr { zlabelctr }
+ import @Geometry named zlabeladjust { zlabeladjust }
+
+ named fromlabel { fromlabel }
+ named fromlabelmargin { fromlabelmargin }
+ named fromlabelfont { fromlabelfont }
+ named fromlabelbreak { fromlabelbreak }
+ named fromlabelformat right @Body { fromlabelformat @Body }
+ import @Geometry named fromlabelpos { fromlabelpos }
+ named fromlabelprox { fromlabelprox }
+ import @Geometry named fromlabelangle { fromlabelangle }
+ named fromlabelctr { fromlabelctr }
+ import @Geometry named fromlabeladjust { fromlabeladjust }
+
+ named tolabel { tolabel }
+ named tolabelmargin { tolabelmargin }
+ named tolabelfont { tolabelfont }
+ named tolabelbreak { tolabelbreak }
+ named tolabelformat right @Body { tolabelformat @Body }
+ import @Geometry named tolabelpos { tolabelpos }
+ named tolabelprox { tolabelprox }
+ import @Geometry named tolabelangle { tolabelangle }
+ named tolabelctr { tolabelctr }
+ import @Geometry named tolabeladjust{ tolabeladjust }
+ right y
+
+ {
+ def @From
+ {
+ from @Case {
+ "" @Yield basefrom
+ else @Yield { basefrom"@"from }
+ }
+ }
+
+ def @To
+ {
+ to @Case {
+ "" @Yield baseto
+ else @Yield { baseto"@"to }
+ }
+ }
+
+ format
+ x { x }
+ y { y }
+ treehsep { treehsep }
+ treevsep { treevsep }
+ insinuatelink {
+ @Link
+ from { @From }
+ to { @To }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ path { path
+ from { @From }
+ to { @To }
+ bias { bias }
+ fbias { fbias }
+ tbias { tbias }
+ radius { radius }
+ xindent { xindent }
+ zindent { zindent }
+ frompt { frompt }
+ topt { topt }
+ arrow { arrow }
+ arrowlength { arrowlength }
+ }
+ pathstyle { pathstyle }
+ pathdashlength { pathdashlength }
+ pathwidth { pathwidth }
+ pathgap { pathgap }
+ arrow { arrow }
+ arrowstyle { arrowstyle }
+ arrowwidth { arrowwidth }
+ arrowlength { arrowlength }
+
+ linklabel { linklabel }
+ linklabelmargin { linklabelmargin }
+ linklabelfont { linklabelfont }
+ linklabelbreak { linklabelbreak }
+ linklabelformat { linklabelformat @Body }
+ linklabelpos { linklabelpos }
+ linklabelprox { linklabelprox }
+ linklabelangle { linklabelangle }
+ linklabelctr { linklabelctr }
+ linklabeladjust { linklabeladjust }
+
+ xlabel { xlabel }
+ xlabelmargin { xlabelmargin }
+ xlabelfont { xlabelfont }
+ xlabelbreak { xlabelbreak }
+ xlabelformat { xlabelformat @Body }
+ xlabelpos { xlabelpos }
+ xlabelprox { xlabelprox }
+ xlabelangle { xlabelangle }
+ xlabelctr { xlabelctr }
+ xlabeladjust { xlabeladjust }
+
+ ylabel { ylabel }
+ ylabelmargin { ylabelmargin }
+ ylabelfont { ylabelfont }
+ ylabelbreak { ylabelbreak }
+ ylabelformat { ylabelformat @Body }
+ ylabelpos { ylabelpos }
+ ylabelprox { ylabelprox }
+ ylabelangle { ylabelangle }
+ ylabelctr { ylabelctr }
+ ylabeladjust { ylabeladjust }
+
+ zlabel { zlabel }
+ zlabelmargin { zlabelmargin }
+ zlabelfont { zlabelfont }
+ zlabelbreak { zlabelbreak }
+ zlabelformat { zlabelformat @Body }
+ zlabelpos { zlabelpos }
+ zlabelprox { zlabelprox }
+ zlabelangle { zlabelangle }
+ zlabelctr { zlabelctr }
+ zlabeladjust { zlabeladjust }
+
+ fromlabel { fromlabel }
+ fromlabelmargin { fromlabelmargin }
+ fromlabelfont { fromlabelfont }
+ fromlabelbreak { fromlabelbreak }
+ fromlabelformat { fromlabelformat @Body }
+ fromlabelpos { fromlabelpos }
+ fromlabelprox { fromlabelprox }
+ fromlabelangle { fromlabelangle }
+ fromlabelctr { fromlabelctr }
+ fromlabeladjust { fromlabeladjust }
+
+ tolabel { tolabel }
+ tolabelmargin { tolabelmargin }
+ tolabelfont { tolabelfont }
+ tolabelbreak { tolabelbreak }
+ tolabelformat { tolabelformat @Body }
+ tolabelpos { tolabelpos }
+ tolabelprox { tolabelprox }
+ tolabelangle { tolabelangle }
+ tolabelctr { tolabelctr }
+ tolabeladjust { tolabeladjust }
+ }
+ }
+
+ macro @Line { @Link path { line } }
+ macro @DoubleLine { @Link path { doubleline } }
+ macro @Arrow { @Link path { line } arrow { yes } }
+ macro @DoubleArrow { @Link path {doubleline} arrow { yes } }
+ macro @Curve { @Link path { curve } }
+ macro @CurveArrow { @Link path { curve } arrow { yes } }
+ macro @ACurve { @Link path { acurve } }
+ macro @ACurveArrow { @Link path { acurve } arrow { yes } }
+ macro @CCurve { @Link path { ccurve } }
+ macro @CCurveArrow { @Link path { ccurve } arrow { yes } }
+
+ macro @Bezier { @Link path { bezier } }
+ macro @BezierArrow { @Link path { bezier } arrow { yes } }
+
+ macro @HVLine { @Link path { hvline } }
+ macro @HVArrow { @Link path { hvline } arrow { yes } }
+ macro @VHLine { @Link path { vhline } }
+ macro @VHArrow { @Link path { vhline } arrow { yes } }
+ macro @HVCurve { @Link path { hvcurve } }
+ macro @HVCurveArrow { @Link path { hvcurve } arrow { yes } }
+ macro @VHCurve { @Link path { vhcurve } }
+ macro @VHCurveArrow { @Link path { vhcurve } arrow { yes } }
+
+ macro @LVRLine { @Link path { lvrline } }
+ macro @LVRArrow { @Link path { lvrline } arrow { yes } }
+ macro @RVLLine { @Link path { rvlline } }
+ macro @RVLArrow { @Link path { rvlline } arrow { yes } }
+ macro @LVRCurve { @Link path { lvrcurve } }
+ macro @LVRCurveArrow { @Link path { lvrcurve } arrow { yes } }
+ macro @RVLCurve { @Link path { rvlcurve } }
+ macro @RVLCurveArrow { @Link path { rvlcurve } arrow { yes } }
+
+ macro @DWrapLine { @Link path { dwrapline} }
+ macro @DWrapArrow { @Link path { dwrapline} arrow { yes } }
+ macro @UWrapLine { @Link path { uwrapline} }
+ macro @UWrapArrow { @Link path { uwrapline} arrow { yes } }
+ macro @DWrapCurve { @Link path {dwrapcurve} }
+ macro @DWrapCurveArrow { @Link path {dwrapcurve} arrow { yes } }
+ macro @UWrapCurve { @Link path {uwrapcurve} }
+ macro @UWrapCurveArrow { @Link path {uwrapcurve} arrow { yes } }
+
+ export
+
+ @Node @Box @CurveBox @ShadowBox @Square @Diamond
+ @Polygon @Isosceles @Ellipse @Circle
+ @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub
+ @FirstSub @NextSub @StubSub
+
+ def @Tree
+ named treehindent
+ named left { 0.0rt }
+ named ctr { 0.5rt }
+ named right { 1.0rt }
+ { treehindent }
+ body x
+ {
+
+ macro @TNode { @@Node nodetag { T } }
+ macro @Node { @TNode }
+ macro @Box { @TNode outline { box } }
+ macro @CurveBox { @TNode outline { curvebox } }
+ macro @ShadowBox { @TNode outline { shadowbox } }
+ macro @Square { @TNode outline { square } }
+ macro @Diamond { @TNode outline { diamond } }
+ macro @Polygon { @TNode outline { polygon } }
+ macro @Isosceles { @TNode outline { isosceles } }
+ macro @Ellipse { @TNode outline { ellipse } }
+ macro @Circle { @TNode outline { circle } }
+
+ def fixroot
+ precedence 90
+ left root
+ {
+ |treehindent root
+ }
+
+ macro @LeftSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { L@T }
+ format { { /treevsep {L::y} } |treehsep x | insinuatelink }
+ }
+
+ macro @ZeroWidthLeftSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { L@T }
+ format { { /treevsep @ZeroWidth { {L::y} ^|treehsep } } |
+ x | insinuatelink }
+ }
+
+ macro @FirstSub
+ {
+ fixroot //
+ @ObjectLink
+ basefrom { T }
+ baseto { S@T }
+ format { //treevsep {S::y} | insinuatelink | }
+ }
+
+ macro @NextSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { S@T }
+ format { x |treehsep { / {S::y} | insinuatelink | } }
+ }
+
+ macro @RightSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { R@T }
+ format { x |treehsep { /treevsep {R::y} } | insinuatelink }
+ }
+
+ macro @ZeroWidthRightSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { R@T }
+ format { x | { /treevsep @ZeroWidth { |treehsep {R::y} } }
+ | insinuatelink }
+ }
+
+ macro @StubSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { T }
+ format { @VContract { |0.5rt x | // |0.5rt
+ S:: @BoxLabels @CatchTags y | } | insinuatelink }
+ # path { from S@T@SW S@T@SE to }
+ path {
+ P1:: S@SW
+ P2:: S@SE
+ FROM:: from boundaryatangle { from??CTR angleto P1 }
+ TO:: to boundaryatangle { to??CTR angleto P2 }
+ FROM P1 P2 TO
+ }
+ }
+
+ @HContract @VContract x
+ }
+
+ export
+
+ @Node @Box @CurveBox @ShadowBox @Square @Diamond
+ @Polygon @Isosceles @Ellipse @Circle
+ @LeftSub @ZeroWidthLeftSub @RightSub @ZeroWidthRightSub
+ @FirstSub @NextSub @StubSub
+
+ def @HTree
+ named treevindent
+ named top { 0.0rt }
+ named ctr { 0.5rt }
+ named foot { 1.0rt }
+ { treevindent }
+ body x
+ {
+
+ macro @TNode { @@Node nodetag { T } }
+ macro @Node { @TNode }
+ macro @Box { @TNode outline { box } }
+ macro @CurveBox { @TNode outline { curvebox } }
+ macro @ShadowBox { @TNode outline { shadowbox } }
+ macro @Square { @TNode outline { square } }
+ macro @Diamond { @TNode outline { diamond } }
+ macro @Polygon { @TNode outline { polygon } }
+ macro @Isosceles { @TNode outline { isosceles } }
+ macro @Ellipse { @TNode outline { ellipse } }
+ macro @Circle { @TNode outline { circle } }
+
+ def fixroot
+ precedence 90
+ left root
+ {
+ /treevindent root
+ }
+
+ macro @LeftSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { L@T }
+ format { { |treehsep {L::y} } /treevsep x / insinuatelink }
+ }
+
+ macro @ZeroWidthLeftSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { L@T }
+ format { { |treehsep @ZeroWidth { {L::y} ^/treevsep } } /
+ x / insinuatelink }
+ }
+
+ macro @FirstSub
+ {
+ fixroot ||
+ @ObjectLink
+ basefrom { T }
+ baseto { S@T }
+ format { ||treehsep { {S::y} / insinuatelink / } }
+ }
+
+ macro @NextSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { S@T }
+ format { x /treevsep { | {S::y} { / insinuatelink / } } }
+ }
+
+ macro @RightSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { R@T }
+ format { x /treevsep { |treehsep {R::y} } / insinuatelink }
+ }
+
+ macro @ZeroWidthRightSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { R@T }
+ format { x / { |treehsep @ZeroWidth { /treevsep {R::y} } }
+ / insinuatelink }
+ }
+
+ macro @StubSub
+ {
+ @ObjectLink
+ basefrom { T }
+ baseto { T }
+ format { @VContract { { /0.5rt x / } || { /0.5rt
+ S:: @BoxLabels @CatchTags y / } } / insinuatelink }
+ # path { from S@T@SW S@T@SE to }
+ path {
+ P1:: S@NE
+ P2:: S@SE
+ FROM:: from boundaryatangle { from??CTR angleto P1 }
+ TO:: to boundaryatangle { to??CTR angleto P2 }
+ FROM P1 P2 TO
+ }
+ }
+
+ @HContract @VContract x
+ }
+
+ @BackEnd @Case {
+ PostScript @Yield {
+ {
+ save @Case { { yes Yes } @Yield "grestore save gsave" else @Yield {} }
+ maxlabels "ldiagbegin"
+ //
+ "ldiagend"
+ save @Case { { yes Yes } @Yield "restore" else @Yield {} }
+ } @Graphic @Body
+ }
+ PDF @Yield {}
+ }
+
+ @End @Diag
+}