在我的文本中,我使用\vref{<label>}
来自varioref
引用图表和表格的包。在大多数情况下,这种方法效果令人满意。例外情况是,当文本中的一行\vref
出现在行尾附近时,例如,Fig. 1
将其放在一行中并on the next page
转到下一行,其中放置了具有属性的浮动。在这种情况下,如果引用仅位于一行中,则[h]
下一行将为浮动留出足够的空间。如果浮动不放在这里(带有引用的行下方),但始终将其推到下一页,引用将扩展为两行。Fig. 1
Fig. 1
发生这种情况的原因似乎是 的算法varioref
总是假设浮动放置在不同的页面上\vref
。我想知道是否有办法说服varioref
假设浮动将放置在与 相同的页面上,\vref
如果这在第二次(或第三次)运行 latex 时不成立,则\vref
用术语on the next page
或展开on the page <num>
?或者存在具有与 类似功能的等效包varioref
,它可以按我的意愿工作?
暂时我自救,在所描述的情况下编译后,我手动更改\vref
为\ref
。但这是基于猜测的,它违背了 (La)TeX 的“使命”(注意文本布局)。
编辑 MWE(基于 David Carlisle 的回答)显示 varioref 的行为是:
% usual I use memoir package
\documentclass{memoir}
\addtolength\textheight{-35\baselineskip}
\renewcommand{\thefigure}{\thesection-\arabic{figure}}
\usepackage{varioref}
% my shortcuts for referencing
\renewcommand{\fref}[1]{(\figurename~\ref{#1})}
\newcommand{\vfref}[1]{(\figurename~\vref{#1})}
\begin{document}
\setcounter{chapter}{11}
\setcounter{section}{12}
\setcounter{figure}{122}
abc\\abc\\abc\\
aaa aaa aaa aaa aaa aaa aaa aaa aaa aa
% ref produces: \fref{figure}
vref produces: \vfref{figure}
\begin{figure}[h]\centering
\fbox{\parbox[b][5ex][c]{0.5\hsize}{a figure}}
\caption{My figure}
\label{figure}
\end{figure}
\end{document}
如果我取消注释带有“ref”的行,并用“vref”注释行,则图形将出现在与其引用相同的页面上,相反,图形将移动到下一页
答案1
我能重现此问题的唯一方法是在运行之间编辑文件。
\documentclass{article}
\addtolength\textheight{-35\baselineskip}
\usepackage{varioref}
\begin{document}
abc\\abc\\abc\\abc%\\ABC
aaa aaaa aaaa aaa aaa
aaa aaaa aaaa aaa aaa
vref produces: Figure \vref{zz}.
aaaa\\zzz
\begin{figure}[ht]
\fbox{XXXX}
\caption{fff\label{zz}}
\end{figure}
bbb
\end{document}
如果取消注释 ABC,图形将转到第 2 页,如第一幅图所示,varioref 会拾取它并添加“在下一页”,如果您随后注释掉 varioref,\\ABC
则不会注意到图形现在仅在下一页,因为它添加了文本,因此它会继续添加它,如第二幅图所示。
但是,如果您删除该.aux
文件并再运行两次 latex,varioref
则会使用同一页面引用计算新图形位置的所有内容。
因此,为确保万无一失,在编辑之后,请.aux
在运行 latex 之前删除所有旧文件,直到引用稳定为止。
答案2
在特殊情况下确实有可能varioref
产生次优结果,但您的 MWE 实际上不是这种情况的例子。如果您在没有任何.aux
文件的情况下运行此 MWE,则一切都会正常,即您首先得到
如果你重新运行(按要求),你会得到最好的结果,即
基本上,你一varioref
开始就假设浮动元素放在“不同”的页面上,这种假设是错误的。相反,它一开始对浮动元素一无所知,结果只是产生了著名的??作为参考。这“几乎”是它能达到的最短的了。因此,真正的参考通常会更长。
所以简而言之,除非您确实编辑内容并从.aux
代表 2 页情况的现有内容开始,否则您的 MWE 无法产生您所描述的问题。
现在存在的危险是,真正的参考甚至比??生成一个仅显示单个的未知引用可能会更好?,但这有其他问题,因为它在校对时并不突出。因此,有些情况下(概率很小)可能会导致次优解决方案。
还有一些方法涉及多个引用,导致将文本移动到不同位置。我想到的是这个:
\documentclass{article}
\usepackage{varioref}
\setlength\textheight{9.8\baselineskip}
\setlength\textwidth{2.9cm}
\begin{document}
\section{Foo}
In theory this document could come out with 2 pages only. But the
delayed processing makes it 3.
Ref to fig1: \vref{fig1}. % this pushes things out
So test again to see \vref{fig1} and and we also reference
figure two: \vref{fig2}
\begin{figure}[t]
\caption{fig1}\label{fig1}
\end{figure}
\begin{figure}[h]
This one is bigger
\caption{fig2}\label{fig2}
\end{figure}
\end{document}
如果你运行这个并查看第 2 页,你会看到
也就是说,前 2 个参考文献完全在第 1 页上(因为它们很短,即??)。
下一次,无论我们得到什么
因为第一次引用会将内容向下推。更糟糕的是,上次对图 1 的引用在第 1 页,所以现在添加了字符串“在下一页”(这本来是正确的,但现在是错误的)。这些额外的材料将图 2(暂时)推到第 3 页。
下一次对图 1 的引用就会得到更正(并且字符串“在下一页”消失),但是现在对图 2 的引用知道该图在第 3 页,因此这次它添加了“在下一页”,这占用了刚刚释放的空间:
现在,这既正确又稳定(但不幸的是,这不是最佳的)。基本上,这是一个局部最优,而不是全局最优,但我担心这只是算法的本质,不是你能轻松解决的(如果有的话)。
毕竟:
- 生成的文本长度随目标的位置呈非线性变化
- 这反过来可能会改变生成的文本(因为目标位置被插入的生成文本改变
- 因此,您会遇到这样的情况:两个调用都可以移动(任何后续的调用都会受到之前生成的文本的影响),但回调关系又会影响需要生成文本的内容。
因此,局部最大值似乎是您所能期望的最好的结果,事实上生成“不可能”的文档并不太困难,即,以始终错误的方式变化的文档。