如何在 ConTeXt 中包含目录中的所有文件?

如何在 ConTeXt 中包含目录中的所有文件?

我需要在我的 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 重写它lssed&种类

相关内容