获得定理 1(a) 的 DRY 方法是什么?

获得定理 1(a) 的 DRY 方法是什么?

memoir我正在排版包含类和包的文档cleveref。我经常会有一个编号的定理和枚举的部分。我希望能够尽可能简单地引用定理的一部分。

以下是 MWE:

\documentclass{memoir}
\usepackage{amsthm}
\usepackage{cleveref}

\newtheorem{theorem}{Theorem}

\begin{document}
\begin{theorem}\label{thm}
My big theorem
\begin{enumerate}[(a)]
\item\label{thm!simple} Simple case
\item\label{thm!complex} Complex case
\end{enumerate}
\end{theorem}

\Cref{thm}\cref{thm!simple} % Theorem1item a

\Cref{thm}\ref{thm!simple}  % Theorem 1a
\Cref{thm}(\ref{thm!simple})% Theorem 1(a), but redundant coding

\end{document}

这些都不是最佳选择。如果我更改标签格式,我必须更改每个引用,这违背了干燥咒语。

到目前为止,我最好的解决方法是重新定义参考格式,如下所示:

\begin{theorem}\label{thm2}
My second big theorem
\begin{enumerate}[(a)]
\crefformat{enumi}{#2(#1)#3}
\item\label{thm2!simple} Simple case
\item\label{thm2!complex} Complex case
\end{enumerate}
\end{theorem}

\Cref{thm2}\cref{thm2!simple} % Theorem2(a)

然后,如果我想更改标签格式,我仍然必须在两个地方进行更改,但至少它们是彼此相邻的。

我猜下一个级别的黑客会研究如何memoir扩展并同时enumerate更新它。但在我动手之前,我想我会问一下蜂巢。\crefformat

答案1

定义您自己的分割标签的命令。

\documentclass{memoir}
\usepackage{amsthm}
\usepackage{enumitem}
\usepackage{cleveref}

\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}

\newenvironment{tenumerate}[1][]
  {\enumerate[label=\textup(\alph*\textup),ref=(\alph*),#1]}
  {\endenumerate}

\newcommand{\dref}[1]{\dodref\cref#1\relax}
\newcommand{\Dref}[1]{\dodref\Cref#1\relax}
\def\dodref#1#2!#3\relax{#1{#2}\ref{#2!#3}}

\begin{document}
First of all a lemma.
\begin{lemma}\label{lem}
Here it is:
\begin{tenumerate}
\item\label{lem!a} A
\item\label{lem!b} B
\end{tenumerate}
\end{lemma}

And a wonderful theorem follows.

\begin{theorem}\label{thm}
My big theorem:
\begin{tenumerate}
\item\label{thm!simple} Simple case
\item\label{thm!complex} Complex case
\end{tenumerate}
\end{theorem}

\Dref{thm!simple} and \dref{thm!complex}; we
can also use \ref{thm!simple} or \cref{thm!complex}.

The proof follows immediately from \Dref{lem!b}.

\end{document}

在此处输入图片描述

相关内容