Preciso escrever um script elisp
que me avise quando um float aparecer antes da página onde esse float é referido pela primeira vez. Do .aux
arquivo 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 \ref
comando é 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 .tex
arquivos 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 \ref
ao qual se refere e a página "exata" onde as referências aparecem.
Responder1
Isso vai escrever
\ref@page{<key>}{<page>}
no .aux
arquivo 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 \ref
com o rótulo refusage:\therefusage
e extrai a página onde isso ocorre \getpagerefnumber
(contido no refcount
pacote, mas carregado de hyperref
qualquer maneira!)
- Lembre-se de compilar duas vezes para obter as referências cruzadas corretas!
- Não manipule o
refusage
contador!
\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}