取得 .log 或 .aux 檔案中 \ref 指令的「精確」頁面

取得 .log 或 .aux 檔案中 \ref 指令的「精確」頁面

我需要編寫一個腳本,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}

相關內容