使用 Vim 编写 Tex 文档

(欢迎大家去我的博客观看此文:https://www.mond.top/ubuntu/vim-and-latex/

在使用 Vscode 的 LaTex Workshop 编辑 LaTex 文档很长一段时间后,我发现了这篇文章:How I’m able to take notes in mathematics lectures using LaTeX and Vim。文章作者使用 Vim 和各种快捷操作令自己撰写 LaTex 文档的速度跟上了老师板书的速度。我作为一个菜鸡,瞬间想起了多年前我发现 Vim 编辑器时的那个阳光明媚的下午。自那以来,我断断续续地尝试过使用 Vim 来提高自己的工作效率,但实际的效果并不如意。究其根本,并非是 Vim 不好用,而是还没等到自己记住那些键位,熟悉各种快捷操作,就已经产生了畏难放弃的想法。回过头来想想,学习不能这样,还是要勇于跳出自己的舒适圈。怀着这样的想法,我又开始了这一次的尝试。

本次使用的编辑器不是 Vim,而是其衍生产品 neovim(下文简称作 nvim)。有着更加现代的设计,nvim 和 vim 的区别网上也有很详细的讨论,这里就不再赘述了。总而言之,接下来记录的配置过程均在 nvim 中完成。

🔑
值得一提的是,这次尝试就是奔着用 nvim 写 Tex 这个目的去的,至于用 nvim 来编写调试 Python、C 这些功能都没有进行专门的配置,所以这份配置用来编程并不好使。

基础配置

""""""""""""""""""""""""""""""""""""""""""""""""""""
"                    General                       "
""""""""""""""""""""""""""""""""""""""""""""""""""""

" 设置256色
if (empty($TMUX))
  if (has("nvim"))
    let $NVIM_TUI_ENABLE_TRUE_COLOR=1
  endif
  if (has("termguicolors"))
    set termguicolors
  endif
endif

set clipboard+=unnamedplus  " 剪贴板与系统共享

set number                  " 显示行号
set relativenumber          " 显示相对行号
set cursorline	            " 高亮当前行
set cursorcolumn            " 高亮当前列
set scrolloff=10            " 垂直滚动时,光标距离顶部/底部的位置

set autoread                " 打开文件监视,如果编辑中文件发生外部改变就进行提示
set noautowrite             " 移开焦点时不自动保存

set laststatus=2            " 是否显示状态栏。0 表示不显示,1 表示只在多窗口时显示,2 表示显示

set showmode                " 在底部显示,当前处于命令模式还是插入模式
set showcmd                 " 命令模式下,在底部显示,当前键入的指令

set mouse=a                 " 支持鼠标

set encoding=utf-8          " 使用 utf-8 编码
" 打开文件时会逐一尝试这些进行解码,要把更严格的解码方式放在前面
set fileencodings=ucs-bom,utf-8,gbk,gb2312,cp936,gb18030,big5,euc-jp,euc-kr,latin1	
scriptencoding utf-8

set autoindent              " 按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致
set tabstop=4               " 按下 Tab 键时,Vim 显示的空格数
set shiftwidth=4            " 按下>>(增加一级缩进)、<<或者==(取消全部缩进)时每一级的字符数
set smarttab                " 根据文件中其他地方的缩进空格数来确定一个tab是多少个空格
set expandtab               " 自动将 Tab 转为空格
set softtabstop=4           " Tab 转为多少个空格

set wrap                    " 自动折行
set linebreak               " 只有遇到指定的符号才自动折行
set showbreak=>>
" set textwidth=80            " 超过这个数字会自动换行
set colorcolumn=100         " 在这个地方画一条线

set ignorecase              " 搜索忽略大小写
set smartcase               " 只有一个大写字母的搜索词,将大小写敏感;其他情况都是大小写不敏感
set hlsearch                " 高亮显示匹配结果
set incsearch               " 输入搜索模式时,每输入一个字符,就自动跳到第一个匹配的结果
set showmatch               " 高亮匹配的括号

" 如果行尾有多余的空格(包括 Tab 键),该配置将让这些空格显示成可见的小方块。
set list
set listchars=tab:▸\ ,eol:\ ,trail:·,extends:↷,precedes:↶
set fillchars=vert:│,fold:·

set nofoldenable            " 代码不折叠
set foldmethod=syntax       " 按语法结构进行折叠
set foldlevelstart=2
" set conceallevel=1          " 自动隐藏字符

set nobackup                " 不创建备份
set nowritebackup
set undofile                " 保留撤销历史
" 保存当前会话时保存的内容,下次打开时会恢复。
set sessionoptions=buffers,curdir,folds,tabpages,winpos,winsize

" 命令模式下显示自动补全候选
set wildmenu
set wildmode=longest,full
set completeopt=menu,menuone    " 自动补全显示菜单

" use scriptencoding when multibyte char exists
scriptencoding utf-8

filetype plugin indent on
if !exists('g:syntax_on')
  syntax enable
endif

nvim 插件

用起插件,还是要有一个插件管理器,笔者使用的是 vim-plug。其安装方式为:

sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

安装完成后,打开 ~/.config/nvim/init.vim 来进行配置。安装插件时,将想要安装的插件放入如下结构之中:

call plug#begin('~/.config/nvim/plugged')
Plug 'author/plug-name'		" 这里就是单引号内就是要装的插件
call plug#end()

单引号的内容是 GitHub 上的仓库名,比如插件的 github 地址是 https://github.com/Yggdroot/indentLine,那么放在单引号里的内容就是 Yggdroot/indentLine。看下面装的插件就明白了。

修改配置文件后,重启 nvim,然后输入指令 :PlugInstall,即可完成插件的安装,然后就可以对插件进行配置。

我推荐的插件如下,大家可以点进项目的 GitHub 主页查看使用方法。

Tex 相关插件

要用 nvim 写 Tex 文档并成功编译,就需要 lervag/vimtex 插件的支持。下载完成后,做如下配置:

基础配置

设置 Tex 文档是 LaTeX 语法风格的文档:

let g:tex_flavor = 'latex'

设置不自动弹出报错窗口,可以通过 :copen 来手动打开:

let g:vimtex_quickfix_mode = 0

还有两行配置:

let g:tex_conceal='abdmg'
set conceallevel=1

这两行可以让文中的一些符号以一种更直观的方式显示出来,如下:

conceal 效果

设置编译器:

let g:vimtex_compiler_latexmk = {
            \ 'build_dir' : {-> 'out'},
            \ 'executable' : 'latexmk',
            \ 'options' : [
            \   '-xelatex',
            \   '-file-line-error',
            \   '-synctex=1',
            \   '-interaction=nonstopmode',
            \ ],
            \}

这里使用 latexmk 作为编译工具,并且设置了编译的选项,用 XeLatex 进行编译。第2行是设置编译产生的中间文件放在根目录下的 out 文件夹内,这样可以使目录看上去更加整洁干净。为了能够更好的编译中文,需要在 ~/.latexmkrc 文件中写入如下配置:

$pdf_mode=5;

表示我们是使用 XeLatex 进行编译。

设置退出时自动清理中间编译的文件:

augroup vimtex_config
  autocmd!
  autocmd User VimtexEventQuit call vimtex#compiler#clean(0)
augroup END

设置目录显示内容和显示宽度,并设置目录的自动刷新,设置后使用快捷键 \ +l+t 就可以打开目录。

let g:vimtex_toc_config = {
            \ 'name' : 'TOC',
            \ 'layers' : ['content', 'todo', 'include'],
            \ 'split_width' : 30,
            \ 'todo_sorted' : 0,
            \ 'show_help' : 1,
            \ 'show_numbers' : 1,
            \}
augroup VimTeX
  autocmd!
  autocmd BufWritePost *.tex call vimtex#toc#refresh()
augroup END

PDF 的预览和定位

设置预览 PDF 的工具是 Zathura 阅读器,在 Linux 系统下推荐这个阅读器:

let g:vimtex_view_general_viewer = 'zathura'
let g:vimtex_view_method = 'zathura'
let g:vimtex_compiler_progname = 'nvr'	" 这一行默认就是这个值,但如果编译出现问题,可以手动指定试一试。

安装上面的 nvr,也就是 neovim-remote,在系统终端运行:

pip3 install neovim-remote

注意要在你使用 nvim 的 python 环境下进行这个包的安装。

接下来配置 Zathura 阅读器,在其配置文件 ~/.config/zathura/zathurarc 下加入如下内容:

set synctex true
set synctex-editor-command "nvr --remote-silent %f -c %l"

这样就可以通过快捷键 \+l+v 来进行定位,而按住 Ctrl 的同时点击 PDF 的某个位置,即可反向定位至编辑器中的相应位置。

进阶配置

自定义代码片段

为了更好的自动补全,我们还需要提供贴合 Tex 的补全内容,而有人已经为我们总结好了,只需要用 :CocInstall coc-vimtex 指令安装专门为 vimtex 设计的 coc.nvim 插件即可。

接下来的内容是参考前文所说的那篇文章,为了让 Tex 文档的撰写更加便捷,更加贴合自身的使用习惯,我们可以设置自定义代码片段。这就要用到 SirVer/ultisnips 插件。该插件的使用方法可以参考这里:ultisnips-zh-doc

绘图

绘图可以采用大神写的一个工具:inkscape-figures。安装好这个工具后,在插入模式下输入图片标题,再点击 Ctrl+F 即可打开 inkscape 界面,绘图完毕后保存,图片就可以自动插入到文档中。其中自动插入的片段可以自定义,具体的使用还是参考上面的链接。

插入图片操作

自动保存

写 Tex 如果能实时预览那一定会好用不少。实际上 vimtex 插件在点击 \+l+l 按键后就会开始实时侦测文档的变化,当检测到变化后就会自动编译文档并生成新的 PDF。我们其实只要实现自动保存功能就好,使用如下配置可以在文本变化的时候自动保存:

autocmd TextChanged,TextChangedI <buffer> silent write

但就我个人而言,有时编辑文件并不想让其自动保存,这样在编辑出问题后还可以回退到最开始的文件。所以就设置为只有文件类型为 tex 时才自动保存。首先在配置文件中加入:

filetype plugin indent on

打开文件类型检测。然后在与配置文件相同的目录下,新建一个名为 ftplugin 的目录,目录下新建 tex.vim 的文件。将上面的配置语句放入该文件,则只对类型为 tex 的文件生效。

后记

我觉得使用 Vim 这件事,唯手熟尔,只有边练边学才有效果。我平时经常用 LaTeX 记笔记,刚好以此为途径,花了好些天把 vimtex 配好,希望使用一段时间后能熟悉 vim 的各种操作。

最近杂七杂八的事情搞得自己心烦意乱,想着静下心来学习的东西迟迟没有进展。时间过得太快,自己也把握不住,感觉是得好好整理整理心情再继续努力前进了。

Reference

  1. How I’m able to take notes in mathematics lectures using LaTeX and Vim | Gilles Castel
  2. How I draw figures for my mathematical lecture notes using Inkscape | Gilles Castel
  3. 使用 Neovim 和 vimtex 高效撰写 LaTeX 学术论文 | SpencerWoo | 少数派
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值