如何指示 fo:block 跨页
How to indicate a fo:block spans a page
我有一个 fo:block 可能跨越一页。我想在块所在的第一页底部放置一些文本,例如 "continued"。
源文档在 标签内有一系列 。
我能看到的唯一方法是在源文档的正确位置添加Continued on the next page ,但这需要在编写文档时不断进行编辑。
是否有测试块是否跨越页面的方法?
源文档:
<recipe page-break="auto">
<instructions>
<step>The first thing to do</step>
<step>The second thing to do</step>
</instructions>
<recipe>
样式表的相关部分:
<xsl:template match="recipe">
<xsl:variable name="pbi"><xsl:choose><xsl:when test="@page-break"><xsl:value-of select="@page-break"/></xsl:when><xsl:otherwise>avoid</xsl:otherwise></xsl:choose></xsl:variable>
<xsl:variable name="pbb"><xsl:choose><xsl:when test="@page-break">always</xsl:when><xsl:otherwise>auto</xsl:otherwise></xsl:choose></xsl:variable>
<fo:block page-break-inside="{$pbi}" page-break-before="{$pbb}" margin-bottom="1.5em">
<xsl:apply-templates select="instructions/step" mode="plain"/>
</fo:block>
</xsl:template>
谢谢。
使用标记。将所有内容都放在 fo:table
中并在 fo:table-footer
中使用 fo:retrieve-table-marker
(参见 https://www.w3.org/TR/xsl11/#fo_retrieve-table-marker),或者在 fo:static-content
中使用 fo:retrieve-marker
作为 fo:region-after
。不同之处在于,使用 fo:table
方法时,'continued' 指示可以紧跟在页面最后一个文本之后(如本例所示),而不是使用 fo:retrieve-marker
方法。
<fo:table table-layout="fixed">
<fo:table-footer>
<fo:retrieve-table-marker
retrieve-class-name="footer-continued"
retrieve-position-within-table="last-ending"/>
</fo:table-footer>
<fo:table-body>
<fo:table-row>
<fo:marker marker-class-name="footer-continued">
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:block text-align="right"
font-style="italic">continued.....</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:marker>
<fo:table-cell padding="3pt">
<fo:block>The first thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row>
<fo:marker marker-class-name="footer-continued" />
<fo:table-cell padding="3pt">
<fo:block>The fourth thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
如果您解决其已记录(固定 table-layout,检索到的标记不能更改 block-progression 维度)和未记录(对位置挑剔)的问题,则可以使用 FOP 执行 fo:retrieve-table-marker
方法要放置 fo:retrieve-table-marker
,必须将 fo:marker
移动到 fo:table-cell
)限制:
<fo:table table-layout="fixed" width="100%">
<fo:table-footer>
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:block text-align="right"
font-style="italic">
<fo:retrieve-table-marker
retrieve-class-name="footer-continued"
retrieve-position-within-table="last-ending"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-footer>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:marker marker-class-name="footer-continued">continued.....</fo:marker>
<fo:block>The first thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:marker marker-class-name="footer-continued"> </fo:marker>
<fo:block>The fourth thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
虽然 Tony 的建议可行,但它仅适用于支持该构造的格式化程序。正如他建议的那样,您可以将纯标记拉入页脚。您可能对内容末尾和页脚之间的垂直 space 控制较少,但这取决于您的内容。
您只需在页脚区域使用 retrieve-marker,例如:
<fo:static-content flow-name="footer">
<fo:block-container text-align="left" margin-left="1in">
<fo:block><fo:retrieve-marker retrieve-class-name="continued" retrieve-boundary="page" retrieve-position="last-starting-within-page"/>
</fo:block>
</fo:block-container>
</fo:static-content>
现在,在您的流程中有一些块,您希望在该块打断页面时在其中显示消息。你使用这样的东西:
<fo:block-container>
<fo:marker marker-class-name="continued">I am continued on next page ...</fo:marker>
<fo:block margin-top="6pt">I am some text that will break across the page somewhere. When I do break the footer should have continued. I am some text that will break across the page somewhere. When I do break the footer should have continued. </fo:block>
<!-- More content here, whatever you need -->
</fo:block-container>
<fo:block-container keep-with-previous.within-page="always">
<fo:marker marker-class-name="continued"></fo:marker>
</fo:block-container>
block-container 中的第一个标记将创建一个 "marker",其中包含您想要的后续文本。如果页面在该块内中断,则标记将被拉入页脚区域。第二个标记有效 "clears" 它因为它没有内容。它被拉到页脚,但它是空白的,所以什么也没有显示。
结果是这样的,没有继续的文本存在(第 1、3、4 页),除了在标有继续消息(第 2 页)的区域内分页的地方。
我有一个 fo:block 可能跨越一页。我想在块所在的第一页底部放置一些文本,例如 "continued"。
源文档在
我能看到的唯一方法是在源文档的正确位置添加
是否有测试块是否跨越页面的方法?
源文档:
<recipe page-break="auto">
<instructions>
<step>The first thing to do</step>
<step>The second thing to do</step>
</instructions>
<recipe>
样式表的相关部分:
<xsl:template match="recipe">
<xsl:variable name="pbi"><xsl:choose><xsl:when test="@page-break"><xsl:value-of select="@page-break"/></xsl:when><xsl:otherwise>avoid</xsl:otherwise></xsl:choose></xsl:variable>
<xsl:variable name="pbb"><xsl:choose><xsl:when test="@page-break">always</xsl:when><xsl:otherwise>auto</xsl:otherwise></xsl:choose></xsl:variable>
<fo:block page-break-inside="{$pbi}" page-break-before="{$pbb}" margin-bottom="1.5em">
<xsl:apply-templates select="instructions/step" mode="plain"/>
</fo:block>
</xsl:template>
谢谢。
使用标记。将所有内容都放在 fo:table
中并在 fo:table-footer
中使用 fo:retrieve-table-marker
(参见 https://www.w3.org/TR/xsl11/#fo_retrieve-table-marker),或者在 fo:static-content
中使用 fo:retrieve-marker
作为 fo:region-after
。不同之处在于,使用 fo:table
方法时,'continued' 指示可以紧跟在页面最后一个文本之后(如本例所示),而不是使用 fo:retrieve-marker
方法。
<fo:table table-layout="fixed">
<fo:table-footer>
<fo:retrieve-table-marker
retrieve-class-name="footer-continued"
retrieve-position-within-table="last-ending"/>
</fo:table-footer>
<fo:table-body>
<fo:table-row>
<fo:marker marker-class-name="footer-continued">
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:block text-align="right"
font-style="italic">continued.....</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:marker>
<fo:table-cell padding="3pt">
<fo:block>The first thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row>
<fo:marker marker-class-name="footer-continued" />
<fo:table-cell padding="3pt">
<fo:block>The fourth thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
如果您解决其已记录(固定 table-layout,检索到的标记不能更改 block-progression 维度)和未记录(对位置挑剔)的问题,则可以使用 FOP 执行 fo:retrieve-table-marker
方法要放置 fo:retrieve-table-marker
,必须将 fo:marker
移动到 fo:table-cell
)限制:
<fo:table table-layout="fixed" width="100%">
<fo:table-footer>
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:block text-align="right"
font-style="italic">
<fo:retrieve-table-marker
retrieve-class-name="footer-continued"
retrieve-position-within-table="last-ending"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-footer>
<fo:table-body>
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:marker marker-class-name="footer-continued">continued.....</fo:marker>
<fo:block>The first thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
...
<fo:table-row>
<fo:table-cell padding="3pt">
<fo:marker marker-class-name="footer-continued"> </fo:marker>
<fo:block>The fourth thing to do</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
虽然 Tony 的建议可行,但它仅适用于支持该构造的格式化程序。正如他建议的那样,您可以将纯标记拉入页脚。您可能对内容末尾和页脚之间的垂直 space 控制较少,但这取决于您的内容。
您只需在页脚区域使用 retrieve-marker,例如:
<fo:static-content flow-name="footer">
<fo:block-container text-align="left" margin-left="1in">
<fo:block><fo:retrieve-marker retrieve-class-name="continued" retrieve-boundary="page" retrieve-position="last-starting-within-page"/>
</fo:block>
</fo:block-container>
</fo:static-content>
现在,在您的流程中有一些块,您希望在该块打断页面时在其中显示消息。你使用这样的东西:
<fo:block-container>
<fo:marker marker-class-name="continued">I am continued on next page ...</fo:marker>
<fo:block margin-top="6pt">I am some text that will break across the page somewhere. When I do break the footer should have continued. I am some text that will break across the page somewhere. When I do break the footer should have continued. </fo:block>
<!-- More content here, whatever you need -->
</fo:block-container>
<fo:block-container keep-with-previous.within-page="always">
<fo:marker marker-class-name="continued"></fo:marker>
</fo:block-container>
block-container 中的第一个标记将创建一个 "marker",其中包含您想要的后续文本。如果页面在该块内中断,则标记将被拉入页脚区域。第二个标记有效 "clears" 它因为它没有内容。它被拉到页脚,但它是空白的,所以什么也没有显示。
结果是这样的,没有继续的文本存在(第 1、3、4 页),除了在标有继续消息(第 2 页)的区域内分页的地方。