Seite 1 von 1

Werteübergabe von Zählervariablen in labels

Verfasst: Sa 10. Mär 2018, 01:08
von ascore5000
Hallo Liebes Forum,

ich habe folgendes Problem:
Wie man im nachfolgenden Minimalbeispiel sieht, versuche ich die Texte, die beim Referenzieren von Labels ausgegeben werden anzupassen. Dabei soll der gewünschte Text aus der Überschrift (muss nicht unbedingt die Überschrift sein, kann auch anders funktionieren) genommen werden.
Problem: Habe ich hier eine Zählervariable drin, wird diese in der .aux-Datei nicht als Wert sondern als Befehl eingefügt:
\newlabel{x}{{1}{1}{Ueberschrift-Nr. \arabic {Testcounter}}{}{}}
Dementsprechend wird bei der Referenz der aktuelle Wert der Variable an der aktuellen Stelle im Dokument ausgegeben.

Hier das Minimalbeispiel:
\documentclass[
	a4paper,
]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{nameref}

\newcounter{Testcounter}
\newenvironment{Testueberschrift}[1]{
	\refstepcounter{Testcounter}
	\paragraph{Ueberschrift-Nr. \arabic{Testcounter}}
	\label{#1}
}{}

\begin{document}

Testtext, an dem die Referenz hängt: \nameref{y}

\begin{Testueberschrift}{x}
Text unter einer Überschrift.
\end{Testueberschrift}

\begin{Testueberschrift}{y}
Text unter einer anderen Überschrift.
\end{Testueberschrift}

\end{document}
Ich hoffe mein Problem ist verständlich.

Vielen Dank vorab für eure Hilfe!
ascore5000

Verfasst: Sa 10. Mär 2018, 08:49
von Johannes_B
Für mich nicht verständlich. LaTeX bietet dir doch bereits funktionierende automatisch nummerierte und referenzierbare überschriften an. Warum versuchst du das Rad neu zu erfinden?

Verfasst: Sa 10. Mär 2018, 11:54
von ascore5000
Hallo Johannes,

das Gezeigte ist nur ein Minimalbeispiel und wird in der eigentlichen Umsetzung deutlich komplexer.
Konkret: Ich habe mehrere Objekte die ich zweistufig durchnummerieren muss: 1-1, 1-2, 1-3, ... 2-1, 2-2, 2-2...
Auf diese möchte ich später Referenzieren können, und zwar so, dass im Haupttext dann ein eigener Text dargestellt wird, den ich in currentlabel setze.

Ich muss das auch nicht unbedingt in dem paragraph drin machen. Ich habe schon verschiedene Dinge mit \@currentlabel getestet, das wäre mir auch sehr recht, dort tritt aber das gleiche Verhalten auf:
\documentclass[
	a4paper,
]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{nameref}


\makeatletter
\newcommand{\myLabel}[1]{
  \def\@currentlabelname{#1}
}
\makeatother

\newcounter{Testcounter}
\newenvironment{TestObjekt}[1]{
	\refstepcounter{Testcounter}
	Ein Objekt Nr. \arabic{Testcounter} \\
	\myLabel{Zu Objekt Nr.-\arabic{Testcounter}}
	\label{#1}
}{}

\begin{document}

Testtext, an dem die Referenz hängt: \nameref{y}
\\

\begin{TestObjekt}{x}
Ein Objekt.
\end{TestObjekt}

\begin{TestObjekt}{y}
Ein anderes Objekt.
\end{TestObjekt}

\end{document}
Der Output sieht so aus:
Testtext, an dem die Referenz hängt: Zu Objekt Nr.-0
Ein Objekt Nr. 1
Ein Objekt.
Ein Objekt Nr. 2
Ein anderes Objekt.
Dort, wo die 0 steht, sollte eigentlich die 2 hin.

Ich hoffe, mein Anliegen ist verständlicher geworden.

Vielen Dank
ascore5000

Verfasst: Sa 10. Mär 2018, 15:01
von u_fischer
nameref gibt sich große Mühe sein Argument nicht zu expandieren, sondern unverändert abzuspeichern. Du musst also vorher expandieren -- und ggfs. darauf achten, die Dinge zu schützen, nicht nicht expandiert werden dürfen:
\documentclass[
   a4paper,
]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{nameref}

\newcounter{Testcounter}
\newenvironment{Testueberschrift}[1]{%
   \refstepcounter{Testcounter}%
   \edef\next{%
   \noexpand\paragraph{Ueberschrift-Nr.  \arabic{Testcounter}}}%
   \next
   \label{#1}%
}{}


\begin{document}

Testtext, an dem die Referenz hängt: \nameref{y}

\begin{Testueberschrift}{x}
Text unter einer Überschrift.
\end{Testueberschrift}

\begin{Testueberschrift}{y}
Text unter einer anderen Überschrift.
\end{Testueberschrift}

\end{document} 

Verfasst: Sa 10. Mär 2018, 17:41
von ascore5000
super sache - das zeigt genau das Verhalten, welches ich brauche!
Vielen Dank!

Den Begriff expandieren kannte ich noch nicht.

Wenn ich das richtig verstehe, wurde hier ein TeX-Makro mit dem Namen \next definiert, dass sofort expandiert.

Expandieren meint dann, nicht den Befehl selbst, sondern die Auswirkungen der Befehle für die Definition des Makros zu nutzen. So wie eine Referenzierung bzw. eine Wertübergabe von Variablen in anderen Programmiersprachen.

Das \noexpand dient dann dazu, den nächsten Befehl \paragraph vor dem direkten expandieren zu schüzten.

Ist das korrekt so?