PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : \thepage liefert seltsame Seitenzahlen



pdq
15-03-2011, 18:34
Hallo!

ich wollte mit diesem Befehl hier überprüfen, ob die referenzierte Seite gleich der aktuellen Seite ist, und wenn ja, die Seitenangabe weglassen:


\newcommand{\reff}[1]{\ifthenelse{\equal{\thepage}\pageref{#1}}}
{\ref{#1}}
{\ref{#1}, S.~\pageref{#1}}}

Das funktioniert aber nicht immer, da \thepage seltsame Dinge tut, wie folgendes Beispiel zeigen soll:


\documentclass[pdftex,12pt,oneside]{scrreprt}
\usepackage[ansinew]{inputenc}

\begin{document}

\chapter{lalala}

\vspace{18cm}

Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage.
Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage.


Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage.
Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage. Wir sind auf Seite \thepage.

\end{document}

Hat jemand eine Idee, was das Problem ist, warum die Seitenzahlen erst nach dem ersten Absatz auf Seite 3 stimmen? Ich habe im Forum nichts dazu gefunden... Eine Idee, wie ich es anders lösen kann, ist natürlich auch willkommen!

Danke und viele Grüße,

pdq

Schweinebacke
15-03-2011, 19:39
TeX arbeitet mit einer asynchronen Ausgabe. Absätze werden beispielsweise immer im Ganzen umbrochen und danach ggf. auf mehrere Seiten verteilt. Deshalb kann man auf \thepage außer im Kopf und Fuß zu keinem Zeitpunkt sinnvoll zugreifen. Man bekommt da als Information lediglich die Seite, die aktuell war, als der entsprechende Absatz umbrochen wurde. Die stimmt aber nur zufällig mit der Seite überein, auf der der Text ausgegeben wird.

rstuby
15-03-2011, 20:15
Dadurch ist aber noch nicht erklärt, warum im ersten Absatz auch nach dem dritten Durchlauf noch "1" steht und nicht "2".

voss
15-03-2011, 20:27
Dadurch ist aber noch nicht erklärt, warum im ersten Absatz auch nach dem dritten Durchlauf noch "1" steht und nicht "2".

du kannst mit einem Label arbeiten, dann geht es. Abgesehen davon, niemals \thepage bnutzen, denn das könnte auch sowas liefern: V-1. Also besser mit \arabic{page}


\documentclass[pdftex,12pt,oneside]{scrreprt}
\usepackage[ansinew]{inputenc}
\usepackage{afterpage}
\begin{document}

\chapter{lalala}

\vspace{18cm}\label{SeiteA}\afterpage{\label{Seite B}}

Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}. Wir sind auf Seite \pageref{SeiteA}.
Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}. Wir sind auf Seite \pageref{SeiteB}.

\end{document}

Herbert

trempf
15-03-2011, 23:49
Hallo Voss!

Das ist ja nicht wirklich eine Lösung. Wenn man für das Setzen der Refs den Seitenumbruch von Latex berücksichtigen muss, kann man die Seitenzahl auch selbst hinschreiben. So ein Seitenumbruch verschiebt sich ja schon mal ab und zu. Sonst ist ein \newpage auch ne Lösung. Nach deiner Lösung muss man für jeden Seitenumbruch nen Label setzen, oder verstehe ich da was komplett falsch?

Latex sollte doch durch das Setzen des Umbruchs wissen, welcher Text auf welcher Seite steht!

Trempf

pdq
16-03-2011, 00:43
Ersteinmal vielen Dank für Eure Bemühungen!


Nach deiner Lösung muss man für jeden Seitenumbruch nen Label setzen, oder verstehe ich da was komplett falsch?

So habe ich das auch verstanden. Das wäre keine besonders praktikable Lösung.


Latex sollte doch durch das Setzen des Umbruchs wissen, welcher Text auf welcher Seite steht!

Eben... Muss doch möglich sein?!

rais
16-03-2011, 00:56
Moin moin,


Latex sollte doch durch das Setzen des Umbruchs wissen, welcher Text auf welcher Seite steht!

LaTeX weiß das auch, oder ist Dein TOC voll von falschen Seitenangaben? Es ist nur schwer bis unmöglich, via \thepage -- oder besser \arabic{page} für Vergleiche -- im Fließtext da selbst ranzukommen: besagter Umbruch hat (zur Zeit des Aufrufs) noch gar nicht stattgefunden.

@pdq: schau Dir mal das varioref-Paket an.

MfG

pdq
16-03-2011, 02:33
@pdq: schau Dir mal das varioref-Paket an.

Hallo rais,

das sieht doch genau nach dem aus, was ich suche! Vielen Dank!

Grüße und Gute Nacht,

pdq

Schweinebacke
16-03-2011, 08:03
Dadurch ist aber noch nicht erklärt, warum im ersten Absatz auch nach dem dritten Durchlauf noch "1" steht und nicht "2".
Doch, genau das ist damit erklärt, denn die Anzahl der Durchläufe hat nichts damit zu tun, auf welcher Seite sich LaTeX befindet, wenn es den Absatz umbricht. Und die Seite, auf der sich LaTeX zum Zeitpunkt des Absatzumbruchs befindet, bestimmt das Ergebnis von \thepage, hat aber nur wenig damit zu tun, auf welcher Seite dieses Ergebnis von \thepage ausgegeben wird.

Schweinebacke
16-03-2011, 08:27
Das ist ja nicht wirklich eine Lösung.
Prinzipiell schon. Du musst einfach überall, wo Du einen Vergleich mit der aktuellen Seitenzahl haben musst, ein Label setzen und dann mit dem Ergebnis von \pageref (was nicht direkt möglich ist, aber siehe dazu das Beispiel) vergleichen. Für automatische Vergleiche kann man auch das Label automatisch vergeben lassen.

\documentclass{article}
\usepackage{refcount}
\usepackage[ngerman]{babel}
\usepackage{blindtext}

\newcounter{GleicheSeiteLabel}
\renewcommand*{\theGleicheSeiteLabel}{cmp.label.\a rabic{GleicheSeiteLabel}}

\makeatletter
\newcommand*{\IfGleicheSeite}[1]{%
\stepcounter{GleicheSeiteLabel}%
\label{\theGleicheSeiteLabel}%
\begingroup
\ifnum\getpagerefnumber{#1}=\getpagerefnumber{\the GleicheSeiteLabel}
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
\endgroup
}
\makeatother

\begin{document}
\section{Test}\label{sec:test}
Wir befinden uns hier \IfGleicheSeite{sec:test}{}{nicht }auf der gleichen
Seite wie der Anfang von Abschnitt Test.
\blindtext[10]
Wir befinden uns hier \IfGleicheSeite{sec:test}{}{nicht }auf der gleichen
Seite wie der Anfang von Abschnitt Test.
\end{document}
Näheres zum Hintergrund der Verwendung von refcount und \getpagerefnumber ist der Anleitung zum Paket refcount zu entnehmen.

rstuby
16-03-2011, 08:27
Es "befindet sich" doch aber schon längst auf Seite 2. Du erklärst nur, warum innerhalb des Absatzes nicht auf "3" gewechselt wird. (?)

Schweinebacke
16-03-2011, 08:38
Es "befindet sich" doch aber schon längst auf Seite 2. Du erklärst nur, warum innerhalb des Absatzes nicht auf "3" gewechselt wird. (?)
Woher weist Du auf welcher Seite sich LaTeX befindet, wenn der Absatz umbrochen wird? Die Ausgabe von \thepage beweist ganz klar, dass Du Dich hier irrst.

Zur Erklärung: TeX kann den Seitenumbruch nie am Ende eines Absatzes durchführen, der noch auf die Seite passt. Danach könnte ja noch etwas kommen, was gar keinen Platz braucht oder sogar eine negative vertikale Ausdehnung hat. Im Beispiel kommt erschwerend eine overfull \vbox hinzu. Dass \chapter nicht auf Seite 1, sondern auf Seite 2 landet, liegt an dieser overfull \vbox und macht deutlich, dass \chapter+Abstand+Text für TeX eine Einheit darstellen. Der Seitenumbruch erfolgt also erst, wenn der erste Absatz komplett umbrochen ist.