使用 Neovim 和 VimTeX 撰写 LaTeX (Lua 配置)
本篇主要就是”折腾”, 就是玩儿,很有可能配置好后觉得还没有 Overleaf 好用.如果只是想尝试一下, 可以直接使用我的配置 我的 Nvim 配置, fork 自 ayamir 的 Nvim 配置
相关应用和插件的 详细信息 就不在这儿介绍了, 网上多得很, 文档也写得详细.
因为我不常用 Windows, 所以只有 Linux 下的配置.
需要的东西
默认使用 wbthomason/packer.nvim来进行 Neovim 的插件管理, 本篇关注于在此基础上的 $\LaTeX$ 配置, 而非如何搭建一个好用的 Neovim, 所以其他基础的东西不会列出.
名字 | 说明 |
---|---|
lervag/vimtex | 用于 Vim 和 Neovim 的 $\LaTeX$ 文件类型插件 |
mhinz/neovim-remote | 用于编辑器和 PDF 交互 |
TeXLive | TeX Live 提供 $\LaTeX$ 环境 |
KDE/okular | PDF 查看器 (当然选择其他支持VimTeX 反向检索的都可以) |
安装并配置 VimTex
配置因人而异, 可根据具体情况修改.
如果使用自己的配置, 在配置插件的 Lua 文件中加入下面的代码:
1 | use { |
如果使用了 ayamir 的配置, 那么应该修改两个文件. 在 lua/modules/editor/plugins/lua
中新增下面的代码:
1 | editor['lervag/vimtex'] = { |
在 lua/modules/editor/plugins/config.lua
中新增下面的代码:
1 | function config.vimtex() |
然后进入 Neovim, 执行命令 PackerInstall
安装 VimTeX
.
上面的配置指定了用于预览的 PDF 软件是 okular
, 那么在 Neovim 中执行 VimtexView
即可自动打开对应的 PDF 文件并定位到当前位置, 执行 VimtexCompile
会进入实时编译状态并打开对应 PDF.
配置反向检索
安装 neovim-remote
1 | pip3 install neovim-remote |
上一步仅仅实现了正向检索, 即从 tex 文件定位到 PDF 文件. 要实现反向检索, 需要在 Okular 设置->配置 Okular->编辑器
中设置自定义编辑器, 填入 nvr --remote-silent +%l %f
.
这样, 在 PDF 预览界面 Shift + LeftClick 即可定位到 tex 文件的对应行. 注意 Okular 必须是在 预览模式 才有效, 即鼠标指针为手的形状. 而在其他的 PDF 预览软件 (如 zathura )是 Ctrl + LeftClick
常用的命令
命令 | 作用 |
---|---|
VimtexCompile |
持续编译模式(实时监听文件变化并编译) |
VimtexClean |
清除编译时生成的中间文件 |
VimtexStop |
停止监听 |
VimtexView |
预览 PDF |
中文网络上现存 VimTex 命令的说明大都很奇怪, 说 \ll
是编译预览, \lk
是停止监听, \lv
是预览等等.
第一: 不是所有人都将 <leader>
设为 ‘\‘
第二: 如果更改过按键映射, 这几个按键将对 VimTeX 毫无作用
正常的做法不应该是告诉别人快捷键而应该是命令才对吧?
当然, 所有的命令均可以通过 :help vimtex
在 vimtex-commands
块下找到, 可以根据需要设置快捷键
[可选] 使用 snippet 和 lsp 补全
- 通过williamboman/nvim-lsp-installer 插件 安装
texlab
, 直接在 Neovim 内执行:LspInstall texlab
即可. 效果如下(这张图应该是在 vscode 里演示的):
通过
packer.nvim
安装
L3MON4D3/LuaSnip. 需要搭配 hrsh7th/nvim-cmp 使用LuaSnip 可以像下面这样填写配置:
1
2
3
4
5
6
7function config.luasnip()
require("luasnip").config.set_config {
history = true,
updateevents = "TextChanged,TextChangedI"
}
require("luasnip/loaders/from_vscode").load({paths={"./my_snippets"}})
endload()
可以装载自定义的 snippet, 注意相对路径是以init.lua
为基准的. my_snippets 文件夹中除了 snippet 的 json 文件, 还需要一个package.json
来指明每个 json 文件对应的语言是什么.举例的 tex.lua 如下:
1
2
3
4
5
6
7{
"Simple Snippet Example": {
"prefix": "text",
"body": "this is inserted as text",
"description": "descriptive description"
}
}package.json 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"name": "snippets",
"engines": {
"vscode": "^1.11.0"
},
"contributes": {
"snippets": [
{
"language": "tex",
"path": "./tex.json"
}
]
}
}整体的结构:
在 tex 文件中试一下:
更方便的做法是使用rafamadriz/friendly-snippets 这类现成的插件.
更更方便的做法是使用现成的配置 (开头提到的)
最方便的是不折腾这些, 使用在线的 Overleaf 或者不在线的 TexStudio.