\ nameref usando texto 'no expandido'?
Supongamos que defino un comando personalizado de la \exercisesiguiente manera.
\newcounter{exercise}
\newcommand\exercise{%
\refstepcounter{exercise}%
\section*{Exercise \theexercise}%
}
Ahora, en el siguiente ejemplo, quiero usar \namerefdesde el hyperrefpaquete.
\exercise\label{ex:first}
foo
\exercise\label{ex:second}
see \nameref{ex:first}
\exercise\label{ex:third}
bar
Esto produce "vea el ejercicio 2" en lugar de "vea el ejercicio 1". Parece que se usa el texto 'sin expandir', expandiéndose al valor actual del contador. ¿Cómo puedo asegurarme de que \nameref{ex:first}produzca el "Ejercicio 1"?
(Por supuesto, podría usar Exercise~\ref{ex:first}, pero esto es más propenso a errores. Y, en el futuro, es posible que desee reemplazar "ejercicio" por "problema" sin tener que buscar y reemplazar todas las ocurrencias en mi documento).
Ejemplo completo:
\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}
Respuestas
De hecho, debe pasar la expansión de \theexercise, porque hyperrefno lo hace con el título.
\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}
Este es el contenido (abreviado) del .auxarchivo:
\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}{}}
Era
\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}{}}
con tu código.
Nota. ¿Por qué \unexpanded{Exercise}? En el caso particular, obviamente es innecesario, pero lo sería para el “Übung” alemán.
Puede usar cleverefen su lugar.
\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}
La salida es la misma en ambos casos.
¿Podemos evitar el \edef\x{\endgrouptruco? Sí, por supuesto.
\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}
Tenga en cuenta que cleverefno es necesario, simplemente elimine las llamadas relevantes si lo prefiere \nameref.