我正在使用etoolbox
来修补一些环境。我想使用\AtBeginEnvironment{table}{\marginpar{foo}}
来在浮动边距中放置一些内容。但是 marginpar 是在环境写入的位置排版的,而不是在输出浮动的位置,如果您明白我的意思的话。我怎样才能让某些内容与表格一起浮动?
答案1
根据 Martin Scharrer 对table
环境的重新定义和 egreg 关于禁止在插入内部插入的声明:这是一个\marginpar
不起作用的情况,但是\marginnote
(从边注包)确实如此。
\documentclass{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{marginnote}
\makeatletter
\renewenvironment{table}[1][]{\@float{table}[#1]\marginnote{foo}}{\end@float}
\makeatother
\begin{document}
\blindtext
\begin{table}
\centering
(Table content)
\caption{A table}
\end{table}
\end{document}
答案2
不可以。表格和边距都是插入,禁止在插入内再插入。
如果你尝试将 a 放在\marginpar
一个table
环境中,你就会得到
! LaTeX Error: Float(s) lost.
马丁的重新定义也不起作用:
! LaTeX Error: Not in outer par mode.
不管怎样,它都是行不通的。
答案3
AtBeginEnvironment 代码在环境内部宏 ( \table
) 之前执行:
$ latexdef -p etoolbox begin
\begin:
macro:#1->\csuse {@beforebegin@#1@hook}%
\@ifundefined {#1}%
{\def \reserved@a {\@latex@error {Environment #1 undefined}\@eha }}%
{\def \reserved@a {\def \@currenvir {#1}\edef \@currenvline {\on@line }
\csuse {@begin@#1@hook}\csname #1\endcsname }}%
\@ignorefalse \begingroup \@endpefalse \reserved@a
这里的重点是\csuse {@begin@#1@hook}\csname #1\endcsname
。因此您不能使用这些钩子来执行此操作。
请注意,这table
只是:
\table:
\long macro:->\@float {table}
\endtable:
\long macro:->\end@float
因此我会这样写:
\renewenvironment{table}[1][]{\@float{table}[#1]\marginpar{foo}}{\end@float}
table
并手动插入代码。当然,如果您加载任何会更改 定义的包,则需要小心。