我想通过相对于段落文本水平移动标准浮动框(如figure
或table
)来修改它们在页面上的显示方式,见下图。
为此我尝试使用adjustwidth
包提供的环境,并按照以下方式changepage
重新定义原始环境(例如)。figure
\documentclass[]{article}
\usepackage{mwe}
\usepackage{changepage}
\makeatletter
\newenvironment{shiftedfloat}[2][]
{\@float{#2}[#1]\begin{adjustwidth}{2cm}{-2cm}}
{\end{adjustwidth}\end@float}
\renewenvironment{figure}[1][\fps@figure]
{\shiftedfloat[#1]{figure}}
{\endshiftedfloat}
\makeatother
\begin{document}
\blindtext
\begin{figure}[h]
\includegraphics[width=\textwidth]{example-image}
\caption{Figure caption}
\end{figure}
\end{document}
这仅在我尝试加载float
包并将放置规范从 更改[h]
为 时才有效[H]
,此时我收到错误:
! Extra }, or forgotten \endgroup.
adjustwidth
有趣的是,当我脱离定义shiftedfloat
并将其直接放入给定的图中时,一切都正常:
\documentclass[]{article}
\usepackage{mwe}
\usepackage{float}
\usepackage{changepage}
\makeatletter
\newenvironment{shiftedfloat}[2][]
{\@float{#2}[#1]}
{\end@float}
\renewenvironment{figure}[1][\fps@figure]
{\shiftedfloat[#1]{figure}}
{\endshiftedfloat}
\makeatother
\begin{document}
\blindtext
\begin{figure}[H]
\begin{adjustwidth}{2cm}{-2cm}
\includegraphics[width=\textwidth]{example-image}
\caption{Figure caption}
\end{adjustwidth}
\end{figure}
\end{document}
在我看来,由于某种原因,\end{adjustwidth}
在的先前定义中丢失了shiftedfloat
,但我无法弄清楚原因。
有什么建议可以解决这个问题吗?或者也许有更好的方法来实现预期的效果?重要的是,原始浮动环境被改变而不是引入任何新环境,并且解决方案与包兼容float
,特别是与参数兼容[H]
。
答案1
谢谢阿克塞尔·索末菲的解决方案类似的问题描述\renewenvironment{figure} 与 [H] 位置的兼容性问题我也能够通过\float@endH
包修补来解决问题。float
\documentclass[]{article}
\usepackage{mwe}
\usepackage{changepage}
\usepackage{float}
\makeatletter
\newenvironment{shiftedfloat}[2][]
{\@float{#2}[#1]\begin{adjustwidth}{2cm}{-2cm}}
{\end{adjustwidth}\end@float}
\renewenvironment{figure}[1][\fps@figure]
{\shiftedfloat[#1]{figure}}
{\endshiftedfloat}
% Adaption to the [H] placement provided by the float package
\AtBeginDocument{%
\let\float@endHorg\float@endH
\def\float@endH{\end{adjustwidth}\float@endHorg}
}
\makeatother
\begin{document}
\blindtext
\begin{figure}[H]
\includegraphics[width=\textwidth]{example-image}
\caption{Figure caption}
\end{figure}
\end{document}