我想知道是否有一种相对简单的方法来实现类似以下的结果:
具体来说,我希望能够为定理/引理/命题分配名称和/或数字,然后用定理/引理/命题名称/数字的概述版本替换该定理/引理/命题的标准 QED 符号。
我这里没有最低限度的工作示例,因为不幸的是,我对修改定理环境的了解很少,以至于我完全不知道如何开始。任何建议都将不胜感激。
答案1
尽管我发现它很麻烦并且没有太多信息,但它确实满足了你的要求。
\documentclass{book}
\usepackage{amsthm,xpatch}
\makeatletter
\let\qed@empty\openbox % <--- change here, if desired
\def\@begintheorem#1#2[#3]{%
\deferred@thm@head{%
\the\thm@headfont\thm@indent
\@ifempty{#1}
{\let\thmname\@gobble}
{\let\thmname\@iden}%
\@ifempty{#2}
{\let\thmnumber\@gobble\global\let\qed@current\qed@empty}
{\let\thmnumber\@iden\xdef\qed@current{#2}}%
\@ifempty{#3}
{\let\thmnote\@gobble}
{\let\thmnote\@iden}%
\thm@swap\swappedhead
\thmhead{#1}{#2}{#3}%
\the\thm@headpunct\thmheadnl\hskip\thm@headsep
}\ignorespaces
}
\renewcommand{\qedsymbol}{%
\ifx\qed@thiscurrent\qed@empty
\qed@empty
\else
\fbox{\scriptsize\qed@thiscurrent}%
\fi
}
\renewcommand{\proofname}{%
Proof%
\ifx\qed@thiscurrent\qed@empty
\else
\ of \qed@thiscurrent
\fi
}
\xpretocmd{\proof}{\let\qed@thiscurrent\qed@current}{}{}
\newenvironment{proof*}[1]
{\def\qed@thiscurrent{\ref{#1}}\proof}
{\endproof}
\makeatother
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\newtheorem*{nthm}{Theorem}
\begin{document}
\chapter{Title}
\section{Title}
\begin{thm}
Pigs can fly.
\end{thm}
\begin{proof}
Would you doubt it?
\end{proof}
\begin{nthm}
Unnumbered.
\end{nthm}
\begin{proof}
What should we say?
\end{proof}
The following theorem will be proved later.
\begin{thm}\label{thm:later}
$P=NP$.
\end{thm}
Long text here.
\begin{proof*}{thm:later}
Oh, well! Should I really do it? We'll use the following lemma.
\begin{lem}
Something surely can fly.
\end{lem}
\begin{proof}
Clear.
\end{proof}
Now use the lemma and apply the well known identity
\[
1=0.\qedhere
\]
\end{proof*}
\end{document}
如果证明被延迟,则使用proof*
需要相对定理中使用的标签作为参数的环境。
如您所见,证明可以嵌套。我只展示了“延迟”证明中的嵌套证明,但您可以检查它是否也适用于标准proof
环境。
一些解释的话。
首先,我修改了 的定义以\@begintheorem
添加一些设置。如果定理没有编号,我将 设置\qed@current
为(全局的,因为我们已经在一个环境中了) \qed@empty
,(它被定义为标准 QED 符号,我们稍后会看到原因);如果定理有编号,我会设置\xdef\qed@current{#2}
,因为#2
包含定理编号(但不是显式形式,因此需要完全展开它)。
如果定理数字包含格式说明或使用不同的数字系统(babel
例如带有 的希腊数字),则应
\protected@edef\@tempa{#2}\global\let\qed@current\@tempa
以避免出现问题。在标准英语设置中,这应该不需要。
除上述两处变化外,\@begintheorem
其余与原版相同。
然后我重新定义\qedsymbol
。它\qed@thiscurrent
与进行比较\qed@empty
;如果相同,则排版标准符号,否则排版
\fbox{\scriptsize\qed@thiscurrent}
因为,正如我们将看到的,\qed@thiscurrent
包含当前正在证明的定理的数量。
如果最后陈述的定理已编号,则\proofname
重新定义为添加“的<number>
” 。\qed@thiscurrent
环境proof
被修改为(本地)设置\qed@thiscurrent
为\qed@current
;最后proof*
被定义为执行类似操作proof
但用检索数字\ref
。
proof
简单遵循定理的情况很简单:\qed@thiscurrent
将包含定理数。 也是一样proof*
。
如果一个proof
环境位于另一个环境内proof
,则该语句将全局重置\qed@current
,但这不会影响\qed@thiscurrent
主证明的结束,因为\qed@thiscurrent
嵌套证明是在本地设置的,并且\end{proof}
会将本地恢复\qed@thiscurrent
为先前的值。
答案2
如果我们使用阿姆斯特丹\qedsymbol
包,那么我们可以通过劫持命令并破解定理环境内部构建的方式来实现这一点。这归结为添加一些代码\@begintheorem
进行覆盖\qedsymbol
,以便它成为最后一个定理数的盒装版本。
下面的代码有两个问题。第一个问题是\qedsymbol
已经丢失 - 但你可以改用\realqedsymbol
。
第二个问题是,如果你陈述一个定理,然后在证明过程中证明另一个引理,然后返回到主要结果,那么最后一个带框的数字将是错误的。最简单的解决方法可能是定义一个命令,例如
\newcommand\QedSymbol[1]{\gdef\qedsymbol{\fbox{\ref{#1}}}}
用于手动设置\qedsymbol
为等于框式\ref
命令。要使用此功能,您只需编写\label{MyWondrousTheorem}
以添加对您的(精彩的)定理的引用,然后\Qedsymbol{MyWondrousTheorem}
在证明结束之前使用。
如果类定理环境没有定理数,则\qedsymbol
恢复为\realqedsymbol
,即实数\qedsymbol
。
我还没有进行太多的测试,所以这可能会破坏某些东西,或者存在其他不起作用的极端情况。
这是代码。
\documentclass{article}
\usepackage{amsmath,amsthm}
\makeatletter% the hack to change the qedsymbol automatically
\let\@@begintheorem=\@begintheorem% save real AMS theorem environment
\let\realqedsymbol\qedsymbol
\def\@begintheorem#1#2[#3]{%
\@@begintheorem{#1}{#2}[#3]% start the theorem
\@ifempty{#2}{\let\qedsymbol\realqedsymbol}{\gdef\qedsymbol{\fbox{#2}}}
}
\makeatother
\swapnumbers\numberwithin{equation}{section}
\newtheorem{Proposition}[equation]{Proposition}
\newtheorem{Lemma}[equation]{Lemma}
\begin{document}
\section{Important facts}
\begin{Lemma}
$1+1=2$
\end{Lemma}
\begin{proof}Count.
\end{proof}
\begin{Proposition}
$1+3=4$
\end{Proposition}
\begin{proof}Count more carefully.
\end{proof}
\begin{Proposition}
$2+2=4$
\end{Proposition}
\begin{proof}Count more carefully.
\end{proof}
\end{document}
\documentclass{article}
\usepackage{amsmath,amsthm}
\makeatletter
\let\@@begintheorem=\@begintheorem% save real AMS theorem environment
\let\@qedsymbol\qedsymbol
\def\@begintheorem#1#2[#3]{%
\@@begintheorem{#1}{#2}[#3]% start the theorem
\@ifempty{#2}{\let\qedsymbol\@qedsymbol}{\gdef\qedsymbol{\fbox{#2}}}
}
\makeatother
\swapnumbers\numberwithin{equation}{section}
\newtheorem{Proposition}[equation]{Proposition}
\newtheorem{Lemma}[equation]{Lemma}
\begin{document}
\section{Important facts}
\begin{Lemma}
$1+1=2$
\end{Lemma}
\begin{proof}Count.
\end{proof}
\begin{Proposition}
$1+3=4$
\end{Proposition}
\begin{proof}Count more carefully.
\end{proof}
\begin{Proposition}
$2+2=4$
\end{Proposition}
\begin{proof}Count more carefully.
\end{proof}
\end{document}
另一种方法是在证明环境开始时重新定义,这可以解决中间结果出现在证明中间的问题\qedsymbol
。但是,只有当所有定理类环境都使用相同的计数器时(如在我的 MWE 中一样),这种方法才有可能。上面的代码的优点是,即使不同的定理类环境使用不同的计数器,它也会(应该?:)工作。
答案3
这是根据我过去使用过的内容改编的(不确定从哪里获得):
代码:
\documentclass{article}
\usepackage{amsmath}
\newcommand*{\QED}[1]{%
\ifmmode% Check for math mode.
\tag*{\fbox{#1}}%
\else%
{\rightskip\fill\parfillskip-\rightskip%
\linepenalty100%
\exhyphenpenalty0%
\linebreak[0] % <-- Need space here (allows for a break.
\hspace*{\fill}\fbox{#1}}%
\fi%
}%
\begin{document}
In text mode you can use \verb|QED| as shown here.\QED{2.2}
You can also use it in math mode
\begin{align*}
F &= ma \\
\implies E &= mc^2\QED{2.3}
\end{align*}
\end{document}
答案4
该ntheorem
包允许\qedsymbol
非常简单地重新定义。结合xparse
,我定义了一个Proof
环境,它可以接受两个可选参数:第一个是经典证明环境的可选参数,但由括号分隔;第二个可选参数是证明结束符号,默认为正方形,但可以是对被证明的定理的引用(实际上,任何参考或任何文本)。在后一种情况下,我选择将其放在中\fcolorbox
。
例子:
\documentclass[A4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[svgnames]{xcolor}
\usepackage{amsfonts,empheq}
\usepackage[amsmath, thref, thmmarks]{ntheorem}
\usepackage{cleveref}
\usepackage{xparse}
\usepackage{chngcntr}
\theoremstyle{plain}
\theoremseparator{.} \theoremheaderfont{\bfseries}
\theorembodyfont{\itshape}
\newtheorem{Thm}{Theorem}[section]
\newtheorem{Lem}{Lemma}%[section]
\theoremstyle{nonumberplain}
\theoremheaderfont{\itshape}
\theorembodyfont{\upshape}
\newtheorem{proof}{Proof}
\NewDocumentEnvironment{Proof}{d() o}
{\IfNoValueTF{#1}{\begin{proof}}{\begin{proof}[#1]}
\IfNoValueTF{#2}{\qedsymbol{\ensuremath{\Box}}}{\qedsymbol{\fcolorbox{red}{Lavender}{\color{red}\upshape#2}}}}%
{\qed\end{proof}}%
\counterwithin{Lem}{Thm}
\begin{document}
\section{Some Not So Standard Results}
\begin{Thm}\label{special}
$ \mathrm{SL}_n(\mathbb{K}) ⊂ \mathrm{ GL}_n(\mathbb{K})$.
\end{Thm}
\begin{Proof}[\Cref{special}]
We shall prove first:
\begin{Lem}\label{basic}
$ \mathrm{SL}_n(\mathbb{K}) ⊂ \mathrm{ GL}_n(\mathbb{K})$.
\end{Lem}
%% First proof of lemma
\begin{Proof}(of the lemma)[\Cref{basic}]
Easy enough.
\end{Proof}
%% Second proof of lemma
\begin{Proof}(another one)
Still easier proof.
\end{Proof}
%% End of theorem proof
Left as an exercise ;\,o)
\end{Proof}
\end{document}