使用 afterpage / minted 包时如何解决“浮动丢失”问题?

使用 afterpage / minted 包时如何解决“浮动丢失”问题?

我正在写一个文档,其中有很多长列表。我使用包铸造排版列表,我总是将其嵌入浮动中。由于列表很长,而 LaTeX 通常无法正确放置浮动,因此我还使用了包后页\clearpage在每个长列表之后强制执行。

不幸的是,我有时会收到来自 LaTeX 的消息说

... Float(s) lost
... This may be a LaTeX bug.

如果 float / afterpage 命令位于页面第一段之后,似乎就会发生这种情况。以下是应触发错误消息的最小工作示例(使用 编译latex -shell-escape example.tex):

\documentclass[a4paper,11pt]{report}
\usepackage{afterpage}
\usepackage{minted}
\begin{document}
a

a 

% ...
% Insert as many paragraphs 'a' such that 'begin' below appears
% as the first line on 2nd page (in my case I need 44 x 'a').
%

a

begin

\afterpage{\clearpage}
\begin{figure}[p]
abracadabra
\end{figure}

end

% Even adding more text below won't help

\end{document}

请注意,如果包铸造不包括,尽管铸造未使用。

我的问题是如何解决这个问题?我做错了什么?

我找到了一种方法,就是简单地重新定位文本中的浮动,例如将其移到上一个或下一个段落。但这并不方便,因为进一步编辑文本可能再次需要更改浮动位置。请注意,只要\afterpage新包提供类似的功能,我就可以替换。

编辑:上面的代码只是为了触发问题。我实际的“用例”是figure用浮点数替换listing浮点数:

\begin{listing}[p]
\begin{minted}[gobble=2]{python}
  print "Hello, World!"
  #
  # Typically much
  # ... much
  # ... longer listing (like 3/4 of a page)
  #
\end{minted}
\end{listing}

编辑 2:我更新了浮动放置选项,告诉 LaTeX 我们想要将浮动放在单独的页面上(即)。实际上,无论我使用什么选项,问题都会发生。此外,如果 LaTeX 不坚持将所有浮动推迟到 10 页之外,[p]我很乐意使用[p]without 。\afterpage{\clearpage}

答案1

我想回答我自己的问题会很丑陋,但在与 David 交流后,我找到了一种解决上述问题的方法。我只是强制 LaTeX 将浮动放在下一页,即使用 specifier[p!]

%\afterpage{\clearpage}              % No longer needed
\begin{listing}[p!]                  % Force float on next page
\begin{minted}[gobble=2]{python}
  print "Hello, World!"
  #
  # Typically much
  # ... much
  # ... longer listing (like 3/4 of a page)
  #
\end{minted}
\end{listing}

编辑:使用[p!]似乎比强制冲洗更好clearpage,所以我将其保留为答案。

但事实证明,使用[htpb]放置说明符 对所有列表都有效。我认为它在测试中最初不起作用,因为我可能忘记了一个带有说明符的列表[htb],然后它将所有列表推到了末尾。

\begin{listing}[htpb]                % Give all freedom to LaTeX
\begin{minted}[gobble=2]{python}
  # ...
  # ...
  # ...
\end{minted}
\end{listing}

相关内容