von Gute*r Gȧst*in » Do 17. Jun 2021, 17:18
Das von hyperref verwendete Paket nameref bietet die Anweisung \nameref, um nicht nur den Zähler, der zu einem Label gehört zu referenzieren, sondern auch den Namen. Bei Gliederungsstrukturen wie Überschriften wird dieser Name üblicherweise durch den Inhaltsverzeichniseintrag gegeben. Bei Nicht-Standard-Strukturen, wie eigenen Definitionen muss ggf. selbst dafür gesorgt werden, dass \@currentlabelname passend gesetzt wird. Natürlich sollte auch \refstepcounter statt \stepcounter verwendet werden. Erschwerend kommt bei dir hinzu, dass das Erhöhen des Zählers in einer Umgebung und damit innerhalb einer Gruppe erfolgt. Die Referenz ist nach dem Ende der Umgebung damit nicht mehr gültig. Das könnte dadurch gelöst werden, dass die Anweisung \refstepcounter und die Definition von \@currentlabelname vor die center-Umgebung verschoben wird. Oder es wird einfach ein optionales Argument zum Setzen des Labels hinzugefügt:
\documentclass{article}
\usepackage{scrbase}% für \IfArgIsEmpty (siehe scrguide.pdf)
\usepackage[colorlinks, linkcolor = blue, citecolor = blue, urlcolor = blue]{hyperref}
\newcounter{Mycount}
\newcounter{ReqCounter}
\newcommand{\Projekt}{A}
\def\threedigits#1{%
\Projekt-%
\ifnum#1<100 0\fi
\ifnum#1<10 0\fi
\number#1}
\def\RefCount{%
\textbf{\threedigits{\theReqCounter}}
}
\def\RefCountRel#1{%
\setcounter{Mycount}{\theReqCounter}\addtocounter{Mycount}{#1}%
Anforderung \mbox{\textbf{\threedigits{\theMycount}}}%
}
\makeatletter
\newcommand{\Anforderung}[2][]{% optionales Argument für Label hinzugefügt
\begin{center}
\def\@currentlabelname{#2}% Namen für die nachfolgende Referenz setzen.
\refstepcounter{ReqCounter}% Zählerreferenz erzeugen
\IfArgIsEmpty{#1}{}{\label{#1}}% Label nur setzen, wenn das optionale Argument nicht leer ist.
\begin{tabular}[!h]{p{1.5cm}p{13.5cm}ll}
\RefCount & #2\\
\end{tabular}
\end{center}
}
\makeatother
\begin{document}
\Anforderung{Das ist Text 1.}
\Anforderung{Das ist Text 2.}
\Anforderung[anf:test]{Das ist Text 3 mit Referenz nach \RefCountRel{-2}.}
Siehe: \nameref{anf:test}.
\end{document}
Das von [tt]hyperref[/tt] verwendete Paket [doc]nameref[/doc] bietet die Anweisung [tt]\nameref[/tt], um nicht nur den Zähler, der zu einem Label gehört zu referenzieren, sondern auch den [i]Namen[/i]. Bei Gliederungsstrukturen wie Überschriften wird dieser Name üblicherweise durch den Inhaltsverzeichniseintrag gegeben. Bei Nicht-Standard-Strukturen, wie eigenen Definitionen muss ggf. selbst dafür gesorgt werden, dass [tt]\@currentlabelname[/tt] passend gesetzt wird. Natürlich sollte auch [tt]\refstepcounter[/tt] statt [tt]\stepcounter[/tt] verwendet werden. Erschwerend kommt bei dir hinzu, dass das Erhöhen des Zählers in einer Umgebung und damit innerhalb einer Gruppe erfolgt. Die Referenz ist nach dem Ende der Umgebung damit nicht mehr gültig. Das könnte dadurch gelöst werden, dass die Anweisung [tt]\refstepcounter[/tt] und die Definition von [tt]\@currentlabelname[/tt] vor die [tt]center[/tt]-Umgebung verschoben wird. Oder es wird einfach ein optionales Argument zum Setzen des Labels hinzugefügt:
[code]\documentclass{article}
\usepackage{scrbase}% für \IfArgIsEmpty (siehe scrguide.pdf)
\usepackage[colorlinks, linkcolor = blue, citecolor = blue, urlcolor = blue]{hyperref}
\newcounter{Mycount}
\newcounter{ReqCounter}
\newcommand{\Projekt}{A}
\def\threedigits#1{%
\Projekt-%
\ifnum#1<100 0\fi
\ifnum#1<10 0\fi
\number#1}
\def\RefCount{%
\textbf{\threedigits{\theReqCounter}}
}
\def\RefCountRel#1{%
\setcounter{Mycount}{\theReqCounter}\addtocounter{Mycount}{#1}%
Anforderung \mbox{\textbf{\threedigits{\theMycount}}}%
}
\makeatletter
\newcommand{\Anforderung}[2][]{% optionales Argument für Label hinzugefügt
\begin{center}
\def\@currentlabelname{#2}% Namen für die nachfolgende Referenz setzen.
\refstepcounter{ReqCounter}% Zählerreferenz erzeugen
\IfArgIsEmpty{#1}{}{\label{#1}}% Label nur setzen, wenn das optionale Argument nicht leer ist.
\begin{tabular}[!h]{p{1.5cm}p{13.5cm}ll}
\RefCount & #2\\
\end{tabular}
\end{center}
}
\makeatother
\begin{document}
\Anforderung{Das ist Text 1.}
\Anforderung{Das ist Text 2.}
\Anforderung[anf:test]{Das ist Text 3 mit Referenz nach \RefCountRel{-2}.}
Siehe: \nameref{anf:test}.
\end{document}[/code]