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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
8月前
|
小程序 Java 容器
“马士兵老师”纯手写2022版多线程与高并发PDF学习手册
这份2022版多线程与高并发的学习手册,是基于同学们2022上半年面试遇到的问题呀以及当下最流行的技术进行的更新升级的版本讲解,从最基础的线程、纤程、协程等等开始讲起,其中还有高并发调优的经验讲解,从基础到精通一站式为大家解决完。
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——一读多写
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——一读多写自制脑图
90 1
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——技术含量
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——技术含量自制脑图
152 1
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——简介
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB——简介自制脑图
65 2
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB
阿里云最新产品手册——阿里云核心产品——云原生关系型数据库PolarDB自制脑图
72 1
|
11月前
|
Cloud Native 关系型数据库 分布式数据库
《阿里云产品手册2022-2023 版》——云原生关系型数据库 PolarDB
《阿里云产品手册2022-2023 版》——云原生关系型数据库 PolarDB
546 0
|
11月前
|
Cloud Native 关系型数据库 分布式数据库
《阿里云产品手册2022-2023 版》——云原生关系型数据库 PolarDB
《阿里云产品手册2022-2023 版》——云原生关系型数据库 PolarDB
235 0
|
11月前
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
311 0
|
11月前
|
存储 Cloud Native Oracle
阿里云创新手册-PolarDB开源生态专场-阿里云原生数据库PolarDB:数据业务永远在线,数据价值不断放大
阿里云创新手册-PolarDB开源生态专场-阿里云原生数据库PolarDB:数据业务永远在线,数据价值不断放大
438 0
|
11月前
|
SQL 分布式计算 关系型数据库

热门文章

最新文章