Emacs + Org-mode 8.x + XeLaTeX 輸出中文 PDF 文件


我選擇學 Emacs 而不是 Vim 最大的拉力之一就是 Org-mode 了,之前看 demo 就覺得寫完文件就能立刻輸出成 HTML 或 PDF 真是帥呆了,但實際使用後才發現雖然 HTML 是沒太大問題,但想要輸出 PDF 的路可是長路漫漫…因為文件裡的中文字元只要一輸出成 PDF 就會立刻人間蒸發給你看。簡單來說就是必須要先想辦法搞懂輸出中文 TeX 文件的方式,才來搞 Org 的輸出設定。因為初學時 Emacs 本身就折騰不完了,所以之前也一直懶得去搞這個,但這學期因為要一直交報告,乾脆就趁機弄懂一下要怎麼做。

其實現在要寫中文 tex 文件,需要折騰的東西比之前輕鬆很多了,用 xelatex 只需要指定好字型就能順利輸出中文,反而比較麻煩的還是學 TeX 基礎的語法部份。

現在最新的 Org 版本號是 8.x,但目前 Emacs 即使是最新的 stable release (24.3) 內建也都是 Org 7.x,重點是 8.x 的 export 功能改了超多,跟 7.x 會衝突,至少在我的系統上,如果直接拿 Emacs 24.3 硬裝最新版的 Org,整個 export 功能都會華麗地爆炸給你看。由於我實在很懶得去鳥這種衝突問題,最後解決的辦法是…去抓開發版的 Emacs 來編譯:

1
2
3
git clone git://git.savannah.gnu.org/emacs.git
# 或者
git clone http://git.savannah.gnu.org/r/emacs.git

整個 repo 超大, 要等好一陣子。不過編譯時到底有哪些 dependancies 我也忘記了勒,請用力看 make 訊息想辦法悲 ˊ・ω・ˋ

準備環境

TexLive

如果你用 openSUSE,基本上就直接打開萌萌的YaST2 或 zypper 安裝 texlivetexlive-cjk ,幾乎所有需要的 dependency 就都已經裝好了,包含 xelatex。
不過由於我有時會用到多行的 table cell,所以有另外安裝 texlive-multirow ,建議可以也裝一下。

至於其他 distro 的使用者,相信找找 texlive 和其看起來與中文相關的 dependencies 應該不是什麼大問題。

字型

  • 我使用了 cwTeX 的自由字型當做預設字型,還有文泉,請先安裝。
  • 如果你要使用其他字體,使用 fc-list :lang=zh 指令能夠取得目前系統上安裝的所有中文字體名稱;但不保證能用,可能要自己測試一下。雖然 XeLaTeX 可以把系統中現有的字型用在文件中,但還是有些問題,像是不知為何 cwTeXHeiBold 不管踹幾次,只要用了他,一編譯就會爆炸給你看。但其餘的 cwTeX 字型就不會有這個問題。

Emacs 設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
(setq org-latex-classes
'(("article"
"
\\documentclass[12pt,a4paper]{article}
\\usepackage[margin=2cm]{geometry}
\\usepackage{fontspec}
\\setromanfont{cwTeXMing}

\\usepackage{etoolbox} % Quote 部份的字型設定
\\newfontfamily\\quotefont{cwTeXFangSong}
\\AtBeginEnvironment{quote}{\\quotefont\\small}

\\setmonofont[Scale=0.9]{Courier} % 等寬字型 [FIXME] Courier 中文會爛掉!
\\font\\cwSong=''cwTeXFangSong'' at 10pt
%\\font\\cwHei=''cwTeXHeiBold'' at 10p %不知為何這套字型一用就爆掉...
\\font\\cwYen=''cwTeXYen'' at 10pt
\\font\\cwKai=''cwTeXKai'' at 10pt
\\font\\cwMing=''cwTeXMing'' at 10pt
\\font\\wqyHei=''文泉驛正黑'' at 10pt
\\font\\wqyHeiMono=''文泉驛等寬正黑'' at 10pt
\\font\\wqyHeiMicro=''文泉驛微米黑'' at 10pt
\\XeTeXlinebreaklocale ``zh''
\\XeTeXlinebreakskip = 0pt plus 1pt
\\linespread{1.36}

% [FIXME] ox-latex 的設計不良導致 hypersetup 必須在這裡插入
\\usepackage{hyperref}
\\hypersetup{
colorlinks=true, %把紅框框移掉改用字體顏色不同來顯示連結
linkcolor=[rgb]{0,0.37,0.53},
citecolor=[rgb]{0,0.47,0.68},
filecolor=[rgb]{0,0.37,0.53},
urlcolor=[rgb]{0,0.37,0.53},
pagebackref=true,
linktoc=all,}
"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
))
;; [FIXME]
;; 原本是不要讓 org 插入 hypersetup(因為 org-mode 這部份設計成沒辦法自訂,或許可以去 report 一下?)
;; 改成自行插入,但這樣 pdfcreator 沒辦法根據 Emacs 版本插入,pdfkeyword 也會無效...幹。
(setq org-latex-with-hyperref t)

;; 把預設的 fontenc 拿掉
;; 經過測試 XeLaTeX 輸出 PDF 時有 fontenc[T1]的話中文會無法顯示。
;; hyperref 也拿掉,改從 classes 處就插入,原因見上面 org-latex-with-hyperref 的說明。
(setq org-latex-default-packages-alist
'(("" "hyperref" nil)
("AUTO" "inputenc" t)
("" "fixltx2e" nil)
("" "graphicx" t)
("" "longtable" nil)
("" "float" nil)
("" "wrapfig" nil)
("" "rotating" nil)
("normalem" "ulem" t)
("" "amsmath" t)
("" "textcomp" t)
("" "marvosym" t)
("" "wasysym" t)
("" "multicol" t) ; 這是我另外加的,因為常需要多欄位文件版面。
("" "amssymb" t)
"\\tolerance=1000"))

;; Use XeLaTeX to export PDF in Org-mode
(setq org-latex-pdf-process
'("xelatex -interaction nonstopmode -output-directory %o %f"
"xelatex -interaction nonstopmode -output-directory %o %f"
"xelatex -interaction nonstopmode -output-directory %o %f"))

;; 指定你要用什麼外部 app 來開 pdf 之類的檔案。我是偷懶所以直接用 kde-open,你也可以指定其他的。
(setq org-file-apps '((auto-mode . emacs)
("\\.mm\\'" . default)
("\\.x?html?\\'" . "xdg-open %s")
("\\.pdf\\'" . "kde-open %s")
("\\.jpg\\'" . "kde-open %s")))

LaTeX-mode

因為有時候用 org-mode 輸出了 latex 檔後,還需要再另外編輯(例如 Org-mode 的 table 功能很有限,如果需要用到 multicols 之類的東西,就得自己手動再編輯 latex 檔)
但是在 LaTeX mode 中,按 C-c C-c 雖然可以自動呼叫 latex 指令編譯,但我們需要把他改成呼叫 xelatex

1
2
3
(setq tex-compile-commands '(("xelatex %r")))
(setq tex-command "xelatex")
(setq-default TeX-engine 'xelatex)

如果你使用 AUCTeX,需要設定的變數會不一樣,他用來 compile 的指令清單是 TeX-command-list ,我只改了 LaTeX 那個欄位,如果你有其他需求可以自己造樣造句看看。差不多是像這樣:

1
2
3
4
5
6
7
8
(setq TeX-command-list
'(("TeX" "%(PDF)%(tex) %`%S%(PDFout)%(mode)%' %t" TeX-run-TeX nil
(plain-tex-mode ams-tex-mode texinfo-mode)
:help "Run plain TeX")
("LaTeX" "xelatex -interaction nonstopmode %t" TeX-run-TeX nil
(latex-mode doctex-mode)
:help "Run LaTeX")
......))

使用

搞好這些後,開個 org 文件就可以快樂地開始寫東西了,寫完按 C-c C-e 就可開啟 export 選單選擇輸出 LaTeX 或直接衝 PDF。這時也可以先按 # default 插入 template,裡面可以設定一些選項,例如toc(table of contents)設定成 nil 或 t 可以指定要不要輸出目錄、tex 表示要不要支援 TeX 指令等。

Org 與 LaTeX 指令

  • 在 Org 文件中很多小地方可以使用 LaTeX 指令,例如用$算式$就可以輕鬆愉快的用標準的 LaTeX 數學公式表示法把算式直接寫在內文中;在公式或標題上按C-c C-x C-l可以即時預覽 LaTeX 公式輸出。
  • 需要注意的一點是換行,如果段落沒辦法順利換行,建議還是習慣在文章結尾加上\\或者使用\newline
  • 在 Org 文件中不用全部硬 K LaTeX 指令,他有自己的一套寫法。以下為我常用的幾個:

整份文件變成雙欄文件

只要在 Org 文件中任意處加上這行:

#+LaTeX_CLASS_OPTIONS: [a4paper,twoside,twocolumn]

Table

假設一個有六個 column 的 table,想要:

  1. 使用 longtable 套件讓 table 可以跨多頁(不過我發現這玩意有時會有靈異現象,沒事不要用,不過這是 longtable 的問題,跟 org 無關)
  2. 指定第三個 column 的寬度為 5cm。
  3. 字型大小縮小成 footnotesize 大小,超過就讓 cell 換行
  4. 加上標題 「女僕裝最棒了」

可以這樣寫,把這行加到 table 的前一行即可:

#+ATTR_LATEX: :environment longtable :align llp{5cm}lll :font \footnotesize
#+CAPTION: 女僕裝最棒了

至於有沒有辦法橫向或垂直向合併欄位呢?很抱歉,org 的 table 語法不可能辦到所以不要浪費時間了(他們的 mailing list 之前就有人問過),唯一的方法是先輸出 tex 檔再手動修改,使用 multirow 之類的。

表格/圖片/文字置中

不要浪費時間自己打\begin{center}之類的東西,直接輸入 <c 然後按 [TAB] 自動展開即可,這是 Org-mode 專用的的置中語法。

圖片標題/縮放

可以用 C-u C-c C-l 插入圖片。C-c C-x C-v 可以直接在 Emacs 裡顯示。

想要給圖片加上標題,只要直接在的前一行加上:

#+ATTR_LATEX: :caption \bicaption{標題}

調整輸出後的圖片大小與 float (可用:l/c/r) 則是:

#+ATTR_LATEX: :width 5cm :float c

順便講一下輸出 HTML 的圖片縮小方法。

#+ATTR_HTML: :width "100px"

更多詳細的屬性可以參考官方的 Org manual:@LaTeX{} specific attributes - The Org Manual

參考資料