【问题标题】:How to handle indents of very long fo:list-item-labels?如何处理很长的 fo:list-item-labels 的缩进?
【发布时间】:2016-07-08 12:03:43
【问题描述】:

我有以下fo 标记:

<fo:list-block>
    <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
            <fo:block>[KEY]</fo:block>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
            <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
        </fo:list-item-body>
    </fo:list-item>
</fo:list-block>

虽然这看起来不错,但如果我将其更改为:

<fo:list-block>
    <fo:list-item>
        <fo:list-item-label end-indent="label-end()">
            <fo:block>[VERYLONGKEY]</fo:block>
        </fo:list-item-label>
        <fo:list-item-body start-indent="body-start()">
            <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
        </fo:list-item-body>
    </fo:list-item>
</fo:list-block>

fo:list-item-label 和以下fo:list-item-body 重叠。如何设置 start-indentend-indent 以使用标签的实际宽度?目前看来label-end()body-start() 是一个常数,但我想要一个动态标签宽度。这在 xsl-fo 中可行吗?

【问题讨论】:

    标签: pdf xsl-fo apache-fop


    【解决方案1】:

    您需要知道最长标签的长度才能做到这一点。如果你这样做,你设置临时距离开始以适应它。这与您设置缩进的任何文字处理器没有什么不同。给定所需的最长缩进的已知长度以及您在一行上的全部内容,设置该属性以保留标签空间。例如,如果您的标签约为 100pt,则:

           <fo:list-block provisional-distance-between-starts="100pt" provisional-label-separation="3pt">
                <fo:list-item>
                    <fo:list-item-label end-indent="label-end()">
                        <fo:block>A.</fo:block>
                    </fo:list-item-label>
                    <fo:list-item-body start-indent="body-start()">
                        <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                    </fo:list-item-body>
                </fo:list-item>
                <fo:list-item>
                    <fo:list-item-label end-indent="label-end()">
                        <fo:block>[VERYLONGKEY]</fo:block>
                    </fo:list-item-label>
                    <fo:list-item-body start-indent="body-start()">
                        <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                    </fo:list-item-body>
                </fo:list-item>
            </fo:list-block>
    

    产生以下结果:

    请注意,这只是必需的,因为您的字符串 [VERYLONGKEY] 没有断点。如果您设置了起始点之间的临时距离,并且您的标签类似于“我是一个很长的标签,我应该换行”,它就会换行。

    像这样:

             <fo:list-block provisional-distance-between-starts="100pt" provisional-label-separation="3pt">
                <fo:list-item>
                    <fo:list-item-label end-indent="label-end()">
                        <fo:block>A.</fo:block>
                    </fo:list-item-label>
                    <fo:list-item-body start-indent="body-start()">
                        <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                    </fo:list-item-body>
                </fo:list-item>
                <fo:list-item>
                    <fo:list-item-label end-indent="label-end()">
                        <fo:block>[VERYLONGKEY]</fo:block>
                    </fo:list-item-label>
                    <fo:list-item-body start-indent="body-start()">
                        <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                    </fo:list-item-body>
                </fo:list-item>
                <fo:list-item>
                    <fo:list-item-label end-indent="label-end()">
                        <fo:block>I am a label that is very long and I should wrap</fo:block>
                    </fo:list-item-label>
                    <fo:list-item-body start-indent="body-start()">
                        <fo:block>Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah 
                            Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah </fo:block>
                    </fo:list-item-body>
                </fo:list-item>
            </fo:list-block>
    

    【讨论】:

      【解决方案2】:

      严格来说,这在 XSL 1.1 中是不可能的。

      如果 FOP 支持自动表格布局,您可以通过为标签和正文使用包含两列的表格来伪造它。

      您也可以通过使用fo:inline-container 作为列表项正文的内容来为每个列表项捏造它,但目前据说 FOP 中的fo:inline-container 支持是有限的(请参阅http://xmlgraphics.apache.org/fop/compliance.html) .

      但是,您可以使用 Print & Page Layout Community Group 的 XSLT Extensions 来获取 FOP 区域树,以便您可以根据格式化大小做出决定。在https://www.w3.org/community/ppl/wiki/XSLTExtensions#Example_4_-_List_item_label_widthhttps://www.w3.org/community/ppl/2015/02/18/getting-an-area-tree-within-your-xslt-transform/ 有使用扩展设置列表缩进的示例。

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 2015-05-24
        相关资源
        最近更新 更多