% \iffalse meta-comment
% This is free and unencumbered software released into the public domain.
%
% Anyone is free to copy, modify, publish, use, compile, sell, or
% distribute this software, either in source code form or as a compiled
% binary, for any purpose, commercial or non-commercial, and by any
% means.
%
% In jurisdictions that recognize copyright laws, the author or authors
% of this software dedicate any and all copyright interest in the
% software to the public domain. We make this dedication for the benefit
% of the public at large and to the detriment of our heirs and
% successors. We intend this dedication to be an overt act of
% relinquishment in perpetuity of all present and future rights to this
% software under copyright law.
%
% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
% IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
% OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
% ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
% OTHER DEALINGS IN THE SOFTWARE.
%
% For more information, please refer to <https://unlicense.org>
% \fi

% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{atendofenv}[2022/02/24 v0.2 Prevent an infinite loop]
%<package>\RequirePackage{amsthm}
%<package>\RequirePackage{letltxmacro}
%<*driver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{mathpazo}
\usepackage[scale=0.85]{FiraMono}
\usepackage{FiraSans}
\usepackage[a4paper, margin=3cm]{geometry}
\usepackage{indentfirst}
\usepackage[hidelinks]{hyperref}
\usepackage{amssymb}
\usepackage{atendofenv}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{atendofenv.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{0}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \GetFileInfo{atendofenv.sty}
%
% \title{At End of Env}
% \author{Fangyi Zhou}
% \maketitle
%
% \section{Motivation}
% The \texttt{amsthm} package conveniently provides environments for
% declaring theorems and friends.
% By default, the \texttt{proof} environment inserts a
% \href{https://en.wikipedia.org/wiki/Q.E.D.}{QED} symbol at the end of
% environment.
% It is sometimes also desirable to insert a similar symbol at the end of other
% environments, e.g.~at the end of a definition or a remark, which motivates
% this package.
%
% \section{Usage}
% Let us begin with defining a theorem environment with \texttt{amsthm}:
% \newtheorem{theorem}{Theorem}
% \begin{verbatim}
% \newtheorem{theorem}{Theorem}
% \end{verbatim}
% And we can create a theorem like this:
% \begin{verbatim}
% \begin{theorem}
%   This is a long theorem that will be very long, and it will be helpful if I
%   can add a symbol at the end of it to mark its end.
% \end{theorem}
% \end{verbatim}
% \begin{theorem}
%   This is a long theorem that will be very long, and it will be helpful if I
%   can add a symbol at the end of it to mark its end.
% \end{theorem}
% To do so, simply put after defining a theorem environment:
% \AtEndOfEnv{theorem}{$\triangleleft$}
% \begin{verbatim}
% \AtEndOfEnv{theorem}{$\triangleleft$}
% \end{verbatim}
% Now theorems look like this:
% \begin{theorem}
%   This is a long theorem that will be very long, and it will be helpful if I
%   can add a symbol at the end of it to mark its end.
% \end{theorem}
% You can also change the symbol later.
% \AtEndOfEnv{theorem}{$\lrcorner$}
% \begin{verbatim}
% \AtEndOfEnv{theorem}{$\lrcorner$}
% \end{verbatim}
% Now theorems look like this:
% \begin{theorem}
%   This is a long theorem that will be very long, and it will be helpful if I
%   can add a symbol at the end of it to mark its end.
% \end{theorem}
% \noindent
% \textbf{Q:} \emph{But, couldn't I change tweak the style of theorems when defining them?}
%
% \noindent
% \textbf{A:} Of course, but sometimes they are defined by a class file (e.g.~from
% publishers), and tweaking class files may be a sin in many situations.
%
% \section{Implementation}
%    \begin{macrocode}
\newcommand{\AtEndOfEnv}[2]{
%    \end{macrocode}
% We first check whether the environment is defined. If so, save the original
% macros (if not saved already); otherwise report an error.
% \changes{0.2}{2022/02/24}{Fix an infinite loop when trying to change the
% symbol for the same environment twice.}
%    \begin{macrocode}
  \ifcsname #1\endcsname
    \ifcsname aeoe@old#1\endcsname\relax
    \else
    \expandafter\LetLtxMacro\csname aeoe@old#1\expandafter\endcsname\csname #1\endcsname
    \fi
  \else
    \PackageError{atendofenv}{Environment #1 undefined}{Check the environment
    name passed to AtEndOfEnv}
  \fi
  \ifcsname end#1\endcsname
    \ifcsname aeoe@oldend#1\endcsname\relax
    \else
    \expandafter\LetLtxMacro\csname aeoe@oldend#1\expandafter\endcsname\csname end#1\endcsname
    \fi
  \else
    \PackageError{atendofenv}{Environment #1 undefined}{Check the environment
    name passed to AtEndOfEnv}
  \fi
%    \end{macrocode}
% Then we redefine the environment, and use the QED stack of \texttt{amsthm}
% to get a symbol at the end.
%    \begin{macrocode}
  \renewenvironment{#1}
  {\pushQED{\qed}\renewcommand{\qedsymbol}{#2}\expandafter\csname aeoe@old#1\endcsname}
  {\popQED\expandafter\csname aeoe@oldend#1\endcsname}
}
%    \end{macrocode}
% \Finale
