如果存在多个相同类型(比如章节)的交叉引用,即使不是连续的,cleveref
's\cref
命令也会使用复数形式压缩引用的标签:例如,\cref{foo2,foo4,foo6}
可以打印:
第2、4和6节
代替:
第 2 节、第 4 节和第 6 节
如果也加载了,则可以通过其命令(由 重新定义)代替 来varioref
添加页码。\vref
cleveref
\cref
但是,“页面”标签未被压缩,如以下 MWE\vref{foo2,foo4,foo6}
打印所示:
第 4 页、第 8 页和第 12 页的第 2、4 和 6 节。
可以预期的是:
第 4、8 和 12 页的第 2、4 和 6 节。
特别是从:
\cpageref
做正确的工作,cleveref
的文档代码声称在重新定义中使用\cpageref
而不是:\vpageref
\vref
由于
\cref
可以处理多个引用,我们将\vref
et al. 的页面引用魔法扩展为使用\cpageref
,并借助\@setvpageref
和\@vpagerefrange
(使用命令排版页面引用varioref
)。前者负责处理多引用,后者负责varioref
页面引用魔法。
你知道发生了什么吗?
\documentclass{article}
\usepackage{multido}
\usepackage{varioref}
\usepackage{cleveref}
%
\newcommand{\test}[1]{%
\section{#1}\label{#1}
\newpage
#1
\newpage
}
%
\begin{document}
\begin{itemize}
\item \verb|\cref{foo2,foo4,foo6}|: \cref{foo2,foo4,foo6}
\item \verb|\vref{foo2,foo4,foo6}|: \vref{foo2,foo4,foo6}
\item \verb|\cpageref{foo2,foo4,foo6}|: \cpageref{foo2,foo4,foo6}
\item \verb|\vpageref{foo2,foo4,foo6}|: \vpageref{foo2,foo4,foo6}
\end{itemize}
\newpage
\multido{\i=1+1}{6}{%
\test{foo\i}
}
\end{document}
答案1
这是由于 的限制varioref
。连续页面引用
是使用 时会压缩varioref
。cleveref
但是,避免在每个页面引用(或页面引用组)之前打印“在第 x 页上”将意味着重写 的大部分内容varioref
。
到那时,cleveref
可能会是替换varioref
而不是接入。也许这有道理。但这不太可能很快发生。