第一种方法:使用 bash 脚本

第一种方法:使用 bash 脚本

我想直接处理命令行参数,以便在 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.pdffig4.pdffig1.tikzfig418.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 脚本或其他方法。:)

相关内容