开发者社区> 小桥河西> 正文

利用openjade + ctex + jadetex从sgml生成PostgreSQL中文pdf手册

简介: 1.背景 去年底的时候PostgreSQL中国社区组织了PostgreSQL 9.3手册的翻译工作,翻译中的html版的中文手册可以网站(http://58.58.25.191:8079/doc/html/9.3.1_zh/)在线浏览。
+关注继续查看

1.背景

去年底的时候PostgreSQL中国社区组织了PostgreSQL 9.3手册的翻译工作,翻译中的html版的中文手册可以网站(http://58.58.25.191:8079/doc/html/9.3.1_zh/)在线浏览。如今大部分的页面已经翻译完成(但校对比较滞后),因此生成pdf版手册的任务就提上了日程。

2.概述

PostgreSQL的手册文档是用sgml格式的docbook写的,docbook本身不带显示格式,但可以通过工具输出成各种常用的文档格式,比如html和pdf。其中转换到pdf的过程分为两步。首先,用openjade转到tex格式,然后再用pdfjadetex转成pdf格式。对于英文文档,这个过程很容易,调用PG的make脚本就可以了。但这两个工具对中文的支持不太好,所以要把PG社区翻译后的PostgreSQL手册输出成pdf就比较费事了。以下是经过调查和不断尝试总结出的步骤。

3.步骤

3.1 将sgml编译成tex

参考PG的手册,在Linux下装上编译文档所必须的软件,然后进入源码根目录。
http://www.postgresql.org/docs/9.4/static/docguide-toolsets.html
执行下面的命令把sgml编译成tex格式

点击(此处)折叠或打开

  1. ./configure
  2. cd doc/src/sgml
  3. make postgres-A4.tex-pdf

注1)这一步的要点是sgml必须是GB2312编码,不能是UTF8,否则openjade会出错。可参考http://blog.chinaunix.net/uid-20726500-id-3998759.html。
注2)Windows下编译出来的tex-pdf中文字符都变成了“\Character{20840}”这样的形式,后面不好处理,所以不能在Windows上编译。

3.2手工修补postgres-A4.tex-pdf

从现在开始可以转到Windows上操作。上面生成出来的postgres-A4.tex-pdf有些小问题,需要修补一下。先把上一步生成的postgres-A4.tex-pdf传到Windows上,再用编辑器打开进行编辑。在postgres-A4.tex-pdf中找到下面这处,进行修改。

点击(此处)折叠或打开

  1. {\def\fFamName{Times-New-Roman}}Copyright牘燶Node%
  2. ==
  3. {\def\fFamName{Times-New-Roman}}Copyright \Entity{copy} \Node%
再用全局替换,把所有"燶"改成"\"

点击(此处)折叠或打开


  1. ==
  2. \

最后把postgres-A4.tex-pdf存成UTF8编码(后面的处理需要)。

注3)英文sgml编译时也会有这些字符,但最后生成的英文pdf没有问题(可能由于英文是单字节字符的原因,这些字符没有影响后面pdftex的生成pdf)。不知道这是不是openjade的bug。

3.3安装ctex

在Windows上下载并安装ctex作为tex到pdf转换集成环境。
http://www.ctex.org/CTeXDownload

注4)Linux上可以安装texlive集成环境,但是配置pdftex引擎的中文字体很麻烦,xetex引擎虽然对中文支持的很好,但是一旦用上jadetex格式对中文的支持就有问题了。

3.4下载安装jadetex包

从开始菜单找到:CteX->MiKTeX->Maintenance->Package Manager,然后从List里找到jadetex,点击鼠标右键,再点"Install"进行安装。

3.5编辑jadetex.ltx

安装jadetex后进入jadetex所在目录,打开其中的jadetex.ltx进行编辑,使其可以支持中文。
C:\CTEX\UserData\tex\jadetex\base\jadetex.ltx

修正1:

点击(此处)折叠或打开

  1. \documentclass{minimal}
  2. \RequirePackage{array}[1995/01/01]
  3. ==
  4. \documentclass{minimal}
  5. \usepackage{CJKutf8}
  6. \RequirePackage{array}[1995/01/01]

修正2:

点击(此处)折叠或打开

  1. \RequirePackage[dsssl]{inputenc}[1997/12/20]
  2. ==
  3. %\RequirePackage[dsssl]{inputenc}[1997/12/20]

修正3:

点击(此处)折叠或打开

  1. \RequirePackage[implicit=true,colorlinks,linkcolor=black,bookmarks=true]{hyperref}[2000/03/01]
  2. ==
  3. \RequirePackage[unicode,implicit=true,colorlinks,linkcolor=black,bookmarks=true]{hyperref}[2000/03/01]

修正4:

点击(此处)折叠或打开

  1. \fi
  2. \enddocument}
  3. ==
  4. \fi
  5. \end{CJK}
  6. \enddocument}

修正5:

点击(此处)折叠或打开

  1. \fi
  2. \makeatletter
  3. ==
  4. \fi
  5. \begin{CJK}{UTF8}{song}
  6. \makeatletter
最后一个{song}是指中文使用的字体名,如果你喜欢可以换成别的字体,前提是ctex上得安装了那个字体。

3.6生成pdf

进入postgres-A4.tex-pdf文件所在目录。如果目录中有上次编译残留的下列文件,先将它们删除。
postgres-A4.out
postgres-A4.log
postgres-A4.aux

执行下面的命令就可以生成postgres-A4.pdf了。(执行时间大概有20几分钟)

点击(此处)折叠或打开

  1. pdflatex --hash-extra=2000000 --job-name=postgres-A4 \input jadetex.ltx \input postgres-A4.tex-pdf
  2. pdflatex --hash-extra=2000000 --job-name=postgres-A4 \input jadetex.ltx \input postgres-A4.tex-pdf
  3. pdflatex --hash-extra=2000000 --job-name=postgres-A4 \input jadetex.ltx \input postgres-A4.tex-pdf
注5)上面相同的命令执行了3次,这不是笔误,后面2次执行是为了生成书签和交叉引用。
注6)--hash-extra=2000000 的作用是为了扩大hash的size,如果不设置,可能会报出下面的错误。(通过命令“initexmf --edit-config-file=pdflatex”修改配置文件,设置hash_extra=2000000也能达到相同目的)
! TeX capacity exceeded, sorry [hash size=215000].

最后生成的pdf中有些表格的显示异常,部分内容显示到格子外面去了,对照了下官方的英文pdf,发现也有相同的问题(PG的手册中也提到这个问题,似乎没什么很好的解决办法,只能手工在sgml适当的位置加空格让tex可以断行)。而且这个pdf文件比较大,有27M, 但PG官网上的英文pdf手册只有6M,于是尝试用试用版ORPALIS PDF Reducer优化了一下,可以缩小到12M。另外,pdf中保留了所有的链接引用(比如每个SQL命令最下方的"参见"),能方便跳转,但是链接文字和普通文字在外观上没有任何区别,只有把鼠标移上去才能知道那是链接。

4.写在最后

本文用到一些软件或技术都是比较过时,像sgml格式的docbook(取而代之的是xml格式的docbook)和pdftex(现在都推荐使用可以直接使用OS字体的xetex),它们对中文的支持不太好,所以才这么折腾。但是PG现在就是用的这些,没办法。
除了本文的方法外,还可以先生成html再生成pdf。这种方法比较容易实施,但是生成的pdf内容是网页风格的,不像是一本“书”。看了下日本PG用户会的官网,他们并没有提供pdf版的手册,只提供在线的html,打包的html和sgml。但在Symfoware(Open)的安装包里带了一份PG的日文版pdf手册,从风格上可以看出是通过html生成的(看了下文档属性,发现是用Acrobat Web Capture 10.0生成的),效果也不错

5.补充

在编译9.6.0的pdf时,遇到了下面的错误。
! TeX capacity exceeded, sorry [main memory size=5000000]
奇怪的是在pdflatex的命令行里设置"--main-memory=5000000"没有任何作用,于是按照以下方法回避

  1. 执行以下命令

    initexmf --edit-config-file=pdflatex 
  2. 在打开的编辑器中编辑pdflatex.ini

    main_memory=5000000 
    extra_mem_bot=5000000 
    pool_size=5000000 
    buf_size=5000000 
  3. 执行命令更新LaTeX格式文件

    initexmf --dump=pdflatex

6.参考

《The TeXBook》
http://www.texdoc.net/
http://texdoc.net/texmf-dist/doc/latex/lshort-chinese/lshort-zh-cn.pdf
http://texdoc.net/texmf-dist/doc/latex/base/fntguide.pdf
http://texdoc.net/texmf-dist/doc/fonts/fontinst/manual/fontinst.pdf
http://texdoc.net/texmf-dist/doc/latex/latex2e-help-texinfo/latex2e.pdf
http://texdoc.net/texmf-dist/doc/otherformats/jadetex/base/index.html
http://texdoc.net/texmf-dist/doc/latex/cjk/doc/CJK.txt
http://lyanry.is-programmer.com/posts/332.html
http://www.study-area.org/tips/latex/pdftex.html
http://www.math.zju.edu.cn/ligangliu/LaTeXForum/tex_setup_chinese.htm
http://bbs.ctex.org/forum.php?mod=viewthread&tid=40981
http://ar.newsmth.net/thread-3984539b999fc4.html
https://github.com/matlab2tikz/matlab2tikz/wiki/TeX-capacity-exceeded,-sorry


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android官方开发文档Training系列课程中文版:OpenGL绘图之应用投影与相机视图
原文地址:http://android.xsoftlab.net/training/graphics/opengl/projection.html##transform 在OpenGL ES环境中,投影相机View可以将所绘制的图形模拟成现实中所看到的物理性状。
1066 0
SQL Server插入中文数据后出现乱码
原文:SQL Server插入中文数据后出现乱码 今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [dbo].
844 0
Mac mysql 解决中文乱码
Mac mysql 解决中文乱码问题 出现“???”之类的无法识别的乱码 到/etc目录下自己建一个my.cnf文件(需要最高权限,使用sudo su),然后写入内容: [client] default-character-set=utf8 [mysqld] character-set-server=utf8 保存,修改。
1048 0
Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件
原文地址:http://android.xsoftlab.net/training/graphics/opengl/touch.html 使图形按照程序设计的轨迹旋转对OpenGL来说还是不能发挥出它应有的实力。
902 0
Android官方开发文档Training系列课程中文版:OpenGL绘图之环境配置
原文地址:http://android.xsoftlab.net/training/graphics/opengl/index.html 引言 Android framework层为创建绚丽的功能性UI提供了大量的标准工具。
1130 0
Android官方开发文档Training系列课程中文版:OpenGL绘图之添加动态效果
原文地址:http://android.xsoftlab.net/training/graphics/opengl/motion.html 在屏幕上绘制物体只是OpenGL基础的基础,除了OpenGL,你还可以使用Canvas及Drawable对象做到同样的功能。
859 0
+关注
小桥河西
半个PostgreSQL DBA,热衷于数据库及分布式技术。 - https://github.com/ChenHuajun - https://pan.baidu.com/s/1eRQsdAa
187
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载