正如我读并发现该命令\thepage
并不总是输出正确的页码。
建议的替代方案是使用\pageref{here}\label{here}
。但这似乎太不方便了,因为每次我想要获取当前页面时都必须更改标签,这使得无法用一个简单的新命令来替换它。
PS:最后我想定义一下这个:
\newcommand{\see}[1]{\cref{#1}\ifthenelse{\equal{\pageref{#1}}{\thepage}}{}{ on \cpageref{#1}}}
on \cpageref{#1}
仅当其不是当前页面时才输出该部分。
答案1
您可以\pageref{here}\label{here}
使用例如计数器轻松地将它们组合在一个命令中,以避免使用多个标签:
\documentclass{article}
\newcounter{labelhere}
\makeatletter
\newcommand\pagerefhere{%
\stepcounter{labelhere}%
\pageref{here\thelabelhere}\label{here\thelabelhere}}
\begin{document}
\pagerefhere blub \newpage \pagerefhere bla
\end{document}
答案2
只需加载varioref
在文档正文之前cleveref
使用。有关抑制文本引用的详细信息,请参阅手册第 2.3 节。\vref
varioref
\documentclass{article}
\usepackage{varioref}
\renewcommand\reftextfaceafter{on page~\thevpagerefnum}
\renewcommand\reftextfacebefore{on page~\thevpagerefnum}
\renewcommand\reftextafter{on page~\thevpagerefnum}
\renewcommand\reftextbefore{on page~\thevpagerefnum}
\usepackage{cleveref}
\begin{document}
\section{foo}\label{foo}
\clearpage
\section{bar}\label{bar}
\section{gnu}
See also \vref{foo}.
See also \vref{bar}.
\end{document}
输出(第 2 页):
答案3
根据我的经验,使用几个增强 LaTeX 交叉引用的软件包会导致问题或奇怪的行为。幸运的是,的现代版本varioref
能够完成一些功能cleveref
,并且根据您的确切需求,可能不需要同时使用这两个软件包。
如果您正在寻找单个宏,它将输出“第 1.2 节”、“下一页的第 1.2 节”、“第 14 页的第 1.2 节”、“第 51 页的第 4 章”、“对页上的公式 (2.5)”等,具体取决于参考文献的内容以及放置的\label
位置,这应该足够了。使用\label
\ref
varioref
\usepackage{varioref}
\labelformat{chapter}{chapter~#1}
\labelformat{section}{section~#1}
\labelformat{equation}{equation~(#1)}
在序言中,\vref{label}
将产生上述输出,并且不需要自定义宏。请注意,这\vref
将在引用之前打印一个空格,如果使用\vref*
,则空格将被隐藏。如果您以引用开头一个句子,因此需要将首字母大写,请使用\Vref
。
如果您更喜欢在每个参考文献中使用“在第 11 页”而不是“在下一页”,那么您应该在序言中包含 lockstep 答案中的以下几行。
\renewcommand\reftextfaceafter{on page~\thevpagerefnum}
\renewcommand\reftextfacebefore{on page~\thevpagerefnum}
\renewcommand\reftextafter{on page~\thevpagerefnum}
\renewcommand\reftextbefore{on page~\thevpagerefnum}
cleveref
具有所varioref
缺少的功能,例如引用范围,并且根据cleveref
其作者的说法,应该能够varioref
完全替代。摘自cleveref
手册:
varioref 包的 \labelformat 命令提供的增强引用功能决定了在定义标签时(而不是在引用标签时)如何格式化交叉引用。通常这不是问题。但是,这使得无法根据引用上下文对交叉引用进行不同的格式化,而这有时非常有用。例如,如果您希望句子开头的交叉引用采用除将交叉引用文本的首字母大写以外的任何其他格式,则使用 varioref 是不可能的。例如,您可能想使用缩写“eq.”,但在句子开头恢复为“Equation”(句子开头的单词在英语中不应缩写)。这在 varioref 中是不可能的。也许更重要的是,varioref 的 \labelformat 实现使得无法自动排版多个引用;如果您想引用方程式 eq1 到 eq3,使用 varioref 时,您又得手动输入 Eqs.~(\ref{eq1}) 到~(\ref{eq3})。更不用说错过了其他 cleveref 功能。事实上,cleveref 完全支持 varioref,接管排版交叉引用的责任,同时保留(甚至增强)所有 varioref 页面引用魔法。
我自己还没有使用过这个功能cleveref
,但发现它varioref
更容易使用。