将字符串数组组合成宏

将字符串数组组合成宏

我可以使用\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}

相关内容