从大约一个月前开始,我一直收到 TinyTeX 用户的错误报告,说“ TinyTeX\bin\windows\runscript.tlu:864: no appropriate script or program found: fmtutil
”或“ I can't find the format file `pdflatex.fmt'!
”,我不明白。
在过去的几天里,我挠头,撞墙,做了一些研究,在邮件列表中询问了 R 和 LaTeX 专家,再次提醒“ [[替代 HTML 版本已删除]] ”(当然,并道歉) ,翻出一台旧的 Windows 笔记本电脑,自豪地用我人生中第一次真实的中文名字(而不是使用拼音)创建一个新的用户帐户,经历了反复试验,还了解了 Windows 批处理脚本的各种奇怪之处作为 Stack Overflow 的良药,召集母校所有中国学生测试自己的 Windows 机器和系里的 Windows 服务器,冥想三秒钟生命的意义。最后,我很高兴地宣布我已经找到了一个修复程序并将其应用于tinytex (R 包)的开发版本。
太长了;修复
如果您在将 R Markdown 或 Quarto 或 LaTeX 文档渲染为 PDF 时遇到上述错误,您可以安装tinytex的开发版本:
install.packages('tinytex', repos='https://rstudio.r-universe.dev')
请记住安装后重新启动R。然后确保packageVersion('tinytex') >= '0.48.4')
。
问题
如果您的 Windows 用户名不包含空格或非 ASCII 字符,则此问题不会影响您。
Sys.getenv('APPDATA') xfun::is_ascii(.Last.value) && !grepl(' ', .Last.value)
虽然我已经使用 LaTeX 近二十年了,但我第一次(从 Akira Kakuto 那里)了解到,当 TeX Live 的安装路径包含非 ASCII 字符时,TeX Live 无法在 Windows 上运行。默认情况下,TinyTeX 安装到环境变量APPDATA
定义的路径,其格式为C:\Users\username\AppData\Roaming
。问题来自于该路径中的username
,该用户名可能包含多字节字符,并导致 TeX Live 失败并出现大量错误消息,如下所示:
! warning: kpathsea: configuration file texmf.cnf not found in these directories: .... ! ...s\username\AppData\Roaming\TinyTeX\bin\windows\runscript.tlu:941: ...s\username\AppData\Roaming\TinyTeX\bin\windows\runscript.tlu:864: no appropriate script or program found: fmtutil ! Running the command C:\Users\username\AppData\Roaming\TinyTeX\bin\windows\fmtutil-user.exe ! kpathsea: Running mktexfmt pdflatex.fmt ! The command name is C:\Users\username\AppData\Roaming\TinyTeX\bin\windows\mktexfmt
理论上, username
包含空格应该没问题,因为空格是 ASCII 字符。然而,我收到的报告称空间也可能带来麻烦。我确实知道为什么(最近在 R 基础上修复的错误是否相关?)。
改变
在当前开发版本的tinytex中,当您的APPDATA
路径包含空格或非 ASCII 字符时:
-
如果您第一次在计算机上运行
tinytex::install_tinytex()
来安装TinyTeX,它将把TinyTeX安装到环境变量ProgramData
定义的路径,通常是C:\ProgramData
。该路径没有空格或非 ASCII 字符,但请注意,它默认是隐藏的(这是无害的)。另外,该文件夹是系统中所有用户共享的。如果您有多个用户,这可能是一个问题。例如,其他用户可以更改或覆盖您的安装。如果这是一个问题,您可以通过install_tinytex()
的dir
参数指定不同的路径。请记住,此路径也不应包含特殊字符。 -
如果 TinyTeX 已经安装到
APPDATA
,您将收到一条警告消息,告诉您如何将其移动到ProgramData
(如果您愿意,您也可以将其移动到其他位置 – 只需为下面的to
参数指定不同的路径)。移动 TinyTeX 后,您可能需要重新启动 R 甚至系统。
tinytex::copy_tinytex(to = Sys.getenv('ProgramData'), move = TRUE)
安装脚本install-bin-windows.bat
也进行了相应更新。
一个潜在的缺陷
上述修复基于ProgramData
可写的假设,根据我向一些学生要求的各种测试,这似乎是正确的。如果不是这样,您必须在tinytex::install_tinytex()
中指定您自己的安装路径,或者如果您使用 Windows 批处理文件,则可以设置环境变量TINYTEX_DIR
(默认为APPDATA
或ProgramData
)。
四开本用户
我还没有检查Quarto 是否直接受到这个问题的影响,但我有理由相信,如果是的话,移动 TinyTeX 应该可以修复它。唯一的问题是,对于非 R 用户,没有像调用 R 函数这样的自动解决方案,您必须手动移动它(如果您使用 XeLaTeX,则运行tlmgr path add
以及tlmgr postaction install script xetex
)。
我计划在不久的将来发布 CRAN 版本,因为这个问题已经影响了多个用户。如果Windows 用户能够帮助我测试tinytex当前的开发版本,我将不胜感激。如果您遇到任何问题,请告诉我。谢谢!