我几个月前看到国外有人分享用 LaTeX 实时记 1700 页数学笔记的感受,当时就被惊艳到了,心生向往。这次因为疫情待在家里上在线课程,总算是给了我一个带电脑进课堂的机会。于是我也仿照原作者的做法尝试了用记 LaTeX 笔记,这篇文章就来写一写我配置环境时遇到的坑和使用感受。

系统选择

原文的作者采用的是 Ubuntu 发行版 + bspwm 作为桌面管理器,但是 bspwm 太小众,网上的资料很少。而且实测装在 Ubuntu 上默认的配置在视觉上不协调(还要自己去装一个像样的状态栏,总之就是太烦了)。相比之下 i3 作为另一个 Tiling Window Manager 比 bspwm 资料多多了,也比较适合我这种小白。权衡之下我选用 Manjaro + i3。在 Virtual Box 下安装。

配置镜像

这一步不是必须的,因为 Manjaro 的默认源在国内的速度也还可以接受(~400kBps)。但是换了交大的源之后可以到 10MBps:

sudo pacman -Syy
sudo pacman-mirrors -i -c China -m rank
sudo pacman -Syyu

然后编辑 /etc/pacman.conf 加上 ArchLinuxCN 的交大镜像:

[archlinuxcn]
SigLevel = Optional TrustedOnly
Server = https://mirrors.sjtug.sjtu.edu.cn/archlinux-cn/$arch

最后导入一下密钥环,镜像就配置完了:

sudo pacman -Syy && sudo pacman -S archlinuxcn-keyring

安装 Virtual Box GA

Manjaro 默认对于虚拟机的支持不是很好。我不选择在 VMWare 上装 Manjaro 的主要原因也是因为我没有找到 VMWare 下自动分辨率比较简单的解决方案。在 Virtual Box 下只要装 Virtual Box Guest Addition 就可以了,美滋滋。

先安装基本的编译套件:

sudo pacman -S gcc make

然后查看一下 Linux 内核版本:

uname -r

是 5.4,因此安装 5.4 的 headers:

sudo pacman -S linux54-headers

之后在 Virtual Box 菜单下插入 GA 的 iso 文件。我最初是手动挂载的(因为找不到 i3 里面怎么开文件管理器),就是 sudo blkid 看一下设备然后 mount(如果出现不支持 iso9660 直接重启)。后来意识到文件管理器的名字是 pcmanfm,再发现默认可以直接 mod + F3 打开文件管理器,于是就可以在上面直接操作了。cd 进去运行 autorun.sh 跑完重启。就发现可以自动适应外部分辨率以及共享剪贴板了,非常方便。

配置键位

默认 Manjaro 配置的 mod 键是 super,也就是 Win 键。但是实测 Win 键在虚拟机环境下会有小问题(例如 Win + L 总是会被 Windows 先拦截导致锁屏)。所以我到 ~/.i3/config 里面把 mod 键改成了 alt。我还把 i3 默认的 jkl: 键位改成了和 Vim 相一致的 hjkl 键位。

中文相关

Manjaro 默认的中文渲染很有问题(装系统的时候居然没有中文字体!)。因此需要手动配置中文的渲染。

我基本上是按照 Arch Wiki 上的 Android 类字体配置的。但是 Arch Wiki 上没有配置给终端用的等宽字体,需要个人发挥一下。我最喜欢的等宽字体是 Sarasa Gothic(因为有中文)(去除中文我现在最喜欢的是 Jetbrains Mono)。我发现 ArchLinuxCN 的源上已经有这款字体了,于是直接安装:

sudo pacman -S ttf-sarasa-gothic

然后修改 ~/.Xresources

URxvt.font: xft:Sarasa Term SC:size=12

重启一下就好了(其实不用重启,xrdb ~/.Xresources 也行?)

接着是输入法。我原来准备装搜狗的,但是搜狗因为各种奇奇怪怪的原因(比如说字体找不到,比如说默认装 fcitx 的时候没有 qt4 的支持需要额外安装)不能用,在各种坑之后我决定不用它改用 sunpinyin+cloud pinyin 的组合,试用下来也是相当令人满意的:

sudo pacman -S fcitx-im
sudo pacman -S fcitx-configtool
sudo pacman -S fcitx-sunpinyin fcitx-cloudpinyin

安装后在 ~/.xprofile 里面加上下列几行启用 fcitx

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
fcitx -d

最后一行是我自己加上的,因为似乎由于一些原因 fcitx 它开机不自启……

配置 TeX

终于可以开始进入正题了,首先安装 TeXLive:

sudo pacman -S texlive-most texlive-langchinese

接着安装 Vim Plug,在 ~/.vimrc 里面写入自动安装脚本(手动安装亦可)以及一些基本的配置:

set number
set tabstop=4
set softtabstop=4
set shiftwidth=4
set smartindent

syntax on

if empty(glob('~/.vim/autoload/plug.vim'))
    silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
        \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
    autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

接着安装所必要的 VimTeX 插件以及 UltiSnips 插件并进行相关的配置:

call plug#begin('~/.vim/plugged')

Plug 'lervag/vimtex'
let g:tex_flavor='latex'
let g:vimtex_view_method='zathura'
let g:vimtex_quickfix_mode=0
set conceallevel=1
let g:tex_conceal='abdmg'

Plug 'sirver/ultisnips'
let g:UltiSnipsExpandTrigger='<tab>'
let g:UltiSnipsJumpForwardTrigger='<tab>'
let g:UltiSnipsJumpBackwardTrigger='<s-tab>'
let g:UltiSnipsSnippetDirectories=['mysnippets']

call plug#end()

安装 Zathura 作为 PDF 阅读器:

sudo pacman -S zathura zathura-pdf-mupdf

我查到 Manjaro i3 终端默认的背景色是#222D31,因此在 ~/.config/zathura/zathurarc 里面写入

set default-bg "#222D31"
set recolor "true"
set recolor-lightcolor "#222D31"
set recolor-darkcolor "#FFFFFF"

这样 Zathura 打开白色的 pdf 文档的时候就会自动重新着色,完成了色调上的统一。

Vimtex 默认使用 latexmk 编译,latexmk 默认调用 pdflatex。因为要用中文我们希望它调用 xelatex,于是在 ~/.latexmkrc 里面加上

$pdf_mode = 1;
$pdflatex = 'xelatex --shell-escape %O %S';

现在随便打开一个 tex 文档,打出 \ll,预览就冒出来了,非常方便。

配置 Snippets

我基本上复制了作者原博客上的大部分 snippets 的定义。再加上了一些我觉得比较常用的:

snippet exm "example" bA
\begin{example}
$1
\end{example}
$0
endsnippet

snippet sln "solution" bA
\begin{solution}
$1
\end{solution}
$0
endsnippet

snippet -> "arrow" A
\Rightarrow
endsnippet

snippet sc "since" wA
\because
endsnippet

snippet tf "therefore" wA
\therefore
endsnippet

snippet tx "text" wA
\text{$1}$0
endsnippet

snippet par "()" wA
\left($1\right)$0
endsnippet

snippet pbk "[]" wA
\left[$1\right]$0
endsnippet

snippet pbr "{}" wA
\left\\{$1\right\\}$0
endsnippet

snippet pabs "||" wA
\left|$1\right|$0
endsnippet

snippet enum "enumerate" bwA
\begin{enumerate}
$1
\end{enumerate}
$0
endsnippet

snippet ml "multiline math" bwA
\begin{gather*}
$1
\end{gather*}
$0
endsnippet

笔记源文件的 preamable 定义如下,使用 fleqn 选项对所有方程进行左对齐,并定义 examplesolution 环境方便记例题和解答:

\documentclass[fleqn]{ctexart}

\usepackage{amsthm}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz}

\newtheorem*{solution}{解}
\newtheorem{example}{例}[subsection]

\begin{document}
    \maketitle
    ...
\end{document}

最后的效果如下:

3RRrp6.png

成果:

3Rojqf.png

对比手写版:

3Ro6PJ.jpg

是不是看起来还不错?

使用感受

优点

  • 格式内容分离,便于重新排版与整理
  • 字体统一美观(自己手写的字实在是太丑了哇)
  • 例题的自动编号很赞!

缺点

  • Vim 原来就有两个常用的模式,输入法的使用又增加了一个模式。来回 shift 切换打断了编辑的流畅性,降低了效率。尤其是很多时候输入法还没切回英文就 jj 一下或者切片段,结果还要删掉,按 shift,然后重新打,有的时候着实糟心。

  • Snippets 多固然增加了效率,但是也增加了记忆的负担。对于我这种新手来说,过多的 snippets 只是把打 LaTeX 的时间转换成回忆用哪个 snippet 比较好的时间,一下子增加太多 snippets 也会降低效率。

  • 错字的存在。搜狗输入法对于偶尔的打错具有自动修正的功能,但是无论是谷歌拼音还是 sunpinyin 在这方面都不行,加上很多时候这些输入法的选词并不智能,一个个看过来选词其实也是非常耗费时间的。

  • 还是错字,例如 “已知” 错打成 “一直”,英文可以配置 spell checker 做实时的纠正,这在原文当中也有提到,但是中文目前在这方面还缺乏支持。我听说百度有这方面的接口,但是不知道对于数学笔记专业性这么强的语料效果怎么样。Vim 插件我是肯定没找到。

  • 笔记的结构比较松散,在笔记本上我们可以拿箭头划来划去,有旁注也可以轻松插入,但是这在 LaTeX 当中绝非易事。很多时候数学笔记的格式很容易让人陷入纠结,比如说我乱打的一段

    \(y=kx+b,\quad (k\neq 0)\)

    \(\Rightarrow x=\frac{y-b}{k}\) 又因为已知 \(k=\tan \alpha\)

    这种格式要怎么排版呢?

    1. 是整个作为一个大的 display style math,中文文字作为 \text{} 镶嵌其中?
    2. 还是一行一个 display-style math?
    3. 还是有中文字的行用 inline math,然后纯数学符号的行用 display math?
    4. 要不要用 gather* 这种环境?

    又比如说如下这段:

    \(\begin{cases}x=1 \\y=2\end{cases}\)\(\begin{cases}x=2 \\y=1\end{cases}\)

    手写起来非常简单,但是 LaTeX 代码呢?

    $\begin{cases} x=1 \\ y=2 \end{cases}$
    
    $\begin{cases} x=2 \\ y=1 \end{cases}$

    一下子复杂了不少,更别说为了中间的 “或” 字需要输入法切换。这是 snippets 也难以挽救的低效。

  • 我还没有试过画图。但是这一定是一个天坑。

  • 如果编译失败那几乎是当场去世(悲)

总结

就我个人体验而言,用 LaTeX 记笔记虽然能够达到非常高的排版质量,但是并没有传说中的那么高效(尤其是在使用中文的背景之下)。用 LaTeX 整理笔记自然是极好的,但是用 LaTeX 在课堂上实时记笔记绝对属于一大作死行为(更别说你也不知道老师收不收 LaTeX 记得笔记对不?)