【问题】
docbook的源码中包含了emphasis的部分:
1 2 3 4 5 6 | < sect2 >< title >什么是ISO/IEC 11172-3和ISO/IEC 13818-3</ title > < para >由于MPEG只是ISO/IEC下面的一个组织,所以,关于MPEG音频部分的规范,也都是出自ISO/IEC之手。</ para > < para >因此,< emphasis >ISO/IEC 11172</ emphasis >和< emphasis >ISO/IEC 13818</ emphasis >,其实就是< emphasis >MPEG-1</ emphasis >和< emphasis >MPEG-2</ emphasis >的别名。</ para > < para >另外,由于MPEG-1和MPEG-2,每个都分好几个部分,其中,第3部分是关于音频(Audio)的。</ para > < para >所以,< emphasis >ISO/IEC 11172-3</ emphasis >和< emphasis >ISO/IEC 13818-3</ emphasis >,就分别对应着< emphasis >MPEG-1的音频</ emphasis >,< emphasis >MPEG-2的音频</ emphasis >,也就是我们常常提到的MPEG的音频文件所对应的规范。</ para > </ sect2 > |
生成的HTML中,效果如下:
但是生成的pdf却没效果:
现在想要给pdf中的emphasis添加一定的效果,比如加粗,或斜体,或设置字体颜色为蓝色/红色等。
【解决过程】
1.估计pdf输出效果的控制,会有对应的参数的,所以又去:
DocBook XSL Stylesheets: Reference Documentation
找有没有和emphasis相关的参数。
结果没有找到,只找到一个针对HTML的emphasis.propagates.style,结果试了下,对于HTML输出也没啥影响。
2.找到了这个人的解释:
才知道,原来pdf中emphasis没效果,是中文字体没有对应的粗体字体所导致的。
所以去试试修改字体配置。
3.试了试改成这样:
1 2 3 4 5 6 7 8 9 | < font metrics-url = "D:\tmp\tmp_dev_root\cgwin\home\CLi\develop\docbook\config\fop\fonts\msyh.xml" kerning = "yes" embed-url = "C:\Windows\Fonts\msyh.ttf" > < font-triplet name = "msyh" style = "normal" weight = "normal" /> <!-- <font-triplet name="msyh" style="normal" weight="bold"/> --> < font-triplet name = "msyhbd" style = "normal" weight = "bold" /> < font-triplet name = "msyh" style = "italic" weight = "normal" /> < font-triplet name = "msyh" style = "italic" weight = "bold" /> </ font > |
结果还是没效果。
然后才发现,好像源码中emphasis没有加上bold,所以又去加上:
1 2 3 4 5 6 | < sect2 >< title >什么是ISO/IEC 11172-3和ISO/IEC 13818-3</ title > < para >由于MPEG只是ISO/IEC下面的一个组织,所以,关于MPEG音频部分的规范,也都是出自ISO/IEC之手。</ para > < para >因此,< emphasis role = "bold" >ISO/IEC 11172</ emphasis >和< emphasis role = "bold" >ISO/IEC 13818</ emphasis >,其实就是< emphasis role = "bold" >MPEG-1</ emphasis >和< emphasis role = "bold" >MPEG-2</ emphasis >的别名。</ para > < para >另外,由于MPEG-1和MPEG-2,每个都分好几个部分,其中,第3部分是关于音频(Audio)的。</ para > < para >所以,< emphasis role = "bold" >ISO/IEC 11172-3</ emphasis >和< emphasis role = "bold" >ISO/IEC 13818-3</ emphasis >,就分别对应着< emphasis role = "bold" >MPEG-1的音频</ emphasis >,< emphasis role = "bold" >MPEG-2的音频</ emphasis >,也就是我们常常提到的MPEG的音频文件所对应的规范。</ para > </ sect2 > |
结果还是不行。
然后又发现没有注释掉原先的msyhbd的部分,又去注释掉,变成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | < font metrics-url = "D:\tmp\tmp_dev_root\cgwin\home\CLi\develop\docbook\config\fop\fonts\msyh.xml" kerning = "yes" embed-url = "C:\Windows\Fonts\msyh.ttf" > < font-triplet name = "msyh" style = "normal" weight = "normal" /> <!-- <font-triplet name="msyh" style="normal" weight="bold"/> --> < font-triplet name = "msyhbd" style = "normal" weight = "bold" /> < font-triplet name = "msyh" style = "italic" weight = "normal" /> < font-triplet name = "msyh" style = "italic" weight = "bold" /> </ font > < font metrics-url = "D:\tmp\tmp_dev_root\cgwin\home\CLi\develop\docbook\config\fop\fonts\msyhbd.xml" kerning = "yes" embed-url = "C:\Windows\Fonts\msyhbd.ttf" > < font-triplet name = "msyhbd" style = "normal" weight = "normal" /> <!-- <font-triplet name="msyhbd" style="normal" weight="bold"/> --> < font-triplet name = "msyhbd" style = "italic" weight = "normal" /> < font-triplet name = "msyhbd" style = "italic" weight = "bold" /> </ font > </ fonts > |
结果试了还是不行,并且导致我原先的标题文字从雅黑粗体msyhbd都变成了msyh的字体了。
4.后来改了源码变为:
1 2 3 4 5 6 | < sect2 >< title >什么是ISO/IEC 11172-3和ISO/IEC 13818-3</ title > < para >由于MPEG只是ISO/IEC下面的一个组织,所以,关于MPEG音频部分的规范,也都是出自ISO/IEC之手。</ para > < para >因此,< emphasis role = "strong" >ISO/IEC 11172</ emphasis >和< emphasis role = "strong" >ISO/IEC 13818</ emphasis >,其实就是< emphasis role = "bold" >MPEG-1</ emphasis >和< emphasis role = "bold" >MPEG-2</ emphasis >的别名。</ para > < para >另外,由于MPEG-1和MPEG-2,每个都分好几个部分,其中,第3部分是关于音频(Audio)的。</ para > < para >所以,< emphasis role = "underline" >ISO/IEC 11172-3</ emphasis >和< emphasis role = "underline" >ISO/IEC 13818-3</ emphasis >,就分别对应着< emphasis role = "bold" >MPEG-1的音频</ emphasis >,< emphasis role = "bold" >MPEG-2的音频</ emphasis >,也就是我们常常提到的MPEG的音频文件所对应的规范。</ para > </ sect2 > |
结果只有underline有效果,其他都没效果:
5.参考:
去给xsl中添加:
1 2 3 4 5 | < xsl:template match = "emphasis" > < fo:inline font-style = "italic" > < xsl:apply-templates /> </ fo:inline > </ xsl:template > |
结果还是没实现所要的效果。
6.其实上面已经找到了对应emphasis部分的显示控制,在:
inline.xsl
中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | < xsl:template match = "d:emphasis" > < xsl:variable name = "depth" > < xsl:call-template name = "dot.count" > < xsl:with-param name = "string" > < xsl:number level = "multiple" /> </ xsl:with-param > </ xsl:call-template > </ xsl:variable > < xsl:choose > < xsl:when test = "@role='bold' or @role='strong'" > < xsl:call-template name = "inline.boldseq" /> </ xsl:when > < xsl:when test = "@role='underline'" > < fo:inline text-decoration = "underline" > < xsl:call-template name = "inline.charseq" /> </ fo:inline > </ xsl:when > < xsl:when test = "@role='strikethrough'" > < fo:inline text-decoration = "line-through" > < xsl:call-template name = "inline.charseq" /> </ fo:inline > </ xsl:when > < xsl:otherwise > < xsl:choose > < xsl:when test = "$depth mod 2 = 1" > < fo:inline font-style = "normal" > < xsl:apply-templates /> </ fo:inline > </ xsl:when > < xsl:otherwise > < xsl:call-template name = "inline.italicseq" /> </ xsl:otherwise > </ xsl:choose > </ xsl:otherwise > </ xsl:choose > </ xsl:template > |
但是对于其所调用的inline.boldseq:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | < xsl:template name = "inline.boldseq" > < xsl:param name = "content" > < xsl:call-template name = "simple.xlink" > < xsl:with-param name = "content" > < xsl:apply-templates /> </ xsl:with-param > </ xsl:call-template > </ xsl:param > < fo:inline font-weight = "bold" > < xsl:if test = "@dir" > < xsl:attribute name = "direction" > < xsl:choose > < xsl:when test = "@dir = 'ltr' or @dir = 'lro'" >ltr</ xsl:when > < xsl:otherwise >rtl</ xsl:otherwise > </ xsl:choose > </ xsl:attribute > </ xsl:if > < xsl:copy-of select = "$content" /> </ fo:inline > </ xsl:template > |
中,却没太看懂。
大概意思好像是,用:
<fo:inline font-weight="bold">
来实现字体设置为bold。
但是结果还是没效果啊。
不知道理解是否正确,以及是否此处的bold,就是对应着字体设置,body字体为msyh的bold中的:
<font-triplet name="SimHei" style="normal" weight="bold"/>
如果是,那应该显示出黑体才对,但是这里没效果。
7.折腾了半天,
参考这里:
对于fo的语法,又多了些了解。
知道各种字体属性,背景属性等的关键词有哪些了。
知道了block和inline的区别了。
后来,继续折腾,通过手动将
inline.xsl中的<xsl:template name="inline.boldseq">中的:
1 | < fo:inline font-weight = "bold" > |
改为:
1 2 3 | < fo:inline font-weight = "bold" color = "red" > |
是可以实现对应的红色字体的效果的:
所以,这样看来,还是可以想办法,把这个设置,提取出来,单独放到我的xsl配置文件中的。
经过测试,不需要修改原始的inline.xsl,而只需要把如下配置,放到xsl配置文件docbook_crl.xsl中:
8.根据上面已经贴出的,inline.xsl中的关于emphasis的配置可以看出,其对于默认的,没有加role="strong",role="bold"等的emphasis,其格式化为italic斜体的,对应的配置为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | < xsl:template name = "inline.italicseq" > < xsl:param name = "content" > < xsl:call-template name = "simple.xlink" > < xsl:with-param name = "content" > < xsl:apply-templates /> </ xsl:with-param > </ xsl:call-template > </ xsl:param > < fo:inline font-style = "italic" > < xsl:call-template name = "anchor" /> < xsl:if test = "@dir" > < xsl:attribute name = "direction" > < xsl:choose > < xsl:when test = "@dir = 'ltr' or @dir = 'lro'" >ltr</ xsl:when > < xsl:otherwise >rtl</ xsl:otherwise > </ xsl:choose > </ xsl:attribute > </ xsl:if > < xsl:copy-of select = "$content" /> </ fo:inline > </ xsl:template > |
可以看出,其通过font-style="italic"去配置的字体为斜体,但是由于此处的中文,不支持,所以还是没效果的。
即普通的,不加参数的使用emphasis:
1 2 3 4 | < para >MPEG规范中规定了,每一个版本的MPEG,比如MPEG1,MPEG2等,都有三种不同的Layer,不同Layer的序号命令是以罗马数字的,所以叫做Layer I, Layer II, Layer III。其中,MPEG-1或MPEG-2的Layer III,被称为MP3,而其中最常见的是MPEG 1 的Layer III,所以,被大家所熟知的MP3,一般都指的是MPEG-1的Lay III。 </ para > < para >即< emphasis >MPEG-1的Layer III</ emphasis >被简称为< emphasis >MP3</ emphasis >。</ para > < para >根据事物发展由简到繁的规律,我们知道,Layer III,相对Layer I和Layer II,有着更复杂的压缩算法。正是其相对复杂,用了很多算法,比如声学上的掩蔽效应(masking effect),Huffman压缩等,才使得可以实现,在尽可能保持音质的前提下,极大地减少了音频文件大小,也就是说,尽量让你听上去音频声音和音质都没啥变化,但是MP3的文件大小,相对于原先没处理的音频数据或者其他格式的,比如WAV格式等,要小很多。</ para > |
其也是没有斜体的特殊效果的:
而参照bold的方法,去在xsl中添加对应的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | < xsl:template name = "inline.italicseq" > < xsl:param name = "content" > < xsl:call-template name = "simple.xlink" > < xsl:with-param name = "content" > < xsl:apply-templates /> </ xsl:with-param > </ xsl:call-template > </ xsl:param > <!-- <fo:inline font-style="italic"> --> < fo:inline font-family = "msyhbd" > < xsl:call-template name = "anchor" /> < xsl:if test = "@dir" > < xsl:attribute name = "direction" > < xsl:choose > < xsl:when test = "@dir = 'ltr' or @dir = 'lro'" >ltr</ xsl:when > < xsl:otherwise >rtl</ xsl:otherwise > </ xsl:choose > </ xsl:attribute > </ xsl:if > < xsl:copy-of select = "$content" /> </ fo:inline > </ xsl:template > |
然后就有效果了:
【总结】
想要给中文字体,此处为微软的雅黑(msyh)和微软的雅黑粗体(msyhbd),添加对应的emphasis的效果,直接使用默认的配置,是不行的,因为其默认的配置为斜体,但是pdf中显示不出来,所以,可以采用当emphasis,使用别的字体显示,此处使用msyhbd,以此来间接地实现emphasis的效果。
方法可以简述为:
将默认的inline.xsl中关于emphasis的配置中的:
inline.italicseq中的:
1 | < fo:inline font-style = "italic" > |
和
inline.boldseq中的:
1 | < fo:inline font-weight = "bold" > |
都改为:
1 | < fo:inline font-family = "msyhbd" > |
具体做法如下:
在自己的xsl配置文件中,添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | < xsl:template name = "inline.italicseq" > < xsl:param name = "content" > < xsl:call-template name = "simple.xlink" > < xsl:with-param name = "content" > < xsl:apply-templates /> </ xsl:with-param > </ xsl:call-template > </ xsl:param > <!-- <fo:inline font-style="italic"> --> < fo:inline font-family = "msyhbd" > < xsl:call-template name = "anchor" /> < xsl:if test = "@dir" > < xsl:attribute name = "direction" > < xsl:choose > < xsl:when test = "@dir = 'ltr' or @dir = 'lro'" >ltr</ xsl:when > < xsl:otherwise >rtl</ xsl:otherwise > </ xsl:choose > </ xsl:attribute > </ xsl:if > < xsl:copy-of select = "$content" /> </ fo:inline > </ xsl:template > < xsl:template name = "inline.boldseq" > < xsl:param name = "content" > < xsl:call-template name = "simple.xlink" > < xsl:with-param name = "content" > < xsl:apply-templates /> </ xsl:with-param > </ xsl:call-template > </ xsl:param > <!-- <fo:inline font-weight="bold"> --> < fo:inline font-family = "msyhbd" > < xsl:if test = "@dir" > < xsl:attribute name = "direction" > < xsl:choose > < xsl:when test = "@dir = 'ltr' or @dir = 'lro'" >ltr</ xsl:when > < xsl:otherwise >rtl</ xsl:otherwise > </ xsl:choose > </ xsl:attribute > </ xsl:if > < xsl:copy-of select = "$content" /> </ fo:inline > </ xsl:template > |
就可以实现,对于emphasis的默认配置(斜体)和添加了role="strong",role="bold"等的emphasis,都使用msyhbd字体来显示。
注:上面的内容,是从docbook-xsl-ns-1.76.1\fo\inline.xsl中拷贝出来,然后把字体修改为msyhbd的。
【一点疑问】
说是中文字体没有对应的斜体,但是却看到最开始就贴出来的,HTML中,emphasis却是可以正常显示出斜体的效果的。不知道为何?有待后续搞懂原因。
【后记 2012-06-05】
后来知道了,中文字体在html中有斜体等效果,是浏览器渲染出来的,不是真正的斜体的中文字体。
另外,后来对于emphasis的效果,后来改为换个其他的颜色,这样就更加容易实现了“强调”的效果了。
即把上述的font-family="msyhbd"改为color="brown"即可。
转载请注明:在路上 » 【已解决】docbook中生成的pdf的(中文字体的)emphasis无效果,没有加粗或斜体等效果