在环境内用两个参数包装命令

在环境内用两个参数包装命令

我知道这个问题看起来像这个但那里给出的解决方案对我来说不起作用。

我正在尝试用\element{foo}{bar}automultiplechoice 替换宏来获得类似的东西

\begin{qcm}{foo}
    bar
\end{qcm}

我尝试过 environ 包,文档可以编译,但是使用时会忽略以这种方式定义的问题\restitutegroup。这是我的 MWE:

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{environ}
\usepackage{automultiplechoice}
\usepackage{amsmath}
\usepackage{amsfonts}

\NewEnviron{qcm}[1]{\element{#1}{\BODY}}
\begin{document}

\begin{qcm}{test}
  \begin{question}{foo}
    foo
  \end{question}
\end{qcm}

\element{test}{
   \begin{question}{bar}
     bar
   \end{question}
}

\begin{examcopy}[2]
    \insertgroup{test}
    \clearpage
\end{examcopy}
\end{document}

仅恢复“酒吧”问题。

任何线索都将不胜感激!

答案1

环境,除非明确做出定义,否则定义的范围是局部的\global。因此,qcm如果处理不当,在 内做出的任何定义都可能无效。这就是这种情况\element- 它创建一个令牌列表,其定义(或内容)不会在组中存活下来。

下面的例子做出了定义\global,并确保\BODY在之后仍然存在qcm

在此处输入图片描述

\documentclass{article}

\usepackage{environ}
% https://github.com/bdemeshev/pr201/blob/master/prob_exams_collection/automultiplechoice.sty
\usepackage{automultiplechoice}

\NewEnviron{qcm}[1]{%
  \def\arg{#1}%
  \expandafter\element\expandafter\arg\expandafter{\BODY}}

\makeatletter
\renewcommand{\element}[2]{%
  \AMC@prepare@element{#1}%
  \global\csname #1@\romannumeral\AMCtok@k\endcsname={#2}%
}
\makeatother

\begin{document}

\begin{qcm}{test}
  \begin{question}{foo}
    foo
  \end{question}
\end{qcm}

\element{test}{%
   \begin{question}{bar}
     bar
   \end{question}
}

\begin{examcopy}[2]
  \insertgroup{test}
  \clearpage
\end{examcopy}

\end{document}

相关内容