Получить «точную» страницу команды \ref в файлах .log или .aux

Получить «точную» страницу команды \ref в файлах .log или .aux

Мне нужно написать скрипт, elispкоторый предупреждает меня, когда плавающий элемент появляется перед страницей, на которой этот плавающий элемент впервые упоминается..aux я могу извлечь метку, номер и номер страницы float. Но мне нужно получить точную страницу, на которой \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}

Связанный контент