新附录

新附录

每当你的文档中有不同深度的部分,并且希望根据当前最深的层次对你的定理(以及注释、引理、命题……)进行编号时,你倾向于编写如下代码

\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。)输出很棒:

output of pdflatex

(题外话:曾经有人说,实现相同输出的另一种方法是定义\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

Output

解释:

我只定义了一个名为 的类定理环境thm,其编号从属于subsubsections。这意味着,thm每当 时,计数器将自动重置为 0 sectionsubsection 或者 subsubsection计数器要么增加,要么重置为 0。(增加计数器section(通常通过指令实现\section)会重置subsection计数器,因此也会subsubsection自动将计数器重置为 0。同样,\subsection指令也会自动将计数器重置subsubsection为 0。)

分配给环境的数字的格式thm由宏决定\thethm。此宏定义为

\thesubsubsection.\arabic{thm}

因为我们运行指令\newtheorem{thm}{Theorem}[subsubsection]。因此它采用格式化的subsubsection计数器并附加一个句点和计数器的当前值thm,以阿拉伯数字表示。

此宏\thesubsubsection确定分配给 级标题的数字的格式subsubsection。在许多文档类(包括articlelipics-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

相关内容