来自 \includegraphics 的图像出现在错误的位置?

来自 \includegraphics 的图像出现在错误的位置?

我有以下情况:

\subsection{Some subsection}
Some text here...
\\
\begin{figure}
    \caption{Raw}
\includegraphics[scale=0.25]{raw.png}
\end{figure}
\begin{figure}
    \caption{Median}
\includegraphics[scale=0.25]{median.png}
\end{figure}
\begin{figure}
    \caption{Data}
\includegraphics[scale=0.25]{data.png}
\end{figure}
\\

\section{New section}
New section starts here...

出于某种原因,前 2 张图片显示在子部分开始之前(位于其标题上方),而第 3 张图片显示在下一个全新部分(全新页面)的中间句子中!这是怎么回事?为什么会发生这种情况?我该如何解决?

答案1

在 LaTeX 文档中,图像和表格等元素被称为“浮动元素”,因为它们可以自由浮动——甚至跨越章节和页面边界。发生这种情况的原因是 TeX 引擎正在尝试确定将文档分成行、段落和页面的“最佳”方式,以便最终结果尽可能好。如果 TeX 可以自由地推动浮动元素等大型对象,它可以为整个文档做出更好的决策。

不幸的是,作为一名文档作者,你对“最佳”外观的想法通常与 TeX 的决定大相径庭。以下是我解决这种情况的三步方案:

1. 等待草稿完成


当您向文档中添加大量内容时,浮动会跳到各处,因为分页算法每次运行时都会计算出新结果。在此阶段尝试“将数字放到其位置”只会造成很大的压力和浪费时间。只需专注于编写文档的内容,等到草稿成型时,您会发现 80% 的时间 TeX 在定位浮动方面做得非常出色,您无需做任何其他事情。

2. 为 TeX 提供一些指导


当草稿准备好并且您正在纠正拼写错误等时,您可能会注意到奇怪的浮动位置不太好。在这些情况下,您可以通过在 `\begin{figure/table/whatever} 中包含可选参数来为 TeX 提供一些有关如何处理定位的有用提示。以下是使用图形的示例:

I would prefer that \autoref{fig:example} be placed right after this paragraph.
If that is not possible, I would like it at the the top of a page.

\begin{figure}[ht]
  \label{fig:example}
\end{figure}

图形定义使用“浮动说明符”来h告诉 TeX 尽量将图形保持在输入中出现的位置附近,而不是前后几个段落。下一个说明符t是一个后备说明符,它告诉 TeX 如果图形浮动得太远,则将图形放置在页面顶部。

以下是另一个使用表格的示例:

I really, really want \autoref{tab:example} be placed right after this
paragraph. If that is not possible, I would like it at the the bottom 
of a page.

\begin{table}[!hb]
  \label{tab:example}
\end{table}

在上面的例子中,添加了一个感叹号,强烈暗示 TeX 尝试将图形放置在输入中出现的位置。它还让 TeX 知道,为了满足这一要求,可以打破一些排版规则。浮动说明符b再次用作后备——这意味着如果图形浮动得太远,则将其放置在页面底部。

最后一个浮点说明符是可以使用的p,这意味着如果浮点移动得太远,它应该被收集到一个“浮点页面”中,该页面只包含杂散浮点,并在 TeX 认为方便时插入。我不p经常使用它。

3. 告诉 TeX 你想要它如何完成


在大多数情况下,遵循步骤 1 和 2 会给你带来良好的结果。对于那些无论如何都会出现在混乱位置的少数浮动,我使用两种技巧来固定它们。第一种技巧是我用来处理一堆浮动,它们加起来占据了整个页面或更多。它涉及将它们分组到单独的页面上,就像说明符一样p,但可以让我更好地控制:

The graphs in \autoref{fig:graph1} and \autoref{fig:graph2} are quite
large, so they are shown on the next page.

\newpage
\vfill

\begin{figure}
  \label{fig:graph1}
\end{figure}

\begin{figure}
  \label{fig:graph2}
\end{figure}

\vfill
\clearpage

重要的是\clearpage--- 它形成了一个浮动元素无法跨越的分页符,从而有效地将两个图形限制在它们自己的页面上。这些\vfill命令用于垂直居中内容。我使用的第二个技巧是float提供H浮动说明符的包:

\autoref{tab:example} absolutely, positively MUST occur after this sentence.

\begin{table}[H]
  \label{tab:example}
\end{table}

标记浮动元素可H有效地使它们停止浮动,并表现得像相当大的“单词”。TeX 无法再移动它们,就像它无法重新排列句子中的单词一样。如果您发现自己首先要H考虑是否还有其他方法可以做,例如减小浮动元素的大小,将其移动到附录等,因为这H确实是最后的武器。

答案2

首先要尝试的是将位置说明符与环境一起放置float。格式为

\begin{figure}[position specifier]
    %stuff to place in the figure
\end{figure}

位置说明符的有效选项是:

h:大约在这里

t:页面顶部

b:页面底部

p:在仅有浮动的页面上。

!: 强调说明符 -->h!表示“确实在这里”

还有其他选项,但它们需要float包。

所以你可能想尝试

\begin{figure}[h]
    \caption{Raw}
\includegraphics[scale=0.25]{raw.png}
\end{figure}

答案3

对于使用 XeLaTex 的人来说,最好使用\usepackage{float}并将其[H]作为图形的选项。

相关内容