(编辑:如何以独立于操作系统的方式使用 LuaTeX 执行文件系统操作和二进制执行?我为 pdfTeX 编写了一组宏,以便使用命令执行此操作\write18
。这些宏旨在在 Windows 和 Linux 下使用,提供一些“更高级别”的控制。现在我希望宏也支持 LuaTeX。然而,我的第一次实验没有成功。试图通过省略所有宏并在命令行上执行 LuaTeX 来减少问题,结果将注意力误导到一个不重要的问题上,几天后我才找到解决方案。)
在最小测试环境中(参见 LuaMetaTeX 的最小测试环境)我可以做初始内存转储
luatex --ini ./plain.tex \dump
然后我希望以下命令列出目录:
luatex --fmt=./plain.fmt --shell-escape \directlua {os.execute ("dir")}\end
但它只是告诉我:
This is LuaTeX, Version 1.13.2 (TeX Live 2021/W32TeX)
system commands enabled.
No pages of output.
Transcript written on texput.log.
那么,如何在 LuaTeX 下执行系统命令,就像在 pdfTeX 下可以执行一样\write18
?
答案1
正如@David 所解释的那样,我通过在 shell 提示符下输入 LuaTeX 命令而没有使用必要的引号,过度简化了此测试,因此我没有获得预期的输出。在文档中,同一命令不能使用引号,问题转移到将系统的输出转换为命令序列。这个想法是在和下都能运行,而unix
在pdfTeX 下或如果未设置windows
则正常失败。--shell-escape
\def \system #1#2#3{{%
% #1: unix command, #2: windows command, #3: control sequence (return value)
\xdef #3{}%
\ifx \directlua \undefined
\message {! No \string\directlua\space support (LuaTeX required).}%
\else
\edef \escapestate {\directlua {tex.write (status.shell_escape)}}%
\def \one {1}%
\ifx \escapestate \one
\edef \ostype {\directlua {tex.print (os.type)}}%
\def \unix {unix}% os.type can be "unix", "windows", or "msdos"
\directlua {%
\ifx \ostype \unix
local file = io.popen ([[#1]]);
os.execute ([[#1]]);
\else
local file = io.popen ([[#2]]);
os.execute ([[#2]]);
\fi
local content = file:read "*a";
file:close ();
tex.toks [5] = content; }%
\xdef #3{\the \toks 5}%
\else \message {! No --shell-escape switch set for system command.}\fi
\fi }}
\bgroup \newlinechar = 10
\system {setterm --clear}{cls}\myresult
\system {time}{time /t}\myresult
\message {^^JSystem time:^^J\myresult}
\system {cd}{cd}\myresult
\message {^^JCurrent folder:^^J\myresult}
\system {ls -l}{dir /b}\myresult
\message {^^JFiles in current folder:^^J\myresult}
\system {set}{set}\myresult
\message {^^JEnvironment variables:^^J\myresult}
\egroup \end
将以上文件另存为curdir.tex
并运行:
luatex --fmt=plain --output-format=pdf --shell-escape ./curdir.tex \end