【问题标题】:XSL-FO page-master-alternatives sometimes exhaustedXSL-FO page-master-alternatives 有时会用尽
【发布时间】:2016-04-19 09:15:12
【问题描述】:

我有一些强大的书籍样式表。目前,我无法弄清楚问题可能出在哪里。我的样式表有时有效,有时无效,具体取决于 TOC 的长度,我可以根据我想要包含在其中的级别数动态更改它。

我的样式表是这样工作的(我的意图是):

Imprints 部分从 Title-Page 开始,到偶数页结束,如果 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"force-page-count="end-on-even" 之间有什么区别。我检查了一些文档,但我仍然不清楚):

    <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">
...

【问题讨论】:

    标签: xsl-fo


    【解决方案1】:

    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 具有以“双偶数”结尾的扩展名,此外还有更多,并强制整个文档的页数以偶数页结尾,等等。请参阅https://www.antennahouse.com/product/ahf63/ahf-ext.html#axf.force-page-count)但是,很可能initial-page-number会做你需要的。

    还有:

    1. 您无需使用两个不同的odd-or-even 重复fo:conditional-page-master-reference 来选择相同的页面主控。这与没有odd-or-evenfo:conditional-page-master-reference 相同,因为默认值为any。见https://www.w3.org/TR/xsl11/#odd-or-even
    2. 您可以删除显式 page-position="any",因为无论如何这是默认设置。
    3. “印记”有两个 'odd-or-even="even" page-position="rest"',因此永远不会使用第二个。
    4. 为奇数/偶数和余数/尾数选择相同的“PageMaster.TOC”可以减少到仅page-position="any"

    更新

    您可以将当前的fo:page-sequence-masters 更改为:

        <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 中,“条件从子序列的开头开始按顺序进行测试”,因此您希望将最不可能的替代方案放在首位。 (请参阅https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives)您还希望在最后有一个包罗万象的替代方案,但您已经做到了。

    但是,当版权页面和 ToC 都位于引用特定页面母版的单独页面序列中时,我不明白为什么“印记”包括“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">
    

    【讨论】:

    • 坦克很多!但是,我仍然无法让它发挥作用。如果我不指定页面是否应该有特定的page-position,它会起作用。如果是这样,则生成 pdf,但忽略第一页的规则。我将force-page-count="end-on-even" 设置为Imprints 部分,将initial-page-number="auto-odd 添加到Content-Pages,根据您的建议缩短了Imprints 部分。还是筋疲力尽。我有点困惑如何为文档的其余部分重新排列母版。我还用改进的代码更新了问题。
    • 谢谢,看来真的可以了!至于印记,其目的是结构应该始终相同,没有任何变化——一个标题页(奇数)、一个版权页(偶数)、灵活长度的目录(偶数/奇数/空白)。
    • 所以标题页的页序列只需要引用“PageMaster.Title”,版权页的页序列到“PageMaster.CopyRight-Page”。然后,您可以删除“印记”和“CopyRight-Page”fo:page-sequence-master
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2020-07-14
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多