许多人问过如何定位浮动引用,以便浮动出现在第一个引用附近(请注意,脚注也存在类似但不太常见的问题,如“脚注被推至浮动页面之后。“)。我希望有一个自动化的工具来识别潜在的问题浮动和脚注。
在小型文档中,识别和修复任何有问题的引用相对容易,但在大型文档(例如论文或书籍)中,校对工作量很大,问题可能在经过轻微编辑后发生很大变化。在极端情况下,在章节开头添加一个句子或一个段落可能会影响整个章节的浮动位置 - 我不想在每次编辑后重复费力的校对过程。
我正在设想一个 PDF 工具,它可以输出一份可能存在问题的放置列表,以供人工审核。例如“表 2.3 位于第一次引用后 3 页”、“第 4 章中的脚注 3 位于引用后 2 页”。
此类工具可能使用 hyperref 包生成的 PDF 超链接来跟踪文档中的引用。或者(更简单),是否有一个 pdflatex 选项,用于在将浮动或脚注放置在距离第一个引用超过 x 页的位置时输出警告?
更新:我使用 iText 库为自己构建了一个简单的工具,但它还很初级,而且我仍然对更复杂的校对工具感兴趣。
答案1
如果第一个引用的页面与被引用的页面不相等,则会发出警告
它使
first ref {f2} on page 2 -> page 3
first ref {f5} on page 2 -> page 8
您可以通过多种方式进行修改,例如在此处更改相等性测试
\ifnum#2=#3\relax\else
到某物测试距离例如
\ifnum#2>\numexpr#3+5\relax
仅当超出 5 页以上时才发出警告。
如果你使用非整数页码(例如罗马数字),则需要一些额外的代码来确保它们的\ifnum
安全,如果你使用 hyperref,则内部 ref 结构中有 4 个字段,而不是 2 个字段,因此
\@secondoftwo\csname r@#1\endcsname\@empty\@empty
可能需要
\@secondoffour\csname r@#1\endcsname\@empty\@empty\@empty\@empty
\documentclass{article}
\setlength\textwidth{.5\textwidth}
\setlength\textheight{20\baselineskip}
\def\a{One two three four five six. }
\def\b{Red yellow. \a Green blue black white \a\a}
\def\c{Something \stepcounter{enumi} \roman{enumi} \a\b\a\b\par}
\def\d{\c\c\[\frac{\theenumi}{x}\]\a\a}
\def\f#1#2{%
\begin{figure}[#1]
\centering FFF\\FFF \caption{fff\label{#2}}
\end{figure}}
\let\oldref\ref
\makeatletter
\def\ref#1{%
\expandafter\ifx\csname first@#1\endcsname\relax
\global\expandafter\let\csname first@#1\endcsname\@empty
\protected@write\@auxout{}{\protect\refcheck
{#1}%
{\expandafter\expandafter\expandafter
\@secondoftwo\csname r@#1\endcsname\@empty\@empty}%
{\thepage}}%
\fi
\oldref{#1}}
\def\refcheck#1#2#3{%
\ifx\\#2\\\else
\ifnum#2=#3\relax\else
\typeout{first ref {#1} on page #3 -> page #2}%
\fi
\fi}
\begin{document}
\d
aaa\ref{f1} and \ref{f2} and \ref{f5}
\f{h}{f1}
\f{t}{f2}
\d
bbb \ref{f5} again
\f{t}{f3}
\f{H}{f4}% end of document
\f{t}{f5}
\d\d\d
\end{document}