fo:列表块对齐问题-如何对齐底部?

问题描述 投票:0回答:1

早上好!

感谢您的浏览。我有一些可爱的 MIL-STD-40051 XML (DTD 6.5.3) 和一个样式表问题。

这是我第一次遇到列表块。 我发现这个网站有助于我理解这个概念。

文字

这张图片特别有帮助。

列表块布局的视觉指南

如果这是一个表格,我会说问题是两个单元格与单元格的顶部对齐,而我需要它们与单元格的底部对齐。

但它是一个列表块,而且......我不知道如何用列表块来实现它。 我花了大约四个小时进行实验,没有任何乐趣,并决定尝试向社区寻求帮助。

DTD 片段,稍微简化一下:

<!ELEMENT tsindx.messageword (applicable?, title, (tsindx.messageword-category+ | tsindx.messageword-entry+))
<!ELEMENT tsindx.messageword-category (applicable?, title, tsindx.messageword-entry+)>
<!ELEMENT tsindx.messageword-entry (applicable?, messageword+, xref)>

样式表 (xsl) 片段:

<xsl:template match="tsindx.messageword">
    <fo:block font-family="sans-serif" font-size="10pt" provisional-distance-between-starts="29pc" provisional-label-separation="0pt" space-before.conditionality="discard" space-before.maximum="12pt" space-before.minimum="8pt" space-before.optimum="10pt">
[snip]

<xsl:template match="tsindx.messageword-category">
    <fo:block font-weight="bold" space-before.conditionality="discard" space-before.maximum="8pt" space-before.minimum="5pt" space-before.optimum="6pt" span="all" start-indent="0pt">
        <xsl:value-of select="title"/>
        <xsl:apply-templates select="tsindx.messageword-entry"/>
    </fo:block>
</xsl:template>

<!-- this is the bit that produces my output -->

<xsl:template match="tsindx.messageword-entry">
    <fo:list-block>
        <fo:list-item>
            <fo:list-item-label>
                <fo:block start-indent="6pt" space-after="8pt">
                    <xsl:number count="tsindx.messageword-entry" format="1." from="tsindxwp" level="any"/>
                    <xsl:text disable-output-escaping="no">&#x2003;</xsl:text>
                    <xsl:apply-templates select="messageword"/>
                    <fo:leader leader-pattern="dots"/>
                </fo:block>
            </fo:list-item-label>
            <fo:list-item-body relative-align="baseline">
                <xsl:apply-templates select="xref"/>
            </fo:list-item-body>
        </fo:list-item>
    </fo:list-block>
</xsl:template>

(  是一个 em 空间,比普通空间稍宽。)

PDF 输出如下所示:

--PDF--

空气系统故障排除

  1. 空气系统未达到工作压力,或失压 WP 0021

操作期间。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 .

制动系统故障排除

  1. 拖车制动器过热、拖曳或不松开。 。 。 。 。 。 。 。 WP 0025

  2. 拖车制动不均匀、拉向一侧或制动不可用 WP 0026

  3. 车辆刹车过热、拖滞或不松开。 。 。 。 。 。 。 。 WP 0028

  4. 车辆刹车不均匀、向一侧拉动、或不踩... WP 0029

--pdf 结束--

大体上是正确的,但 #1 和 #3 需要一些工作。

第一个问题:

如果这是一个表格,我会说单元格需要对齐底部而不是对齐顶部。 但它是一个列表块,显然它们的工作方式不同......

列表标签项(标题)足够长,可以换行到第二行,这很好。

列表项主体 WP 0021 填充时与列表项标签(标题)的顶部对齐,而不是与列表项标签的底部(在前导点的末尾)对齐。

我明白了:

  1. 空气系统未达到工作压力,或失压 WP 0021

操作期间。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 .

列表项主体与列表项标签的上行对齐,而不是前导点。

评论者抱怨它看起来像

“空气系统未达到工作压力,或在运行期间失去压力 WP 0021”

我真的不能同意。

我想要的是这个:

  1. 空气系统未达到工作压力,或失压

操作期间。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 WP 0021

如果列表项标签标题足够长,可以换行,则列表项正文将填充在前导点之后,与列表项标签的底部对齐。

我一直在用notepad++和Oxygen编辑样式表。 氧气给了我大量的属性选项,但没有一个能够实现我想要的。

第二个问题(优先级较低,但仍然很好解决)

如果能够将列表项标签字段的长度限制得短一点并将文本换行到第二行,那就太好了。 长标题缺乏领导线看起来很奇怪。

当前输出是这样的:

  1. 拖车制动不均匀、拉向一侧或制动不可用 WP 0026

list-item-label 一直延伸到 list-item-body 并且没有引导线。

这样会更好:

  1. 拖车制动不均匀,拉向一侧,或制动不均匀

不申请。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 …… 。 。 。 。 。 WP 0026

列表项标签限制得短一些,因此总有一条引导线。

解决问题 #2 将取决于解决问题 #1 并使列表项主体与列表项标签的底部对齐。

(抱歉,这很冗长;我正在努力确保我对这些问题有完整的解释。)

预先感谢您提供的任何帮助。

我已经为两个 fo:block 尝试了一系列不同的属性更改。 到目前为止,还没有成功。

xsl-fo
1个回答
0
投票

在我看来,只有数字需要放在

fo:list-item-label
中,而条目文本、领导者和
xref
可以放在
fo:list-item-body
中。

有关如何使用

fo:leader
的讨论,请参阅 https://www.antenna.co.jp/AHF/help/en/ahf-ext.html#axf.leader-expansion
fo:leader 中的示例
来自 XSL-FO 示例集合的示例,网址为 https://www.antennahouse.com/xsl-fo-samples。特别请参阅 https://www.antennahouse.com/xsl-fo-samples#axf-last-right-justify-1,PDF 位于 https://www.antennahouse.com/hubfs/xsl-fo-样本/行/axf-last-right-justify-1.pdf?hsLang=en。其中的
fo:block-container
样本是:

<fo:block-container text-align="justify" text-align-last="right">
<fo:block>Lorem ipsum dolor sit amet, consectetur adipiscing cons equat elit...
<fo:leader />
<fo:leader leader-length.optimum="100%" />
<fo:inline keep-together.within-line="always">Antenna House</fo:inline>
</fo:block>
</fo:block-container>

如果您使用 Antenna House Formatter,则可以使用

axf:tab-stops
,如该示例所示。

© www.soinside.com 2019 - 2024. All rights reserved.