如何在两个具有相同编号的不同部分中写出定理?

如何在两个具有相同编号的不同部分中写出定理?

在我正在写的一篇数学论文中,我使用下面写的内容来表示我的定理。问题是,当我在第 2 节中写一个定理时,它的编号类似于“定理 2.1”。但当我尝试在引言中重现相同的定理时,它显示为“定理 1.1”。我怎样才能按我想要的方式进行编号(即与第 2 节中的编号相同)?

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amssymb,amsmath,amsthm}
\usepackage[runin]{abstract}
\usepackage{titlesec}
\usepackage{titlecaps}
\usepackage{fancyhdr}

\newtheorem{theorem}{Theorem}[section]

\begin{document}

\section{Introduction}

I want the theorem in Section 2 to be here and numbered correctly, eg Theorem 2.1.

\section{Section 2}
\begin{theorem}
Hi!
\end{theorem}

\end{document}

答案1

您可以创建一个自定义定理mythm,并按照您想要的方式手动编号。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amssymb,amsmath,amsthm}
\usepackage[runin]{abstract}
\usepackage{titlesec}
\usepackage{titlecaps}
\usepackage{fancyhdr}

\newtheorem{theorem}{Theorem}[section]
\newtheorem{innercustomthm}{Theorem}
\newenvironment{mythm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

\begin{document}

\section{Introduction}

I want the theorem in Section 2 to be here and numbered correctly, eg Theorem 2.1.

\begin{mythm}{2.1}
Hi! from Section \thesection
\end{mythm}

\section{Section 2}
\begin{theorem}
Hi! from Section \thesection
\end{theorem}

\end{document}

在此处输入图片描述

答案2

通过此设置,您将陈述要在引言中重复的定理,而不必担心它们的数量。定理主体只需输入一次。

当然,你不需要把所有的定理都写在引言中。如果你有一个不需要重新陈述的定理,那么只要正常地把它写在正文中就可以了。

\begin{futuretheorem}{<label>}[optional argument]
<theorem body>
\end{futuretheorem}

并在文档主体中使用

\pasttheorem{<label>}

定理的主体也被保存起来,以便在知道定理编号时进行排版。

完整代码:

\documentclass{article}
\usepackage{amsthm}
\usepackage{hyperref} % optional

\newtheorem{theorem}{Theorem}[section]
\newtheorem*{futuretheoreminner}{Theorem~\thefuturetheoreminner}
\newcommand{\thefuturetheoreminner}{} % initialize

\ExplSyntaxOn

\prop_new:N \g_alevel_future_prop

\NewDocumentEnvironment{futuretheorem}{ m o +b }
 {% #1 is the label to be also used in the body for restating
  % #2 is the standard optional argument for a theorem
  % #3 is the body
  \renewcommand{\thefuturetheoreminner}{\ref{#1}}
  \IfNoValueTF{#2}
   {\futuretheoreminner}
   {\futuretheoreminner[#2]}
  #3
 }
 {
  \endfuturetheoreminner
  \prop_gput:Nnn \g_alevel_future_prop { #1 } { #3 }
  \IfValueT{#2}{ \prop_gput:Nnn \g_alevel_future_prop { #1-attr } { #2 } }
 }

\NewDocumentCommand{\pasttheorem}{m}
 {
  \prop_if_in:NnTF \g_alevel_future_prop { #1-attr }
   {
    \begin{theorem}[\prop_item:Nn \g_alevel_future_prop { #1-attr }]
   }
   {
    \begin{theorem}
   }
  \label{#1}
  \prop_item:Nn \g_alevel_future_prop { #1 }
  \end{theorem}
 }

\ExplSyntaxOff

\begin{document}

\section{Introduction}

\begin{futuretheorem}{test1}
This is a theorem
\end{futuretheorem}

\begin{futuretheorem}{test2}[Important]
This is an important theorem
\end{futuretheorem}

\section{Test}

\pasttheorem{test1}

\section{Another}

\pasttheorem{test2}

\end{document}

引言中的数字hyperref将会链接到主要部分,其中定理在上下文中被重述。

在此处输入图片描述

反过来做,即只在文档的主要部分输入定理主体,就需要将其写在辅助文件中。但我认为最好在开始时将所有主要定理放在一个受控的位置。


代码的作用是什么?首先,我定义一个辅助定理类环境,将其命名为futuretheoreminner。它没有编号,因为我们会自动提供编号。它的标签是Theorem~\thefuturetheoreminner长名称命令的默认定义,即无:我们稍后会重新定义它以包含所需的编号。

接下来我们进入expl3编程层并分配一个prop变量(属性列表)。这种变量包含我们可以认为具有以下形式的项key=value。我们如何填充它?

这个想法是,调用\begin{theorem}\label{foo}定义了定理的交叉引用。所以我们将使用这个系统来检索正确的数字,但采用间接方式。

futuretheorem定义了一个新环境,它接受一个强制参数(m在代码中用设计),一个可选参数(在代码中用#1设计),以及直至的全部内容(在代码中以 的形式提供)。o#2\end{futuretheorem}#3

此环境的工作是首先查看是否存在可选参数(用于定理注释/归因)。检查后,futureinnertheorem启动环境,如果存在则使用可选参数。但第一个\thefuturetheoreminner命令被重新定义为包含\ref{#1},最终将产生所需的定理编号,因为它来自主文档主体。

环境的内容已交付且环境已完成,但仍有一些事情要做:将环境的内容与键一起存储在属性列表中,#1并可能将可选参数与键一起存储在属性列表中#1-attr

存储是全局的,因为我们在环境内工作。

现在该\pasttheorem命令接受一个强制参数,这是引言中所述相应定理的关键。如果存在可选参数,我们调用

\begin{theorem}[\prop_item:Nn \g_alevel_future_prop {#1-attr}]\label{#1}

因此检索在开头添加的可选参数,或者只是

\begin{theorem}\label{#1}

这将为交叉引用分配所需的标签。接下来,我们检索已存储的定理主体并发出\end{theorem}

第一次运行\ref{test1}将只产生??,但这是正常的。运行完成后,\label{test1}将在引言中附上该定理的正确编号以供排版。

答案3

以下与其他答案类似,但提供了更自然的使用方式 - 一个可选参数theorem*(`* 通常用于使用未编号的文档元素)用于检查是否为空参数:

在此处输入图片描述

\documentclass{article}

\usepackage{amsthm}

\newtheorem{theorem}{Theorem}[section]

\newtheorem*{theorem**}{Theorem\theoremnum}
\newenvironment{theorem*}[1][]{%
  % https://tex.stackexchange.com/a/53091/5764
  \edef\theoremnum{\if\relax\detokenize{#1}\relax\else~#1\fi}% Store theorem number
  \begin{theorem**}
}{%
  \end{theorem**}
}  

\begin{document}

\section{Introduction}

I want the theorem in Section 2 to be here and numbered correctly, eg Theorem~2.1.

\begin{theorem*}[\ref{thm:second}]
This is a theorem.
\end{theorem*}

\section{Section 2}
\begin{theorem}\label{thm:second}
This is a theorem.
\end{theorem}

\end{document}

theorem**只是使用无数定理的内部定义。然后我们定义如果有东西传递给环境,则theorem*进行更新。\theoremnumtheorem*

答案4

也许一个简单的解决方案是使用thmtools包。我将举一个例子手动的,顺便说一句,它很容易阅读,因为它由例子组成。

\documentclass{article}

\usepackage{amsthm}
\usepackage{thmtools, thm-restate}
\declaretheorem{theorem}

\begin{document}
\section{First section}
\begin{restatable}[Euclid]{theorem}{firsteuclid} \label{thm:euclid}%
For every prime $p$, there is a prime $p’>p$. In particular, the list of primes, \begin{equation}\label{eq:1}
    2,3,45,7,\dots
\end{equation}
  is infinite.
\end{restatable}

\section{Second section}
\firsteuclid*

\end{document}

输出 在此处输入图片描述

\firsteuclid本手册以带星号和不带星号的版本操作系统为例,讲解了参考系统。

相关内容