简短的摘要:
我想创建一个命令,每次调用时都会根据计数器创建一个新命令。然后我可以使用 PGF 的 for 循环来遍历命令序列。不起作用的示例是:
\newcounter{group}
\newcommand{\defgroup}[1]{
\stepcounter{group}
\newcommand{\problem\Alph{group}}[0]{#1}
}
\defgroup{$1*1=$}
\defgroup{$1+1=$}
但事实证明你无法做到\newcommand{\problem\Alph{group}}
这一点。有办法吗?
更长的解释:
我正在编写一个拼图活动,它需要一系列相关版本的文档(A、B、C、D、E),每个版本都有不同的问题。目前的做法如下(MWE)
\documentclass[12pt]{exam}
\newcounter{group}
\newcommand{\groupname}{\stepcounter{group}\textbf{\Huge \Alph{group}\\}}
\newcommand{\newgroup}[1]{
\newpage
\groupname
\setcounter{section}{0}
\section{Here is your problem!}
\begin{center}
#1
\end{center}
\section{Now copy down other groups problems!}
}
\begin{document}
\newgroup{$1+1=$}
\newgroup{$1*1=$}
\newgroup{$1^1=$}
\end{document}
我希望能够在每个版本的第二部分中引用其他组。因此,我希望组 A 的文档如下所示:
A
这是你的问题:1+1 =
现在抄下其他组的问题:
乙:1*1=
C:1^1 =
答案1
您可以使用\csdef
:etoolbox
\documentclass{article}
\usepackage{etoolbox}
\newcounter{group}
\newcommand{\defgroup}[1]{
\stepcounter{group}
\csdef{problem\Alph{group}}{#1}
}
\begin{document}
\defgroup{$1*1=$}
\defgroup{$1+1=$}
\problemA
\problemB
\end{document}
答案2
\expandafter\newcommand\csname problem\Alph{group}\endcsname{#1}%
将定义一个名为的宏,\problemX
其中X
是组计数器值的 Alph 变体。将\expandafter
首先生成宏名称,然后\newcommand
获取此宏名称以定义相关宏。
请注意,一旦组计数器重置为零,此方法就会失败。
\documentclass[12pt]{exam}
\newcounter{group}
\newcommand{\defgroup}[1]{%
\stepcounter{group}%
\expandafter\newcommand\csname problem\Alph{group}\endcsname{#1}%
}
\begin{document}
\defgroup{$1+1=$}
\defgroup{$1*1=$}
\defgroup{$1^1=$}
\problemA
\problemB
\problemC
%\setcounter{group}{0} This will fail x
\defgroup{$1+1=$}
\defgroup{$1*1=$}
\defgroup{$1^1=$}
\end{document}
答案3
正如我针对您的长篇解释所评论的那样,一个复杂之处在于,您希望在调用\newgroup
定义它们的函数之前先了解 B 组和 C 组问题。事实上,对于 A 组,您甚至不知道会有多少其他组跟随。
因此,在这里,我强制将所有问题一次性定义在逗号分隔的列表中,然后可以根据需要调用详细信息。答案将自动调整为定义的问题数量。(所以继续,尝试\MakeProblemSheets{$1+1=$,$1*1=$,$1^1=$,$1/1=$}
另一种方法)。
\documentclass[12pt]{exam}
\usepackage{listofitems}
\newcounter{group}
\newcommand{\Groupname}[1]{\setcounter{group}{#1}\textbf{\Huge \Alph{group}\\}}
\newcommand{\Newgroup}[1]{
\newpage
\Groupname{#1}
\setcounter{section}{0}
\section{Here is your problem!}
\begin{center}
\problems[#1]
\end{center}
\section{Now copy down other groups problems!}
\begin{center}
\foreachitem\i\in\problems{%
\ifnum\icnt=#1\relax\else
\setcounter{group}{\icnt}
\makebox[.3in][l]{\Alph{group}:}%
\makebox[.7in][l]{\i}\\\fi
}
\end{center}
}
\newcommand\MakeProblemSheets[1]{%
\readlist\problems{#1}
\foreachitem\Prob\in\problems{\Newgroup{\Probcnt}}
}
\begin{document}
\MakeProblemSheets{$1+1=$,$1*1=$,$1^1=$}
\end{document}