nvim 和 latex 的配合工作

通过配置获得非常舒服的 latex 编写体验。

主要做的是编译支持,还有实现一堆简写。毕竟 latex 很长。

准备工作:

软件:apt 安装 texlive, zathura

插件:nvim 中安装 vimtex, ultisnips

编译支持

采用 latexmk 进行编译,这里面可以非常灵活的加很多参数,比如其中一个厉害的功能就是可以在源文件更新的时候自动编译更新 pdf

采用 zathura 阅读 pdf

我设置的编译参数是: -xelatex -output-directory=tex-build -synctex=1 -file-line-error -interaction=nonstopmode -pvc

其中这个 -pvc 参数就负责自动检测变化并更新 pdf,所以这个进程是会后台一直运行的

同时,在 ~/.latexmkrc 中,对 latexmk 进行设置:

1
2
$pdf_mode=5;
$pdf_previewer="zathura --fork %O %S";

主要就是告诉 latexmk,用 zathura 查看 pdf

一堆简写:ultisnips

参考的文献,主要负责的是这个部分

ultisnips 中的 snip,放在 nvim 根目录下的 snip/ 目录里,负责 latex 文档的是 snip/tex.snippets

语法大概是:

1
2
3
snippet "触发字符串" "描述(可以没有)" 模式
变成的具体内容
endsnippet

其中,这个 “模式” 有:

  • i: “in-word”: 所有地方都触发
  • b: “beginning”: 只有行的开头触发
  • A: “automatic”: 自动触发
  • 等等

不是自动触发的话,需要按键进行手动触发,这个键位在 ultisnips 的配置里面设置

一个案例如下:

1
2
3
snippet "bar" "bar" riA
\barr{$1}$0
endsnippet

其中,这个 $1, $0 是占位符,就是触发了之后光标会跳到这个地方,输入完内容后可以按键跳转到下一个占位符
特殊的,$0 是最后一个占位符

跳转前一个/后一个占位符的键也可以设置

不但如此,这玩意还支持:调用python脚本处理,使用正则表达式匹配,等等

以至于它可以实现非常多牛逼的功能,比如一些后置的检测:输入 abar 变成 \bar{a},输入 a1 变成 a_1

完整的 tex.snippets我的 nvim 配置

键位设置

  • 手动触发:shift+tab
  • 下一个占位符:ctrl+j
  • 上一个占位符:ctrl+k

更多扩展:自己写的终端小应用

灵感来源

我希望做的是,按下 F8 自动调用那一堆 latexmk 编译

把它写在 vim 的配置文件里,实在是比较臃肿,太长了。而且我其实还想干更多事情。

于是!我写了一个终端应用,来做这件事情:叫做 fuck-tex

实现了最基本的编译功能后,我意识到我都这么干了我完全可以让它做更多事情

于是我加入了一个,预处理文本的功能,类似 C 编译时的 preprocessor

具体介绍

用法是这样的:fuck-tex file.tex [task]

其中 task 可以是:

  • proc 代表预处理文本 (process)
  • comp 代表编译 (compile)
  • copy 代表把编译出的 pdf 文件复制到和源文件相同的目录里
  • 留空,代表把上述都做一遍

支持什么样的预处理呢?

一种是:自动检测某种环境,加上某些前后缀

比如发现 itemizeenumerate 里面每行都有一个 \item,手动打的话还挺难受的,有了预处理以后,写文档的时候直接不用写这个,预处理器会检测环境并自动加上

类似的还有 flalign*,每一行都会用一个 & ... &\\ 来保持左对齐,预处理器会自动加上这个

目前只有这一种,但很明显它具有很强的可扩展性

键位绑定

绑定 F7, F8, F9 代表预处理,编译,复制

参考

这篇

这篇

还有这篇