如何将 cleveref 引用更改为“verbal”varioref 样式?

如何将 cleveref 引用更改为“verbal”varioref 样式?

我想使用cleveref自动引用目标类型识别,但更口头页面引用varioref。这是我的 MWE:

\documentclass{report}
\usepackage{varioref}       
%\usepackage{cleveref}     % note cleveref package changes type of ref..
                           % and style of references to last/next page
\begin{document}

        % This figure appears on page 1.
        \begin{figure}[!htb]
          \centering
          \rule{24pt}{24pt}
          \caption{The famous black square}
          \label{OneBlackSquare}
        \end{figure}

        % This sentence appears on page 2.
        \clearpage
        The non-color black is shown in \vref{OneBlackSquare}.

\end{document}

当使用该包时,它会产生一个很好的阅读口头参考varioref

varioref 口头描述

唯一缺少的是自动目标类型。启用该cleveref包会添加这个非常好的功能,但也会覆盖 的所有口头行为varioref。无论目标空间如何,所有引用都按页码而不是“下一页”定位。

cleveref 自动类型识别

但是我怎样才能将它们结合起来得到:

  1. 自动目标类型如图形或方程式cleveref
  2. 如果目标位于最后一页/下一页,是否需要对其位置进行口头描述以提高读者的阅读流畅度?

一周后编辑:我没有收到任何解决方案,而且两份文档都无法解决我的问题。因此我坚持varioref并在文本中硬编码了浮动对象的类型。

答案1

一个很棒的错误! cleveref 包中缺少一个空格字符。第 2337 行当前内容为:

        \advance\@tempcnta-2%

但应为:

        \advance\@tempcnta-2 %

是的,就是那个空格字符(参见TeX 计数和 LaTeX 计数器之间有什么区别?)。

我已经通知了 Toby Cubitt,但是现在您可以本地修复您的软件包源,或者按如下方式覆盖序言中的更改:

\documentclass{report}
\usepackage{varioref}    
\usepackage{cleveref}

\makeatletter
\def\cref@old@@vpageref#1[#2]#3{%
    \leavevmode%\unskip  <<<
    \global\advance\c@vrcnt\@ne%
    \vref@pagenum\@tempa{\the\c@vrcnt @vr}%
    \vref@pagenum\@tempb{\the\c@vrcnt @xvr}%
    %\vref@label{\the\c@vrcnt @xvr}%  <<<
    \ifx\@tempa\@tempb\else%
      \vref@err{\noexpand\vref or \noexpand\vpageref at page boundary
                \@tempb-\@tempa\space (may loop)%
                }%
    \fi%
    \vrefpagenum\thevpagerefnum{#3}%
    \vref@space%
    \ifx\@tempa\thevpagerefnum%
      \def\@tempc{#1}%
      \ifx\@tempc\@empty%
         \unskip%
      \else%
         #1%
      \fi%
    \else%
      #2%
      \is@pos@number\thevpagerefnum%
         {%
          \is@pos@number\@tempa%
           {\@tempcnta\@tempa%
            \advance\@tempcnta\@ne%
           }%
           {\@tempcnta\maxdimen}%
          \ifnum \thevpagerefnum =\@tempcnta%
           \ifodd\@tempcnta%
             \if@twoside%
               \reftextfaceafter%
             \else%
               \reftextafter%
             \fi%
           \else%
             \reftextafter%
           \fi%
          \else%
            \advance\@tempcnta-2 %  <--- there was a space missing here!
            \ifnum \thevpagerefnum =\@tempcnta%
              \ifodd\@tempcnta%
                \reftextbefore%
              \else%
                \if@twoside%
                  \reftextfacebefore%
                \else%
                  \reftextbefore%
                \fi%
              \fi%
            \else%
              \reftextfaraway{#3}%
            \fi%
          \fi%
         }%
         {\reftextfaraway{#3}}%
    \fi%
    \vref@label{\the\c@vrcnt @xvr}%  <<<
    \vref@label{\the\c@vrcnt @vr}%
  }%
\makeatother

\begin{document}

        % This figure appears on page 1.
        \begin{figure}[!htb]
          \centering
          \rule{24pt}{24pt}
          \caption{The famous black square}
          \label{OneBlackSquare}
        \end{figure}

        % This sentence appears on page 2.
        \clearpage
        The non-color black is shown in \vref{OneBlackSquare}.

\end{document}

这给出了预期的结果:

The non-color black is shown in Fig. 1 on the preceding page.

答案2

就像是:

\newcommand{\refthing}[1]{\cref{#1}, \vpagerefnearby{#1}{\vpageref{#1}}{\cpageref{#1}}}

应该这么做。

相关内容