Hallo,
die Sache mit den relativen Seitenverweisen hat mir keine Ruhe gelassen,
sodass ich sie nochmal überarbeitet habe.
Es muss ja für jeden relativen Seitenverweis dort, wo er auftaucht, ein
\label gesetzt werden, damit man die Seitenzahl dort, wo der relative
Seitenverweis auftaucht, korrekt ermitteln kann.
Man könnte jetzt hergehen und einfach ein robustes Makro programmieren,
also mit \DeclareRobustCommand, in der Annahme, dass dieses dann auch
in "moving arguments" genutzt werden kann.
Aber es gilt ein paar Feinheiten zu beachten:
Sollte mal jemand auf die finstere Idee kommen, so einen relativen
Seitenverweis in eine Absatzüberschrift zu packen, dann wird es lustig.
- Die Absatzüberschrift steht im Text.
- Die Absatzüberschrift kann Teil der folgenden Seitenköpfe werden.
ZB bei der book-Klasse werden beim Seitenstil "headings" die
Seitenköpfe in Großbuchstaben gesetzt. Da \uppercase beim "Großmachen"
von Buchstaben keinerlei Makros expandiert, wird mit \MakeUppercase
bzw intern mit \protected@edef gearbeitet. \protected@edef wiederum
expandiert aber keine robusten Makros. Das würde auch nichts bringen,
denn fürs automatische Labelsetzen bei einem relativen Seitenverweis
braucht man eindeutige Label-Namen, die wohl von einem Zähler
abhängen müssen, der intern automatisch hochgezählt wird.
Hochzählen ist immer mit Assignments verbunden. \protected@edef ist
selbst ein Assignment und behandelt Token, die ebenfalls Assignments
darstellen, wie \relax. Um also sicherzustellen, dass bei einem
relativen Seitenverweis in einem Seitenkopf das Hochzählen des
Zählers für automatisierte Labelnamen und das Verwenden der
automatisiert erzeugten Label-Namen nicht asynchron verläuft, müssen
alle diese Dinge, wenn es um den Seitenkopf geht, bis zum richtigen
Zeitpunkt verzögert werden. Zu diesem Zeitpunkt ist aber ggfs das
"Großmachen" der Seitenkopf-Zeile schon passiert, sodass nichts
anderes übrigbleibt, als sich zu behelfen, indem man eben zu dem
Zeitpunkt, zu dem dann die Character-Token, die den Verweis
darstellen, gesetzt werden, nochmal \MakeUppercase aufruft.
- Die Absatzüberschrift kann Teil eines \nameref-Verweises sein.
Wenn sie einen relativen Seitenverweis enthält, darf der nicht
zu einem Hyperlink werden. Denn der \nameref-Verweis, von dem
der relative Seitenverweis ein Teil ist, ist selbst insgesamt
schon ein Hyperlink.
Außerdem ist beim Ausspucken von \nameref-Vereisen das \label-Makro
so umdefiniert, dass es nichts tut. Wenn aber nun beim Ausspucken
eines \nameref-Verweises doch automatisiert ein Label für einen
im \nameref-Verweis vorkommenden relativen Seitenverweis gesetzt
werden muss, braucht man dafür aber die normale \label-Variante,
nicht die umdefinierte, bei der nichts getan wird.
- Die Absatzüberschrift wandert ins Inhaltsverzeichnis.
- Die Absatzüberschrift wandert bei pdf-Dateien auch in die Bookmarks.
Um für einen relativen Seitenverweis die Anzahl an Seiten berechnen zu
können, die man vor- oder zurückblättern muss, bedarf es eines
Ausgangspunktes und eines Bezugnahmepunktes.
Ausgangspunkt ist normalerweise die Seite, auf der der relative
Seitenverweis erscheinen soll.
Bezugnahmepunkt ist die Seite, auf die verwiesen wird bzw zu der man,
wenn man dem Verweis folgen will, hinblättern soll.
Nun gibt es aber gerade in Zusammenhang mit "Moving Arguments" mehr oder
weniger lustige Situationen, für die man sich überlegen muss, wie man
verfahren will.
------------------------------------------------------------------------
Beispiele hierzu:
Angenommen, jemand kommt auf die schräge Idee, nach dem zehnten Kapitel
folgendes zu basteln:
\chapter{Vermutung}\labelNzalabel{Vermutung}
Dies ist eine Vermutung.
...
\chapter{Anmerkungen zur Vermutung, die \Relativref{Anmerkung}
{Vermutung} steht}
\labelNzalabel{Anmerkungen}
Dies sind Anmerkungen.
...
, dann bekommt er im Haupttext zB folgendes:
Kapitel 11 Vermutung
Dies ist eine Vermutung.
...
Kapitel 12 Anmerkungen zur Vermutung, die 15 Seiten weiter vorne
steht
Dies sind Anmerkungen.
...
Die Kapitelüberschriften sind sogenannte "Moving Arguments", denn sie
landen nicht nur im Haupttext, sondern automatisiert auch noch an ganz
anderen Stellen, die vor oder hinter der entsprechenden Stelle im
Haupttext, oder auch außerhalb des Textes (zB in den Lesezeichen/
Bookmarks) liegen können.
Angenommen, das Inhaltsverzeichnis landet auf Seite 7.
Was soll im Inhaltsverzeichis auf Seite 7 stehen?
Normalerweise werden im Inhaltsverzeichnis die Überschriften ja so
exakt wie möglich wiedergegeben.
Soll da dann stehen:
Inhaltsverzeichnis
Kapitel 11 Vermutung .......................... 33
Kapitel 12 Anmerkungen zur Vermutung, die
15 Seiten weiter vorne steht......... 47
Oder soll da, damit es in Relation zum Inhaltsverzeichnis auf Seite 7
richtig wird, dann stehen:
Inhaltsverzeichnis
Kapitel 11 Vermutung .......................... 33
Kapitel 12 Anmerkungen zur Vermutung, die
26 Seiten weiter hinten steht........ 47
Was soll in den Bookmarks stehen?
Bookmarks werden ja normalerweise in einem separaten Fensterchen
angezeigt. Dieses Fensterchen gehört nicht zu den Seiten des Dokuments.
Inwiefern stehen Phrasen, die in Bookmarks auftauchen, in einer "weiter
vorne"- oder "weiter hinten"-Relation zu den Seiten des Dokuments?
Wenn da ein Bookmark steht, in dem treu und brav die Kapitelüberschrift
Zeichen für Zeichen abgebildet ist:
<Anmerkungen zur Vermutung, die 15 Seiten weiter vorne steht>
, dann ist das nett. Aber ob die Aussage stimmt, hängt davon ab, wo man
im Textanzeigefenster grade hingescrollt hat.
Wenn da einer auf die Idee kommt, einen \nemaref-Verweis auf das Label
"Anmerkungen" zu machen -- könnte so aussehen:
... wie man im Kapitel mit den \nameref{Anmerkungen}, nachlesen
kann ...
--, der auf Seite 57 landet, soll dort auf Seite 57 dann stehen:
... wie man im Kapitel mit den Anmerkungen zur Vermutung, die
15 Seiten weiter vorne steht, nachlesen kann ...
, oder soll da auf Seiteb 57 dann stehen:
... wie man im Kapitel mit den Anmerkungen zur Vermutung, die
25 Seiten weiter vorne steht, nachlesen kann ...
Hier würde ich möglicherweise die zweite Variante bevorzugen.
Oder der Verweis sieht wie folgt aus:
... wie man in Kapitel "\nameref{Anmerkungen}" nachlesen
kann ...
, soll dort auf Seite 57 dann stehen:
... wie man in Kapitel "Anmerkungen zur Vermutung, die
15 Seiten weiter vorne steht" nachlesen kann ...
, oder soll da auf Seite 57 dann stehen:
... wie man in Kapitel "Anmerkungen zur Vermutung, die
25 Seiten weiter vorne steht" nachlesen kann ...
Hier würde ich möglicherweise die erste Variante bevorzugen.
Und wie halten wir es mit den Seitenköpfen? Bei etlichen Dokumenten
steht im Seitenkopf ja die Überschrift des jeweiligen Kapitels.
Auf Seite 47, wo das Kapitel 12 anfängt, könnte im Seitenkopf noch
stehen:
12 Anmerkungen zur Vermutung, die 15 Seiten weiter vorne steht ... 47
Aber wie machen wir es auf den nachfolgenden Seiten?
Soll im Kopf von Seite 49 zB stehen:
12 Anmerkungen zur Vermutung, die 17 Seiten weiter vorne steht ... 49
Soll im Kopf von Seite 51 zB stehen:
12 Anmerkungen zur Vermutung, die 19 Seiten weiter vorne steht ... 51
Oder halten wir uns an die Philosophie, dass im Seitenkopf immer die
hingepinselte Kapitelüberschrift exakt abzubilden ist, und schreiben
- auch im Kopf von Seite 49:
12 Anmerkungen zur Vermutung, die 15 Seiten weiter vorne steht ... 49
- auch im Kopf von Seite 51:
12 Anmerkungen zur Vermutung, die 15 Seiten weiter vorne steht ... 51
------------------------------------------------------------------------
Bei diesen Beispielen steht in Zusammenhang mit Moving Arguments
die Frage im Hintergrund, was unter welchen Voraussetzungen für den
relativen Seitenverweis als Ausgangspunkt genommen werden soll - die
Stelle (Seitenkopf-Zzeile / Inhaltsverzeichniseintrag / \nameref-
Verweis auf eine Absatzüberschrift, die einen relativen Seitenverweis
enthält), an der er auftaucht oder doch besser die Stelle im normalen
Text, von der er abgekupfert worden ist.
Außerdem muss man bedenken, dass man, was das Labelsetzen angeht, nicht
einfach mit \pageref oder dergleichen arbeiten kann, weil da in keiner
Weise sicher ist, dass tatsächlich nur Zahlendarstellungen zum
Stellenwertsystem der Basis Zehn in arabischen Ziffern ausgegeben
werden, mit denen man LaTeX rechnen lassen könnte.
In untenstehendem Beispiel habe ich mit dem Paket zref gearbeitet.
Das Makro \RelativerefPageHeadingsFormat dient dazu, festzulegen, wie
ein relativer Seitenverweis zu formatieren ist wenn er in einer
Seitenkopf-Zeile auftaucht. Es sollte genau ein "Undelimited Argument"
verarbeiten.
Da bei der Dokumentklasse book, die ich für mein Beispiel verwendet
habe, die Seitenköpfe in Großbuchstaben geschrieben sind, habe ich
dieses Makro so definiert, dass es zu \MakeUppercase expandiert, was
wiederum genau ein "Undelimited Argument" verarbeitet.
Die vier im folgenden beschriebenen Makros
\RelativeToMovArgRef
\NolinkRelativeToMovArgRef
\RelativeToThisPointRef
\NolinkRelativeToThisPointRef
verarbeiten allesamt jeweils zwei unbegrenzte Argumente.
Beim ersten Argument handelt es sich um den Namen des Labels für
den Ausgangspunkt des relativen Verweises. Es wird sowohl das
entsprechende Label vom Makro genau dann geschrieben, als auch ein
Anker für Hyperlinks gesetzt, wenn der LaTeX-Compiler im Quelltext
die Stelle abarbeitet, an der man den Aufruf des Makros hingeschrieben
hat.
Beim zweiten Argument handelt es sich um den Bezugnahmepunkt. Das
entsprechende Makro nebst zugehörigem Verweisanker muss bereits
existieren.
(Um Label zu setzen, verwende man \labelNzlabel{<Name des Labes>} .
Um Label und Anker für Hyperlinks zu setzen, verwende man
\labelNzlabelNanchor{<Name des Labes>}. )
Die beiden Makros, deren Name mit"Nolink" anfängt, erzeugen keine
Hyperlinks, sondern nur die Textphrasen.
Die anderen beiden Makros erzeugen Hyperlinks wenn es nicht ganz
ungut ist, das zu tun. (Ungut wäre es zB innerhalb eines \nameref
-Verweises oder innerhalb des Textes für ein Lesezeichen/Bookmark.)
Die beiden Makros mit "RelativeToMovArgRef" im Namen verlagern, wenn
es um Moving Arguments geht, den Ausgangspunkt für den relativen
Seitenverweis an die Stelle im Dokument, an der das jeweilige
Moving Argument nachher auftaucht.
Ausnahme: Bookmarks. Bookmarks werden in einem separaten Bereich
außerhalb des Bereichs des dargestellten Dokuments angezeigt, während
Ausgangspunkte für relative Seitenverweise aber innerhalb dieses
Bereichs liegen müssen. Für Bookmarks verfahren die
"RelativeToMovArgRef"-Makros so, wie die "RelativeToThisPointRef"-
Makros, die gleich beschrieben werden, immer verfahren.
Die beiden Makros mit "RelativeToThisPointRef" im Namen verlagern, wenn
es um Moving Arguments geht den Ausgangspunkt für den relativen
Seitenverweis nicht. Der Text an der Stelle im Dokument, an der das
jeweilige Moving Argument nachher auftaucht, sollte exakt gleich lauten,
wie der Text an der Stelle, wo das Moving Argument entstanden ist.
Diese vier Makros sind auf erster Ebene nicht robust.
Stattdessen rufen sie, wenn expandiert wird, alle intern das Makro
\RelRef@SituationFork auf.
\RelRef@SituationFork wiederum versucht, zu erraten, was für eine
Situation beim Expandieren gerade vorliegt.
Wenn es zu dem Schluss kommt, dass gerade normaler Text produziert
wird, setzt es zuerst einen Verweisanker und das <label 1>.
(GGfs nach dem Verweisanker- und Labelsetzen) ruft es auf jeden Fall
eines der beiden robusten Makros
\RelRef@RefTwoLabels
\RelRef@AutoCreateLabelAndRelRef
auf.
\RelRef@RefTwoLabels
{<label 1>}%
{<label 2>}%
{\@firstoftwo/\@secondoftwo}%
{\@firstofone/\RelativerefPageHeadingsFormat}%
Dieses Makro
- verwendet <label 1> als Ausgangspunkt.
- verwendet <label 2> als Bezugnahmepunkt.
- erzeugt einen Hyperlink wenn das dritte Argument auf \@firstoftwo
gesetzt ist.
- erzeugt keinen Hyperlink wenn das dritte Argument auf \@secondoftwo
gesetzt ist.
- setzt den Verweis in Großbuchstaben wenn das vierte Argument auf
\RelativerefPageHeadingsFormat gesetzt ist.
- setzt den Verweis nicht in Großbuchstaben wenn das vierte Argument
auf \@firstofone gesetzt ist.
- ruft intern \My@EvaluateDifference auf, um die Differenz der absoluten
Seitenzahlen zu berechnen und (ggfs \MakeUppercase-formatiert)
auszuspucken.
\RelRef@AutoCreateLabelAndRelRef
{<label 2>}%
{\@firstoftwo/\@secondoftwo}%
{\@firstofone/\RelativerefPageHeadingsFormat}%
- erzeugt selbst ein Label und einen Anker als neuen/zu der Stelle, an
der das Moving Argument auftaucht, verlagerten Ausgangspunkt und
macht dann:
\RelRef@RefTwoLabels
{<selbst erzeugtes label>}%
{<label 2>}%
{\@firstoftwo/\@secondoftwo}%
{\@firstofone/\RelativerefPageHeadingsFormat}%
( \RelRef@SituationFork geht beim Raten von folgenden auf die
book-Dokumentklasse bezogenen Beobachtungen aus:
Wenn ganz normaler Text verarbeitet wird, ist:
\protect=\relax
\label weder \ltx@gobble noch \relax
Wenn aus einer Überschrift diejenige Phrase extrahiert wird, die ggfs
vom \label-Makro für \nameref-Verweise geschrieben werden kann, ist:
\protect=\relax und
\label=\ltx@gobble
Wenn vom \label-Makro dann tatsächlich was ins .aux-File geschrieben
wird, ist:
\protect=\@unexpandable@protect
\label weder \ltx@gobble noch \relax
Wenn vom Gliederungsbefehl fürs Inhaltsverzeichnis ein \@writefile-
Eintrag in die .aux-Datei geschrieben wird, ist:
\protect=\@unexpandable@protect
\label=\ltx@gobble
Wenn die Seitenkopf-Zeile per \protected@edef vorbereitet wird, ist:
\protect=\@unexpandable@protect
\label=\relax
Wenn auf den Bildschirm/die Konsole geschrieben wird:
\protect=\string
Wenn anderweitig in Dateien geschrieben wird:
\protect=\noexpand
Wenn der Text für Bookmarks/Lesezichen erzeugt wird:
Das wird per \texorpdfstring ermittelt. )
% requires eTeX extensions
\documentclass{book}
\usepackage[abspage]{zref}
\usepackage{zahl2string}
\PassOptionsToPackage{expand}{gettitlestring}
\usepackage{nameref}[2016/05/21]
\usepackage[plainpages=false]{hyperref}[2018/02/06]
\makeatletter
%% Makros zur Erzeugung von \Labels und zum Setzen von Ankern:
\newcommand\RelRef@nameref@label{}
\AtBeginDocument{\let\RelRef@nameref@label=\label}%
\newcommand*\labelNzlabel[1]{%
\ifx\label\ltx@gobble
\expandafter\ltx@gobble
\else
\expandafter\@firstofone
\fi
{\ifx\label\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\noexpand\labelNzlabel{#1}}%
{\zref@wrapper@babel\zref@labelbyprops{#1}{abspage}%
\RelRef@nameref@label{#1}%
}%
}%
}%
\newcommand*\labelNzlabelNanchor{%
\ifx\label\ltx@gobble
\expandafter\@gobbletwo
\else
\expandafter\@firstofone
\fi
{\ifx\label\relax
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\noexpand\labelNzlabelNanchor}%
{\RelRef@labelNzlabelNanchor}%
}%
}%
\newcounter{RelativeRefAnchorCount}%
\DeclareRobustCommand*\RelRef@labelNzlabelNanchor[1]{%
\begingroup
\Hy@localanchornametrue
\let\Hy@linkcounter=\c@RelativeRefAnchorCount
\Hy@MakeCurrentHrefAuto{RelRefStandpoint}%
\Hy@raisedlink{%
\hyper@anchorstart{\@currentHref}\hyper@anchorend
}%
\zref@wrapper@babel\zref@labelbyprops{#1}{abspage}%
\RelRef@nameref@label{#1}%
\endgroup
}%
%% Makros zum Evaluieren zweier existierender (z)Label zwecks
%% Ermittlung der Differenz der Seitenzahlen und Ausgabe des
%% Verweises:
\DeclareRobustCommand\RelRef@RefTwoLabels[4]{%
\zref@ifrefundefined{#1}{%
\texorpdfstring{%
\nfss@text{\reset@font\bfseries??}%
\@latex@warning{Standpoint `#1` for reference to `#2' on
page \thepage \space undefined}%
\zref@refused{#1}%
\zref@refused{#2}%
}{??}%
}{%
\zref@ifrefundefined{#2}{%
\texorpdfstring{%
\nfss@text{\reset@font\bfseries??}%
\zref@refused{#2}%
}{??}%
}{%
\texorpdfstring{#3{\hyperref[{#2}]}{\@firstofone}}{\@firstofone}{%
\expandafter\expandafter
\expandafter \RelRef@@EvaluateDifference
\RelRef@Difference
{\zref@extract{#1}{abspage}}%
{\zref@extract{#2}{abspage}}%
{#4}%
}%
}%
}%
}%
\newcommand\RelRef@@EvaluateDifference[3]{%
\ifnum#1=0 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{#3{auf ebendieser Seite}}{%
\ifnum#1=1 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{#3{eine Seite weiter #2}}{%
\ifnum#1<13 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{#3{\@numstring{#1} Seiten weiter #2}}{#3{#1 Seiten weiter #2}}%
}%
}%
}%
\newcommand\RelRef@Difference[2]{%
\romannumeral0%
\expandafter\RelRef@@Difference\expandafter{%
\number\numexpr\expandafter\@firstofone
\expandafter{\number#1}-%
\expandafter\@firstofone\expandafter{\number#2}\relax
}%
}%
\newcommand\RelRef@@Difference[1]{%
\ifnum#1>0 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{ {#1}{vorne}}%
{\@firstofone{\expandafter} \expandafter{\number-#1}{hinten}%
}%
}%
%% Makro zum Setzen eines automatisch erzeugten (z)labels
%% als neuen Ausgangspunkt und und zum Evaluieren dieses (z)Label
%% und eines gegebenen existierenden Bezugspunkt-labels
%% zwecks Ermittlung der Differenz der Seitenzahlen und Ausgabe des
%% Verweises:
\newcounter{RelativeRefAutoCreatedLabelCount}%
\DeclareRobustCommand\RelRef@AutoCreateLabelAndRelRef[3]{%
\stepcounter{RelativeRefAutoCreatedLabelCount}%
\RelRef@labelNzlabelNanchor{RELREF@\arabic{RelativeRefAutoCreatedLabelCount}}%
\RelRef@RefTwoLabels{RELREF@\arabic{RelativeRefAutoCreatedLabelCount}}{#1}{#2}{#3}%
}%
%% Makro fürs Erraten der beim Expandieren vorliegenden Situation:
%%
%% \RelRef@SituationFork
%% {<Tokens in case LaTeX processes normal text>}
%% {<Tokens in case LaTeX pocesses stuff that goes into a \newlabel-entry in the .aux-file>}
%% {<Tokens in case LaTeX pocesses stuff that goes into a \@writefile-entry in the .aux-file>}
%% {<Tokens in case LaTeX pocesses stuff that goes into page-headings>}
%% {<Tokens in case LaTeX spits out a \nameref-reference>}%
%% {<Tokens in case LaTeX writes to screen>}%
%% {<Tokens in case LaTeX writes to file>}%
%% {<Tokens in case LaTeX processes a pdf-string>}%
\newcommand\RelRef@SituationFork[8]{%
\texorpdfstring{%
\ifx\protect\string\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#6}{%
\ifx\protect\noexpand\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#7}{%
\ifx\protect\@unexpandable@protect\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{%
\ifx\label\relax\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#4}{%
\ifx\label\@gobble\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#3}{#2}%
}%
}{%
\ifx\label\ltx@gobble\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#5}{#1}%
}%
}%
}%
}{#8}%
}%
%% Die Makros für die Benutzerebene:
\newcommand\RelativerefPageHeadingsFormat{\MakeUppercase}
%%
\newcommand\RelativeToMovArgRef[2]{%
\RelRef@SituationFork{\RelRef@labelNzlabelNanchor{#1}\RelRef@RefTwoLabels{#1}{#2}{\protect\@firstoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@firstoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@firstoftwo}{\protect\RelativerefPageHeadingsFormat}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\protect\RelativeToMovArgRef{#1}{#2}}%
{\protect\RelativeToMovArgRef{#1}{#2}}%
{\RelRef@RefTwoLabels{#1}{#2}{\@secondoftwo}{\protect\@firstofone}}%
}%
\newcommand\NolinkRelativeToMovArgRef[2]{%
\RelRef@SituationFork{\RelRef@labelNzlabelNanchor{#1}\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondoftwo}{\protect\RelativerefPageHeadingsFormat}}%
{\RelRef@AutoCreateLabelAndRelRef{#2}{\protect\@secondofftwo}{\protect\@firstofone}}%
{\protect\RelativeToMovArgRef{#1}{#2}}%
{\protect\RelativeToMovArgRef{#1}{#2}}%
{\RelRef@RefTwoLabels{#1}{#2}{\@secondoftwo}{\protect\@firstofone}}%
}%
\newcommand\RelativeToThisPointRef[2]{%
\RelRef@SituationFork{\RelRef@labelNzlabelNanchor{#1}\RelRef@RefTwoLabels{#1}{#2}{\protect\@firstoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@firstoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@firstoftwo}{\protect\RelativerefPageHeadingsFormat}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\protect\RelativeToThisPointRef{#1}{#2}}%
{\protect\RelativeToThisPointRef{#1}{#2}}%
{\RelRef@RefTwoLabels{#1}{#2}{\@secondoftwo}{\protect\@firstofone}}%
}%
\newcommand\NolinkRelativeToThisPointRef[2]{%
\RelRef@SituationFork{\RelRef@labelNzlabelNanchor{#1}\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\RelativerefPageHeadingsFormat}}%
{\RelRef@RefTwoLabels{#1}{#2}{\protect\@secondoftwo}{\protect\@firstofone}}%
{\protect\RelativeToThisPointRef{#1}{#2}}%
{\protect\RelativeToThisPointRef{#1}{#2}}%
{\RelRef@RefTwoLabels{#1}{#2}{\@secondoftwo}{\protect\@firstofone}}%
}%
% Spässchen:
\usepackage{lastpage}
\usepackage{zref-lastpage}
\def\setfoot{%
\def\@oddfoot{\hbox to\hsize{\hss\hyperref[LastPage]{\MakeUppercase{Das ersehnte Ende des Buches ist} %
\RelRef@AutoCreateLabelAndRelRef{LastPage}{\protect\@secondoftwo}{\protect\RelativerefPageHeadingsFormat}}}%
}%
\def\@evenfoot{\hbox to\hsize{\hyperref[LastPage]{\MakeUppercase{Das ersehnte Ende des Buches ist} %
\RelRef@AutoCreateLabelAndRelRef{LastPage}{\protect\@secondoftwo}{\protect\RelativerefPageHeadingsFormat}}\hss}%
}%
}%
\expandafter\def\expandafter\chaptermark\expandafter#\expandafter1\expandafter{%
\chaptermark{#1}\setfoot
}%
\makeatother
\begin{document}
\frontmatter
\tableofcontents
\chapter{Vorspann-Kap. 1 - Bleibt immer so.
(Hauptteil \RelativeToThisPointRef{MOVINGARGREF}{MAIN:1})%
}\labelNzlabel{FRONT:1}
Bla Bla
\section{Ein Abschnitt im Vorspann}
Bla Bla \newpage Bla Bla \newpage
\chapter{Vorspann-Kap. 2 - Aendert sich.
(Hauptteil \RelativeToMovArgRef{MOVINGARGREFB}{MAIN:1})%
}\labelNzlabel{FRONT:2}
Bla Bla
\section{Ein Abschnitt im Vorspann}
Bla Bla \newpage Bla Bla \newpage
\section{Ein weiterer Abschnitt im Vorspann}%
\labelNzlabel{FRONT:1/2}
Relativer Verweis auf Kapitel 1 des Hauptteils:
\RelativeToThisPointRef{FIRST}{MAIN:1}
Relativer Verweis auf das Kapitel im Vorspann:
\RelativeToThisPointRef{SECOND}{FRONT:1}
Relativer Verweis auf die Anschnittsüberschrift dieses
Abschnitts: \RelativeToThisPointRef{THIRD}{FRONT:1/2}
\mainmatter
\chapter{Kapitel 1 des Hauptteils}\labelNzlabel{MAIN:1}
Bla Bla\newpage
Relativer Verweis auf die nachfolgende Seite:
\RelativeToThisPointRef{FOURTH}{FIFTH}\newpage
Relativer Verweis auf die vorherige Seite:
\RelativeToThisPointRef{FIFTH}{FOURTH}
Relativer Verweis auf den Anfang des Kapitels:
\RelativeToThisPointRef{SIXTH}{MAIN:1}
Relativer Verweis auf das Kapitel im Vorspann:
\RelativeToThisPointRef{SEVENTH}{FRONT:1}
\verb|\nameref|-Verweis auf das Kapitel im Vorspann:
\nameref{FRONT:1}
\verb|\nameref|-Verweis auf das Kapitel im Vorspann:
\nameref{FRONT:1}
\verb|\nameref|-Verweis auf das zweite Kapitel im Vorspann:
\nameref{FRONT:2}
\verb|\nameref|-Verweis auf das zweite Kapitel im Vorspann:
\nameref{FRONT:2}
Relativer Verweis auf den weiteren Abschnitt im Vorspann:
\RelativeToThisPointRef{EIGHT}{FRONT:1/2}
\end{document}