SOLOMON
ABOUT
LINK

Spacemacs 和 Org-mode 和 LaTeX

Jun 27, 2017 · #emacs · #latex · #org-mode

前言

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

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

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

mathjax doesn't support show macros

Markdown 中内嵌的 LaTeX 大多是通过 MathJax 实现的, 所以另外一个大问题就是有的宏用不了了

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


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

spacemacs + 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 && mv ~/.emacs ~/.emacs.old # backup
$ 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 修改成:

1  dotspacemacs-default-font '("Fira Code"
2                              :size 21
3                              :weight normal
4                              :width normal
5                              :powerline-scale 1.4)

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

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

1  ;; Set Chinese Font
2  ;; Put this inside `dotspacemacs/user-config()`
3  (if window-system
4          (dolist (charset '(kana han cjk-misc bopomofo))
5                  (set-fontset-font (frame-parameter nil 'font)
6                          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 X L 即可.

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

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

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. 自动补全一些 LaTeX 模板, 例如: fr => \frac{}{}, lr( => \left(\right). 此外,也可以用于在各个 {} 之间跳跃.

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

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

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

tab completions

<TAB> 的补全

backtick completions

`的补全

后语

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

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

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

Content licensed under CC-BY-SA-4.0.