使用 \gappto 将环境内容附加到钩子

使用 \gappto 将环境内容附加到钩子

我有一个全局钩子(=宏),每次执行环境时都应将其附加到该钩子上。(此处由\bhook-\ehook对定义。)但是,我无法得出可行的解决方案。

\documentclass{article}
\pagestyle{empty}

\usepackage{etoolbox}

\newcommand\myhook{}
\gappto{\myhook}{hooked!}

% How to define these macros?
\newcommand\bhook{\gappto{\myhook}\bgroup}
\newcommand\ehook{\egroup}

% Usage, result should be equivalent to
% \gappto{\myhook}{hook this!}
\bhook{hook this!}\ehook

\begin{document}
  \myhook
\end{document}

编译此代码会导致错误,将\bgroup/替换\egroup\begingroup/\endgroup

{\if0=`}\fi

\if0=`{\fi}

有没有办法用命令替换环境?不,\NewEnviron来自 environ 包的命令在这里也不起作用。(至少对于我的特殊情况来说——我想允许这个环境中的几乎所有东西。)

这是 的缺陷吗\gappto?或者为什么“常用技巧”不起作用?使用\def和 朋友会更容易实现吗?

编辑:为了使问题更加复杂,\bhook\ehook命令将嵌入到自定义环境中:

\NewDocumentEnvironment{testhook}{}{\bhook}{\ehook}

答案1

宏的参数必须被包围明确的如果它们由多个标记组成,则用括号括起来(并且在宏的定义中没有“分隔”,但\newcommand定义的宏始终需要用括号括起来的参数)。

如果你真的想要一个语法

\bhook Hook this!\ehook

你可以说

\long\def\bhook#1\ehook{\gappto{\myhook}{#1}}

这样,参数就被有效地分隔开,并以同一括号级别的\bhook第一个标记结束。\ehook

另一种方法environ可能是

\usepackage{environ}
\NewEnviron{hook}{%
  \expandafter\gappto\expandafter\myhook\expandafter{\BODY}%
}

以便

\begin{hook}
Hook this!
\end{hook}

相当于上面的调用。

相关内容