\foreach 循环无法与 \input 一起使用

\foreach 循环无法与 \input 一起使用

其结果是:

\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}

无论哪种情况,结果都是

在此处输入图片描述

相关内容