Necesito escribir un script elisp
que me avise cuando aparece un flotante antes de la página a la que se hace referencia por primera vez. Del .aux
archivo puedo extraer la etiqueta, el número y el número de página del flotador. Pero necesito obtener la página exacta donde \ref
se 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 .tex
archivos 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 \ref
a la que hace referencia y la página "exacta" donde aparecen las referencias.
Respuesta1
esto escribirá
\ref@page{<key>}{<page>}
en el .aux
archivo 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 \ref
con la etiqueta refusage:\therefusage
y extrae la página donde ocurre esto \getpagerefnumber
(contenida en refcount
el paquete, ¡pero cargada de hyperref
todos modos!)
- ¡Recuerde compilar dos veces para obtener las referencias cruzadas correctas!
- ¡No manipules el
refusage
mostrador!
\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}