在*所有*类似定理的环境中自动使用 cref 和 enumerate

在*所有*类似定理的环境中自动使用 cref 和 enumerate

很好的答案解释如何创建一个新的列表定义,以允许 cleverref 将定义内的枚举中的项目引用为定义 def# (item#)。

具体来说,它描述了如何创建一个列表 defineenum,以便以下代码(其中 defin 是使用 newtheorem 创建的)

\begin{defin}\label{defin_1}
\leavevmode % more elegant than '$ $'
   \begin{definenum}
      \item\label{item_1} Part 1 \dots
      \item\label{item_2} Part 2 \dots
   \end{definenum}
\end{defin}

\cref{defin_1} consists of the \cref{item_1,item_2}.

产生类似

...

定义 1.1 由定义 1.1(i) 和 1.1(ii) 组成

然而,这半部分违背了 cleverref 的目的。重点是,人们可以自由地更改引用对象的类型(例如,从引理到命题),而不必费力更改一堆其他东西来使引用正确。

我想创建一个单一环境 thmparts,以便对于某些有限数量的定理环境(例如定理、定义、引理等),它们都允许如下代码工作,一个表示定义/定义,另一个表示定理/定理(等等)

\begin{definition}\label{defin_1}
\leavevmode % more elegant than '$ $'
   \begin{thmparts}
      \item\label{item_1} Part 1 \dots
      \item\label{item_2} Part 2 \dots
   \end{thmparts}
\end{definition}

\cref{defin_1} consists of the \cref{item_1,item_2}.

\begin{theorem}\label{thm_1}
\leavevmode % more elegant than '$ $'
   \begin{thmparts}
      \item\label{titem_1} Part 1 \dots
      \item\label{titem_2} Part 2 \dots
   \end{thmparts}
\end{theorem}

\cref{thm_1} consists of the \cref{titem_1,titem_2}.

如果我乐意创建包装定理、引理等的新环境,这将是乏味的,如果简单的话(只需让 thmparts 到每个包装器中的适当类型的列表),但我真的很希望它能与 thm-tools 的可重述环境一起工作,所以我希望有某种方法可以定义一个 thmparts 环境,让它找出它在什么样的定理环境中扩展(并使用适合该环境的任何类型的列表?)或者更优雅的方式来做到这一点?

答案1

您可以在本地使用 覆盖标签类型\label[<type>]{<key>},因此在每个定理的开头,您可以定义\thmtype为环境名称并定义\plabel{<key>}\label[\thmtype]{<key>}。我首先尝试覆盖 的定义,\label这样您就不必使用其他命令,但由于我不明白的原因,像 这样的命令不会以我期望的方式\NewCommandCopy{\origlabel}{\label}复制 的定义。\label

\documentclass{book}
\usepackage{amsthm}
\usepackage[shortlabels]{enumitem}
\usepackage[colorlinks]{hyperref}
\usepackage[capitalize,nameinlink]{cleveref}

\newtheorem{theorem}{Theorem}[chapter]
\newtheorem{lemma}[theorem]{Lemma}
\theoremstyle{definition}
\newtheorem{defin}[theorem]{Definition}
\crefname{defin}{Definition}{Definitions} % needed since cleveref only predefines for fixed set of theorem names

\newlist{thmparts}{enumerate}{1}
\setlist[thmparts]{
  label=(\roman*),
  ref=\thetheorem\,(\roman*),
  }

\newcommand{\plabel}[1]{\label[\thmtype]{#1}}
 
\makeatletter
\apptocmd{\@begintheorem}{\let\thmtype\@currenvir}{}{\ERROR}
\makeatother

\begin{document}
    
\begin{defin}\label{defin_1}
\leavevmode
   \begin{thmparts}
      \item\plabel{item_1} Part 1 \dots
      \item\plabel{item_2} Part 2 \dots
   \end{thmparts}
 \thmtype
\end{defin}

\begin{theorem}\label{thm_1}
\leavevmode
   \begin{thmparts}
      \item\plabel{thmitem_1} Part 1 \dots
      \item\plabel{thmitem_2} Part 2 \dots
   \end{thmparts}
 \thmtype
\end{theorem}

\begin{lemma}\label{lem_1}
\leavevmode
   \begin{thmparts}
      \item\plabel{lemitem_1} Part 1 \dots
      \item\plabel{lemitem_2} Part 2 \dots
   \end{thmparts}
 \thmtype
\end{lemma}

\cref{defin_1} consists of the \cref{item_1,item_2}.

\cref{thm_1} consists of the \cref{thmitem_1,thmitem_2}.

\cref{lem_1} consists of the \cref{lemitem_1,lemitem_2}.

\end{document}

韋姆斯

相关内容