更新R、RStudio与MiKTeX后RStudio调用pdflatex编译PDF失败求助
Windows 10 环境下,使用RStudio中的knitr工具调用MiKTeX的pdflatex生成PDF,在2021年2月更新R、RStudio、MiKTeX到当时的最新版本后,出现编译失败的问题。
报错信息为:
"Running pdflatex.exe on testdoc.tex...failed
Error running C:/Users/myusername/AppData/Local/Programs/MiKTeX/miktex/bin/x64/pdflatex.exe (exit code -1073740791)"
或
C:/PROGRA~1/MiKTeX/miktex/bin/x64/pdflatex.exe
测试用的testdoc.Rnw内容为:
\documentclass{article} \begin{document} some text \end{document}
已经完成的排查操作:
- 先后卸载重装MiKTeX、R、RStudio,分别尝试用户级、管理员级安装(均为2021年2月19日发布的最新版本)
- 分别以用户模式、管理员模式运行软件,问题复现
- 确认报错提示中的pdflatex路径正确
- 执行
Sys.which("pdflatex")返回的路径与实际安装路径一致 - 编译过程无任何日志生成,流程在调用pdflatex的环节直接终止报错
- 可通过TeX Studio正常编译同路径下的tex文件生成PDF
- MiKTeX控制台已更新至最新版本
- RStudio设置中已选择knitr为编译引擎,反复调整相关选项并重启软件无效
其他观察:
- 修改系统PATH环境变量,分别填入
C:\PROGRA~1\MiKTeX\miktex\bin\x64\和C:\Users\myusername\AppData\Local\Programs\MiKTeX\miktex\bin\x64\,无改善 - 执行
Sys.which("pdftex")和Sys.which("pdflatex")返回完全相同的结果,不确定是否与问题相关 - 命令行直接调用pdflatex可正常编译tex文件,输出如下:
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (MiKTeX 21.2) entering extended mode (testdoc.tex LaTeX2e <2020-10-01> patch level 4 L3 programming layer <2021-02-18> xparse <2020-03-03> (C:\Program Files\MiKTeX\tex/latex/base/article.cls Document Class: article 2020/04/10 v1.4m Standard LaTeX document class (C:\Program Files\MiKTeX\tex/latex/base/size10.clo)) (C:\Program Files\MiKTeX\tex/latex/graphics/graphicx.sty (C:\Program Files\MiKTeX\tex/latex/graphics/keyval.sty) (C:\Program Files\MiKTeX\tex/latex/graphics/graphics.sty (C:\Program Files\MiKTeX\tex/latex/graphics/trig.sty) (C:\Program Files\MiKTeX\tex/latex/graphics-cfg/graphics.cfg) (C:\Program Files\MiKTeX\tex/latex/graphics-def/pdftex.def))) (C:\Program Files\MiKTeX\tex/latex/graphics/color.sty (C:\Program Files\MiKTeX\tex/latex/graphics-cfg/color.cfg)) (C:\Users\myusername\AppData\Roaming\MiKTeX\tex/latex/framed/framed.sty) (C:\Program Files\MiKTeX\tex/latex/base/alltt.sty) (C:\Users\myusername\AppData\Roaming\MiKTeX\tex/latex/upquote/upquote.sty) (C:\Program Files\MiKTeX\tex/latex/l3backend/l3backend-pdftex.def) No file testdoc.aux. (C:\Program Files\MiKTeX\tex/context/base/mkii/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] ) (C:\Program Files\MiKTeX\tex/latex/epstopdf-pkg/epstopdf-base.sty) [1{C:/Users/myusername/AppData/Local/MiKTeX/pdftex/config/pdftex.map}] (testdoc.aux) )<C:/Program Files/MiKTeX/fonts/type1/public/amsfonts/cm/cmr10.pfb> Output written on testdoc.pdf (1 page, 12954 bytes). Transcript written on testdoc.log.
R环境信息(执行sessionInfo()输出):
R version 4.0.4 (2021-02-15) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 10 x64 (build 16299) Matrix products: default locale: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.0.4 tools_4.0.4
报错返回的退出码-1073740791对应Windows系统错误码0xC0000409,即栈缓冲区溢出崩溃,这是MiKTeX 21.2(2021年2月发布版本)的已知缺陷:当pdflatex被非交互式父进程(如RStudio内置的R会话)调用时,自动包安装的初始化流程会触发内存冲突直接崩溃;而TeX Studio、系统命令行属于交互式启动,不会触发该冲突,与观察到的现象完全匹配。可按以下步骤操作解决:
- 关闭所有正在运行的R、RStudio进程
- 以管理员身份打开MiKTeX控制台,进入「设置」→「常规」标签页,将缺失包自动安装选项设置为「从不」,保存配置。额外打开
C:\Users\你的用户名\AppData\Roaming\MiKTeX\miktex.ini文件,找到AutoInstall字段,确认值为No,如为Yes则手动修改后保存 - 检查系统环境变量的PATH列表:
- 删除所有重复的MiKTeX bin路径,仅保留你实际安装的、与
Sys.which("pdflatex")返回值一致的单一路径 - 将该MiKTeX bin路径移动到PATH列表的最顶端,避免加载其他残留TeX发行版的冲突DLL
- 删除所有重复的MiKTeX bin路径,仅保留你实际安装的、与
- 打开RStudio,进入「全局选项」→「Sweave」设置页:
- 确认「Rnw文档编译引擎」已选择
knitr - *取消勾选「使用tinytex编译LaTeX文档」*选项,避免RStudio错误传递调用参数
- 保存设置后重启RStudio
- 确认「Rnw文档编译引擎」已选择
- 回到工作目录,在R控制台手动执行以下命令验证调用是否正常:
若命令执行成功生成PDF,即可正常使用RStudio的编译按钮生成文档knitr::knit("testdoc.Rnw") system2("pdflatex", args = "testdoc.tex") - 若上述步骤无效,说明当前安装的MiKTeX版本未修复该缺陷,可彻底卸载MiKTeX,删除残留配置目录
C:\Users\你的用户名\AppData\Roaming\MiKTeX和C:\Users\你的用户名\AppData\Local\MiKTeX,安装MiKTeX 21.1(2021年1月发布的稳定版)即可,该版本不存在此调用崩溃问题。
注:观察到的Sys.which("pdftex")和Sys.which("pdflatex")返回结果一致属于正常现象,MiKTeX中这两个命令是同一个可执行文件的不同调用别名,与本次问题无关。
内容的提问来源于stack exchange,提问作者Ben Elizabeth Ward

