如何从 AUX 文件获取标签 pageref?

如何从 AUX 文件获取标签 pageref?

我想直接从 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

页面标签引用值也可以使用 来提取\crtrefpagecrossreftoolspackage这是一个可扩展的命令。这里不需要使用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}}

相关内容