浮动在被 \referenced 后不久;否则发出警告

浮动在被 \referenced 后不久;否则发出警告

在我的论文中,我有许多浮点数,figure然后我使用 来引用它们\ref。我使用flafter来确保它们在源代码中定义之前不会出现(参见强制浮点数在源文本中出现后进行排版?)。

但是,如果 位于源代码的较早位置,这并不能阻止它出现在\ref指向它的第一个 之前figure。有时我\ref在一个页面上有一个,而图提前几页,这使得它在考官所需的软装本所需的单页布局中出现得很晚(幸运的是,最终的硬板本现在可以是双面的)。

有没有现成的方法可以强制放置figures (也可能是s )table第一个之后\ref,即在同一页的底部还是下一页?同样,这不是这样flafter做的!或者,警告文档作者某个图出现得太早或太晚的方法也足够了。两者都可以避免检查和重新检查figure整个文档中的所有图。

答案1

如果您准备为每个参考文献删除一个额外的标签,您可以通过将源标签的页码(即,图形或表格内的页码)与\ref使用该命令的页面进行比较来自动检测到这种情况。

发布信息的解决方案\ref可能如下所示:

\documentclass{article}

\makeatletter

\def\@getrefpage#1{%
   \ifx #1\relax \maxdimen \else \expandafter\@secondoftwo #1  \fi
}

\newcount\@sourcepage
\newcount\@refpage
\newcount\@refcount

\def\@comparerefpage #1{%
   \global\advance\@refcount\@ne
   \label{cr@\romannumeral\@refcount}%
   \@sourcepage=\expandafter\@getrefpage\csname r@#1\endcsname
   \@refpage=\expandafter\@getrefpage\csname r@cr@\romannumeral\@refcount\endcsname
   \ifnum\@refpage>\@sourcepage
      \typeout{***Warning: source for label  '#1' on page \the\@sourcepage
                      \space < \the\@refpage \space (reference)}%
  \else
      \typeout{***Ok: source for label  '#1' on page \the\@sourcepage
                      \space >= \the\@refpage \space (reference)}%
  \fi
}

\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}@comparerefpage{#1}}

\makeatother

\begin{document}

X\label{a}   X\label{b}

\ref{a}

\newpage

\ref{a}\ref{b}

\end{document}

这将在屏幕和日志中显示以下信息:

***Ok: source for label 'a' on page 1 >= 1 (reference)
[1{c:/texlive/2011/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
***Warning: source for label 'a' on page 1 < 2 (reference)
***Warning: source for label 'b' on page 1 < 2 (reference)

当然,这是一种相当简单的方法,即测试所有引用,而不仅仅是对图或表的引用。如果您想将其限制在某些引用“类”上,您可能需要对标签名称使用一些约定,例如fig:foo,这样您就可以将代码限制为您感兴趣的引用。或者您可以调用\ref类似的东西的重新定义\figref,并在您想要执行此检查时在源代码中使用它。

相关内容