相互参照で使用されるサブセクションの番号を変更するにはどうすればよいですか?

相互参照で使用されるサブセクションの番号を変更するにはどうすればよいですか?

「\labelcref」に表示される番号を変更できるかどうか疑問に思っています。(、パッケージを使用していますhyperref)cleverefよりnameref正確に言うと、いくつかのサブセクションで構成されている複数のセクションがあるドキュメントを作成しています。次のコードを作成しました。

\renewcommand{\thesection}{\Roman{section}}
\renewcommand{\thesubsection}{\arabic{subsection}}

したがって、セクションは I、II、III、... で始まり、サブセクションはすべて 1、2、3、... で始まります (I.1、I.2、... ではありません)。

しかし、私は「1 を参照」ではなく「I.1 を参照」としたいと思います (これは、どのセクションにあるかが明記されていないため、読者を混乱させる可能性があります)。私のコードは次のようになります。

\documentclass[10pt,a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsthm, thmtools}  
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{soul}  
\usepackage{mathrsfs} 
\usepackage{enumitem}  
\usepackage{xcolor}   
\usepackage{hyperref, nameref, cleveref}

\begin{document}

\section {First}
\subsection {one} \label{I.1}
blablabla
\subsection {two}
blablabla
\section {Second}
\subsection {one}
blablabla and see \labelcref{I.1}
\end{document}

回答していただければ幸いです。

答え1

LaTeXカーネルは、あなたが望むようなメカニズムをすでに提供しています。\labelが呼び出されるたびに、現在の参照が展開されて作成されます。

\p@foo\thefoo

ここでfoo、 は最後に「refstepped」されたカウンタです。通常\p@foo(この場合は\p@subsection) は何も展開しないように定義されています。したがって、ここでは、何をすべきかを示す最小限の例を示します (コードの主要部分をわかりやすくするために、不要なパッケージはすべて削除しました)。

\documentclass[10pt,a4paper]{article}
\usepackage{hyperref, nameref, cleveref}

\renewcommand{\thesection}{\Roman{section}}
\renewcommand{\thesubsection}{\arabic{subsection}}

\makeatletter
\renewcommand{\p@subsection}{\thesection.}
\makeatother

\begin{document}
\section {First}
\subsection {one} \label{I.1}
blablabla
\subsection {two}
blablabla
\section {Second}
\subsection {one}
blablabla and see \labelcref{I.1} (also known as \cref{I.1})
\end{document}

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

関連情報