XSL-FO page-master-alternatives 有时会耗尽
XSL-FO page-master-alternatives sometimes exhausted
我有一些强大的书籍样式表。目前,我不知道问题出在哪里。我的样式表有时有效,有时无效,这取决于 TOC 的长度,我可以根据我想要包含在其中的级别数动态更改它。
我的样式表是这样工作的(我的意图是):
如果 TOC 的最后一页是奇怪,在它后面放一个空白页:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="last"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
让主要部分 Content-Pages 从 TOC 之后的第一个奇数页(或它后面的空白页)开始,让每一章都从奇数页开始在上一章(最后一页或空白)之后并在偶数页结束。如果最后一页应该是奇数,强制空白页(我想这可能是问题所在,因为我处理了整个部分以及特定章节):
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
我这样称呼它们(我不确定force-page-count="even"
和[=17=之间有什么区别。我已经检查了一些文档,但我仍然不清楚):
<fo:page-sequence master-reference="Imprints" force-page-count="even">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="//tei:TEI/tei:teiHeader" mode="draft"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="PageMaster.CopyRight-Page">
<fo:flow flow-name="xsl-region-body">
<fo:block xsl:use-attribute-sets="p">
© Copyright!
</fo:block>
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="PageMaster.TOC">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="//tei:TEI/tei:text" mode="toc"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
<xsl:for-each select="//tei:div[@n='1']">
<fo:page-sequence master-reference="Content-Pages" force-page-count="end-on-even">
<fo:static-content flow-name="Region-Before-Left">
<fo:block xsl:use-attribute-sets="running-header-left">
<fo:inline xsl:use-attribute-sets="running-header-pageno-left">
<fo:page-number/>
</fo:inline>
</fo:block>
</fo:static-content><!-- Running header right -->
<fo:static-content flow-name="Region-Before-Right">
<fo:block xsl:use-attribute-sets="running-header-right">
<fo:inline xsl:use-attribute-sets="running-header-pageno-right">
<fo:page-number/>
</fo:inline>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-footnote-separator">
<fo:block>
<fo:leader xsl:use-attribute-sets="footnote-separator"/>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates select="."/>
</fo:flow>
</fo:page-sequence>
</xsl:for-each>
当它失败并抛出 Subsequences exhausted in page-sequence-master "Content-Pages", cannot recover. (No context info available)
时,它有助于更改 force-page-count
或添加另一个对 PageMaster.Page-Right.First
的引用并使其在 even
页面上成为可能。有了这些章节,有时会从 奇数 页开始,但有页码(它们不应该)。真是一头雾水。
连加:
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="rest"/>
...没有帮助。
我使用最后的 Saxon HE 和 Apache FOP 1.1。
更新
进度根据@Tony_Graham:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
</fo:repeatable-page-master-alternatives>
其余的:
<fo:page-sequence master-reference="Imprints" force-page-count="end-on-even">
...
<fo:page-sequence master-reference="PageMaster.CopyRight-Page" initial-page-number="auto-odd">
...
将 force-page-count="end-on-even"
放在 fo:page-sequence
之前 每个 fo:page-sequence
您想要从奇数页开始。或者,在 fo:page-sequence
上设置 initial-page-number="auto-odd"
。参见 https://www.w3.org/TR/xsl11/#initial-page-number
force-page-count="even"
表示如果页面序列从偶数页开始,它将在奇数页结束以使其成为偶数页,反之亦然,如果它从奇数页开始. force-page-count="end-on-even"
将在奇数页结束,而不管页面序列是从奇数页还是偶数页开始。 (AH Formatter 有扩展以在 'doubly-even' 结束,此外还有更多,并强制整个文档的页数在偶数页结束等。参见 https://www.antennahouse.com/product/ahf63/ahf-ext.html#axf.force-page-count)但是,很可能 initial-page-number
会做你需要的。
还有:
- 您不需要重复
fo:conditional-page-master-reference
两个不同的 odd-or-even
到 select 相同的 page-master。这与没有 odd-or-even
的 fo:conditional-page-master-reference
相同,因为默认值为 any
。参见 https://www.w3.org/TR/xsl11/#odd-or-even。
- 您可以删除显式
page-position="any"
,因为这是默认设置。
- "Imprints"有两个'odd-or-even="even" page-position="rest"',所以永远不会用到第二个。
- 为 odd/even 和 rest/last 选择相同的 "PageMaster.TOC" 可以减少到
page-position="any"
。
更新
您可以将当前的 fo:page-sequence-master
更改为:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
在 fo:repeatable-page-master-alternatives
、"the conditions are tested in order from the beginning of the sequence of children" 内,因此您想将最不可能的备选方案放在首位。 (请参阅 https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives)您还希望在最后有一个包罗万象的替代方案,但您已经做到了。
但是,我不明白为什么 "Imprints" 包含 "PageMaster.CopyRight-Page" 和 "PageMaster.TOC",而版权页和目录分别位于引用特定页面的单独页面序列中-主人。您可能想要更像:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="TOC">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="CopyRight-Page">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
...
<fo:page-sequence master-reference="Imprints">
...
<fo:page-sequence master-reference="CopyRight-Page" initial-page-number="auto-odd">
...
<fo:page-sequence master-reference="PageMaster.TOC" initial-page-master="auto-odd">
...
<xsl:for-each select="//tei:div[@n='1']">
<fo:page-sequence master-reference="Content-Pages" initial-page-number="auto-odd">
我有一些强大的书籍样式表。目前,我不知道问题出在哪里。我的样式表有时有效,有时无效,这取决于 TOC 的长度,我可以根据我想要包含在其中的级别数动态更改它。
我的样式表是这样工作的(我的意图是):
如果 TOC 的最后一页是奇怪,在它后面放一个空白页:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="last"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
让主要部分 Content-Pages 从 TOC 之后的第一个奇数页(或它后面的空白页)开始,让每一章都从奇数页开始在上一章(最后一页或空白)之后并在偶数页结束。如果最后一页应该是奇数,强制空白页(我想这可能是问题所在,因为我处理了整个部分以及特定章节):
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
我这样称呼它们(我不确定force-page-count="even"
和[=17=之间有什么区别。我已经检查了一些文档,但我仍然不清楚):
<fo:page-sequence master-reference="Imprints" force-page-count="even">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="//tei:TEI/tei:teiHeader" mode="draft"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="PageMaster.CopyRight-Page">
<fo:flow flow-name="xsl-region-body">
<fo:block xsl:use-attribute-sets="p">
© Copyright!
</fo:block>
</fo:flow>
</fo:page-sequence>
<fo:page-sequence master-reference="PageMaster.TOC">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates select="//tei:TEI/tei:text" mode="toc"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
<xsl:for-each select="//tei:div[@n='1']">
<fo:page-sequence master-reference="Content-Pages" force-page-count="end-on-even">
<fo:static-content flow-name="Region-Before-Left">
<fo:block xsl:use-attribute-sets="running-header-left">
<fo:inline xsl:use-attribute-sets="running-header-pageno-left">
<fo:page-number/>
</fo:inline>
</fo:block>
</fo:static-content><!-- Running header right -->
<fo:static-content flow-name="Region-Before-Right">
<fo:block xsl:use-attribute-sets="running-header-right">
<fo:inline xsl:use-attribute-sets="running-header-pageno-right">
<fo:page-number/>
</fo:inline>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-footnote-separator">
<fo:block>
<fo:leader xsl:use-attribute-sets="footnote-separator"/>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates select="."/>
</fo:flow>
</fo:page-sequence>
</xsl:for-each>
当它失败并抛出 Subsequences exhausted in page-sequence-master "Content-Pages", cannot recover. (No context info available)
时,它有助于更改 force-page-count
或添加另一个对 PageMaster.Page-Right.First
的引用并使其在 even
页面上成为可能。有了这些章节,有时会从 奇数 页开始,但有页码(它们不应该)。真是一头雾水。
连加:
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="rest"/>
...没有帮助。
我使用最后的 Saxon HE 和 Apache FOP 1.1。
更新
进度根据@Tony_Graham:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
</fo:repeatable-page-master-alternatives>
其余的:
<fo:page-sequence master-reference="Imprints" force-page-count="end-on-even">
...
<fo:page-sequence master-reference="PageMaster.CopyRight-Page" initial-page-number="auto-odd">
...
将 force-page-count="end-on-even"
放在 fo:page-sequence
之前 每个 fo:page-sequence
您想要从奇数页开始。或者,在 fo:page-sequence
上设置 initial-page-number="auto-odd"
。参见 https://www.w3.org/TR/xsl11/#initial-page-number
force-page-count="even"
表示如果页面序列从偶数页开始,它将在奇数页结束以使其成为偶数页,反之亦然,如果它从奇数页开始. force-page-count="end-on-even"
将在奇数页结束,而不管页面序列是从奇数页还是偶数页开始。 (AH Formatter 有扩展以在 'doubly-even' 结束,此外还有更多,并强制整个文档的页数在偶数页结束等。参见 https://www.antennahouse.com/product/ahf63/ahf-ext.html#axf.force-page-count)但是,很可能 initial-page-number
会做你需要的。
还有:
- 您不需要重复
fo:conditional-page-master-reference
两个不同的odd-or-even
到 select 相同的 page-master。这与没有odd-or-even
的fo:conditional-page-master-reference
相同,因为默认值为any
。参见 https://www.w3.org/TR/xsl11/#odd-or-even。 - 您可以删除显式
page-position="any"
,因为这是默认设置。 - "Imprints"有两个'odd-or-even="even" page-position="rest"',所以永远不会用到第二个。
- 为 odd/even 和 rest/last 选择相同的 "PageMaster.TOC" 可以减少到
page-position="any"
。
更新
您可以将当前的 fo:page-sequence-master
更改为:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
在 fo:repeatable-page-master-alternatives
、"the conditions are tested in order from the beginning of the sequence of children" 内,因此您想将最不可能的备选方案放在首位。 (请参阅 https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives)您还希望在最后有一个包罗万象的替代方案,但您已经做到了。
但是,我不明白为什么 "Imprints" 包含 "PageMaster.CopyRight-Page" 和 "PageMaster.TOC",而版权页和目录分别位于引用特定页面的单独页面序列中-主人。您可能想要更像:
<fo:page-sequence-master master-name="Imprints">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Title-Page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="TOC">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="CopyRight-Page">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
<fo:page-sequence-master master-name="Content-Pages">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" page-position="first"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even"/>
<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd"/>
</fo:repeatable-page-master-alternatives>
...
<fo:page-sequence master-reference="Imprints">
...
<fo:page-sequence master-reference="CopyRight-Page" initial-page-number="auto-odd">
...
<fo:page-sequence master-reference="PageMaster.TOC" initial-page-master="auto-odd">
...
<xsl:for-each select="//tei:div[@n='1']">
<fo:page-sequence master-reference="Content-Pages" initial-page-number="auto-odd">