浮动环境位于其第一个引用页面之前或之上

浮动环境位于其第一个引用页面之前或之上

我知道,这是一个老话题,我已经了解了 LaTeX 中浮动环境的一般功能。我想给它尽可能多的自由,并且总体上喜欢放置浮动的方式。

但我在写论文时有一个限制:图表必须放在第一个参考文献的页码之前或页码上。例如,我在第 3 页上有对图 1 的引用,那么图表可以放在第 1、2 或 3 页,但不能放在 >=4 页。

我知道 LaTeX 永远不会将浮动元素放置在源代码中第一次出现的位置之前,因此在源代码中,浮动元素必须位于引用之前。但我如何控制它不会移动到太远的末尾?将所有浮动元素都放在节的开头是没有意义的,因为其中一些会放置得太早。

我希望你能帮助我解决这个问题。

非常感谢。

答案1

浮动行为和交换非常复杂。我的建议是像平常一样布局文档,而不考虑您提到的任何要求\label\ref然后,最后再担心可能会改变布局。

我的建议是利用它\ref并让它告诉你它\label引用的是出现在当前位置之前还是之后。下面我重新定义了\ref如果它不符合你的限制,就会发出警告 - 你可以在编译结束时轻松检查。由于建议的解决方案使用\label-\ref系统本身,你可能必须在第一次编译时至少编译两次。

这是一个可以调整的最小示例:

\documentclass{article}

\usepackage{lipsum,graphicx,refcount}

\makeatletter
\setrefcountdefault{99999}
\let\oldref\ref
\renewcommand{\ref}[1]{%
  \label{#1*}%
  \ifnum\getpagerefnumber{#1*}<\getpagerefnumber{#1}% \ref on page < \label
    \@latex@warning{...figure `#1' is on page \getpagerefnumber{#1},
      but referenced on \getpagerefnumber{#1*}}%
  \fi
  \oldref{#1}%
}
\makeatother

\begin{document}

\sloppy% Just for this example

\tableofcontents

\listoffigures

\section{A section}

\lipsum[1-50]

Figure~\ref{fig:first}. % This is fine...
Figure~\ref{fig:second}.% ...but this creates a warning.

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:first}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:second}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:third}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:fourth}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:fifth}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:sixth}
\end{figure}

\lipsum[1-50]

\begin{figure}[ht]
  \centering\includegraphics[width=.5\linewidth]{example-image}
  \caption{A figure}\label{fig:seventh}
\end{figure}

Figure~\ref{fig:sixth}.  % This is fine...
Figure~\ref{fig:seventh}.% ...but this is not, as the figure was pushed to the following page.
\end{document}

输出.log(某处):

LaTeX 警告:...图“fig:second”位于第 20 页,但在第 10 页被引用
放第 31 行。

通过警告,您可以识别所使用的标签、相应的页码(和\label\ref以及输入文件中的行。

在上面的例子中,第一个 s 和后续的\refs之间应该没有区别。\label

相关内容