我想知道这是否是一种好的做法,如果是的话,如何实现,以引用如下:“如上所述多于......”或者我是不是走得太远了,只需输入这个词就可以了?
我读过一些关于的内容varioref
,但它似乎会产生页码或章节编号,但我找不到如何打印某个章节是位于参考文献之上还是之下。
答案1
您还可以自己实现标签,方法是让标签定义一个标志,然后引用检查标志是否存在。需要一些额外的记录来警告未定义的标签。
\documentclass{article}
\makeatletter
\newcount\here@undef
\newcommand{\here}[1]{%
\@ifundefined{here@#1@undef}{}{\advance\here@undef by -1}%
\@namedef{here@#1}{}}
\newcommand{\where}[1]{%
\@ifundefined{here@#1}{%
below%
\@ifundefined{here@#1@undef}{%
\@namedef{here@#1@undef}{}%
\advance\here@undef by 1
}{}%
}{%
above%
}%
}
\AtEndDocument{%
\ifnum\here@undef>0
\GenericWarning{}{There were undefined above/below labels}%
\fi}
\makeatother
\begin{document}
As mentioned \where{test}, $2+2=4$.
We state that $2+2=4$.\here{test}
As mentioned \where{test}, $2+2=4$.
\end{document}
答案2
varioref
事实上,你只需要给\vpageref
命令一个提示,告诉它要写什么来引用同一页面上的元素。摘自文档:
但实际上
\vpageref
允许更多的控制。如果有两个可选参数。使用第一个参数,可以指定如果标签和引用位于同一页,则应使用的文本。如果两者彼此靠近,那么这将非常有用,这样它们可能会被分页符分隔开,也可能不会。在这种情况下,我们通常知道(!)引用是在标签之前还是之后,这样我们就可以这样说……参见示例,\vpageref[above]{ex:foo}
它显示了……然后会出现“……参见示例多于 这表明 。 。 。 ”
重点是,如果标签和元素之间有分页符,\vpageref
则会注意到这一点并插入类似在上一页反而。
答案3
您可以检查页面上标记的 y 坐标并进行比较以决定是否应该打印above
。below
zref
的savepos
模块可以帮助解决这个问题:
\documentclass{article}
\usepackage{zref-savepos}
\newcounter{whereq}
\newcommand{\location}[1]{\zsaveposy{#1}}
\newcommand{\where}[1]{%
\stepcounter{whereq}% New "where" request
\location{whereq-\thewhereq}% Mark location
% Test location based on y-coordinate
\ifdim\zposy{whereq-\thewhereq}sp<\zposy{#1}sp
above%
\else
below%
\fi}
\begin{document}
As mentioned \where{test}, $2+2=4$.
We state that $2+2=4$.\location{test}
As mentioned \where{test}, $2+2=4$.
\end{document}
当然,上面的代码并不关心你在哪个页面上执行\location
宏\where
。但是,它也可以扩展到以页码为条件。