Мне нужно написать скрипт, 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}