如果文本中提到了一个图形,比如第 10 页,但相应的图形出现在第 11 页,我该如何在文本中提到的图形旁边自动引入一些额外的文本(例如:在第 11 页)。
不要这样做:
Figure \ref{fig:test} on page \pageref{fig:test} shows bla bla.
自动检查:
Figure \\ref{fig:test} \check shows bla bla.
哪里\check
是一个宏,用于检查图形引用和图形(浮动)是否共存,以及它们是否在同一页面上。如果为真,则返回 Null,否则返回on page \pageref{fig:test}
。
答案1
考虑使用varioref
包裹及其\vpageref
命令来引用与另一个相关联的页面\label
。它会检查引用是否在同一页上。如果是,则on this page
打印默认文本 ()。您可以通过提供可选参数全局或本地覆盖此设置。您最有可能\vpageref[]{<label>}
使用空的可选参数(以便不打印任何内容)。
\documentclass{article}
\usepackage{graphicx,lipsum}
\usepackage[nospace]{varioref}
\begin{document}
\lipsum[1]
\begin{figure}
\centering
\includegraphics[width=.3\linewidth]{example-image}
\caption{A figure}
\label{fig:figure}
\end{figure}
\lipsum[2]
See Figure~\ref{fig:figure} on page~\pageref{fig:figure}.
See Figure~\ref{fig:figure} \vpageref{fig:figure}.
See Figure~\ref{fig:figure} \vpageref[]{fig:figure}.% Note the empty optional argument
\lipsum[3]
\end{document}
由于\vpageref
它本身设置了\label
以便比较其引用的页码,因此每次更改位置时都需要编译两次\vpageref
。
答案2
OpTeX 用户可以创建以下宏定义\check
:
\def\check{\label[x/\_lastreflabel]\wlabel{}%
\space
\ea\ifx\csname _pgref:x/\_lastreflabel\ea\endcsname
\csname _pgref:\_lastreflabel\endcsname
\else on page \pgref[\_lastreflabel] \fi
}
% Test:
Figure \ref[fig:label]\check shows bla bla.
%\vfil\break %% <-- you can comment out this to show the effect
... a figure ...
\cskip
\caption/f [fig:label] Figure blba bla
\bye
当然,完成更改后您必须运行两次 TeX。
该宏\check
创建自己的标签,并使用x/label
将其位置写入文件。以下检查参考宏和是否相同。如果为真,则它不执行任何其他操作,而是写入文本。.ref
\wlabel{}
\ifx
\_pgref:x/label
\_pgref:label
on page \pgref[label]