
Мне интересно, есть ли относительно простой способ добиться результата, подобного следующему:
В частности, я хотел бы иметь возможность присваивать имена и/или номера теоремам/леммам/предложениям, а затем заменять стандартный символ КЭД этой теоремы/леммы/предложения на структурированную версию имени/номера теоремы/леммы/предложения.
У меня нет минимального рабочего примера, потому что, к сожалению, мои знания об изменении сред теорем достаточно низки, и я не имею ни малейшего понятия, как начать. Любые предложения будут высоко оценены.
решение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
переопределено добавление «of <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
Если мы используемамстмpackage, то мы можем сделать это, перехватив \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}