有时会出现无法编译文档的情况,因为 varioref 包会导致循环。这是一个 MWE,它不会导致无限循环,但它演示了这个问题(使用 TeX Live 2012 测试)
\documentclass[12pt]{article}
\usepackage{blindtext,varioref}
\begin{document}
\blindtext[3]
These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for demonstration purposes. These words are only for ... See table \vref{tab:example}
\begin{table}[htbp]
\centering
\begin{tabular}{l}
Test\\
\end{tabular}
\caption{Example Table}
\label{tab:example}
\end{table}
\blindtext
\end{document}
这个问题有可靠的解决方案吗?我知道,删除一个词或用替换会\vref
有所\ref
帮助,但这不是一个解决方案(就我而言)。
答案1
简而言之:唯一的解决方案是:
重新措辞句子或使用\ref
或\pageref
。
稍微长一点:此错误消息通知您创建的引用超出了当前页面,并且varioref
不知道应该将其计入第 x 页还是第 x+1 页。如果引用位于第 x 页,则引用的文本将计算为“此页面”或“前一页”。如果引用位于第 x+1 页,则应为“前一页”或“前两页”。如果引用位于两页,则varioref
无法精确计算。
要消除此错误,唯一的方法是重新措辞句子,以便引用保留在页面上或使用宏\ref
和/或\pageref
构建有效的引用。
答案2
正如这个答案问题是为边界情况提供令人满意的自动解决方案,例如,如果源包含see the remark \vpageref{example}
并且由其生成的文本\vpageref
恰好落在分页符上。
如果varioref
假设当前页面,那么你最终会得到类似
see the remark on <next page>
the current page ...
这显然是错误的,
see the remark on <next page>
the previous page ...
可以。另一方面,如果中断稍晚一点,第二个解决方案也会出错:
see the remark on the previous <next page>
page ...
摆脱困境的一个方法是告诉varioref
使用\reftextfaraway
,所以我们最终会得到
see the remark on <next page>
page 3 ...
这种方法的问题在于,生成的文本\reftextfaraway
通常比生成的文本短\reftextcurrent
,例如
see the remark on page 3
see the remark on the current page
其结果是,您可能会陷入一个循环,文档在两种状态之间摇摆不定,而两种状态都是“错误的”。
在我看来,在 TeX 中检测循环几乎是不可能的(尽管有上述评论)。对于简单的循环(只有两个状态),是的(理论上),但实际上,你可能会得到在 3 个或更多状态之间振荡的更高级别的循环,然后它会变得非常非常复杂。这里的问题是自动生成的文本是非线性的,例如,在每次迭代中,文档可能会在某些地方变长,而在其他地方变短。
一个解决方法是,一旦引用落到分页符上,就冻结该\reftextfarway
方法,并且永远不会回头并在下一次运行时重新评估。这样做的缺点是显而易见的:如果你运气不好,你最终会得到一些看起来有些奇怪的引用,比如以数字形式给出的当前页面的页面引用。至少,这种方法应该在生成目录等内容后才开始,而安全地做到这一点并不容易(简而言之,对于复杂的文档,即使运行 5-6 次也不足以稳定下来,这一点尚不清楚)。
答案3
如果你仍在编写文档,并且想要快速编译它,一个简单的解决方法是,添加\vrefwarning
你的序言,如包文档第 5 页。