我有一个全局钩子(=宏),每次执行环境时都应将其附加到该钩子上。(此处由\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}
相当于上面的调用。