使用reStructuredText来生成精美的PDF文件

Image1

reStructuredText 介绍

reStructuredText 是一门标记语言,与之类似的还有 markdown 等,它是编写python文档的主力语言。 我喜欢它主要是因为它的文本模式可读性很好,而且功能比markdown要强,另外也没有latex那么复杂。 通过docutils的支持还可以方便的转换成各种格式。

所以我一直使用它来写很多东西。比如你现在看到的这篇blog就是用它写的。

一个简单的rst文件

=====
Title
=====

Subject 1
---------

Subject 1.1
~~~~~~~~~~~

- point 1
- point 2

table

+--------------+-------------+
| Column1      | Value       |
+--------------+-------------+
| name         | rst         |
+--------------+-------------+

rst转换成pdf的一些方法

reStructuredText可以很方便的转换成各种格式:

piglei2007@macbook-pro:rst_study$ rst2
rst2html.py            rst2man.py             rst2odt_prepstyles.py  rst2pseudoxml.py
rst2xetex.py           rst2latex.py           rst2odt.py             rst2pdf
rst2s5.py              rst2xml.py

使用上面的的那些命令可以方便的把rst文件转换成各种格式,但是惟独没有pdf格式。

通过google我了解到有一位作者写了一个 rst2pdf 工具用来把rst转换成pdf文件,但是经过我的测试,这个工具 对于中文pdf的转换效果很糟糕,有很多排版上的问题。所以只能另找办法。

而pdf恰好是tex的强项,所以就有了一个曲线救国的办法,就是先把rst文件转换成xetex文件,然 后使用工具把xetex文件转换成pdf文件。

为什么不是latex

网上很多人会先把rst文件转换成latex文件,然后使用pdflatex工具转换出pdf。但是经过我的测试,使用 pdflatex转换出来的pdf文件字体非常的模糊,而且这个问题比较难得到解决,所以我换了xelatex,事实证明 xelatex格式转换出来的效果非常好,而且字体支持方面也比latex要强大很多。

PDF In Action

首先我们需要安装docutils模块

sudo pip install docutils

然后再安装 texlive ,texlive的安装过程需要网络的支持,建议选择一个比较快的镜像站。那样可以大大缩小 安装需要的时间。

安装过程中没有什么特别需要注意的,需要保持网络的通畅。安装完成后,我们需要把texlive的bin目录添加到 环境变量中。

修改~/.bashrc,添加如下行

PATH=$PATH:/usr/local/texlive/2012/bin/universal-darwin/

我使用的Mac os,所以你的目录可能会和我的有差别。

新建一个rst文件作为测试,这里我们使用这篇blog的rst文件,在转换之前我们先在当前目录下创建一个 docutils.conf文件和docutils.tex文件,定义我们使用的一些基本样式

$ cat docutils.conf
[latex2e writer]
documentclass: article
documentoptions: 11pt,a4paper
output-encoding: utf-8
stylesheet: docutils.tex

$ cat docutils.tex
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyfoot{}
\usepackage{xeCJK}
% 设置页面间距
\usepackage[top=1in, bottom=1in, left=1.25in, right=1.25in]{geometry}
% 设置字体
\setCJKmainfont[BoldFont=SimHei, ItalicFont=KaiTi]{SimSun}
\setCJKmonofont[Scale=0.9]{DejaVu Sans Mono}
\setCJKfamilyfont{song}[BoldFont=SimSun]{SimSun}
\setCJKfamilyfont{sf}[BoldFont=SimSun]{SimSun}

这里我设置了一些基本的字体大小,页面间距等内容。然后我们使用rst2xetex.py来将其转换为xetex文件:

rst2xetex.py restructuredtext_to_pdf.rst restructuredtext_to_pdf.xetex

然后使用xelatex工具来转换出pdf文件:

xelatex restructuredtext_to_pdf.xetex

注意

在使用xelatex转换过程过程中,很有可能因为字体不存在而报错,这个使用我们可以使用 fc-list :outline -f "%{family}n" 命令来列出系统中所有存在的字体,把字体替换充系统中存在的字体。 或者下载缺失的字体安装。

另外,使用rst2xetex.py会默认使用以下三种字体,在我的Mac系统中,前两种都找不到:

%%% Custom LaTeX preamble
% Linux Libertine (free, wide coverage, not only for Linux)
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
\setmonofont[HyphenChar=None]{DejaVu Sans Mono}

这个时候需要删掉这三行(因为之后的docutils.tex会覆盖这三个字体设置),或者找到这两个字体,并安装上。 这里我附上这两个字体的地址:

  • Linux Libertine O [.. ../texlive/2012/texmf-dist/fonts/opentype/public/libertine/]
  • Linux Biolinum O [.. ../texlive/2012/texmf-dist/fonts/opentype/public/libertine/]

最后大功告成,附上最后生成的pdf文件: 点击查看

Enjoy reStructuredText and PDF!