我尝试了以下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
,以便
\@beforebegin@<envname>@hook
被执行- 已创建群组
- 进行通常的簿记(
\@currenvir
例如设置) \@begin@<envname>@hook
被执行- 宏
\<envname>
被执行
因此你得到的是
\@beforebegin@table@hook
\begingroup
<bookkeeping>
\@begin@table@hook
\table
该宏\table
负责开始创建一个浮点数并扩展为\@float{table}
。
这样,标记AtBeginEnvironment\par
和BeforeBeginEnvironment\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
相对复杂的重定义是由于figure
和table
环境可以携带可选参数。因此,重定义会查找左方括号“[”,以确定是否提供了可选参数。