假设我有许多 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")
}