我想直接处理命令行参数,以便在 lua 代码和后续 latex 中使用。查找文档时,我没有找到有关该\input
命令的 tex-bindings 的提示。
在这个示例中,我想使用 lua 处理多个 .tikz 文件。
%tikzmaster.tex
\documentclass[crop,tikz]{standalone}
\begin{document}
\directlua{
if not (arg == nil) then
for i,v in pairs(arg) do
if i == 2 then ?????.input("\string\\item[" .. i .. "])
end
end
}
\end{document}
与...一起使用lualatex tikzmaster.tex fig1.tikz
到目前为止我发现慢性肝病这看起来有点不相关,主意我确实认为我需要将输入文件保存为字符串以供 tex 处理,但我确实只找到了在 lualatex 中打印内容的输出示例参考.
这在概念上可能是不可能的吗?
答案1
首次买者自负:我们假设所有相关文件都位于同一目录中
第一种方法:使用 bash 脚本
如果你使用 Linux,那么 shell 脚本可以完成这项工作:
我的脚本
根据 David Carlisle 提出的想法,我们编写了以下脚本。请注意,我们添加了选项,-jobname
以便我们有不同的输出文件。否则,它将迭代同一个文件(抱歉,我不熟悉 Bash,所以如果有更好的方法,请随时纠正我)。
#!/bin/bash
for i in $(seq 1 $1); do
lualatex -jobname fig$i '\def\zzz{fig'"$i"'.tikz} \input tikzmaster.tex'
done
tikzmaster.tex
在 TeX 方面,您将拦截变量\zzz
作为字符串,然后调用相应的输入文件。嗯,我正在考虑这个,但 Lua 在这里没有做任何工作
\documentclass[crop,tikz]{standalone}
\begin{document}
\input \zzz
\end{document}
最后,魔术来了:
sh myscript.sh 4 # 4 is an argument.
#Change according to the number of files you want to process
您的输出文件将是fig1.pdf
、、和 ,因此,由于您的文件是或,并且没有前导零或其他格式变化,fig2.pdf
因此脚本将起作用。fig3.pdf
fig4.pdf
fig1.tikz
fig418.tikz
您实际上可以使用 Lua,因为它可以完成很多好事,但在这种情况下它只能取代 bash 脚本的功能。
它的缺点是它只适用于名称遵循特定模式的文件。
第二种方法:实际使用 Lua
为了模拟您的示例,我们可以使用助手执行以下操作myscript.tex
myscript 目录
%!TEX program = lualatex
\documentclass{article}
\usepackage{shellesc}
\usepackage{luacode}
\directlua{toprocess = [[\zzz]]}
\begin{document}
\begin{luacode*}
--We capture only strings with .tikz as suffix
for w in string.gmatch(toprocess, "[^,%s]+%.tikz") do
--We remove the suffix so it doesn't appear in PDF filenames
w = string.gsub(w, "([^,%s]+)%.tikz", "%1")
os.execute([[lualatex -jobname ]]..w..[[ '\def\zzz{]]..w..[[.tikz} \input tikzmaster.tex']])
end
\end{luacode*}
Yay! % To avoid error messages. This actually does nothing.
\end{document}
你的tikzmaster.tex
文件看起来会像这样:
tikzmaster.tex
\documentclass[crop,tikz]{standalone}
\usepackage{luacode}
\begin{document}
\input \zzz
\end{document}
你的命令是:
lualatex --shell-escape '\def\zzz{fig1.tikz,fig2.tikz,one.tikz,another.tikz} \input myscript.tex'
相当麻烦,但还是有可能的。此外,您现在可以使用任意.tikz
文件。还有其他可能性:您甚至可以tikzmaster.tex
通过生成filecontents
或读取目录内容来io.popen
搜索.tikz
其中的所有文件,但这变得越来越麻烦。我会选择 bash 脚本或其他方法。:)