`\AfterBeginEnvironment` 命令是否已经存在?

`\AfterBeginEnvironment` 命令是否已经存在?

您知道命令\AtBeginEnvironment\AtEndEnvironment吗?我需要一个像这样的命令\AfterBeginEnvironment才能在所有环境之后放置一些文本。有办法吗?该命令已经存在?因为我找不到它。

答案1

加载FOO时的环境结构大致如下:etoolbox

% \begin{FOO}
\before@begin@FOO
\begingroup
  \at@begin@FOO
  \FOO % <- actual environment code
  % \after@begin@FOO
  <environment body>
% \end{FOO}
  \at@end@FOO
  \endFOO % <- end environment code
\endgroup
\after@end@FOO

您提出的添加\AfterBeginEnvironment将添加(评论)\after@begin@FOO钩子,它适用于简单情况(为什么不行呢,对吧?)。问题是,如果环境接受一个参数(可选或其他),钩子\after@begin@FOO会妨碍<environment body>(可能包括 的参数\FOO),并且抓取的参数将不正确。这就是为什么没有\AfterBeginEnvironment

A\AfterEndEnvironment 可以存在,因为\end环境的一部分不应该接受参数,但这可能不是总是是事实,所以也没有实现。只有在环境的实现不受钩子影响的情况下才会添加钩子。

对于在定理环境标题后添加更多垂直空间的具体情况,您需要检查正在使用的定理包的文档并在其中找到一个钩子来更改间距,这应该比实现更容易\AfterBeginEnvironment

答案2

尝试修补exam类在问题项前插入分页符part,使用\xpretocmd就很好了。您的案例需要\xapptocmd\apptocmd如果您的环境没有可选参数,也许也可以。

这是可行的,因为命令\newenvironment{envname}{<before code>}{<after code>}将定义两个宏,\envname(代码之前)和\endenvname(代码结束)。因此,将代码附加到将有效地附加\envname<before code>。这正是\after@begin@FOO在现有的答案中。其他人也评论了如何xpatch可能是正确的选择。这还不是答案,所以我认为添加它是有意义的。

您没有指定用例或 MWE,因此我仅将展示如何修补examsparts环境(它在其 中定义part和)。并且没有剪切它,因为任何命令都被自己的再次覆盖。只有bonuspart<before code>AtBeginEnvironmentBeforeBeginEnvironment\def\part...<before code>\def\part追加最后确保我们覆盖现有的\def\part

\documentclass{exam}

\usepackage{xpatch}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% New page before every question *part*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Problem: `exam` doesn't just define `\part` on the top-level, but only *inside* the
% `parts` environment. The reason given in `exam.cls` is:
%
%     We want the \part command to be defined *only* inside of a parts
%     environment, so that the user can use the standard sectioning \part
%     command inside of a questions environment (as long as it's outside of
%     a parts environment).
%
% This means we cannot simply redefine `\part`, we need to wait until a `parts`
% environment is started, then at the end of its environment code run our patch.
% See also https://tex.stackexchange.com/q/494409/120853

\xapptocmd{\parts}{%
    \xpretocmd{\part}{\clearpage}{%
        % Success code
    }{%
        % Failure code
    }
    \xpretocmd{\bonuspart}{\clearpage}{%
        % Success code
    }{%
        % Failure code
    }
}{
    % Success code
}{%
    % Failure code
}

\begin{document}
    \begin{questions}
        \question Base question.
        \begin{parts}
            \part Hello from the next page!
        \end{parts}
    \end{questions}
\end{document}

相关内容