我试图弄清楚为什么以下代码不起作用:
\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}