Angepasste Ausgabe beim Verweisen auf automatisch nummerierte Absätze

Angepasste Ausgabe beim Verweisen auf automatisch nummerierte Absätze

Ich habe einen benutzerdefinierten Absatz, den ich verwende, um Fähigkeiten zu definieren und sie automatisch zu nummerieren. Beim Verweisen auf die Absätze sollte die Ausgabe aus benutzerdefiniertem Text plus Zählernummer bestehen (z. B. S1, S2 usw.). Derzeit wird jedoch nur die Nummer gedruckt.

Was mache ich bei meiner Vorgehensweise falsch?

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

Bildbeschreibung hier eingeben

Antwort1

Sie sollten eine Darstellung für den Zähler definieren. Und den \refstepcounter besser innerhalb des Absatzes platzieren, damit der Anker nicht von der Überschrift getrennt werden kann.

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

Antwort2

Was mache ich bei meiner Vorgehensweise falsch?

Ich würde zwei Dinge sagen. Erstens: Was Sie als erwartete Ergebnisse beschreiben, soll anscheinend das Ergebnis Ihres benutzerdefinierten Referenzbefehls sein \cparref, aber dann verweisen Sie auf alles mit dem Standard \ref, der natürlich wie erwartet nur auf die Nummer verweist. Zweitens, und grundlegender, \cparrefist es so definiert, dass es nur verwendet werden kannnachdas \skillParagrapherstellt das Label, und das ist nicht ganz das, was ein Querverweis (normalerweise) tun soll. Außerdem \cparrefscheint Ihr das Rad von neu zu erfinden nameref, also warum nicht einfach das verwenden, was Sie bereits haben?

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

Bildbeschreibung hier eingeben

verwandte Informationen