如何迭代文件夹中文件的名称

如何迭代文件夹中文件的名称

假设我有许多 TeX 文件。为了简单起见,还假设它们位于单个文件夹或目录中。

我想从我的主要 LaTeX 文档中输入所有文件。实际上,我可以预先使用 C# 创建这些文件的列表。

为了丰富我对 LaTeX 或 TeX 的了解,您能告诉我这项工作是否只能使用纯 TeX 或 LaTeX 来完成吗?

答案1

\documentclass{article}
\makeatletter
\def\app@exe{\immediate\write18}
\def\inputAllFiles#1{%
  \app@exe{ls #1/*.txt | xargs cat >> #1/\jobname.tmp}%
  \InputIfFileExists{#1/\jobname.tmp}{}{}
  \AtEndDocument{\app@exe{rm -f #1/\jobname.tmp}}}
\makeatother
\begin{document}

\inputAllFiles{.}% from the current dir 

\end{document}

并不难。这只是一个开胃菜,教你如何做到这一点。这个只读取文件 *.txt。你必须用pdflatex -shell-escape test

答案2

如果文件使用某种命名约定,则可以按如下方式进行我可以根据文件系统自动加载章节和部分吗?

\documentclass{article}

\newcommand*{\MaxNumOfChapters}{10}% Adjust these two settings for your needs.
\newcommand*{\MaxNumOfSections}{6}%

\usepackage{pgffor}%

\begin{document}
\foreach \c in {1,2,...,\MaxNumOfChapters}{%
    \foreach \s in {1,2,...,\MaxNumOfSections}{%
        \IfFileExists{Chapter\c/Section\s} {%
            \input{Chapter\c/Section\s}%
        }{%
                % files does not exist, so nothing to do
        }%
    }%
}%
\end{document}

假设每个章节都有一个名为的目录,Chapter<i>其中包含名为的文件Section<n>。应该能够根据您的具体情况进行自定义。

这应该可以在不同的操作系统上工作。

如果没有特定的命名约定,您可以调整它以处理 C# 程序生成的文件列表。例如,如果 C# 程序可以生成ListOfFiles.tex如下文件

\newcommand*{\ListOfFiles}{%
    Chapter1/Section1,
    Chapter1/Section2,
    Chapter1/Section3,
    Chapter2/Section1,
    Chapter2/Section2
}%

那么您可以按如下方式处理它:

\documentclass{article}%
\usepackage{pgffor}%

\input{ListOfFiles}%

\begin{document}%
\foreach \c in \ListOfFiles {%
    \input{\c}%
}%
\end{document}

答案3

LuaTeX 解决方案:

TeX 驱动程序:

\directlua{dofile("inputall.lua")}

\bye

和 Lua 输入文件inputall.lua

function dirtree(dir)

  if string.sub(dir, -1) == "/" then
    dir=string.sub(dir, 1, -2)
  end

  local function yieldtree(dir)
    for entry in lfs.dir(dir) do
      if not entry:match("^%.") then
        entry=dir.."/"..entry
          if lfs.isdir(entry) then
            yieldtree(entry)
          else
            coroutine.yield(entry)
          end
      end
    end
  end

  return coroutine.wrap(function() yieldtree(dir) end)
end


for i in dirtree(lfs.currentdir()) do
  local filename = i:gsub(".*/([^/]+)$","%1")
  tex.sprint("\\input " ..  filename .. " ")
end

这将递归目录树并输入找到的所有文件。(在 Lua 用户 wiki 中找到了 dirtree 迭代器。)

答案4

这是一个更简单的 Luatex 解决方案

function inputAll(dir)
    for file in lfs.dir(dir) do
        fullpath = dir .."/".. file
        modeAttr = lfs.attributes(fullpath, "mode")
        extension = string.sub(file,#file-3,#file)
        if modeAttr == "file" and extension == ".tex" then
            tex.sprint("\\input{" .. fullpath .. "}")
        end
    end
end

使用类似

\directlua{
  dofile("scripts/inputall.lua");
  inputAll("Skills")
}

相关内容