\ShellEscape 在某些情况下与 lualatex 一起使用会失败

\ShellEscape 在某些情况下与 lualatex 一起使用会失败

这个问题源于我的问题这里关于 minted 和 lualatex,另一位用户也报告了类似的问题这里

我认为我已经将问题归结为以下几点。minted 依赖\ShellEscape壳牌,在使用 lualatex 进行编译时,在某些特定情况下似乎会失败,至少在 Windows 上是这样。

例如,以下内容使用pdflatex --shell-escape和可以按预期进行编译xelatex --shell-escape

\documentclass{article}
\usepackage{shellesc}

\begin{document}

\ShellEscape{mkdir myfolder}
\ShellEscape{echo hello world}
\ShellEscape{python --version} % this line is the problem

\end{document}

使用lualatex --shell-escape,命令mkdirecho工作如预期:myfolder创建一个目录并hello world打印在终端中。但Python 3.11.1与 pdflatex 和 xelatex 不同,使用 lualatex 编译时不会打印在终端中

'python' is not recognized as an internal or external command,
operable program or batch file.

因此,出于某种原因,带有 shell escape 的 lualatex 无法找到我电脑上安装的与 pdflatex 和 xelatex 相同的程序。作为参考,我在装有 Windows 10 的机器上使用 miktex 的 lualatex 1.16.0 进行编译。上面的文档在 Linux 机器和稍旧的 lualatex 上完美运行,所以我的假设是 Windows 是问题的一部分。

我不知道 lualatex、Windows 文件系统或 shellesc 是否可能导致此问题。任何帮助都非常感谢。


编辑

正如 David Carlisle 在评论中帮助确定的那样,添加\ShellEscape{echo \@percentchar PATH\@percentchar }显示 lualatex 只能访问 中的程序C:\Users\mbert\AppData\Local\Programs\MiKTeX\miktex\bin\x64。使用 pdflatex 或 xelatex 运行相同的程序会显示添加到我的 PATH 变量中的所有位置,包括 python 的位置。

为什么这个受限 PATH 问题仅出现在 lualatex 中,而不会出现在 pdflatex 或 xelatex 中?

答案1

我在使用 MiKTex 的 Windows 11 上也遇到了同样的问题(全新安装 Windows 之后)。

我可以重现 mbert 上面写的所有内容:pdflatex/xelatex 可以工作,但在 lualatex 中 \ShellEscape 中的 PATH 变量被错误地设置为仅包含“lualatex.exe”的目录。

正如 Ulrike Fischer 上面所建议的,我在 Windows 的进程监视器中检查了 lualatex.exe,但没有发现任何表明它比 pdflatex 更受限制的东西。我还关闭了 Windows 下的病毒和威胁防护,但这没有帮助。

唯一的解决办法目前对我有用的是运行(如建议的那样这里)“latexmk -lualatex --enable-write18 文件名”。

我做了以下补充观察在全新安装带有 MiKTex、TexStudio 和 TexMaker 的 Windows 后:

  • TexMaker:令人惊讶的是,lualatex 为我工作了一段时间(从 \ShellEscape 中的 PATH 正确的意义上来说),但在几次计算机重启后它就停止了。
  • TexStudio、TexWorks、Powershell:从一开始就无法正常工作。

因此,当 PATH 在 lualatex\ShellEscape 中对 TexMaker 起作用时,它对其他的却不起作用。我无法在 TexMaker/TexStudio 的编译设置中找到任何相关的差异。一段时间后,它也停止对 TexMaker 起作用。所以我觉得整个问题非常奇怪。

也许其他人可能会觉得它有帮助:我遇到了这个问题Moodle包裹。当想要在生成的输出文件中嵌入图片时,Moodle.sty 使用 \ShellEscape 从 PATH 运行各种命令。由于上述原因,它会失败。

相关内容