\ nameref mit 'nicht erweitertem' Text?
Angenommen, ich definiere einen benutzerdefinierten Befehl \exercisewie folgt.
\newcounter{exercise}
\newcommand\exercise{%
\refstepcounter{exercise}%
\section*{Exercise \theexercise}%
}
Im folgenden Beispiel möchte ich nun \namerefaus dem hyperrefPaket verwenden.
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \nameref{ex:first}
\exercise\label{ex:third}
bar
Dies erzeugt "siehe Übung 2" anstelle von "siehe Übung 1". Es scheint, als würde der 'nicht erweiterte' Text verwendet, der in den aktuellen Zählerwert erweitert wird. Wie kann ich sicherstellen, dass \nameref{ex:first}"Übung 1" erzeugt wird?
(Natürlich könnte ich nur verwenden Exercise~\ref{ex:first}, aber dies ist fehleranfälliger. Und in Zukunft möchte ich möglicherweise "Übung" durch "Problem" ersetzen, ohne alle Vorkommen in meinem Dokument finden und ersetzen zu müssen.)
Vollständiges Beispiel:
\documentclass{article}
\usepackage{hyperref}
\newcounter{exercise}
\newcommand\exercise{%
\refstepcounter{exercise}%
\section*{Exercise \theexercise}%
}
\begin{document}
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \nameref{ex:first}
\exercise\label{ex:third}
bar
\end{document}
Antworten
In der Tat müssen Sie die Erweiterung von übergeben \theexercise, weil hyperrefes nicht zum Titel führt.
\documentclass{article}
\usepackage{hyperref}
\newcounter{exercise}
\newcommand\exercise{%
\par % just in case
\refstepcounter{exercise}%
\begingroup\edef\x{\endgroup
\noexpand\section*{\unexpanded{Exercise} \theexercise}%
}\x
}
\begin{document}
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \nameref{ex:first}
\exercise\label{ex:third}
bar
\end{document}
Dies ist der (gekürzte) Inhalt der .auxDatei:
\newlabel{ex:first}{{1}{1}{Exercise 1}{section*.1}{}}
\newlabel{ex:second}{{2}{1}{Exercise 2}{section*.2}{}}
\newlabel{ex:third}{{3}{1}{Exercise 3}{section*.3}{}}
Es war
\newlabel{ex:first}{{1}{1}{Exercise \theexercise }{section*.1}{}}
\newlabel{ex:second}{{2}{1}{Exercise \theexercise }{section*.2}{}}
\newlabel{ex:third}{{3}{1}{Exercise \theexercise }{section*.3}{}}
mit Ihrem Code.
Hinweis. Warum \unexpanded{Exercise}? Im Einzelfall ist es natürlich unnötig, aber es wäre für die deutsche "Übung".
Sie könnten cleverefstattdessen verwenden.
\documentclass{article}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\newcounter{exercise}
\newcommand\exercise{%
\par % just in case
\refstepcounter{exercise}%
\section*{Exercise \theexercise}
}
\crefname{exercise}{Exercise}{Exercises}
\begin{document}
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \cref{ex:first}
\exercise\label{ex:third}
bar
\end{document}
Die Ausgabe ist in beiden Fällen gleich.
Können wir den \edef\x{\endgroupTrick vermeiden ? Ja natürlich.
\documentclass{article}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\ExplSyntaxOn
\NewDocumentCommand{\exercise}{}
{
\gooz_exercise:ne { \exercisename } { \theexercise }
}
\cs_new_protected:Nn \gooz_exercise:nn
{
\par % just in case
\refstepcounter{exercise}
\section*{#1~#2}
}
\cs_generate_variant:Nn \gooz_exercise:nn { ne }
\ExplSyntaxOff
\newcommand{\exercisename}{Exercise}
\newcounter{exercise}
\crefname{exercise}{\exercisename}{\exercisename s}
\begin{document}
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \cref{ex:first} or \nameref{ex:first}
\exercise\label{ex:third}
bar
\end{document}
Beachten Sie, dass dies cleverefnicht erforderlich ist. Entfernen Sie einfach die entsprechenden Anrufe, wenn Sie dies bevorzugen \nameref.