Tengo un párrafo personalizado que uso para definir habilidades y numerarlas automáticamente. Al hacer referencia a los párrafos, el resultado debe ser texto personalizado más el número de contador (p. ej., S1, S2, etc.). Pero actualmente sólo se imprime el número.
¿Qué estoy haciendo mal en mi enfoque?
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage[english]{babel}
\newcounter{skillCounter}
\newcommand{\skillParagraph}[2]{%
\refstepcounter{skillCounter}%
\paragraph*{#1 (S\arabic{skillCounter})}%
\label{#2}%
\expandafter\def\csname customlabel@#2\endcsname{#1 (S\theskillCounter)}%
}
% Custom command to reference custom labels
\newcommand{\cparref}[1]{%
\hyperref[#1]{\csname customlabel@#1\endcsname}%
}
\begin{document}
\section*{Skills}
\skillParagraph{Maths}{skill:maths} You should know maths.
\skillParagraph{Latex}{skill:latex} You should know \LaTeX.
You need skills \ref{skill:maths} and \ref{skill:latex}.
\skillParagraph{Word}{skill:word} You should know Word.
You need skills \ref{skill:maths}, \ref{skill:latex}, and \ref{skill:word}.
\end{document}
Respuesta1
Debes definir una representación para el contador. Y mejor poner el \refstepcounter dentro del párrafo, para que el ancla no se pueda separar del encabezado.
\documentclass{article}
\usepackage{hyperref}
\usepackage[english]{babel}
\newcounter{skillCounter}
\renewcommand\theskillCounter{S\arabic{skillCounter}}
\makeatletter
\newcommand{\skillParagraph}[2]{%%
\paragraph*{%
\refstepcounter{skillCounter}%
\protected@edef\@currentlabelname{#1 (\theskillCounter)}%
\label{#2}%
#1 (\theskillCounter)}%%
}
\makeatother
% Custom command to reference custom labels
\newcommand{\cparref}[1]{\nameref{#1}}
\begin{document}
\section*{Skills}
\skillParagraph{Maths}{skill:maths} You should know maths.
\skillParagraph{Latex}{skill:latex} You should know \LaTeX.
You need skills \ref{skill:maths} and \ref{skill:latex}.
\skillParagraph{Word}{skill:word} You should know Word.
You need skills \ref{skill:maths}, \ref{skill:latex}, and \ref{skill:word}.
\nameref{skill:maths}
\end{document}
Respuesta2
¿Qué estoy haciendo mal en mi enfoque?
Yo diría dos cosas. Primero, lo que usted describe como resultados esperados, aparentemente, se supone que es el resultado de su comando de referencia personalizado \cparref
, pero luego se refiere a todo con el estándar \ref
, que por supuesto solo hace referencia al número, como se esperaba. En segundo lugar, y más fundamental,\cparref
se define de manera que sólo puede usarsedespuésel \skillParagraph
que crea la etiqueta, y esto no es exactamente lo que (normalmente) se supone que debe hacer una referencia cruzada. Además, \cparref
parece que estás reinventando la rueda del nameref
, así que ¿por qué no utilizar lo que ya tienes?
\documentclass{article}
% utf8 has been the default inputenc for some years now
% \usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage[english]{babel}
\GetTitleStringSetup{expand}
\newcounter{skillCounter}
% You could instead hard-code the S into \skillParagraph, as you've been
% doing, or define an \autoref prefix, etc. This just seems to get a
% reasonable default value for \ref (affects any cross-reference to the
% counter though).
\renewcommand{\theskillCounter}{S\arabic{skillCounter}}
\newcommand{\skillParagraph}[2]{%
\refstepcounter{skillCounter}%
\paragraph*{#1 (\theskillCounter)}%
\label{#2}%
}
\begin{document}
\section*{Skills}
\skillParagraph{Maths}{skill:maths} You should know maths.
\skillParagraph{Latex}{skill:latex} You should know \LaTeX.
You need skills \ref{skill:maths} and \ref{skill:latex}.
Note that \ref{skill:word} and \nameref{skill:word} work before the
corresponding skill paragraph.
\skillParagraph{Word}{skill:word} You should know Word.
You need skills \ref{skill:maths}, \ref{skill:latex}, and \ref{skill:word}.
And, for whatever you wanted \texttt{\textbackslash{}cparref} to do, just use
\texttt{\textbackslash{}nameref}: \nameref{skill:maths},
\nameref{skill:latex}, and \nameref{skill:word}.
\end{document}