XSL-FO table-cell 带上标和垂直对齐
XSL-FO table-cell with superscript and vertical alignment
情况是这样的:
我正在将 html 转换为 xsl-fo 为 pdf。
我使用 table 显示标题文本,如“4.4.1. [Header 文本]”,因为 [Header 文本] 可能很长并且在该案例应像这样换行到下一行:
[table-row]
[cell with numbering] [cell with header text]
[/table-row]
header 有 4 种不同的组合方式:
- header 文本单行
- header 文本换行到下一行
- header 文本单行 带上标
- header 文本换行到下一行 带有上标
问题是上标会增加行的高度并扰乱垂直文本对齐方式。这是所有 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 中,编号和大部分 header 文本没有很好地对齐。
我可以通过在带有编号的 table-cell 上使用 display-align="after" 来解决案例 3。但是为了不弄乱其他 3 种情况,我需要确定 header 文本的内容是否会换行到下一行。
我用于输出的字体不是等宽字体,这就是为什么计数字符充其量只是一个近似值。
我的问题是,如何才能使案例 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:我试图扭转 superscript-logic:
- 不要在应该上标
的文本上使用上标标记
- 包装标题的所有文本部分(包括编号)应该是
中的上标
这个 "worked",我针对案例 3 + 4 进行了测试,标题文本是 in-line,在这两种情况下都有编号。
但它的缺点是我在标题顶部有一点额外的间距,我必须扭转才能完全恢复标题中的上标设置。
我想您正在使用 fo:inline 元素来包装上标文本。如果将 line-stacking-strategy 从默认的 max-height 更改为 font-height,则上标不会有间隙。尝试:
<fo:inline vertical-align="super" line-stacking-strategy="font-height">Your superscript text here</fo:inline>
编辑:我也将 line-stacking-strategy 放在父块中,这实际上是造成这种影响的原因。我用 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>
使用relative-align="baseline"
(参见https://www.w3.org/TR/xsl11/#relative-align)。由于它是继承的,因此您可以将其放在 fo:table-row
上,如果需要,甚至可以放在 fo:table
上。
对于 relative-align="baseline"
,每个 fo:table-cell
中的第一行与相同的基线对齐。案例 3 中的上标有效地将其 fo:table-cell
中第一行的基线向下推,而另一行 fo:table-cell
中的基线将对齐以匹配较低的基线。
情况是这样的: 我正在将 html 转换为 xsl-fo 为 pdf。 我使用 table 显示标题文本,如“4.4.1. [Header 文本]”,因为 [Header 文本] 可能很长并且在该案例应像这样换行到下一行:
[table-row]
[cell with numbering] [cell with header text]
[/table-row]
header 有 4 种不同的组合方式:
- header 文本单行
- header 文本换行到下一行
- header 文本单行 带上标
- header 文本换行到下一行 带有上标
问题是上标会增加行的高度并扰乱垂直文本对齐方式。这是所有 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 中,编号和大部分 header 文本没有很好地对齐。
我可以通过在带有编号的 table-cell 上使用 display-align="after" 来解决案例 3。但是为了不弄乱其他 3 种情况,我需要确定 header 文本的内容是否会换行到下一行。 我用于输出的字体不是等宽字体,这就是为什么计数字符充其量只是一个近似值。
我的问题是,如何才能使案例 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:我试图扭转 superscript-logic:
- 不要在应该上标 的文本上使用上标标记
- 包装标题的所有文本部分(包括编号)应该是 中的上标
这个 "worked",我针对案例 3 + 4 进行了测试,标题文本是 in-line,在这两种情况下都有编号。
但它的缺点是我在标题顶部有一点额外的间距,我必须扭转才能完全恢复标题中的上标设置。
我想您正在使用 fo:inline 元素来包装上标文本。如果将 line-stacking-strategy 从默认的 max-height 更改为 font-height,则上标不会有间隙。尝试:
<fo:inline vertical-align="super" line-stacking-strategy="font-height">Your superscript text here</fo:inline>
编辑:我也将 line-stacking-strategy 放在父块中,这实际上是造成这种影响的原因。我用 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>
使用relative-align="baseline"
(参见https://www.w3.org/TR/xsl11/#relative-align)。由于它是继承的,因此您可以将其放在 fo:table-row
上,如果需要,甚至可以放在 fo:table
上。
对于 relative-align="baseline"
,每个 fo:table-cell
中的第一行与相同的基线对齐。案例 3 中的上标有效地将其 fo:table-cell
中第一行的基线向下推,而另一行 fo:table-cell
中的基线将对齐以匹配较低的基线。