SolomonAboutLink

Spacemacs 和 Org-mode 和 LaTeX

2017-06-27 · #emacs #latex #org-mode · source

Table of content

前言

我曾经试图将我的所有课笔记转换成 Markdown 文档以永久保存。我的笔记包含了大量的数学公式,所以需要在 Markdown 里内嵌 LaTeX。

LaTeX 是对著名排版系统 TeX 的二次开发,TeX 是公认的数学公式排版最好的系统。

但是,在 Markdown 里编辑 LaTeX 简直是噩梦:编辑器不提供 LaTeX 的补全。一个公式里可能有大量重复的 \alpha\sigama\rightarrow 等符号,而它们全部需要我一个字母一个字母地输入。

此外,在 Markdown 中内嵌 LaTeX 大多是通过 MathJax 实现的,但是 MathJax 支持的宏十分有限:

MathJax 不支持很多 LaTeX 宏
MathJax 不支持很多 LaTeX 宏

所以在花费了大量时间将一本书的笔记录成 Markdown 之后,我放弃了。:)


后来在 #archlinux-cnriaqn 安利下,我开始使用 Emacs 的 Org-mode 来作笔记。不得不说相比 Markdown,Org-mode 配合 Emacs 的生态,在各种体验上都上升了不止一个等级。

Emacs 和 Org-mode 和 LaTeX
Emacs 和 Org-mode 和 LaTeX

当然,一个编辑器想要达到最佳的输入效果,一番配置是少不了的。下面就是我的整个 Emacs + Org-mode + LaTeX 环境的配置过程,大家可以选择性观看。

Spacemacs

Emacs(Editor MACroS) 是一个文本编辑器,著名的编辑器之战的两大主角之一(另一个是 vi 即其派生版本)。

在 openSUSE 中安装 Emacs 只需要在 root 用户下运行:

$ zypper in emacs

其他的 Linux 发行版请尝试使用包管理器安装,或者和 Windows/macOS 用户一起看看官方文档

而 Spacemacs 是一个由社区驱动的 Emacs 的分支,它的口号是:

The best editor is neither Emacs nor Vim, it's Emacs and Vim!

正如他们的口号所言,Spacemacs 的最大的特点就是 Vim 风格中通过 Evil 实现了 Vim 的键位绑定。在 Emacs中也能使用 Vim 中独特的 insert modevisual mode 了。

Spacemacs 的默认风格是 Vim,同时也提供了 Emacs 和 Hybrid 适用不同的人。

安装 Spacemacs 只需要:

$ mv ~/.emacs.d ~/.emacs.d.old
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d

在 Windows 下的话,不仅要将 Spacemacs 的 .emacs 放在 C:\Users\{username}\ 同时也要在 C:\Users\{username}\AppData\Roaming 里。此外,还有可能出现 packages unavailable 的情况,此时可以参考一下官方的 FAQ

无论是什么 Editor/IDE,装好的第一步应该都是修改字体吧。Spacemacs 的默认等宽字体是 Abode 的 Source Code Pro,这曾经是我也是我的首选,不过我现在喜欢用带连字(ligatures)的 Fira Code

Spacemacs 的配置文件在 ~/.spacemacs,打开后找到 dotspacemacs-default-font修改成:

dotspacemacs-default-font '("Fira Code"
                            :size 21
                            :weight normal
                            :width normal
                            :powerline-scale 1.4)

其中字体大小,宽度等参数见个人喜好,你可以在这里看到各个参数的含义。

英文的等宽字体配置完后,还可以选择性地配置其他的语言,例如中文(这里需要先判断一下是不是 GUI):

;; Set Chinese Font
;; Put this inside `dotspacemacs/user-config()`
(if window-system
    (dolist (charset '(kana han cjk-misc bopomofo))
      (set-fontset-font (frame-parameter nil 'font)
                        charset (font-spec :family "Noto Sans SC" :size 20))))

如果不配置中文字体的话,在打开带有中文字符的文件时,Emacs 会出现严重的卡顿。:(

Org-mode & LaTeX

Org-mode 是 Emacs 中的一种编辑模式,支持编写 To-do list、日志和笔记等功能。其中(对于我来说)最重要的就是支持内嵌 LaTeX 了。Org-mode 从Emacs 22 开始就已经成为默认安装的部分了,所以不需要额外的安装操作,只需要打开带有 .org 的文件,就会自动进入 Org-mode 了。

不过想要有 LaTeX 的预览/导出的话,还需要安装 texlive。openSUSE 下依旧是在 root 环境下运行:

$ zypper in texlive

#archliux-cn 的 farseerfc 前辈提示我可以用 texlive 的 Unix Installer,方便管理各个版本的 texlive,不过我还未尝试过。

其他的系统也可以使用包管理器安装或者请参照一下官方文档

Org-mode 内嵌 LaTeX 有几种方式,display 我喜欢用 \[E=mc^2\],inline 我偏好 $E=mc^2$。预览时只需要用 C-c C-x C-l (org-toggle-latex-fragment) 即可。

默认的预览有点小,所以我在 .spacemacs 里拉伸了一下大小:

;; Enlarge LaTeX Fragment in Org-mode
;; Put this inside `dotspacemacs/user-config`
(require 'org)
(plist-put org-format-latex-options :scale 2)

CDLaTeX

到这里看来 Emacs + Org-mode 的组合相比 Markdown 似乎没有给输入太大的便利吧。所以接下来要介绍的就是 Emacs 的另外一个 mode 了,这个 mode 可以大大提高在 Org-mode 中输入 LaTeX 的效率 ——CDLaTeX

在介绍 CDLaTeX 的工作原理之前,先说一下 Emacs 中的 mode:Org-mode 和 CDLaTeX虽然同是 Emacs 的 mode,但是地位不同的。Org-mode 是 Major Mode(主要模块);CDLaTeX 是 Minor Mode(辅助模块)。一般来说 Emacs 是不能同时使用多个 Major Mode。

如果想在 Emacs 的 buffer 中开多个 Major Mode,参见:MultipleModes

所以 CDLaTeX 作用其实是实现了部分来自另外一个 Major Mode ——AUCTeX 的功能,让你可以在其他的 Major Mode 里快速输入 LaTeX。

相比直接在 Org-mode 里使用 CDLaTeX,Org-mode 推荐使用 Org-mode 自带的轻量版的 org-cdlatex-mode

org-cdlatex-mode 依赖 cdlatex.eltexmathp.el(这个来自 AUTeX,作用是判定目前光标所在位置是否在内嵌的 LaTeX 中)。所以我们需要在 .spacemacs 加入我们需要安装的 CDLaTeXAUTeX

dotspacemacs-additional-packages '(cdlatex auctex)

然后重启 Emacs,Spacemacs 会自动帮你安装好他们。

注意全部使用小写,而且不要用 M-x package-install 来安装,因为 Spacemacs 会在重启之后删掉他们……

再次打开 Org-mode,用 M-x org-cdlatex-mode 打开 CDLaTeX。然后你就可以体验的 CDLaTeX 带来的快速输入 LaTeX 的功能了:

  1. <TAB> 自动补全一些 LaTeX 模板,例如:fr => ~\frac{}{}lr( => \left(\right)。此外,<TAB> 也可以用于在各个 {} 之间跳跃;

  2. _^ 会自动补全 {},不过如果 {} 里只有一个元素的话,也会自动去掉;

  3. ` 后加一个字母可以快速输入一些 LaTeX 的符号,例如 `a => \alpha`b => \beta

  4. 在一些字母之后加上 ' 则是可以修改该字母的字体或者加修饰,例如 a'. => \dot{a}a'1 => {\displaystyle a}

' 的补全
' 的补全

` 的补全
` 的补全

后语

经过上述配置和折腾之后,整理笔记终于成了一件不那么麻烦的事了。:)

一直有人问我为什么那么费劲的在各种标记语言里嵌套 LaTeX,而不直接用 LaTeX 写呢?嗯…其实我一直有一个想法就是建立一个属于自己的类似知识库的东西,所以我的期望是可以导出成 HTML 以便于时刻可以浏览,而 LaTeX 在这方面就比较吃力了。

不过使用了 Org-mode 之后也有一个问题:目前似乎没有现成的基于 Org-mode 的 Wiki Software,所以这意味着我可能又需要自己造个轮子了……:(