我在子文件夹中有几个文件./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}