如何修补浮动环境,以便修补后的命令浮动

如何修补浮动环境,以便修补后的命令浮动

我正在使用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并手动插入代码。当然,如果您加载任何会更改 定义的包,则需要小心。

相关内容