每次调用命令时定义一个新命令

每次调用命令时定义一个新命令

简短的摘要:

我想创建一个命令,每次调用时都会根据计数器创建一个新命令。然后我可以使用 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 =

  2. 现在抄下其他组的问题:

    乙:1*1=

    C:1^1 =

答案1

您可以使用\csdefetoolbox

\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}

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

相关内容