本期我们开始介绍 Emacs 的 cdlatex 插件。今天我们将讲解如何使用 cdlatex 快速插入数学字母, 符号和字体, 以及如何自定义新的快捷键.
【资料图】
Table of Contents
AucTeX 和 cdlatex 基本设置
数学符号输入
插入希腊字母
数学符号
第二和第三层目录
如何插入 LaTeX 左双引号 ``
自定义数学符号快捷键
打开设置界面
设置实例
保存与加载设置
怎么选择快捷键
数学字体修饰
数学字体
其它修饰
嵌套修饰
自定义字体修饰
customize-variable 设置保存位置
总结
AucTeX 和 cdlatex 基本设置
Emacs 中的 LaTeX 编辑主要是依赖 AucTeX 和 cdlatex 这两个插件. AucTeX 提供了编辑 LaTeX 的基本功能, 而 cdlatex 主要提供了大量简化和易设置的输入方式. 为了安装并在 LaTeX 编辑时启用这两个插件, 我们需要在 init.el 中加入代码:
使用 straight.el 的用户需要根据注释内容适当调整. 在 (use-package cdlatex ...) 中我们指定了 :after tex, 是为了保证 cdlatex 在 auctex 之后加载. 把 cdlatex 代码块置于 auctex 之后也实现了相同效果; 而加了这一行后, 代码块次序可以随意调整.
LaTeX-mode-hook 是我们打开 LaTeX 文件时需要加载的设置, 这里我们定义了一个新的函数 my/latex-hook (名字可随意), 这样方便我们日后加入更多的功能. 函数的第一行 (turn-on-cdlatex) 就是打开 tex 文件时加载 cdlatex 的命令.
成功设置后, 当我们打开 tex 文件时, 大家应当可以看到模式栏中的 LaTeX/P 和 CDL, 就表示加载了 AucTeX 和 cdlatex. 通过 C-h m (m 表示 mode) 可以查看当前加载的所有主要模式和次要模式.
数学符号输入
这里的数学符号也包括各种非拉丁字母如 \alpha, \aleph 等. 输入方法是用反引号 (Tab 上方) 加另一个键组成的快捷键输入.
插入希腊字母
希腊字母可以用 ` + 对应拉丁字母插入, 包括大小写. 例如
` + a: \alpha
` + b: \beta
` + g: \gamma
` + G: \Gamma
` + S: \Sigma
如果你不熟悉希腊字母对应的拉丁字母, 没有关系, 只要在按下 ` 后稍稍停顿, 就会弹出一个提示界面.大家刚开始使用时可以多查看这个提示界面.
数学符号
大家在提示界面可以看到, 除了希腊字母以外, 我们还可以用同样的方法快速插入数学符号. cdlatex 预置了很多好记的默认设置. 例如, ` + 8 插入 \infty, 因为数字8放平就是无穷, 又如, ` + * 插入 \times 乘号, ` + + 插入 \cup (并集), ` + > 插入 \rightarrow (右箭头) 等.
第二和第三层目录
cdlatex 中连续按下两次反引号 ` 可以打开第二层目录. 第二层通常用于希腊字母的变体, 如
`e 插入 \epsilon, ``e 插入 \varepsilon
`r 插入 \rho, ``r 插入 \varrho
又或者是一些类似的符号, 如
`> 插入 \rightarrow, ``> 插入 \longrightarrow
或者是多个符号最直观的快捷键相同, 但是频率最高的放在第一层, 频率低的放在第二层, 如
`d 插入 \delta, ``d 插入 \partial (求偏导符号)
这个目录还有第3层, 这里绑定的快捷键就更少了. 默认的是一些数学函数的符号, 如 \sin, \exp 等
如何插入 LaTeX 左双引号 ``
反引号在 LaTeX 中写作几乎不会用到, 除了用于左双引号 (LaTeX 的右双引号是 `''` ). 这很好解决: 在 AucTeX 默认设置下, 第一个输入的双引号 <kbd>"</kbd> 会自动转换成为 <kbd> 插入, 第二个输入的双引号 " 会转换为 '' . 例如, "word" 将插入 word'' ``.
当然, 你也可以把反引号修改成其它的键, 但是既然无须担心双引号输入的问题, 我觉得改的意义不大. 反引号已经是很好的选择.
自定义数学符号快捷键
Emacs 的最大优势就是我们可以自由地设置. 前面反引号 ` 触发的快捷输入, 我们也可以添加自己需要的符号或调整已有的设置.
这里的所有设置保存在一个叫 cdlatex-math-symbol-alist 的变量中. 我们接下来讲解在 Emacs 如何设置一个变量, 保存设置以及加载设置. 这对其它的变量也是一样.
打开设置界面
虽然所有的变量设置都可以通过 init.el 里面的 (setq ...) 语句完成, 对于 cdlatex-math-symbol-alist 这种结构非常复杂的变量, 新手还是建议用 Emacs 自带的设置界面.
打开一个变量的设置界面主要有两种方式 (以 cdlatex-math-symbol-alist 为例)
通过 customize-variable 命令:M-x customize-variable RET M-x cdlatex-math-symbol-alist RET
从变量的帮助界面进入设置界面:C-h v cdlatex-math-symbol-alist RET 并点击 Customize
设置实例
我们想调换 `e 和 ``e 原本的快捷键设置, 即实现如下效果: `e 插入 \varepsilon, ``e 插入 \epsilon. (这么做的原因是 \varepsilon 更常用).
打开 cdlatex-math-symbol-alist 的设置界面
点击 INS 插入一个新条目
在 character 后输入 e
在 Repeat 后按 INS, 新插入的一行输入 \varepsilon
在 Repeat 后按 INS, 新插入的一行输入 \epsilon
这就完成了基本设置. 如果大家想绑定 ```e 和 ````e 等, 只需要再加入新的行以及你需要的 LaTeX 宏命令即可.
这里因为 `e 已经在 cdlatex 的默认设置中, 所以我们是覆盖了原有设置. 你可以在一开始的按下 ` 的提示界面中看到默认设置, 或者通过查看变量 cdlatex-math-symbol-alist-default.
保存与加载设置
设置完毕我们会点击 Apply and Save.
Apply: 改变了当前 cdlatex-math-symbol-alist 的値, 重启 Emacs 后失效
Save: 保存设置, 重启后仍生效.
但是已经打开的 tex 文件是看不到更新的设置的. 想要重新加载 cdlatex 的设置. 这有3种方法:
重启 Emacs
一个是打开新的 tex 文件
在原来的 .tex 文件缓冲区, 按下 C-c C-n.
第三种方法可以刷新 LaTeX 模式设置, 也适用于其它与 cdlatex 的设置. 此时, 大家按下反引号 ` 就可以看到更新后的列表了.
怎么选择快捷键
原则上这个机制可以插入任意的数学表达式, 如 \stackrel{\mathrm{a.s.}}{=}=, 但是建议只绑定原子化的数学符号. 复杂的表达式更适合用 cdlatex 的命令补全功能.
快捷键要易记, 直观, 凭你的第一感觉就能找到. 否则不能提高输入速度. 大家也可以查看默认的设置寻找灵感. 反例就是把左箭头 \leftarrow 绑到 `> 上.
如果一个键上绑定了多层快捷键, 要考虑不同命令使用的频率, 把最常用的放在第一层, 次常用的放在第二层, 依此类推. 像上面的 \epsilon 和 \varepsilon 的例子.
你也可以绑定自己定义的宏命令. 例如, 我的 `e 绑定的是 \eps, 而在我的 LaTeX 文档引言区中会定义 \newcommand{\eps}{\varepsilon}. 这样的好处可以提高代码的可读性, 方便交流. 毕竟你的导师, 你的合作者未必用 Emacs, 长长的 \varepsilon 会让人眼花. 但是我输入时想到的是希腊字母 epsilon 就应该用 `e 输入.
这里有很大的发挥空间, 因为第二层和第三层基本都是空的, 每个键还分大小写, 可以自由设置100多个快捷键. 所以尽情发挥吧.
数学字体修饰
数学字体
cdlatex 还可以快速插入不同的数学字体, 像 \mathrm{}, \mathbf{} 等等.例如, 我们常常用粗体 R 表示实数域, 也就是 \mathbf{R}. 我们可以按3个键完成输入: R + ' + b
R: 输入字母 R
' (单引号): 打开数学字体列表. 作用相当于前面的 `
b: 在字母 R 外面插入表示粗体的 LaTeX 宏命令 \mathbf{}
按单引号 ' 默认会改变前一个字母的字体, 也包括希腊字母, 但只是前面一个字母. 例:
`a'b 插入 \mathbf{\alpha}
ab'b 插入 a\mathbf{b}.
如果需要改变多个字母的字体可以先选择字体, 再输入文本. 这就是第二种方法. 但是输入单引号时前面要是空格或者 $, { 这种功能性字符. 例:
$'babc 插入 $\mathbf{abc}$.
$a'bc 插入 $\mathbf{a}c$.
可以用于改变多个字符的字体.
其它修饰
这种插入方式也可以推广到一切 LaTeX 宏命令 + 一对花括号内一段文本的结构. 除了像 \mathbf{}, \mathrm{} 这种数学字体, 还可以输入
数学公式中对字母的其它修饰, 如
这里默认的快捷捷非常直观, 大家也可以按下单引号 ' 稍等以查看提示界面.
'> 插入 \vec{}
'^ 插入 \hat{}
'- 插入 \bar{}
非数学公式中的文本字体, 如
'b 插入 \textbf{}
'i 插入 \textit{}
这里同样的 'b, 用在数学公式内就是 \mathbf{}, 用在文本中就是 \textbf{}. cdlatex 会自动检测当前环境是否为数学环境.
嵌套修饰
触发字体修饰的第三种方法是选先高亮选中一段文本, 再选择修饰. 例如, 选中数学环境外的 blabla, 然后按 'b, 则 blabla 会变成 \textbf{blabla}. 如果 blabla 在数学环境内, 则变成 \mathbf{blabla}
第一种方法只能修饰一个字母, 所以嵌套修饰只能使用第二种或第三种方法. 例:
'-'bR 插入 \bar{\mathbf{R}}.
R'b 插入 \mathbf{R}, 然后高亮选中按下 '-, 变成 \bar{\mathbf{R}}
自定义字体修饰
这里需要设置的变量是 cdlatex-math-modify-alist. 打开设置界面的方法和前面一样, 输入M-x customize-variable RET cdlatex-math-modify-alist RET
现在我们举一个例子. 假设我们想用 't 在数学公式中插入空心粗体 \mathbb{}. 操作如下
打开 cdlatex-math-modify-alist 设置界面
点击 INS 新建一个条目
第一行 character 输入 t
第二行: \mathbb
第三行: 保持空白, 因为文本模式下没有空心粗体, 或者输入 \text, 这是 cdlatex 的默认设置.
第四行: Type 改成 command. 两种方式几乎等价但是 command 现在更常用.
第五, 第六行: 不变
我们修改完之后, 按 Apply and Save 保存, 然后在 tex 文件缓冲区中用 C-c C-n 刷新设置, 这样我们在数学环境中按下 ' 就能插入空心粗体 \mathbb{} 了.
customize-variable 设置保存位置
我们的 init.el 设置里面有这样两行:
这样 Emacs 会把通过 customize-variable 设置的变量保存在我们自定义的 custom.el 的文件中. 内容大概像这样:
这里包含了我们前面对 cdlatex-math-modify-alist 和 cdlatex-math-symbol-alist 的设置.
如果没有特别的设置, customize-variable 设置的变量默认会由 Emacs 保存到 init.el 文件的最后. 我们的设置可以区分自己的设置和 Emacs 保存的设置.
当然, 你也可以手动把 custom-set-variables 中的内容用 (setq ...) 语句写在你的 init.el 当中, 尤其可以放在相应插件的 use-package 代码块中. 这样的好处是方便单独管理每个插件的设置, 并且利用 use-package 的延迟加载功能加快打开 Emacs 的时间. 当我们的 cdlatex 设置很长的时候, 这样做可以把 Emacs 的启动时间从10多秒减少到1秒以下. 大家可以在熟悉了 Emacs 的设置后再做尝试, 新手不推荐这么做.
总结
Emacs 中的 cdlatex 插件利用反引号 ` 和单引号 ' 开始的快捷键可以快速插入数学字母, 符号和字体. 我们可以通过设置 cdlatex-math-symbol-alist 和 cdlatex-math-modify-alist 这两个变量修改和增加自己喜欢的快捷键.
在下期视频中我们将介绍 cdlatex 中 Tab 的命令/模板补全功能. 它可以帮助我们输入一些更复杂的宏命令, 或者插入环境模板等等.