我可以使用\foreach
循环来迭代字符串数组:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\foreach \v in {A, B}{
\input{the\v file.txt}
}
\end{document}
现在,我想将字符串编写为宏,如下所示:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand\var{A, B} % <<< macro
\foreach \v in \var{
\input{the\v file.txt}
}
\end{document}
然后我遇到一个问题:
! LaTeX Error: File `theA, Bfile.txt' not found.
使用\def
而不是\newcommand
会产生使用 Latex 版本时出现的相同问题pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6)
。
怎么解决?
答案1
我可以用 Ti 重现这个问题钾Z/PGF 版本 1.7 (2006/10/11,十二年前),但后续版本则不然。
我猜想,从 2.0 版开始,的语法\foreach
已经得到扩展,以应对以下情况
\foreach \v in {<list>}{...}
\foreach \v in \cs{...}
但后一种情况在以前的版本中是不可能的。
解决方案:更新您的 TeX 系统。
对于旧系统,您可以执行以下操作,这也适用于较新的版本。
\documentclass{article}
\usepackage[pdftex]{graphicx}
\usepackage{tikz}
\begin{document}
\newcommand\var{A, B} % <<< macro
\expandafter\foreach\expandafter\v\expandafter i\expandafter n\expandafter{\var}{
\input{the\v file.txt}
}
\end{document}
我不得不回到 TeX Live 2007(我的一台机器上最早发布的版本)来重现这个问题:This is pdfTeXk, Version 3.1415926-1.40.9 (Web2C 7.5.7)
答案2
您\newcommand
定义了一个字符串,因此在调用时它会生成该字符串。有关差异的更多信息,请参阅https://tex.stackexchange.com/a/658/114249。您应该使用以下\def
命令:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\def\var{A, B} % <<< macro
\foreach \v in \var{
\input{the\v file.txt}
}
\end{document}
这将尝试打开theAfile.txt
并按theBfile.txt
请求进行。
答案3
也许您使用了一些软件包版本,其中\foreach
的列表参数不能来自宏,但必须完全扩展传递。
如果是这样,那么下面的内容可能会有所帮助:
\documentclass{article}
\usepackage{tikz}
\newcommand\PassFirstToSecond[2]{#2{#1}}%
\newcommand\OneLevelExpandedSecond[2]{%
\expandafter\PassFirstToSecond\expandafter{#2}{#1}%
}%
\begin{document}
\newcommand\var{A, B} % <<< macro
\OneLevelExpandedSecond{\foreach \v in }{\var}{% <- We don't want unneeded spaces due to \endlinechar!
\input{the\v file.txt}% <- We don't want unneeded spaces due to \endlinechar!
}% <- We don't want unneeded spaces due to \endlinechar!
\end{document}