Referenz gilbt Falsches aus

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


Bebbi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 65
Registriert: Do 4. Jan 2018, 02:32

Referenz gilbt Falsches aus

Beitrag von Bebbi »

Hallo,

ich habe Referenzen und verweise auf die, aber es kommen entweder ?? oder eine falscher Verweis.
\documentclass[ngerman]{scrbook}

\usepackage{fontspec}
\usepackage{babel}
\usepackage{graphicx,geometry}

\newcounter{ANr}[chapter]
\newcounter{ANrB}[ANr]
\renewcommand\theANrB{\theANr\alph{ANrB}} 

\newcommand*\F{\textbf{Frage:\quad}}
\newcommand*\Sprecher[1]{{\textbf{#1:\quad}\refstepcounter{ANr}\marginpar{\theANr}}}
\newcommand*\Unterabsatz{\leavevmode\refstepcounter{ANrB}\marginpar{\theANrB}} 
\makeatletter 
\renewcommand*{\p@ANr}{Kap.~\thechapter~Rn.~} 
\renewcommand*{\p@ANrB}{Kap.~\thechapter~Rn.~} 
\makeatother 

\usepackage{blindtext} 


\begin{document}
\chapter{Kapitel}

\Sprecher{Gast}\blindtext

\F Ich möchte wissen.

\Sprecher{Gast}\blindtext \label{mittagsprecherA}.

\F Ich möchte wissen.

\Sprecher{Gast} \blindtext \label{mittagsprecherE}.

s. \ref{mittagsprecherA} bis \ref{mittagsprecherE} auf Seite~\pageref{mittagsprecherA}.

\end{document}

Am Ende sollte stehen "s. Kap. 1 Rn. 2 bis Kap. 1 Rn 3 auf Seite 1".

Grüße

Bebbi

Gast

Beitrag von Gast »

Du musst ein Paar Klammern in der Definition von \Sprecher entfernen, da sonst die Informationen über das aktuelle Label in einer Gruppe versteckt bleiben.
\newcommand*\Sprecher[1]{\textbf{#1:}\quad\refstepcounter{ANr}\marginpar{\theANr}}
sollte funktionieren.

Ich würde auch empfehlen, das \label so nah wie möglich an den zugehörigen \Sprecher-Aufruf zu schreiben (das ist aber nur wichtig, wenn im nachfolgenden Text andere \refstepcounter ausgeführt werden).
\documentclass[ngerman]{scrbook}
\usepackage{babel}

\newcounter{ANr}[chapter]
\newcounter{ANrB}[ANr]
\renewcommand\theANrB{\theANr\alph{ANrB}}

\newcommand*\F{\textbf{Frage:}\quad}
\newcommand*\Sprecher[1]{\textbf{#1:}\quad\refstepcounter{ANr}\marginpar{\theANr}}
\newcommand*\Unterabsatz{\leavevmode\refstepcounter{ANrB}\marginpar{\theANrB}}
\makeatletter
\renewcommand*{\p@ANr}{Kap.~\thechapter~Rn.~}
\renewcommand*{\p@ANrB}{Kap.~\thechapter~Rn.~}
\makeatother

\usepackage{blindtext}


\begin{document}
\chapter{Kapitel}

\Sprecher{Gast}\blindtext

\F Ich möchte wissen.

\Sprecher{Gast}\label{mittagsprecherA} \blindtext.

\F Ich möchte wissen.

\Sprecher{Gast}\label{mittagsprecherE} \blindtext.

s.~\ref{mittagsprecherA} bis \ref{mittagsprecherE} auf Seite~\pageref{mittagsprecherA}.

\end{document}

Bebbi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 65
Registriert: Do 4. Jan 2018, 02:32

Beitrag von Bebbi »

Hallo,

ich habe mir die Klammern selbst mehrere Mal angeschaut … nun sehe ich die auch.

Ich dachte ein zusätzliches Klammerpaar wäre egal, ich habe ja auch jetzt mehrere Klammerebenen im eigentlichen Dokument.


Grüße

Bebbi

Gast

Beitrag von Gast »

Klammern erzeugen, wenn sie nicht als Argumentbegrenzer genutzt werden, im Normalfall eine Gruppe. Innerhalb einer Gruppe sind die meisten Anweisungen und ihre Wirkungen standardmäßig lokal, nur wenn es explizit gefordert ist, sind zum Beispiel Definitionen global, sonst werden die ursprünglichen Definitionen am Ende der Gruppe wiederhergestellt. Darum gibt das folgende Beispiel auch die Ausgabe "foo//bar//foo"
\documentclass{article}

\def\foo{foo}

\begin{document}
\foo

{\def\foo{bar}
 \foo}

\foo
\end{document}
In vielen Fällen ist es nicht unbedingt schädlich, eine neue und eventuell überflüssige Gruppe zu starten {\textbf{Foo}} ist nicht viel anders als \textbf{Foo}. (Im Mathematikmodus gibt es aber sehr wohl einen Unterschied zwischen $a+b$ und $a{+}b$. Dort verwandeln Klammern ihren Inhalt in ein mathord.)

So weit so gut.

Wie Du sicher weißt, bezieht sich ein \label immer (in der Faustregel) auf den zuletzt (mit \refstepcounter) hochgezählten Counter. Wie \label und \refstepcounter genau funktionieren, steht auf Seite 262 von [d]source2e[/d] in §52.1 Cross Referencing. \refstepcounter setzt den gegebenen Zähler mit \stepcounter hoch und definiert dann den internen Befehl \@currentlabel als die aktuelle Ausgabe des soeben gesetzten Zählers, diese Zuweisung ist lokal, das Hochsetzen des Zählers jedoch ist wie jede LaTeX-Zähleroperation global. \label greift auf den aktuellen Wert von \@currentlabel zu und schreibt diesen Wert als Ausgabe für das angegeben Label in die .aux-Datei.

Mit dieser Kenntnis können wir erklären, warum die zusätzlichen Gruppenklammern in \newcommand*\Sprecher[1]{{\textbf{#1:\quad}\refstepcounter{ANr}\marginpar{\theANr}}} schädlich sind.
Wenn LaTeX
\Sprecher{Gast}\label{mittagsprecherA}\blindtext
ausführt, passiert folgendes.
\Sprecher öffnet zunächst eine Gruppe, alle Operationen, die nicht explizit global sind, sind lokal zu dieser Gruppe. Dann wird #1:\quad in Fett gedruckt. Der Zähler ANr wird (global) um eins hoch gesetzt, der Wert von \@currentlabel wird lokal(!) auf den Ausgabewert von ANr gesetzt. Die Ausgabe von \theANr wird in den Rand geschrieben. Dann endet die Gruppe und alle lokalen Zuweisungen gehen verloren. Insbesondere wird \@currentlabel auf seinen vorherigen Wert zurückgesetzt. In Deinem Minimalbeispiel ist das die 1 von der Kapitelzählung. Dann erst wird \label{mittagsprecherA} ausgeführt. Der Befehl nimmt den aktuellen Wert von \@currentlabel (die "1") und schreibt ihn als Ausgabe für das Label mittagsprecherA in die .aux-Datei. Im nächsten LaTeX-Durchlauf wird das Label durch eine 1 ersetzt.

Bebbi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 65
Registriert: Do 4. Jan 2018, 02:32

Beitrag von Bebbi »

Danke. Klingt kompliziert, aber ich glaub, ich könnte folgen. Das erklärt, warum mittagsprecherA und mittagsprecherE immer den gleichen Wert hatten und es kein Problem in einer Befehlsdefinition klappte, da da keine Gruppe eröffnet wurde.

Grüße

Bebbi

Antworten