我想写类似的东西:
\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
给宏:
笔记:
- 宏
\SetMacroToShellOutput
改编自通过 \@@input 指定文件名 shell 访问
代码:
\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}