vim+latex(1.00)
vim operator
vim configure information
vim translate
Vim LaTeX 完整配置指南 (Fedora 44)
环境: Fedora 44 / Vim 9.2 / Python 3.14 / Zathura 0.5.14 / TeX Live 2026
最后更新: 2026-04-22
目录
1. 系统依赖安装
TeX Live (LaTeX 编译器)
# 最小安装 — 只有 pdflatex/xelatex/lualatex 基础功能
sudo dnf install texlive-scheme-basic
# 推荐安装 — 包含常用宏包 (booktabs, hyperref, listings, beamer 等)
sudo dnf install texlive-scheme-basic texlive-collection-latexrecommended
# 中文支持 (如果需要写中文论文)
sudo dnf install texlive-collection-langchinese
# 检查安装
which pdflatex xelatex lualatex latexmk
Zathura (PDF 阅读器)
# Zathura — 轻量级 PDF 阅读器,支持 VimTeX 正向/反向搜索
sudo dnf install zathura zathura-pdf-poppler
Python (UltiSnips 的 Python snippet 需要)
# Fedora 44 默认自带 Python 3
python3 --version # 3.14.3
2. Vim 插件安装
在 ~/.vimrc 的 call plug#begin('~/.vim/plugged') 和 call plug#end() 之间添加:
" LaTeX 编辑核心插件
Plug 'lervag/vimtex' " LaTeX 全套支持:编译、补全、正向/反向搜索、语法检查
" LaTeX 数学符号隐藏显示 (让公式看起来更清爽)
Plug 'KeitaNakamura/tex-conceal.vim'
" 代码片段引擎 — 快速展开模板和常用结构
Plug 'sirver/ultisnips'
" 代码片段补全源 (可选,提供 LaTeX 默认 snippets)
Plug 'honza/vim-snippets'
安装命令:
# 打开 Vim 后执行
:PlugInstall
插件说明
| 插件 | 作用 |
|---|---|
| vimtex | LaTeX 编辑的瑞士军刀:编译、错误跳转、目录、补全、参考文献管理 |
| tex-conceal.vim | 把 \alpha 隐藏显示为 α,\rightarrow 显示为 →,纯视觉美化 |
| ultisnips | 代码片段引擎,输入缩写后按快捷键展开为完整代码 |
| vim-snippets (可选) | UltiSnips 的默认 snippet 库,包含 LaTeX 常用片段 |
3. .vimrc 配置详解
以下是与 LaTeX 相关的完整配置,添加到 ~/.vimrc 中:
" ===================== VimTeX =====================
" 指定 LaTeX 风格 (默认用 LaTeX,而非 Plain TeX)
let g:tex_flavor = 'latex'
" PDF 查看器 — 使用 Zathura
let g:vimtex_view_method = 'zathura'
" 关闭自动打开 quickfix 窗口 (编译错误列表)
" 如果想自动弹出错误列表,设为 1
let g:vimtex_quickfix_mode = 0
" 正向搜索: Vim 编译后自动跳转到 Zathura 对应位置
" 反向搜索: 在 Zathura 中双击/Ctrl+点击 跳回 Vim 对应行
" 需要配合 Zathura 的 synctex 支持
let g:vimtex_view_zathura_options = '-x "vim --remote-silent +%l %f"'
" VimTeX 项目根目录标记
" 在这些文件所在的目录向上搜索作为项目根
let g:vimtex_root_markers = ['.git', '.latexmkrc', 'main.tex']
" ===================== tex-conceal =====================
" 隐藏级别: 1 = 部分隐藏, 2 = 全部隐藏, 0 = 不隐藏
set conceallevel=1
" 控制哪些符号被隐藏显示:
" a = \alpha→α, b = \beta→β, d = \delta→δ,
" m = 数学符号, g = 希腊字母
let g:tex_conceal = 'abdmg'
" 隐藏后的背景色设为透明 (避免出现方块)
hi Conceal ctermbg=none
" ===================== UltiSnips =====================
" 展开 snippet 的触发键 — Ctrl+j
" 注意: 不要用 Tab,会和 coc.nvim 补全冲突
let g:UltiSnipsExpandTrigger = '<C-j>'
" snippet 内光标向前跳 (下一个占位符)
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
" snippet 内光标向后跳 (上一个占位符)
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'
" 展开后删除snippet触发词 (默认就是删除)
let g:UltiSnipsRemoveSnippetMarker = 1
" snippet 文件存放目录
" 默认就是 ~/.vim/UltiSnips/,不需要改
" UltiSnips 会自动加载该目录下所有与 filetype 匹配的 .snippets 文件
" 例如打开 .tex 文件时自动加载: tex.snippets + latex.snippets
UltiSnips 与 coc.nvim 的 Tab 冲突解决
问题: coc.nvim 用 Tab 做补全,UltiSnips 也想用 Tab 展开 snippet,两者冲突。
解决: UltiSnips 改用 Ctrl-j / Ctrl-k,Tab 留给 coc。
" coc.nvim 的 Tab 映射 (保持不变)
inoremap <silent><expr> <TAB>
\ coc#pum#visible() ? coc#pum#next(1) :
\ CheckBackspace() ? "\<Tab>" :
\ coc#refresh()
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
" UltiSnips 用 Ctrl-j 展开/前进,Ctrl-k 后退
let g:UltiSnipsExpandTrigger = '<C-j>'
let g:UltiSnipsJumpForwardTrigger = '<C-j>'
let g:UltiSnipsJumpBackwardTrigger = '<C-k>'
4. UltiSnips 代码片段
文件结构
~/.vim/UltiSnips/
├── tex.snippets # 数学公式 snippet (分数、上下标、bra/ket、sympy)
├── latex.snippets # 文档结构 snippet (模板、章节、图表、列表)
└── markdown.snippets # Markdown 笔记 snippet
注意:
doc和rp模板默认包含todonotes宏包以支持todosnippet。
如果用 xelatex 编译,模板已移除inputenc(xelatex/lualatex 不需要也不兼容该宏包)。
tex.snippets — 数学公式
| 触发 | 展开结果 | 说明 |
|---|---|---|
mk |
$...$ |
行内公式 |
dm |
\[...\] |
行间公式 |
// |
\frac{}{} |
分数 |
sr |
^2 |
平方 |
cb |
^3 |
立方 |
td |
^{} |
自定义上标 |
bar |
\overline{} |
上划线 |
hat |
\hat{} |
帽子 |
X2 |
X_2 |
自动下标 (字母+数字) |
sympy...sympy |
计算结果 | sympy 实时求值 |
特殊功能:
- 输入
a2自动展开为a_2(正则匹配,任何字母+单个数字) - 输入
3a/5自动展开为\frac{3a}{5}(括号前的内容自动变分子) sympy块: 输入sympy integrate(x**2, x) sympy自动计算为 LaTeX
latex.snippets — 文档结构
| 触发 | 展开结果 | 说明 |
|---|---|---|
doc |
完整 article 模板 | 含 amsmath, graphicx, booktabs, hyperref, todonotes |
rp |
完整 report 模板 | 含目录, todonotes |
beamer |
完整 beamer 模板 | 16:9 比例 |
sec / ssec / sssec |
\section{} / \subsection{} / \subsubsection{} |
章节标题 |
para |
\paragraph{} |
段落标题 |
enum / item / desc |
列表环境 | 有序/无序/描述列表 |
ali / gat |
align* / gather* |
多行公式对齐 |
cases |
cases 环境 |
分段函数 |
mat |
矩阵环境 | 可选 p/b/B/v/V 前缀 |
fig |
figure 环境 | 含 \includegraphics |
tab |
table 环境 | 含 booktabs 三线表 |
code |
lstlisting 环境 | 代码清单 |
bf / it / ul |
\textbf{} / \textit{} / \underline{} |
常用格式 |
cite / ref / href |
引用/链接 | |
fn |
\footnote{} |
脚注 |
todo |
\todo[]{} |
待办标记 (需 todonotes 宏包) |
note |
居中框注 | \fbox{\parbox{...}{}} |
markdown.snippets — 笔记
| 触发 | 展开结果 | 说明 |
|---|---|---|
h1~h4 |
# ~ #### |
标题层级 |
b / i / s |
**bold** / *italic* / ~~strike~~ |
格式 |
code / codeblock |
`code` / 代码围栏 |
代码 |
link / img |
Markdown 链接/图片 | |
ul / ol / tl |
无序/有序/任务列表 | |
tbl |
Markdown 表格 | |
date |
2026-04-22 |
自动插入当天日期 |
datetime |
2026-04-22 14:30 |
自动插入日期时间 |
front |
YAML front matter | 含 title, date, tags |
note / tip / warn |
Obsidian 风格 callout | > [!note] |
Snippet 语法速查
" 基本格式
snippet 触发词 "描述" 选项
展开内容,$1 $2 是光标跳转点,$0 是最终位置
endsnippet
" 选项说明:
" b = 只在行首触发 (beginning of line)
" i = 不要求词边界 (in-word, 如 X2 中的 2)
" w = 要求词边界 (word boundary)
" A = 自动触发 (不需要额外确认)
" r = 正则触发
" Python 代码执行 (用 `!p 标记)
`!p snip.rv = "动态内容" `
" 占位符
$1 ${1:默认值} $0(最终光标位置)
5. 编译 LaTeX
方法一: VimTeX 内置编译 (推荐)
" 在 Vim 中,打开 .tex 文件后:
\ll " 编译当前文件 (默认用 latexmk)
\lv " 查看 PDF (启动/跳转到 Zathura)
\lk " 停止编译进程
\le " 查看错误
\lc " 清理辅助文件
" 或用 Leader 键:
<Leader>le " 查看错误 (如果 Leader 是空格,就是 空格+l+e)
方法二: 命令行编译
# pdflatex — 最常用的编译器
pdflatex main.tex
# latexmk — 自动处理多次编译 (目录、交叉引用、参考文献)
latexmk -pdf main.tex
# latexmk 持续模式 — 保存文件后自动重新编译
latexmk -pdf -pvc main.tex
# xelatex — 支持系统字体,适合中文
xelatex main.tex
# lualatex — 支持 Lua 脚本,最现代的编译器
lualatex main.tex
方法三: AsyncRun (你已安装的 asynctasks.vim + asyncrun.vim)
在项目根目录创建 .tasks 文件:
[project-build]
command=latexmk -pdf -interaction=nonstopmode main.tex
cwd=<root>
output=quickfix
[project-run]
command=zathura main.pdf &
cwd=<root>
然后在 Vim 中按 F7 编译,F8 查看。
latexmk 配置文件 (可选)
在 LaTeX 项目根目录创建 .latexmkrc:
# 使用 xelatex 编译 (适合中文)
$xelatex = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$pdf_mode = 5; # 5 = xelatex, 1 = pdflatex, 4 = lualatex
# 或者用 pdflatex
# $pdf_mode = 1;
# 持续编译模式
# $pvc_view_file = "zathura %O %S";
# 清理时保留的文件扩展名
# $clean_ext = "aux bbl blg fdb_latexmk fls fnav_log lof lot nav out snm synctex.gz toc";
编译中文 LaTeX
% 方法 1: xelatex + ctex (推荐)
\documentclass[12pt]{article}
\usepackage{ctex} % 自动检测系统中文字体
% 方法 2: 如果用 pdflatex,需要额外配置字体映射
% \usepackage{CJKutf8}
% \begin{CJK}{UTF8}{gbsn} ... \end{CJK}
编译命令:
xelatex main.tex
# 或
latexmk -xelatex main.tex
6. 查看 PDF
Zathura — 与 VimTeX 配合的最佳选择
# 安装
sudo dnf install zathura zathura-pdf-poppler
# 打开 PDF
zathura main.pdf
# 常用快捷键 (Zathura 内置 Vim 键位):
# J/K 上下翻页
# Ctrl+d/u 半页翻
# Space 下一页
# gg/G 首页/末页
# f 跟随链接
# Tab 显示目录
# / 搜索
# q 退出
正向搜索 (Vim → PDF)
在 Vim 中编译并跳转到 PDF 对应位置:
\lv " 编译 + 打开 PDF 并跳转到当前光标所在行
反向搜索 (PDF → Vim)
在 Zathura 中双击或按 Ctrl+左键,自动跳转到 Vim 中对应的 LaTeX 源码行。
前提条件:
- 编译时需要
synctex支持 (latexmk 默认开启) .vimrc中已配置vimtex_view_zathura_options
其他 PDF 阅读器
如果不想用 Zathura,VimTeX 也支持:
" Okular (KDE)
let g:vimtex_view_method = 'zathura' " 改为 'okular'
" Skim (macOS)
" let g:vimtex_view_method = 'skim'
" General (使用系统默认 PDF 阅读器)
" let g:vimtex_view_general_viewer = 'xdg-open'
7. VimTeX 常用命令
所有 VimTeX 命令都以 \ 开头(默认前缀),在 normal 模式下输入。
编译相关
| 命令 | 说明 |
|---|---|
\ll |
编译当前文件 |
\lv |
查看 PDF (启动阅读器并跳转) |
\lk |
停止编译 |
\le |
查看编译错误 |
\lg |
查看编译日志 |
\lc |
清理辅助文件 (.aux, .log 等) |
导航相关
| 命令 | 说明 |
|---|---|
\lt |
打开目录 (Table of Contents) |
\lq |
查看文献信息 |
\lr |
关联文献 (bib 文件) |
\lk |
停止编译 |
文本对象 (配合 vim-surround 使用)
| 文本对象 | 说明 |
|---|---|
cid |
内联数学 $...$ |
cd |
行间数学 \[...\] |
ce |
环境 \begin{env}...\end{env} |
cm |
命令 \command{} |
c$ |
数学公式 (同 cid) |
d$ |
删除数学公式 |
y$ |
复制数学公式 |
dae |
删除整个环境 |
补全 (配合 coc.nvim 或 VimTeX 内置补全)
" VimTeX 内置补全 (不依赖 coc)
" 在 insert 模式下:
" \begin{...} 之后自动弹出环境名补全
" \cite{ 之后弹出参考文献补全
" \ref{ 之后弹出标签补全
" Ctrl+x Ctrl+o 手动触发 omni 补全
自定义快捷键 (可选)
" 编译和查看
nmap <Leader>ll <Plug>(vimtex-compile)
nmap <Leader>lv <Plug>(vimtex-view)
" 目录
nmap <Leader>lt <Plug>(vimtex-toc-open)
" 快速插入常用环境
autocmd FileType tex nnoremap <buffer> <Leader>ie i\begin{env}<CR>\end{env}<Esc>O
autocmd FileType tex nnoremap <buffer> <Leader>if i\frac{}{}<Esc>i
autocmd FileType tex nnoremap <buffer> <Leader>im i\[
<CR>\]<Esc>O
8. 完整工作流示例
从零开始写一篇 LaTeX 文档
# 1. 创建项目目录
mkdir -p ~/latex/my-paper && cd ~/latex/my-paper
# 2. 创建 main.tex
vim main.tex
# 3. 在 Vim 中输入 doc 然后 Ctrl-j,展开为完整模板
# 填写标题、作者,开始写内容
# 4. 编译: 在 Vim 中按 \ll
# 5. 查看 PDF: 按 \lv (自动打开 Zathura 并跳转)
# 6. 继续编辑,保存,再次 \ll 编译
# 7. 或者用 latexmk 持续模式,保存即编译:
# 在终端运行: latexmk -pdf -pvc main.tex
日常编辑技巧
# 快速插入行内公式: mk + Ctrl-j → $...$
# 快速插入行间公式: dm + Ctrl-j → \[...\]
# 输入 3/5 自动展开为 \frac{3}{5}
# 输入 a2 自动展开为 a_2
# 输入 xbar 自动展开为 \overline{x}
# 输入 sec + Ctrl-j 插入 \section{}
# 输入 fig + Ctrl-j 插入 figure 环境模板
# 选中文字后用 vim-surround:
# cs$ → 把选中内容包在 $...$ 中
# csd → 把选中内容包在 \[...\] 中
Beamer 幻灯片
vim slides.tex
# 输入 beamer + Ctrl-j 展开模板
# 添加新的 frame:
\begin{frame}{标题}
内容
\end{frame}
# 编译: \ll
# 查看: \lv
9. 常见问题
Q: 编译报错 "File xxx.sty not found"
# 缺少宏包,搜索并安装:
dnf search texlive | grep 宏包名
sudo dnf install texlive-xxx
Q: 中文显示乱码或报错
# 确保用 xelatex 编译,并在文档中加 \usepackage{ctex}
xelatex main.tex
# 如果还报错,安装中文支持:
sudo dnf install texlive-collection-langchinese
Q: VimTeX 编译后 Zathura 没有打开
# 检查 synctex 是否启用 (编译输出中找 synctex)
latexmk -pdf -synctex=1 main.tex
# 检查 Zathura 是否安装:
which zathura
Q: UltiSnips snippet 不生效
# 1. 确认 UltiSnips 已安装: 在 Vim 中 :echo exists('g:loaded_ultisnips')
# 2. 确认 snippet 文件位置: ~/.vim/UltiSnips/
# 3. 确认文件名与 filetype 匹配: .tex 文件 → tex.snippets / latex.snippets
# 4. 确认触发键: Ctrl-j 而不是 Tab
# 5. 查看 snippet 定义: 在 Vim 中 :UltiSnipsEdit
Q: coc.nvim 和 UltiSnips Tab 冲突
" 已解决: UltiSnips 用 Ctrl-j,coc 用 Tab
" 如果 Ctrl-j 被其他插件占用,可以在 .vimrc 中检查:
" :verbose imap <C-j>
Q: tex-conceal 不生效
" 确认 conceallevel > 0
set conceallevel=1
" 确认 g:tex_conceal 已设置
let g:tex_conceal = 'abdmg'
" 注意: conceal 只影响显示,不影响实际内容和编译
Q: latexmk 编译很慢
# 用持续模式,首次编译后增量编译会很快
latexmk -pdf -pvc main.tex
# 或只编译当前章节 (需要子文件结构)
# \input{chapter1}
文件清单
~/.vimrc # Vim 配置文件
~/.vim/plugged/vimtex/ # VimTeX 插件
~/.vim/plugged/tex-conceal.vim/ # 符号隐藏插件
~/.vim/plugged/ultisnips/ # UltiSnips 引擎
~/.vim/plugged/vim-snippets/ # 默认 snippet 库 (可选)
~/.vim/UltiSnips/tex.snippets # 数学公式 snippet
~/.vim/UltiSnips/latex.snippets # 文档结构 snippet
~/.vim/UltiSnips/markdown.snippets # Markdown 笔记 snippet

浙公网安备 33010602011771号