我想定义一个\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}