在我正在写的一篇数学论文中,我使用下面写的内容来表示我的定理。问题是,当我在第 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*
进行更新。\theoremnum
theorem*
答案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
本手册以带星号和不带星号的版本操作系统为例,讲解了参考系统。