在我的论文中,我有许多浮点数,figure
然后我使用 来引用它们\ref
。我使用flafter
来确保它们在源代码中定义之前不会出现(参见强制浮点数在源文本中出现后进行排版?)。
但是,如果 位于源代码的较早位置,这并不能阻止它出现在\ref
指向它的第一个 之前figure
。有时我\ref
在一个页面上有一个,而图二提前几页,这使得它在考官所需的软装本所需的单页布局中出现得很晚(幸运的是,最终的硬板本现在可以是双面的)。
有没有现成的方法可以强制放置figure
s (也可能是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
,并在您想要执行此检查时在源代码中使用它。