
###############################################################################
#                                                                             #
#  Lout @DocumentLayout package (Version 3.06)                                #
#                                                                             #
#  Version 1.0 by Jeffrey H. Kingston, 17 July 1991.                          #
#  Version 2.0 by Jeffrey H. Kingston, 22 December 1992.                      #
#  Version 3.0 by Jeffrey H. Kingston, 19 April 1994.                         #
#  Version 3.03 by Jeffrey H. Kingston, 6 May 1995.                           #
#  Versions 3.04 and 3.05 by Jeffrey H. Kingston, 11 June 1995.               #
#  Version 3.05 by Jeffrey H. Kingston, 25 July 1995.                         #
#                                                                             #
#  This Lout package contains the general definitions used by all types of    #
#  documents.  It needs to be extended (see docf, reportf, bookf, slidesf,    #
#  etc.) with definitions for particular document types.  Consult "A User's   #
#  Guide to the Lout Document Formatting System" for user information.        #
#                                                                             #
###############################################################################

    @SysPrependGraphic { "dl.lpg" }   # margin note setup

    ###########################################################################
    #                                                                         #
    #  The following symbols are defined outside @DocumentLayout so that      #
    #  they can be invoked when setting its parameters in the @Use clause.    #
    #                                                                         #
    ###########################################################################

    ###########################################################################
    #                                                                         #
    #   @Plain, @Sym, font symbols, and miscellaneous special characters.     #
    #                                                                         #
    ###########################################################################

    def @Plain
        left x
        right y
    {
        @BackEnd @Case {
            PlainText @Yield x
            PostScript @Yield y
        }
    }

    def @Sym right x { { Symbol Base } @Font @Char x		}

    def @R   right x { Base @Font x				}
    def @I   right x { Slope @Font x				}
    def @B   right x { Bold @Font x				}
    def @BI  right x { BoldSlope @Font x			}
    def @S   right x { smallcaps @Font x			}

    def "``"       { "``"  @Plain @Char "quotedblleft"		}
    def "''"       { "''"  @Plain @Char "quotedblright"		}
    def "--"       { "--"  @Plain @Char "endash"		}
    def "---"      { "---" @Plain @Char "emdash"		}
    def @Bullet    { "o"   @Plain @Char "bullet"		}
    def @ParSym    { "P"   @Plain @Char "paragraph"		}
    def @SectSym   { "$"   @Plain @Char "section"		}
    def @Dagger    { "+"   @Plain @Char "dagger"		}
    def @DaggerDbl { "++"  @Plain @Char "daggerdbl"		}
    def @CDot      { "."   @Plain @Char "periodcentered"	}
    def @Sterling  { "&"   @Plain @Char "sterling"		}
    def @Yen       { "Y"   @Plain @Char "yen"			}
    def @Florin    { "f"   @Plain @Char "florin"		}

    def @Star      { "*"   @Plain @Sym  "asteriskmath"		}
    def @Degree    { "o"   @Plain @Sym  "degree"		}
    def @Minute    { "'"   @Plain @Sym  "minute"		}
    def @Second    { "''"  @Plain @Sym  "second"		}
    def @Multiply  { "x"   @Plain @Sym  "multiply"		}
    def @Divide    { "/"   @Plain @Sym  "divide"		}
    def @Lozenge   { "O"   @Plain @Sym  "lozenge"		}
    def @Register  { "R"   @Plain @Sym  "registersans"		}
    def @CopyRight { "C"   @Plain @Sym  "copyrightsans"		}
    def @TradeMark { "TM"  @Plain @Sym  "trademarksans"		}


    ###########################################################################
    #                                                                         #
    #  Symbols stored in the "standard" database                              #
    #                                                                         #
    #    @Word            language-spacific words such as Chapter, etc.       #
    #    @Roman           lower case Roman numerals i, ii, ... , cc           #
    #    @UCRoman         upper case Roman numerals I, II, ... , CC           #
    #    @Alpha           lower case Roman alphabet a, b,  ... , z            #
    #    @UCAlpha         upper case Roman alphabet A, B,  ... , Z            #
    #    @Months          months of the year:  January, ... , December        #
    #    @ShortMonths     months of the year, abbreviated:  Jan, ... , Dec    #
    #    @WeekDays        days of the week:  Sunday, ... , Saturday           #
    #    @ShortWeekDays   days of the week, abbreviated:  Sun, ... , Sat      #
    #    @TwelveHours     hours, from 1 to 12                                 #
    #    @ShortHours      hours, from 0 to 23                                 #
    #    @DateTimeFormat  format of results of @Date and @Time                #
    #                                                                         #
    ###########################################################################

    def @Word		left @Tag right @Val { @Val }
    def @Roman		left @Tag right @Val { @Val }
    def @UCRoman	left @Tag right @Val { @Val }
    def @Alpha		left @Tag right @Val { @Val }
    def @UCAlpha	left @Tag right @Val { @Val }
    def @Months		left @Tag right @Val { @Val }
    def @ShortMonths	left @Tag right @Val { @Val }
    def @WeekDays	left @Tag right @Val { @Val }
    def @ShortWeekDays	left @Tag right @Val { @Val }
    def @TwelveHours  	left @Tag right @Val { @Val }
    def @ShortHours  	left @Tag right @Val { @Val }
    def @MeriDiems  	left @Tag right @Val { @Val }
    def @ShortMeriDiems	left @Tag right @Val { @Val }

    export @Value
    def @DateTimeFormat	left @Tag
	named @Value
	    named @Year          {}
	    named @ShortYear     {}
	    named @Month         {}
	    named @ShortMonth    {}
	    named @MonthNum      {}
	    named @Day           {}
	    named @ShortDay      {}
	    named @DayNum        {}
	    named @MeriDiem      {}
	    named @ShortMeriDiem {}
	    named @Hour          {}
	    named @TwelveHour    {}
	    named @ShortHour     {}
	    named @Minute        {}
	    named @Second        {}
	{}
    {}

    @SysDatabase @Word @Roman @UCRoman @Alpha @UCAlpha @Months
		 @ShortMonths @WeekDays @ShortWeekDays @TwelveHours
		 @ShortHours @MeriDiems @ShortMeriDiems @DateTimeFormat
    { standard  }


    ###########################################################################
    #                                                                         #
    #  @Date and @Time: the date and time now.                                #
    #                                                                         #
    ###########################################################################

    def @Date
      named @Format
	named @Year          { @Moment&&now @Open { {@Century}@Year          }}
	named @ShortYear     { @Moment&&now @Open { @Year                    }}
	named @Month         { @Moment&&now @Open { @Months&&@Month          }}
	named @ShortMonth    { @Moment&&now @Open { @ShortMonths&&@Month     }}
	named @MonthNum      { @Moment&&now @Open { @Month                   }}
	named @Day           { @Moment&&now @Open { @WeekDays&&@WeekDay      }}
	named @ShortDay      { @Moment&&now @Open { @ShortWeekDays&&@WeekDay }}
	named @DayNum        { @Moment&&now @Open { @Day                     }}
	named @MeriDiem      { @Moment&&now @Open { @MeriDiems&&@Hour        }}
	named @ShortMeriDiem { @Moment&&now @Open { @ShortMeriDiems&&@Hour   }}
	named @Hour          { @Moment&&now @Open { @Hour                    }}
	named @TwelveHour    { @Moment&&now @Open { @TwelveHours&&@Hour      }}
	named @ShortHour     { @Moment&&now @Open { @ShortHours&&@Hour       }}
	named @Minute        { @Moment&&now @Open { @Minute                  }}
	named @Second        { @Moment&&now @Open { @Second                  }}
      {
	  @DateTimeFormat&&date @Open { @Value
	    @Year          { @Year }
	    @ShortYear     { @ShortYear }
	    @Month         { @Month }
	    @ShortMonth    { @ShortMonth }
	    @MonthNum      { @MonthNum }
	    @Day           { @Day }
	    @ShortDay      { @ShortDay }
	    @DayNum        { @DayNum }
	    @MeriDiem      { @MeriDiem }
	    @ShortMeriDiem { @ShortMeriDiem }
	    @Hour          { @Hour }
	    @TwelveHour    { @TwelveHour }
	    @ShortHour     { @ShortHour }
	    @Minute        { @Minute }
	    @Second        { @Second }
	  }
      }
    { @Format }

    def @Time
      named @Format
	named @Year          { @Moment&&now @Open { {@Century}@Year          }}
	named @ShortYear     { @Moment&&now @Open { @Year                    }}
	named @Month         { @Moment&&now @Open { @Months&&@Month          }}
	named @ShortMonth    { @Moment&&now @Open { @ShortMonths&&@Month     }}
	named @MonthNum      { @Moment&&now @Open { @Month                   }}
	named @Day           { @Moment&&now @Open { @WeekDays&&@WeekDay      }}
	named @ShortDay      { @Moment&&now @Open { @ShortWeekDays&&@WeekDay }}
	named @DayNum        { @Moment&&now @Open { @Day                     }}
	named @MeriDiem      { @Moment&&now @Open { @MeriDiems&&@Hour        }}
	named @ShortMeriDiem { @Moment&&now @Open { @ShortMeriDiems&&@Hour   }}
	named @Hour          { @Moment&&now @Open { @Hour                    }}
	named @TwelveHour    { @Moment&&now @Open { @TwelveHours&&@Hour      }}
	named @ShortHour     { @Moment&&now @Open { @ShortHours&&@Hour       }}
	named @Minute        { @Moment&&now @Open { @Minute                  }}
	named @Second        { @Moment&&now @Open { @Second                  }}
      {
	  @DateTimeFormat&&time @Open { @Value
	    @Year          { @Year }
	    @ShortYear     { @ShortYear }
	    @Month         { @Month }
	    @ShortMonth    { @ShortMonth }
	    @MonthNum      { @MonthNum }
	    @Day           { @Day }
	    @ShortDay      { @ShortDay }
	    @DayNum        { @DayNum }
	    @MeriDiem      { @MeriDiem }
	    @ShortMeriDiem { @ShortMeriDiem }
	    @Hour          { @Hour }
	    @TwelveHour    { @TwelveHour }
	    @ShortHour     { @ShortHour }
	    @Minute        { @Minute }
	    @Second        { @Second }
	  }
      }
    { @Format }


    ###########################################################################
    #                                                                         #
    #  @Centre, @Center, @Right, @DotSep, @DotJoin, @OverStrike               #
    #                                                                         #
    ###########################################################################

    macro @Centre { |0.5rt @OneCol }
    macro @Center { |0.5rt @OneCol }
    macro @Right  { |1.0rt @OneCol }

    def @DotSep left x right y
    {
	x @Case {
	    {}   @Yield y
	    else @Yield {
	        y @Case {
		    {}   @Yield x
		    else @Yield { x. |2s y }
	        }
	    }
        }
    }

    def @DotJoin left x right y
    {
        x @Case {
	    {}   @Yield y
	    else @Yield {
	        y @Case {
		    {}   @Yield x
		    else @Yield { x.y }
	        }
	    }
        }
    }

    def @OverStrike left x right y
    {
	@OneRow { @HContract @VContract x /0io @HContract @VContract y }
    }


    ###########################################################################
    #                                                                         #
    #   @Sup and @Sub                                                         #
    #                                                                         #
    ###########################################################################

    def @Sup
	left x
	named gap { 0.40fk }
	right y
    {
	@HContract @VContract
	{
	    | 0.7f @Font y ^/gap x
	}
    }

    def @Sub
	left x
	named gap { 0.40fk }
	right y
    {
	@HContract @VContract
	{
	    x /gap | 0.7f @Font y
	}
    }


    ###########################################################################
    #                                                                         #
    #   @Colour, @Color, @AddPaint, @LineWidth                                #
    #                                                                         #
    ###########################################################################

    def @ColourCommand right col
    {
	col @Case {
	    nochange		@Yield	{ nochange                }
	    darkblue		@Yield	{ 0.0 0.0 0.5 setrgbcolor }
	    blue		@Yield	{ 0.0 0.0 1.0 setrgbcolor }
	    lightblue		@Yield	{ 0.5 0.5 1.0 setrgbcolor }
	    darkgreen		@Yield	{ 0.0 0.5 0.0 setrgbcolor }
	    green		@Yield	{ 0.0 1.0 0.0 setrgbcolor }
	    lightgreen		@Yield	{ 0.5 1.0 0.5 setrgbcolor }
	    darkred		@Yield	{ 0.5 0.0 0.0 setrgbcolor }
	    red			@Yield	{ 1.0 0.0 0.0 setrgbcolor }
	    lightred		@Yield	{ 1.0 0.5 0.5 setrgbcolor }
	    darkcyan		@Yield	{ 0.0 0.5 0.5 setrgbcolor }
	    cyan		@Yield	{ 0.0 1.0 1.0 setrgbcolor }
	    lightcyan		@Yield	{ 0.5 1.0 1.0 setrgbcolor }
	    darkmagenta		@Yield	{ 0.5 0.0 0.5 setrgbcolor }
	    magenta		@Yield	{ 1.0 0.0 1.0 setrgbcolor }
	    lightmagenta	@Yield	{ 1.0 0.5 1.0 setrgbcolor }
	    darkyellow		@Yield	{ 0.5 0.5 0.0 setrgbcolor }
	    yellow		@Yield	{ 1.0 1.0 0.0 setrgbcolor }
	    lightyellow		@Yield	{ 1.0 1.0 0.5 setrgbcolor }
	    darkgray		@Yield	{ 0.2 0.2 0.2 setrgbcolor }
	    gray		@Yield	{ 0.5 0.5 0.5 setrgbcolor }
	    lightgray		@Yield	{ 0.8 0.8 0.8 setrgbcolor }
	    darkgrey		@Yield	{ 0.2 0.2 0.2 setrgbcolor }
	    grey		@Yield	{ 0.5 0.5 0.5 setrgbcolor }
	    lightgrey		@Yield	{ 0.8 0.8 0.8 setrgbcolor }
	    black		@Yield	{ 0.0 0.0 0.0 setrgbcolor }
	    white		@Yield	{ 1.0 1.0 1.0 setrgbcolor }
	}
    }

    def @Colour left col right y { {@ColourCommand col} @SetColour y }

    macro @Color { @Colour }

    def @AddPaint right col
    {
	col @Case {
	    none      @Yield ""
	    nochange  @Yield "gsave fill grestore"
	    else      @Yield { "gsave" @ColourCommand col "fill grestore" }
	}
    }

    def @LineWidth right lw
    {
	lw @Case {
	   ""	@Yield ""
	   else	@Yield { lw "setlinewidth" }
	}
    }


    ###########################################################################
    #                                                                         #
    #   @Box, @CurveBox, and @ShadowBox                                       #
    #                                                                         #
    ###########################################################################

    def @Box
	named margin { 0.3f }
	named linewidth
	    named c { " cm" }
	    named i { " in" }
	    named e { " em" }
	    named p { " pt" }
	    named f { " ft" }
	    named s { " sp" }
	    named v { " vs" }
	{}
	named paint { none }
	right x
    {
	@VContract @HContract 0c @HShift {
	    {"LoutBox" @AddPaint paint @LineWidth linewidth "stroke"} @Graphic
	    { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
	}
    }

    def @CurveBox
	named margin { 0.3f }
	named linewidth
	    named c { " cm" }
	    named i { " in" }
	    named e { " em" }
	    named p { " pt" }
	    named f { " ft" }
	    named s { " sp" }
	    named v { " vs" }
	{}
	named paint { none }
	right x
    {
	@VContract @HContract 0c @HShift {
	    { "LoutCurveBox" @AddPaint paint @LineWidth linewidth "stroke" }
	    @Graphic { ^/margin ^|margin 0c @HShift @OneRow x |margin /margin }
	}
    }

    def @ShadowBox
	named margin { 0.3f }
	named linewidth
	    named c { " cm" }
	    named i { " in" }
	    named e { " em" }
	    named p { " pt" }
	    named f { " ft" }
	    named s { " sp" }
	    named v { " vs" }
	{}
	named paint { none }
	named shadow { 0.2f }
	right x
    {
	@VContract @HContract 0c @HShift {
	    "LoutShadowBox fill" @Graphic
	    {	^/shadow ^|shadow 0c @HShift
		@Box margin {margin} paint {paint} linewidth {linewidth} x
		|shadow /shadow
	    }
	}
    }


    ###########################################################################
    #                                                                         #
    #   @Verbatim                                                             #
    #                                                                         #
    ###########################################################################

    def @Verbatim right x
    {
	def @Filter {
	    "sed '1,$s/\\\\/\\\\\\\\/g;1,$s/\"/\\\\\"/g;1,$s/^/\"/;1,$s/$/\"/'"
	    "<" @FilterIn ">" @FilterOut
	}

	lines @Break x
    }

    ###########################################################################
    #                                                                         #
    #   @PageMarker, @PageMark, and @PageOf                                   #
    #                                                                         #
    ###########################################################################

    export num @Tag
    def @PageMarker
	named @Tag {}
	right num
    {
	# @Null
	@PageLabel num
    }

    def @PageMark
	right x
    {
	@PageMarker&&preceding @Tagged x
    }

    def @PageOf
	right x
    {
	@PageMarker&&x @Open { num }
    }


    ###########################################################################
    #                                                                         #
    #   @Proof and @EndProof                                                  #
    #                                                                         #
    ###########################################################################

    def @Proof { @B @Word&&proof }
    macro @EndProof { &1rt @Box {} }


###############################################################################
#                                                                             #
#   @DocumentLayout                                                           #
#                                                                             #
###############################################################################

export
    @InitialFont @InitialBreak @HeadingFont @ParaGap @ParaIndent
    @DisplayGap @DisplayIndent @DefaultIndent @WideIndent @VeryWideIndent

    @Heading "^" "&-" @If @Not @And @Or @True
    @Runner @NumberOf
    @PP @LP @LLP @DP @NP @CNP
	
    @BAD     @BeginAlignedDisplays
    @EAD     @EndAlignedDisplays
    @BND     @BeginNumberedDisplays
    @END     @EndNumberedDisplays

    @D       @Display
    @LD      @LeftDisplay
    @ID      @IndentedDisplay
    @QD      @QuotedDisplay
    @CD      @CentredDisplay @CenteredDisplay
    @AD      @AlignedDisplay
    @LAD     @LeftAlignedDisplay
    @IAD     @IndentedAlignedDisplay
    @QAD     @QuotedAlignedDisplay
    @CAD     @CentredAlignedDisplay @CenteredAlignedDisplay
    @ND      @NumberedDisplay
    @LND     @LeftNumberedDisplay
    @IND     @IndentedNumberedDisplay
    @QND     @QuotedNumberedDisplay
    @CND     @CentredNumberedDisplay @CenteredNumberedDisplay
    @AND     @AlignedNumberedDisplay
    @LAND    @LeftAlignedNumberedDisplay
    @IAND    @IndentedAlignedNumberedDisplay
    @QAND    @QuotedAlignedNumberedDisplay
    @CAND    @CentredAlignedNumberedDisplay @CenteredAlignedNumberedDisplay

    @RD      @RawDisplay
    @RLD     @RawLeftDisplay
    @RID     @RawIndentedDisplay
    @RQD     @RawQuotedDisplay
    @RCD     @RawCentredDisplay @RawCenteredDisplay
    @RAD     @RawAlignedDisplay
    @RLAD    @RawLeftAlignedDisplay
    @RIAD    @RawIndentedAlignedDisplay
    @RQAD    @RawQuotedAlignedDisplay
    @RCAD    @RawCentredAlignedDisplay @RawCenteredAlignedDisplay
    @RND     @RawNumberedDisplay
    @RLND    @RawLeftNumberedDisplay
    @RIND    @RawIndentedNumberedDisplay
    @RQND    @RawQuotedNumberedDisplay
    @RCND    @RawCentredNumberedDisplay @RawCenteredNumberedDisplay
    @RAND    @RawAlignedNumberedDisplay
    @RLAND   @RawLeftAlignedNumberedDisplay
    @RIAND   @RawIndentedAlignedNumberedDisplay
    @RQAND   @RawQuotedAlignedNumberedDisplay
    @RCAND   @RawCentredAlignedNumberedDisplay
             @RawCenteredAlignedNumberedDisplay
	
    @LI      @ListItem
    @DLI     @DropListItem
    @TI      @TagItem
    @DTI     @DropTagItem

    @EL      @EndList
    @REL     @RawEndList

             @RawList
    @RLL     @RawLeftList
    @RIL     @RawIndentedList
    @RQL     @RawQuotedList
    @RCL     @RawCentredList @RawCenteredList
    @RNL     @RawNumberedList
    @RPNL    @RawParenNumberedList
    @RRL     @RawRomanList
    @RPRL    @RawParenRomanList
    @RUCRL   @RawUCRomanList
    @RPUCRL  @RawParenUCRomanList
    @RAL     @RawAlphaList
    @RPAL    @RawParenAlphaList
    @RUCAL   @RawUCAlphaList
    @RPUCAL  @RawParenUCAlphaList
    @RBL     @RawBulletList
    @RSL     @RawStarList
    @RDL     @RawDashList
    @RTL     @RawTaggedList
    @RWTL    @RawWideTaggedList
    @RVWTL   @RawVeryWideTaggedList

    @L       @List
    @LL	     @LeftList
    @IL      @IndentedList
    @QL      @QuotedList
    @CL	     @CentredList @CenteredList
    @NL      @NumberedList 
    @PNL     @ParenNumberedList
    @RL      @RomanList
    @PRL     @ParenRomanList
    @UCRL    @UCRomanList
    @PUCRL   @ParenUCRomanList
    @AL      @AlphaList
    @PAL     @ParenAlphaList
    @UCAL    @UCAlphaList
    @PUCAL   @ParenUCAlphaList
    @BL      @BulletList 
    @SL      @StarList 
    @DL      @DashList
    @TL	     @TaggedList
    @WTL     @WideTaggedList
    @VWTL    @VeryWideTaggedList

    @Figure @Table
    @LeftNote @RightNote @OuterNote @InnerNote
    @Reference @RefStyle @RefPrint
    @Ref @NoRef @ChapRef @NoChapRef
    @Cite @NoCite @ChapCite @NoChapCite
    @Index @SubIndex @SubSubIndex @RawIndex
    @RawSubIndex @RawSubSubIndex @IndexBlanks

    @BypassContentsEntry @BypassMajorContentsEntry
    @BypassFigureContentsEntry @BypassTableContentsEntry
    @BypassReference @BypassChapReference
    @BypassBeginIndex @BypassRawIndex @BypassEndIndex


def @DocumentLayout
    named @InitialFont		{  Times Base 12p	} # initial font
    named @InitialBreak		{  adjust 1.20fx hyphen } # initial break
    named @InitialLanguage	{  English	} # initial language
    named @InitialColour	{  black	} # initial colour
    named @HeadingFont		{  Bold		} # font for @Heading
    named @ParaGap		{  1.30vx	} # gap between paragraphs
    named @ParaIndent		{  2.00f	} # first-line indent for @PP
    named @DisplayGap		{  1.00v	} # gap above, below displays
    named @DisplayIndent	{  2.00f	} # @IndentedDisplay indent
    named @DefaultIndent	{  0.5rt	} # @Display indent
    named @WideIndent		{  4.00f	} # @WideTaggedList indent
    named @VeryWideIndent	{  8.00f	} # @VeryWideTaggedList indent
    named @ListGap		{  1.00v	} # gap between list items
    named @ListIndent		{  0c		} # indent of list items
    named @ListRightIndent	{  0c		} # right indent of list items
    named @ListLabelWidth	{  2.00f	} # width allowed for list tags
    named @PageType		{  A4		} # page type (width, height)
    named @PageWidth		{		} # page width if type Other
    named @PageHeight		{		} # page height if type Other
    named @PageOrientation	{  Portrait	} # Portrait, Landscape, etc.
    named @PageBackground	{  		} # background of each page
    named @TopMargin		{  2.50c	} # top margin of all pages
    named @FootMargin		{  2.50c	} # bottom margin of all pages
    named @OddLeftMargin	{  2.50c	} # left margin of odd pages
    named @OddRightMargin	{  2.50c	} # right margin of odd pages
    named @EvenLeftMargin	{  2.50c	} # left margin of even pages
    named @EvenRightMargin	{  2.50c	} # right margin of even pages
    named @PageBoxType		{  None		} # None Box CurveBox ShadowBox
    named @PageBoxMargin	{  1.00c	} # page box margin
    named @PageBoxLineWidth
	named c { " cm" } named i { " in" } named e { " em" }
	named p { " pt" } named f { " ft" } named s { " sp" }
	named v { " vs" }
				{		} # page box line thickness
    named @PageBoxPaint		{  none		} # page box paint
    named @PageBoxShadow	{  0.60c	} # shadow margin if ShadowBox
    named @ColumnNumber		{  1		} # number of columns (1 to 10)
    named @ColumnGap		{  1.00c	} # column gap
    named @FigureNumbers	{  Arabic	} # method of numbering figures
    named @TableNumbers		{  Arabic	} # method of numbering tables
    named @CaptionFont          {               } # figure, table caption font
    named @CaptionBreak         {               } # figure, table caption break
    named @MakeFigureContents   {  No           } # list of figures at start
    named @MakeTableContents    {  Yes          } # list of tables at start
    named @MakeContents		{  No		} # make contents? Yes or No
    named @ContentsGap		{  0.20v	} # extra gap above minor entry
    named @ContentsGapAbove	{  0.80v	} # extra gap above major entry
    named @ContentsGapBelow	{  0.00v	} # extra gap below major entry
    named @ContentsLeader	{  ..		} # leader symbol in contents
    named @ContentsLeaderGap	{  4s		} # gap between leaders
    named @ContentsRightWidth	{  3f		} # page numbers column width

    named @MakeReferences	{  Yes		} # make references? Yes or No
    named @RefCiteStyle right cite {  [cite]	} # citation style
    named @RefCiteLabels
	named @RefNum       {}
	named @Tag          {}
	named @Type         {}
	named @Abstract     {}
	named @Address      {}
	named @Annote       {}
	named @Author       {}
	named @Day          {}
	named @Edition      {}
	named @HowPublished {}
	named @InAuthor     {}
	named @InTitle      {}
	named @Institution  {}
	named @Journal      {}
	named @Keywords     {}
	named @Label        {}
	named @Month        {}
	named @Note         {}
	named @Number       {}
	named @Organization {}
	named @Page         {}
	named @Pages        {}
	named @Pinpoint     {}
	named @Publisher    {}
	named @Title        {}
	named @TitleNote    {}
	named @TRType       {}
	named @Volume       {}
	named @Year         {}
				{  @RefNum	} # citation items
    named @RefNumbers		{  Arabic	} # reference numbers

    named @RefListFormat	{  Labels	} # NoLabels, Labels,
						  # DropLabels, IntegrateLabels
    named @RefListLabels
	named @RefNum       {}
	named @Tag          {}
	named @Type         {}
	named @Abstract     {}
	named @Address      {}
	named @Annote       {}
	named @Author       {}
	named @Day          {}
	named @Edition      {}
	named @HowPublished {}
	named @InAuthor     {}
	named @InTitle      {}
	named @Institution  {}
	named @Journal      {}
	named @Keywords     {}
	named @Label        {}
	named @Month        {}
	named @Note         {}
	named @Number       {}
	named @Organization {}
	named @Page         {}
	named @Pages        {}
	named @Pinpoint     {}
	named @Publisher    {}
	named @Title        {}
	named @TitleNote    {}
	named @TRType       {}
	named @Volume       {}
	named @Year         {}
				{  [@RefNum]	} # ref list label format
    named @RefListTitle		{  references	} # title of reference list
    named @ChapRefListTitle	{  references	} # title of chapter ref list
    named @RefListIndent	{  0c		} # indent to left of labels
    named @RefListRightIndent	{  0c		} # indent to right of items
    named @RefListGap		{  1.00v	} # gap between ref list items
    named @RefListFont		{        	} # font used in reference list
    named @RefListBreak		{        	} # break style of ref list
    named @RefListLabelWidth 	{  2.00f	} # numeric labels column width
    named @RefListSortKey
	named @Tag          {}
	named @Type         {}
	named @Abstract     {}
	named @Address      {}
	named @Annote       {}
	named @Author       {}
	named @Day          {}
	named @Edition      {}
	named @HowPublished {}
	named @InAuthor     {}
	named @InTitle      {}
	named @Institution  {}
	named @Journal      {}
	named @Keywords     {}
	named @Label        {}
	named @Month        {}
	named @Note         {}
	named @Number       {}
	named @Organization {}
	named @Page         {}
	named @Pages        {}
	named @Pinpoint     {}
	named @Publisher    {}
	named @Title        {}
	named @TitleNote    {}
	named @TRType       {}
	named @Volume       {}
	named @Year         {}
				{  @Tag		} # sorting key

    named @MakeIndex		{  No		} # make index? Yes or No
    named @IndexFont		{		} # index entries font
    named @IndexBreak		{ outdent 1.2fx	} # index entries break
    named @IndexColumnNumber	{  2		} # index columns (1 to 10)
    named @IndexColumnGap	{  1.00c	} # index column gap
    named @TopGap		{  0.75c	} # gap between figures
    named @MidGap		{  0.75c	} # gap above/below body text
    named @FootNoteThrough	{  No		} # numbered through chapter?
    named @FootNoteNumbers	{  Arabic	} # footnote numbers
    named @FootNoteFont		{  0.80f	} # font for footnotes
    named @FootNoteBreak	{  1.20fx	} # break for footnotes
    named @FootLen		{  2.00c	} # length of footnote line
    named @FootGap		{  0.20c	} # gap between footnotes

    named @MarginNoteFont	{  0.80f	} # font of margin notes
    named @MarginNoteBreak	{  ragged 1.10fx		} # break style of margin notes
    named @MarginNoteHGap	{  0.5c   	} # horizontal gap to notes
    named @MarginNoteVGap	{  1.00v  	} # min vertical gap between
    named @MarginNoteWidth	{  1.50c  	} # width of margin notes

    named @EndNoteNumbers	{  Arabic	} # endnote numbers
    named @EndNoteFont		{  0.80f	} # font of endnotes
    named @EndNoteBreak		{  1.20fx	} # break for endnotes
    named @EndNoteGap		{  0.20c	} # gap between endnotes
    named @PageHeaders		{  Simple	} # None Simple Titles NoTitles
    named @PageNumbers		{  Arabic	} # page numbers
    named @FirstPageNumber	{  1		} # number of first page 
    named @IntroPageNumbers	{  Roman	} # intro page numbers
    named @IntroFirstPageNumber	{  1		} # number of first intro page 

    named @OddTop	      right @PageNum { @Centre { - @PageNum - }	}
    named @OddFoot	      right @PageNum { @Null                    }
    named @EvenTop	      right @PageNum { @Centre { - @PageNum - }	}
    named @EvenFoot	      right @PageNum { @Null                    }
    named @StartOddTop	      right @PageNum { @Null                    }
    named @StartOddFoot	      right @PageNum { @Null                    }
    named @StartEvenTop	      right @PageNum { @Null                    }
    named @StartEvenFoot      right @PageNum { @Null                    }

    named @IntroOddTop	      right @PageNum { @Null                    }
    named @IntroOddFoot	      right @PageNum { @Null                    }
    named @IntroEvenTop	      right @PageNum { @Null                    }
    named @IntroEvenFoot      right @PageNum { @Null                    }
    named @IntroStartOddTop   right @PageNum { @Null                    }
    named @IntroStartOddFoot  right @PageNum { @Null                    }
    named @IntroStartEvenTop  right @PageNum { @Null                    }
    named @IntroStartEvenFoot right @PageNum { @Null                    }

    named @RunningOddTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @I { @MinorNum @DotSep @MinorTitle } @Right @B @PageNum }

    named @RunningOddFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningEvenTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @B @PageNum @Right @I { @MajorNum @DotSep @MajorTitle } }

    named @RunningEvenFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningStartOddTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningStartOddFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Centre { Bold 0.8f } @Font @PageNum }

    named @RunningStartEvenTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningStartEvenFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Centre { Bold 0.8f } @Font @PageNum }


    named @RunningIntroOddTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningIntroOddFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Right @PageNum  }

    named @RunningIntroEvenTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningIntroEvenFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @PageNum }

    named @RunningIntroStartOddTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningIntroStartOddFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningIntroStartEvenTop
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }

    named @RunningIntroStartEvenFoot
	named @MajorNum {} named @MajorTitle {}
	named @MinorNum {} named @MinorTitle {} right @PageNum
    { @Null }


@Begin


    ###########################################################################
    #                                                                         #
    #  @Protect x                                                             #
    #                                                                         #
    #  Like @CNP, this reserves space on the current page or else makes sure  #
    #  x appears on the following page.  Lookahead is proportional to font    #
    #  size.                                                                  #
    #                                                                         #
    ###########################################################################

    def @Protect right x { 3.0f @High //0io // x }


    ###########################################################################
    #                                                                         #
    #   @HLine                                                                #
    #                                                                         #
    #   Draws a horizontal line to fill available space.                      #
    #                                                                         #
    ###########################################################################

    def @HLine
    {
	def @HHH { "-"@HHH }
    
	@BackEnd @Case {
	   PlainText @Yield @HHH
	   PostScript @Yield { {0 0 moveto xsize 0 lineto stroke} @Graphic {} }
	}
    }


    ###########################################################################
    #                                                                         #
    #  Miscellaneous.                                                         #
    #                                                                         #
    ###########################################################################

    def @Heading       right x { ragged @Break @HeadingFont      @Font x }
    def "^"		       { {} ^& {}				 }
    def "&-"  left x   right y { x &0ch y				 }


    ###########################################################################
    #                                                                         #
    #  @If @Not @And @Or @True                                                #
    #                                                                         #
    #  Used in databases to make optional fields format nicely.               #
    #                                                                         #
    ###########################################################################

    def @If
	precedence 97
	left x
	right y
    {
	y @Case {
	    {} @Yield @Null
	    else @Yield { @Null{x} }
	}
    }

    def @Not
	precedence 100
	right y
    {
	y @Case {
	    {} @Yield "*"
	    else @Yield ""
	}
    }

    def @And
	precedence 99
	left x
	right y
    {
	x @Case {
	   {} @Yield {}
	   else @Yield y
	}
    }

    def @Or
	precedence 98
	left x
	right y
    {
	x @Case {
	   {} @Yield y
	   else @Yield x
	}
    }

    def @True { "*" }

    ###########################################################################
    #                                                                         #
    #  x @Dft y                                                               #
    #                                                                         #
    #  This returns x unless its value is "dft", in which case it returns y.  #
    #  Useful for defaulting the value of one parameter to another.           #
    #                                                                         #
    ###########################################################################

    def @Dft
	left x
	right y
    {
	x @Case {
	    dft  @Yield y
	    else @Yield x
	}
    }


    ###########################################################################
    #                                                                         #
    #  x @Then y                                                              #
    #                                                                         #
    #  This returns the empty object if x is No or None, otherwise y.         #
    #                                                                         #
    ###########################################################################

    def @Then
	left x
	right y
    {
	x @Case {
	    { No None } @Yield {}
	    else        @Yield y
	}
    }


    ###########################################################################
    #                                                                         #
    #  Number markers.                                                        #
    #                                                                         #
    ###########################################################################

    def @Num
	left numtype
	right num
    {
	numtype @Case {
	    None    @Yield {}
	    Arabic  @Yield num
	    Roman   @Yield @Roman&&num
	    UCRoman @Yield @UCRoman&&num
	    Alpha   @Yield @Alpha&&num
	    UCAlpha @Yield @UCAlpha&&num
	}
    }


    export @Tag @Value
    def @NumberMarker
	named @Tag {}
	right @Value
    {
	@Null
    }

    def @NumberOf
	right x
    {
	@NumberMarker&&x @Open { @Value }
    }


    ###########################################################################
    #                                                                         #
    #  Paragraphs.                                                            #
    #                                                                         #
    ###########################################################################

    macro @PP	{ //@ParaGap @ParaIndent @Wide &0i }
    macro @LP	{ //@ParaGap			   }
    macro @LLP	{ //1vx				   }
    macro @DP	{ //@DisplayGap			   }
    macro @NP	{ //1.1b			   }
    macro @CNP	{ // 3.2v @High //0io //           }


    ###########################################################################
    #                                                                         #
    #  Beginning and ending of aligned displays.                              #
    #                                                                         #
    ###########################################################################

    def @APlace            { @Galley }
    def @EndAlignedPlace   { @Galley }
    def @AlignedPlace      { @Galley }

    def @BAligned into { @APlace&&preceding }
    {
	def @AlignedList { @AlignedPlace /1.1b @AlignedList }

	//1.1b @AlignedList
	//     @EndAlignedPlace
    }

    macro @BAD { // @APlace | @BAligned }
    def   @EAD force into { @EndAlignedPlace&&preceding } {}

    macro @BeginAlignedDisplays { @BAD }
    macro @EndAlignedDisplays   { @EAD }


    ###########################################################################
    #                                                                         #
    #  Beginning and ending of numbered displays.                             #
    #                                                                         #
    ###########################################################################

    def @BeginNumberedPlace { @Galley }
    def @EndNumberedPlace   { @Galley }
    def @NextNumberPlace    { @Galley }

    def @NNumber into { @NextNumberPlace&&following } {}
    macro @NN { @NNumber @BeginNumberedPlace }

    def @BNumbered into { @BeginNumberedPlace&&preceding }
	named style right num { (num) }
	named start { 1 }
    {
	def @NList right num
	{
	    |1rt style num & @NumberMarker num & @NextNumberPlace
	    // @NList @Next num
	}

	//  @NList start
	//  @EndNumberedPlace
    }

    macro @BND { // @BeginNumberedPlace // @BNumbered }
    def   @END force into { @EndNumberedPlace&&preceding } {}
    
    macro @BeginNumberedDisplays { @BND }
    macro @EndNumberedDisplays   { @END }


    ###########################################################################
    #                                                                         #
    #  Galleys which carry displays to their places.                          #
    #                                                                         #
    ###########################################################################

    def @DispPlace { @Galley }

    def @Disp into { @DispPlace&&preceding }
	right x
    {
	# @OneRow x
	x
    }

    def @NDisp into { @DispPlace&&preceding }
	named @Tag {}
	right x
    {
	@OneRow {
	   @NumberMarker&&following @Tagged @Tag
	   @PageMarker&&preceding @Tagged @Tag
	   ^//
	   @OneRow x
	}
    }

    def @ADisp into { @AlignedPlace&&preceding }
	right x
    {
	# @OneRow x
	x
    }

    def @ANDisp into { @AlignedPlace&&preceding }
	named @Tag {}
	right x
    {
	@OneRow {
	   @NumberMarker&&following @Tagged @Tag
	   @PageMarker&&preceding @Tagged @Tag
	   ^/
	   @OneRow x
	}
    }


    ###########################################################################
    #                                                                         #
    #  Displays and raw displays.                                             #
    #                                                                         #
    ###########################################################################

    macro @G  { |@DefaultIndent      }
    macro @LG { |                    }
    macro @IG { |@DisplayIndent      }
    macro @CG { |0.5rt               }
    macro @QR { @DisplayIndent @Wide }

    macro @D     { @DP @G   @DispPlace  |                   @DP // @Disp   }
    macro @LD    { @DP @LG  @DispPlace  |                   @DP // @Disp   }
    macro @ID    { @DP @IG  @DispPlace  |                   @DP // @Disp   }
    macro @QD    { @DP @IG  @DispPlace  @IG                 @DP // @Disp   }
    macro @CD    { @DP @CG  @DispPlace  |                   @DP // @Disp   }

    macro @AD    { @DP @G   @APlace     |                   @DP // @ADisp  }
    macro @LAD   { @DP @LG  @APlace     |                   @DP // @ADisp  }
    macro @IAD   { @DP @IG  @APlace     |                   @DP // @ADisp  }
    macro @QAD   { @DP @IG  @APlace     @IG                 @DP // @ADisp  }
    macro @CAD   { @DP @CG  @APlace     |                   @DP // @ADisp  }

    macro @ND    { @DP @G   @DispPlace  |1rt @NN            @DP // @NDisp  }
    macro @LND   { @DP @LG  @DispPlace  |1rt @NN            @DP // @NDisp  }
    macro @IND   { @DP @IG  @DispPlace  |1rt @NN            @DP // @NDisp  }
    macro @QND   { @DP @IG  @DispPlace  |1rt @QR {|1rt @NN} @DP // @NDisp  }
    macro @CND   { @DP @CG  @DispPlace  |1rt @NN            @DP // @NDisp  }

    macro @AND   { @DP @G   @APlace     |1rt @NN            @DP // @ANDisp }
    macro @LAND  { @DP @LG  @APlace     |1rt @NN            @DP // @ANDisp }
    macro @IAND  { @DP @IG  @APlace     |1rt @NN            @DP // @ANDisp }
    macro @QAND  { @DP @IG  @APlace     |1rt @QR {|1rt @NN} @DP // @ANDisp }
    macro @CAND  { @DP @CG  @APlace     |1rt @NN            @DP // @ANDisp }


    macro @RD    {     @G   @DispPlace  |                          @Disp   }
    macro @RLD   {     @LG  @DispPlace  |                          @Disp   }
    macro @RID   {     @IG  @DispPlace  |                          @Disp   }
    macro @RQD   {     @IG  @DispPlace  @IG |                      @Disp   }
    macro @RCD   {     @CG  @DispPlace  |                          @Disp   }

    macro @RAD   {     @G   @APlace     |                          @ADisp  }
    macro @RLAD  {     @LG  @APlace     |                          @ADisp  }
    macro @RIAD  {     @IG  @APlace     |                          @ADisp  }
    macro @RQAD  {     @IG  @APlace     @IG |                      @ADisp  }
    macro @RCAD  {     @CG  @APlace     |                          @ADisp  }

    macro @RND   {     @G   @DispPlace  |1rt @NN                   @NDisp  }
    macro @RLND  {     @LG  @DispPlace  |1rt @NN                   @NDisp  }
    macro @RIND  {     @IG  @DispPlace  |1rt @NN                   @NDisp  }
    macro @RQND  {     @IG  @DispPlace  |1rt @QR {|1rt @NN}        @NDisp  }
    macro @RCND  {     @CG  @DispPlace  |1rt @NN                   @NDisp  }

    macro @RAND  {     @G   @APlace     |1rt @NN                   @ANDisp }
    macro @RLAND {     @LG  @APlace     |1rt @NN                   @ANDisp }
    macro @RIAND {     @IG  @APlace     |1rt @NN                   @ANDisp }
    macro @RQAND {     @IG  @APlace     |1rt @QR {|1rt @NN}        @ANDisp }
    macro @RCAND {     @CG  @APlace     |1rt @NN                   @ANDisp }


    macro @Display                            { @D     }
    macro @LeftDisplay                        { @LD    }
    macro @IndentedDisplay                    { @ID    }
    macro @QuotedDisplay                      { @QD    }
    macro @CentredDisplay                     { @CD    }
    macro @CenteredDisplay                    { @CD    }

    macro @AlignedDisplay                     { @AD    }
    macro @LeftAlignedDisplay                 { @LAD   }
    macro @IndentedAlignedDisplay             { @IAD   }
    macro @QuotedAlignedDisplay               { @QAD   }
    macro @CentredAlignedDisplay              { @CAD   }
    macro @CenteredAlignedDisplay             { @CAD   }

    macro @NumberedDisplay                    { @ND    }
    macro @LeftNumberedDisplay                { @LND   }
    macro @IndentedNumberedDisplay            { @IND   }
    macro @QuotedNumberedDisplay              { @QND   }
    macro @CentredNumberedDisplay             { @CND   }
    macro @CenteredNumberedDisplay            { @CND   }

    macro @AlignedNumberedDisplay             { @AND   }
    macro @LeftAlignedNumberedDisplay         { @LAND  }
    macro @IndentedAlignedNumberedDisplay     { @IAND  }
    macro @QuotedAlignedNumberedDisplay       { @QAND  }
    macro @CentredAlignedNumberedDisplay      { @CAND  }
    macro @CenteredAlignedNumberedDisplay     { @CAND  }


    macro @RawDisplay                         { @RD    }
    macro @RawLeftDisplay                     { @RLD   }
    macro @RawIndentedDisplay                 { @RID   }
    macro @RawQuotedDisplay                   { @RQD   }
    macro @RawCentredDisplay                  { @RCD   }
    macro @RawCenteredDisplay                 { @RCD   }

    macro @RawAlignedDisplay                  { @RAD   }
    macro @RawLeftAlignedDisplay              { @RLAD  }
    macro @RawIndentedAlignedDisplay          { @RIAD  }
    macro @RawQuotedAlignedDisplay            { @RQAD  }
    macro @RawCentredAlignedDisplay           { @RCAD  }
    macro @RawCenteredAlignedDisplay          { @RCAD  }

    macro @RawNumberedDisplay                 { @RND   }
    macro @RawLeftNumberedDisplay             { @RLND  }
    macro @RawIndentedNumberedDisplay         { @RIND  }
    macro @RawQuotedNumberedDisplay           { @RQND  }
    macro @RawCentredNumberedDisplay          { @RCND  }
    macro @RawCenteredNumberedDisplay         { @RCND  }

    macro @RawAlignedNumberedDisplay          { @RAND  }
    macro @RawLeftAlignedNumberedDisplay      { @RLAND }
    macro @RawIndentedAlignedNumberedDisplay  { @RIAND }
    macro @RawQuotedAlignedNumberedDisplay    { @RQAND }
    macro @RawCentredAlignedNumberedDisplay   { @RCAND }
    macro @RawCenteredAlignedNumberedDisplay  { @RCAND }


    ###########################################################################
    #                                                                         #
    #  Lists and raw lists.                                                   #
    #                                                                         #
    ###########################################################################


    def @ItemPlace     { @Galley }
    def @TagPlace      { @Galley }
    def @EndListPlace  { @Galley }

    def @RawList
	named style right num {                  }
	named gap             { @ListGap         }
	named indent          { @ListIndent      }
	named itemindent      { 0c		 }
	named rightindent     { @ListRightIndent }
	named labelwidth      { @ListLabelWidth  }
	named start           { 1                }
    {
        def @MakeList right num
	{
	    |indent
	    labelwidth @Wide { @NumberMarker {style num} {style num} &0io }
	    |itemindent  @ItemPlace  |rightindent
	    //gap @MakeList @Next num
	}

	@MakeList start // @EndListPlace
    }

    def listitem into { @ItemPlace&&preceding }
	named @Tag {}
	right x
    {
	   @NumberMarker&&preceding @Tagged @Tag
	// @PageMarker&&preceding @Tagged @Tag
	// x
    }

    def droplistitem into { @ItemPlace&&preceding }
	named @Tag {}
	right x
    {
	   @NumberMarker&&preceding @Tagged @Tag
	// @PageMarker&&preceding @Tagged @Tag
	//
	//1vx x
    }

    def tagitem into { @ItemPlace&&preceding }
	named tag {}
	right x
    {
	def sendtag into { @TagPlace&&preceding } { tag }

	sendtag | x
    }

    def droptagitem into { @ItemPlace&&preceding }
	named tag {}
	right x
    {
	def sendtag into { @TagPlace&&preceding } { tag }

	sendtag | { //1vx x }
    }

    def endlist force into { @EndListPlace&&preceding } {}

    macro @ListItem     { // listitem		}
    macro @DropListItem { // droplistitem	}
    macro @TagItem      { // tagitem tag	}
    macro @DropTagItem  { // droptagitem tag	}
    macro @RawEndList   { // & endlist // 	}
    macro @EndList      { // & endlist @DP	}

    macro @LI           { @ListItem		}
    macro @DLI          { @DropListItem		}
    macro @TI           { @TagItem 		}
    macro @DTI          { @DropTagItem		}
    macro @REL		{ @RawEndList		}
    macro @EL		{ @EndList		}


    macro @RawLeftList		{ @RawList labelwidth { 0c }                 }
    macro @RawIndentedList	{ @RawList                                   }
    macro @RawQuotedList	{ @RawList rightindent { @DisplayIndent }    }
    macro @RawCentredList	{ @RawList labelwidth {0c} itemindent {0.5rt}}
    macro @RawCenteredList	{ @RawCentredList                            }
    macro @RawNumberedList      { @RawList style { num.	                   } }
    macro @RawParenNumberedList { @RawList style { (num)	           } }
    macro @RawRomanList	        { @RawList style { {@Roman&&num}.          } }
    macro @RawParenRomanList    { @RawList style { ({@Roman&&num})         } }
    macro @RawUCRomanList       { @RawList style { {@UCRoman&&num}.        } }
    macro @RawParenUCRomanList  { @RawList style { ({@UCRoman&&num})       } }
    macro @RawAlphaList	        { @RawList style { {@Alpha&&num}.          } }
    macro @RawParenAlphaList    { @RawList style { ({@Alpha&&num})         } }
    macro @RawUCAlphaList       { @RawList style { {@UCAlpha&&num}.        } }
    macro @RawParenUCAlphaList  { @RawList style { ({@UCAlpha&&num})       } }
    macro @RawBulletList        { @RawList style { @Bullet	           } }
    macro @RawStarList	        { @RawList style { @Star		   } }
    macro @RawDashList	        { @RawList style { --	 	           } }
    macro @RawTaggedList        { @RawList style { @TagPlace               } }
    macro @RawWideTaggedList    { @RawList style { @TagPlace               }
					   labelwidth { @WideIndent }        }
    macro @RawVeryWideTaggedList{ @RawList style { @TagPlace               }
					   labelwidth { @VeryWideIndent }    }


    macro @List			{ @DP @RawList			}
    macro @LeftList		{ @DP @RawLeftList		}
    macro @IndentedList		{ @DP @RawIndentedList		}
    macro @QuotedList		{ @DP @RawQuotedList		}
    macro @CentredList		{ @DP @RawCentredList		}
    macro @CenteredList		{ @DP @RawCenteredList		}
    macro @NumberedList		{ @DP @RawNumberedList		}
    macro @ParenNumberedList	{ @DP @RawParenNumberedList	}
    macro @RomanList		{ @DP @RawRomanList		}
    macro @ParenRomanList	{ @DP @RawParenRomanList	}
    macro @UCRomanList		{ @DP @RawUCRomanList		}
    macro @ParenUCRomanList	{ @DP @RawParenUCRomanList	}
    macro @AlphaList		{ @DP @RawAlphaList		}
    macro @ParenAlphaList	{ @DP @RawParenAlphaList	}
    macro @UCAlphaList		{ @DP @RawUCAlphaList		}
    macro @ParenUCAlphaList	{ @DP @RawParenUCAlphaList	}
    macro @BulletList		{ @DP @RawBulletList		}
    macro @StarList		{ @DP @RawStarList		}
    macro @DashList		{ @DP @RawDashList		}
    macro @TaggedList		{ @DP @RawTaggedList		}
    macro @WideTaggedList	{ @DP @RawWideTaggedList	}
    macro @VeryWideTaggedList	{ @DP @RawVeryWideTaggedList	}

    macro @RLL		{ @RawLeftList          }
    macro @RIL		{ @RawIndentedList	}
    macro @RQL		{ @RawQuotedList	}
    macro @RCL		{ @RawCentredList       }
    macro @RNL		{ @RawNumberedList	}
    macro @RPNL		{ @RawParenNumberedList	}
    macro @RRL		{ @RawRomanList		}
    macro @RPRL		{ @RawParenRomanList	}
    macro @RUCRL	{ @RawUCRomanList	}
    macro @RPUCRL	{ @RawParenUCRomanList	}
    macro @RAL		{ @RawAlphaList		}
    macro @RPAL		{ @RawParenAlphaList	}
    macro @RUCAL	{ @RawUCAlphaList	}
    macro @RPUCAL	{ @RawParenUCAlphaList	}
    macro @RBL		{ @RawBulletList	}
    macro @RSL		{ @RawStarList		}
    macro @RDL		{ @RawDashList		}
    macro @RTL		{ @RawTaggedList	}
    macro @RWTL		{ @RawWideTaggedList	}
    macro @RVWTL	{ @RawVeryWideTaggedList}

    macro @L		{ @List                 }
    macro @LL		{ @LeftList             }
    macro @IL		{ @IndentedList		}
    macro @QL		{ @QuotedList		}
    macro @CL		{ @CentredList          }
    macro @NL		{ @NumberedList		}
    macro @PNL		{ @ParenNumberedList	}
    macro @RL		{ @RomanList		}
    macro @PRL		{ @ParenRomanList	}
    macro @UCRL		{ @UCRomanList		}
    macro @PUCRL	{ @ParenUCRomanList	}
    macro @AL		{ @AlphaList		}
    macro @PAL		{ @ParenAlphaList	}
    macro @UCAL		{ @UCAlphaList		}
    macro @PUCAL	{ @ParenUCAlphaList	}
    macro @BL		{ @BulletList		}
    macro @SL		{ @StarList		}
    macro @DL		{ @DashList		}
    macro @TL		{ @TaggedList		}
    macro @WTL		{ @WideTaggedList	}
    macro @VWTL		{ @VeryWideTaggedList	}


    ###########################################################################
    #                                                                         #
    #  Page size, margins, and boxes.  This code culminates in @OddPage x     #
    #  and @EvenPage x, which produce one odd or even page containing x.      #
    #                                                                         #
    ###########################################################################

    def @Width
    {
	@PageType @Case {
	    Letter      @Yield  612p
	    Tabloid     @Yield  792p
	    Ledger      @Yield 1224p
	    Legal       @Yield  612p
	    Statement   @Yield  396p
	    Executive   @Yield  540p
	    A3          @Yield  842p
	    A4          @Yield  595p
	    A5          @Yield  420p
	    B4          @Yield  729p
	    B5          @Yield  516p
	    Folio       @Yield  612p
	    Quarto      @Yield  610p
	    10x14       @Yield  720p
	    Other	@Yield @PageWidth
	}
    }

    def @Height
    {
	@PageType @Case {
	    Letter      @Yield  792p
	    Tabloid     @Yield 1224p
	    Ledger      @Yield  792p
	    Legal       @Yield 1008p
	    Statement   @Yield  612p
	    Executive   @Yield  720p
	    A3          @Yield 1190p
	    A4          @Yield  842p
	    A5          @Yield  595p
	    B4          @Yield 1032p
	    B5          @Yield  729p
	    Folio       @Yield  936p
	    Quarto      @Yield  780p
	    10x14       @Yield 1008p
	    Other       @Yield @PageHeight
	}
    }

    def @OrientedWidth
    {
	@PageOrientation @Case {
	    { Portrait ReversePortrait }   @Yield @Width
	    { Landscape ReverseLandscape } @Yield @Height
	}
    }

    def @OrientedHeight
    {
	@PageOrientation @Case {
	    { Portrait ReversePortrait }   @Yield @Height
	    { Landscape ReverseLandscape } @Yield @Width
	}
    }

    def @OrientationAngle
    {
	@PageOrientation @Case {
	    Portrait         @Yield 0d
	    Landscape        @Yield 90d
	    ReversePortrait  @Yield 180d
	    ReverseLandscape @Yield 270d
	}
    }

    def @PageBox right x
    {
	@PageBoxType @Case {
	    None      @Yield x
	    Box       @Yield @Box
			margin { @PageBoxMargin }
			paint { @PageBoxPaint }
			linewidth { @PageBoxLineWidth } x
	    CurveBox  @Yield @CurveBox
			margin { @PageBoxMargin }
			paint { @PageBoxPaint }
			linewidth { @PageBoxLineWidth } x
	    ShadowBox @Yield @ShadowBox
			margin { @PageBoxMargin }
			paint { @PageBoxPaint }
			linewidth { @PageBoxLineWidth }
			shadow { @PageBoxShadow } x
	}
    }

    def @Background
    {	@OrientationAngle @Rotate
	@OrientedWidth @Wide @OrientedHeight @High
	{   //@TopMargin ||@OddLeftMargin
	        @HExpand @VExpand @PageBackground
	    ||@OddRightMargin //@FootMargin
	}
    }

    def @MargSet
	left parity
	right x
    {
	{ parity "LoutMargSet" } @Graphic x
    }

    def @OddPage left extra right x
    {
	@Background ||0io
	@OrientationAngle @Rotate
	@OrientedWidth @Wide @OrientedHeight @High
	{   //@TopMargin ||@OddLeftMargin
	        1 @MargSet @PageBox @HExpand { extra // @VExpand x }
	    ||@OddRightMargin //@FootMargin
	}
    }

    def @EvenPage left extra right x
    {
	@Background ||0io
	@OrientationAngle @Rotate
	@OrientedWidth @Wide @OrientedHeight @High
	{   //@TopMargin ||@EvenLeftMargin
	        0 @MargSet @PageBox @HExpand { extra // @VExpand x }
	    ||@EvenRightMargin //@FootMargin
	}
    }


    ###########################################################################
    #                                                                         #
    #  Definitions for page headers and footers.  There are 16 symbols here,  #
    #  in the following pattern:                                              #
    #                                                                         #
    #     @(- | Running)(- | Intro)(Odd | Even)(Top | Foot)Header             #
    #                                                                         #
    #  Running means that running headers are to be used.                     #
    #  Intro means that the header is destined for an introductory page.      #
    #  Odd or Even means whether the page number will be odd or even.         #
    #  Top or Foot means whether the header is for the top or foot of page.   #
    #                                                                         #
    ###########################################################################

    export @Start @MajorNum @MajorTitle @MinorNum @MinorTitle
    def @Runner
	left  @Start
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	named @Tag        {}
    { @Null
    }

    def @OddTopHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @StartOddTop @PageNum
	    Simple.NonStart @Yield @OddTop @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @OddFootHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @StartOddFoot @PageNum
	    Simple.NonStart @Yield @OddFoot @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @EvenTopHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @StartEvenTop @PageNum
	    Simple.NonStart @Yield @EvenTop @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @EvenFootHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @StartEvenFoot @PageNum
	    Simple.NonStart @Yield @EvenFoot @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @IntroOddTopHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @IntroStartOddTop @PageNum
	    Simple.NonStart @Yield @IntroOddTop @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @IntroOddFootHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @IntroStartOddFoot @PageNum
	    Simple.NonStart @Yield @IntroOddFoot @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @IntroEvenTopHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @IntroStartEvenTop @PageNum
	    Simple.NonStart @Yield @IntroEvenTop @PageNum
	    Simple.None     @Yield @Null
	}
    }

    def @IntroEvenFootHeader
	left @PageHeadersAndStart
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    None.Start      @Yield @Null
	    None.NonStart   @Yield @Null
	    None.None       @Yield @Null
	    Simple.Start    @Yield @IntroStartEvenFoot @PageNum
	    Simple.NonStart @Yield @IntroEvenFoot @PageNum
	    Simple.None     @Yield @Null
	}
    }


    def @RunningOddTopHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield ??
	    NoTitles.Start    @Yield @RunningStartOddTop @PageNum
	    NoTitles.NonStart @Yield @RunningOddTop @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield ??
	    Titles.Start      @Yield @RunningStartOddTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningOddTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningOddFootHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield @Null
	    NoTitles.Start    @Yield @RunningStartOddFoot @PageNum
	    NoTitles.NonStart @Yield @RunningOddFoot @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield @Null
	    Titles.Start      @Yield @RunningStartOddFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningOddFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningEvenTopHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield ??
	    NoTitles.Start    @Yield @RunningStartEvenTop @PageNum
	    NoTitles.NonStart @Yield @RunningEvenTop @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield ??
	    Titles.Start      @Yield @RunningStartEvenTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningEvenTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningEvenFootHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield @Null
	    NoTitles.Start    @Yield @RunningStartEvenFoot @PageNum
	    NoTitles.NonStart @Yield @RunningEvenFoot @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield @Null
	    Titles.Start      @Yield @RunningStartEvenFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningEvenFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningIntroOddTopHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield ??
	    NoTitles.Start    @Yield @RunningIntroStartOddTop @PageNum
	    NoTitles.NonStart @Yield @RunningIntroOddTop @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield ??
	    Titles.Start      @Yield @RunningIntroStartOddTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningIntroOddTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningIntroOddFootHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield @Null
	    NoTitles.Start    @Yield @RunningIntroStartOddFoot @PageNum
	    NoTitles.NonStart @Yield @RunningIntroOddFoot @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield @Null
	    Titles.Start      @Yield @RunningIntroStartOddFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningIntroOddFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningIntroEvenTopHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield ??
	    NoTitles.Start    @Yield @RunningIntroStartEvenTop @PageNum
	    NoTitles.NonStart @Yield @RunningIntroEvenTop @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield ??
	    Titles.Start      @Yield @RunningIntroStartEvenTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningIntroEvenTop
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }

    def @RunningIntroEvenFootHeader
	left @PageHeadersAndStart
	named @MajorNum   {}
	named @MajorTitle {}
	named @MinorNum   {}
	named @MinorTitle {}
	right @PageNum
    {
	@PageHeadersAndStart @Case {
	    NoTitles.??       @Yield @Null
	    NoTitles.Start    @Yield @RunningIntroStartEvenFoot @PageNum
	    NoTitles.NonStart @Yield @RunningIntroEvenFoot @PageNum
	    NoTitles.None     @Yield @Null
	    Titles.??         @Yield @Null
	    Titles.Start      @Yield @RunningIntroStartEvenFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.NonStart   @Yield @RunningIntroEvenFoot
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    @PageNum
	    Titles.None	      @Yield @Null
	}
    }


    ###########################################################################
    #                                                                         #
    #  Helper definitions for laying out pages.                               #
    #                                                                         #
    ###########################################################################

    def @SeqFootPlace     { @Galley }
    def @FullPlace        { @Galley }
    def @ColPlace         { @Galley }
    def @IntroFullPlace   { @Galley }
    def @IntroColPlace    { @Galley }
    def @IndexPlace       { @Galley }

    def @TopList right num
    {
		   @Galley
	//@TopGap  @TopList @Next num
    }

    def @TopSection { @TopList 1 ||@OrientedWidth @FullPlace }

    def @IntroTopSection { @TopList 1 ||@OrientedWidth @IntroFullPlace }

    export num
    def @FootList named @Tag {} right num
    {
		    @Galley
	//@FootGap  @FootList @Next num
    }

    def @FootSection
    {
		    @FootLen @Wide @HLine
	//@FootGap  @FootList 1
    }

    export num
    def @ColFootList named @Tag {} right num
    {
		    @Galley
	//@FootGap  @ColFootList @Next num
    }

    def @ColFootSection
    {
		    @FootLen @Wide @HLine
	//@FootGap  @SeqFootPlace
	//@FootGap  @ColFootList 1
    }

    def @ColsOf
	left num
	right x
    {
	def @Two { x ||@ColumnGap x }
	def @Four { @Two ||@ColumnGap @Two }
	def @Eight { @Four ||@ColumnGap @Four }

	num @Case {
	    1  @Yield { x						}
	    2  @Yield { @Two						}
	    3  @Yield { @Two  ||@ColumnGap x				}
	    4  @Yield { @Four						}
	    5  @Yield { @Four ||@ColumnGap x				}
	    6  @Yield { @Four ||@ColumnGap @Two				}
	    7  @Yield { @Four ||@ColumnGap @Two  ||@ColumnGap x		}
	    8  @Yield { @Four ||@ColumnGap @Four			}
	    9  @Yield { @Four ||@ColumnGap @Four ||@ColumnGap x		}
	   10  @Yield { @Four ||@ColumnGap @Four ||@ColumnGap @Two	}
	}
    }

    def @EqualWidth right x { 30c @Wide x }	# believe it or not

    def @ColList right num
    {
	@HExpand num @ColsOf @EqualWidth 
	    @VExpand { @ColPlace //1rt @OneRow { //@MidGap @ColFootSection } }

    }
    
    def @IntroColList right num
    {
	@HExpand num @ColsOf @EqualWidth 
	   @VExpand { @IntroColPlace //1rt @OneRow { //@MidGap @ColFootSection } }
    }
    
    def @ZeroColList right num
    {
	@HExpand num @ColsOf @EqualWidth 0c @High @ColPlace
    }
    
    def @ZeroIntroColList right num
    {
	@HExpand num @ColsOf @EqualWidth 0c @High @IntroColPlace
    }
    
    def @IndexColList right num
    {
	@HExpand num @ColsOf @EqualWidth @VExpand @IndexPlace
    }


    ###########################################################################
    #                                                                         #
    #  Definitions for page lists.  There are four symbols here, in the       #
    #  following pattern:                                                     #
    #                                                                         #
    #    @(Simple | Running)(- | Intro)PageList                               #
    #                                                                         #
    #  Running means that the page list is to support running headers.        #
    #  Intro means that the page list is an introductory page list.           #
    #  These are then packaged into @PageList and @IntroPageList.             #
    #                                                                         #
    ###########################################################################

    def @SStart right @PageNum
    {
	@PageNum @Case {
	    { 1 0 } @Yield Start
	    else    @Yield NonStart
	}
    }

    def @SimplePageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named extra { No }
	named @AtTop { @Null }
	right @PageNum
    {
        def @SimpleEvenPageList
	    named @ColumnNumber {}
	    named @PageHeaders {}
	    named extra { No }
	    right @PageNum
        {
	        @PageMarker { @PageNumbers @Num @PageNum }
	    //  {} @EvenPage
	        {
		    @PageHeaders.NonStart @EvenTopHeader { @PageNumbers @Num @PageNum }
		    //@MidGap @TopSection
		    //@MidGap @ColList @ColumnNumber
		    //@MidGap @IndexColList @IndexColumnNumber
		    // //1rt @OneRow
		    {  //@MidGap @FootSection
		       //@MidGap @PageHeaders.NonStart @EvenFootHeader { @PageNumbers @Num @PageNum }
		    }
	        }
	    //  @SimplePageList
		    @ColumnNumber { @ColumnNumber }
		    @PageHeaders { @PageHeaders }
		@Next @PageNum
        }

	    @PageMarker { @PageNumbers @Num @PageNum }
	//  { extra @Then @ZeroColList @ColumnNumber } @OddPage
	    {
		{@PageHeaders.{@SStart @PageNum}} @OddTopHeader
		    { @PageNumbers @Num @PageNum }
		//@MidGap @AtTop
		//@MidGap @TopSection
		//@MidGap @ColList @ColumnNumber
		//@MidGap @IndexColList @IndexColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap {@PageHeaders.{@SStart @PageNum}} @OddFootHeader
				 { @PageNumbers @Num @PageNum }
		}
	    }
	//  @SimpleEvenPageList
		@ColumnNumber { @ColumnNumber }
		@PageHeaders { @PageHeaders }
	    @Next @PageNum
    }

    def @SimpleIntroPageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named extra { No }
	named @AtTop { @Null }
	right @PageNum
    {
	    @PageMarker { @IntroPageNumbers @Num @PageNum }
	//  { extra @Then @ZeroIntroColList @ColumnNumber } @OddPage
	    {
		{@PageHeaders.{@SStart @PageNum}} @IntroOddTopHeader
		    { @IntroPageNumbers @Num @PageNum }
		//@MidGap @AtTop
		//@MidGap @IntroTopSection
		//@MidGap @IntroColList @ColumnNumber
		//@MidGap @IndexColList @IndexColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap
		       {@PageHeaders.{@SStart @PageNum}} @IntroOddFootHeader
			   { @IntroPageNumbers @Num @PageNum }
		}
	    }
	//  @PageMarker { @IntroPageNumbers @Num @Next @PageNum }
	//  {} @EvenPage @Runner&&following @Open
	    {
		@PageHeaders.NonStart @IntroEvenTopHeader { @IntroPageNumbers @Num @Next @PageNum }
		//@MidGap @IntroTopSection
		//@MidGap @IntroColList @ColumnNumber
		//@MidGap @IndexColList @IndexColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap @PageHeaders.NonStart @IntroEvenFootHeader
				{ @IntroPageNumbers @Num @Next @PageNum }
		}
	    }
	//  @SimpleIntroPageList
		@ColumnNumber { @ColumnNumber }
		@PageHeaders { @PageHeaders }
	    @Next @Next @PageNum
    }

    def @RunningPageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named extra { No }
	named @AtTop { @Null }
	right @PageNum
    {
        def @RunningEvenPageList
	    named @ColumnNumber {}
	    named @PageHeaders {}
	    right @PageNum
        {
	        @PageMarker { @PageNumbers @Num @PageNum }
	    //  {} @EvenPage @Runner&&following @Open
	        {
		    @PageHeaders.@Start @RunningEvenTopHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @PageNumbers @Num @PageNum }
		    //@MidGap @TopSection
		    //@MidGap @ColList @ColumnNumber
		    //@MidGap @IndexColList @IndexColumnNumber
		    // //1rt @OneRow
		    {  //@MidGap @FootSection
		       //@MidGap @PageHeaders.@Start @RunningEvenFootHeader
			   @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			   @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			   { @PageNumbers @Num @PageNum }
		    }
	        }
	    //  @RunningPageList
		    @ColumnNumber { @ColumnNumber }
		    @PageHeaders { @PageHeaders }
		@Next @PageNum
        }

	    @PageMarker { @PageNumbers @Num @PageNum }
	//  { extra @Then @ZeroColList @ColumnNumber } @OddPage @Runner&&following @Open
	    {
		@PageHeaders.@Start @RunningOddTopHeader
		    @MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
		    @MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
		    { @PageNumbers @Num @PageNum }
		//@MidGap @AtTop
		//@MidGap @TopSection
		//@MidGap @ColList @ColumnNumber
		//@MidGap @IndexColList @IndexColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap @PageHeaders.@Start @RunningOddFootHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @PageNumbers @Num @PageNum }
		}
	    }
	//  @RunningEvenPageList
		@ColumnNumber { @ColumnNumber }
		@PageHeaders { @PageHeaders }
	    @Next @PageNum
    }

    def @RunningIntroPageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named @AtTop { @Null }
	named extra { No }
	right @PageNum
    {
	    @PageMarker { @IntroPageNumbers @Num @PageNum }
	//  { extra @Then @ZeroIntroColList @ColumnNumber } @OddPage @Runner&&following @Open
	    {
		@PageHeaders.@Start @RunningIntroOddTopHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @IntroPageNumbers @Num @PageNum }
		//@MidGap @AtTop
		//@MidGap @IntroTopSection
		//@MidGap @IntroColList @ColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap @PageHeaders.@Start @RunningIntroOddFootHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @IntroPageNumbers @Num @PageNum }
		}
	    }
	//  @PageMarker { @IntroPageNumbers @Num @Next @PageNum }
	//  {} @EvenPage @Runner&&following @Open
	    {
		@PageHeaders.@Start @RunningIntroEvenTopHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @IntroPageNumbers @Num @Next @PageNum }
		//@MidGap @IntroTopSection
		//@MidGap @IntroColList @ColumnNumber
		//@MidGap @IndexColList @IndexColumnNumber
		// //1rt @OneRow
		{  //@MidGap @FootSection
		   //@MidGap @PageHeaders.@Start @RunningIntroEvenFootHeader
			@MajorNum { @MajorNum } @MajorTitle { @MajorTitle }
			@MinorNum { @MinorNum } @MinorTitle { @MinorTitle }
			{ @IntroPageNumbers @Num @Next @PageNum }
		}
	    }
	//  @RunningIntroPageList
		@PageHeaders { @PageHeaders }
		@ColumnNumber { @ColumnNumber }
	    @Next @Next @PageNum
    }

    def @PageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named extra { No }
	named @AtTop { @Null }
	right @FirstPageNum
    {
	@PageHeaders @Case {
	    { None Simple } @Yield @SimplePageList
		  @ColumnNumber { @ColumnNumber }
		  @PageHeaders { @PageHeaders }
		  extra { extra }
		  @AtTop { @AtTop }
		  @FirstPageNum
	    { Running Titles } @Yield @RunningPageList
		  @ColumnNumber { @ColumnNumber }
		  @PageHeaders { @PageHeaders }
		  extra { extra }
		  @AtTop { @AtTop }
		  @FirstPageNum
	}
	//
	@PageMarker&&preceding @Tagged last.page
    }

    def @IntroPageList
	named @ColumnNumber {}
	named @PageHeaders {}
	named extra { No }
	named @AtTop { @Null }
	right @FirstPageNum
    {
	@PageHeaders @Case {
	    { None Simple } @Yield @SimpleIntroPageList
		  @ColumnNumber { @ColumnNumber }
		  @PageHeaders { @PageHeaders }
		  extra { extra }
		  @AtTop { @AtTop }
		  @FirstPageNum
	    { Running Titles } @Yield @RunningIntroPageList
		  @ColumnNumber { @ColumnNumber }
		  @PageHeaders { @PageHeaders }
		  extra { extra }
		  @AtTop { @AtTop }
		  @FirstPageNum
	}
    }


    ###########################################################################
    #                                                                         #
    #  Table of contents (including lists of figures and tables).             #
    #                                                                         #
    ###########################################################################

    def @ContentsItem
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
	named pregap { @ContentsGap }
	named postgap { 0c }
    {
	def @Leaders { @ContentsLeader &@ContentsLeaderGap @Leaders }

	def @RightPart
	{
	    @ContentsRightWidth @Wide {
		# &@ContentsLeaderGap @Leaders &@ContentsLeaderGap
		&1rt { pagenum //0.5vx }
	    }
	}

	//pregap
	//0.5vx
	|indent number @DotSep @HExpand {
	    title & @ContentsLeaderGap @Wide &1rt @OneCol {
		@Leaders & @RightPart &0io
	    }
	}
	|@ContentsRightWidth
	//postgap
    }

    def @ContentsPlace { @Galley }
    def @FigureContentsPlace { @Galley }
    def @TableContentsPlace { @Galley }

    def @SendContents into { @ContentsPlace&&preceding }
	right x
    {
	x
    }

    def @SendFigureContents into { @FigureContentsPlace&&preceding }
	right x
    {
	x
    }

    def @SendTableContents into { @TableContentsPlace&&preceding }
	right x
    {
	x
    }

    def @ContentsEntry
	left  wanted
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
	named pregap { @ContentsGap }
	named postgap { 0c }
    {
	@MakeContents.wanted @Case {
	    Yes.Yes   @Yield { @SendContents @ContentsItem
				   indent { indent }
				   number { number }
				   title { title }
				   pagenum { pagenum }
				   pregap { pregap }
				   postgap { postgap }
			     }
	    else      @Yield @Null
	}
    }

    def @FigureContentsEntry
	left  wanted
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
	named pregap { @ContentsGap }
	named postgap { 0c }
    {
	@MakeFigureContents.wanted @Case {
	    Yes.Yes   @Yield { @SendFigureContents @ContentsItem
				   indent { indent }
				   number { number }
				   title { title }
				   pagenum { pagenum }
				   pregap { pregap }
				   postgap { postgap }
			     }
	    else      @Yield @Null
	}
    }

    def @TableContentsEntry
	left  wanted
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
	named pregap { @ContentsGap }
	named postgap { 0c }
    {
	@MakeTableContents.wanted @Case {
	    Yes.Yes   @Yield { @SendTableContents @ContentsItem
				   indent { indent }
				   number { number }
				   title { title }
				   pagenum { pagenum }
				   pregap { pregap }
				   postgap { postgap }
			     }
	    else      @Yield @Null
	}
    }

    def @MajorContentsEntry
	left  wanted
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
	named pregap { @ContentsGapAbove }
	named postgap { @ContentsGapBelow }
    {
	@MakeContents.wanted @Case {
	    Yes.Yes   @Yield { @SendContents @ContentsItem
				   indent { indent }
				   number { @B number }
				   title { @B title }
				   pagenum { pagenum }
				   pregap { pregap }
				   postgap { postgap }
			     }
	    else      @Yield @Null
	}
    }

    def @VeryMajorContentsEntry
	left  wanted
	named indent { 0.5rt }
	named title {}
	named pregap { @ContentsGapAbove }
	named postgap { @ContentsGapBelow }
    {
	def item
	{
	    //pregap
	    //0.5vx
	    |indent @B @OneCol title |
	    //0.5vx
	    //postgap
	}

	@MakeContents.wanted @Case {
	    Yes.Yes   @Yield @SendContents item
	    else      @Yield @Null
	}

    }

    def @ContentsSection
    {
	def @ContentsList { @ContentsPlace // @ContentsList }

	@MakeContents @Case {
	    { Yes Bypass }  @Yield @ContentsList
	    else	    @Yield @Null
	}
    }

    def @FigureContentsSection
    {
	def @FigureContentsList { @FigureContentsPlace // @FigureContentsList }

	@MakeFigureContents @Case {
	    { Yes Bypass }  @Yield @FigureContentsList
	    else	    @Yield @Null
	}
    }

    def @TableContentsSection
    {
	def @TableContentsList { @TableContentsPlace // @TableContentsList }

	@MakeTableContents @Case {
	    { Yes Bypass }  @Yield @TableContentsList
	    else	    @Yield @Null
	}
    }

    ###########################################################################
    #                                                                         #
    #  Bypass table of contents.                                              #
    #                                                                         #
    ###########################################################################

    def @BypassContentsEntry into { @ContentsPlace&&preceding }
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
    {
	@MakeContents @Case {
	    Bypass @Yield { @ContentsItem
				indent { indent }
				number { number }
				title { title }
				pagenum { pagenum }
				pregap { @ContentsGap }
				postgap { 0c }
			  }
	    else  @Yield  @Null
	}
    }

    def @BypassFigureContentsEntry into { @FigureContentsPlace&&preceding }
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
    {
	@MakeFigureContents @Case {
	    Bypass @Yield { @ContentsItem
				indent { indent }
				number { number }
				title { title }
				pagenum { pagenum }
				pregap { @ContentsGap }
				postgap { 0c }
			  }
	    else  @Yield  @Null
	}
    }

    def @BypassTableContentsEntry into { @TableContentsPlace&&preceding }
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
    {
	@MakeTableContents @Case {
	    Bypass @Yield { @ContentsItem
				indent { indent }
				number { number }
				title { title }
				pagenum { pagenum }
				pregap { @ContentsGap }
				postgap { 0c }
			  }
	    else  @Yield  @Null
	}
    }

    def @BypassMajorContentsEntry into { @ContentsPlace&&preceding }
	named indent { 0f }
	named number {}
	named title {}
	named pagenum {}
    {
	@MakeContents @Case {
	    Bypass @Yield { @ContentsItem
				indent { indent }
				number { @B number }
				title { @B title }
				pagenum { pagenum }
				pregap { @ContentsGapAbove }
				postgap { @ContentsGapBelow }
			  }
	    else  @Yield  @Null
	}
    }


    ###########################################################################
    #                                                                         #
    #  Footnotes.                                                             #
    #                                                                         #
    ###########################################################################

    def @EndSeqFootPlace { @Galley }

    export num
    def @SeqColFootList named @Tag {} right num
    {
        @Galley
        //@FootGap
        @SeqColFootList @Next num
    }

    def @BeginFootNotes
	right prefix
    {
	def beginfnotes into { @SeqFootPlace&&following }
	{
	    @SeqColFootList {{prefix}1}
	    //
	    @EndSeqFootPlace
	}

	@FootNoteThrough @Case {
	    No	@Yield @Null
	    Yes @Yield beginfnotes
	}
    }

    def @EndFootNotes right x
    {
	def endfnotes force into { @EndSeqFootPlace&&following } { @Null }

	@FootNoteThrough @Case {
	    No	@Yield @Null
	    Yes @Yield endfnotes
	}
    }

    def foottag right num
    {
        @BackEnd @Case {
	    PlainText @Yield {
	        ({@FootNoteNumbers @Num num})
	    }
	    PostScript @Yield @OneRow {
	        { Base 0.8f } @Font @FootNoteNumbers @Num num
	        ^/0.3vo
	    }
        }
    }

    def @FullFootNote
	named @Tag {}
	right x
    {
	def ftag
	{
	    @FootNoteFont @Font @FootNoteThrough @Case {
		No  @Yield { @FootList&&@Tag @Open { foottag num } }
		Yes @Yield { @SeqColFootList&&@Tag @Open { foottag num } }
	    }
	}

	def fnote
	{
	    def @FootNote into { @FootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @FootList&&preceding @Tagged @Tag  ftag & x }
	    }

	    def @SeqFootNote into { @SeqColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @SeqColFootList&&preceding @Tagged @Tag  ftag & x }
	    }

	    @FootNoteThrough @Case {
		No  @Yield @FootNote
		Yes @Yield @SeqFootNote
	    }
	}

	@Null & ftag & fnote
    }

    def @ColFootNote
	named @Tag {}
	right x
    {
	def ftag
	{
	    @FootNoteFont @Font @FootNoteThrough @Case {
		No  @Yield { @ColFootList&&@Tag @Open { foottag num } }
		Yes @Yield { @SeqColFootList&&@Tag @Open { foottag num } }
	    }
	}

	def fnote
	{
	    def @FootNote into { @ColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @ColFootList&&preceding @Tagged @Tag  ftag & x }
	    }

	    def @SeqFootNote into { @SeqColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @SeqColFootList&&preceding @Tagged @Tag  ftag & x }
	    }

	    @FootNoteThrough @Case {
		No  @Yield @FootNote
		Yes @Yield @SeqFootNote
	    }
	}

	@Null & ftag & fnote
    }

    export @FootNum
    def @LongFullFootNote
	named @Tag {}
	body x
    {
	def @FootNum right z
	{
	    @FootNoteFont @Font @FootNoteThrough @Case {
		No  @Yield { @FootList&&@Tag @Open { foottag num } }
		Yes @Yield { @SeqColFootList&&@Tag @Open { foottag num } }
	    }
	    & z
	}

	def fnote right z
	{
	    def @FootNote into { @FootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @FootList&&preceding @Tagged @Tag & // z }
	    }

	    def @SeqFootNote into { @SeqColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @SeqColFootList&&preceding @Tagged @Tag & // z }
	    }

	    @FootNoteThrough @Case {
		No  @Yield @FootNote
		Yes @Yield @SeqFootNote
	    }
	}

	@Null & @FootNum {} & fnote x
    }

    export @FootNum
    def @LongColFootNote
	named @Tag {}
	body x
    {
	def @FootNum right z
	{
	    @FootNoteFont @Font @FootNoteThrough @Case {
		No  @Yield { @ColFootList&&@Tag @Open { foottag num } }
		Yes @Yield { @SeqColFootList&&@Tag @Open { foottag num } }
	    }
	    & z
	}

	def fnote right z
	{
	    def @FootNote into { @ColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @ColFootList&&preceding @Tagged @Tag & // z }
	    }

	    def @SeqFootNote into { @SeqColFootList&&following }
	    {
	        @FootNoteFont @Font @FootNoteBreak @Break
	        { @SeqColFootList&&preceding @Tagged @Tag & // z }
	    }

	    @FootNoteThrough @Case {
		No  @Yield @FootNote
		Yes @Yield @SeqFootNote
	    }
	}

	@Null & @FootNum {} & fnote x
    }


    ###########################################################################
    #                                                                         #
    #  Endnotes.                                                              #
    #                                                                         #
    ###########################################################################

    export num
    def @EndNoteList
	named @Tag {}
	right num
    {
	@Galley //@EndNoteGap @EndNoteList @Next num
    }

    def endtag right num
    {
        @BackEnd @Case {
	    PlainText @Yield {
	        ({@EndNoteNumbers @Num num})
	    }
	    PostScript @Yield @OneRow {
	        0.8f @Font @EndNoteNumbers @Num num
	        ^/0.3vo
	    }
        }
    }

    def @ColEndNote
	named @Tag {}
	right x
    {
	def ftag
	{
	    @EndNoteFont @Font @EndNoteList&&@Tag @Open { endtag num }
	}

	def @ENote into { @EndNoteList&&following }
	{
	    @EndNoteFont @Font @EndNoteBreak @Break
	    { @EndNoteList&&preceding @Tagged @Tag  ftag & x }
	}

	@Null & @EndNoteFont @Font ftag & @ENote
    }

    export @EndNum
    def @LongColEndNote
	named @Tag {}
	body x
    {
	def @EndNum right z
	{
	    @EndNoteFont @Font @EndNoteList&&@Tag @Open { endtag num } & z
	}

	def @ENote into { @EndNoteList&&following }
	    right z
	{
	    @EndNoteFont @Font @EndNoteBreak @Break
	    { @EndNoteList&&preceding @Tagged @Tag & // z }
	}

	@Null & @EndNum {} & @ENote x
    }


    ###########################################################################
    #                                                                         #
    #  Margin Notes.                                                          #
    #                                                                         #
    ###########################################################################

    def @ZeroSize right x
    {
	@HContract @VContract { ^/0io |0io @OneCol @OneRow x |0io /0io }
    }

    def @MargPut
	left parity
	right x
    {
	@MarginNoteFont @Font @MarginNoteBreak @Break @ZeroSize
	{
	    { parity "LoutMargShift gsave" // "grestore" } @Graphic
	    {
		|@MarginNoteHGap @MarginNoteWidth @Wide @OneRow x
		|@MarginNoteHGap //@MarginNoteVGap
	    }
	}
    }

    def @LeftNote  right x { @Null & 0 @MargPut x }
    def @RightNote right x { @Null & 1 @MargPut x }
    def @OuterNote right x { @Null & 2 @MargPut x }
    def @InnerNote right x { @Null & 3 @MargPut x }


    ###########################################################################
    #                                                                         #
    #  @Reference - a reference.                                              #
    #                                                                         #
    ###########################################################################

    export @Tag @Type @Abstract @Address @Annote @Author @Day @Edition
	   @HowPublished @InAuthor @InTitle @Institution @Journal @Keywords
	   @Label @Month @Note @Number @Organization @Page @Pages @Pinpoint
	   @Publisher @Title @TitleNote @TRType @Volume @Year

    def @Reference
	named @Tag          {}
	named @Type         {}
	named @Abstract     {}
	named @Address      {}
	named @Annote       {}
	named @Author       {}
	named @Day          {}
	named @Edition      {}
	named @HowPublished {}
	named @InAuthor     {}
	named @InTitle      {}
	named @Institution  {}
	named @Journal      {}
	named @Keywords     {}
	named @Label        {}
	named @Month        {}
	named @Note         {}
	named @Number       {}
	named @Organization {}
	named @Page         {}
	named @Pages        {}
	named @Pinpoint     {}
	named @Publisher    {}
	named @Title        {}
	named @TitleNote    {}
	named @TRType       {}
	named @Volume       {}
	named @Year         {}
    { @Null }


    ###########################################################################
    #                                                                         #
    #  @CiteLabel - the value of the label of a reference within a citation.  #
    #                                                                         #
    ###########################################################################

    def @CiteLabel
	left label
	right tag 
    {
	@RefCiteLabels
	    @RefNum       { @NumberOf tag				}
	    @Tag          { tag						}
	    @Type         { @Reference&&tag @Open { @Type }		}
	    @Abstract     { @Reference&&tag @Open { @Abstract }		}
	    @Address      { @Reference&&tag @Open { @Address }		}
	    @Annote       { @Reference&&tag @Open { @Annote }		}
	    @Author       { @Reference&&tag @Open { @Author }		}
	    @Day          { @Reference&&tag @Open { @Day }		}
	    @Edition      { @Reference&&tag @Open { @Edition }		}
	    @HowPublished { @Reference&&tag @Open { @HowPublished }	}
	    @InAuthor     { @Reference&&tag @Open { @InAuthor }		}
	    @InTitle      { @Reference&&tag @Open { @InTitle }		}
	    @Institution  { @Reference&&tag @Open { @Institution }	}
	    @Journal      { @Reference&&tag @Open { @Journal }		}
	    @Keywords     { @Reference&&tag @Open { @Keywords }		}

	    @Label        { label @Case {
			      "" @Yield {@Reference&&tag @Open {@Label}}
			      else @Yield label
			    }						}

	    @Month        { @Reference&&tag @Open { @Month }		}
	    @Note         { @Reference&&tag @Open { @Note }		}
	    @Number       { @Reference&&tag @Open { @Number }		}
	    @Organization { @Reference&&tag @Open { @Organization }	}
	    @Page         { @Reference&&tag @Open { @Page }		}
	    @Pages        { @Reference&&tag @Open { @Pages }		}
	    @Pinpoint     { @Reference&&tag @Open { @Pinpoint }		}
	    @Publisher    { @Reference&&tag @Open { @Publisher }	}
	    @Title        { @Reference&&tag @Open { @Title }		}
	    @TitleNote    { @Reference&&tag @Open { @TitleNote }	}
	    @TRType       { @Reference&&tag @Open { @TRType }		}
	    @Volume       { @Reference&&tag @Open { @Volume }		}
	    @Year         { @Reference&&tag @Open { @Year }		}
    }


    ###########################################################################
    #                                                                         #
    #  @ListLabel - the value of the label of a reference within a ref list.  #
    #                                                                         #
    ###########################################################################

    def @ListLabel
	left label
	right tag 
    {
	@RefListLabels
	    @RefNum       { @NumberOf tag				}
	    @Tag          { tag						}
	    @Type         { @Reference&&tag @Open { @Type }		}
	    @Abstract     { @Reference&&tag @Open { @Abstract }		}
	    @Address      { @Reference&&tag @Open { @Address }		}
	    @Annote       { @Reference&&tag @Open { @Annote }		}
	    @Author       { @Reference&&tag @Open { @Author }		}
	    @Day          { @Reference&&tag @Open { @Day }		}
	    @Edition      { @Reference&&tag @Open { @Edition }		}
	    @HowPublished { @Reference&&tag @Open { @HowPublished }	}
	    @InAuthor     { @Reference&&tag @Open { @InAuthor }		}
	    @InTitle      { @Reference&&tag @Open { @InTitle }		}
	    @Institution  { @Reference&&tag @Open { @Institution }	}
	    @Journal      { @Reference&&tag @Open { @Journal }		}
	    @Keywords     { @Reference&&tag @Open { @Keywords }		}

	    @Label        { label @Case {
			      "" @Yield {@Reference&&tag @Open {@Label}}
			      else @Yield label
			    }						}

	    @Month        { @Reference&&tag @Open { @Month }		}
	    @Note         { @Reference&&tag @Open { @Note }		}
	    @Number       { @Reference&&tag @Open { @Number }		}
	    @Organization { @Reference&&tag @Open { @Organization }	}
	    @Page         { @Reference&&tag @Open { @Page }		}
	    @Pages        { @Reference&&tag @Open { @Pages }		}
	    @Pinpoint     { @Reference&&tag @Open { @Pinpoint }		}
	    @Publisher    { @Reference&&tag @Open { @Publisher }	}
	    @Title        { @Reference&&tag @Open { @Title }		}
	    @TitleNote    { @Reference&&tag @Open { @TitleNote }	}
	    @TRType       { @Reference&&tag @Open { @TRType }		}
	    @Volume       { @Reference&&tag @Open { @Volume }		}
	    @Year         { @Reference&&tag @Open { @Year }		}
    }


    ###########################################################################
    #                                                                         #
    #  @SortKey - the value of the sort key of a reference.                   #
    #                                                                         #
    ###########################################################################

    def @SortKey
	left label
	right tag 
    {
	@RefListSortKey
	    @Tag          { tag						}
	    @Type         { @Reference&&tag @Open { @Type }		}
	    @Abstract     { @Reference&&tag @Open { @Abstract }		}
	    @Address      { @Reference&&tag @Open { @Address }		}
	    @Annote       { @Reference&&tag @Open { @Annote }		}
	    @Author       { @Reference&&tag @Open { @Author }		}
	    @Day          { @Reference&&tag @Open { @Day }		}
	    @Edition      { @Reference&&tag @Open { @Edition }		}
	    @HowPublished { @Reference&&tag @Open { @HowPublished }	}
	    @InAuthor     { @Reference&&tag @Open { @InAuthor }		}
	    @InTitle      { @Reference&&tag @Open { @InTitle }		}
	    @Institution  { @Reference&&tag @Open { @Institution }	}
	    @Journal      { @Reference&&tag @Open { @Journal }		}
	    @Keywords     { @Reference&&tag @Open { @Keywords }		}

	    @Label        { label @Case {
			      "" @Yield {@Reference&&tag @Open {@Label}}
			      else @Yield label
			    }						}

	    @Month        { @Reference&&tag @Open { @Month }		}
	    @Note         { @Reference&&tag @Open { @Note }		}
	    @Number       { @Reference&&tag @Open { @Number }		}
	    @Organization { @Reference&&tag @Open { @Organization }	}
	    @Page         { @Reference&&tag @Open { @Page }		}
	    @Pages        { @Reference&&tag @Open { @Pages }		}
	    @Pinpoint     { @Reference&&tag @Open { @Pinpoint }		}
	    @Publisher    { @Reference&&tag @Open { @Publisher }	}
	    @Title        { @Reference&&tag @Open { @Title }		}
	    @TitleNote    { @Reference&&tag @Open { @TitleNote }	}
	    @TRType       { @Reference&&tag @Open { @TRType }		}
	    @Volume       { @Reference&&tag @Open { @Volume }		}
	    @Year         { @Reference&&tag @Open { @Year }		}
    }


    ###########################################################################
    #                                                                         #
    #  @RefStyle - a reference printing style.                                #
    #                                                                         #
    ###########################################################################

    export @Style
    def @RefStyle
	left @Tag
	named @Style right reftag {}
    {}


    ###########################################################################
    #                                                                         #
    #  @RefPrint - prints reference with tag reftag in appropriate style.     #
    #                                                                         #
    ###########################################################################

    def @RefPrint right reftag
    {	& @RefStyle&&{ @Reference&&reftag @Open { @Type } }
	@Open { @Style reftag } &
    }


    ###########################################################################
    #                                                                         #
    #  @ReferencesSection and @ChapReferencesSection - a list of references.  #
    #                                                                         #
    ###########################################################################

    def @RefPlace { @Galley }
    def @ChapRefPlace { @Galley }

    def @BypassRefPlace { @Galley }
    def @BypassChapRefPlace { @Galley }

    def @ReferencesSection
    {
	def @RefList right num
	{
	    @NumberMarker {@RefNumbers @Num num} & | @RefPlace
	    //@RefListGap @RefList @Next num
	}

	def @BypassRefList
	{
	    @BypassRefPlace //@RefListGap @BypassRefList
	}

	@RefList 1
	//@RefListGap
	@BypassRefList
    }

    def @ChapReferencesSection
    {
	def @ChapRefList right num
	{
	    @NumberMarker {@RefNumbers @Num num} & | @ChapRefPlace
	    //@RefListGap @ChapRefList @Next num
	}

	def @BypassChapRefList
	{
	    @BypassChapRefPlace //@RefListGap @BypassChapRefList
	}

	@ChapRefList 1
	//@RefListGap
	@BypassChapRefList
    }


    ###########################################################################
    #                                                                         #
    #   @RefHeading - heading for reference lists.                            #
    #                                                                         #
    ###########################################################################

    def @RefHeading right x
    {	x @Case {
	    references @Yield @Word&&references
	    bibliography @Yield @Word&&bibliography
	    else @Yield x
	}
    }


    ###########################################################################
    #                                                                         #
    #  @SendRef and @ChapSendRef - send one reference to the reference list.  #
    #                                                                         #
    ###########################################################################

    def @RefItem
	left lab
	right ref
    {
	def @ZeroWidth right x { &0io @OneCol x &0io }

	@RefListFormat @Case {
	    NoLabels   @Yield {					   ref	}
	    Labels     @Yield { @ZeroWidth lab |@RefListLabelWidth ref	}
	    DropLabels @Yield { lab //1vx      |@RefListLabelWidth ref	}
	    InLabels   @Yield { lab & 2s @Wide &		   ref	}
	}
    }


    def @RefListItem
	left label
	right tag
    {
	@RefListFont @Font @RefListBreak @Break {
	    @NumberMarker&&preceding @Tagged tag &
	    @PageMarker&&preceding @Tagged tag
	    |@RefListIndent {label @ListLabel tag} @RefItem {@RefPrint tag}
	    |@RefListRightIndent
	}
    }


    def @SendRef into { @RefPlace&&following }
	left label
	right tag
    {
	def @Key { label @SortKey tag }

	# no @Merge i.e. omit duplicates

	label @RefListItem tag
    }


    def @ChapSendRef into { @ChapRefPlace&&following }
	left label
	right tag
    {
	def @Key { label @SortKey tag }

	# no @Merge i.e. omit duplicates

	label @RefListItem tag
    }


    ###########################################################################
    #                                                                         #
    #  @Ref (bare citation) and its variants.                                 #
    #                                                                         #
    ###########################################################################

    def @Ref
	named label {}
	right tag
    {
	@MakeReferences @Case {
	    Yes	  @Yield { label @CiteLabel tag & label @SendRef tag }
	    else  @Yield @Null
	}
    }

    def @NoRef
	named label {}
	right tag
    {
	@MakeReferences @Case {
	    Yes  @Yield { label @SendRef tag }
	    else @Yield @Null
	}
    }

    def @ChapRef
	named label {}
	right tag
    {
	@MakeReferences @Case {
	    Yes  @Yield { label @CiteLabel tag & label @ChapSendRef tag }
	    else @Yield @Null
	}
    }

    def @NoChapRef
	named label {}
	right tag
    {
	@MakeReferences @Case {
	    Yes  @Yield { label @ChapSendRef tag }
	    else @Yield @Null
	}
    }


    ###########################################################################
    #                                                                         #
    #  Bypass references.                                                     #
    #                                                                         #
    ###########################################################################

    def @BypassReference into { @BypassRefPlace&&preceding }
	named label {}
	named value {}
    {
	@MakeReferences @Case {
	    Bypass @Yield { label @RefItem value }
	    else   @Yield @Null
	}
    }

    def @BypassChapReference into { @BypassChapRefPlace&&preceding }
	named label {}
	named value {}
    {
	@MakeReferences @Case {
	    Bypass @Yield { label @RefItem value }
	    else   @Yield @Null
	}
    }


    ###########################################################################
    #                                                                         #
    #  @Cite (citation) and its variants.                                     #
    #                                                                         #
    ###########################################################################

    export "$" "," ";"
    def @Cite body cite
    {
	macro "$" { @Ref }
	def "," precedence 90 left x { x"," }
	def ";" precedence 90 left x { x";" }

	@MakeReferences @Case {
	    Yes  @Yield { @RefCiteStyle cite }
	    else @Yield @Null
	}
    }

    export "$" "," ";"
    def @NoCite body cite
    {
	macro "$" { @NoRef }
	def "," precedence 90 left x { x }
	def ";" precedence 90 left x { x";" }

	@MakeReferences @Case {
	    Yes  @Yield { cite }
	    else @Yield @Null
	}
    }

    export "$" "," ";"
    def @ChapCite body cite
    {
	macro "$" { @ChapRef }
	def "," precedence 90 left x { x"," }
	def ";" precedence 90 left x { x";" }

	@MakeReferences @Case {
	    Yes  @Yield { @RefCiteStyle cite }
	    else @Yield @Null
	}
    }

    export "$" "," ";"
    def @NoChapCite body cite
    {
	macro "$" { @NoChapRef }
	def "," precedence 90 left x { x }
	def ";" precedence 90 left x { x";" }

	@MakeReferences @Case {
	    Yes  @Yield { cite }
	    else @Yield @Null
	}
    }


    ###########################################################################
    #                                                                         #
    #  Floating figures.                                                      #
    #                                                                         #
    ###########################################################################

    def @FigurePlace { @Galley }
    def @EndFigurePlace { @Galley }

    def @BeginFigures into { @TopList&&following }
	right prefix
    {
	def @FigureList right x
	{
	    def @FigureNum
	    {
		@FigureNumbers @Case {
		    No @Yield {}
		    else @Yield { prefix @DotJoin { @FigureNumbers @Num x } }
		}
	    }

			@NumberMarker @FigureNum
	    //		@FigurePlace
	    //@TopGap   @FigureList @Next x
	}

	@FigureList 1 // @EndFigurePlace
    }

    def @EndFigures force into { @EndFigurePlace&&following }
	right x
    { x }

    def @Figure into { @FigurePlace&&following }
	named @Caption { dft }
	named @ShortCaption { dft }
	named @LongCaption named @FigureNum {} { dft }
	named @Format right @Body { |0.5rt @Body | }
	named @Tag {}
	named @InitialLanguage { @InitialLanguage }
	named @BypassNumber { dft }
	named @FullPage { No }
	named @OnePage { No }
	right @Body
    {
	def @FigureNumber
	{
	    @BypassNumber @Dft @NumberOf @Tag
	}

	def @FigureLabel
	{
	    @FigureNumbers @Case {
		No   @Yield @Null
		else @Yield @B { @Word&&figure @FigureNumber. }
	    }
	}

	def @ContentsCaption
	{
	    @ShortCaption @Dft @Caption
	}

	def @FullPageGap
	{
	    @FullPage @Case {
		No  @Yield { 0i  }
		Yes @Yield { 1rt }
	    }
	}

	def @OnePageSym right x
	{
	    @OnePage @Case {
		No  @Yield x
		Yes @Yield { @OneRow x }
	    }
	}

	@InitialLanguage @Language
	{
	    // @MakeFigureContents @FigureContentsEntry
		    indent { 0f }
		    number { @FigureNumber }
		    title { @InitialLanguage @Language @ContentsCaption }
		    pagenum { @PageOf @Tag }
	    // @NumberMarker&&preceding @Tagged @Tag
	    // @OnePageSym
	       {
	           @Format @Body
	        // @PageMarker&&preceding @Tagged @Tag
	        //@DisplayGap
	           @CaptionFont @Font @CaptionBreak @Break
	           @Caption @Case {
		       dft	@Yield @Null
		       else	@Yield { ||0.5rt @FigureLabel  @Caption }
	           }
	        //@DisplayGap
	           @CaptionFont @Font @CaptionBreak @Break
	           @LongCaption @Case {
		       dft	@Yield @Null
		       else	@Yield { @LongCaption @FigureNum { @FigureLabel } }
	           }
	       }
	    //@FullPageGap
	    //
	}
    }


    ###########################################################################
    #                                                                         #
    #  Floating tables.                                                       #
    #                                                                         #
    ###########################################################################

    def @TablePlace { @Galley }
    def @EndTablePlace { @Galley }

    def @BeginTables into { @TopList&&following }
	right prefix
    {
	def @TableList right x
	{
	    def @TableNum
	    {
		@TableNumbers @Case {
		    No @Yield {}
		    else @Yield { prefix @DotJoin { @TableNumbers @Num x } }
		}
	    }

			@NumberMarker @TableNum
	    //          @TablePlace
	    //@TopGap   @TableList @Next x
	}

	@TableList 1 // @EndTablePlace
    }

    def @EndTables force into { @EndTablePlace&&following }
	right x
    { x }

    def @Table into { @TablePlace&&following }
	named @ShortCaption { dft }
	named @Caption { dft }
	named @LongCaption named @TableNum {} { dft }
	named @Format right @Body { |0.5rt @Body | }
	named @Tag {}
	named @InitialLanguage { @InitialLanguage }
	named @BypassNumber { dft }
	named @FullPage { No }
	named @OnePage { No }
	right @Body
    {
	def @TableNumber
	{
	    @BypassNumber @Dft @NumberOf @Tag
	}

	def @TableLabel
	{
	    @TableNumbers @Case {
		No   @Yield @Null
		else @Yield @B { @Word&&table @TableNumber. }
	    }
	}

	def @ContentsCaption
	{
	    @ShortCaption @Dft @Caption
	}

	def @FullPageGap
	{
	    @FullPage @Case {
		No  @Yield { 0i  }
		Yes @Yield { 1rt }
	    }
	}

	def @OnePageSym right x
	{
	    @OnePage @Case {
		No  @Yield x
		Yes @Yield { @OneRow x }
	    }
	}

	@InitialLanguage @Language
	{
	    //  @MakeTableContents @TableContentsEntry
		    indent { 0f }
		    number { @TableNumber }
		    title { @InitialLanguage @Language @ContentsCaption }
		    pagenum { @PageOf @Tag }
	    // @NumberMarker&&preceding @Tagged @Tag
	    // @OnePageSym
	       {
	           @Format @Body
	        // @PageMarker&&preceding @Tagged @Tag
	        //@DisplayGap
	           @CaptionFont @Font @CaptionBreak @Break
	           @Caption @Case {
		       dft	@Yield @Null
		       else	@Yield { ||0.5rt @TableLabel  @Caption }
	           }
	        //@DisplayGap
	           @CaptionFont @Font @CaptionBreak @Break
	           @LongCaption @Case {
		       dft	@Yield @Null
		       else	@Yield { @LongCaption @TableNum { @TableLabel } }
	           }
	       }
	    //@FullPageGap
	    //
	}
    }


    ###########################################################################
    #                                                                         #
    #  Index.                                                                 #
    #                                                                         #
    ###########################################################################

    def @IndexList { @Galley //1vx @IndexList }
    def @BypassIndexList { @Galley //1vx @BypassIndexList }

    def @IndexSection into { @IndexPlace&&following }
	right etc
    {
	// @IndexList // @BypassIndexList // etc
    }

    def @Ind into { @IndexList&&following }
	left @Key
	named indent { 0f }
	right @Body
    {
	def @Merge left x right y
	{
	    {x @Rump y} @Case
	    {
		""	@Yield	x
		else	@Yield	{
				 { {x @Rump y} @Common "," } @Case
				 {
				   ","	@Yield { x &0.03f x @Rump y }
				   else	@Yield { x &0.03f , x @Rump y }
				 }
				}
	    }
	}

	@IndexFont @Font @IndexBreak @Break { indent @Wide & @Body }
    }

    def @RawIndex
	left x
	named indent { 0f }
	named @Tag {}
	right y
    {
	@MakeIndex @Case {
	    Yes  @Yield { {@PageMark @Tag} x @Ind indent { indent } y }
	    else @Yield @Null
	}
    }

    macro @RawSubIndex    { @RawIndex indent { 1f } }
    macro @RawSubSubIndex { @RawIndex indent { 2f } }

    def @Index
	left x
	named indent { 0f }
	named to {}
	named @Tag {}
	right y
    {
	def numval
	{
	    to @Case
	    {
		""    @Yield @PageOf @Tag
		else  @Yield {
		    { @PageOf @Tag } @Case
		    {
			{ @PageOf to } @Yield { @PageOf @Tag }
			else	       @Yield { {@PageOf @Tag}--{@PageOf to} }
		    }
		}
	    }
	}

	@MakeIndex @Case {
	    Yes  @Yield { @PageMark @Tag
			  x @Ind indent { indent } { y &0.03f , numval }
			}
	    else @Yield @Null
	}
    }

    macro @SubIndex { @Index indent { 1f } }
    macro @SubSubIndex { @Index indent { 2f } }

    def @IndexBlanks
    {
	b @RawIndex {} c @RawIndex {} d @RawIndex {} e @RawIndex {}
	f @RawIndex {} g @RawIndex {} h @RawIndex {} i @RawIndex {}
	j @RawIndex {} k @RawIndex {} l @RawIndex {} m @RawIndex {}
	n @RawIndex {} o @RawIndex {} p @RawIndex {} q @RawIndex {}
	r @RawIndex {} s @RawIndex {} t @RawIndex {} u @RawIndex {}
	v @RawIndex {} w @RawIndex {} x @RawIndex {} y @RawIndex {}
	z @RawIndex {}
    }

    def @BypassBeginIndexPlace { @Galley }

    def @BypassBeginIndex force into { @BypassBeginIndexPlace&&preceding } {}

    def @BypassRawIndex force into { @BypassIndexList&&preceding }
	named indent { 0f }
	right x
    {
	&indent x
    }

    def @BypassEndIndex { @Null }

@End @DocumentLayout
