使用 \foreach 一次性输入多个文件

使用 \foreach 一次性输入多个文件

我在子文件夹中有几个文件./tmp——“a.tex”,其内容是\def\aaa{aaa},“b.tex”,其内容是“\def\bbb{bbb}”。

然后我通过 将它们一次性输入到我的主文档中\foreach,如下面的代码尝试的那样,但它无法工作,并导致错误消息Undefined control sequence.

我该怎么办?

代码:

\documentclass{article}
\usepackage{pgffor}
\foreach \x in {a.tex,b.tex}{
  \input{tmp/\x}
  }
\begin{document}
\aaa\bbb
\end{document}

答案1

解决这个问题最简单的方法是使用expl3

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\multiinput}{O{.}m}
 {% #1 = common prefix, default . for the current directory
  % #2 = list of file names
  \clist_map_inline:nn { #2 } { \input{#1/##1} }
 }
\ExplSyntaxOff

\begin{document}

\multiinput[tmp]{a,b}

\fooA

\fooB

\end{document}

tmp在我放的子目录中

% file a.tex
\newcommand{\fooA}{A}

\fooA

% file b.tex
\newcommand{\fooB}{B}

\fooB

编译上面的主文件产生

在此处输入图片描述

循环中的每个循环都在一个组内进行处理,这就是文件内的定义无法保留的\foreach原因。建议的解决方案不使用分组。\input

答案2

解决这个问题最简单的方法是使用 OpTeX。它提供了自己的可扩展性,\foreach而无需插入组:

\foreach{a.tex}{b.tex}\do{\input{tmp/#1}}

如果您不使用 OpTeX,那么您可以使用 TeX 原语创建自己的宏:

\def\forfiles#1{\ifx\relax#1\else \input{tmp/#1}\expandafter\forfiles\fi}
\forfiles{a.tex}{b.tex}\relax

您不需要任何expl3。建议的解决方案不使用分组。

答案3

我也是新手latex3。这是一种操作标记列表中项目的方法。

\begin{filecontents*}{a.tex}
\def\aaa{aaa}
\newcommand{\ddd}{ddd}
\end{filecontents*}
\begin{filecontents*}{b.tex}
\def\bbb{bbb}
\end{filecontents*}
\begin{filecontents*}{c.tex}
\def\ccc{ccc}
\end{filecontents*}
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \tl__myfiles
\tl_set:Nn \tl__myfiles {{a.tex}{b.tex}{c.tex}}
\tl_map_variable:NNn \tl__myfiles \x {\input{\x}}
\ExplSyntaxOff
\begin{document}
\aaa\bbb\ccc\ddd
\end{document}

相关内容