我相信通常你会使用 明确告诉 cleveref 你的标签的名称\crefname{type}{singular}{plural}
,但这不起作用,因为这里的“类型”必须是计数器的名称(我相信)。我也尝试过使用,但\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}