将org导出PDF

最近在研究如何将org文件导出PDF。org-mode的强大之处就不用我说了,可以做笔记、GTD等。 org-mode虽好,但是懂的人相对较少。直接分享org文件会有些不人性化。随着Github开始支持org-mode,相信这么优秀的文件格式将来越来越被接受,学习的人也会越来越多。 PDF文件出众的文字渲染效果让人有着更好的阅读体验。如果可以将org文件导出PDF与人分享那当然是最好的了。其实org-mode是默认是支持转成PDF文件的,但是其默认对中文支持不好。 另外,作为一个程序员,整天要跟代码打交道。org文件中也会嵌入些代码,导出PDF如果可以支持代码高亮,那自是最好不过了。 我花了两个周末时间去研究去尝试,现在终于可以完美的支持中文和代码语法高亮了。现在写出来与大家分享。

需要注意的是,笔者一直在macOS下工作,本文如无特殊说明均默认操作系统为macOS。

1 安装

1.1 安装Emacs

sudo brew cask install emacs

1.2 安装Mactex

brew cask install mactex

2 导出配置

2.1 基础导出配置

基础导出配置放在文档的开头,主要终于文档的全局配置,包括支持中文、代码语法高亮、页面大小等。 以下是我的导出配置:

#+LATEX_HEADER: \documentclass{article}
#+LATEX_CLASS_OPTIONS: [a4paper]
#+LATEX_HEADER: \usepackage{xeCJK}
#+LATEX_HEADER: \usepackage{minted}
#+LATEX_HEADER: \usepackage[margin=2cm]{geometry}
#+LATEX_HEADER: \setminted{fontsize=\small,baselinestretch=1}

简单解释下以上导出设置的含义。上述配置设置导出的文档类型为article,页面为A4纸大小,使用xeCJK包支持中文,使用minted支持语法高亮,设置页面距为2cm。

2.2 内容相关导出配置

这里我只给出几种我遇到的情况,如果你遇到其他问题可以参考org-mode手册的 LaTeX export 部分

2.2.1 防止内容溢出页面

  • 表格
#+ATTR_LATEX: :environment longtable :align l|lp{3cm}r|l
| ..... | ..... |
| ..... | ..... |

具体的可以参见org-mode manual。

3 Emacs配置

3.1 LaTeX导出设置

设置编译器

(require 'ox-latex)
(setq org-latex-compiler "xelatex")
(setq org-latex-pdf-process
'("xelatex -8bit -shell-escape -interaction nonstopmode -output-directory %o %f"))

3.2 源代码语法高亮

;; use minted to hightlight the source code
(add-to-list 'org-latex-packages-alist '("" "minted"))
(setq org-latex-listings 'minted)
(add-to-list 'org-latex-minted-langs '(csharp "csharp"))
(setq org-latex-minted-options
'(
("linenos=true")
;; ("mathescape=true")
;; ("numbersep=5pt")
;; ("gobble=2")
("frame=lines")
;; ("framesep=2mm")
))

3.3 中文表格对齐

Emacs默认不支持含有中文的表格的自动对齐,这让人看起来很不舒服,可以用以下配置来解决这个问题。

;; -----------------------------------------------------------------------------  
;; setting font for mac system
;; -----------------------------------------------------------------------------
;; Setting English Font
(defun s-font()
(interactive)
;; font config for org table showing.
(set-face-attribute
'default nil :font "Monaco 12")

;; Chinese Font 配制中文字体
(dolist (charset '(kana han symbol cjk-misc bopomofo))
(set-fontset-font (frame-parameter nil 'font)
charset
(font-spec :family "Microsoft YaHei" :size 14)))
)

;; tune rescale so that Chinese character width = 2 * English character width
;;(setq face-font-rescale-alist '(("Monaco" . 1.0) ("Microsoft YaHei" . 1.23)))
(add-to-list 'after-make-frame-functions
(lambda (new-frame)
(select-frame new-frame)
(if window-system
(s-font)))
)

(if window-system
(s-font))

4 导出

导出的快捷键是 C-x C-e l o 。 如果在导出的过程中,出现一些package不存在的提示,可以用如下命令安装:

sudo tlmgr install <package name>

5 总结

本文简单介绍了下如何将org-mode文件导出PDF文件,并支持中文和源代码语法高亮。我的Emacs的配置可以参见Github。 另外我也建议使用YasSnippet这个插件来记录我提到的一些导出配置,这样可以节省你的一些时间,让你更加专注于写作。