Obtenha a página "exata" de um comando \ref em arquivos .log ou .aux

Obtenha a página "exata" de um comando \ref em arquivos .log ou .aux

Preciso escrever um script elispque me avise quando um float aparecer antes da página onde esse float é referido pela primeira vez. Do .auxarquivo posso extrair o rótulo, o número e o número da página do float. Mas preciso obter a página exata onde cada \refcomando é colocado. Tentei:

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

então, por exemplo, \ref{fig:2}nos .texarquivos imprime:

RefsPagesInLog --> {fig:2} 29

no arquivo de log. Quase funciona, mas às vezes falha. Em muito poucos casos, ele imprime um número de página errado no arquivo de log, então meu script falha.

Existe um truque para atingir o mesmo objetivo?

Os dados de que preciso são o rótulo \refao qual se refere e a página "exata" onde as referências aparecem.

Responder1

Isso vai escrever

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

no .auxarquivo para cada \ref{<key>}comando encontrado no documento.

No caso de exemplo, você obtém

\ref@page{somefigure}{4}

que pode ser lido pelo seu 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}

Responder2

Isso rotula (!) o uso de \refcom o rótulo refusage:\therefusagee extrai a página onde isso ocorre \getpagerefnumber(contido no refcountpacote, mas carregado de hyperrefqualquer maneira!)

  • Lembre-se de compilar duas vezes para obter as referências cruzadas corretas!
  • Não manipule o refusagecontador!

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

informação relacionada