我正在研究一个考试文档类,用户在其中输入如下问题:
\multiplechoice{Question}
{Answer #1}
{Answer #2}
{Answer #3}
{Answer #4}
{Correct answer}
{Explanation}
我想在一次 LaTeX 运行中以各种方式处理这些信息(以创建答题纸、答案和测试本身),因此问题需要存储在宏中。当定义以下内容时,尴尬就来了:
\newcommand{\sectionA}[1]{\newcommand{\putsectionA}{#1}}
然后要求用户将 15 个问题作为 \sectionA 的参数。我更希望这些问题成为环境的内容,如下所示:
\begin{sectionA}
lots of questions
\end{sectionA}
主要是因为我发现跟踪环境声明比跟踪花括号容易得多。是否可以将环境的内容打包成宏?
编辑:
解决方案似乎是我们想要的environ
软件包,但它似乎不起作用。以下是我正在尝试的:
\documentclass{article}
\usepackage{environ}
\NewEnviron{foo}{\edef\foot{\BODY}}
\begin{document}
\begin{foo}
Store This
\end{foo}
\foot
\end{document}
但是运行时此代码\foot
仍未定义。实际上似乎不可能使用 定义任何宏environ
。即使不使用\BODY
。例如,将上面的定义替换为
\NewEnviron{foo}{\newcommand{\foot}{Print me}}
仍然失败。我也尝试过从包\Collect@Body
中environ
获得类似的结果。是否\NewEnvrion
以某种方式禁止定义新命令?
答案1
该environ
包允许你通过宏访问环境主体。你可以使用以下\BODY
方式复制它:\let
\edef
\NewEnviron{sectionA}{\global\let\putsectionA\BODY}
或者
\NewEnviron{sectionA}{\xdef\putsectionA{\BODY}}
\xdef
类似于全局命令\newcommand
,但不检查命令之前是否存在,并在定义之前扩展其内容。这很重要,因为定义\BODY
在环境之后当然会发生变化。