【问题】
Docbook中的程序代码,xml源码为:
<para>打开windows下面的cmd,然后切换到对应的fop的根目录,执行下面的命令:</para> <programlisting> java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname SimHei C:\Windows\Fonts\simhei.ttf fonts\simhei.xml java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname msyh C:\Windows\Fonts\msyh.ttf fonts\msyh.xml java -cp build\fop.jar;lib\avalon-framework-4.2.0.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-1.4.jar org.apache.fop.fonts.apps.TTFReader -ttcname msyhbd C:\Windows\Fonts\msyhbd.ttf fonts\msyhbd.xml </programlisting> <para>就可以生成相应的字体的XML Metrics文件了,然后再把相应的如下的设置:</para>
生成的HTML中,由于页面够宽,是可以完整显示代码的:
但是对于PDF中,由于上面那几行代码太长,超出了PDF中页面的宽度,导致无法显示:
现在想要PDF中单行长代码,通过自动换行到下一行的形式,全部显示出来。
【解决过程】
1.找到:Enabling line-wrap in a docbook programlisting and adding a line wrap symbol,然后其解释中给出了官网的链接:Breaking long lines,然后参照其解释,去我自己的fo的xsl配置文件中添加了相应配置:
<!-- http://www.sagehill.net/docbookxsl/FittingText.html#BreakLongLines --> <xsl:attribute-set name="monospace.verbatim.properties"> <xsl:attribute name="wrap-option">wrap</xsl:attribute> </xsl:attribute-set>
生成的PDF的效果,长代码,就可以实现自动换行了:
2.但是顺便也去docbook-xsl-ns-1.76.1\fo\param.xsl中去找了下monospace.verbatim.properties,发现默认配置,的确是把wrap关闭了的:
<xsl:attribute-set name="monospace.verbatim.properties" use-attribute-sets="verbatim.properties monospace.properties"> <xsl:attribute name="text-align">start</xsl:attribute> <xsl:attribute name="wrap-option">no-wrap</xsl:attribute> </xsl:attribute-set>
所以,不得不抱怨一句,此处觉得对于决定将默认的monospace的wrap设置为no的人,还是很傻x,为何不默认开启,搞得大家还要遇到代码太长不显示,还需要来看你的配置,专门修改你的配置。这是有点弱智的设计。
应该设置为默认开启,然后如果有人对于默认长代码换行,需要设置特殊的hyphenation-character,然后自己再参考官网的配置,去设置自己的特殊字符,这样才比较合理,才方便作为用户的我们使用xsl的配置文件。
【总结】
想要实现programlisting中的单行太长的代码,自动换行,得以完整显示的话,只需要去给fo的xsl配置中添加:
<xsl:attribute-set name="monospace.verbatim.properties"> <xsl:attribute name="wrap-option">wrap</xsl:attribute> </xsl:attribute-set>
即可。
如果想要设置特殊换行所添加的字符,可以参考:
<xsl:attribute-set name="monospace.verbatim.properties"> <xsl:attribute name="wrap-option">wrap</xsl:attribute> <xsl:attribute name="hyphenation-character">\</xsl:attribute> </xsl:attribute-set>
去修改为自己想要的值。
转载请注明:在路上 » 【已解决】Docbook生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无法显示