用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
选项对所有方程进行左对齐,并定义example
和solution
环境方便记例题和解答:
\documentclass[fleqn]{ctexart}
\usepackage{amsthm}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{tikz}
\newtheorem*{solution}{解}
\newtheorem{example}{例}[subsection]
\begin{document}
\maketitle
...
\end{document}
最后的效果如下:
成果:
对比手写版:
是不是看起来还不错?
使用感受
优点
- 格式内容分离,便于重新排版与整理
- 字体统一美观(自己手写的字实在是太丑了哇)
- 例题的自动编号很赞!
缺点
Vim原来就有两个常用的模式,输入法的使用又增加了一个模式。来回shift切换打断了编辑的流畅性,降低了效率。尤其是很多时候输入法还没切回英文就
jj
一下或者切片段,结果还要删掉,按shift,然后重新打,有的时候着实糟心。Snippets多固然增加了效率,但是也增加了记忆的负担。对于我这种新手来说,过多的snippets只是把打LaTeX的时间转换成回忆用哪个snippet比较好的时间,一下子增加太多snippets也会降低效率。
错字的存在。搜狗输入法对于偶尔的打错具有自动修正的功能,但是无论是谷歌拼音还是sunpinyin在这方面都不行,加上很多时候这些输入法的选词并不智能,一个个看过来选词其实也是非常耗费时间的。
还是错字,例如“已知”错打成“一直”,英文可以配置spell checker做实时的纠正,这在原文当中也有提到,但是中文目前在这方面还缺乏支持。我听说百度有这方面的接口,但是不知道对于数学笔记专业性这么强的语料效果怎么样。Vim插件我是肯定没找到。
笔记的结构比较松散,在笔记本上我们可以拿箭头划来划去,有旁注也可以轻松插入,但是这在LaTeX当中绝非易事。很多时候数学笔记的格式很容易让人陷入纠结,比如说我乱打的一段
设
又因为已知
...
这种格式要怎么排版呢?
- 是整个作为一个大的display style
math,中文文字作为
\text{}
镶嵌其中? - 还是一行一个display-style math?
- 还是有中文字的行用inline math,然后纯数学符号的行用display math?
- 要不要用
gather*
这种环境?
又比如说如下这段:
或
手写起来非常简单,但是LaTeX代码呢?
$\begin{cases} x=1 \\ y=2 \end{cases}$ 或 $\begin{cases} x=2 \\ y=1 \end{cases}$
一下子复杂了不少,更别说为了中间的“或”字需要输入法切换。这是snippets也难以挽救的低效。
- 是整个作为一个大的display style
math,中文文字作为
我还没有试过画图。但是这一定是一个天坑。
如果编译失败那几乎是当场去世(悲)
总结
就我个人体验而言,用LaTeX记笔记虽然能够达到非常高的排版质量,但是并没有传说中的那么高效(尤其是在使用中文的背景之下)。用LaTeX整理笔记自然是极好的,但是用LaTeX在课堂上实时记笔记绝对属于一大作死行为(更别说你也不知道老师收不收LaTeX记得笔记对不?)