将迭代变量从 foreach 传递给自定义命令

将迭代变量从 foreach 传递给自定义命令

我试图弄清楚为什么以下代码不起作用:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgffor}

\newcommand\setProblemShow[2]{%
  \csdef{isProblemShow#1}{#2}}
\newcommand\getProblemShow[1]{%
  \csuse{isProblemShow#1}}

\begin{document}

    \setProblemShow{1}{1}

    \foreach \idx in {1,2,...,15} { \setProblemShow{\idx}{0} }

    \foreach \idx in {1,2,...,15} { Problem \idx \quad is \getProblemShow{\idx} \par }

\end{document}

它输出

在此处输入图片描述

为什么它不调用\设置问题显示正确地而\获取问题显示好像叫OK?

答案1

\foreach执行组中的每个循环;因此,当您执行第一个中的第一个循环时\foreach,实际上完成的是

\begingroup
\csdef{isProblemShow1}{0}
\endgroup

\endgroup并且一旦执行就会忘记定义。

在第二个循环中

\begingroup
Problem 1\quad is \csuse{isProblemShow1} \par
\endgroup
\begingroup
Problem 2\quad is \csuse{isProblemShow2} \par
\endgroup

等等。第一个产生

问题 1 是 1

因为外面的\setProblemShow{1}{1};第二个产生

问题 2 是

因为\csuse{isProblemShow2}只是这样做\relax,因为 产生的标记\csname isProblemShow2\endcsname未定义。

如果您在第一个循环中进行全局定义,则每一行都会得到 0。

\documentclass{article}

\usepackage{etoolbox}
\usepackage{pgffor}

\newcommand\setProblemShow[2]{%
  \global\csdef{isProblemShow#1}{#2}}
\newcommand\getProblemShow[1]{%
  \csuse{isProblemShow#1}}

\begin{document}

    \setProblemShow{1}{1}

    \foreach \idx in {1,2,...,15} { \setProblemShow{\idx}{0} }

    \foreach \idx in {1,2,...,15} { Problem \idx \quad is \getProblemShow{\idx} \par }

\end{document}

在此处输入图片描述

相关内容