
Как получить подробную информацию о расположении метки относительно другого текста и отобразить пользовательский текст на основе этой информации?
- Если этикетка находится на предыдущей странице (а эта — лицевая), напечатайте «на левой странице».
- Если этикетка находится на предыдущей странице (а эта — на обороте), напечатайте «на предыдущей странице».
- Если этикетка находится на следующей странице (а эта — на обороте), напечатайте «на правой странице».
- Если этикетка находится на следующей странице (а эта — лицевая), напечатайте «на следующей странице».
В противном случае:
- Если метка находится раньше, на той же строке, напечатайте «до, на этой строке».
- Если этикетка находится выше на той же странице, напечатайте «выше, на этой странице».
- Если метка находится после, на той же строке, напечатайте «после, на этой строке».
- Если метка находится ниже на той же странице, напечатайте «ниже, на этой странице».
В противном случае:
- Если метка находится раньше (на предыдущей странице), напечатайте «на предыдущей странице».
- Если метка находится после (на более поздней странице), напечатайте «на более поздней странице».
Пакет 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>
, позволяя производить вычисления. В приведенном выше примере страницы recto и verso определяются на основе того, page
является ли она четной/нечетной.
\myref
можно расширить, включив в него ссылку на строку с помощью savepos
модуля, что позволит ссылаться на «...выше, на этой странице» или «...ниже, на этой странице». Этого можно достичь, используя расширяемый объект \zposy{<lab>}
для извлечения координаты Y метки <lab>
на странице и сравнения ее с какой-либо другой меткой.
Обратите внимание, что для «установки» ссылок вам придется выполнить компиляцию как минимум дважды, несмотря на возможные ошибки, на которые LaTeX жалуется при первом запуске.