Existe uma maneira de fazer com que o smartef distinga dois ambientes com o mesmo contador?

Existe uma maneira de fazer com que o smartef distinga dois ambientes com o mesmo contador?

Eu acredito que normalmente você diz explicitamente ao inteligente como chamar seu rótulo usando \crefname{type}{singular}{plural}, mas isso não funciona, pois aqui "type" deve ser o nome do contador (eu acredito). Também tentei usar \label[type]{label}sem sucesso. Existe alguma maneira de conseguir que dois ambientes compartilhem um balcão, mas a inteligência seja capaz de distingui-los? (Ou talvez haja alguma maneira de usar dois contadores, mas para que eles sejam sempre iguais/dependentes para obter o mesmo efeito?)

Abaixo está um exemplo:

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

No final do exemplo eu uso \cref três vezes. Em um comentário, exibo a saída desejada. Aqui eu costumava \crefname{theo}{Theorem}{Theorems}dar ao ambiente "theo" o nome correto, como você pode ver então o ambiente "lem" recebe o mesmo nome, quando referido. Na segunda vez que uso o ambiente "lem", rotulo-o usando \label[Lemma]{lm2}, o que acaba não tendo o efeito desejado.

(Nota: O código que usa tikz não é relevante, adicionei-o como uma pequena justificativa para não usar o comando \newtheorem.)

Responder1

Você pode alocar lem e theo no mesmo registro de contagem (com cuidado :-)

insira a descrição da imagem aqui

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

Responder2

Não há necessidade de contorções de programação - basta carregar o amsthmou o ntheorempacote antes de ambos hyperrefe e cleveref, em seguida, definir os ambientes semelhantes a teoremas da maneira usual. Em particular, é perfeitamente aceitável que vários ambientes semelhantes a teoremas compartilhem o mesmo contador ( theono código a seguir):

insira a descrição da imagem aqui

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

informação relacionada