%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%       ****************************************
%       *              ENDNOTES                *
%       ****************************************
%
%  Date of this version: 02 January 2020.
%
%% Copyright 2002 John Lavagnino
%% Copyright 2019-2020 LaTeX3 Project
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.2
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%    http://www.latex-project.org/lppl.txt
%% and version 1.2 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%
%  Based on the FOOTNOTES section of
%  LATEX.TEX (VERSION 2.09 - RELEASE OF 19 April 1986), with
%  "footnote" changed to "endnote" and "fn" changed to "en" (where
%  appropriate), with all the minipage stuff pulled out, and with
%  some small changes for the different operation of endnotes.
%  Subsequently updated to follow the code for
%  LaTeX2e <2000/06/01>.
%
%  Uses an extra external file, with .ent extension, to hold the
%  text of the endnotes.  This may be deleted after the run; a new
%  version is generated each time--it doesn't require information
%  collected from the previous run.
%
%  This code does not obey \nofiles.  Perhaps it should.
%
%   John Lavagnino (John.Lavagnino@kcl.ac.uk)
%   Centre for Computing in the Humanities, King's College London
%
%  To turn all the footnotes in your documents into endnotes, say
%
%     \let\footnote=\endnote
%
%  in your preamble, and then add something like
%
%     \newpage
%     \begingroup
%     \parindent 0pt
%     \parskip 2ex
%     \def\enotesize{\normalsize}
%     \theendnotes
%     \endgroup
%
% as the last thing in your document.  (But \theendnotes all
% by itself will work.)
%
%       ****************************************
%       *            CHANGE LOG                *
%       ****************************************
%
% JL  Modified to include \addtoendnotes.  JL, 10/22/89.
%
% JK  Modification by J"org Knappen 25. 2. 1991:
% JK
% JK  Introduced \notesname in the spirit of international \LaTeX.
% JK  \notesname is set per default to be {Notes}, but can easily
% JK  be redifined, e.g. for german language
% JK  \renewcommand{\notesname}{Anmerkungen}
%
% DW Modification by Dominik Wujastyk, London, 19 September 1991:
% DW
% DW Moved the line
% DW         \edef\@currentlabel{\csname p@endnote\endcsname\@theenmark}
% DW out of the definition of \@endnotetext and into the definition
% DW of \@doanenote so that \label and \ref commands work correctly in
% DW endnotes.  Otherwise, the \label just pointed to the last section
% DW heading (or whatever) preceding the \theendnotes command.
%
% JL Revised documentation and macros.  24 Sept 1991.
%
% modified by --bg (B.Gaulle) 09/14/94 for:
%               1) replace » (why a 8bit char here?) by ^ as a default.
%               2) force \catcode of > to be 12 (implied by \@doanenote).
%          by --bg again 03/22/95 for:
%               3) reseting appropriate catcode of > in case it were
%                  used as an active char before \@endanenote (was
%                  pointed by Ch. Pallier).
%
% John Lavagnino, 12 January 2003: a number of small updates:
%
% JL Incorporate change suggested by Frank Mittelbach to
% JL \enoteheading, so that first note has paragraph indentation.
% JL Frank's note:
%      the idea of this code is to fix the problem that without it
%      the first endnote after the heading will not be indented thus looking
%      somewhat strange. Problem however is that since there is no
%      indentation \leavemode\par will make an absolutely empty pargraph so
%      that no baseline calculation is done. therefore \vskip-\baselineskip
%      will put the first endnote directly below the heading without the
%      usual spaccing. using \mbox insead will cure this defect.
%
% JL Also incorporated Frank's suggestion to define
% JL \makeenmark and \theenmark, so that users can change more of the
% JL layout without using \makeatletter.  \makeenmark defaults to
% JL \@makeenmark, so old code is still supported; and \theenmark is
% JL just syntactic sugar for \@theenmark, which is still the real
% JL value (and shouldn't be directly modified by user code).
%
% JL Definition of \ETC. also dropped: surely nobody is still
% JL using TeX 2.992.  (If you are, you need to upgrade it or
% JL endnotes longer than 1000 characters will be truncated.)
%
% JL Update much of the code to track the current LaTeX2e code more
% JL closely. Clean up \theendnotes.
%
% John Lavagnino, 15 January 2003: fix my garbled version of
% Frank's updates.
%
%
% Jürgen Spitzmüller 2019-08-17: just warn if \verb|\theendnotes| is
% used, but noendnotes have been inserted yet.
%
% Jürgen Spitzmüller 2020-01-02: ensure .ent file is cleared.
%
%       ****************************************
%       *        ENDNOTE COMMANDS              *
%       ****************************************
%
%
%   \endnote{NOTE}       : User command to insert a endnote.
%
%   \endnote[NUM]{NOTE}  : User command to insert a endnote numbered
%                           NUM, where NUM is a number -- 1, 2,
%                           etc.  For example, if endnotes are numbered
%                           *, **, etc. within pages, then  \endnote[2]{...}
%                           produces endnote '**'.  This command does  not
%                           step the endnote counter.
%
%   \endnotemark[NUM]    : Command to produce just the endnote mark in
%                           the text, but no endnote.  With no argument,
%                           it steps the endnote counter before  generating
%                           the mark.
%
%   \endnotetext[NUM]{TEXT} : Command to produce the endnote but no
%                              mark.  \endnote is equivalent to
%                              \endnotemark \endnotetext .
%
%   \addtoendnotes{TEXT} : Command to add text or commands to current
%                              endnotes file: for inserting headings,
%                              pagebreaks, and the like into endnotes
%                              sections.  TEXT a moving argument:
%                              \protect required for fragile commands.
%
%       ****************************************
%       *        ENDNOTE USER COMMANDS         *
%       ****************************************
%
%   Endnotes use the following parameters, similar to those relating
%   to footnotes:
%
%   \enotesize   : Size-changing command for endnotes.
%
%   \theendnote : In usual LaTeX style, produces the endnote number.
%
%   \theenmark : Holds the current endnote's mark--e.g., \dag or '1' or 'a'.
%                 (You don't want to set this yourself, as it comes
%                 either from the autonumbering of notes or from
%                 the optional argument to \endnote. But you'll need
%                 to use it if you define your own \makeenmark.)
%
%   \makeenmark : A macro to generate the endnote marker from  \theenmark
%                  The default definition is \hbox{$^\theenmark$}.
%
%   \@makeentext{NOTE} :
%        Must produce the actual endnote, using \theenmark as the mark
%        of the endnote and NOTE as the text.  It is called when effectively
%        inside a \parbox, with \hsize = \columnwidth.  For example, it might
%        be as simple as
%               $^{\theenmark}$ NOTE
%
%
%       ****************************************
%       *        ENDNOTE PSEUDOCODE            *
%       ****************************************
%
% \endnote{NOTE}  ==
%  BEGIN
%    \stepcounter{endnote}
%    \@theenmark :=G eval (\theendnote)
%    \@endnotemark
%    \@endnotetext{NOTE}
%  END
%
% \endnote[NUM]{NOTE} ==
%  BEGIN
%    begingroup
%       counter endnote :=L NUM
%       \@theenmark :=G eval (\theendnote)
%    endgroup
%    \@endnotemark
%    \@endnotetext{NOTE}
%  END
%
% \@endnotetext{NOTE} ==
%  BEGIN
%    write to \@enotes file: "\@doanenote{ENDNOTE MARK}"
%    begingroup
%       \next := NOTE
%       set \newlinechar for \write to \space
%       write to \@enotes file: \meaning\next
%               (that is, "macro:->NOTE)
%    endgroup
%  END
%
% \addtoendnotes{TEXT} ==
%  BEGIN
%    open endnotes file if not already open
%    begingroup
%       let \protect to \string
%       set \newlinechar for \write to \space
%       write TEXT to \@enotes file
%    endgroup
%  END
%
% \endnotemark      ==
%  BEGIN \stepcounter{endnote}
%        \@theenmark :=G eval(\theendnote)
%        \@endnotemark
%  END
%
% \endnotemark[NUM] ==
%   BEGIN
%       begingroup
%         endnote counter :=L NUM
%        \@theenmark :=G eval(\theendnote)
%       endgroup
%       \@endnotemark
%   END
%
% \@endnotemark ==
%   BEGIN
%    \leavevmode
%    IF hmode THEN \@x@sf := \the\spacefactor FI
%    \makeenmark          % put number in main text
%    IF hmode THEN \spacefactor := \@x@sf FI
%   END
%
% \endnotetext      ==
%    BEGIN \@theenmark :=G eval (\theendnote)
%          \@endnotetext
%    END
%
% \endnotetext[NUM] ==
%    BEGIN begingroup  counter endnote :=L NUM
%                      \@theenmark :=G eval (\theendnote)
%          endgroup
%          \@endnotetext
%    END
%
%       ****************************************
%       *           ENDNOTE MACROS             *
%       ****************************************
%

\ProvidesPackage{endnotes}[2020-01-02 endnotes package]

\@definecounter{endnote}
\def\theendnote{\@arabic\c@endnote}

\def\@makeenmark{\hbox{\@textsuperscript{\normalfont\@theenmark}}}
\def\makeenmark{\@makeenmark}

\def\theenmark{\@theenmark}

\newdimen\endnotesep

\def\endnote{\@ifnextchar[\@xendnote{\stepcounter{endnote}%
     \protected@xdef\@theenmark{\theendnote}%
     \@endnotemark\@endnotetext}}

\def\@xendnote[#1]{%
   \begingroup
     \c@endnote=#1\relax
     \unrestored@protected@xdef\@theenmark{\theendnote}%
   \endgroup
   \@endnotemark\@endnotetext}

%  Here begins a section of endnote code that's really different from
% the footnote code of LaTeX.

\let\@doanenote=0
\let\@endanenote=0

\newwrite\@enotes
\newif\if@enotesopen \global\@enotesopenfalse
\newif\if@haveenotes \global\@haveenotesfalse

\def\@openenotes{\immediate\openout\@enotes=\jobname.ent\relax
      \global\@enotesopentrue}

%  The stuff with \next and \meaning is a trick from the TeXbook, 382,
% there intended for setting verbatim text, but here used to avoid
% macro expansion when the footnote text is written.  \next will have
% the entire text of the footnote as one long line, which might well
% overflow limits on output line length; the business with \newlinechar
% makes every space become a newline in the \@enotes file, so that all
% of the lines wind up being quite short.

\long\def\@endnotetext#1{%
     \global\@haveenotestrue
     \if@enotesopen \else \@openenotes \fi
     \immediate\write\@enotes{\@doanenote{\@theenmark}}%
     \begingroup
        \def\next{#1}%
        \newlinechar='40
        \immediate\write\@enotes{\meaning\next}%
     \endgroup
     \immediate\write\@enotes{\@endanenote}}

% \addtoendnotes works the way the other endnote macros probably should
% have, requiring the use of \protect for fragile commands.

\long\def\addtoendnotes#1{%
     \global\@haveenotestrue
     \if@enotesopen \else \@openenotes \fi
     \begingroup
        \newlinechar='40
        \let\protect\string
        \immediate\write\@enotes{#1}%
     \endgroup}

% Check at document end if endnotes have been inserted;
% if not, assure the *.ent file is cleared if it exists.
\AtEndDocument{%
     \if@haveenotes\else
         \IfFileExists{\jobname.ent}{
            \if@enotesopen\else\@openenotes\fi
            \addtoendnotes{}}{}
     \fi
}

%  End of unique endnote code

\def\endnotemark{%
   \@ifnextchar[\@xendnotemark
     {\stepcounter{endnote}%
      \protected@xdef\@theenmark{\theendnote}%
      \@endnotemark}}

\def\@xendnotemark[#1]{%
   \begingroup
      \c@endnote #1\relax
      \unrestored@protected@xdef\@theenmark{\theendnote}%
   \endgroup
   \@endnotemark}

\def\@endnotemark{%
  \leavevmode
  \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
  \makeenmark
  \ifhmode\spacefactor\@x@sf\fi
  \relax}

\def\endnotetext{%
     \@ifnextchar [\@xendnotenext
       {\protected@xdef\@theenmark{\theendnote}%
    \@endnotetext}}

\def\@xendnotenext[#1]{\begingroup \c@endnote=#1\relax
   \xdef\@theenmark{\theendnote}\endgroup \@endnotetext}

\def\@xendnotenext[#1]{%
  \begingroup
     \c@endnote=#1\relax
     \unrestored@protected@xdef\@theenmark{\theendnote}%
  \endgroup
  \@endnotetext}


%  \theendnotes actually prints out the endnotes.

%  The user may want separate endnotes for each chapter, or a big
% block of them at the end of the whole document.  As it stands,
% either will work; you just say \theendnotes wherever you want the
% endnotes so far to be inserted.  However, you must add
% \setcounter{endnote}{0} after that if you want subsequent endnotes
% to start numbering at 1 again.

%  \enoteformat is provided so user can specify some special formatting
% for the endnotes.  It needs to set up the paragraph parameters, start
% the paragraph, and print the label.  The \mbox stuff in \enoteheading
% is to make and undo a dummy paragraph, to get around the games \section*
% plays with paragraph indenting and instead give us uniform
% indenting for all notes.

\def\notesname{Notes}%
\def\enoteheading{\section*{\notesname
  \@mkboth{\MakeUppercase{\notesname}}{\MakeUppercase{\notesname}}}%
  \mbox{}\par\vskip-\baselineskip}

\def\enoteformat{\rightskip\z@ \leftskip\z@ \parindent=1.8em
  \leavevmode\llap{\makeenmark}}

\def\enotesize{\footnotesize}

\def\theendnotes{\immediate\closeout\@enotes \global\@enotesopenfalse
  \begingroup
    \makeatletter
    %
    % The machinery with \@ResetGT and > here ensures that
    % \@doanenote works properly even if > is an active character
    % at the point where \theendnotes is invoked. > needs to have
    % catcode 12 when the arguments of \@doanenote are scanned, so
    % that the > in the string "macro:->" is matched.  The actual
    % footnote text is not an argument to \@doanenote, but just
    % follows it in the .ent file; so \@ResetGT can reset the
    % category code for > that should be used when processing
    % that text.  That resetting takes place within a
    % \begingroup-\endgroup block set up by \@doanenote and
    % \@endanenote, so the catcode for > is back to 12 for the
    % next note.
    %
    \edef\@tempa{`\string >}%
    \ifnum\catcode\@tempa=12%
      \let\@ResetGT\relax
    \else
      \edef\@ResetGT{\noexpand\catcode\@tempa=\the\catcode\@tempa}%
      \@makeother\>%
    \fi
    \def\@doanenote##1##2>{\def\@theenmark{##1}\par\begingroup
        \@ResetGT
        \edef\@currentlabel{\csname p@endnote\endcsname\@theenmark}%
        \enoteformat}
    \def\@endanenote{\par\endgroup}%
    \enoteheading
    \enotesize
    \InputIfFileExists{\jobname.ent}{}{%
       \PackageWarning{endnotes}{No endnotes found (file \jobname.ent does not exist)\MessageBreak}
    }%
  \endgroup}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
