最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Docbook生成PDF中,程序代码programlisting中单行代码太长,超出页面宽度,无法显示

Docbook crifan 2472浏览 0评论

【问题】

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中,由于页面够宽,是可以完整显示代码的:

HTML中单行长代码是可以完全显示的

但是对于PDF中,由于上面那几行代码太长,超出了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的效果,长代码,就可以实现自动换行了:

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中单行代码太长,超出页面宽度,无法显示

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.187 seconds, using 22.02MB memory