Werteübergabe von Zählervariablen in labels

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


ascore5000
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Sa 10. Mär 2018, 00:54

Werteübergabe von Zählervariablen in labels

Beitrag 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:

Code: Alles auswählen

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

Code: Alles auswählen

\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

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5080
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag 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?
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

ascore5000
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Sa 10. Mär 2018, 00:54

Beitrag 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:

Code: Alles auswählen

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

Code: Alles auswählen

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

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4014
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag 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:

Code: Alles auswählen

\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} 

ascore5000
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Sa 10. Mär 2018, 00:54

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

Antworten