Obtenga la página "exacta" de un comando \ref en archivos .log o .aux

Obtenga la página "exacta" de un comando \ref en archivos .log o .aux

Necesito escribir un script elispque me avise cuando aparece un flotante antes de la página a la que se hace referencia por primera vez. Del .auxarchivo puedo extraer la etiqueta, el número y el número de página del flotador. Pero necesito obtener la página exacta donde \refse coloca cada comando. Lo intenté:

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

entonces, por ejemplo, \ref{fig:2}en los .texarchivos se imprime:

RefsPagesInLog --> {fig:2} 29

en el archivo de registro. Casi funciona pero a veces falla. En muy pocos casos, imprime un número de página incorrecto en el archivo de registro, por lo que mi secuencia de comandos falla.

¿Existe algún truco para lograr el mismo objetivo?

Los datos que necesito son la etiqueta \refa la que hace referencia y la página "exacta" donde aparecen las referencias.

Respuesta1

esto escribirá

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

en el .auxarchivo para cada \ref{<key>}comando que se encuentra en el documento.

En el caso de ejemplo, obtienes

\ref@page{somefigure}{4}

que puede ser leído por su script externo.

\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}

Respuesta2

Esto etiqueta (!) el uso de \refcon la etiqueta refusage:\therefusagey extrae la página donde ocurre esto \getpagerefnumber(contenida en refcountel paquete, ¡pero cargada de hyperreftodos modos!)

  • ¡Recuerde compilar dos veces para obtener las referencias cruzadas correctas!
  • ¡No manipules el refusagemostrador!

\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}

información relacionada