如何在环境中包装宏定义?

如何在环境中包装宏定义?

我正在创建一个样式文件,并希望存储摘要环境的正文,以便将其放在我的自定义标题页上。我可以要求我的用户输入摘要

\customabstract{Abstract text goes here}`

我会将其实现为类似

\newcommand{\customabstract}[1]{\gdef\abstracttext{#1}}

不过,我更希望用户能够使用环境符号,

\begin{customabstract}Abstract text goes here\end{customabstract}

为了做到这一点,我想我可以定义类似的东西

\newenvironment{customabstract}{\gdef\abstracttext\bgroup}{\egroup}

但这个定义会将\abstracttext其扩展为\bgroup,这不是我想要的。我尝试通过以下方式解决问题\expandafter

\newenvironment{customabstract}{\expandafter\gdef\expandafter\abstracttext\bgroup}{\egroup}

但这会导致失控错误。

有什么方法可以实现我想要的吗?最好能找到能帮助我理解 TeX 内部工作原理(而不是仅仅提到自定义包)的答案。

答案1

你不能做

\gdef\abstracttext\bgroup...\egroup

因为宏替换文本周围的括号必须是显式的。此外,TeX 在吸收宏替换文本时从不进行扩展,因此\end{customabstract}不会被解释,即使允许使用隐式分隔符,您也会得到不完整的定义。

对此通常的解决方案如下:

  1. 制作一个盒子,将其保存起来,然后送到适当的位置;例如,这就是 AMS 类所做的;

  2. 使用environ包,它更灵活,因为它允许在使用点而不是调用点格式化文本。

这是第二个想法的实现。

\usepackage{environ}

\NewEnviron{customabstract}{\global\let\abstracttext\BODY}

解释。使用environ,环境的内容将暂时保存为 的替换文本\BODY

相关内容