Есть ли способ заставить 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, либо ntheoremпакет перед обоими hyperrefи cleveref, а затем определите среды, подобные теоремам, обычным способом. В частности, совершенно нормально, если несколько сред, подобных теоремам, совместно используют один и тот же счетчик ( theoв следующем коде):

введите описание изображения здесь

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

Связанный контент