有沒有辦法讓cleveref用同一個計數器區分兩個環境?

有沒有辦法讓cleveref用同一個計數器區分兩個環境?

我相信通常您會使用 明確告訴cleveref 如何稱呼您的標籤\crefname{type}{singular}{plural},但這不起作用,因為這裡的“類型”必須是計數器的名稱(我相信)。我也嘗試過使用\label[type]{label}沒有效果。有什麼方法可以實現兩個環境共享一個計數器,但 smartef 能夠區分它們嗎? (或者是否有某種方法可以使用兩個計數器,但它們總是相等/依賴以實現相同的效果?)

下面是一個例子:

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

相關內容