Cleveref가 동일한 카운터를 사용하여 두 환경을 구별하도록 하는 방법이 있습니까?

Cleveref가 동일한 카운터를 사용하여 두 환경을 구별하도록 하는 방법이 있습니까?

나는 보통 당신이 를 사용하여 당신의 라벨을 무엇이라고 부를 것인지를 명확하게 Cleveref에게 지시한다고 믿습니다. \crefname{type}{singular}{plural}그러나 여기서 "type"은 카운터의 이름이어야 하기 때문에 이것은 작동하지 않습니다(내 생각에는). 나는 또한 \label[type]{label}아무 소용이 없었습니다. 카운터를 공유하는 두 가지 환경을 달성할 수 있는 방법이 있습니까? 하지만 Cleveref가 두 환경을 구별할 수 있습니까? (또는 두 개의 카운터를 사용하는 방법이 있을 수 있지만 동일한 효과를 달성하기 위해 항상 동등/종속적이어야 합니까?)

아래는 예입니다:

\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를 세 번 사용했습니다. 주석에 원하는 출력을 표시합니다. 여기서는 \crefname{theo}{Theorem}{Theorems}"theo" 환경에 올바른 이름을 지정했습니다. 보시다시피 "lem" 환경은 참조할 때 동일한 이름을 갖습니다. 두 번째로 "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}

관련 정보