我已定义一个\figref
命令,使其引用带标签的图形并给出该图形所在的页码,除非该图形与引用的图形位于同一页(在这种情况下给出页码没有多大意义)。这是上下文。
该命令有效,但在使用过程中我发现\thepage
计数器在页面的第一段中不正确(除非段落的开头与分页符重合)。在这种情况下,我的命令不再有效。
我可以在使用\thepage
时让计数器“更新”吗?\figref
以下是一个例子:
此处,\figref
命令用于页面的第一段。虽然我们在第 3 页,但\thepage
指示我们在第 1 页。因此,\figref
无法正常工作,因为当图形位于同一页时(但实际上不应该),它指示图形的页码。
正常工作的示例\figref
:
以下是 MWE:
\documentclass{article}
\usepackage{refcount, graphicx, mwe, xcolor}
\newcommand{\figref}[1]{\ifnum\getpagerefnumber{#1}=\thepage%
\textcolor{red}{(Fig.~\ref{#1})}%
\else%
\textcolor{red}{(Fig.~\ref{#1}, p.~\pageref{#1})}%
\fi}
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet eleifend quam, id tincidunt ex. Maecenas lacinia varius dignissim. Phasellus et tortor turpis. Morbi leo nibh, pharetra sit amet tempor non, tristique vel nisi. Duis efficitur at massa sagittis auctor. Morbi consequat ultrices sapien eget luctus. Nam mauris quam, pharetra eget lacus et, ullamcorper maximus elit. Sed ullamcorper, justo sed blandit finibus, turpis est pretium metus, eget luctus dui lectus sit amet nulla. Integer ac ante a enim varius congue sit amet id risus. Nunc non ante arcu. Nam consequat, odio faucibus pharetra fringilla, arcu mauris finibus quam, id tristique neque lacus vitae justo. Duis molestie, mi eu pellentesque consectetur, odio quam consequat tortor, id pulvinar dui urna ac eros. Donec ut mattis urna, in faucibus sapien. Pellentesque placerat ex nec sapien venenatis, non mattis dolor porttitor. Phasellus in eros non ligula pulvinar malesuada non ut nibh. Etiam sed ex et nibh dapibus luctus. Nullam pharetra ligula eu finibus dictum. Praesent dapibus auctor egestas. Aenean sed laoreet leo, in posuere justo. Ut congue porta quam et finibus. Fusce pharetra mattis nunc at ultricies. Sed hendrerit, orci eget ultrices eleifend, nisl quam eleifend mauris, at varius est elit nec libero. Phasellus iaculis, magna aliquam lobortis porttitor, sapien libero convallis purus, sed fermentum neque risus id sem. Vivamus et vulputate magna. Donec maximus nibh nec rhoncus feugiat. Sed id justo orci. Sed nibh nulla, euismod sit amet maximus in, facilisis id quam. Pellentesque non ex porta, consectetur erat sed, iaculis tellus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed et ipsum nunc. Aliquam aliquet sit amet tellus venenatis volutpat. Nam ullamcorper justo vel lectus sodales porttitor. Suspendisse sed tellus suscipit, lacinia quam ut, efficitur diam. Duis congue tellus ante, et mattis urna hendrerit et. Phasellus ullamcorper eros ultrices ullamcorper condimentum. Nam non dui felis. Sed faucibus mi vitae sollicitudin fringilla. Nullam pulvinar venenatis neque, vitae faucibus odio cursus et. Duis commodo a felis eget efficitur.
\begin{figure}[p]
\includegraphics[height=0.9\textheight]{example-image-10x16}
\caption{Blablabla}\label{fig1}
\end{figure}
Proin leo lectus, porta ut accumsan eu, sollicitudin sit amet elit. Suspendisse pharetra pretium sapien, sit amet faucibus enim molestie ac. Aliquam at mi vestibulum, placerat neque quis, bibendum nunc. Proin libero orci, ullamcorper at dapibus at, varius vitae dolor. In congue ullamcorper consequat. Mauris tincidunt risus vel felis finibus consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus at eros dictum, euismod lacus at, sodales metus. Integer vitae erat libero. Sed ultrices cursus risus ut maximus. Mauris placerat maximus elit, ut volutpat tellus sagittis sed. Cras in faucibus velit, eget venenatis tortor. Integer malesuada ligula vestibulum, placerat ex ut, sollicitudin nibh. Ut euismod orci molestie egestas eleifend. Ut justo libero, dignissim eu urna a, tempus auctor ligula. Duis cursus, tellus quis hendrerit dictum, enim nibh congue risus, vel dictum quam nisl vitae ante. In tempor nibh eleifend eros sodales, ac luctus ligula gravida. Aenean rutrum ante massa, sed euismod augue rutrum eget. Duis odio sapien, commodo eget ullamcorper quis, suscipit quis felis. Aliquam commodo tincidunt ante. Vivamus id lectus mauris. In vulputate libero ac est auctor convallis vel sit amet lectus.
Etiam urna nulla, porta quis convallis ac, malesuada eu ex. Donec tincidunt blandit lacus, non volutpat mi congue ut. Praesent aliquam orci vel velit tincidunt sodales. Morbi vel feugiat massa. Praesent orci lorem, fermentum vitae odio eu, elementum consequat quam. Donec gravida, magna nec bibendum auctor, nibh ipsum imperdiet mi
\figref{fig2}, \verb!\thepage! = \thepage.
\begin{figure}[h]
\includegraphics{example-image}
\caption{Blablabla}\label{fig2}
\end{figure}
Nullam consectetur aliquam tincidunt. Ut bibendum pellentesque efficitur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi euismod eu ligula vel tempor. Morbi quis gravida quam, quis aliquet eros. Duis pellentesque suscipit eros, vitae consectetur erat porta id. Suspendisse potenti. In placerat leo quis mattis finibus. Curabitur tincidunt magna non lorem viverra, id tempus turpis pellentesque. Etiam euismod rhoncus justo ac tincidunt. Vestibulum quis felis vitae massa finibus venenatis. Aenean sed dolor ullamcorper, ullamcorper lorem vitae, condimentum felis. Proin pharetra neque vel arcu pharetra dapibus. Vivamus suscipit tincidunt ligula at gravida. Nullam faucibus arcu sit amet arcu volutpat volutpat. Ut velit velit, elementum egestas commodo eu, molestie tempus erat. Donec vitae massa eros. Ut aliquam ante nec iaculis aliquam. Morbi dignissim ligula nec convallis elementum. Aenean eget metus leo. Ut velit velit, elementum egestas commodo eu, molestie tempus erat. Donec vitae massa eros. Ut aliquam ante nec iaculis aliquam. Morbi dignissim ligula nec convallis elementum. Aenean eget metus leo.
In eget interdum ligula. Ut ornare at nibh vel laoreet. Fusce eu enim at diam posuere tempus sit amet eget nulla. Nam varius blandit velit, quis scelerisque augue facilisis hendrerit. Duis aliquam sit amet nunc ac posuere. Vivamus tempus tincidunt leo at efficitur. Morbi vel nunc id lacus condimentum molestie non vitae elit. Etiam maximus, quam sed finibus dignissim, lectus metus molestie nisl, quis dapibus turpis dui ac dolor. Ut nec rhoncus nisl.
Etiam urna nulla, porta quis convallis ac, malesuada eu ex. Donec tincidunt blandit lacus, non volutpat mi congue ut. Praesent aliquam orci vel velit tincidunt sodales. Morbi vel feugiat massa. Praesent orci lorem, fermentum vitae odio eu, elementum consequat quam. Donec gravida, magna nec bibendum auctor, nibh ipsum imperdiet mi
\figref{fig3}, \verb!\thepage! = \thepage.
\begin{figure}[h]
\includegraphics{example-image}
\caption{Blablabla}\label{fig3}
\end{figure}
Vestibulum accumsan metus lorem, semper blandit justo lobortis eu. Suspendisse vulputate tincidunt purus at vehicula. Pellentesque ut tempus leo. Praesent sagittis ornare justo ac hendrerit. Praesent eget neque non mauris finibus accumsan. Mauris feugiat tincidunt volutpat. Proin vitae magna vitae est vehicula feugiat id at arcu. Ut libero magna, semper vitae semper in, maximus quis diam. Sed tristique arcu tempus turpis facilisis, non pellentesque justo viverra. Suspendisse mauris felis, lobortis at suscipit malesuada, blandit ac arcu. Nulla id quam tincidunt, posuere velit et, efficitur nibh.
\end{document}
答案1
感谢 David Carlisle 的评论,并受到该varioref
包源代码的启发,我想我有一个解决方案:
\documentclass{article}
\usepackage{refcount, graphicx, mwe, xcolor, varioref}
\newcounter{figrefcnt}
\makeatletter
\newcommand{\figref}[1]{%
\global\advance\c@figrefcnt\@ne%
\vref@label{\the\c@figrefcnt @pref}%
\ifnum\getpagerefnumber{#1}=\getpagerefnumber{\the\c@figrefcnt @pref}%
\textcolor{red}{(Fig.~\ref{#1})}%
\else%
\textcolor{red}{(Fig.~\ref{#1}, p.~\pageref{#1})}%
\fi
}
\makeatother
\begin{document}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet eleifend quam, id tincidunt ex. Maecenas lacinia varius dignissim. Phasellus et tortor turpis. Morbi leo nibh, pharetra sit amet tempor non, tristique vel nisi. Duis efficitur at massa sagittis auctor. Morbi consequat ultrices sapien eget luctus. Nam mauris quam, pharetra eget lacus et, ullamcorper maximus elit. Sed ullamcorper, justo sed blandit finibus, turpis est pretium metus, eget luctus dui lectus sit amet nulla. Integer ac ante a enim varius congue sit amet id risus. Nunc non ante arcu. Nam consequat, odio faucibus pharetra fringilla, arcu mauris finibus quam, id tristique neque lacus vitae justo. Duis molestie, mi eu pellentesque consectetur, odio quam consequat tortor, id pulvinar dui urna ac eros. Donec ut mattis urna, in faucibus sapien. Pellentesque placerat ex nec sapien venenatis, non mattis dolor porttitor. Phasellus in eros non ligula pulvinar malesuada non ut nibh. Etiam sed ex et nibh dapibus luctus. Nullam pharetra ligula eu finibus dictum. Praesent dapibus auctor egestas. Aenean sed laoreet leo, in posuere justo. Ut congue porta quam et finibus. Fusce pharetra mattis nunc at ultricies. Sed hendrerit, orci eget ultrices eleifend, nisl quam eleifend mauris, at varius est elit nec libero. Phasellus iaculis, magna aliquam lobortis porttitor, sapien libero convallis purus, sed fermentum neque risus id sem. Vivamus et vulputate magna. Donec maximus nibh nec rhoncus feugiat. Sed id justo orci. Sed nibh nulla, euismod sit amet maximus in, facilisis id quam. Pellentesque non ex porta, consectetur erat sed, iaculis tellus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed et ipsum nunc. Aliquam aliquet sit amet tellus venenatis volutpat. Nam ullamcorper justo vel lectus sodales porttitor. Suspendisse sed tellus suscipit, lacinia quam ut, efficitur diam. Duis congue tellus ante, et mattis urna hendrerit et. Phasellus ullamcorper eros ultrices ullamcorper condimentum. Nam non dui felis. Sed faucibus mi vitae sollicitudin fringilla. Nullam pulvinar venenatis neque, vitae faucibus odio cursus et. Duis commodo a felis eget efficitur.
\begin{figure}[p]
\includegraphics[height=0.9\textheight]{example-image-10x16}
\caption{Blablabla}\label{fig1}
\end{figure}
Proin leo lectus, porta ut accumsan eu, sollicitudin sit amet elit. Suspendisse pharetra pretium sapien, sit amet faucibus enim molestie ac. Aliquam at mi vestibulum, placerat neque quis, bibendum nunc. Proin libero orci, ullamcorper at dapibus at, varius vitae dolor. In congue ullamcorper consequat. Mauris tincidunt risus vel felis finibus consequat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus at eros dictum, euismod lacus at, sodales metus. Integer vitae erat libero. Sed ultrices cursus risus ut maximus. Mauris placerat maximus elit, ut volutpat tellus sagittis sed. Cras in faucibus velit, eget venenatis tortor. Integer malesuada ligula vestibulum, placerat ex ut, sollicitudin nibh. Ut euismod orci molestie egestas eleifend. Ut justo libero, dignissim eu urna a, tempus auctor ligula. Duis cursus, tellus quis hendrerit dictum, enim nibh congue risus, vel dictum quam nisl vitae ante. In tempor nibh eleifend eros sodales, ac luctus ligula gravida. Aenean rutrum ante massa, sed euismod augue rutrum eget. Duis odio sapien, commodo eget ullamcorper quis, suscipit quis felis. Aliquam commodo tincidunt ante. Vivamus id lectus mauris. In vulputate libero ac est auctor convallis vel sit amet lectus.
Etiam urna nulla, porta quis convallis ac, malesuada eu ex. Donec tincidunt blandit lacus, non volutpat mi congue ut. Praesent aliquam orci vel velit tincidunt sodales. Morbi vel feugiat massa. Praesent orci lorem, fermentum vitae odio eu, elementum consequat quam. Donec gravida, magna nec bibendum auctor, nibh ipsum imperdiet mi \figref{fig2}.
\begin{figure}[h]
\includegraphics{example-image}
\caption{Blablabla}\label{fig2}
\end{figure}
Nullam consectetur aliquam tincidunt. Ut bibendum pellentesque efficitur. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi euismod eu ligula vel tempor. Morbi quis gravida quam, quis aliquet eros. Duis pellentesque suscipit eros, vitae consectetur erat porta id. Suspendisse potenti. In placerat leo quis mattis finibus. Curabitur tincidunt magna non lorem viverra, id tempus turpis pellentesque. Etiam euismod rhoncus justo ac tincidunt. Vestibulum quis felis vitae massa finibus venenatis. Aenean sed dolor ullamcorper, ullamcorper lorem vitae, condimentum felis. Proin pharetra neque vel arcu pharetra dapibus. Vivamus suscipit tincidunt ligula at gravida. Nullam faucibus arcu sit amet arcu volutpat volutpat. Ut velit velit, elementum egestas commodo eu, molestie tempus erat. Donec vitae massa eros. Ut aliquam ante nec iaculis aliquam. Morbi dignissim ligula nec convallis elementum. Aenean eget metus leo. Ut velit velit, elementum egestas commodo eu, molestie tempus erat. Donec vitae massa eros. Ut aliquam ante nec iaculis aliquam. Morbi dignissim ligula nec convallis elementum. Aenean eget metus leo \figref{fig1}.
In eget interdum ligula. Ut ornare at nibh vel laoreet. Fusce eu enim at diam posuere tempus sit amet eget nulla. Nam varius blandit velit, quis scelerisque augue facilisis hendrerit. Duis aliquam sit amet nunc ac posuere. Vivamus tempus tincidunt leo at efficitur. Morbi vel nunc id lacus condimentum molestie non vitae elit. Etiam maximus, quam sed finibus dignissim, lectus metus molestie nisl, quis dapibus turpis dui ac dolor. Ut nec rhoncus nisl.
Etiam urna nulla, porta quis convallis ac, malesuada eu ex. Donec tincidunt blandit lacus, non volutpat mi congue ut. Praesent aliquam orci vel velit tincidunt sodales. Morbi vel feugiat massa. Praesent orci lorem, fermentum vitae odio eu, elementum consequat quam. Donec gravida, magna nec bibendum auctor, nibh ipsum imperdiet mi \figref{fig3}.
\begin{figure}[h]
\includegraphics{example-image}
\caption{Blablabla}\label{fig3}
\end{figure}
Vestibulum accumsan metus lorem, semper blandit justo lobortis eu. Suspendisse vulputate tincidunt purus at vehicula. Pellentesque ut tempus leo. Praesent sagittis ornare justo ac hendrerit. Praesent eget neque non mauris finibus accumsan. Mauris feugiat tincidunt volutpat. Proin vitae magna vitae est vehicula feugiat id at arcu. Ut libero magna, semper vitae semper in, maximus quis diam. Sed tristique arcu tempus turpis facilisis, non pellentesque justo viverra. Suspendisse mauris felis, lobortis at suscipit malesuada, blandit ac arcu. Nulla id quam tincidunt, posuere velit et, efficitur nibh.
\end{document}