cleveref に同じカウンターを持つ 2 つの環境を区別させる方法はありますか?

cleveref に同じカウンターを持つ 2 つの環境を区別させる方法はありますか?

通常は、 を使ってラベルの名前を明示的に cleveref に伝えると思いますが\crefname{type}{singular}{plural}、ここでは「type」がカウンターの名前でなければならないので、これは\label[type]{label}機能しません (私の考えでは)。 も試してみましたが、役に立ちませんでした。カウンターを共有する 2 つの環境を実現し、cleveref がそれらを区別できるようにする方法はありますか? (または、2 つのカウンターを使用するが、それらが常に同等/依存して同じ効果を達成する方法はあるでしょうか?)

以下に例を示します。

\documentclass{article}
\usepackage[colorlinks, linkcolor=blue]{hyperref} 
\usepackage[noabbrev, capitalise]{cleveref}
\usepackage{tikz}

%new theorem environment
\newcounter{theo}[section]\setcounter{theo}{0}
\renewcommand{\thetheo}{\arabic{section}.\arabic{theo}}
\newenvironment{theo}{%
\refstepcounter{theo}%
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=green!20]
{\strut \textbf{Theorem~\thetheo.}};
\newline
}

\crefname{theo}{Theorem}{Theorems}

%new lemma environment
\newenvironment{lem}{%
\refstepcounter{theo}
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=blue!20]
{\strut \textbf{Lemma~\thetheo.}};
\newline
}

\begin{document}
\begin{theo}\label{thrm}
Just some text.
\end{theo}

\begin{lem}\label{lm1}
Just some more text.
\end{lem}

\begin{lem}\label[Lemma]{lm2}
Just some more text.
\end{lem}

\noindent
\cref{thrm}\\ %give Theorem 0.1
\cref{lm1}\\ %give Lemma 0.2
\cref{lm2}\\ %give Lemma 0.3
\end{document}

例の下部では、\cref を 3 回使用しています。コメントで、必要な出力を表示しています。ここでは、\crefname{theo}{Theorem}{Theorems}「theo」環境に正しい名前を付けています。ご覧のとおり、参照すると、「lem」環境も同じ名前になります。2 回目に「lem」環境を使用するときは、 を使用してラベルを付けますが\label[Lemma]{lm2}、目的の効果が得られないことがわかります。

(注: tikz を使用するコードは関係ありません。代わりに \newtheorem コマンドを使用しないことの小さな正当化として追加しました。)

答え1

lem と theo を同じカウント レジスタに割り当てることができます (注意が必要です:-)

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

\documentclass{article}
\usepackage[colorlinks, linkcolor=blue]{hyperref} 
\usepackage[noabbrev, capitalise]{cleveref}
\usepackage{tikz}

%new theorem environment
\newcounter{theo}[section]\setcounter{theo}{0}
\renewcommand{\thetheo}{\arabic{section}.\arabic{theo}}
\newenvironment{theo}{%
\refstepcounter{theo}%
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=green!20]
{\strut \textbf{Theorem~\thetheo.}};
\newline%BADNESS 10000!!!!!
}

\makeatletter
\let\c@lem\c@theo
%now def not \let so it picks up current value
\def\p@lem{\p@theo}
\def\thelem{\thetheo}
\makeatother
\crefname{theo}{Theorem}{Theorems}
\crefname{lem}{Lemma}{Lemmas}

%new lemma environment
\newenvironment{lem}{%
\refstepcounter{lem}%
\tikz[baseline=(current bounding box.east),outer sep=0pt]
\node[anchor=east,rectangle,fill=blue!20]
{\strut \textbf{Lemma~\thetheo.}};
\newline%BADNESS 10000!!!!!
}

\begin{document}
\begin{theo}\label{thrm}
Just some text.
\end{theo}

\begin{lem}\label{lm1}
Just some more text.
\end{lem}

\begin{lem}\label{lm2}
Just some more text.
\end{lem}

\noindent
\cref{thrm}\\ %give Theorem 0.1
\cref{lm1}\\ %give Lemma 0.2
\cref{lm2}\\ %give Lemma 0.3
\end{document}

答え2

プログラミングを複雑にする必要はありません。 と の両方の前に または パッケージのいずれかをロードし、通常amsthmの方法で定理のような環境を定義するだけです。特に、複数の定理のような環境で同じカウンター (次のコード内)を共有することはまったく問題ありません。ntheoremhyperrefclevereftheo

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

\documentclass{article}

\usepackage{amsthm} %or: \usepackage{ntheorem}
\usepackage[colorlinks, linkcolor=blue]{hyperref} 
\usepackage[noabbrev, capitalise]{cleveref}

% two new theorem-like environments
\newtheorem{theo}{Theorem}[section] % subordinate 'theo' cntr to 'section' cntr
\newtheorem{lem}[theo]{Lemma} % make 'lem' and 'theo' share same cntr

\crefname{theo}{Theorem}{Theorems}
\crefname{lem}{Lemma}{Lemmas}

\begin{document}
\setcounter{section}{2} % just for this example

\begin{theo}\label{thrm}Just some text.\end{theo}
\begin{lem}\label{lm1}Just some more text.\end{lem}
\begin{lem}\label{lm2}Still more text.\end{lem}

\cref{thrm} \dots

\cref{lm1,lm2} \dots
\end{document}

関連情報