每当你的文档中有不同深度的部分,并且希望根据当前最深的层次对你的定理(以及注释、引理、命题……)进行编号时,你倾向于编写如下代码
\documentclass[USenglish]{lipics-v2018}%%% loads amsthm and changes it a bit. Available from https://www.dagstuhl.de/en/publications/lipics/instructions-for-authors/
%\documentclass{article}\usepackage{amsthm}%%% Same outcome up to formatting
\usepackage{cleveref}
\newtheorem{thmS}{Theorem}[section]
\newtheorem{thmSS}{Theorem}[subsection]
\newtheorem{thmSSS}{Theorem}[subsubsection]
\crefname{thmS}{Thm.}{Thms.}%%% to be used on the section level
\crefname{thmSS}{Thm.}{Thms.}%%% to be used on the subsection level
\crefname{thmSSS}{Thm.}{Thms.}%%% to be used on the subsubsection level
%%% Similar junk for noteS, noteSS, noteSSS, lemmaS, lemmaSS, lemmaSSS, propS, propSS, propSSS, etc.
\begin{document}
\section{Section 1}
\begin{thmS}\label{thm:in1}
My great theorem.
\end{thmS}
\section{Section 2}
\subsection{Subsection 2.1}
\begin{thmSS}\label{thm:in21}
Another great theorem.
\end{thmSS}
\section{Section 3}
\subsection{Subsection 3.1}
\subsubsection{Subsection 3.1.1}
\begin{thmSSS}\label{thm:in311}
One more great theorem.
\end{thmSSS}
\section{Section 4}
The following result follows from \cref{thm:in1,thm:in21,thm:in311}: \dots
\end{document}
(以上,我主要对lipics
来自https://www.dagstuhl.de/en/publications/lipics/instructions-for-authors/,但同样的问题也适用于组合article
+ amsthm
。)输出很棒:
(题外话:曾经有人说,实现相同输出的另一种方法是定义\Crefname
而不是\crefname
使用 的capitalize
类选项cleveref
。我的问题不适用于这种替代方法,因为对于enumi
,例如,我希望同时拥有大写和非大写版本:\crefname{enumi}{part}{parts} \Crefname{enumi}{Part}{Parts}
。)
只有一个问题:输出的最后一行的空间有点浪费,因为你可以用更短的
根据 Thms. 1.1、2.1.1 和 3.1.1.1 得出以下结果:...
如何\cref{...}
自动生成这样的输出?是否可以编写其他宏(例如\magiccref{...}
)来实现这种自动化?
答案1
我实际上并不认为为每个深度设置单独的定理环境是正确的做法,即使您不使用cleveref
。 更有效的做法是只定义一个定理环境,并使定理数字的格式取决于当前深度。
以下代码产生相同的输出,除了cleveref
现在识别出这些都是相同类型的定理环境(因为它们确实如此)。因此它打印“Thms.”而不是重复“Thm.”三次。
%\documentclass[USenglish]{lipics-v2018} %% <- also works
\documentclass{article}
%% Redefined these to leave out any zeros
\renewcommand\thesubsection{\thesection\ifnum\value{subsection}>0.\arabic{subsection}\fi}
\renewcommand\thesubsubsection{\thesubsection\ifnum\value{subsubsection}>0.\arabic{subsubsection}\fi}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[subsubsection]
\crefname{thm}{Thm.}{Thms.}
\begin{document} %% I only replaced thmS, thmSS and thmSSS by thm below
\section{Section 1}
\begin{thm}\label{thm:in1}
My great theorem.
\end{thm}
\section{Section 2}
\subsection{Subsection 2.1}
\begin{thm}\label{thm:in21}
Another great theorem.
\end{thm}
\section{Section 3}
\subsection{Subsection 3.1}
\subsubsection{Subsection 3.1.1}
\begin{thm}\label{thm:in311}
One more great theorem.
\end{thm}
\section{Section 4}
The following result follows from \cref{thm:in1,thm:in21,thm:in311}: \dots
\end{document}
(下面的输出是通过取消注释该lipics-v2018
行创建的,但它也可以与article
和一起使用。)amsthm
解释:
我只定义了一个名为 的类定理环境thm
,其编号从属于subsubsection
s。这意味着,thm
每当 时,计数器将自动重置为 0 section
,subsection
或者 subsubsection
计数器要么增加,要么重置为 0。(增加计数器section
(通常通过指令实现\section
)会重置subsection
计数器,因此也会subsubsection
自动将计数器重置为 0。同样,\subsection
指令也会自动将计数器重置subsubsection
为 0。)
分配给环境的数字的格式thm
由宏决定\thethm
。此宏定义为
\thesubsubsection.\arabic{thm}
因为我们运行指令\newtheorem{thm}{Theorem}[subsubsection]
。因此它采用格式化的subsubsection
计数器并附加一个句点和计数器的当前值thm
,以阿拉伯数字表示。
此宏\thesubsubsection
确定分配给 级标题的数字的格式subsubsection
。在许多文档类(包括article
和lipics-v2018
)中,\thesubsubsection
默认定义为
\thesubsection.\arabic{subsubsection}
而宏\thesubsection
默认定义为\thesection.\arabic{subsection}
,并且\thesection
通常扩展为\arabic{section}
。
上述两条\renewcommand
指令的作用是重新定义\thesubsection
和,\thesubsubsection
以便只有当这些计数器具有正值时,它们才会附加.\arabic{subsection}
和。结果是格式化数字中的所有零都被抑制,无论是在声明时还是在交叉引用时(例如,通过指令)。.\arabic{subsubsection}
thm
\cref
此方法还允许您equation
以相同的方式更改格式化的数字,通过添加\numberwithin{equation}{subsubsection}
到您的序言中。(\numberwithin
由包提供amsmath
。)
新附录
这是适应早期对\thesubsection
和重新定义的版本\thesubsubsection
。下面,\thesubsection
被重新定义为检查相关计数器的值,并使用\thesection
(如果它为零)或 的原始定义\thesubsection
(如果它非零)。 的新定义\thesubsubsection
以相同的方式工作。
为了演示目的,我重新定义了章节编号,使其看起来像1:1a
而不是。1.1.1
%\documentclass[USenglish]{lipics-v2018} %% <- also works
\documentclass{article}
\usepackage{amsthm}
\usepackage{cleveref}
\newtheorem{thm}{Theorem}[subsubsection]
\crefname{thm}{Thm.}{Thms.}
%% Prior redefinition of \thesubsection and \thesubsubsection:
\renewcommand\thesubsection{\thesection:\arabic{subsection}}
\renewcommand\thesubsubsection{\thesubsection\alph{subsubsection}}
%% Redefine \thesubsection and \thesubsubsection to omit counters with value 0:
\edef\thesubsection{% %% <- edef to expand \thesubsection (once)
\noexpand\ifnum\noexpand\value{subsection}=0 %% <-if subsubsection=0
\noexpand\thesection %% <- use \thesection
\noexpand\else %% <- otherwise
\unexpanded\expandafter{\thesubsection}% %% <- use whatever \thesubsection was before
\noexpand\fi
}
\edef\thesubsubsection{%
\noexpand\ifnum\noexpand\value{subsubsection}=0
\noexpand\thesubsection
\noexpand\else
\unexpanded\expandafter{\thesubsubsection}%
\noexpand\fi
}
\begin{document} %% I only replaced thmS, thmSS and thmSSS by thm below
\section{Section 1}
\begin{thm}\label{thm:in1}
My great theorem.
\end{thm}
\section{Section 2}
\subsection{Subsection 2.1}
\begin{thm}\label{thm:in21}
Another great theorem.
\end{thm}
\section{Section 3}
\subsection{Subsection 3.1}
\subsubsection{Subsection 3.1.1}
\begin{thm}\label{thm:in311}
One more great theorem.
\end{thm}
\section{Section 4}
The following result follows from \cref{thm:in1,thm:in21,thm:in311}: \dots
\end{document}
较旧的附录。
\thethm
您可以通过重新定义而不是和来\thesubsection
完成相同的操作\thesubsubsection
。然后您应该插入
\renewcommand\thethm{\thesection
\ifnum\value{subsection}>0.\arabic{subsection}\fi
\ifnum\value{subsubsection}>0.\arabic{subsubsection}\fi
.\arabic{thm}}
在该行之后,删除顶部代码块中的\newtheorem
其他两行。然后,您可以对 执行相同的操作。这样做的好处不大,除非当您不在子部分中时 打印零这一事实与您有关。\renewcommand
\theequation
\thesubsubsection