配置vimtex使用xelatex后仍报错,编译器未生效如何解决?
问题还原
我给VimTeX配置了XeLaTeX编译,完整配置如下:
-- 开启文件类型检测、插件和缩进 vim.cmd('filetype plugin indent on') -- 开启语法高亮 vim.cmd('syntax enable') -- 配置VimTeX编译器 vim.g.vimtex_compiler_latexmk = { executable = 'latexmk', options = { '-xelatex', -- 指定用XeLaTeX '-file-line-error', '-synctex=1', '-interaction=nonstopmode', }, } -- 配置VimTeX预览器 vim.g.vimtex_view_method = 'skim' vim.g.vimtex_view_skim_sync = 1 vim.g.vimtex_view_skim_activate = 1 vim.g.maplocalleader = ','
但用本地leader键,,启动实时编译时,还是弹出fontspec的报错:
/usr/local/texlive/2023/texmf-dist/tex/latex/fontspec/fontspec.sty|45 error| Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX. You must change your typesetting engine to, e.g., "xelatex" or "lualatex" instead of "latex" or "pdflatex".
/usr/local/texlive/2023/texmf-dist/tex/latex/fontspec/fontspec.sty|45 error| Emergency stop.
/usr/local/texlive/2023/texmf-dist/tex/latex/fontspec/fontspec.sty|45 error| ==> Fatal error occurred, no output PDF file produced!
已经确认vim.g.vimtex_compiler_latexmk配置没问题,到底哪里出问题了?
排查方向和解决办法
1. 配置加载时机错了,被VimTeX默认值覆盖
很多人把VimTeX配置直接写在init.lua/.vimrc里,但VimTeX插件加载可能比你的配置晚,导致你设的参数被插件默认值冲掉了。
解决:
把VimTeX的配置移到after/plugin/vimtex.lua(用Lua的话)或者after/plugin/vimtex.vim(用Vimscript的话)。这个目录下的文件会等所有插件加载完再执行,能确保你的配置生效。
2. 全局latexmkrc在搞鬼
latexmk会自动读用户目录下的.latexmkrc文件,如果这个文件里指定了默认用pdflatex,会直接覆盖VimTeX传的-xelatex参数。
解决:
- 打开
~/.latexmkrc看看,如果有$pdflatex = 'pdflatex %O %S';这种行,要么注释掉,要么改成$pdflatex = 'xelatex %O %S';;要是不需要全局配置,直接删了这个文件也行。 - 或者在VimTeX配置里加个
'-no-recursion'选项,让latexmk忽略所有.latexmkrc:
vim.g.vimtex_compiler_latexmk = { executable = 'latexmk', options = { '-xelatex', '-no-recursion', -- 跳过latexmkrc配置 '-file-line-error', '-synctex=1', '-interaction=nonstopmode', }, }
3. ,,映射没关联到正确的编译命令
有时候其他插件或者自定义配置会覆盖本地leader的,,映射,导致你按的不是VimTeX的实时编译命令VimtexCompile。
解决:
- 直接在命令模式输
:VimtexCompile启动编译,如果这样能正常跑,说明是映射的问题。可以手动重新绑定:
vim.api.nvim_create_autocmd('FileType', { pattern = 'tex', callback = function() vim.keymap.set('n', '<localleader><localleader>', '<cmd>VimtexCompile<CR>', {buffer = true}) end })
4. 看日志确认实际执行的命令
VimTeX有编译日志,能看到实际调用的latexmk命令到底带没带-xelatex参数。
解决:
在Vim里输:VimtexLog打开日志,搜开头是latexmk的行,看看有没有-xelatex。如果没有,那肯定是配置没生效,回到第1点检查加载顺序。
总结
最常见的就是配置加载时机不对或者全局latexmkrc干扰,先查这俩。直接用:VimtexCompile测试,再配合日志看实际命令,很快就能定位问题。
内容的提问来源于stack exchange,提问作者Prabhjot Singh Rai

