Anzeige:
Ergebnis 1 bis 12 von 12

Thema: \thepage liefert seltsame Seitenzahlen

  1. #1
    Registrierter Benutzer Avatar von pdq
    Registriert seit
    30.11.2009
    Ort
    Heidelberg
    Beiträge
    12

    Question \thepage liefert seltsame Seitenzahlen

    Hallo!

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

    Code:
    \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:

    Code:
    \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
    Hallo rosa Wolke. (Blümchen)

  2. #2
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    Dadurch ist aber noch nicht erklärt, warum im ersten Absatz auch nach dem dritten Durchlauf noch "1" steht und nicht "2".

  4. #4
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von rstuby Beitrag anzeigen
    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}

    Code:
    \documentclass[pdftex,12pt,oneside]{scrreprt}
    \usepackage[ansinew]{inputenc}
    \usepackage{afterpage}
    \begin{document}
    
    \chapter{lalala}
    
    \vspace{18cm}\label{SeiteA}\afterpage{\label{SeiteB}}
    
    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    20.09.2005
    Beiträge
    14
    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

  6. #6
    Registrierter Benutzer Avatar von pdq
    Registriert seit
    30.11.2009
    Ort
    Heidelberg
    Beiträge
    12
    Ersteinmal vielen Dank für Eure Bemühungen!

    Zitat Zitat von trempf Beitrag anzeigen
    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.

    Zitat Zitat von trempf Beitrag anzeigen
    Latex sollte doch durch das Setzen des Umbruchs wissen, welcher Text auf welcher Seite steht!
    Eben... Muss doch möglich sein?!
    Hallo rosa Wolke. (Blümchen)

  7. #7
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.859
    Moin moin,
    Zitat Zitat von trempf Beitrag anzeigen
    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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  8. #8
    Registrierter Benutzer Avatar von pdq
    Registriert seit
    30.11.2009
    Ort
    Heidelberg
    Beiträge
    12
    Zitat Zitat von rais Beitrag anzeigen
    @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
    Hallo rosa Wolke. (Blümchen)

  9. #9
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    Zitat Zitat von rstuby Beitrag anzeigen
    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.

  10. #10
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    Zitat Zitat von trempf Beitrag anzeigen
    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.
    Code:
    \documentclass{article}
    \usepackage{refcount}
    \usepackage[ngerman]{babel}
    \usepackage{blindtext}
    
    \newcounter{GleicheSeiteLabel}
    \renewcommand*{\theGleicheSeiteLabel}{cmp.label.\arabic{GleicheSeiteLabel}}
    
    \makeatletter
    \newcommand*{\IfGleicheSeite}[1]{%
      \stepcounter{GleicheSeiteLabel}%
      \label{\theGleicheSeiteLabel}%
      \begingroup
        \ifnum\getpagerefnumber{#1}=\getpagerefnumber{\theGleicheSeiteLabel}
          \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.

  11. #11
    Registrierter Benutzer
    Registriert seit
    06.03.2010
    Ort
    St. Petersburg, Russland
    Beiträge
    2.468
    Es "befindet sich" doch aber schon längst auf Seite 2. Du erklärst nur, warum innerhalb des Absatzes nicht auf "3" gewechselt wird. (?)

  12. #12
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    Zitat Zitat von rstuby Beitrag anzeigen
    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.

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •