如何使用 FOP 在 XML-FO 中指定 2ch 的缩进
How to specify an indent of 2ch in XML-FO using FOP
我正在尝试在 XML-FO 文档中使用固定宽度的字体创建两个字符的缩进。我正在使用 FOP 翻译它。
不幸的是,当我指定像 "2ch"
这样的长度时,FOP 会生成此错误消息:
[ERROR] PropertyMaker - Unknown length unit 'ch'
XML-FO 文档声明允许任何 CSS-已知长度单位,并且 CSS 指定 ch
是 [=14] 的宽度=] 字符。所以 AFAIU 这应该有效,但仍然无效。
我也没有找到 FOP 理解的具体长度单位列表(ix
也没有用)。不过,em
是可以理解的。但它表示(即使在使用固定宽度字体等宽字体时)宽度大约为 1.5 个字符。
有没有办法指定等宽两个字符的缩进?
是否有完整的 FOP 支持的长度单位列表?
是否有其他方法可以实现缩进具体字符数的目标?我可以使用像 1.3em
这样的 hack,但这可能不准确。
XSL recommendation中定义的计量单位是:
cm
(厘米)
mm
(毫米)
in
(英寸)
pt
(分)
pc
(派卡)
px
(像素)
em
(当前字体大小)
FOP 支持所有 ,并增加了 mpt
(毫分),但正如您所注意到的,其中 none 指的是宽度等宽字体的字符。
其他格式化程序可能支持额外的度量单位,例如我看到 AntennaHouse XSLFormatter 支持 ch
。
FOP 的可能解决方法
如果你只需要一个text-indent
(即只是第一行),你可以使用不间断空格:
<fo:block>  Lorem ipsum dolor ...</fo:block>
如果您事先知道该块将只生成一行,您还可以使用保留的常规空格 以便于 FO 文件的可读性:
<fo:block white-space-treatment="preserve"
white-space-collapse="false"> Lorem ipsum dolor ...</fo:block>
在大多数情况下(如果您想定义 start-indent
、end-indent
、...),您可以使用字体信息计算准确值:
创建字体指标
java -classpath build/fop.jar:fop/lib/avalon-framework-api-4.3.1.jar:fop/lib/commons-logging-1.0.4.jar:fop/lib/commons-io-1.3.1.jar:fop/lib/xmlgraphics-commons-svn-trunk.jar org.apache.fop.fonts.apps.TTFReader -enc ansi /path/to/font.ttf metrics.xml
打开metrics.xml
并查找类似于<char idx="29" wdt="600"/>
的元素(wdt
值可以不同,但所有char
个元素)
wdt
是一个字符的宽度,以毫点为单位:将它乘以 font-size
和字符数,得到你需要的长度
例如: 600 x 12 x 2 = 14400mpt = 14.4pt = 两个字符的长度 font-size
为 12pt
我正在尝试在 XML-FO 文档中使用固定宽度的字体创建两个字符的缩进。我正在使用 FOP 翻译它。
不幸的是,当我指定像 "2ch"
这样的长度时,FOP 会生成此错误消息:
[ERROR] PropertyMaker - Unknown length unit 'ch'
XML-FO 文档声明允许任何 CSS-已知长度单位,并且 CSS 指定 ch
是 [=14] 的宽度=] 字符。所以 AFAIU 这应该有效,但仍然无效。
我也没有找到 FOP 理解的具体长度单位列表(ix
也没有用)。不过,em
是可以理解的。但它表示(即使在使用固定宽度字体等宽字体时)宽度大约为 1.5 个字符。
有没有办法指定等宽两个字符的缩进?
是否有完整的 FOP 支持的长度单位列表?
是否有其他方法可以实现缩进具体字符数的目标?我可以使用像 1.3em
这样的 hack,但这可能不准确。
XSL recommendation中定义的计量单位是:
cm
(厘米)mm
(毫米)in
(英寸)pt
(分)pc
(派卡)px
(像素)em
(当前字体大小)
FOP 支持所有 ,并增加了 mpt
(毫分),但正如您所注意到的,其中 none 指的是宽度等宽字体的字符。
其他格式化程序可能支持额外的度量单位,例如我看到 AntennaHouse XSLFormatter 支持 ch
。
FOP 的可能解决方法
如果你只需要一个text-indent
(即只是第一行),你可以使用不间断空格:
<fo:block>  Lorem ipsum dolor ...</fo:block>
如果您事先知道该块将只生成一行,您还可以使用保留的常规空格 以便于 FO 文件的可读性:
<fo:block white-space-treatment="preserve"
white-space-collapse="false"> Lorem ipsum dolor ...</fo:block>
在大多数情况下(如果您想定义 start-indent
、end-indent
、...),您可以使用字体信息计算准确值:
创建字体指标
java -classpath build/fop.jar:fop/lib/avalon-framework-api-4.3.1.jar:fop/lib/commons-logging-1.0.4.jar:fop/lib/commons-io-1.3.1.jar:fop/lib/xmlgraphics-commons-svn-trunk.jar org.apache.fop.fonts.apps.TTFReader -enc ansi /path/to/font.ttf metrics.xml
打开
metrics.xml
并查找类似于<char idx="29" wdt="600"/>
的元素(wdt
值可以不同,但所有char
个元素)wdt
是一个字符的宽度,以毫点为单位:将它乘以font-size
和字符数,得到你需要的长度
例如: 600 x 12 x 2 = 14400mpt = 14.4pt = 两个字符的长度 font-size
为 12pt