包含/输入子文件夹中的每个子文件

包含/输入子文件夹中的每个子文件

我们的化学老师给了我们一套词汇卡,其中包括我们应该能够解释的所有术语(期待期末考试)。因为只有这些卡片并不能帮助我和朋友创建一个词汇表。目前,该集合包含大约 180 个术语。考虑到最终文档的大小,我们决定将LaTeX这个项目分成单个文件,以便我们能够非常轻松地处理不同的术语。该项目的初始设置如下所示:

基本设置

每个术语都应该在子文件夹中获得一个文件entries。是否可以使用单个命令将所有文件输入到主文件中?是否有类似的东西\input{entries/*}

编辑:

这些文件应该以术语解释的名称命名。因此,这些文件不会被编号,并且具有完全不同的名称。

答案1

如果文件按顺序编号,那么您可以使用pgffor包通过循环插入它们:

\documentclass{article}
\usepackage{pgffor}
\begin{document}
\foreach \x in {1,...,10}{
  \input{file\x}
}
\end{document}

这将输入file1file10您的文档中。

如果文件具有任意名称,您仍然可以使用循环,但每个名称都需要在命令中指定\foreach,例如\foreach \x in {worda,wordb,wordc}等。

这回答了您的实际问题,但对于您要解决的更大问题(即制作词汇表),可能还有其他解决方案。datatool例如,我更倾向于将条目保存在电子表格中,然后用于创建词汇表。

答案2

您没有解释输入文件的顺序。如果顺序与 Unix 命令的输出顺序相同,ls并且您正在使用bash命令解释器,那么您可以创建包含以下内容的脚本runtex(例如):

#!/bin/bash
ls entries/* > entfiles
echo {} >> entfiles
pdfcsplain main.tex

注意:将 替换pdfcsplain为你正在运行 TeX 的命令。可能是latex或其他内容。最后,该main.tex文件可以包含:

\def\inputfile#1 {\ifx^#1^\else \input#1 \expandafter\inputfile\fi}
\expandafter\inputfile \input entfiles

然后您可以尝试运行该runtex命令或bash runtex命令。

答案3

到目前为止,我见过的所有解决此类问题的方法都依赖于 shell 脚本或\write18随后用 和创建的临时文件\input(ted)。但值得注意的是,也可以使用管道代替临时文件。实际上,我不确定“管道输入”功能是否在所有系统上都适用于\openin以及\input,但在我的系统上(MacTeX/TeXLive 安装)它可以。

要构建一个(几乎)最小的工作示例,请创建一个文件,将其Main.tex放置在子目录 旁边Data,然后依次将四个名为Foo.texBar.texBaz.tex和 的文件放入其中AnotherFileName.tex。这四个文件可以读取如下(例如):

内容Foo.tex

\subsection{The \emph{Foo} file}
\lipsum[2]

内容Bar.tex

\subsection{The \emph{Bar} file}
\lipsum[3]

内容Baz.tex

\subsection{The \emph{Baz} file}
\lipsum[4]

内容AnotherFileName.tex

\subsection{There is of course a problem\ldots}

\ldots~the order of file inclusion depends on the order in which they are 
listed by the \texttt{ls} command; but I~am afraid this cannot be avoided!

\lipsum[5-8]

您现在可以测试 (A)MWE 了,它包含Main.tex以下内容的文件:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}

\makeatletter

\@ifdefinable\@fileliststream{\newread\@fileliststream}
\@ifdefinable\@currentfilename{}
\newcommand*\InputAllFilesInSubfolder[1]{
  % #1 <- Path to subfolder: MUST end with the (operating system dependent) 
  %       character for separating path components.
  \openin\@fileliststream |"ls '#1'"\relax
  \loop \unless\ifeof\@fileliststream
    \begingroup
      \endlinechar \m@ne % cf. exercise 20.18
      \global\readline\@fileliststream to\@currentfilename
    \endgroup
    \ifx\@currentfilename\@empty \else
      \typeout{Inputting "#1\@currentfilename".}%
      \input{#1\@currentfilename}%
    \fi
  \repeat
  \closein\@fileliststream
}

\makeatother

\begin{document}

\tableofcontents

\section{Main section}
\lipsum[1]

\InputAllFilesInSubfolder{Data/}

\end{document}

在这种情况下,我认为显示输出并不是特别有意义。

添加

然而,很明显,该命令的选项ls让你可以控制文件输入的顺序:你可能想尝试一下,例如,

  \openin\@fileliststream |"ls -rtU '#1'"\relax

相关内容