其结果是:
\foreach \x in {1,2,3}{%
\x
}
和这个是一样的:
\newcommand{\mycommand}{%
1,2,3%
}
\foreach \x in \mycommand{%
\x
}
但是如果我创建一个包含 1,2,3 的“example.tex”文件,那么这不起作用:
\foreach \x in \input{example}{%
\x
}
我将制作很多“example1.tex”、“example2.tex”等文件,并希望能够选择其中一个进行迭代。
有解决方法吗?我需要将 foreach (或类似的东西) 结合到输入中。
谢谢!
答案1
您可以借助以下方法将文件内容存储在临时宏中catchfile
:
\begin{filecontents*}{\jobname-example}
1,2,3
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor}
\usepackage{catchfile}
\newcommand{\foreachinfile}[2]{%
\CatchFileDef{\foreachinfiletemp}{#2}{}%
\foreach #1 in \foreachinfiletemp
}
\begin{document}
\foreach \x in {1,2,3} {\x}
\foreachinfile \x {\jobname-example} {\x}
\end{document}
采用不同的方法expl3
:
\begin{filecontents*}{\jobname-example}
1,2,3
\end{filecontents*}
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \l__bilal_xforeach_tl
\clist_new:N \l__bilal_xforeach_clist
\keys_define:nn { bilal/xforeach }
{
list .clist_set:N = \l__bilal_xforeach_clist,
macro .code:n = \clist_set:NV \l__bilal_xforeach_clist #1,
file .code:n = \file_get:nnN { #1 } { } \l__bilal_xforeach_tl
\clist_set:NV \l__bilal_xforeach_clist \l__bilal_xforeach_tl,
}
\NewDocumentCommand{\xforeach}{mm}
{% #1 = list, macro or file; #2 = template
\keys_set:nn { bilal/xforeach } { #1 }
\cs_set:Nn \__bilal_xforeach:n { #2 }
\clist_map_function:NN \l__bilal_xforeach_clist \__bilal_xforeach:n
}
\ExplSyntaxOff
\newcommand{\test}{1,2,3}
\begin{document}
\xforeach{list={1,2,3}}{#1}
\xforeach{macro=\test}{#1}
\xforeach{file=\jobname-example}{#1}
\end{document}
的第二个参数\xforeach
是一个模板,其中循环中的当前项用表示#1
。
答案2
这个答案模仿了 egreg,但使用readarray
包将输入文件吸收到宏中。
\begin{filecontents*}[overwrite]{mydata.dat}
1,2,3
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor}
\usepackage{readarray}
\newcommand{\foreachinfile}[2]{%
\readdef{#2}{\foreachinfiletemp}%
\foreach #1 in \foreachinfiletemp
}
\begin{document}
\foreach \x in {1,2,3} {\x}
\foreachinfile \x {mydata.dat} {\x}
\end{document}
如果输入不是用逗号分隔而是单独放置的,每个文件记录一个,则\readarraysepchar{,}
可以使用在每个记录后人为地插入一个逗号,这样就可以达到相同的结果:
\begin{filecontents*}[overwrite]{mydata.dat}
1
2
3
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor}
\usepackage{readarray}
\newcommand{\foreachinfile}[2]{%
\readdef{#2}{\foreachinfiletemp}%
\foreach #1 in \foreachinfiletemp
}
\readarraysepchar{,}
\begin{document}
\foreach \x in {1,2,3} {\x}
\foreachinfile \x {mydata.dat} {\x}
\end{document}
无论哪种情况,结果都是