0 前言
小白近来读到这样一篇文章:How I’m able to take notes in mathematics lectures using LaTeX and Vim,这位学数学的小哥,通过使用vim和
LaTeX
\LaTeX{}
LATEX在整个本科学习期间,共记下了1700多页的数学公式笔记,惊为天人。——这简直就是小白梦中的自己。
对小白自己来说,想要系统地学习 LaTeX \LaTeX{} LATEX已经由来已久,而且也确实为此付出了一些努力:包括
- 购买并阅读了一些 LaTeX \LaTeX{} LATEX的入门书籍;
- 学习CTeX套装的一些基础使用方法(相较于后来的工具来说真的难用);
- 尝试学习并配置TeXLive、TeXStudio(可视化工具里它是目前小白所知最优)等工具;
- 尝试使用并学习OverLeaf在线编辑器;
- 在markdown编辑器内使用 LaTeX \LaTeX{} LATEX语法等。
不得不说,小白在学习 LaTeX \LaTeX{} LATEX的道路上的投入和产出不成正比。这可能有赖于本人学习上一贯的低效率,或者归咎于 LaTeX \LaTeX{} LATEX本身陡峭的学习曲线。在很长的一段时间里,小白已经接近放弃直接使用 LaTeX \LaTeX{} LATEX而转投于各种Markdown书写工具(例如小白正在使用的同样高效的Obsidian)。
这次终于有这么一个契机(最主要是成功了),在折腾了那么多知识点之后,尝试在Windows系统下使用gvim(即vim的Windows发行版)+ texlive + SumatraPDF + vim-plug + Ultisnips + vim-snippets + vimtex 配置如那位数学小哥类似的 LaTeX \LaTeX{} LATEX书写环境。
对于这个过程,小白觉得,确实,这种Geek级的配置,对于一般的初学者来说真的很不友好,小白也在这个过程中甚为痛苦。甚至于,本身来讲,vim这个工具在编程界也是颇受争议,非IDE党会对它爱不释手,而IDE党则对它嗤之以鼻。但是小白认为,使用vim和使用五笔输入法一样,这正是残存的极客(折腾)精神的体现。
在之前小白也提到,这里用到的工具有点多,而每一个工具其实都有非常具体的使用方法,小白本篇文章也只是将整个工具链路打通,对于其中诸多的自定义设置细节还甚为不熟悉,需要持续精进。在此特别说明:水平所限,如有错漏,敬请原谅。
1 TeXLive下载及安装
texlive是一个优秀的
LaTeX
\LaTeX{}
LATEX发行版,集成度比较高,相较于以前的CTeX套件友好了很多。
其内置了latexmk工具,可使用主流的
- pdflatex
- dvipdfex
- lualatex
- xelatex
等 LaTeX \LaTeX{} LATEX编译器。
官网地址
注意:小白觉得离线安装包比在线安装包要靠谱,原因无他,因为小白的网络太慢了。宁愿全部下载下来再安装,也不要使用在线安装包,等待它自己去连接网络下载。事实上,可能绝大多数国内网络都面临着这个问题,因为即使是官网也会根据你的网络地址将下载链接跳转到最近的国内镜像站去。
国内的镜像站挺多,小白这次跳转到阿里云上,下载最新的版本,如图版本是texlive2024,离线安装包大小为5.6GB。
texlive的安装没有什么特别的地方,直接各种下一步即可。这是 LaTeX \LaTeX{} LATEX的核心工具。
2 gvim下载安装及配置
下面来下载另一个重要工具:gvim
gvim的官网地址
小白这里下载的是x64的exe文件。
下载完成后安装,打开gvim
默认的主题及背景颜色很丑
所以我们需要对gvim进行个性化设置。配置文件名为_vimrc
, 默认安装在
C:\Program Files\Vim
文件夹下,如果你在安装时选择了安装位置,那么配置文件一般在安装目录中。
默认的配置文件存在一些内容,小白的这份如下:
" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim
" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
set diffexpr=MyDiff()
endif
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg1 = substitute(arg1, '!', '\!', 'g')
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg2 = substitute(arg2, '!', '\!', 'g')
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let arg3 = substitute(arg3, '!', '\!', 'g')
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
let cmd = substitute(cmd, '!', '\!', 'g')
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction
在以上内容后面添加:
" 去除欢迎界面,“帮助乌干达男孩”之类的
set shortmess=atI
" 打开行号
set nu
" 打开相对行号功能
set rnu
" 设置默认的字体为Consolas,大小为9
set guifont=Consolas:h9
" 光标遇到圆括号、方括号、大括号时,自动高亮对应的另一个圆括号、方括号和大括号
set showmatch
" 配色方案选择slate
colorscheme slate
" 语法使能
syntax enable
" 语法高亮
syntax on
" 按文件类型缩进打开
filetype indent on
" 按文件类型插件缩进打开
filetype plugin indent on
_vimrc
文件中参数的配置还有很多,对小白来说,暂时以上就足够了。
打开一个helloworld.cpp
文件
可以看到,配色已经更改了,代码的字体为9号的consolas;
左侧的行号已经显示出来(贴左为绝对行号),相对行号也显示出来,方便跳转。
如果想要学习与vim相关的更多内容,可以参看vimhelp
推荐一个好的vim插件排行网站https://vimawesome.com/
3 vim-plug插件安装及配置
vim强大的原因之一,就是它各种各样丰富的插件系统。
对此,我们采用vim-plug进行插件管理。需要说明的是,安装这个插件最好装一个git,有git才方便它执行自动安装等操作。
此插件在github上的地址为:vim-plug
该工具的安装配置过程非常简单,只需要下载plug.vim文件,并将其放置在用户目录的autoload
路径下,例如:本小白放置在C:\Users\Admin\vimfiles\autoload
目录下
然后只需要在_vimrc
文件中进行设置即可,设置的方式也很简单。
只需要用call plug#begin()
和call plug#end()
把需要的插件包围起来,像下面这样:
call plug#begin()
" 在此处列举你需要的插件
Plug 'XXXX/vim-pluginname'
call plug#end()
在gvim的normal模式下,可以用常用的命令:
:PlugInstall
安装插件:PlugUpdate
更新插件:PlugDiff
查看最新更新的差异:PlugClean
清除不在list中的插件
按照这个说法,打开gvim后,也不需要离线下载剩余的插件了,只需要配置:
call plug#begin()
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'lervag/vimtex'
call plug#end()
输入:PlugInstall
,打个响指,稍等片刻
然后就可以迎娶白富美、出任CEO,走上人生巅峰……
这是官方的表述,看上去确实很简单,but小白没成功,原因经过查询,似乎是因为github的网络连接不稳定,导致PlugInstall命令无法成功执行。
所以小白采用的是离线配置的方法,在接下来的配置中将会讲述。
4 ultisnips和vim-snippets插件安装及配置
这两个插件,都是为了让vim能够自动补全代码,提高输入效率的。也是数学小哥能用 LaTeX \LaTeX{} LATEX写课堂笔记的核心武器。需要注意的是在github上同名的插件数量有点多,需要认准以下二位的:
SirVer/ultisnips
honza/vim-snippets
先分别从两个仓库中把最新版本的插件下载下来:
将两个插件分别解压,放到gvim安装目录下:C:\Program Files\Vim\vim91\autoload
然后在_vimrc
配置文件中写入:
call plug#begin("C:\Program Files\Vim\vim91\autoload")
Plug 'C:\Program Files\Vim\vim91\autoload\ultisnips-3.2'
Plug 'C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0'
call plug#end()
" tab键唤醒自动片段
let g:UltiSnipsExpandTrigger="<tab>"
" ctrl+tab键唤醒自动片段列表
let g:UltiSnipsListSnippets="<c-tab>"
" tab键在自动片段选项中向后跳转
let g:UltiSnipsJumpForwardTrigger="<tab>"
" shift+tab键在自动片段选项中向前跳转
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" 片段文件的地址
let g:UltiSnipsSnippetDirectories=['C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips']
注意到,以上对vim-plug
的.vim
文件地址、ultisnips
、vim-snippets
的路径均进行了绝对地址设置。如果不这样设置,可能会引发错误。
此时如果新建一个.cpp
文件,在gvim中打开,如图,输入main,再按tab:
这就表明我们已经成功配置了片段联想插件。这样的话,就离数学小哥的飞速笔记又近了一步。
我们稍做一点探究:在C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips
目录下面,能看到对应很多种语言的.snippets
文件,这些文件即配置了在不同语言下联想片段的功能。
关于.snippets
文件的自定义撰写,需要另外学习,本文暂不考虑这些,先使用插件中自带的配置方式进行。小白后续使用过程中再去学习如何配置自己的片段联想文件。
5 vimtex插件安装及配置
前面铺垫了这么多,终于轮到
LaTeX
\LaTeX{}
LATEX插件。
官方下载地址如下:
/lervag/vimtex
这部分在配置文件中需要配置更多,小白也是从别的博客中摘抄下来的:
set shortmess=atI
set nu
set rnu
set guifont=Consolas:h9
set showmatch
colorscheme slate
syntax enable
syntax on
filetype indent on
filetype plugin indent on
call plug#begin("C:\Program Files\Vim\vim91\autoload")
Plug 'C:\Program Files\Vim\vim91\autoload\ultisnips-3.2'
Plug 'C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0'
Plug 'C:\Program Files\Vim\vim91\autoload\vimtex-2.15'
call plug#end()
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsSnippetDirectories=['C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips']
"LaTeX配置
let g:tex_flavor='latex'
let g:vimtex_texcount_custom_arg=' -ch -total'
"映射VimtexCountWords!\lw 在命令模式下enter此命令可统计中英文字符的个数
au FileType tex map <buffer> <silent> <leader>lw :VimtexCountWords! <CR><CR>
let g:Tex_ViewRule_pdf = 'E:\Latex\SumatraPDF\SumatraPDF.exe -reuse-instance -inverse-search "gvim -c \":RemoteOpen +\%l \%f\""'
"这里是LaTeX编译引擎的设置,这里默认LaTeX编译方式为-pdf(pdfLaTeX),
"vimtex提供了magic comments来为文件设置编译方式
"例如,我在tex文件开头输入 % !TEX program = xelatex 即指定-xelatex (xelatex)编译文件
let g:vimtex_compiler_latexmk_engines = {
\ '_' : '-pdf',
\ 'pdflatex' : '-pdf',
\ 'dvipdfex' : '-pdfdvi',
\ 'lualatex' : '-lualatex',
\ 'xelatex' : '-xelatex',
\ 'context (pdftex)' : '-pdf -pdflatex=texexec',
\ 'context (luatex)' : '-pdf -pdflatex=context',
\ 'context (xetex)' : '-pdf -pdflatex=''texexec --xtx''',
\}
"这里是设置latexmk工具的可选参数
let g:vimtex_compiler_latexmk = {
\ 'build_dir' : '',
\ 'callback' : 1,
\ 'continuous' : 1,
\ 'executable' : 'latexmk',
\ 'hooks' : [],
\ 'options' : [
\ '-verbose',
\ '-file-line-error',
\ '-shell-escape',
\ '-synctex=1',
\ '-interaction=nonstopmode',
\ ],
\}
" 阅读器相关的配置 包含正反向查找功能 仅供参考
let g:vimtex_view_general_viewer = 'C:\Users\Admin\AppData\Local\SumatraPDF\SumatraPDF.exe' "这里放置你的sumatrapdf 安装路径
let g:vimtex_view_general_options_latexmk = '-reuse-instance'
let g:vimtex_view_general_options
\ = ' -reuse-instance -forward-search @tex @line @pdf'
\ . ' -inverse-search "' . 'cmd /c start /min \"\" ' . exepath(v:progpath)
\ . ' -v --not-a-term -T dumb -c \"VimtexInverseSearch %l ''%f''\""' "for vim/gvim
"编译过程中忽略警告信息
let g:vimtex_quickfix_open_on_warning=0
let g:vimtex_quickfix_mode=0
set conceallevel=1
let g:tex_conceal='abdmg'
创建了一个texTest.tex文件:
% !TEX program = xelatex
\documentclass[]{ctexart}
\usepackage[utf8]{inputenc}
\usepackage{fontspec}
\setCJKmainfont{DingTalkJinBuTi-Regular.ttf}
\begin{document}
\title{Hello, World}
\author{ErDong XiaoBai}
\date{\today}
\maketitle
Hello, \LaTeX{} World!
你好,世界!
这世界真的很残酷,因为世界并不是按照人的意志来设计的。
所以我们更加要珍惜彼此,珍惜生活。
回归理性,这才是一种认真的生活态度。
$
A = \bigcap_{i\in I}A_i
\infty
$
\end{document}
在normal模式下输入\ll
即可编译该文档,如下所示。
注意到在配置文件中输入的最后两行,可以起到tex文件编辑过程中转换和隐形的作用:
set conceallevel=1
let g:tex_conceal='abdmg'
到这一步,小白已经算是初步搭建了gvim+vimtex的编译环境。但即使是数学小哥的那篇博客里,还针对个性化自定义做出了大量的修改,这些动作对于提高编辑速度均有很大作用,且通过自定义tex.snippets
文件可以拥有更大的灵活性。
这就留待后续的使用过程中进一步学习了。对于这篇文章只能暂时告一段落。
6 参考文献
- How I’m able to take notes in mathematics lectures using LaTeX and Vim
- vim的四个模式以及常用快捷键
- Vim 配置入门
- 让你的vim更加强大,vim-plug安装插件实战!
- vim配置之snippets代码块
- Vim+VimTeX:带给你飞一般的LaTeX编辑体验
- VimTeX+Vim:带你愉快地编辑LaTeX文件
- Vim Latex 的使用和配置技巧 (二)