
Gostaria de saber se existe uma maneira relativamente simples de obter um resultado semelhante ao seguinte:
Em particular, eu gostaria de poder atribuir nomes e/ou números a teoremas/lemas/proposições e então substituir o símbolo QED padrão desse teorema/lema/proposição por uma versão delineada do nome do teorema/lema/proposição /número.
Não tenho um exemplo mínimo de trabalho aqui porque, infelizmente, meu conhecimento sobre modificação de ambientes de teoremas é suficientemente baixo e não tenho a menor ideia de como começar. Qualquer sugestão seria muito apreciada.
Responder1
Isso faz o que você deseja, embora eu ache complicado e pouco informativo.
\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}
Se uma prova for atrasada, use o proof*
ambiente, que quer como argumento o rótulo usado no teorema relativo.
Como você pode ver, as provas podem ser aninhadas. Mostrei apenas uma prova aninhada dentro de uma prova “atrasada”, mas você pode verificar se funciona também com o proof
ambiente padrão.
Algumas palavras de explicação.
Primeiro modifico a definição para \@begintheorem
adicionar algumas configurações. Se o teorema não for numerado, defino (globalmente, porque já estamos em um ambiente) \qed@current
como \qed@empty
(que é definido como o símbolo QED padrão, veremos mais tarde o porquê); se o teorema for numerado, eu o faço \xdef\qed@current{#2}
, porque #2
contém o número do teorema (mas não de forma explícita, por isso é necessário expandi-lo totalmente).
Caso os números do teorema contenham instruções de formatação ou quando sejam utilizados diferentes sistemas de numeração (numerais gregos com babel
, por exemplo), isso deve ser
\protected@edef\@tempa{#2}\global\let\qed@current\@tempa
para evitar problemas. Nas configurações padrão do inglês, isso não deveria ser necessário.
Tirando essas duas alterações, \@begintheorem
é igual ao original.
Então eu redefino \qedsymbol
. Ele se compara \qed@thiscurrent
com \qed@empty
; se for o mesmo, ele compõe o símbolo padrão, caso contrário, ele compõe
\fbox{\scriptsize\qed@thiscurrent}
porque, como veremos, \qed@thiscurrent
contém o número do teorema que está sendo provado atualmente.
Também \proofname
é redefinido adicionar “de <number>
” usando \qed@thiscurrent
se o último teorema declarado for numerado.
O proof
ambiente é modificado para definir (localmente) \qed@thiscurrent
como \qed@current
; finalmente proof*
é definido para fazer o mesmo, proof
mas recuperando o número com \ref
.
O caso de proof
seguir um teorema simples é fácil: \qed@thiscurrent
conterá o número do teorema. O mesmo para proof*
.
Se um proof
ambiente estiver dentro de outro proof
, a instrução será redefinida globalmente \qed@current
, mas isso não influenciará \qed@thiscurrent
no final da prova principal, pois \qed@thiscurrent
para a prova aninhada é definida localmente e \end{proof}
irá reverter o local \qed@thiscurrent
para o valor anterior.
Responder2
Se usarmos oamsthmpacote, então podemos fazer isso sequestrando o \qedsymbol
comando e hackeando a maneira como os ambientes do teorema são construídos internamente. Isso se resume a adicionar algum código para \@begintheorem
substituir, \qedsymbol
de modo que se torne uma versão em caixa do último número do teorema.
Existem dois problemas com o código abaixo. A primeira é que \qedsymbol
foi perdido - mas você pode usá \realqedsymbol
-lo.
A segunda questão é que se você enunciar um teorema, digamos, e depois provar outro lema no meio da prova antes de retornar ao resultado principal, então o último número em caixa estará errado. A solução mais simples para isso é provavelmente definir um comando como
\newcommand\QedSymbol[1]{\gdef\qedsymbol{\fbox{\ref{#1}}}}
para definir manualmente \qedsymbol
igual a um \ref
comando em caixa. Para usar isso você apenas teria que escrever \label{MyWondrousTheorem}
para adicionar uma referência ao seu (maravilhoso) teorema e então usar \Qedsymbol{MyWondrousTheorem}
antes do final da prova.
Se o ambiente semelhante ao teorema não tiver um número de teorema, ele \qedsymbol
será revertido para \realqedsymbol
o real \qedsymbol
.
Eu não testei tanto, então é possível que isso quebre alguma coisa ou que haja outros casos em que isso não funcione.
Aqui está o código.
\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}
Outra forma de fazer isso, que resolveria o problema com um resultado intermediário aparecendo no meio de uma prova, seria redefinida \qedsymbol
no início do ambiente de prova. Esta abordagem só seria possível, entretanto, se todos os ambientes semelhantes a teoremas usassem o mesmo contador (como no meu MWE). O código acima tem a vantagem de funcionar (deveria?:) funcionar mesmo que diferentes ambientes semelhantes a teoremas usem contadores diferentes.
Responder3
Isso foi adaptado do que usei no passado (não tenho certeza de onde consegui):
Código:
\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}
Responder4
O ntheorem
pacote permite redefinir \qedsymbol
de forma bastante simples. Combinando com xparse
, defino um Proof
ambiente, que pode receber dois argumentos opcionais: o primeiro é o argumento opcional de um ambiente de prova clássico, mas delimitado por parênteses; o segundo argumento opcional é o símbolo de fim de prova, cujo padrão é um quadrado, mas pode ser uma referência ao teorema que foi provado (na verdade, qualquer referência ou qualquer texto). Neste último caso, optei por colocá-lo em um arquivo \fcolorbox
.
Exemplo:
\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}