这与水平移动页面上的所有浮动内容。在尝试重新定义标准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}