Varioref 和上一页

Varioref 和上一页

具有以下 MWE:

\documentclass{article}

\usepackage{thmtools}
\usepackage{varioref}
\usepackage{cleveref}

\declaretheorem[name=Lemma,Refname={Lemma,Lemmas}]{lem}

\begin{document}

\begin{lem}\label{lem1}
    A lemma.
\end{lem}

\clearpage

\begin{lem}\label{lem2}
    A lemma.
\end{lem}

\begin{lem}\label{lem3}
    A lemma.
\end{lem}

\Vref{lem1}, \Vref{lem2} and \Vref{lem3}.

\end{document}

Varioref 产生:第 1 页的引理 1,引理 2 和引理 3。我期望的是:上一页的引理 1,引理 2 和引理 3。

是不是只有我不明白 varioref,或者是否有其他选择可以获得第二种行为?

答案1

你理解varioref的没错,但cleveref覆盖了它的一些功能,这是不正确的。这是%在每行末尾添加字符的典型情况,在某些情况下,这只是错误的

该软件包修改了包含以下行cleveref的命令\@@vpageref

    \advance\@tempcnta-2
    \ifnum \thevpagerefnum =\@tempcnta

重新定义后,它变成了

    \advance\@tempcnta-2%                 <--- wrong %
    \ifnum \thevpagerefnum =\@tempcnta%

因此,TeX 在扩展数字的\ifnum同时仍然寻找数字的结束,-2...而不是先减去 2\@tempcnta然后进行测试。

换句话说:盲目地%在定义中添加每一行的结尾可能会有害(下一行的结尾也是无用的,但没有危害)。

所以最好的解决办法是cleveref纠正。短期解决方案:你可以像这样重新修补它:

\usepackage{etoolbox}
\makeatletter
\patchcmd\cref@old@@vpageref
{\advance\@tempcnta-2}
{\advance\@tempcnta-2 }{\typeout{patch ok}}{\ERRORpatchFaild}
\makeatother

答案2

呃。我想前段时间我厌倦了追踪 中的虚假空格错误cleveref,并通过 sed 运行源代码以在所有行的末尾添加 %。这很愚蠢。但是,TeX 的空白处理也是如此。

@Frank Mittelbach:感谢您花时间跟踪此问题。这个问题应该已在 0.19.3 版中修复。网站。至少这个问题中的 MWE 是有效的。经过更多测试后,我将上传到 CTAN。(我添加了\relax而不是删除%,因为如果将来出现更多虚假空格,它可以稍微更容易地追踪虚假空格。)

但我担心可能还存在其他类似的错误cleveref

相关内容