我需要在我的 ConTeXt 文档中包含大量文件:
\starttext
\include file1
\include file2
\include file3
\include file4
\include file5
\stoptext
它们都是由脚本生成的,所以我不知道之前有多少个文件,但它们必须按字母数字顺序包含,而不是随机的。
我找到了这个包括目录内的所有文件,如何迭代文件夹中文件的名称以及许多其他 LaTeX 解决方案,但在 ConTeXt 中找不到解决方案,在手册中也找不到任何内容。
如何包含文件夹中找到的所有文件?
答案1
您可以使用内置的Lua 文件系统库LuaTeX 遍历当前目录中的所有文件。迭代时,我测试元素是否具有.tex
扩展名以及它是否实际上是一个文件,然后将其附加到文件列表中。然后使用词汇排序对列表进行就地排序table.sort
。在文档中,我们可以循环遍历文件列表并调用context.input
每个文件。
\startluacode
local files = {}
for file in lfs.dir(lfs.currentdir()) do
if file:match("%.tex$") and lfs.attributes(file, "mode") == "file" then
files[#files + 1] = file
end
end
table.sort(files)
\stopluacode
\starttext
\startluacode
for _, file in ipairs(files) do
context.input(file)
end
\stopluacode
\stoptext
答案2
带名称的最小工作示例确切地按照您的指定:
\starttext
\directlua 0 { os.execute("ls | sed -n '/^file[0-9][0-9]*$/s/^file//p' | sort -n | sed 's/.*/\\\\input file&/' > ListOfFiles.tmp") }
\input{ListOfFiles.tmp}
\stoptext
我并不是说这是一个好的例如,只是一个在职的例如。是的,它确实使用四个反斜杠将单个反斜杠放入临时文件中。如果文件的名称如下,则嵌入的 sed 脚本只会变得稍微复杂一些文件1.txt,文件2.txt. 类似这样:
\starttext
\directlua 0 { os.execute("ls | sed -n 's/^file\\([0-9][0-9]*\\)\\.txt$/\\1/p' | sort -n | sed 's/.*/\\\\input file&.txt/' > ListOfFiles.tmp") }
\input{ListOfFiles.tmp}
\stoptext
如果你使用的是 Windows,我猜你必须从 Cygwin 或 Msys 之类的程序运行 ConTeXt 才能使这个怪物工作。或者用不使用的纯 lua 重写它什,ls,sed&种类。