自動番号付き段落を参照する際の出力のカスタマイズ

自動番号付き段落を参照する際の出力のカスタマイズ

スキルを定義して自動番号付けするために使用するカスタマイズされた段落があります。段落を参照すると、出力はカスタム テキストとカウンター番号 (例: S1、S2 など) になるはずです。ただし、現在は番号のみが印刷されます。

私のアプローチの何が間違っているのでしょうか?

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

ここに画像の説明を入力してください

答え1

カウンターの表現を定義する必要があります。また、アンカーが見出しから分離されないように、段落内に \refstepcounter を配置することをお勧めします。

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

答え2

私のアプローチの何が間違っているのでしょうか?

2つ言いたいことがあります。まず、あなたが期待される結果と説明しているものは、どうやらカスタム参照コマンドの結果であるはずです\cparrefが、その後、標準の ですべてを参照します\ref。もちろん、これは期待どおりに数値を参照するだけです。2つ目に、より基本的なことですが、 は\cparref\skillParagraphラベルを作成しますが、これは相互参照が(通常)行うべきこととは少し異なります。その上、\cparrefの車輪を再発明しているだけのように思えますnamerefが、なぜ既存のものを使わないのでしょうか。

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

ここに画像の説明を入力してください

関連情報