
###########################################################################
#                                                                         #
#  @BookSetup extension to @DocumentSetup.                                #
#                                                                         #
#  Jeffrey H. Kingston                                                    #
#  17 September 1999                                                      #
#                                                                         #
#  This package extends DocumentSetup with definitions for books.         #
#                                                                         #
###########################################################################

extend @BasicSetup @DocumentSetup
export @Book @Preface @Abbreviations @Introduction @Chapter @Appendix
def @BookSetup
    named @TitlePageFont		{  Helvetica Base		}
    named @SeparateIntroNumbering	{  Yes				}
    named @PrefaceAfterContents		{  No				}
    named @ChapterStartPages		{  Any				}
    named @ReferencesBeforeAppendices	{  No				}

    named @PrefaceWord			{  preface			}
    named @ContentsWord			{  contents			}
    named @FigureListWord		{  figurelist			}
    named @TableListWord		{  tablelist			}
    named @IntroductionWord		{  introduction			}
    named @AbbreviationsWord		{  abbreviations		}
    named @ChapterWord			{  chapter			}
    named @AppendixWord			{  appendix			}
    named @IndexWord			{  index			}
    named @IndexAWord			{  index			}
    named @IndexBWord			{  index			}

    named @ChapterNumbers		{  Arabic			}
    named @FirstChapterNumber		{  1				}
    named @SectionNumbers		{  Arabic			}
    named @FirstSectionNumber		{  1				}
    named @SubSectionNumbers		{  Arabic			}
    named @FirstSubSectionNumber	{  1				}
    named @SubSubSectionNumbers		{  Arabic			}
    named @FirstSubSubSectionNumber	{  1				}
    named @AppendixNumbers		{  UCAlpha			}
    named @FirstAppendixNumber		{  1				}
    named @SubAppendixNumbers		{  Arabic			}
    named @FirstSubAppendixNumber	{  1				}
    named @SubSubAppendixNumbers	{  Arabic			}
    named @FirstSubSubAppendixNumber	{  1				}

    named @PartHeadingFont		{  Helvetica Base 2.50f		}
    named @PartHeadingBreak		{  clines 1.2fx nohyphen	}
    named @PartHeadingFormat
	left number right title		{  @CD number @DP @CD title	}

    named @ChapterHeadingFont		{  Bold 2.00f			}
    named @ChapterHeadingBreak		{  ragged 1.2fx nohyphen   	}
    named @ChapterHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @SectionHeadingFont		{  Bold				}
    named @SectionHeadingBreak		{  ragged 1.2fx nohyphen	}
    named @SectionHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @SubSectionHeadingFont	{  Bold				}
    named @SubSectionHeadingBreak	{  ragged 1.2fx nohyphen	}
    named @SubSectionHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @SubSubSectionHeadingFont	{  Slope			}
    named @SubSubSectionHeadingBreak	{  ragged 1.2fx nohyphen	}
    named @SubSubSectionHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @AppendixHeadingFont		{  Bold 2.00f			}
    named @AppendixHeadingBreak		{  ragged 1.2fx nohyphen   	}
    named @AppendixHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @SubAppendixHeadingFont	{  Bold				}
    named @SubAppendixHeadingBreak	{  ragged 1.2fx nohyphen   	}
    named @SubAppendixHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @SubSubAppendixHeadingFont	{  Slope			}
    named @SubSubAppendixHeadingBreak	{  ragged 1.2fx nohyphen   	}
    named @SubSubAppendixHeadingFormat
	left number right title		{  number @DotSep title    	}

    named @AbovePartGap			{  4.00f			}
    named @AboveChapterGap		{  3.00f			}
    named @SectionGap			{  2.0v  @OrIfPlain 3f		}
    named @SubSectionGap		{  1.5v  @OrIfPlain 2f		}
    named @SubSubSectionGap		{  1.5v  @OrIfPlain 2f		}
    named @SubAppendixGap		{  2.0v  @OrIfPlain 3f		}
    named @SubSubAppendixGap		{  1.5v  @OrIfPlain 2f		}

    named @PrefaceInContents		{  Yes 				}
    named @AbbreviationsInContents	{  Yes				}
    named @IntroductionInContents	{  Yes				}
    named @PartInContents		{  Yes				}
    named @ChapterInContents		{  Yes				}
    named @SectionInContents		{  Yes				}
    named @SubSectionInContents		{  Yes				}
    named @SubSubSectionInContents	{  No				}
    named @AppendixInContents		{  Yes				}
    named @SubAppendixInContents	{  Yes				}
    named @SubSubAppendixInContents	{  No				}
    named @ReferencesInContents		{  Yes				}
    named @IndexInContents		{  Yes				}
    named @IndexAInContents		{  Yes				}
    named @IndexBInContents		{  Yes				}
    named @PartContentsIndent		{  0.5rt			}

    named @ChapterNumInTheorems		{  Yes				}
    named @SectionNumInTheorems		{  No				}
    named @SubSectionNumInTheorems	{  No				}
    named @SubSubSectionNumInTheorems	{  No				}
    named @AppendixNumInTheorems	{  Yes				}
    named @SubAppendixNumInTheorems	{  No				}
    named @SubSubAppendixNumInTheorems	{  No				}

    named @ChapterNumInDisplays		{  Yes				}
    named @SectionNumInDisplays		{  Yes				}
    named @SubSectionNumInDisplays	{  No				}
    named @SubSubSectionNumInDisplays	{  No				}
    named @AppendixNumInDisplays	{  Yes				}
    named @SubAppendixNumInDisplays	{  Yes				}
    named @SubSubAppendixNumInDisplays	{  No				}

    named @ChapterNumInFigures		{  Yes				}
    named @SectionNumInFigures		{  No				}
    named @SubSectionNumInFigures	{  No				}
    named @SubSubSectionNumInFigures	{  No				}
    named @AppendixNumInFigures		{  Yes				}
    named @SubAppendixNumInFigures	{  No				}
    named @SubSubAppendixNumInFigures	{  No				}

    named @ChapterNumInTables		{  Yes				}
    named @SectionNumInTables		{  No				}
    named @SubSectionNumInTables	{  No				}
    named @SubSubSectionNumInTables	{  No				}
    named @AppendixNumInTables		{  Yes				}
    named @SubAppendixNumInTables	{  No				}
    named @SubSubAppendixNumInTables	{  No				}

    named @SectionNumInRunners		{  Yes				}
    named @SubSectionNumInRunners	{  No				}
    named @SubSubSectionNumInRunners	{  No				}
    named @SubAppendixNumInRunners	{  Yes				}
    named @SubSubAppendixNumInRunners	{  No				}

    named @PrefacePrefix		{				}
    named @ContentsPrefix		{				}
    named @FigureContentsPrefix		{				}
    named @TableContentsPrefix		{				}
    named @AbbreviationsPrefix		{				}
    named @IntroductionPrefix		{				}
    named @ChapterPrefix		{				}
    named @AppendixPrefix		{				}
    named @ReferencesPrefix		{				}
    named @IndexPrefix			{				}
    named @IndexAPrefix			{				}
    named @IndexBPrefix			{				}

@Begin

    #######################################################################
    #                                                                     #
    #  Lists of chapters, sections, sub(-sub)sections, and appendices.    #
    #                                                                     #
    #######################################################################

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

    export num
    def @SectionList named @Tag {} right num
    {
	@Galley
        //@SectionGap	@SectionList @Next num
    }

    export num
    def @SubSectionList named @Tag {} right num
    {
	@Galley
        //@SubSectionGap    @SubSectionList @Next num
    }

    export num
    def @SubSubSectionList named @Tag {} right num
    {
	@Galley
        //@SubSubSectionGap @SubSubSectionList @Next num
    }

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

    export num
    def @SubAppendixList named @Tag {} right num
    {
	@Galley
        //@SubAppendixGap   @SubAppendixList @Next num
    }

    export num
    def @SubSubAppendixList named @Tag {} right num
    {
	@Galley
        //@SubSubAppendixGap   @SubSubAppendixList @Next num
    }

    def @PrefacePlace { @Galley }
    def @AbbreviationsPlace { @Galley }
    def @IntroductionPlace { @Galley }


    #######################################################################
    #                                                                     #
    #  @Full - this sends text to a full-width place on a new page, even  #
    #  if @ChapterStartPages is SamePage.                                 #
    #                                                                     #
    #######################################################################

    def @Full right x
    {
	def @Any  force into { @FullPlace&&following     } right x { x }
	def @Odd  force into { @OddFullPlace&&following  } right x { x }
	def @Even force into { @EvenFullPlace&&following } right x { x }

	@ChapterStartPages @Case {
	    { Any SamePage } @Yield @Any  x
	    Odd  @Yield @Odd  x
	    Even @Yield @Even x
	}
    }


    #######################################################################
    #                                                                     #
    #  @ChapterFull - this sends text to a full-width place on a new      #
    #  page, unless @ChapterStartPages is SamePage, in which case it      #
    #  doesn't send the text anywhere.                                    #
    #                                                                     #
    #######################################################################

    def @ChapterFull right x
    {
	def @Any  force into { @FullPlace&&following     } right x { x }
	def @Odd  force into { @OddFullPlace&&following  } right x { x }
	def @Even force into { @EvenFullPlace&&following } right x { x }

	@ChapterStartPages @Case {
	    Any  @Yield @Any  x
	    Odd  @Yield @Odd  x
	    Even @Yield @Even x
	    SamePage @Yield x
	}
    }


    #######################################################################
    #                                                                     #
    #  @IntroFull - this sends text to a full-width intro place.          #
    #                                                                     #
    #######################################################################

    def @IntroFull right x
    {
	def @Any  force into { @IntroFullPlace&&following     } right x { x }
	def @Odd  force into { @IntroOddFullPlace&&following  } right x { x }
	def @Even force into { @IntroEvenFullPlace&&following } right x { x }

	@ChapterStartPages @Case {
	    { Any SamePage } @Yield @Any  x
	    Odd  @Yield @Odd  x
	    Even @Yield @Even x
	}
    }


    #######################################################################
    #                                                                     #
    #  @ChooseFull - this sends either to introfull or ordinary full      #
    #                                                                     #
    #######################################################################

    def @ChooseFull right x
    {
	@SeparateIntroNumbering @Case {
	    No  @Yield @Full x
	    Yes @Yield @IntroFull x
	}
    }


    #######################################################################
    #                                                                     #
    #  Book.                                                              #
    #                                                                     #
    #######################################################################

    def @Book
	named @Tag {}
        named @Title {}
        named @Author {}
        named @Edition {}
        named @Publisher {}
        named @BeforeTitlePage {}
        named @OnTitlePage {}
        named @AfterTitlePage {}
        named @AtEnd { dft }
        named @AtAfter { dft }
        named @InitialFont { @InitialFont }
        named @InitialBreak { @InitialBreak }
        named @InitialSpace { @InitialSpace }
        named @InitialLanguage { @InitialLanguage }
        named @PageOrientation { @PageOrientation }
        named @PageHeaders { @PageHeaders }
        named @ColumnNumber { @ColumnNumber }
        named @FirstPageNumber { @FirstPageNumber }
        named @IntroFirstPageNumber { @IntroFirstPageNumber }
	named @OptimizePages { @OptimizePages }
    {
	def @Before
	{
	    @BeforeTitlePage @Case {
		""   @Yield @Null
		else @Yield @BeforeTitlePage
	    }
	}

	def @On
	{
	    @OnTitlePage @Case {
		"" @Yield {
		    	//1i    |0.5rt 2.5f @Font {1.2fx clines} @Break @Title |
			//2i    |0.5rt clines @Break @Author |
			//1i    |0.5rt clines @Break @Edition |
			//1rt   @OneRow @Publisher
		}
		else @Yield @OnTitlePage
	    }
	}

	def @After
	{
	    @AfterTitlePage @Case {
		""   @Yield @Null
		else @Yield  { @AfterTitlePage // None @Runner }
	    }
	}

	def @ContentsPart
	    named @Tag {}
	{

	    @LargeScaleStructure
		tag { @Tag }
		type { ExtraMajorIntro }
		initiallanguage { @InitialLanguage }
		title { contents @WordVal @ContentsWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { No }
		pnprefix { @ContentsPrefix }
		inrunners { Yes }
		majortitle { contents @WordVal @ContentsWord }
		sendheader { @ChooseFull @Body }
		innergap { @SectionGap }
		@ContentsSection
	}

	def @FigureContentsPart
	    named @Tag {}
	{
	    @LargeScaleStructure
		tag { @Tag }
		type { ExtraMajorIntro }
		initiallanguage { @InitialLanguage }
		title { figurelist @WordVal @FigureListWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { No }
		pnprefix { @FigureContentsPrefix }
		inrunners { Yes }
		majortitle { figurelist @WordVal @FigureListWord }
		sendheader { @ChooseFull @Body }
		innergap { @SectionGap }
		@FigureContentsSection
	}

	def @TableContentsPart
	    named @Tag {}
	{
	    @LargeScaleStructure
		tag { @Tag }
		type { ExtraMajorIntro }
		initiallanguage { @InitialLanguage }
		title { tablelist @WordVal @TableListWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { No }
		pnprefix { @TableContentsPrefix }
		inrunners { Yes }
		majortitle { tablelist @WordVal @TableListWord }
		sendheader { @ChooseFull @Body }
		innergap { @SectionGap }
		@TableContentsSection
	}

	def @ReferencesPart
	    named @Tag {}
	{
	    @LargeScaleStructure
		tag { @Tag }
		type { ExtraMajor }
		initiallanguage { @InitialLanguage }
		title { @RefHeading @RefListTitle }
		majortitle { @RefHeading @RefListTitle }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { @ReferencesInContents }
		pnprefix { @ReferencesPrefix }
		inrunners { Yes }
		sendheader { @ChapterFull @Body }
		innergap { @SectionGap }
		@ReferencesSection

	}

	def @IndexPart
	    named @Tag {}
	{
	    def @Run
	    {
		NonStart @Runner
		    @MajorNum {}
		    @MajorTitle { index @WordVal @IndexWord }
		    @MinorNum {}
		    @MinorTitle { index @WordVal @IndexWord }
		    @Owner { @Tag }
		    @Prefix { @IndexPrefix }
	    }

	    @LargeScaleStructure
		tag { @Tag }
		type { Major }
		initiallanguage { @InitialLanguage }
		title { index @WordVal @IndexWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { @IndexInContents }
		pnprefix { @IndexPrefix }
		inrunners { Yes }
		sendheader { @Full @Body }
		innergap { @SectionGap }
		wantindefinite { Yes }
		@IndexSection @Run
	}

	def @IndexAPart
	    named @Tag {}
	{
	    def @RunA
	    {
		NonStart @Runner
		    @MajorNum {}
		    @MajorTitle { index @WordVal @IndexAWord }
		    @MinorNum {}
		    @MinorTitle { index @WordVal @IndexAWord }
		    @Owner { @Tag }
		    @Prefix { @IndexAPrefix }
	    }

	    @LargeScaleStructure
		tag { @Tag }
		type { Major }
		initiallanguage { @InitialLanguage }
		title { index @WordVal @IndexAWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { @IndexAInContents }
		pnprefix { @IndexAPrefix }
		inrunners { Yes }
		sendheader { @Full @Body }
		innergap { @SectionGap }
		wantindefinite { Yes }
		@IndexASection @RunA
	}

	def @IndexBPart
	    named @Tag {}
	{
	    def @RunB
	    {
		NonStart @Runner
		    @MajorNum {}
		    @MajorTitle { index @WordVal @IndexBWord }
		    @MinorNum {}
		    @MinorTitle { index @WordVal @IndexBWord }
		    @Owner { @Tag }
		    @Prefix { @IndexBPrefix }
	    }

	    @LargeScaleStructure
		tag { @Tag }
		type { Major }
		initiallanguage { @InitialLanguage }
		title { index @WordVal @IndexBWord }
		aboveheadinggap { @AboveChapterGap }
		headingfont { @ChapterHeadingFont }
		headingbreak { @ChapterHeadingBreak }
		headingformat { @Num @ChapterHeadingFormat @Body }
		incontents { @IndexBInContents }
		pnprefix { @IndexBPrefix }
		inrunners { Yes }
		sendheader { @Full @Body }
		innergap { @SectionGap }
		wantindefinite { Yes }
		@IndexBSection @RunB
	}

        def @BookIntro force into { @IntroColPlace&&preceding }
	    named @Optimize { @OptimizePages }
        {
		    @NoLinkPageMark @Tag
	    //	    @Before
            //1.1b  @TitlePageFont @Font @On
            //1.1b  @After
            //	    Start @Runner @Owner { @Tag }
            //1.1b  @PrefaceAfterContents @NoDo @PrefacePlace
            //      @MakeContents @Case {
			{ Yes Bypass }	@Yield @ContentsPart
			else		@Yield @Null
		    }
            //      @MakeFigureContents @Case {
			{ Yes Bypass }	@Yield @FigureContentsPart
			else		@Yield @Null
		    }
            //      @MakeTableContents @Case {
			{ Yes Bypass }	@Yield @TableContentsPart
			else		@Yield @Null
		    }
            //1.1b  @PrefaceAfterContents @Do @PrefacePlace
        }

        def @BookBody force into { @ColPlace&&preceding }
	    named @Optimize { @OptimizePages }
        {
	    # The first component of @BookBody must be indefinite, so that
	    # its flushing is delayed until we reach the body galleys, either
	    # @Introduction or @Chapter.  If not, @BookBody will free up
	    # @PrefacePlace etc. too soon, producing a "no @PrefacePlace
	    # precedes this @PrefacePLace&&preceding" error message.

	        @AbbreviationsPlace
	    //  @IntroductionPlace
	    //	@ChapterList @FirstChapterNumber
	    //	@ReferencesBeforeAppendices @Do {
		    @MakeReferences @Do @ReferencesPart
		}
            //	@AppendixList @FirstAppendixNumber
	    //	@ReferencesBeforeAppendices @NoDo {
		    @MakeReferences @Do @ReferencesPart
		}
	    //	@MakeIndexA @Do @IndexAPart
	    //  @MakeIndexA @Case {
		  Bypass  @Yield @BypassBeginIndexAPlace
		  else    @Yield @Null
		}
	    //	@MakeIndexB @Do @IndexBPart
	    //  @MakeIndexB @Case {
		  Bypass  @Yield @BypassBeginIndexBPlace
		  else    @Yield @Null
		}
	    //	@MakeIndex  @Do @IndexPart
	    //  @MakeIndex @Case {
		  Bypass  @Yield @BypassBeginIndexPlace
		  else    @Yield @Null
		}
        }

	def @BookCombined force into { @ColPlace&&preceding }
	    named @Optimize { @OptimizePages }
	{
		    @NoLinkPageMark @Tag
	    //	    @Before
            //1.1b  @TitlePageFont @Font @On
            //1.1b  @After
            //	    Start @Runner @Owner { @Tag }
            //1.1b  @PrefaceAfterContents @NoDo @PrefacePlace
            //      @MakeContents @Case {
			{ Yes Bypass }	@Yield @ContentsPart
			else		@Yield @Null
		    }
            //      @MakeFigureContents @Case {
			{ Yes Bypass }	@Yield @FigureContentsPart
			else		@Yield @Null
		    }
            //      @MakeTableContents @Case {
			{ Yes Bypass }	@Yield @TableContentsPart
			else		@Yield @Null
		    }
            //1.1b  @PrefaceAfterContents @Do @PrefacePlace
	    //  @AbbreviationsPlace
	    //  @IntroductionPlace
	    //	@ChapterList @FirstChapterNumber
	    //	@ReferencesBeforeAppendices @Do {
		    @MakeReferences @Do @ReferencesPart
		}
            //	@AppendixList @FirstAppendixNumber
	    //	@ReferencesBeforeAppendices @NoDo {
		    @MakeReferences @Do @ReferencesPart
		}
	    //	@MakeIndexA @Do @IndexAPart
	    //  @MakeIndexA @Case {
		  Bypass  @Yield @BypassBeginIndexAPlace
		  else    @Yield @Null
		}
	    //	@MakeIndexB @Do @IndexBPart
	    //  @MakeIndexB @Case {
		  Bypass  @Yield @BypassBeginIndexBPlace
		  else    @Yield @Null
		}
	    //	@MakeIndex  @Do @IndexPart
	    //  @MakeIndex @Case {
		  Bypass  @Yield @BypassBeginIndexPlace
		  else    @Yield @Null
		}
	}

        @InitialFont @Font @InitialBreak @Break @InitialLanguage @Language
	@InitialSpace @Space { @ColourCommand @InitialColour } @SetColour
        {

	    @SeparateIntroNumbering @Case {

		No  @Yield {
		        Yes @BeginAllCounters {}
		        Yes @BeginDisplayCounter {}
		        Yes @BeginFigureCounter {}
		        Yes @BeginTableCounter {}
		    //	@PageList
			    @ColumnNumber { @ColumnNumber }
			    @PageHeaders { @PageHeaders }
			    @Orient { @PageOrientation }
			    @FirstPageNumber
		    //	@BookCombined
		    //	NonStart @Runner @Owner { @Tag }
		    //  @AtEnd @Case {
			    dft @Yield @Null
			    else @Yield
				 @EvenPage @Orient { @PageOrientation } @AtEnd
			}
		}

		Yes @Yield {
		        Yes @BeginAllCounters {}
		        Yes @BeginDisplayCounter {}
		        Yes @BeginFigureCounter {}
		        Yes @BeginTableCounter {}
		    //  @IntroPageList
			    @ColumnNumber { 1 }
			    @PageHeaders { @PageHeaders }
			    @Orient { @PageOrientation }
			    @IntroFirstPageNumber
		    # //	NonStart @Runner @Owner { @Tag }
		    //	None @Runner @Owner { @Tag }
		    //	@PageList
			    @ColumnNumber { @ColumnNumber }
			    @PageHeaders { @PageHeaders }
			    @Orient { @PageOrientation }
			    extra { Yes }
			    @FirstPageNumber
		    //	@BookIntro
		    //	@BookBody
		    //	NonStart @Runner @Owner { @Tag }
		    //  @AtEnd @Case {
			    dft @Yield @Null
			    else @Yield
				 @EvenPage @Orient { @PageOrientation } @AtEnd
			}
		}
	    }
        }
    }


    #######################################################################
    #                                                                     #
    #  Preface.                                                           #
    #                                                                     #
    #######################################################################

    def @Preface force into { @PrefacePlace&&preceding }
        named @Tag {}
        named @Title { preface @WordVal @PrefaceWord }
        named @RunningTitle { dft }
	named @InitialLanguage {}
        body @Body
    {

	@LargeScaleStructure
	    tag { @Tag }
	    type { ExtraMajorIntro }
	    initiallanguage { @InitialLanguage }
	    title { @Title }
	    runningtitle { @RunningTitle }
	    aboveheadinggap { @AboveChapterGap }
	    headingfont { @ChapterHeadingFont }
	    headingbreak { @ChapterHeadingBreak }
	    headingformat { @Num @ChapterHeadingFormat @Body }
	    incontents { @PrefaceInContents }
	    pnprefix { @PrefacePrefix }
	    sendheader { @ChooseFull @Body }
	    innergap { @SectionGap }
	    inrunners { Yes }
	    @Body

    }


    #######################################################################
    #                                                                     #
    #  Abbreviations.                                                     #
    #                                                                     #
    #######################################################################

    def @Abbreviations force into { @AbbreviationsPlace&&preceding }
        named @Tag {}
        named @Title { abbreviations @WordVal @AbbreviationsWord }
        named @RunningTitle { dft }
	named @InitialLanguage {}
        body @Body
    {

	@LargeScaleStructure
	    tag { @Tag }
	    type { Major }
	    initiallanguage { @InitialLanguage }
	    title { @Title }
	    runningtitle { @RunningTitle }
	    aboveheadinggap { @AboveChapterGap }
	    headingfont { @ChapterHeadingFont }
	    headingbreak { @ChapterHeadingBreak }
	    headingformat { @Num @ChapterHeadingFormat @Body }
	    incontents { @AbbreviationsInContents }
	    pnprefix { @AbbreviationsPrefix }
	    sendheader { @Full @Body }
	    innergap { @SectionGap }
	    inrunners { Yes }
	    @Body

    }


    #######################################################################
    #                                                                     #
    #  Introduction.                                                      #
    #                                                                     #
    #######################################################################

    def @Introduction force into { @IntroductionPlace&&preceding }
        named @Tag {}
        named @Title { introduction @WordVal @IntroductionWord }
        named @RunningTitle { dft }
	named @InitialLanguage {}
        body @Body
    {

	@LargeScaleStructure
	    tag { @Tag }
	    type { Major }
	    initiallanguage { @InitialLanguage }
	    title { @Title }
	    runningtitle { @RunningTitle }
	    aboveheadinggap { @AboveChapterGap }
	    headingfont { @ChapterHeadingFont }
	    headingbreak { @ChapterHeadingBreak }
	    headingformat { @Num @ChapterHeadingFormat @Body }
	    incontents { @IntroductionInContents }
	    pnprefix { @IntroductionPrefix }
	    sendheader { @Full @Body }
	    innergap { @SectionGap }
	    inrunners { Yes }
	    @Body

    }


    #######################################################################
    #                                                                     #
    #  Chapters containing sections and subsections.                      #
    #                                                                     #
    #######################################################################

    export @BeginSections @EndSections @Section
    def @Chapter force into { @ChapterList&&preceding }
        named @Tag {}
        named @Title {}
        named @RunningTitle { dft }
	named @InitialLanguage {}
	named @PartNumber {}
	named @PartTitle {}
	named @PartText {}
        named @BypassNumber { dft }
        body @Body
    {

        def @EndSectionsPlace { @Galley }

        def @EndSections force into { @EndSectionsPlace&&preceding }
	{}

        macro @BeginSections
	{   //@SectionGap @SectionList @FirstSectionNumber
	    // @EndSectionsPlace //
	}

	def @ChapterShortNum
	{
	    @ChapterNumbers @Then {
		@BypassNumber @Dft {
		    @ChapterNumbers @Num @ChapterList&&@Tag @Open { num }
		}
	    }
	}

	def @MajorNum
	{
	    @ChapterNumbers @Then @InitialLanguage @Language {
		chapter @WordVal @ChapterWord @ChapterShortNum
	    }
	}

	def @MajorTitle
	{
	    @InitialLanguage @Language {
		@RunningTitle @Dft @Title
	    }
	}

        export @BeginSubSections @EndSubSections @SubSection
        def @Section force into { @SectionList&&preceding }
            named @Tag {}
            named @Title {}
            named @RunningTitle { dft }
	    named @InitialLanguage { @InitialLanguage }
	    named @BypassNumber { dft }
            body @Body
        {

            def @EndSubSectionsPlace { @Galley }

            def @EndSubSections force into { @EndSubSectionsPlace&&preceding }
	    {}

            macro @BeginSubSections
            {	//@SubSectionGap @SubSectionList @FirstSubSectionNumber
		// @EndSubSectionsPlace //
	    }

	    def @SectionShortNum
	    {
		@SectionNumbers @Then {
		    @BypassNumber @Dft {
			@ChapterShortNum @Join @SectionNumbers @Num
			{ @SectionList&&@Tag @Open { num } }
		    }
		}
	    }

	    export @BeginSubSubSections @EndSubSubSections @SubSubSection
            def @SubSection force into { @SubSectionList&&preceding }
		named @Tag {}
		named @Title {}
		named @RunningTitle { dft }
		named @InitialLanguage { @InitialLanguage }
		named @BypassNumber { dft }
		body @Body
            {

                def @EndSubSubSectionsPlace { @Galley }

                def @EndSubSubSections force into
		    { @EndSubSubSectionsPlace&&preceding }
		{}

                macro @BeginSubSubSections
                { //@SubSubSectionGap @SubSubSectionList @FirstSubSubSectionNumber
		  // @EndSubSubSectionsPlace //
		}

		def @SubSectionShortNum
		{
		    @SubSectionNumbers @Then {
			@BypassNumber @Dft {
			    @SectionShortNum @Join @SubSectionNumbers @Num
			    { @SubSectionList&&@Tag @Open { num } }
			}
		    }
		}

		def @SubSubSection force into { @SubSubSectionList&&preceding }
		    named @Tag {}
		    named @Title {}
		    named @RunningTitle { dft }
		    named @InitialLanguage { @InitialLanguage }
		    named @BypassNumber { dft }
		    body @Body
		{
                
		    @LargeScaleStructure
			tag { @Tag }
			type { Minor }
			initiallanguage { @InitialLanguage }
			title { @Title }
			runningtitle { @RunningTitle }
			headingfont { @SubSubSectionHeadingFont }
			headingbreak { @SubSubSectionHeadingBreak }
			headingformat { @Num @SubSubSectionHeadingFormat @Body }
			incontents { @SubSubSectionInContents }
			contentsindent { 9f }
			numbers { @SubSubSectionNumbers }
			attachnum { @SubSubSectionList&&preceding @Tagged @Tag }
			retrievenum { @SubSubSectionList&&@Tag @Open { num } }
			bypassnumber { @BypassNumber }
			prefix { @SubSectionShortNum }
			majornum { @MajorNum }
			majortitle { @MajorTitle }
			intheorems { @SubSubSectionNumInTheorems }
			indisplays { @SubSubSectionNumInDisplays }
			infigures { @SubSubSectionNumInFigures }
			intables { @SubSubSectionNumInTables }
			inrunners { @SubSubSectionNumInRunners }
			@Body
	        }

		@LargeScaleStructure
		    tag { @Tag }
		    type { Minor }
		    initiallanguage { @InitialLanguage }
		    title { @Title }
		    runningtitle { @RunningTitle }
		    headingfont { @SubSectionHeadingFont }
		    headingbreak { @SubSectionHeadingBreak }
		    headingformat { @Num @SubSectionHeadingFormat @Body }
		    incontents { @SubSectionInContents }
		    contentsindent { 6f }
		    numbers { @SubSectionNumbers }
		    attachnum { @SubSectionList&&preceding @Tagged @Tag }
		    retrievenum { @SubSectionList&&@Tag @Open { num } }
		    bypassnumber { @BypassNumber }
		    prefix { @SectionShortNum }
		    majornum { @MajorNum }
		    majortitle { @MajorTitle }
		    intheorems { @SubSectionNumInTheorems }
		    indisplays { @SubSectionNumInDisplays }
		    infigures { @SubSectionNumInFigures }
		    intables { @SubSectionNumInTables }
		    inrunners { @SubSectionNumInRunners }
		    @Body

            }

	    @LargeScaleStructure
		tag { @Tag }
		type { Minor }
		initiallanguage { @InitialLanguage }
		title { @Title }
		runningtitle { @RunningTitle }
		headingfont { @SectionHeadingFont }
		headingbreak { @SectionHeadingBreak }
		headingformat { @Num @SectionHeadingFormat @Body }
		incontents { @SectionInContents }
		contentsindent { 3f }
		numbers { @SectionNumbers }
		attachnum { @SectionList&&preceding @Tagged @Tag }
		retrievenum { @SectionList&&@Tag @Open { num } }
		bypassnumber { @BypassNumber }
		prefix { @ChapterShortNum }
		majornum { @MajorNum }
		majortitle { @MajorTitle }
		intheorems { @SectionNumInTheorems }
		indisplays { @SectionNumInDisplays }
		infigures { @SectionNumInFigures }
		intables { @SectionNumInTables }
		inrunners { @SectionNumInRunners }
		@Body

        }

	def @Part
	    named @Tag {}
	{
	    @LargeScaleStructure
	        type { VeryMajor }
		initiallanguage { @InitialLanguage }
		title { @PartTitle }
		aboveheadinggap { @AbovePartGap }
		headingfont { @PartHeadingFont }
		headingbreak { @PartHeadingBreak }
		headingformat { @Num @PartHeadingFormat @Body }
		bypassnumber { @PartNumber }
		incontents { @PartInContents }
		sendheader { @Full @Body }
		inrunners { Yes }
		tag { @Tag }
		@PartText
	}

	@PartNumber @Case {
	    ""   @Yield @Null
	    else @Yield @Part
	}
	//
	@LargeScaleStructure
	    tag { @Tag }
	    type { Major }
	    initiallanguage { @InitialLanguage }
	    title { @Title }
	    runningtitle { @RunningTitle }
	    aboveheadinggap { @AboveChapterGap }
	    headingfont { @ChapterHeadingFont }
	    headingbreak { @ChapterHeadingBreak }
	    headingformat { @Num @ChapterHeadingFormat @Body }
	    incontents { @ChapterInContents }
	    contentsindent { 0f }
	    word { chapter @WordVal @ChapterWord }
	    numbers { @ChapterNumbers }
	    attachnum { @ChapterList&&preceding @Tagged @Tag }
	    retrievenum { @ChapterList&&@Tag @Open { num } }
	    bypassnumber { @BypassNumber }
	    pnprefix { @ChapterPrefix }
	    intheorems { @ChapterNumInTheorems }
	    indisplays { @ChapterNumInDisplays }
	    infigures { @ChapterNumInFigures }
	    intables { @ChapterNumInTables }
	    sendheader { @ChapterFull @Body }
	    innergap { @SectionGap }
	    inrunners { Yes }
	    @Body

    }


    #######################################################################
    #                                                                     #
    #  Appendices.                                                        #
    #                                                                     #
    #######################################################################

    export @BeginSubAppendices @EndSubAppendices @SubAppendix
    def @Appendix force into { @AppendixList&&preceding }
        named @Tag {}
        named @Title {}
        named @RunningTitle { dft }
	named @InitialLanguage {}
	named @PartNumber {}
	named @PartTitle {}
	named @PartText {}
        named @BypassNumber { dft }
        body @Body
    {

        def @EndSubAppendicesPlace { @Galley }

        def @EndSubAppendices force into { @EndSubAppendicesPlace&&preceding }
	{}

        macro @BeginSubAppendices
	{   //@SubAppendixGap @SubAppendixList @FirstSubAppendixNumber
	    // @EndSubAppendicesPlace //
	}

	def @AppendixShortNum
	{
	    @AppendixNumbers @Then {
		@BypassNumber @Dft {
		    @AppendixNumbers @Num @AppendixList&&@Tag @Open { num }
		}
	    }
	}

	def @MajorNum
	{
	    @AppendixNumbers @Then @InitialLanguage @Language {
		appendix @WordVal @AppendixWord @AppendixShortNum
	    }
	}

	def @MajorTitle
	{
	    @InitialLanguage @Language {
		@RunningTitle @Dft @Title
	    }
	}

        export @BeginSubSubAppendices @EndSubSubAppendices @SubSubAppendix
        def @SubAppendix force into { @SubAppendixList&&preceding }
            named @Tag {}
            named @Title {}
            named @RunningTitle { dft }
	    named @InitialLanguage { @InitialLanguage }
	    named @BypassNumber { dft }
            body @Body
        {

            def @EndSubSubAppendicesPlace { @Galley }

            def @EndSubSubAppendices force into { @EndSubSubAppendicesPlace&&preceding }
	    {}

            macro @BeginSubSubAppendices
            {	//@SubSubAppendixGap @SubSubAppendixList @FirstSubSubAppendixNumber
		// @EndSubSubAppendicesPlace //
	    }

	    def @SubAppendixShortNum
	    {
		@SubAppendixNumbers @Then {
		    @BypassNumber @Dft {
			@AppendixShortNum @Join @SubAppendixNumbers @Num
			{ @SubAppendixList&&@Tag @Open { num } }
		    }
		}
	    }

            def @SubSubAppendix force into { @SubSubAppendixList&&preceding }
		named @Tag {}
		named @Title {}
		named @RunningTitle { dft }
		named @InitialLanguage { @InitialLanguage }
		named @BypassNumber { dft }
		body @Body
            {

		@LargeScaleStructure
		    tag { @Tag }
		    type { Minor }
		    initiallanguage { @InitialLanguage }
		    title { @Title }
		    runningtitle { @RunningTitle }
		    headingfont { @SubSubAppendixHeadingFont }
		    headingbreak { @SubSubAppendixHeadingBreak }
		    headingformat { @Num @SubSubAppendixHeadingFormat @Body }
		    incontents { @SubSubAppendixInContents }
		    contentsindent { 6f }
		    numbers { @SubSubAppendixNumbers }
		    attachnum { @SubSubAppendixList&&preceding @Tagged @Tag }
		    retrievenum { @SubSubAppendixList&&@Tag @Open { num } }
		    bypassnumber { @BypassNumber }
		    prefix { @SubAppendixShortNum }
		    majornum { @MajorNum }
		    majortitle { @MajorTitle }
		    intheorems { @SubSubAppendixNumInTheorems }
		    indisplays { @SubSubAppendixNumInDisplays }
		    infigures { @SubSubAppendixNumInFigures }
		    intables { @SubSubAppendixNumInTables }
		    inrunners { @SubSubAppendixNumInRunners }
		    @Body

            }

	    @LargeScaleStructure
		tag { @Tag }
		type { Minor }
		initiallanguage { @InitialLanguage }
		title { @Title }
		runningtitle { @RunningTitle }
		headingfont { @SubAppendixHeadingFont }
		headingbreak { @SubAppendixHeadingBreak }
		headingformat { @Num @SubAppendixHeadingFormat @Body }
		incontents { @SubAppendixInContents }
		contentsindent { 3f }
		numbers { @SubAppendixNumbers }
		attachnum { @SubAppendixList&&preceding @Tagged @Tag }
		retrievenum { @SubAppendixList&&@Tag @Open { num } }
		bypassnumber { @BypassNumber }
		prefix { @AppendixShortNum }
		majornum { @MajorNum }
		majortitle { @MajorTitle }
		intheorems { @SubAppendixNumInTheorems }
		indisplays { @SubAppendixNumInDisplays }
		infigures { @SubAppendixNumInFigures }
		intables { @SubAppendixNumInTables }
		inrunners { @SubAppendixNumInRunners }
		@Body

        }

	def @Part
	    named @Tag {}
	{
	    @LargeScaleStructure
	        type { VeryMajor }
		initiallanguage { @InitialLanguage }
		title { @PartTitle }
		aboveheadinggap { @AbovePartGap }
		headingfont { @PartHeadingFont }
		headingbreak { @PartHeadingBreak }
		headingformat { @Num @PartHeadingFormat @Body }
		bypassnumber { @PartNumber }
		incontents { @PartInContents }
		sendheader { @Full @Body }
		inrunners { Yes }
		tag { @Tag }
		@PartText
	}

	@PartNumber @Case {
	    ""   @Yield @Null
	    else @Yield @Part
	}
	//
	@LargeScaleStructure
	    tag { @Tag }
	    type { Major }
	    initiallanguage { @InitialLanguage }
	    title { @Title }
	    runningtitle { @RunningTitle }
	    aboveheadinggap { @AboveChapterGap }
	    headingfont { @AppendixHeadingFont }
	    headingbreak { @AppendixHeadingBreak }
	    headingformat { @Num @AppendixHeadingFormat @Body }
	    incontents { @AppendixInContents }
	    contentsindent { 0f }
	    word { appendix @WordVal @AppendixWord }
	    numbers { @AppendixNumbers }
	    attachnum { @AppendixList&&preceding @Tagged @Tag }
	    retrievenum { @AppendixList&&@Tag @Open { num } }
	    bypassnumber { @BypassNumber }
	    pnprefix { @AppendixPrefix }
	    intheorems { @AppendixNumInTheorems }
	    indisplays { @AppendixNumInDisplays }
	    infigures { @AppendixNumInFigures }
	    intables { @AppendixNumInTables }
	    sendheader { @ChapterFull @Body }
	    innergap { @SubAppendixGap }
	    inrunners { Yes }
	    @Body

    }


@End @BookSetup
