我需要编写一个脚本,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
这标记了标签的使用情况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}