让我们把它做好:一个 \aboveorbelow{some-label} 命令

让我们把它做好:一个 \aboveorbelow{some-label} 命令

我想定义一个\aboveorbelow可以按如下方式使用的命令:

\documentclass{article}
\begin{document}
\section{Animals}
\label{sec:animals}
\section{Another section}
The quick brown fox (from \ref{sec:animals} \aboveorbelow{sec:animals})
jumped over the lazy dog.

The quick brown fox (from \ref{sec:plants} \aboveorbelow{sec:plants})
jumped over the lazy dog.
\section{Plants}
\label{sec:plants}
\end{document}

如果标识符等于参数的标签在文档中出现的时间早于 的调用,则会产生“above”;\aboveorbelow如果它出现的时间晚于 的调用,则会产生“below”;如果它不存在,则会产生其他内容。

我该如何做到这一点并正确识别页内引用?


在相关问题中指的是“以上”还是“以下”?两种解决方案需要特定的额外标签(例如使用\here\location命令);另一种解决方案使用varioref包,但对于与参考文献位于同一页的标签,显然会失败。我宁愿使用现有标签,而不必创建新标签,最好也不必用etoolbox或类似的东西修补标签命令。

答案1

在此处输入图片描述

\documentclass{article}

\newcounter{zzz}

\makeatletter
\def\aboveorbelow#1{%
\stepcounter{zzz}%
\edef\zztmp{\xdef\string\zzz\Roman{zzz}}%
\write\@auxout\expandafter{\zztmp{\string\@ifundefined{r@#1}{below}{above}}}%
\csname zzz\Roman{zzz}\endcsname}
\makeatother
\begin{document}

\section{Animals}
\label{sec:animals}
% etc. etc.
\section{Another section}
The quick brown fox (from \ref{sec:animals} \aboveorbelow{sec:animals})
jumped over the lazy dog.

The quick brown fox (from \ref{sec:plants} \aboveorbelow{sec:plants})
jumped over the lazy dog.

\section{Plants}
\label{sec:plants}
\end{document}

相关内容