Настройка относительных ссылок на страницы

Настройка относительных ссылок на страницы

Как получить подробную информацию о расположении метки относительно другого текста и отобразить пользовательский текст на основе этой информации?

  • Если этикетка находится на предыдущей странице (а эта — лицевая), напечатайте «на левой странице».
  • Если этикетка находится на предыдущей странице (а эта — на обороте), напечатайте «на предыдущей странице».
  • Если этикетка находится на следующей странице (а эта — на обороте), напечатайте «на правой странице».
  • Если этикетка находится на следующей странице (а эта — лицевая), напечатайте «на следующей странице».

В противном случае:

  • Если метка находится раньше, на той же строке, напечатайте «до, на этой строке».
  • Если этикетка находится выше на той же странице, напечатайте «выше, на этой странице».
  • Если метка находится после, на той же строке, напечатайте «после, на этой строке».
  • Если метка находится ниже на той же странице, напечатайте «ниже, на этой странице».

В противном случае:

  • Если метка находится раньше (на предыдущей странице), напечатайте «на предыдущей странице».
  • Если метка находится после (на более поздней странице), напечатайте «на более поздней странице».

Пакет 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 жалуется при первом запуске.

Связанный контент