Spacemacs 和 Org-mode 和 LaTeX

前言

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

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

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

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

MathJax 不支持很多 LaTeX 宏

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


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

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,所以这意味着我可能又需要自己造个轮子了……:(

Prev 基于 React 的 SEO 友好的博客
Next NgModule 的作用域