如何实现fo:float与环绕文本升序线的顶端平齐对齐?
实现fo:float与环绕文本升序线(Ascender Line)顶端平齐的通用方案
需求是让段落开头的侧浮动元素fo:float无论处于文档任何位置,都能与环绕它的文本升序线顶端对齐。当前仅当段落位于页面顶部时,line-height.conditionality="discard"会丢弃上行距,使float对齐升序线;但非顶部段落因保留上行距,float会对齐行框顶端而非文本升序线。使用工具为AntennaHouse FO Formatter 7.2。
方案1:使用AntennaHouse扩展属性axf:float-align
AntennaHouse FO Formatter提供的扩展属性axf:float-align可以直接指定float与文本的对齐基准。给fo:float元素添加该属性并设置值为ascender,就能自动适配行距差异,让float精准对齐文本升序线:
<fo:float float="start" axf:float-align="ascender"> <fo:block-container inline-progression-dimension="20%" background-color="yellow" border="1px solid black"> <fo:block>FLOAT-2</fo:block> </fo:block-container> </fo:float>
这个方案无需手动计算间距,适配所有段落位置,是最便捷的通用解决方案。注意要在fo:root中声明AntennaHouse的扩展命名空间:xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"。
方案2:手动设置负margin偏移
如果无法使用扩展属性,可通过计算上行距并设置负margin来调整float位置:
- 上行距计算公式:
(line-height - font-size) / 2 - 给
fo:float内部的fo:block-container设置负的margin-top,值等于上行距,以此抵消行框顶端到文本升序线的间距。
针对示例参数(font-size="24pt",line-height="1.8"),上行距为(24pt*1.8 -24pt)/2 =9.6pt,设置如下:
<fo:float float="start"> <fo:block-container inline-progression-dimension="20%" background-color="yellow" border="1px solid black" margin-top="-9.6pt"> <fo:block>FLOAT-2</fo:block> </fo:block-container> </fo:float>
若要适配动态字体大小,可使用相对单位计算:
margin-top="calc(-((1.8em - 1em)/2))"
该方案需确保line-stacking-strategy为font-height,保证行距计算的准确性。
修改后的完整示例代码
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"> <fo:layout-master-set> <fo:simple-page-master master-name="pages"> <fo:region-body margin-left="1in" margin-right="1in" margin-top="1in" margin-bottom="1in" /> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="pages"> <fo:flow flow-name="xsl-region-body"> <fo:wrapper line-stacking-strategy="font-height" line-height.conditionality="discard" line-height="1.8" font-size="24pt"> <fo:block space-after="2lh"> <fo:float float="start" axf:float-align="ascender"> <fo:block-container inline-progression-dimension="20%" background-color="yellow" border="1px solid black"> <fo:block>FLOAT-1</fo:block> </fo:block-container> </fo:float>Torem dolor amet adipisicing sed eiusmod incididunt labore dolore aliqua enim minim quis exercitation laboris ut ex commodo Duis irure in in velit cillum eu nulla Excepteur occaecat non sunt. </fo:block> <fo:block space-after="2lh"> <fo:float float="start" axf:float-align="ascender"> <fo:block-container inline-progression-dimension="20%" background-color="yellow" border="1px solid black"> <fo:block>FLOAT-2</fo:block> </fo:block-container> </fo:float>Torem dolor amet adipisicing sed eiusmod incididunt labore dolore aliqua enim minim quis exercitation laboris ut ex commodo Duis irure in in velit cillum eu nulla Excepteur occaecat non sunt. </fo:block> </fo:wrapper> </fo:flow> </fo:page-sequence> </fo:root>
内容的提问来源于stack exchange,提问作者Christian Roth
相关产品推荐
相关产品推荐

