我需要編寫一個腳本,elisp
當浮動出現在首次引用該浮動的頁面之前時發出警告。從.aux
文件中我可以提取浮動的標籤、編號和頁碼。但我需要取得每個\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
這會標記(!) with 標籤的用法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}