智能的 `\vref`

智能的 `\vref`

我想使用包varioref,但使用缩写... (p.1)而不是... on page 1。不幸的是,我在括号中也有引用,这会导致不美观/禁止(?)双重右括号。

我尝试用它\@ifnextchar来识别这种情况,但似乎不起作用。

这是一个简单的例子:

\documentclass[]{article}
\usepackage{varioref}
\usepackage{cleveref}
\usepackage[english]{babel}

\makeatletter
\addto\extrasenglish{%
     \def\reftextfaraway#1{\@ifnextchar){on p.~\pageref{#1}}{(p.~\pageref{#1})}}%
}
\makeatother

\begin{document}
In \vref{sec:test}, this is explained.
Other text (cf.\ \vref{sec:test}).

\newpage
\null\newpage
\section{Test}
\label{sec:test}
\end{document}

预期输出:

在第 1 章(第 3 页)中对此进行了解释。其他文本(参见第 1 章第 3 页)。

电流输出:

在第 1 章(第 3 页)中对此进行了解释。其他文本(参见第 1 章(第 3 页))。

答案1

在这里我保存了 的定义\vref,然后用两个参数重新定义它。我检查第二个参数是否为 a)\reftextfaraway相应地重新定义。然后我使用第一个参数调用 的已保存版本\vref并自由传递第二个参数。

\documentclass[]{article}
\usepackage{varioref}
\usepackage{cleveref}
%\usepackage[english]{babel}

\let\svvref\vref
\makeatletter
%\addto\extrasenglish{%
     \renewcommand\vref[2]{%
       \ifx)#2%
         \renewcommand*{\reftextfaraway}[1]{on p.~\pageref{#1}}%
       \else
         \renewcommand*{\reftextfaraway}[1]{(p.~\pageref{#1})}%
       \fi
     \svvref{#1}#2%
     }%
%}
\makeatother

\begin{document}
In \vref{sec:test}, this is explained.
Other text (cf.\ \vref{sec:test}).

\newpage
\null\newpage
\section{Test}
\label{sec:test}
\end{document}

在此处输入图片描述

相关内容