我想直接从 Aux 文件中读取标签的 pageref 信息。似乎每个标签<label>
都有一个\r@<label>
包含所有信息且可访问的宏,例如,可在 中使用\typeout
。但是,我只对页码感兴趣,因此我会使用\pageref{<label>}
。但这在 中不起作用\typeout
。这是我的场景的 MWE,其中使用计数器的值生成标签(已更新):
\documentclass{article}
\usepackage{lipsum,multicol,hyperref}
\makeatletter
\newcounter{mycounter}
\newcommand{\mycommand}{%
\stepcounter{mycounter}
\label{myitems@\themycounter}
\typeout{Processing Item No \themycounter}
\typeout{Label Info From Aux File Is
\csname r@myitems@\themycounter\endcsname}
\typeout{Pageref From Aux File Is
\pageref{myitems@\themycounter}}
}
\makeatother
\begin{document}
\begin{multicols}{2}[\section{Section}]
\mycommand
\lipsum[1-10]
\mycommand
\lipsum[1-5]
\mycommand
\end{multicols}
\end{document}
这将产生输出
ProcessingItemNo1
LabelInfoFromAuxFileIs{1}{1}{Section}{section.1}{}
PagerefFromAuxFileIs\pageref {myitems@1}
[1]
ProcessingItemNo2
LabelInfoFromAuxFileIs{1}{3}{Section}{section.1}{}
PagerefFromAuxFileIs\pageref {myitems@2}
[2]
ProcessingItemNo3
LabelInfoFromAuxFileIs{1}{4}{Section}{section.1}{}
PagerefFromAuxFileIs\pageref {myitems@3}
[3] [4]
因此看起来页面信息在代码的这个位置已经存在了(中的第二个标记\r@<labelname>
),但\pageref
无法生成它。
我的问题是:我如何在代码中的这个位置生成页码(用于\typeout
或其他宏内容)?基本上,我需要一个\tmpa
完全展开的变量,并且只存储从 AUX 文件中恢复的该标签的页码。这可能吗?
编辑: 解决问题后,我发现我的 MWE 不够“最小”,无法隔离实际问题。因此,这里有一个更简单的 MWE,显示了我真正想知道的内容。
\documentclass{article}
\usepackage{lipsum,multicol,hyperref}
\begin{document}
\makeatletter
% this shows that all the info on mylabel (including page number) is available:
\typeout{Label Info From Aux File Is \r@mylabel}
% but this shows that nevertheless, \pageref does not work:
\typeout{Last time, mylabel was on page \pageref{mylabel}}
% this is, then, the solution to my problem, see my answer below:
\typeout{Last time, mylabel was on page \getpagerefnumber{mylabel}}
\makeatother
\begin{multicols}{2}[\section{Section}]
\lipsum[1-10]
\label{mylabel}
\lipsum[1-5]
\end{multicols}
\end{document}
所以,我只是想知道为什么\pageref
在可用的情况下它不起作用\r@mylabel
并存储来自 AUX 文件的所有相关信息。
答案1
页面标签引用值也可以使用 来提取\crtrefpage
,crossreftoolspackage
这是一个可扩展的命令。这里不需要使用expl3
。
\documentclass{article}
\usepackage{lipsum}
\usepackage{multicol}
\usepackage{hyperref}
\usepackage{crossreftools}
\makeatletter
\newcounter{mycounter}
\newcommand{\mycommand}{%
\refstepcounter{mycounter}%
\label{myitems@\themycounter}
\typeout{Processing Item No \themycounter}
\typeout{Label Info From Aux File Is
\csname r@myitems@\themycounter\endcsname}
\typeout{Pageref From Aux File Is \crtrefpage{myitems@\themycounter}}
}
\makeatother
\begin{document}
\begin{multicols}{2}[\section{Section}]
\mycommand
\lipsum[1-10]
\mycommand
\lipsum[1-5]
\mycommand
\end{multicols}
\end{document}
答案2
好吧,我发现有一个简单的解决方案,即使用\getpagerefnumber{myitems@\themycounter}}
而不是\pageref{myitems@\themycounter}}
。