![自定义相对页面引用](https://linux22.com/image/243345/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9B%B8%E5%AF%B9%E9%A1%B5%E9%9D%A2%E5%BC%95%E7%94%A8.png)
如何获取有关标签相对于其他文本的位置的详细信息并根据此信息显示自定义文本?
- 如果标签位于紧邻的上一页(且此页为正面),则打印“在左侧页面上”。
- 如果标签位于紧邻的上一页(且此页位于背面),则打印“在上一页”。
- 如果标签位于紧邻的下一页(且此页位于背面),则打印“在右侧页面上”。
- 如果标签位于紧邻的下一页(且此页为正面),则打印“在下一页”。
否则:
- 如果标签位于同一行之前,则打印“在此行之前”。
- 如果标签位于同一页的上方,则打印“上方,在此页上”。
- 如果标签位于同一行之后,则打印“在此行之后”。
- 如果标签位于同一页的下方,则打印“下方,在此页上”。
否则:
- 如果标签位于(上一页)之前,则打印“在上一页”。
- 如果标签位于(后续页面)之后,则打印“在后续页面上”。
这个varioref
软件包似乎具有其中一些功能,但也存在一些问题:
- 我并不想打印页码,倾向于这样
vpageref
做。 - 我的文档不使用英语,所以我需要更好地控制出现的文本,包括对空格的控制。
答案1
这是可能的,当使用zref
包裹。加载user
模块(或直接通过zref-user
包)您可以访问与之相关的许多属性\zlabel
(类似于 LaTeX 的\label
)。
\documentclass[twoside]{article}
\usepackage[margin=5mm,paperheight=2in,paperwidth=4in,bottom=15mm]{geometry}% http://ctan.org/pkg/geometry
\usepackage[user]{zref}% http://ctan.org/pkg/zref
\newcounter{refcnt}% Counter used with every reference
\makeatletter
\newcommand{\myref}[1]{%
\stepcounter{refcnt}\zlabel{#1@\therefcnt}%
\texttt{#1} is on page~\zref[page]{#1}.
This is page~\zref[page]{#1@\therefcnt}. \par
\texttt{#1} is on a~\ifodd\zref@extract{#1}{page}recto\else verso\fi~page.
This is a~\ifodd\zref@extract{#1@\therefcnt}{page}recto\else verso\fi~page. \par
\texttt{#1} is
\ifnum\zref@extract{#1@\therefcnt}{page}=\zref@extract{#1}{page} % same page
on this page.
\else
\ifnum\numexpr\zref@extract{#1@\therefcnt}{page}-\zref@extract{#1}{page}\relax=1 % previous page
\ifodd\zref@extract{#1@\therefcnt}{page}
on the left-hand page.
\else
on the previous page.
\fi
\else
\ifnum\numexpr\zref@extract{#1}{page}-\zref@extract{#1@\therefcnt}{page}\relax=1 % next page
\ifodd\zref@extract{#1@\therefcnt}{page}
on the next page.
\else
on the right-hand page.
\fi
\else
\ifnum\zref@extract{#1}{page}>\zref@extract{#1@\therefcnt}{page} %
\strip@pt\dimexpr\zref@extract{#1}{page}pt-\zref@extract{#1@\therefcnt}{page}pt\relax~pages ahead.
\else
\strip@pt\dimexpr\zref@extract{#1@\therefcnt}{page}pt-\zref@extract{#1}{page}pt\relax~pages before.
\fi
\fi
\fi
\fi
}
\makeatother
\begin{document}
This is~\texttt{foo}.\zlabel{foo} \par \medskip
\myref{foo}
\newpage
\myref{foo} \par \medskip
\myref{bar}
\newpage
\myref{foo} \par
This is~\texttt{bar}.\zlabel{bar}
\newpage
\myref{bar}
\end{document}
对于<lab>
通过 引用的每个标签,都会设置\myref{<lab>}
一个新的,其中是一个普通的运行计数器。这允许提取与 相关的属性以进行计算。\zlabel
<lab>@<refcnt>
<refcnt>
<lab>@<refcnt>
\zref@extract{<ref>}{<prop>}
<prop>
提供label属性的可扩展版本<ref>
,允许进行计算。在上面的例子中,正面和背面的页面是根据page
奇数/偶数来决定的。
\myref
可以扩展为使用savepos
模块进行线引用,从而允许引用“...在此页面上方。”或“...在此页面上方。”这可以通过使用可扩展模块\zposy{<lab>}
提取页面上标签的 y 坐标<lab>
并将其与其他标签进行比较来实现。
请注意,尽管 LaTeX 在第一次运行期间可能会抱怨错误,但您必须至少编译两次才能“解决”引用。