
def @TeX { T{ /0.2fo E}X }

def @Code
    right x
{   { Helvetica Base -1p } @Font lines @Break x
}

######################################################
#                                                    #
#  Nodes and trees.                                  #
#                                                    #
######################################################

import @Fig
def @FBox
    named width  { 0.6c }
    named height { 0.4c }
    named margin { 0.1c }
    right x
{
    @Box margin { margin }
    {	width @Wide height @High
	{ /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
	}
    }
}

import @Fig
def @FEllipse
    named width  { 0.6c }
    named height { 0.4c }
    named margin { 0.1c }
    right x
{
    @Ellipse margin { margin }
    {	height @High
	{ /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
	}
    }
}

import @Fig
def @FCircle
    named width  { 0.4c }
    named height { 0.4c }
    named margin { 0.1c }
    right x
{
    @Circle margin { margin }
    {	width @Wide height @High
	{ /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
	}
    }
}

import @Fig
def @JoinFigures
    left A
    named linestyle  { solid   }
    named linewidth  { 0.5 pt  }
    named linecap    { round   }
    named dashlength { 0.15 cm }
    named arrow      { noarrow }
    named headstyle  { open    }
    named headwidth  { 0.05 cm }
    named headlength { 0.15 cm }
    right B
{
    @Line
	from       { {A"@CTR"} ++ {{A"@CTR"} @Angle {B"@CTR"} A"@CIRCUM"} }
	to         { {B"@CTR"} ++ {{B"@CTR"} @Angle {A"@CTR"} B"@CIRCUM"} }
	linestyle  { linestyle  }
	linewidth  { linewidth  }
	linecap    { linecap    }
	dashlength { dashlength }
	arrow      { arrow      }
	headstyle  { headstyle  }
	headwidth  { headwidth  }
	headlength { headlength }
    {}
}

import @Fig
export @LeftSub @RightSub @FirstSub @NextSub @StubSub @Node
def @Tree
    named hmargin    { 0.2c    }
    named vmargin    { 0.3c    }
    named linestyle  { solid   }
    named linewidth  { 0.5 pt  }
    named linecap    { round   }
    named dashlength { 0.15 cm }
    named arrow      { noarrow }
    named headstyle  { open    }
    named headwidth  { 0.05 cm }
    named headlength { 0.15 cm }
    body x
@Begin

    def @LeftSub
	precedence 90
	associativity left
	left root
	named hmargin    { hmargin    }
	named linestyle  { linestyle  }
	named linewidth  { linewidth  }
	named linecap    { linecap    }
	named dashlength { dashlength }
	named arrow      { arrow      }
	named headstyle  { headstyle  }
	named headwidth  { headwidth  }
	named headlength { headlength }
	right x
    {
	{ /vmargin {L::x} } |hmargin  root |
	L@T @JoinFigures
	        linestyle  { linestyle  }
	        linewidth  { linewidth  }
	        linecap    { linecap    }
	        dashlength { dashlength }
	        arrow      { arrow      }
	        headstyle  { headstyle  }
	        headwidth  { headwidth  }
	        headlength { headlength }
	T
    }

    def fixroot
	precedence 90
	left root
    {
	|0.5rt root
    }

    def firstsub
	precedence 90
	associativity left
	named hmargin    { hmargin    }
	named linestyle  { linestyle  }
	named linewidth  { linewidth  }
	named linecap    { linecap    }
	named dashlength { dashlength }
	named arrow      { arrow      }
	named headstyle  { headstyle  }
	named headwidth  { headwidth  }
	named headlength { headlength }
	right x
    {
	S::x &
	S@T @JoinFigures
		linestyle  { linestyle  }
		linewidth  { linewidth  }
		linecap    { linecap    }
		dashlength { dashlength }
		arrow      { arrow      }
		headstyle  { headstyle  }
		headwidth  { headwidth  }
		headlength { headlength }
	T
    }

    macro @FirstSub { fixroot //vmargin |0.5rt firstsub }

    def @NextSub
	precedence 90
	associativity left
	left others
	named hmargin    { hmargin    }
	named linestyle  { linestyle  }
	named linewidth  { linewidth  }
	named linecap    { linecap    }
	named dashlength { dashlength }
	named arrow      { arrow      }
	named headstyle  { headstyle  }
	named headwidth  { headwidth  }
	named headlength { headlength }
	right x
    {
	others &hmargin S::x &
	S@T @JoinFigures
		linestyle  { linestyle  }
		linewidth  { linewidth  }
		linecap    { linecap    }
		dashlength { dashlength }
		arrow      { arrow      }
		headstyle  { headstyle  }
		headwidth  { headwidth  }
		headlength { headlength }
	T
    }

    def @RightSub
	precedence 90
	associativity left
	left root
	named hmargin    { hmargin    }
	named linestyle  { linestyle  }
	named linewidth  { linewidth  }
	named linecap    { linecap    }
	named dashlength { dashlength }
	named arrow      { arrow      }
	named headstyle  { headstyle  }
	named headwidth  { headwidth  }
	named headlength { headlength }
	right x
    {
	root |hmargin  { /vmargin {R::x} } |
	R@T @JoinFigures
		linestyle  { linestyle  }
		linewidth  { linewidth  }
		linecap    { linecap    }
		dashlength { dashlength }
		arrow      { arrow      }
		headstyle  { headstyle  }
		headwidth  { headwidth  }
		headlength { headlength }
	T
    }

    def @StubSub
	precedence 90
	associativity left
	left root
	named linestyle  { linestyle  }
	named linewidth  { linewidth  }
	named linecap    { linecap    }
	named dashlength { dashlength }
    {
	root |
	@Figure
	    shape { T@SW
		    T@W -- { 0.1 cm 0.7 cm }
		    T@E -- {-0.1 cm 0.7 cm }
		    T@SE
		  }
	    linestyle  { linestyle  }
	    linewidth  { linewidth  }
	    linecap    { linecap    }
	    dashlength { dashlength }
	{ @Null }
    }

    def @Node
	# named mark {}
	right root
    {
	T:: root
	# & T@W ++ { -0.2 cm 0.1 cm } @BaseOf mark
    }

    @OneCol @OneRow x

@End @Tree


def @ShowMarks
    named linewidth  { 0.015 cm }
    named linestyle  { dashed   }
    named dashlength { 0.15 cm  }
    named paint      { lightgrey    }
    named marks      { both     } # none, horizontal, vertical, or both
    right x
{
    @Fig
    {	@Box margin { 0c } linewidth { linewidth } paint { paint }
	{   @Figure
		shape {
		    marks @Case {
		        { horizontal both } @Yield
			    { -0.3 cm ymark {xsize ymark} ++ {0.3 cm 0} }
		        else @Yield {}
		    }
		    marks @Case {
			both @Yield []
			else @Yield {}
		    }
		    marks @Case {
			{ vertical both } @Yield
			    { xmark -0.3 cm {xmark ysize} ++ {0 0.3 cm} }
			else @Yield {}
		    }
		}
		linewidth { linewidth }
		linestyle { linestyle }
		dashlength { dashlength }
	      x
	}
    }
}

   import @Fig
   def @DagBox
      named top {}
      named mid {}
      named base {}
   {
      @OneRow {
	   TOP::  @FBox top
	// MID::  @FBox mid
	// BASE:: @FBox base
      }
   }

   import @Fig
   def @BlackDot
      named diameter { 0.07c }
   {
      @Circle
	margin { 0c }
	paint { black }
      { diameter @Wide diameter @High {}
      }
   }

   import @Fig
   def @TVShape   # television shape enclosing points ne, nw, se, sw
       named nw {}
       named ne {}
       named sw {}
       named se {}
       named delta { 0.5 cm }
   {
       @Figure
	   shape {
		{ {nw @Min sw @Min ne @Min se} -- { delta 0 } } @Label BL
		{ {nw @Max sw @Max ne @Max se} ++ { delta 0 } } @Label TR
		BL ++ { 0 BL @YDistance TR } @Label TL
		BL ++ { BL @XDistance TR 0 } @Label BR
		BL
		BR			[ BR ++ {0 delta} ]
		BR ++ {delta delta}
		TR ++ {delta -delta}	[ TR -- {0 delta} ]
		TR
		TL			[ TL -- {0 delta} ]
		TL -- {delta delta}
		BL ++ {-delta delta}	[ BL ++ {0 delta} ]
		BL
	   }
       {}
   }

   import @Fig
   def @FunnyArrow
      named from {}
      named to {}
      named arrow { forward }
   {
      @Figure
         shape {from from ++ {0 from @YDistance to} to}
         arrow { arrow }
      {}
   }

   def "->" { {Symbol Base} @Font "\256" } #174 decimal
   def "=>" { {Symbol Base} @Font "\336" } #222 decimal
   macro @JP	{ /0.5v  }

   ###################################################
   #                                                 #
   #  Lout keywords.                                 #
   #                                                 #
   ###################################################

   def @@Begin         { @Code "@Begin"        }
   def @@Break         { @Code "@Break"        }
   def @@Case          { @Code "@Case"         }
   def @@Database      { @Code "@Database"     }
   def @@End           { @Code "@End"          }
   def @@Font          { @Code "@Font"         }
   def @@Galley        { @Code "@Galley"       }
   def @@Graphic       { @Code "@Graphic"      }
   def @@HExpand       { @Code "@HExpand"      }
   def @@HScale        { @Code "@HScale"       }
   def @@High          { @Code "@High"         }
   def @@Include       { @Code "@Include"      }
   def @@Key           { @Code "@Key"          }
   def @@LClos         { @Code "@LClos"        }
   def @@LEnv          { @Code "@LEnv"         }
   def @@LInput        { @Code "@LInput"       }
   def @@Moment        { @Code "@Moment"       }
   def @@Next          { @Code "@Next"         }
   def @@Null          { @Code "@Null"         }
   def @@OneCol        { @Code "@OneCol"       }
   def @@OneRow        { @Code "@OneRow"       }
   def @@Open          { @Code "@Open"         }
   def @@Prepend       { @Code "@Prepend"      }
   def @@Rotate        { @Code "@Rotate"       }
   def @@Space         { @Code "@Space"        }
   def @@SysDatabase   { @Code "@SysDatabase"  }
   def @@SysInclude    { @Code "@SysInclude"   }
   def @@SysPrepend    { @Code "@SysPrepend"   }
   def @@Tag           { @Code "@Tag"          }
   def @@Tagged        { @Code "@Tagged"       }
   def @@Use           { @Code "@Use"          }
   def @@VExpand       { @Code "@VExpand"      }
   def @@VScale        { @Code "@VScale"       }
   def @@Yield         { @Code "@Yield"        }
   def @@Wide          { @Code "@Wide"         }


   ###################################################
   #                                                 #
   #  Miscellaneous, mostly graphical definitions.   #
   #                                                 #
   ###################################################

   def @Leaders
   { ..   @Leaders
   }

   def @HLine {
     { 0 0 moveto xsize 0 lineto stroke }
     @Graphic {}
   }

   def @VDashLine
      right length
   {
      length @High
      { 0 0 moveto 0 ysize lineto [ 3 pt ] 0 setdash stroke }
      @Graphic {}
   }

   def @LBox
      right offset
   {  @OneCol @OneRow
      {
        {  //0.2c
           0.6c @High 1.2c @Wide
           { 0 0 moveto xsize 0 lineto
	     xsize ysize lineto 0 ysize lineto closepath
	     gsave 0.9 setgray fill grestore stroke }
           @Graphic {}
        }
        ||offset @VDashLine 1c
      }
   }

   def @Arrow
      right length
   {  @OneCol @OneRow
      {
	   30d @Rotate {0.12c @Wide @HLine}
	   //
	   length @Wide @HLine
	   //
	   "-30d" @Rotate {0.12c @Wide @HLine}
      }
   }

   def @DoubleArrow
      right length
   {  @OneCol @OneRow
      { 
         & 180d @Rotate @Arrow length
         |0io @Arrow length
      }
   }

   def @Put
     left coord
     right x
   { @OneCol @OneRow
     { coord / | @OneCol @OneRow x
     }
   }
   
   macro @At { //0io }


   ###################################################
   #                                                 #
   #  Interpolated example documents.                #
   #                                                 #
   ###################################################

   def @LittleEndRunPlace { @Galley }
   def @LittleEndRun
      force into { @LittleEndRunPlace&&preceding }
   {}

   def @LittleTextPlace { @Galley }
   def @LittleText into { @LittleTextPlace&&preceding }
      right x
   { x
   }

   def @LittleFootPlace { @Galley }
   def @LittleFootNote into { @LittleFootPlace&&following }
      right x
   { x
   }

   def @LittlePageColumn
      right x
   {
        9px @Break 8p @Font
        2.8c @Wide x
   }

   def @LittlePage
      right x
   {
      @HContract @VContract
      { 0 0 moveto xsize 0 lineto xsize ysize lineto
	0 ysize lineto closepath stroke } @Graphic
      {  //0.3c ||0.3c
         9px @Break 8p @Font
         2.8c @Wide 3.8c @High x
         ||0.3c //0.3c
      }
   }

   def @LittleFootSect
   {  1c @Wide @HLine
      //0.3v @LittleFootPlace ||0.5c
   }

   def @LittlePageList
     right @PageNum
   {
      @LittlePage { # |0.5rt @PageNum //0.8v
		//0.3v @LittleTextPlace
		//1rt @LittleFootSect
	     }
      //
      @LittlePageList @Next @PageNum
   }

   def @LittleDocument
   {  @LittlePage
      {  @LittleTextPlace
         //1rt @LittleFootSect
      }
      // @LittlePageList 2
      // @LittleEndRunPlace
   }
		
   def @Strange
       named @Format right @Val { [@Val] }
       right x
   {   @Format x
   }
