Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

\pageref als Berechnung?

52 views
Skip to first unread message

Başar Alabay

unread,
Aug 14, 2018, 3:43:14 AM8/14/18
to
Hallo,

ich hatte gerade eine Idee. Wenn man \phantomsection\label{blah} anlegt
und dann an anderer Stelle nun \pageref{blah} angibt, bekommt man ja die
exakte Seite als Zahl. Könnte man dort anstelle dessen eine berechnete
Zahl [aktuelle Seitenzahl - Label-Seite] ausgeben lassen? Also statt
»Seite 13« etwas wie »exakt 222 Seiten vorher«? Das Ergebnis wäre in
diesem Fall die »222«. Ginge das?

B. Alabay

--
http://www.thetrial.de/
ケディエ・ばく・ハヤテ・あんら

Carsten Vogel

unread,
Aug 14, 2018, 8:43:58 AM8/14/18
to
Am 14.08.2018 um 09:43 schrieb Başar Alabay:
> Hallo,
>
> ich hatte gerade eine Idee. Wenn man \phantomsection\label{blah} anlegt
> und dann an anderer Stelle nun \pageref{blah} angibt, bekommt man ja die
> exakte Seite als Zahl. Könnte man dort anstelle dessen eine berechnete
> Zahl [aktuelle Seitenzahl - Label-Seite] ausgeben lassen? Also statt
> »Seite 13« etwas wie »exakt 222 Seiten vorher«? Das Ergebnis wäre in
> diesem Fall die »222«. Ginge das?
#


Ja! Lass' doch LaTeX rechnen!
Leider habe ich keine Lösung out of the box, aber da man mit LaTeX sogar
Marsroboter programmieren kann, sollte so eine Rechnung kein Problem
sein. Die Frage ist nur, ist es ein Register, eine Zahl, eine Zahl mit
Einheit... und wie ist das zu addressieren.

Ein Artikel der des Schmökerns würdig ist, ist:
http://anamorphose.de/rechnen.pdf

Carsten Vogel

unread,
Aug 14, 2018, 9:16:35 AM8/14/18
to
Nicht elegant, nicht vollendet, aber ein Anfang:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{scrartcl}
\usepackage{lipsum}

\newcount\pagediff

\newcommand{\refVorher}[1]{%
Siehe Seite \pageref{#1}, %
\pagediff=\thepage
\advance\pagediff by -\pageref{#1}%
\number\pagediff~Seiten vorher.%
}

\begin{document}
\lipsum[1-70]

\hrulefill\par
\label{abc} \textsc{Hier Hier Hier Hier!}\par
\hrulefill\\

\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-145]
\lipsum[1-132]
\refVorher{abc}

\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ulrich D i e z

unread,
Aug 14, 2018, 12:53:30 PM8/14/18
to
Başar Alabay schrieb:

> ich hatte gerade eine Idee. Wenn man \phantomsection\label{blah} anlegt
> und dann an anderer Stelle nun \pageref{blah} angibt, bekommt man ja die
> exakte Seite als Zahl. Könnte man dort anstelle dessen eine berechnete
> Zahl [aktuelle Seitenzahl - Label-Seite] ausgeben lassen? Also statt
> »Seite 13« etwas wie »exakt 222 Seiten vorher«? Das Ergebnis wäre in
> diesem Fall die »222«. Ginge das?

Seitenzahlen sind in erster Linie Nominalzahlen, um Seiten
benennen zu können.

Nicht bei jedem Dokument sind Seitenzahlen auch Ordinalzahlen,
anhand derer man sich direkt erschliessen kann, an welchem "Platz"
in der Anordnung der Seiten eine bestimmte Seite sich befindet.

ZB ist nicht sicher, dass bei einem Dokument alle Seiten
nummeriert sind, geschweige denn fortlaufend nummeriert sind,
geschweige denn die Seitenzahlen durchgehend dargestellt werden
im Dezimalsystem durch Zusammenstellungen von arabischen Ziffern.

Bei manchen Dokumenten ist zB der Vorspann eigenständig
nummeriert und die Seitenzahlen werden auf römische Weise
dargestellt.

Zum Beispiel ist mir in der UB Tübingen mal ein Buch begegnet,
herausgegeben von einem Verein, der das Duodezimalsystem
propagiert, bei dem zum Spaß auch die Seitenzahlen nicht dezimal
sondern duodezimal angegeben waren.

Außerdem kann man die Ausgabe von \pageref sowieso nicht
direkt zum Rechnen verwenden, weil \pageref, sofern das
hyperref-Paket verwendet wird, das ganze "eingewickelt" in
einen Hyperlink ausspuckt.

Das alles lässt sich jedoch beheben, indem man zB das Modul
abspage aus dem zref Paket von Heiko Oberdiek verwendet.
Durch dieses Modul erhalten alle Seiten fortlaufend, beginnend
bei 1, zusätzlich eine eindeutige Nummer, deren Darstellung
im Dezimalsystem als Zusammenstellung arabischer Ziffern
referenziert werden kann.

Um nun nicht Seitenzahlen direkt anzugeben, sondern Verweise
relativ zur gerade zu setzenden Seite erstellen zu können, muss
man natürlich auch die absolute Seitenzahl der gerade zu
setzenden Seite kennen, die aber, weil die Output-Routine
von TeX asynchron arbeitet, zum Zeitpunkt, zu dem Makros
expandiert werden, noch nicht feststeht. Man muss also auch
ein Label auf der gerade zu setzenden Seite platzieren und dann
die Berchnung anstellen anhand des Labels der gerade zu
setzenden Seite und des Labels der Seite, auf die
verwiesen werden soll.

Übrigens werden die Zahlen von eins bis zwölf oft als Wörter
geschrieben und nicht als Zifferfolgen.
(Dafür gibts zB das Paket zahl2string).

Was man eher nicht tun sollte, ist, so einen Relativ-Verweis
zu einem "moving argument" machen, welches auch auf anderen
Seiten oder in den pdf-Bookmarks oder in mehreren
Seitenüberschriften (-> \pagestyle{headings} und dergleichen)
auftaucht, weil sich mit der "Wanderung" des "moving argument"
ja auch der Ausgangspunkt für den Verweis ändert, was
Verwirrung stiften kann.

Wenn man zB schreibt

\chapter{Geblubber}\label{blubber}
Blubber blubber.

\chapter{Anmerkungen zum Geblubber, welches
\Relativref{blubber} steht}
Laber laber.

, was soll dann im Inhaltsverzeichnis und im entsprechenden
Bookmark und in den Seitenköpfen stehen?

Abgesehen davon habe ich ja schon geschrieben, dass es für
jeden Relativ-Verweis ein Label an der Stelle braucht, wo er
erscheinen soll, weil nur durch so ein Label die Seite, auf
der der Verweis erscheinen soll, richtig bestimmt werden kann.

Dieses Label braucht einen Namen. Die Syntax müsste also sein:

\Relativref{%
<Name des für die Seitenzahlermittlung an
dieser Stelle zu setzenden Labels>%
}{%
<Name des Labels derjenigen Stelle, auf die
verwiesen werden soll>%
}

Wenn der Verweis in einem "moving argument" und/oder in einem
pdf-string auftaucht, gibt es das Problem, dass man verhindern
muss, dass mehrmals versucht wird, das Label zu erzeugen.

Im folgenden habe ich ein Makro \Relativref nach ebendieser
Syntax gebastelt. Es setzt von seinem ersten Argument ein
Label (und spasseshalber auch einen \phantomsection-artigen
Anker für Hyperlinks) und erzeugt dann aus den Daten beider
Argumente/beider Label den Verweis.

Um tatsächlich mit absoluten, über das gesamte Dokument
fortlaufenden Seitenzahlen rechnen zu können, habe ich das zref-
Paket von Heiko Oberdiek mit seinem abspage-Modul bemüht.

Entsprechend muss man auch den \zlabel-Befehl verwenden.
Da das zref-Paket an sich noch keine hyperref-Funktionalität
hat, habe ich der Einfachheit halber \label und \zlabel
parallel verwendet.

Ich habe ausserdem nach bestem Wissen und Gewissen alles
versucht, um zu erreichen, dass nur dann vom ersten Argument
ein Label und ein Anker für Hyperliks erzeugt wird, wenn
\Relativref nicht aus einem Moving Argument heraus aufgerufen
wird.

Man beachte auch bite die angegebenen "Mindest-Versions-
nummern" der von mir verwendeten Pakete nameref und hyperref
und den Umstand, dass das Paket gettitlestring mit der
Option "expand" geladen werden muss.

Bisher nahm ich an, dass das hyperref-Paket intern das
nameref-Paket laden würde.

Ich stehe aber vor dem Phänomen, dass mir der Aufruf von
\GetTitleStringDisableCommands die Fehlermeldung beschert,
es handle sich um eine nicht definierte Kontrollsequenz,
wenn ich das nameref-Paket nicht explizit laden lasse.

Ulrich


Hier das Ergebnis meiner bescheidenen Bemühungen: ;-)


% requires e-TeX-extensions.
\documentclass{book}
\usepackage[abspage,user]{zref}
\usepackage{zahl2string}
%\usepackage{titleref}
\PassOptionsToPackage{expand}{gettitlestring}
\usepackage{nameref}[2016/05/21]
\usepackage[plainpages=false]{hyperref}[2018/02/06]
\makeatletter
\newcommand\MovingArgFork{%
\texorpdfstring{%
\ifx\protect\@unexpandable@protect
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}{\@firstoftwo}%
}%
\GetTitleStringDisableCommands{%
\let\MovingArgFork\@firstoftwo
\let\Relativeref=\RelativeRef@Nolabel
\let\NolinkRelativeref=\NolinkRelativeRef@Nolabel
\def\labelNzlabel#1{\@bsphack\@esphack}%
}%
\pdfstringdefDisableCommands{%
\let\MovingArgFork\@firstoftwo
\let\Relativeref=\RelativeRef@Nolabel
\let\NolinkRelativeref=\NolinkRelativeRef@Nolabel
\def\labelNzlabel#1{}%
}%
\newcounter{relativerefcount}%
\newcommand*\labelNzlabel[1]{%
\MovingArgFork{}{%
\zlabel{#1}\hskip-\@savsk\hskip\@savsk\label{#1}%
}%
}%
\newcommand\Relativeref[2]{%
\texorpdfstring{\MovingArgFork{}{%
\begingroup
\Hy@localanchornametrue
\let\Hy@linkcounter=\c@relativerefcount
\Hy@MakeCurrentHrefAuto{RelativeRefStandpoint}%
\Hy@raisedlink{%
\hyper@anchorstart{\@currentHref}\hyper@anchorend
}%
\labelNzlabel{#1}%
\endgroup
}}{}%
\RelativeRef@Nolabel{#1}{#2}%
}%
\newcommand\RelativeRef@Nolabel[2]{%
\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{\hyperref[{#2}]}{\@firstofone}{%
\My@EvaluateDifference{\zref@extract{#1}{abspage}}%
{\zref@extract{#2}{abspage}}%
}%
}%
}%
}%
\newcommand\NolinkRelativeref[2]{%
\texorpdfstring{\MovingArgFork{}{%
\begingroup
\Hy@localanchornametrue
\let\Hy@linkcounter=\c@relativerefcount
\Hy@MakeCurrentHrefAuto{RelativeRefStandpoint}%
\Hy@raisedlink{%
\hyper@anchorstart{\@currentHref}\hyper@anchorend
}%
\labelNzlabel{#1}%
\endgroup
}}{}%
\NolinkRelativeRef@Nolabel{#1}{#2}%
}%
\newcommand\NolinkRelativeRef@Nolabel[2]{%
\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}%
}{??}%
}{%
\My@EvaluateDifference{\zref@extract{#1}{abspage}}%
{\zref@extract{#2}{abspage}}%
}%
}%
}%
\newcommand\My@Difference[2]{%
\romannumeral0%
\expandafter\My@@Difference\expandafter{%
\number\numexpr\expandafter\@firstofone
\expandafter{\number#1}-%
\expandafter\@firstofone\expandafter{\number#2}\relax
}%
}%
\newcommand\My@@Difference[1]{%
\ifnum#1>0 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{ {#1}{vorne}}{%
\@firstofone{\expandafter} \expandafter{\number-#1}{hinten}%
}%
}%
\newcommand\My@EvaluateDifference[2]{%
\expandafter\expandafter
\expandafter\My@@EvaluateDifference\My@Difference{#1}{#2}%
}%
\newcommand\My@@EvaluateDifference[2]{%
\ifnum#1=0 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{auf ebendieser Seite}{%
\ifnum#1=1 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{eine Seite weiter #2}{%
\ifnum#1<13 \expandafter\@firstoftwo
\else\expandafter\@secondoftwo\fi
{\@numstring{#1} Seiten weiter #2}{#1 Seiten weiter #2}%
}%
}%
}%

\makeatother

\begin{document}

\frontmatter

\tableofcontents

\chapter{Kapitel im Vorspann.
\MovingArgFork{%
(Hauptteil \NolinkRelativeref{MOVINGARGREF}{MAIN:1})%
}{%
(Hauptteil \Relativeref{MOVINGARGREF}{MAIN:1})%
}%
}\labelNzlabel{FRONT:1}
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:
\Relativeref{FIRSTRELATIVEREF}{MAIN:1}

Relativer Verweis auf das Kapitel im Vorspann:
\Relativeref{SECONDRELATIVEREF}{FRONT:1}

Relativer Verweis auf die Anschnittsüberschrift dieses
Abschnitts: \Relativeref{THIRDRELATIVEREF}{FRONT:1/2}

\mainmatter

\chapter{Kapitel 1 des Hauptteils}\labelNzlabel{MAIN:1}
Bla Bla\newpage

Relativer Verweis auf die nachfolgende Seite:
\Relativeref{FOURTHRELATIVEREF}{FIFTHRELATIVEREF}\newpage

Relativer Verweis auf die vorherige Seite:
\Relativeref{FIFTHRELATIVEREF}{FOURTHRELATIVEREF}

Relativer Verweis auf den Anfang des Kapitels:
\Relativeref{SIXTHRELATIVEREF}{MAIN:1}

Relativer Verweis auf das Kapitel im Vorspann:
\Relativeref{SEVENTHRELATIVEREF}{FRONT:1}

\verb|\nameref|-Verweis auf das Kapitel im Vorspann:
\nameref{FRONT:1}

Relativer Verweis auf den weiteren Abschnitt im Vorspann:
\Relativeref{EIGHTHRELATIVEREF}{FRONT:1/2}

\end{document}

Rolf Niepraschk

unread,
Aug 14, 2018, 3:17:42 PM8/14/18
to
Am 14.08.18 um 09:43 schrieb Başar Alabay:
Vermutlich kann Dir das Paket "zref" nützlich sein.

...Rolf

Başar Alabay

unread,
Aug 15, 2018, 2:38:59 AM8/15/18
to
Ulrich D i e z schrieb:

>> ich hatte gerade eine Idee. Wenn man \phantomsection\label{blah} anlegt
>> und dann an anderer Stelle nun \pageref{blah} angibt, bekommt man ja die
>> exakte Seite als Zahl. Könnte man dort anstelle dessen eine berechnete
>> Zahl [aktuelle Seitenzahl - Label-Seite] ausgeben lassen? Also statt
>> »Seite 13« etwas wie »exakt 222 Seiten vorher«? Das Ergebnis wäre in
>> diesem Fall die »222«. Ginge das?
>
> ZB ist nicht sicher, dass bei einem Dokument alle Seiten
> nummeriert sind, geschweige denn fortlaufend nummeriert sind,
> geschweige denn die Seitenzahlen durchgehend dargestellt werden
> im Dezimalsystem durch Zusammenstellungen von arabischen Ziffern.
>
> Bei manchen Dokumenten ist zB der Vorspann eigenständig
> nummeriert und die Seitenzahlen werden auf römische Weise
> dargestellt.

Ja, so ist das bei mir. \frontmatter ist groß römisch, \mainmatter und
\backmatter sind dann arabisch.

> Zum Beispiel ist mir in der UB Tübingen mal ein Buch begegnet,
> herausgegeben von einem Verein, der das Duodezimalsystem
> propagiert, bei dem zum Spaß auch die Seitenzahlen nicht dezimal
> sondern duodezimal angegeben waren.

Oh, die Idee ist aber verdammt gut :-)

> Außerdem kann man die Ausgabe von \pageref sowieso nicht
> direkt zum Rechnen verwenden, weil \pageref, sofern das
> hyperref-Paket verwendet wird, das ganze "eingewickelt" in
> einen Hyperlink ausspuckt.

Ja.

> Das alles lässt sich jedoch beheben, indem man zB das Modul
> abspage aus dem zref Paket von Heiko Oberdiek verwendet.
> Durch dieses Modul erhalten alle Seiten fortlaufend, beginnend
> bei 1, zusätzlich eine eindeutige Nummer, deren Darstellung
> im Dezimalsystem als Zusammenstellung arabischer Ziffern
> referenziert werden kann.

Ich habe mir zref schon angeschaut und hatte ein wenig das Gefühl, daß
es so in die Richtung gehen könnte. Aber dann wußte ich nicht weiter.

> Um nun nicht Seitenzahlen direkt anzugeben, sondern Verweise
> relativ zur gerade zu setzenden Seite erstellen zu können, muss
> man natürlich auch die absolute Seitenzahl der gerade zu
> setzenden Seite kennen, die aber, weil die Output-Routine
> von TeX asynchron arbeitet, zum Zeitpunkt, zu dem Makros
> expandiert werden, noch nicht feststeht. Man muss also auch
> ein Label auf der gerade zu setzenden Seite platzieren und dann
> die Berchnung anstellen anhand des Labels der gerade zu
> setzenden Seite und des Labels der Seite, auf die
> verwiesen werden soll.

Leuchtet ein.

> Übrigens werden die Zahlen von eins bis zwölf oft als Wörter
> geschrieben und nicht als Zifferfolgen.
> (Dafür gibts zB das Paket zahl2string).

Im Relativen nur, oder? Meine Sprünge sind viel größer.

> Was man eher nicht tun sollte, ist, so einen Relativ-Verweis
> zu einem "moving argument" machen, welches auch auf anderen
> Seiten oder in den pdf-Bookmarks oder in mehreren
> Seitenüberschriften (-> \pagestyle{headings} und dergleichen)
> auftaucht, weil sich mit der "Wanderung" des "moving argument"
> ja auch der Ausgangspunkt für den Verweis ändert, was
> Verwirrung stiften kann.

Hm. Kommt drauf an, was der Ausgangs- und was der Endppunkt ist. Ich
glaube, so in ungefähr verstehe ich, was Du meinst. Aber man mißt ja
immer die Distanz vom »hier« zum »dort«. Das markierte »dort« könnte von
mehreren »hier« angesteuert werden. Dann wäre das \label{dort} ja
eigentlich immer der gleiche … Ausgangspunkt. Wobei es mir nur um eine
einzige Stelle ging. UNd ich bin mir nicht sicher, ob ich das
hinbekommen werde.

> Wenn man zB schreibt
>
> \chapter{Geblubber}\label{blubber}
> Blubber blubber.
>
> \chapter{Anmerkungen zum Geblubber, welches
> \Relativref{blubber} steht}
> Laber laber.
>
> , was soll dann im Inhaltsverzeichnis und im entsprechenden
> Bookmark und in den Seitenköpfen stehen?

Geblubber und Anmerkungen zum Geblubber, welches Geblubber steht. Da
fehlt ein »in«. Aber, ginge doch?! :-)

> Abgesehen davon habe ich ja schon geschrieben, dass es für
> jeden Relativ-Verweis ein Label an der Stelle braucht, wo er
> erscheinen soll, weil nur durch so ein Label die Seite, auf
> der der Verweis erscheinen soll, richtig bestimmt werden kann.

Ja.

> Dieses Label braucht einen Namen. Die Syntax müsste also sein:
>
> \Relativref{%
> <Name des für die Seitenzahlermittlung an
> dieser Stelle zu setzenden Labels>%
> }{%
> <Name des Labels derjenigen Stelle, auf die
> verwiesen werden soll>%
> }
>
> Wenn der Verweis in einem "moving argument" und/oder in einem
> pdf-string auftaucht, gibt es das Problem, dass man verhindern
> muss, dass mehrmals versucht wird, das Label zu erzeugen.

Jjjja. Hm.

> Im folgenden habe ich ein Makro \Relativref nach ebendieser
> Syntax gebastelt. Es setzt von seinem ersten Argument ein
> Label (und spasseshalber auch einen \phantomsection-artigen
> Anker für Hyperlinks) und erzeugt dann aus den Daten beider
> Argumente/beider Label den Verweis.

Mir ist aufgefallen, daß ich fast immer ohne \phantomsection auf den
falschen Seiten lande. Ich weiß jetzt nicht mehr, ob nur der Link falsch
anlandete oder auch der ausgegebene Text. Aber ich habe fast überall ein
\phantomsection dazugepackt. Außer bei direkten Ansprüngen auf \part{}.
Außer diese \part{} referenziere ich eh ausschließlich \addchap{}. Die
\section*{} und \subsection*{}, die vorkommen können, bleiben außen vor.

> Um tatsächlich mit absoluten, über das gesamte Dokument
> fortlaufenden Seitenzahlen rechnen zu können, habe ich das zref-
> Paket von Heiko Oberdiek mit seinem abspage-Modul bemüht.
>
> Entsprechend muss man auch den \zlabel-Befehl verwenden.
> Da das zref-Paket an sich noch keine hyperref-Funktionalität
> hat, habe ich der Einfachheit halber \label und \zlabel
> parallel verwendet.

Man könnte also \hyperref und \zref gemeinsam nutzen?

> Ich habe ausserdem nach bestem Wissen und Gewissen alles
> versucht, um zu erreichen, dass nur dann vom ersten Argument
> ein Label und ein Anker für Hyperliks erzeugt wird, wenn
> \Relativref nicht aus einem Moving Argument heraus aufgerufen
> wird.

Das ist so ein Stolperding :-)

> Man beachte auch bite die angegebenen "Mindest-Versions-
> nummern" der von mir verwendeten Pakete nameref und hyperref
> und den Umstand, dass das Paket gettitlestring mit der
> Option "expand" geladen werden muss.

Ich bin auf TeXLive 20166 festgenagelt … mal sehen, ob das alles noch
relevant wird.

> Bisher nahm ich an, dass das hyperref-Paket intern das
> nameref-Paket laden würde.
>
> Ich stehe aber vor dem Phänomen, dass mir der Aufruf von
> \GetTitleStringDisableCommands die Fehlermeldung beschert,
> es handle sich um eine nicht definierte Kontrollsequenz,
> wenn ich das nameref-Paket nicht explizit laden lasse.

Aha.

> Hier das Ergebnis meiner bescheidenen Bemühungen: ;-)

Werde ich nachher ausprobieren.

> \end{document}

Vielen Dank.

Başar Alabay

unread,
Aug 15, 2018, 2:42:14 AM8/15/18
to
Rolf Niepraschk schrieb:

>> ich hatte gerade eine Idee. Wenn man \phantomsection\label{blah} anlegt
>> und dann an anderer Stelle nun \pageref{blah} angibt, bekommt man ja die
>> exakte Seite als Zahl. Könnte man dort anstelle dessen eine berechnete
>> Zahl [aktuelle Seitenzahl - Label-Seite] ausgeben lassen? Also statt
>> »Seite 13« etwas wie »exakt 222 Seiten vorher«? Das Ergebnis wäre in
>> diesem Fall die »222«. Ginge das?
>>
>> B. Alabay
>>
>
> Vermutlich kann Dir das Paket "zref" nützlich sein.

Das dachte ich auch. Aber dann kam ich nicht weiter im Denken. Es
scheint, daß dies kein alltägliches Szenario ist. Kleinere Sprünge und
Lokalisierungen auf der Seite – das gibt es viel diskutiert.

Ulrich D i e z

unread,
Aug 15, 2018, 6:17:59 AM8/15/18
to
Başar Alabay schrieb:

Basar Alabay schrieb:

> Ulrich D i e z schrieb:

>> Übrigens werden die Zahlen von eins bis zwölf oft als Wörter
>> geschrieben und nicht als Zifferfolgen.
>> (Dafür gibts zB das Paket zahl2string).
>
> Im Relativen nur, oder? Meine Sprünge sind viel größer.

Wenn der Verweis zB auf eine Seite geht, die elf Seiten weiter vorne
ist, dann schreibt man die Zahl als Wort: "...elf Seiten weiter
vorne...".

Wenn der Verweis zB auf eine Seite geht, die mehr als zwölf Seiten
weiter vorne liegt, zB dreihundert Seiten weiter vorne, dann kann man
die Zahl auch als Ziffernfolge schreiben: "...300 Seiten weiter
vorne...".

Ich habe es in meinem Beispiel so gemacht, dass das Zahlwort statt der
Ziffernfolge verwendet wird wenn die Anzahl an zu überblätternden
Seiten kleiner oder gleich 12 ist.

>> Wenn man zB schreibt
>>
>> \chapter{Geblubber}\label{blubber}
>> Blubber blubber.
>>
>> \chapter{Anmerkungen zum Geblubber, welches
>> \Relativref{blubber} steht}
>> Laber laber.
>>
>> , was soll dann im Inhaltsverzeichnis und im entsprechenden
>> Bookmark und in den Seitenköpfen stehen?
>
>Geblubber und Anmerkungen zum Geblubber, welches Geblubber steht. Da
>fehlt ein »in«. Aber, ginge doch?! :-)

Mir geht es um folgendes:

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


In meinem Beispiel ist die Sache derzeit so gelöst, dass
Kapitelüberschriften möglichst immer exakt so hingepinselt werden, wie
sie im Haupttext stehen.


Aber wenn solche Seitenverweise, die in Relation zu Ausgangspunkten
angegeben werden, als Moving Arguments gehandhabt werden, sodass
man entscheiden muss, ob man den Ausgangspunkt für den Verweis
als dorthin verschoben betrachten muss, wo das Argument "hingewandert"
ist, oder nicht, dann wird es eben lustig.

Ulrich

Başar Alabay

unread,
Aug 17, 2018, 1:22:35 AM8/17/18
to
Ulrich D i e z schrieb:

> 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?

Ah ja, mit klarem Kopf … Man könnte das ja jetzt mit einem []{} lösen,
aber nein, das gehört da nicht wirklich hin, das leuchtet mir ein.

> 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?

Separates Fensterchen?

> 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.

Wobei ich diese Relativitäten auch eher unpraktisch und seltsam fände.
Das müßte absolut sein. Relativität ergibt bei kleinen Sprüngen, klaren
Referenzen im Fluß oder aus einem bestimmten Jux heraus Sinn.

> Aber wenn solche Seitenverweise, die in Relation zu Ausgangspunkten
> angegeben werden, als Moving Arguments gehandhabt werden, sodass
> man entscheiden muss, ob man den Ausgangspunkt für den Verweis
> als dorthin verschoben betrachten muss, wo das Argument "hingewandert"
> ist, oder nicht, dann wird es eben lustig.

Jux eben :-)

Ulrich D i e z

unread,
Aug 21, 2018, 8:41:09 PM8/21/18
to
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}

Başar Alabay

unread,
Aug 22, 2018, 4:52:53 AM8/22/18
to
Ulrich D i e z schrieb:

> Sollte mal jemand auf die finstere Idee kommen, so einen relativen
> Seitenverweis in eine Absatzüberschrift zu packen, dann wird es lustig.

Ich packe oft Labels an solche Stellen.

> 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

Da ist die Antwort für mich völlig klar: ersteres!

> 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.

Notfalls bräuchte es eine Art von ifthenelse-Regeln.

> \end{document}

Aber echt mal :-)

Grüße

Axel Berger

unread,
Aug 22, 2018, 10:39:57 AM8/22/18
to
Ba?ar Alabay wrote:
> Ich packe oft Labels an solche Stellen.

Labels sind unkritisch. Verweise haben imho an solchen Stellen nichts zu
suchen und wenn, dann ist es eine solche Ausnahme, daß die Nutzung des
optionalen Argumentes angemessen und nicht zu viel Aufwand ist.

--
/¯\ No | Dipl.-Ing. F. Axel Berger Tel: +49/ 221/ 7771 8067
\ / HTML | Roald-Amundsen-Straße 2a Fax: +49/ 221/ 7771 8069
 X in | D-50829 Köln-Ossendorf http://berger-odenthal.de
/ \ Mail | -- No unannounced, large, binary attachments, please! --
0 new messages