具有上标和垂直对齐的XSL-FO表格单元格

时间:2015-06-17 10:25:43

标签: html xml xslt xsl-fo

情况如下: 我正在将html转换为xsl-fo为pdf。 我正在显示标题文字,如" 4.4.1。 [标题文字]"通过使用一个表,因为可能会发生[Header Text]很长并且在这种情况下将包裹到下一行,如下所示:

[table-row]
     [cell with numbering]  [cell with header text]
[/table-row]

有四种不同的情况如何组成标题:

  1. 标题文字单行
  2. 标题文字换行到下一行
  3. 标题文字单行带上标
  4. 标题文字换行到下一行 with superscript
  5. 问题是上标会增加行的高度,并且与垂直文本对齐混乱。这是默认情况下在所有4种情况下的外观:

    __________________________
    |_1.2.3_|_header_text____|      <<< OK
    
    __________________________
    | 1.2.3 | long long long |      <<< OK
    |_______|_header_text____|
    
    __________________________
    | 1.2.3 |            (1) |      <<< NOT OK
    |_______|_header_text____|
    
    __________________________
    | 1.2.3 | long long long |      <<< OK
    |       |            (1) |
    |_______|_header_text____|
    

    正如您所看到的,在案例3 中,编号和大部分标题文字都没有很好地对齐。

    我可以使用 display-align =&#34;在带有编号的表格单元格上的&#34; 之后解决第3种情况。但为了不弄乱其他3个案例,我需要确定标题文本的内容是否会换行到下一行。 我用于输出的字体不是等宽字体,这就是为什么计算字符最好是近似值。

    我的问题是,如何做到这一点,以便案例3看起来像:

    __________________________
    |       |            (1) |
    |_1.2.3_|_header_text____|
    

    而其他人保持不变。

    谢谢!

    编辑:案例3的标记示例

    <fo:table font-size="18pt" font-weight="bold" font-style="italic" space-after="2mm" space-before="7mm" keep-with-next.within-page="always">
        <fo:table-column column-width="16mm"/>
        <fo:table-column/>
        <fo:table-body>
            <fo:table-row>
                <fo:table-cell>
                    <fo:block>1.2.3</fo:block>
                </fo:table-cell>
                <fo:table-cell>
                    <fo:block>
                        <fo:block text-align="left">
                            <fo:block>Header Text (<fo:inline baseline-shift="super">1</fo:inline>)
                            </fo:block>
                        </fo:block>
                    </fo:block>
                </fo:table-cell>
            </fo:table-row>
        </fo:table-body>
    </fo:table>
    

    编辑2:我试图颠倒上标逻辑:

    • 不要在应该上标
    • 的文字上使用上标标记
    • 包含 上标的标题的所有文字部分(包括编号)

    这&#34;工作&#34;,我测试了案例3 + 4,标题文本与两种情况下的编号一致。

    但它的缺点是我在标题的顶部有一点额外的间距,我不得不扭转以完全恢复标题中的上标设置。

2 个答案:

答案 0 :(得分:1)

我想你正在使用fo:inline元素来包装你的上标文本。如果将行堆叠策略从默认的max-height更改为font-height,则与上标不会有差距。试试:

<fo:inline vertical-align="super" line-stacking-strategy="font-height">Your superscript text here</fo:inline>

编辑:我也将行堆叠策略放在父块中,这实际上导致了效果。我使用Altsoft的渲染器XML2PDF进行了测试:

<fo:block line-stacking-strategy="font-height">Header Text <fo:inline baseline-shift="super">(1)</fo:inline>

为了获得完全相同的基线,我建议也将它用于前一个字段:

<fo:block line-stacking-strategy="font-height">1.2.3</fo:block>

答案 1 :(得分:0)

使用relative-align="baseline"(请参阅https://www.w3.org/TR/xsl11/#relative-align)。由于它是继承的,因此您可以根据需要将其放在fo:table-rowfo:table上。

对于relative-align="baseline",每个fo:table-cell中的第一行与同一基线对齐。案例3中的上标有效地向下推了fo:table-cell中第一行的基线,而其他fo:table-cell中的基线将对齐以匹配较低的基线。