在以下 MWE 中,我遇到了(对我来说)非常奇怪的命令\write18
和svg
包的依赖关系。
\documentclass{article}
\RequirePackage{svg}
\begin{document}
\immediate\write18{echo 'test' >> test.txt}
Some content
\end{document}
按照提供的格式编译文档时,test.txt
将创建具有正确内容的文件。但是,如果我在文档标题中注释掉,\usepackage{svg}
则不会创建此文件。
我使用latexmk
进行lualatex
编译(当然启用了 shell-escape),甚至尝试通过 编译控制台中的文档lualatex --shell-escape test.tex
。
使用 时pdflatex
问题消失。
使用控制台时,我看到echo 'test' >> test.txt
控制台上打印了内容,这表明(对我来说)它\write18
正在按预期执行其工作。但是(如上所述)除非我使用该svg
包,否则不会创建文件。
我认为包装\RequirePackage{...}
内的某些东西svg
可以起到这个作用。
有人对此有解释吗?或者我是否遇到了一个错误lualatex
?
答案1
LuaTeX 0.87 及更新版本支持最多 256 个写入流,因此\write18
不再特殊处理。LaTeX3 项目准备shellesc
包,由包加载svg
,提供统一的接口来执行外部命令。
\documentclass{article}
\usepackage{shellesc}
\begin{document}
\ShellEscape{echo 'foo' >> foo.txt}
\end{document}
此包还使我们能够在最近的 LuaTeX 中使用旧语法\write18{...}
,但需要注意的是,它始终按 执行\immediate
。如果您需要在 时运行命令\shipout
,请改用\DelayedShellEscape
。