使用从另一个文件输入的 foreach 的 pgffor 不再适用于 MiKTeX 23.4

使用从另一个文件输入的 foreach 的 pgffor 不再适用于 MiKTeX 23.4

这段代码可以用 MiKTeX 2.9.6300 完美编译:

\documentclass{article}

\usepackage{pgffor}

\begin{document}

\input{forEachInput.tex}
{
test \fruit
}

\end{document}

文件 forEachInput.tex 只包含一行

\foreach \fruit in {apple,cherry,banana}

末尾没有空格。

现在,如果我尝试使用 MiKTeX 23.4 编译同一个文件,我会收到一个错误:段落在 \pgffor@next 完成之前结束。

另一方面,如果我在主文件中直接输入 forEachInput.tex 的内容(不再使用输入),MiKTeX 2.9.6300 和 MiKTeX 23.4 都可以完美运行。

似乎在 2.9.6300 和 23.4 之间有什么东西改变了它的行为?在这种情况下,我搞不清楚是 \input 还是 pgffor 包的问题,​​也不知道如何让我的代码再次工作……

答案1

这仅适用于(内部)低级宏\@input

\begin{filecontents*}{forEachInput.tex}
\foreach \fruit in {apple,cherry,banana}
\end{filecontents*}
\documentclass{article}

\usepackage{pgffor}

\begin{document}

\csname @input\endcsname{forEachInput.tex}
{
test \fruit
}

\end{document}

使用用户界面命令等\input\InputIfFileExists在读取文件之前和之后都会执行代码。ltfilehook-doc.pdf有关信息,请参阅。

答案2

您可以使用该catchfile包在宏中加载文件的内容,并在需要时重复使用它。

代码

\begin{filecontents*}{\jobname-data.tex}
\foreach \fruit in {apple, cherry, banana}
\end{filecontents*}
\documentclass{article}
\usepackage{pgffor, catchfile}
\newcommand*\Input[2][\foreachFile]{\CatchFileDef{#1}{#2}{}#1}
\begin{document}
\Input{\jobname-data.tex}{test: \fruit \par}

\foreachFile{again: \fruit \par}
\end{document}

相关内容