如何使用引线垂直对齐 2 个块

How to align 2 blocks vertically using leaders

我需要使用 fo:leader 创建一个包含请求和响应的 table 像这样:

Table leader like this

然而最后的结果是这样的:

Both block align top

我的问题是左边的块有 2 行,右边的块有 2 行,它们都在顶部对齐。 我需要将左块对齐在顶部,右块在底部对齐。

这可能吗?

遵循实际代码:

<fo:inline-container vertical-align="top" inline-progression-dimension="60%">
<fo:block start-indent="0.5em" text-indent="-0.5em" text-align-last="justify" margin-right="0.3cm"<xsl:value-of select="challenge/para|limitdesc/para|sopitem/para"/>
<fo:leader leader-pattern="dots"/</fo:block>
</fo:inline-container>
<fo:inline-container relative-position="relative" vertical-align="bottom" display-align="after" inline-progression-dimension="40%">
<fo:block start-indent="0.5em" text-indent="-0.5em" display-align="after"><xsl:value-of select="response/para|limitvalue/para|limittext/para|act/para"/></fo:block>
</fo:inline-container>

我尝试使用 AH Formatter 并找到了两个解决方案。

[1] 对后者使用baseline-shift fo:inline-container

<fo:block>
    <fo:inline-container vertical-align="top" inline-progression-dimension="60%">
        <fo:block start-indent="0.5em" text-indent="-0.5em" text-align-last="justify">
            [1] Text here text here text here text here text here text here text here
            <fo:leader leader-pattern="dots"/></fo:block></fo:inline-container><fo:inline-container baseline-shift="-1.44em" inline-progression-dimension="40%">
        <fo:block start-indent="0.5em" text-indent="-0.5em" display-align="after">
            Continued text here text here text here text here
        </fo:block>
    </fo:inline-container>
</fo:block>

我指定了`baseline-shift="-1.44em"。 (这取决于使用的字体)此方法仅在第一行计数等于 2 时有效。

[2] 使用 fo:table 而不是 fo:inline-container

<fo:table width="100%">
    <fo:table-column column-number="1" column-width="60%"/>
    <fo:table-column column-number="2" column-width="40%"/>
    <fo:table-body>
        <fo:table-row>
            <fo:table-cell>
                <fo:block start-indent="0.5em" text-indent="-0.5em" text-align-last="justify">
                    [2] Text here text here text here text here text here text here text here
                    <fo:leader leader-pattern="dots"/></fo:block>
            </fo:table-cell>
            <fo:table-cell/>
        </fo:table-row>
        <fo:table-row>
            <fo:table-cell/>
            <fo:table-cell padding-before="-1.32em">
                <fo:block start-indent="0.5em" text-indent="-0.5em" display-align="after">
                    Continued text here text here text here text here
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </fo:table-body>
</fo:table>

此方法不依赖第一个fo:table-cell中的文本行。

使用AH Formatter GUI的两次格式化结果:

我的 Formatter 版本是 6.4。但是结果是一样的。

扩展@tmakita 的答案,您可以使用 alignment-baseline 对齐两个 fo:inline-container 的基线(参见 https://www.w3.org/TR/xsl11/#fo_inline-container 处的讨论)。

您可以使用 last-line-end-indent(请参阅 https://www.w3.org/TR/xsl11/#last-line-end-indent)使引导项目超过文本末尾,但您还需要限制文本的宽度。在此示例中,我在第一个 fo:inline-container:

中使用了 fo:block-container
<fo:block>
    <fo:inline-container vertical-align="top" inline-progression-dimension="60%" alignment-baseline="text-after-edge">
        <fo:block-container width="50%">
            <fo:block start-indent="0.5em" text-indent="-0.5em" text-align-last="justify" last-line-end-indent="-100%">
            [3] Text here text here text here text here text here text here text here text here text here text here text here text here text here Text here text here text here text here text here text here text here<fo:leader leader-pattern="dots" leader-length.minimum="50%" leader-length.optimum="50%"/></fo:block>
        </fo:block-container>
    </fo:inline-container><fo:inline-container inline-progression-dimension="40%">
                <fo:block start-indent="0.5em" text-indent="-0.5em">
                    Continued text here text here text here text here
                </fo:block>
            </fo:inline-container>
</fo:block>

除非您希望最后一行的文本能够超出其余部分,否则最小和最佳前导长度应至少为两组文本之间的间隙宽度。