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
とにかく によってロードされます!)
- 相互参照を正しくするために、必ず 2 回コンパイルしてください。
- カウンターを操作しないでください
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}