Anpassen von relativen Seitenverweisen

Anpassen von relativen Seitenverweisen

Wie kann ich detaillierte Informationen zur Position einer Beschriftung im Verhältnis zu anderem Text erhalten und basierend auf diesen Informationen einen benutzerdefinierten Text anzeigen?

  • Befindet sich das Etikett auf der unmittelbar vorhergehenden Seite (und dieses ist recto), drucken Sie „auf der linken Seite“.
  • Befindet sich das Etikett auf der unmittelbar vorhergehenden Seite (und es handelt sich hier um die Rückseite), drucken Sie „auf der vorhergehenden Seite“.
  • Befindet sich das Etikett auf der unmittelbar nächsten Seite (und es handelt sich hier um die Rückseite), drucken Sie „auf der rechten Seite“.
  • Befindet sich das Etikett auf der unmittelbar nächsten Seite (und dieses ist recto), drucken Sie „auf der folgenden Seite“.

Ansonsten:

  • Wenn die Bezeichnung vorher in derselben Zeile steht, drucken Sie „vorher in dieser Zeile“.
  • Befindet sich die Beschriftung weiter oben auf der gleichen Seite, drucken Sie „oben, auf dieser Seite“.
  • Wenn die Bezeichnung danach in der gleichen Zeile steht, drucken Sie „danach in dieser Zeile“.
  • Befindet sich das Etikett weiter unten auf derselben Seite, drucken Sie „weiter unten, auf dieser Seite“.

Ansonsten:

  • Wenn das Etikett davor (auf einer vorherigen Seite) steht, drucken Sie „auf einer vorherigen Seite“.
  • Wenn die Beschriftung danach (auf einer späteren Seite) kommt, drucken Sie „auf einer späteren Seite“.

Das variorefPaket scheint einige dieser Funktionen zu haben, bringt aber einige Probleme mit sich:

  • Ich möchte die Seitenzahl nicht drucken, was vpagerefnormalerweise der Fall ist.
  • In meinem Dokument wird kein Englisch verwendet, daher muss ich eine bessere Kontrolle über den angezeigten Text haben, einschließlich der Leerzeichen.

Antwort1

Dies ist möglich bei Verwendung derzrefPaketDurch Laden des userModuls (oder direkt über das zref-userPaket) haben Sie Zugriff auf eine Reihe von Eigenschaften, die mit einem verknüpft sind \zlabel(ähnlich wie bei LaTeX \label).

Bildbeschreibung hier eingeben

\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}

Für jedes Label <lab>, auf das über verwiesen wird \myref{<lab>}, wird ein neues Label \zlabel <lab>@<refcnt>gesetzt, wobei <refcnt>ein normaler laufender Zähler ist. Dies ermöglicht das Extrahieren von Eigenschaften, die mit verknüpft sind, <lab>@<refcnt>um Berechnungen durchzuführen.

\zref@extract{<ref>}{<prop>}stellt eine erweiterbare Version der Eigenschaft <prop>von label dar <ref>und ermöglicht Berechnungen. Im obigen Beispiel wird zwischen Vorder- und Rückseite danach unterschieden, ob pagegerade oder ungerade ist.

\myrefkönnte erweitert werden, um Zeilenreferenzen mithilfe des saveposModuls einzuschließen, was Referenzen wie „… oben, auf dieser Seite“ oder „… unten, auf dieser Seite“ ermöglichen würde. Dies würde erreicht werden, indem das erweiterbare Modul verwendet wird, \zposy{<lab>}um die Y-Koordinate des Etiketts <lab>auf der Seite zu extrahieren und sie mit einem anderen Etikett zu vergleichen.

Beachten Sie, dass Sie mindestens zweimal kompilieren müssen, damit sich die Referenzen „stabilisieren“, trotz möglicher Fehler, die LaTeX beim ersten Durchlauf bemängelt.

verwandte Informationen