在 .log 或 .aux 文件中获取 \ref 命令的“精确”页面

在 .log 或 .aux 文件中获取 \ref 命令的“精确”页面

我需要编写一个脚本,elisp当浮动出现在该浮动首次引用的页面之前时,它会发出警告。从文件中.aux提取浮动的标签、编号和页码。但我需要获取每个\ref命令所在的确切页面。我试过:

\AtBeginDocument{\hypersetup{pageanchor=false}
\let\oldref\ref
\renewcommand{\ref}[1]{{\oldref{#1}\typeout{RefsPagesInLog --> {#1} \thepage}}}

例如,\ref{fig:2}.tex文件中打印:

RefsPagesInLog --> {fig:2} 29

在日志文件中。它几乎可以正常工作,但有时会失败。在极少数情况下,它会在日志文件中打印错误的页码,所以我的脚本失败了。

有什么技巧可以达到同样的目的吗?

我需要的数据是标签\ref所指的数据,以及引用出现的“确切”页面。

答案1

这将写

\ref@page{<key>}{<page>}

在文件中找到的.aux每个命令的文件。\ref{<key>}

在示例中,你得到

\ref@page{somefigure}{4}

可以被你的外部脚本读取。

\documentclass{article}

\usepackage{blindtext}

\usepackage{etoolbox}    
\usepackage{hyperref}

\makeatletter
\AtBeginDocument{%
  \renewcommand{\NR@setref}[1]{%
    \ref@page@write{#1}%
    \begingroup\@safe@activestrue\expandafter\endgroup
    \expandafter\NR@@setref\csname r@#1\endcsname
  }%
}
\newcommand{\ref@page@write}[1]{%
  \protected@write\@auxout{}{\string\ref@page{#1}{\thepage}}%
}
\newcommand{\ref@page}[2]{}
\makeatother

\begin{document}

\blindtext[10]

\clearpage

\ref{somefigure}

\section{First section}\label{firstsec}

\blindtext[50]


\begin{figure}
  \caption{Some figure}\label{somefigure}
\end{figure}

\blindtext[50]

\section{Second section}\label{secondsec}

\end{document}

答案2

\ref这标记了标签的使用情况refusage:\therefusage并提取出现这种情况的页面\getpagerefnumber(包含在refcount包中,但hyperref无论如何都加载!)

  • 请记住编译两次以确保交叉引用正确!
  • 请勿操纵refusage计数器!

\documentclass{article}

\usepackage{etoolbox}    
\usepackage{hyperref}

\newcounter{refusage}

\AtBeginDocument{\hypersetup{pageanchor=false}
\let\oldref\ref
\renewcommand{\ref}[1]{{\refstepcounter{refusage}\label{refusage:\therefusage}\oldref{#1}\typeout{RefsPagesInLog --> {#1} \getpagerefnumber{refusage:\therefusage}}}}
\robustify\ref
}

\usepackage{blindtext}

\begin{document}

\blindtext[10]

\clearpage

\ref{somefigure}

\section{First section}\label{firstsec}

\blindtext[50]


\begin{figure}
  \caption{Some figure}\label{somefigure}
\end{figure}

\blindtext[50]


\section{Second section}\label{secondsec}




\end{document}

相关内容