用LaTeX实时记数学笔记?!

我几个月前看到国外有人分享用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记得笔记对不?)