\renewenvironment{figure} 与 [H] 位置的兼容性问题

\renewenvironment{figure} 与 [H] 位置的兼容性问题

这与水平移动页面上的所有浮动内容。在尝试重新定义标准figure环境时,我遇到了与[H]浮动包中的位置说明符的兼容性问题。

考虑下面的简单示例,它仅添加一些文本显示在环境的开始和结束时。

\documentclass{article}

\usepackage{mwe}

\makeatletter
\renewenvironment{figure}[1][\fps@figure]
  {\@float{figure}[#1]before}
  {after\end@float}
\makeatother

\usepackage{float}

\begin{document}

\begin{figure}[h]
   \includegraphics[width=.8\linewidth]{example-image}
\end{figure}

\end{document}

这与标准 latex 图形放置说明符的预期效果一致,通过在“之前”和“之后”单词之间显示图形,如下图所示。但是,当我尝试使用[H]而不是[h]应该在图形消失后出现的文本时。有什么建议可以修复上述示例以与[H]放置说明符配合使用吗?

在此处输入图片描述

答案1

问题出在包的代码中:如果使用了float放置,则会在不尊重原始定义的情况下在本地重新定义:[H]\endfigure\endfigure

\def\@float@HH#1[H]{%
% Locally redefine the end of the environment.
  \expandafter\let\csname end#1\endcsname\float@endH
  ...

因此,以下代码可以很好地编译,尽管\jhzsweiurziuewzriuewzritewt(显然)根本没有定义,因此在使用时会出现错误:

\documentclass{article}
\usepackage{mwe}

\makeatletter
\renewenvironment{figure}[1][\fps@figure]
  {\@float{figure}[#1]before}
  {\jhzsweiurziuewzriuewzritewt} % not defined but compiles fine anyway ;-)
\makeatother

\usepackage{float}

\begin{document}

\begin{figure}[H]
   \includegraphics[width=.8\linewidth]{example-image}
\end{figure}

\end{document}

我们能做什么呢?\float@endH同样要打补丁。我们在重新定义中执行此操作figure(而不是全局执行),因此补丁不会影响其他浮动环境:

\documentclass{article}
\usepackage{mwe}

\makeatletter
\renewenvironment{figure}[1][\fps@figure]
  {% Next two code lines: Adaption to "HERE" feature of the float package
   \let\float@endH@ORI\float@endH
   \def\float@endH{after\float@endH@ORI}%
   % ...or \pretocmd{\float@endH}{after}{}{} when using `etoolbox`
   \@float{figure}[#1]before}
  {after\end@float}
\makeatother

\usepackage{float}

\begin{document}

\begin{figure}[H]
   \includegraphics[width=.8\linewidth]{example-image}
\end{figure}

\end{document}

答案2

该宏\fps@figure没有 H 选项。要从图形包中实现 H 选项,您需要类似以下内容:

\documentclass{article}
\usepackage{caption}
\usepackage{mwe}
\usepackage{showframe}

\newenvironment{Hfigure}{\setcaptiontype{figure}%
  \vskip\textfloatsep\begin{minipage}{\columnwidth}}%
  {\end{minipage}\vskip\textfloatsep\noindent}

\begin{document}
before
\begin{Hfigure}
\centering
\includegraphics{example-image}
\caption{test}
\end{Hfigure}
after
\end{document}

相关内容