我正在创建一个样式文件,并希望存储摘要环境的正文,以便将其放在我的自定义标题页上。我可以要求我的用户输入摘要
\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}
不会被解释,即使允许使用隐式分隔符,您也会得到不完整的定义。
对此通常的解决方案如下:
制作一个盒子,将其保存起来,然后送到适当的位置;例如,这就是 AMS 类所做的;
使用
environ
包,它更灵活,因为它允许在使用点而不是调用点格式化文本。
这是第二个想法的实现。
\usepackage{environ}
\NewEnviron{customabstract}{\global\let\abstracttext\BODY}
解释。使用environ
,环境的内容将暂时保存为 的替换文本\BODY
。