如何让 pgf 的 foreach 迭代输入文件的内容

如何让 pgf 的 foreach 迭代输入文件的内容

我想写类似的东西:

\foreach \myline in {\input{filehandle}}
{\dosomethingwith\myline}

如果我有outside_file.tex

this,
is,
the content, of, a
file

然后尝试将其传递给\foreach循环如下

\documentclass{article}
\usepackage{pgffor}
\newcommand\dosomethingwith[1]{\textbf{#1}\par}

\begin{document}

Output as expected:\par
\foreach \myitem in {this,is,the content, of, a file}
{\dosomethingwith\myitem}

Output not as expected:\par
\foreach \myitem in {\input{outside_file}}
{\dosomethingwith\myitem}

\end{document}

我没有得到我期望的结果。

结果如下:

在此处输入图片描述

我曾经看到过一些用于在宏中加载和存储文件内容的包。但我再也找不到那个包了。如果你知道我指的包,我会接受,因为这将解决我在这里遇到的问题。

答案1

如果我理解你的问题,你需要加载文件的全部内容并将其用作\foreach宏的参数。然后你可以替换以下行

\foreach \myitem in {\input{outside_file}}

在您的示例中有两行:

{\everyeof={\noexpand}\xdef\filecontent{\csname @@input\endcsname outside_file }}%
\foreach \myitem in \filecontent

我认为该文件不包含 TeX 敏感材料(宏、TeX 特殊字符等%),并且整个文件内容可以通过 进行处理\edef

答案2

您可以使用 CSV 处理包来读取输入文件的行。以下解决方案使用,csvsimple但我想您也可以使用datatool和获得类似的解决方案pgfplotstable

\documentclass{article}

\usepackage{csvsimple}

\usepackage{filecontents}
\begin{filecontents*}{outside_file.txt}
this,
is,
the content, of, a
file
\end{filecontents*}

\newcommand\dosomethingwith[1]{\textbf{#1}\par}

\begin{document}

Read from file:\par
\csvloop{
  file=outside_file.txt,
  no head,
  check column count=false,
  command=\dosomethingwith\csvline,
}

\end{document}

在此处输入图片描述

答案3

您可以将的输出分配cat给宏:

在此处输入图片描述

笔记:

代码:

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{OutsideFile.tex}
this,
is,
the content, of, a
file
\end{filecontents*}

\usepackage{pgffor}
\newcommand\dosomethingwith[1]{\textbf{#1}\par}

\makeatletter
%% Adapted from https://tex.stackexchange.com/questions/102365/specify-file-name-shell-access-via-input
\newcommand\SetMacroToShellOutput[2]{%    
  \begingroup\endlinechar=\m@ne\everyeof{\noexpand}%
  \edef\TempResult{\endgroup
    \expandafter\def\noexpand#1{%
      \@@input|"#2" }}%
  \TempResult}
\makeatother


\begin{document}

Output as expected:\par
\foreach \myitem in {this,is,the content, of, a file}
{\dosomethingwith\myitem}

\SetMacroToShellOutput{\MyFileContent}{cat OutsideFile.tex}
Output also as expected:\par
\foreach \myitem in \MyFileContent
{\dosomethingwith{\myitem}}

\end{document}

相关内容