
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 varioref
Paket scheint einige dieser Funktionen zu haben, bringt aber einige Probleme mit sich:
- Ich möchte die Seitenzahl nicht drucken, was
vpageref
normalerweise 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 derzref
PaketDurch Laden des user
Moduls (oder direkt über das zref-user
Paket) haben Sie Zugriff auf eine Reihe von Eigenschaften, die mit einem verknüpft sind \zlabel
(ähnlich wie bei 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}
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 page
gerade oder ungerade ist.
\myref
könnte erweitert werden, um Zeilenreferenzen mithilfe des savepos
Moduls 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.