etoolbox:AtBeginEnvironment 不是 At Begin Environment

etoolbox:AtBeginEnvironment 不是 At Begin Environment

我尝试了以下MWE:

\documentclass{article}
\usepackage{etoolbox}

\AtBeginEnvironment{table}{AtBeginEnvironment\par}
\AtEndEnvironment{table}{AtEndEnvironment\par}
\BeforeBeginEnvironment{table}{BeforeBeginEnvironment\par}
\AfterEndEnvironment{table}{AfterEndEnvironment\par}

\begin{document}
    Text before\par
\begin{table} [t]%
    Table text\par
\end{table}
    Text after\par
\end{document}

并得到以下结果:

Table text
AtEndEnvironment
Text before
BeforeBeginEnvironment
AtBeginEnvironment
AfterEndEnvironment
Text after

我原本希望 AtBeginEnvironment 能与浮动元素一起移动到页面顶部。以下是手册中关于此事的说明:

\AtBeginEnvironment{<environment>}{<code>}
Appends arbitrary <code> to a hook executed by the \begin command
at the beginning of a given <environment>, immediately before
\<environment>, inside the group opened by \begin.

我不知道环境定义内部发生了什么;我猜它声明了一些称为\<environment>(例如\table)和\end<environment>(例如\endtable)的特殊命令。

但在这种情况下,难道它不应该是immediately after \<environment>,以便成为 的补充,\AtEndEnvironment就像\BeforeBeginEnvironment是 的补充一样\AfterEndEnvironment吗?

无论如何,我如何在环境的开头添加代码?我试图为所有表格设置某种字体样式,但\AtBeginEnvironment{table}{\small}没有成功。另外我猜这种行为会让答案不正确,因为\addvspace会停留在图形声明点而不是与它一起移动。

答案1

etoolbox包重新定义\begin,以便

  1. \@beforebegin@<envname>@hook被执行
  2. 已创建群组
  3. 进行通常的簿记(\@currenvir例如设置)
  4. \@begin@<envname>@hook被执行
  5. \<envname>被执行

因此你得到的是

\@beforebegin@table@hook
\begingroup
<bookkeeping>
\@begin@table@hook
\table

该宏\table负责开始创建一个浮点数并扩展为\@float{table}

这样,标记AtBeginEnvironment\parBeforeBeginEnvironment\par就被看到了,段落也排版了浮动开始了。

相反,\end被重新定义为执行执行\AtEndEnvironment之前的标记。\end<envname>

这应该可以解释你得到的输出。

当浮动已经开始并且是 时,有一个钩子可以做某事\@floatboxreset

我会谨慎使用钩子来添加文本:它们用于额外的设置。

答案2

如果您打算使用它来全局调整表格和图形的格式,以下是一种解决方法:

% Redefine figure environment so that all figures are centered and use tiny sans-serif font
\makeatletter
\let\figureorig\figure
\def\figure@i[#1]{\figureorig[#1]\centering\sffamily\tiny}  % with optional argument
\def\figure@ii{\figureorig\centering\sffamily\tiny}  % without optional argument
\def\figure{\@ifnextchar[\figure@i \figure@ii}  % Redefine depending on presence of [
\makeatother

% Redefine table environment so that all tables are set in tiny sans-serif font
\makeatletter
\let\tableorig\table
\def\table@i[#1]{\tableorig[#1]\sffamily\tiny}  % with optional argument
\def\table@ii{\tableorig\sffamily\tiny}  % without optional argument
\def\table{\@ifnextchar[\table@i \table@ii}  % Redefine depending on presence of [
\makeatother

相对复杂的重定义是由于figuretable环境可以携带可选参数。因此,重定义会查找左方括号“[”,以确定是否提供了可选参数。

相关内容