如何将 LaTeX 环境的内容传递给宏?

如何将 LaTeX 环境的内容传递给宏?

我正在研究一个考试文档类,用户在其中输入如下问题:

\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@Bodyenviron获得类似的结果。是否\NewEnvrion以某种方式禁止定义新命令?

答案1

environ包允许你通过宏访问环境主体。你可以使用以下\BODY方式复制它:\let\edef

\NewEnviron{sectionA}{\global\let\putsectionA\BODY}

或者

\NewEnviron{sectionA}{\xdef\putsectionA{\BODY}}

\xdef类似于全局命令\newcommand,但不检查命令之前是否存在,并在定义之前扩展其内容。这很重要,因为定义\BODY在环境之后当然会发生变化。

相关内容