【问题】
docbook的源码中包含了emphasis的部分:
<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.试了试改成这样:
<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,所以又去加上:
<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的部分,又去注释掉,变成:
<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.后来改了源码变为:
<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中添加:
<xsl:template match="emphasis"> <fo:inline font-style="italic"> <xsl:apply-templates/> </fo:inline> </xsl:template>
结果还是没实现所要的效果。
6.其实上面已经找到了对应emphasis部分的显示控制,在:
inline.xsl
中:
<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:
<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">中的:
<fo:inline font-weight="bold">
改为:
<fo:inline font-weight="bold" color="red" >
是可以实现对应的红色字体的效果的:
所以,这样看来,还是可以想办法,把这个设置,提取出来,单独放到我的xsl配置文件中的。
经过测试,不需要修改原始的inline.xsl,而只需要把如下配置,放到xsl配置文件docbook_crl.xsl中:
8.根据上面已经贴出的,inline.xsl中的关于emphasis的配置可以看出,其对于默认的,没有加role="strong",role="bold"等的emphasis,其格式化为italic斜体的,对应的配置为:
<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:
<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中添加对应的配置:
<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中的:
<fo:inline font-style="italic">
和
inline.boldseq中的:
<fo:inline font-weight="bold">
都改为:
<fo:inline font-family="msyhbd">
具体做法如下:
在自己的xsl配置文件中,添加如下代码:
<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无效果,没有加粗或斜体等效果