放置 varioref 引用的浮点数

放置 varioref 引用的浮点数

在我的文本中,我使用\vref{<label>}来自varioref引用图表和表格的包。在大多数情况下,这种方法效果令人满意。例外情况是,当文本中的一行\vref出现在行尾附近时,例如,Fig. 1将其放在一行中并on the next page转到下一行,其中放置了具有属性的浮动。在这种情况下,如果引用仅位于一行中,则[h]下一行将为浮动留出足够的空间。如果浮动不放在这里(带有引用的行下方),但始终将其推到下一页,引用将扩展为两行。Fig. 1Fig. 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 页,因此这次它添加了“在下一页”,这占用了刚刚释放的空间:

在此处输入图片描述

现在,这既正确又稳定(但不幸的是,这不是最佳的)。基本上,这是一个局部最优,而不是全局最优,但我担心这只是算法的本质,不是你能轻松解决的(如果有的话)。

毕竟:

  • 生成的文本长度随目标的位置呈非线性变化
  • 这反过来可能会改变生成的文本(因为目标位置被插入的生成文本改变
  • 因此,您会遇到这样的情况:两个调用都可以移动(任何后续的调用都会受到之前生成的文本的影响),但回调关系又会影响需要生成文本的内容。

因此,局部最大值似乎是您所能期望的最好的结果,事实上生成“不可能”的文档并不太困难,即,以始终错误的方式变化的文档。

相关内容