Hi Alan,
This customization pretty much does what you want.  It turns out I didn't have 
to change the book template, only the way the chapters were handled.   I copied 
match="chapter" template from fo/component.xsl, and changed the match on it to 
only match on the first chapter in a sequence: "chapter[1]".  That chapter 
forms the page-sequence, formats its content, and then processes the 
following-sibling chapters within the same page sequence, but in a new 
mode="chapter.merge".  

The chapter.merge template skips all the page-sequence stuff and just processes 
the chapter content.  I had to define an empty template to match on these other 
chapters in the default mode so that they were not processed twice.  

The result should be a single-page sequence containing all the chapter content.

<xsl:template match="chapter[1]" priority="1">
  <xsl:variable name="id">
    <xsl:call-template name="object.id"/>
  </xsl:variable>

  <xsl:variable name="master-reference">
    <xsl:call-template name="select.pagemaster"/>
  </xsl:variable>

  <fo:page-sequence hyphenate="{$hyphenate}"
                    master-reference="{$master-reference}">
    <xsl:attribute name="language">
      <xsl:call-template name="l10n.language"/>
    </xsl:attribute>
    <xsl:attribute name="format">
      <xsl:call-template name="page.number.format">
        <xsl:with-param name="master-reference" select="$master-reference"/>
      </xsl:call-template>
    </xsl:attribute>
    <xsl:attribute name="initial-page-number">
      <xsl:call-template name="initial.page.number">
        <xsl:with-param name="master-reference" select="$master-reference"/>
      </xsl:call-template>
    </xsl:attribute>

    <xsl:attribute name="force-page-count">
      <xsl:call-template name="force.page.count">
        <xsl:with-param name="master-reference" select="$master-reference"/>
      </xsl:call-template>
    </xsl:attribute>

    <xsl:attribute name="hyphenation-character">
      <xsl:call-template name="gentext">
        <xsl:with-param name="key" select="'hyphenation-character'"/>
      </xsl:call-template>
    </xsl:attribute>
    <xsl:attribute name="hyphenation-push-character-count">
      <xsl:call-template name="gentext">
        <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
      </xsl:call-template>
    </xsl:attribute>
    <xsl:attribute name="hyphenation-remain-character-count">
      <xsl:call-template name="gentext">
        <xsl:with-param name="key" 
select="'hyphenation-remain-character-count'"/>
      </xsl:call-template>
    </xsl:attribute>

    <xsl:apply-templates select="." mode="running.head.mode">
      <xsl:with-param name="master-reference" select="$master-reference"/>
    </xsl:apply-templates>

    <xsl:apply-templates select="." mode="running.foot.mode">
      <xsl:with-param name="master-reference" select="$master-reference"/>
    </xsl:apply-templates>

    <fo:flow flow-name="xsl-region-body">
      <xsl:call-template name="set.flow.properties">
        <xsl:with-param name="element" select="local-name(.)"/>
        <xsl:with-param name="master-reference" select="$master-reference"/>
      </xsl:call-template>

      <fo:block id="{$id}"
                xsl:use-attribute-sets="component.titlepage.properties">
        <xsl:call-template name="chapter.titlepage"/>
      </fo:block>

      <xsl:variable name="toc.params">
        <xsl:call-template name="find.path.params">
          <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:if test="contains($toc.params, 'toc')">
        <xsl:call-template name="component.toc">
          <xsl:with-param name="toc.title.p" 
                          select="contains($toc.params, 'title')"/>
        </xsl:call-template>
        <xsl:call-template name="component.toc.separator"/>
      </xsl:if>
      <xsl:apply-templates/>

      <xsl:apply-templates select="following-sibling::chapter" 
mode="chapter.merge"/>

    </fo:flow>
  </fo:page-sequence>
</xsl:template>

<xsl:template match="chapter" />

<xsl:template match="chapter" mode="chapter.merge">
  <xsl:variable name="id">
    <xsl:call-template name="object.id"/>
  </xsl:variable>

      <fo:block id="{$id}"
                xsl:use-attribute-sets="component.titlepage.properties">
        <xsl:call-template name="chapter.titlepage"/>
      </fo:block>

      <xsl:variable name="toc.params">
        <xsl:call-template name="find.path.params">
          <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
        </xsl:call-template>
      </xsl:variable>
      <xsl:if test="contains($toc.params, 'toc')">
        <xsl:call-template name="component.toc">
          <xsl:with-param name="toc.title.p" 
                          select="contains($toc.params, 'title')"/>
        </xsl:call-template>
        <xsl:call-template name="component.toc.separator"/>
      </xsl:if>

      <xsl:apply-templates/> 

</xsl:template>

</xsl:stylesheet>

Bob Stayton
Sagehill Enterprises
[EMAIL PROTECTED]


  ----- Original Message ----- 
  From: Alan Oehler 
  To: docbook-apps@lists.oasis-open.org 
  Sent: Tuesday, February 12, 2008 8:47 AM
  Subject: [docbook-apps] Page breaks at chapters


  I've been trying to get a book to have no page breaks before chapters in the 
PDF output. Bob Stayton offered the advice that "a chapter element generates a 
page-sequence in FO output, and a page sequence always starts on a new page.  
If you want to use book and chapter, you'll need to customize both templates so 
that book generates a page-sequence for all your content, and chapter does not."

   

  I took a look at the book and chapter templates but it was a bit murky to me 
how they generate page sequences and how to accomplish what Bob suggests. Does 
anyone have any further clarification that they can offer?

   

  Thanks in advance,

   

  Alan

   

  Alan C. Oehler

  Sr. Technical Writer

  Citrix Systems, Inc.

  Virtualization & Management Division

Reply via email to