前言
我曾经试图将我的所有课笔记转换成 Markdown 文档以永久保存。我的笔记包含了大量的数学公式,所以需要在 Markdown 里内嵌 LaTeX。
LaTeX 是对著名排版系统 TeX 的二次开发,TeX 是公认的数学公式排版最好的系统。
但是,在 Markdown 里编辑 LaTeX 简直是噩梦:编辑器不提供 LaTeX 的补全。一个公式里可能有大量重复的 \alpha
、\sigama
和 \rightarrow
等符号,而它们全部需要我一个字母一个字母地输入。
此外,在 Markdown 中内嵌 LaTeX 大多是通过 MathJax 实现的,但是 MathJax 支持的宏十分有限:
所以在花费了大量时间将一本书的笔记录成 Markdown 之后,我放弃了。:)
后来在 #archlinux-cn
的 riaqn 安利下,我开始使用 Emacs 的 Org-mode 来作笔记。不得不说相比 Markdown,Org-mode 配合 Emacs 的生态,在各种体验上都上升了不止一个等级。
当然,一个编辑器想要达到最佳的输入效果,一番配置是少不了的。下面就是我的整个 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 mode
和 visual 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.el
和 texmathp.el
(这个来自 AUTeX
,作用是判定目前光标所在位置是否在内嵌的 LaTeX 中)。所以我们需要在 .spacemacs
加入我们需要安装的 CDLaTeX
和 AUTeX
:
dotspacemacs-additional-packages '(cdlatex auctex)
然后重启 Emacs,Spacemacs 会自动帮你安装好他们。
注意全部使用小写,而且不要用 M-x package-install
来安装,因为 Spacemacs 会在重启之后删掉他们……
再次打开 Org-mode,用 M-x org-cdlatex-mode
打开 CDLaTeX
。然后你就可以体验的 CDLaTeX
带来的快速输入 LaTeX 的功能了:
用
<TAB>
自动补全一些 LaTeX 模板,例如:fr => ~\frac{}{}
和lr( => \left(\right)
。此外,<TAB>
也可以用于在各个{}
之间跳跃;_
和^
会自动补全{}
,不过如果{}
里只有一个元素的话,也会自动去掉;在
`
后加一个字母可以快速输入一些 LaTeX 的符号,例如`a => \alpha
和`b => \beta
;在一些字母之后加上
'
则是可以修改该字母的字体或者加修饰,例如a'. => \dot{a}
和a'1 => {\displaystyle a}
。
后语
经过上述配置和折腾之后,整理笔记终于成了一件不那么麻烦的事了。:)
一直有人问我为什么那么费劲的在各种标记语言里嵌套 LaTeX,而不直接用 LaTeX 写呢?嗯…其实我一直有一个想法就是建立一个属于自己的类似知识库的东西,所以我的期望是可以导出成 HTML 以便于时刻可以浏览,而 LaTeX 在这方面就比较吃力了。
不过使用了 Org-mode 之后也有一个问题:目前似乎没有现成的基于 Org-mode 的 Wiki Software,所以这意味着我可能又需要自己造个轮子了……:(