% --------------------------------------------------------------------------
% the ENOTEZ package
% 
%   Endnotes for LaTeX2e
% 
% --------------------------------------------------------------------------
% Clemens Niederberger
% Web:    https://github.com/cgnieder/enotez/
% E-Mail: contact@mychemistry.eu
% --------------------------------------------------------------------------
% Copyright 2012--2022 Clemens Niederberger
% 
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% 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.3c or later is part of all distributions of LaTeX
% version 2008/05/04 or later.
% 
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Clemens Niederberger.
% --------------------------------------------------------------------------
% The enotez package consists of the files
%  - enotez.sty, enotez_en.tex, enotez_en.pdf, README
% --------------------------------------------------------------------------
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% --------------------------------------------------------------------------
\RequirePackage {expl3,xparse,l3keys2e,xtemplate}
\ProvidesExplPackage
  {enotez}
  {2022/01/04}
  {0.10d}
  {Endnotes for LaTeX2e}

% --------------------------------------------------------------------------
% messages
\msg_new:nnnn {enotez} {deprecated}
  { The~#1~`#2'~is~deprecated.~Use~`#3'~instead~\msg_line_context:. }
  {
    The~#1~`#2'~you~used~\msg_line_context: \c_space_tl is~deprecated~and~has~
    been~replaced~by~`#3'.~Since~I~will~not~guarantee~that~#1~will~be~kept~
    forever~I~encourage~you~to~switch.
  }

\msg_new:nnn {enotez} {totoc}
  {
    You've~ set~ `totoc~ =~ auto'.~ However,~ I'm~ unbale~ to~ determine~ the~
    toc~ level~ automatically.~ Please~ choose~ the~ level~ yourself.
  }


\cs_new_protected:Npn \enotez_option_deprecated:nn #1#2
  { \msg_warning:nnnnn {enotez} {deprecated} {option} {#1} {#2} }

\cs_new_protected:Npn \enotez_command_deprecated:NN #1#2
  {
    \msg_warning:nnnnn {enotez} {deprecated} {command}
      { \token_to_str:N #1 } { \token_to_str:N #2 }
  }

% --------------------------------------------------------------------------
% variants of kernel functions
\cs_generate_variant:Nn \tl_if_eq:nnTF { Vn , nx }
\cs_generate_variant:Nn \tl_if_eq:nnT  { xx , V }
\cs_generate_variant:Nn \str_if_in:nnT { o }
\cs_generate_variant:Nn \cs_set:Npn    { cpV }

% --------------------------------------------------------------------------
% variables:
\bool_new:N \l__enotez_print_note_bool
\bool_new:N \l__enotez_reset_bool
\bool_new:N \l__enotez_totoc_bool
\bool_new:N \l__enotez_hyperref_bool
\bool_new:N \l__enotez_hyperfootnotes_bool
\bool_new:N \l__enotez_hyperbackref_bool
\bool_new:N \l__enotez_split_bool
\bool_new:N \l__enotez_disable_bool

\tl_new:N   \l__enotez_tmpa_tl
\tl_new:N   \l__enotez_tmpb_tl
\tl_new:N   \l__enotez_tmpc_tl
\tl_new:N   \l__enotez_change_tl
\tl_new:N   \l__enotez_totoc_tl
\tl_new:N   \l__enotez_list_name_tl
\tl_set:Nn  \l__enotez_list_name_tl {Notes}
\tl_new:N   \g__enotez_endnote_text_tl
\tl_new:N   \l__enotez_endnote_mark_tl
\tl_new:N   \l__enotez_list_instance_tl
\tl_set:Nn  \l__enotez_list_instance_tl {plain}
\tl_new:N   \l__enotez_split_tl
\tl_new:N   \l__enotez_splitted_list_sectioning_tl
\tl_new:N   \l__enotez_splitted_title_tl
\tl_set:Nn  \l__enotez_splitted_title_tl {Notes~for~<name>~<ref>}
\tl_new:N   \l__enotez_section_tl
\tl_set:Nn  \l__enotez_section_tl {section}
\tl_new:N   \l__enotez_chapter_tl
\tl_set:Nn  \l__enotez_chapter_tl {chapter}
\tl_new:N   \g__enotez_actual_sectioning_tl
\tl_new:N   \l__enotez_list_splitted_title_tl
\tl_new:N   \g__enotez_list_next_preamble_tl
\tl_new:N   \g__enotez_list_every_preamble_tl
\tl_new:N   \g__enotez_list_next_postamble_tl
\tl_new:N   \g__enotez_list_every_postamble_tl
\tl_new:N   \g__enotez_split_list_preamble_tl
\tl_new:N   \g__enotez_split_list_postamble_tl
\tl_new:N   \l__enotez_footnotes_tl

\skip_new:N \l__enotez_list_preamble_skip
\skip_new:N \l__enotez_list_postamble_skip
\skip_set_eq:NN \l__enotez_list_preamble_skip \medskipamount
\skip_set_eq:NN \l__enotez_list_postamble_skip \medskipamount

\int_new:N  \g__enotez_endnote_id_int
\int_new:N  \g__enotez_endnote_mark_int
\newcounter {endnote}
\int_new:N  \g__enotez_list_printed_int
\int_new:N  \l__enotez_tmpa_int

\prop_new:N \g__enotez_endnote_text_prop
\prop_new:N \g__enotez_endnote_mark_prop
\prop_new:N \g__enotez_endnote_split_prop
\prop_new:N \g__enotez_endnote_sect_prop
\prop_new:N \g__enotez_endnote_sect_id_prop
\prop_new:N \g__enotez_endnote_man_prop

\seq_new:N \l__enotez_tmpa_seq
\seq_new:N \l__enotez_sectioning_seq
\seq_put_right:Nn \l__enotez_sectioning_seq {part}
\seq_put_right:Nn \l__enotez_sectioning_seq {chapter}
\seq_put_right:Nn \l__enotez_sectioning_seq {section}
\seq_put_right:Nn \l__enotez_sectioning_seq {subsection}
\seq_put_right:Nn \l__enotez_sectioning_seq {subsubsection}
\seq_put_right:Nn \l__enotez_sectioning_seq {paragraph}

\str_new:N \l__enotez_tmpa_str

\cs_new_protected:Npn \enotez_nobreak: { \tex_penalty:D 10000 \scan_stop: }

% --------------------------------------------------------------------------
% options:
\keys_define:nn {enotez}
  {
    backref          .bool_set:N         = \l__enotez_hyperbackref_bool ,
    footnotes        .bool_set:N         = \l__enotez_footnotes_tl ,
    list-name        .tl_set:N           = \l__enotez_list_name_tl ,
    reset            .bool_set:N         = \l__enotez_reset_bool ,
    counter-format   .choice: ,
    counter-format / arabic  .code:n = \cs_set:Npn \theendnote {\arabic{endnote}} ,
    counter-format / alph    .code:n = \cs_set:Npn \theendnote {\alph{endnote}} ,
    counter-format / Alph    .code:n = \cs_set:Npn \theendnote {\Alph{endnote}} ,
    counter-format / roman   .code:n = \cs_set:Npn \theendnote {\roman{endnote}} ,
    counter-format / Roman   .code:n = \cs_set:Npn \theendnote {\Roman{endnote}} ,
    counter-format / symbols .code:n = \cs_set:Npn \theendnote {\fnsymbol{endnote}} ,
    mark-format      .code:n             = \cs_set:Npn \enmarkstyle {#1} ,
    mark-cs          .code:n             = \cs_set:Npn \enotezwritemark {#1} ,
    totoc            .choices:nn         =
      { subsection , section , chapter , part , auto , false }
      {
        \tl_if_eq:VnTF \l_keys_choice_tl {false}
          { \bool_set_false:N \l__enotez_totoc_bool }
          {
            \bool_set_true:N \l__enotez_totoc_bool
            \tl_set_eq:NN \l__enotez_totoc_tl \l_keys_choice_tl
          }
      } ,
    totoc            .default:n          = auto ,  
    list-heading     .code:n             =
      \cs_set:Npn \enotezlistheading ##1 {#1} ,
    split            .choices:nn          =
      { section , chapter , false }
      {
        \tl_if_eq:VnTF \l_keys_choice_tl {false}
          { \bool_set_false:N \l__enotez_split_bool }
          { \bool_set_true:N \l__enotez_split_bool }
        \tl_set_eq:NN \l__enotez_split_tl \l_keys_choice_tl
      } ,
    split-sectioning .code:n             =
      \enotez_option_deprecated:nn {split-sectioning} {split-heading}
      \cs_set:Npn \enotezsplitlistheading ##1 {#1}
      \bool_set_true:N \l__enotez_splitted_list_heading_bool ,
    split-heading    .code:n             =
      \cs_set:Npn \enotezsplitlistheading ##1 {#1}
      \bool_set_true:N \l__enotez_splitted_list_heading_bool ,
    split-title      .tl_set:N           = \l__enotez_splitted_title_tl ,
    list-style       .tl_set:N           = \l__enotez_list_instance_tl ,
    list-preamble-skip .skip_set:N       = \l__enotez_list_preamble_skip ,
    list-postamble-skip .skip_set:N      = \l__enotez_list_postamble_skip
  }

% --------------------------------------------------------------------------
% typeset the actual mark:
% #1: id
% #2: mark
\cs_new_protected:Npn \enotez_write_mark:nn #1#2
  {
    % but what if #2 is the reference to a different mark?
    \bool_if:NTF \l__enotez_hyperfootnotes_bool
      {
        \enotezwritemark { \hyperlink {enz.#1} { \enmarkstyle #2 } }
        \bool_if:NT \l__enotez_hyperbackref_bool
          {
            \smash{
              \box_move_up:nn {1em}
                { \hbox:n { \hypertarget {enz.#1.backref} { } } }
            }
          }
      }
      { \enotezwritemark { \enmarkstyle #2 } }
  }
\cs_generate_variant:Nn \enotez_write_mark:nn {x}

% % #1: argument to \ref
% \cs_new_protected:Npn \enotez_ref_note:n #1
%   { \enotezwritemark { \enmarkstyle { \ref {#1} } } }

% the internal endnote:
\cs_new_protected:Npn \enotez_endnote:nn #1#2
  {
    \enotez_endnote_mark:n  {#1}
    \enotez_endnote_text:nn {#1} {#2}
  }

\cs_new_protected:Npn \enotez_endnote_mark:n #1
  {
    \int_gincr:N \g__enotez_endnote_id_int
    \quark_if_no_value:nTF {#1}
      {
        \refstepcounter {endnote}
        \enotez_write_mark:xn
          { \int_use:N \g__enotez_endnote_id_int }
          { \theendnote }
      }
      {
        \cs_gset:cpn {@currentlabel} {\p@endnote#1}
        \enotez_write_mark:xn { \int_use:N \g__enotez_endnote_id_int } {#1}
      }
    \bool_if:NT \l__enotez_disable_bool
      {
        \int_gdecr:N \g__enotez_endnote_id_int
        \addtocounter {endnote} {-1}
      }
  }

\cs_new_protected:Npn \enotez_disable:
  { \bool_set_true:N \l__enotez_disable_bool }

\NewDocumentCommand \enotezdisable {} { \enotez_disable: }

\cs_new_protected:Npn \enotez_endnote_text:nn #1#2
  {
    \tl_set:Nn \l__enotez_tmpa_tl {chapter}
    \quark_if_no_value:nTF {#1}
      {
        \bool_if:nTF
          {
            \l__enotez_split_bool
            &&
            \tl_if_eq_p:NN \l__enotez_split_tl \l__enotez_tmpa_tl
          }
          {
            \enotez_save_note:xxxxxnn
              { \int_use:N \g__enotez_endnote_id_int }
              { \theendnote }
              { \int_use:N \g__enotez_list_printed_int }
              { \thechapter }
              { \int_eval:n { \value{chapter} } }
              {a}
              {#2}
          }
          {
            \enotez_save_note:xxxxxnn
              { \int_use:N \g__enotez_endnote_id_int }
              { \theendnote }
              { \int_use:N \g__enotez_list_printed_int }
              { \thesection }
              { \int_eval:n { \value{section} } }
              {a}
              {#2}
          }
      }
      {
        \bool_if:nTF
          {
            \l__enotez_split_bool
            &&
            \tl_if_eq_p:NN \l__enotez_split_tl \l__enotez_tmpa_tl
          }
          {
            \enotez_save_note:xnxxxnn
              { \int_use:N \g__enotez_endnote_id_int }
              {#1}
              { \int_use:N \g__enotez_list_printed_int }
              { \thechapter }
              { \int_eval:n { \value{chapter} } }
              {m}
              {#2}
          }
          {
            \enotez_save_note:xnxxxnn
              { \int_use:N \g__enotez_endnote_id_int }
              {#1}
              { \int_use:N \g__enotez_list_printed_int }
              { \thesection }
              { \int_eval:n { \value{section} } }
              {m}
              {#2}
          }
      }
  }

% --------------------------------------------------------------------------
% save the notes to the aux file:
% #1: global id
% #2: mark
% #3: split id
% #4: \thesection / \thechapter
% #5: \value{section} / \value{chapter}
% #6: a/m (automatic/manually)
% #7: text
\cs_new_protected:Npn \enotez_save_note:nnnnnnn #1#2#3#4#5#6#7
  {
    \legacy_if:nT {@filesw}
      { \iow_now:Nn \@auxout { \enotez@note {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
  }
\cs_generate_variant:Nn \enotez_save_note:nnnnnnn { xxxxx , xnxxx }

\cs_new_protected:Npn \enotez@note #1#2#3#4#5#6#7
  {
    \tl_gclear_new:c {g__enotez_#1_note_tl}
    \tl_gset:cn {g__enotez_#1_note_tl} {#2}
    \prop_gput:Nnn \g__enotez_endnote_mark_prop    {#1} {#2}
    \prop_gput:Nnn \g__enotez_endnote_split_prop   {#1} {#3}
    \prop_gput:Nnn \g__enotez_endnote_sect_prop    {#1} {#4}
    \prop_gput:Nnn \g__enotez_endnote_sect_id_prop {#1} {#5}
    \prop_gput:Nnn \g__enotez_endnote_man_prop     {#1} {#6}
    \prop_gput:Nnn \g__enotez_endnote_text_prop    {#1} {#7}
  }

% a try to check if a rerun is necessary:
\AtEndDocument
  {
    \cs_set_protected:Npn \enotez@note #1#2#3#4#5#6#7
      {
        \tl_set:Nn \l__enotez_change_tl {#2}
        \tl_if_eq:cNF {g__enotez_#1_note_tl} \l__enotez_change_tl
          {
            \@latex@warning@no@line
              { Endnotes~may~have~changed.~Rerun~to~get~them~right. }
          }
      }
  }

% --------------------------------------------------------------------------
% the actual user command; I would use \NewDocumentCommand but that would
% disable compatibility with `fnpct'
\cs_new_protected:Npn \endnote
  {
    \enotez_nobreak:
    \peek_meaning_ignore_spaces:NTF [
      { \enotez_endnote_aux:w }
      { \enotez_endnote:nn { \q_no_value } }
  }

\cs_new:Npn \enotez_endnote_aux:w [#1]#2
  { \enotez_endnote:nn {#1} {#2} }

\cs_new_protected:Npn \endnotemark
  {
    \peek_meaning_ignore_spaces:NTF [
      { \enotez_endnote_mark_aux:w }
      { \enotez_endnote_mark:n { \q_no_value } }
  }

\cs_new:Npn \enotez_endnote_mark_aux:w [#1]
  { \enotez_endnote_mark:n {#1} }

\cs_new_protected:Npn \endnotetext
  {
    \peek_meaning_ignore_spaces:NTF [
      { \enotez_endnote_text_aux:w }
      { \enotez_endnote_text:nn { \q_no_value } }
  }

% \cs_new_protected:Npn \refendnote #1
%   { \enotez_ref_note:n {#1} }
  
\cs_new:Npn \enotez_endnote_text_aux:w [#1]#2
  { \enotez_endnote_text:nn {#1} {#2} }

% --------------------------------------------------------------------------
% the list of notes
\cs_if_exist:cTF {chapter}
  { \cs_new:Npn \enotezlistheading { \chapter* } }
  { \cs_new:Npn \enotezlistheading { \section* } }

\tl_new:N \enotezsplitlistheading
\bool_new:N \l__enotez_splitted_list_heading_bool

\cs_new_protected:Npn \enotez_set_totoc:
  {
    \bool_if:NT \l__enotez_totoc_bool
      {
        \bool_if:NT \l__enotez_hyperref_bool { \phantomsection }
        \bool_set_false:N \l__enotez_tmpa_bool
        \tl_if_eq:VnTF \l__enotez_totoc_tl {auto}
          {
            \seq_map_inline:Nn \l__enotez_sectioning_seq
              {
                \str_if_in:onT { \enotezlistheading{} } {##1}
                  {
                    \bool_set_true:N \l__enotez_tmpa_bool
                    \tl_set:Nn \l__enotez_totoc_tl {##1}
                  }
              }
            \bool_if:NF \l__enotez_tmpa_bool
              {
                \tl_set:Nn \l__enotez_totoc_tl {false}
                \msg_warning:nn {enotez} {totoc}
              }
          }
          { \bool_set_true:N \l__enotez_tmpa_bool }
        \bool_if:NT \l__enotez_tmpa_bool
          {
            \addcontentsline
              {toc}
              { \l__enotez_totoc_tl }
              { \l__enotez_list_name_tl }
          }
      }
  }

\cs_new_protected:Npn \enotez_build_print_list:nnnn #1#2#3#4
  {
    \int_zero:N \l__enotez_tmpa_int
    \bool_if:nTF {#1}
      {
        \prop_map_inline:Nn \g__enotez_endnote_mark_prop
          {
            \enotez_get_note:nn {#1} {##1}
            \bool_if:NT \l__enotez_print_note_bool {#3}
          }
      }
      {
    \int_do_while:nn { \l__enotez_tmpa_int <= \g__enotez_list_printed_int }
      {
        \seq_clear:N \l__enotez_tmpa_seq
        \prop_map_inline:Nn \g__enotez_endnote_mark_prop
          {
            \tl_if_eq:xxT
              { \int_use:N \l__enotez_tmpa_int }
              { \prop_item:Nn \g__enotez_endnote_split_prop {##1} }
              { \seq_put_right:Nn \l__enotez_tmpa_seq {##1} }
          }
        \seq_if_empty:NF \l__enotez_tmpa_seq
          {
            \enotez_get_split_title:x { \seq_item:Nn \l__enotez_tmpa_seq {1} }
            #2
          }
        \seq_map_inline:Nn \l__enotez_tmpa_seq
          {
            \enotez_get_note:nn {#1} {##1}
            \bool_if:NT \l__enotez_print_note_bool {#3}
          }
        \seq_if_empty:NF \l__enotez_tmpa_seq {#4}
        \int_incr:N \l__enotez_tmpa_int
      }
    }
  }

\DeclareObjectType {enotez-list} {1}

\DeclareTemplateInterface {enotez-list} {paragraph} {1}
  {
    heading       : function 1 = \enotezlistheading {#1} ,
    format        : tokenlist  = \footnotesize           ,
    number        : function 1 = \enmark{#1}             ,
    number-format : tokenlist  = \normalfont             ,
    notes-sep     : length     = .5\baselineskip
  }

\DeclareTemplateCode {enotez-list} {paragraph} {1}
  {
    heading       = \enotez_list_heading:n           ,
    format        = \l__enotez_list_format_tl        ,
    number        = \enotez_list_number:n            ,
    number-format = \l__enotez_list_number_format_tl ,
    notes-sep     = \l__enotez_list_notes_sep_dim
  }
  {
    \group_begin:
    \AssignTemplateKeys
    \enotez_set_totoc:
    \enotez_list_heading:n { \l__enotez_list_name_tl }
    \enotez_list_preamble:
    \enotez_build_print_list:nnnn {#1}
      {}
      {
        \par\noindent
        \group_begin:
          \tl_use:N \l__enotez_list_format_tl
          \hbox_overlap_left:n
            {
              \enotez_list_number:n
                { \enotez_write_list_number:n {##1} }
              \tl_use:N \c_space_tl
            }
          % \cs_set:cpn {@currentlabel}
          %   { \p@endnote \l__enotez_endnote_mark_tl }
          \tl_use:N \g__enotez_endnote_text_tl
          \par
          \dim_compare:nT { \l__enotez_list_notes_sep_dim != 0pt }
            { \addvspace { \l__enotez_list_notes_sep_dim } }
        \group_end:
      }
      {}
    \enotez_list_postamble:
    \group_end:
  }

\DeclareTemplateInterface {enotez-list} {list} {1}
  {
    heading       : function 1 = \enotezlistheading {#1} ,
    format        : tokenlist  = \footnotesize           ,
    number        : function 1 = \enmark{#1}             ,
    number-format : tokenlist  = \normalfont             ,
    list-type     : tokenlist  = description
  }

\DeclareTemplateCode {enotez-list} {list} {1}
  {
    heading       = \enotez_list_heading:n           ,
    format        = \l__enotez_list_format_tl        ,
    number        = \enotez_list_number:n            ,
    number-format = \l__enotez_list_number_format_tl ,
    list-type     = \l__enotez_list_type_tl
  }
  {
    \AssignTemplateKeys
    \enotez_set_totoc:
    \enotez_list_heading:n { \l__enotez_list_name_tl }
    \enotez_list_preamble:
    \enotez_build_print_list:nnnn {#1}
      {
        \group_begin:
          \tl_use:N \l__enotez_list_format_tl
          \begin{\l__enotez_list_type_tl}
      }
      {
        \item
          [
            \enotez_list_number:n
              { \enotez_write_list_number:n {##1} }
          ]
        % \cs_set:cpn {@currentlabel}
        %   { \p@endnote \l__enotez_endnote_mark_tl }
        \tl_use:N \g__enotez_endnote_text_tl
      }
      {
          \end{\l__enotez_list_type_tl}
        \group_end:
      }
    \enotez_list_postamble:
  }

% some default styles:
\DeclareInstance {enotez-list} {plain} {paragraph } { }
\DeclareInstance {enotez-list} {description} {list} { }
\DeclareInstance {enotez-list} {itemize} {list} { list-type = itemize }

% --------------------------------------------------------------------------
% write the mark in the lists:
\cs_new_protected:Npn \enotez_write_list_number:n #1
  {
    \bool_if:NT \l__enotez_hyperfootnotes_bool
      { \box_move_up:nn {1em} { \hbox:n { \hypertarget {enz.#1} { } } } }
    \tl_use:N \l__enotez_list_number_format_tl
    \tl_if_eq:nxTF {a} { \prop_item:Nn \g__enotez_endnote_man_prop {#1} }
      {
        \bool_if:nTF
          { \l__enotez_hyperfootnotes_bool && \l__enotez_hyperbackref_bool }
          {
            \exp_args:Nnx
            \hyperlink {enz.#1.backref}
              { \exp_not:V \l__enotez_endnote_mark_tl }
          }
          { \prop_item:Nn \g__enotez_endnote_mark_prop {#1} }
      }
      {
        \bool_if:nTF
          { \l__enotez_hyperfootnotes_bool && \l__enotez_hyperbackref_bool }
          {
            \exp_args:Nnx
            \hyperlink {enz.#1.backref}
              { \exp_not:V \l__enotez_endnote_mark_tl }
          }
          { \tl_use:N \l__enotez_endnote_mark_tl }
      }
  }

% --------------------------------------------------------------------------
% determine which note's next:
\cs_new_protected:Npn \enotez_get_note:nn #1#2
  {
    \bool_if:nTF {#1}
      {
        \prop_get:NnN \g__enotez_endnote_mark_prop {#2} \l__enotez_endnote_mark_tl
        \prop_get:NnN \g__enotez_endnote_text_prop {#2} \g__enotez_endnote_text_tl
        \tl_gset_eq:NN
          \g__enotez_endnote_text_tl
          \g__enotez_endnote_text_tl
        \bool_set_true:N \l__enotez_print_note_bool
      }
      {
        \prop_get:NnN \g__enotez_endnote_split_prop {#2} \l__enotez_tmpa_tl
        \bool_if:NTF \l__enotez_split_bool
          {
            \bool_set_true:N \l__enotez_print_note_bool
            \tl_set:Nx \l__enotez_endnote_mark_tl
              { \prop_item:Nn \g__enotez_endnote_mark_prop {#2} }
            \tl_gset:Nx \g__enotez_endnote_text_tl
              { \prop_item:Nn \g__enotez_endnote_text_prop {#2} }
          }
          {
            \int_compare:nTF { \l__enotez_tmpa_tl = \g__enotez_list_printed_int }
              {
                \bool_set_true:N \l__enotez_print_note_bool
                \tl_set:Nx \l__enotez_endnote_mark_tl
                  { \prop_item:Nn \g__enotez_endnote_mark_prop {#2} }
                \tl_gset:Nx \g__enotez_endnote_text_tl
                  { \prop_item:Nn \g__enotez_endnote_text_prop {#2} }
                \prop_gremove:Nn  \g__enotez_endnote_split_prop {#2}
              }
              { \bool_set_false:N \l__enotez_print_note_bool }
          }
      }
  }

% --------------------------------------------------------------------------
% the titles in between the splits:
\prop_new:N \l__enotez_split_title_replacements_prop

\cs_new:Npn \enotez_new_split_title_replacements:nn #1#2
  { \prop_put:Nnn \l__enotez_split_title_replacements_prop {<#1>} {#2} }

\NewDocumentCommand \NewSplitTitleTag {mm}
  { \enotez_new_split_title_replacements:nn {#1} {#2} }

\tl_new:N \l__enotez_replace_split_title_tag_tl
% #1: tl var
% #2: tag
% #3: replacement
\cs_new_protected:Npn \__enotez_replace_split_title_tag:Nnn #1#2#3
  {
    \tl_set:Nx \l__enotez_replace_split_title_tag_tl { \tl_to_str:n {<#2>} }
    \tl_replace_all:NVn #1 \l__enotez_replace_split_title_tag_tl {#3}
    \tl_set:Nx #1 { \tl_to_str:N #1 }
  }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
\cs_generate_variant:Nn \__enotez_replace_split_title_tag:Nnn { NnV , Nnx }

% #1: tl for current title
% #2: title with tags
% #3: id
\cs_new_protected:Npn \enotez_read_splitted_title:Nnn #1#2#3
  {
    \group_begin:
      % needs to be expanded, since it is \GetTranslation {...} :
      \tl_set:Nf \l__enotez_tmpa_tl {#2}
      % stringify:
      \tl_set:Nx \l__enotez_tmpa_tl { \tl_to_str:N \l__enotez_tmpa_tl }
      \prop_map_inline:Nn \l__enotez_split_title_replacements_prop
        {
          \tl_set:Nn \l__enotez_tmpb_tl {##1}
          \tl_replace_all:NVn \l__enotez_tmpa_tl \l__enotez_tmpb_tl {##2}
        }
      \__enotez_replace_split_title_tag:NnV \l__enotez_tmpa_tl {name}
        \g__enotez_actual_sectioning_tl
      \__enotez_replace_split_title_tag:Nnx \l__enotez_tmpa_tl {ref}
        { \prop_item:Nn \g__enotez_endnote_sect_prop {#3} }
      \__enotez_replace_split_title_tag:Nnx \l__enotez_tmpa_tl {split-level-id}
        { \prop_item:Nn \g__enotez_endnote_sect_id_prop {#3} }
      % retokenize:
      \tl_set_rescan:NnV \l__enotez_tmpa_tl { } \l__enotez_tmpa_tl
      \tl_gset_eq:NN #1 \l__enotez_tmpa_tl
    \group_end:
  }
\cs_generate_variant:Nn \enotez_read_splitted_title:Nnn { NV }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NVx }
\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }

\cs_new_protected:Npn \enotez_first_upper:n #1
  { \text_titlecase_first:n {#1} }
\cs_generate_variant:Nn \enotez_first_upper:n { V }

\tl_new:N \l__enotez_last_split_id_tl

\cs_new_protected:Npn \enotez_get_split_title:n #1
 { 
    \prop_get:NnN \g__enotez_endnote_split_prop {#1} \l__enotez_tmpa_tl
    \bool_if:NT \l__enotez_split_bool
      {
        \tl_if_eq:NNF \l__enotez_tmpa_tl \l__enotez_last_split_id_tl
          {
            \tl_if_eq:VnTF \l__enotez_split_tl { section }
              { \tl_gset:Nf \g__enotez_actual_sectioning_tl { \l__enotez_section_tl } }
              { \tl_gset:Nf \g__enotez_actual_sectioning_tl { \l__enotez_chapter_tl } }
            \enotez_read_splitted_title:NVn
              \EnotezCurrentSplitTitle
              \l__enotez_splitted_title_tl
              {#1}
            \enotez_split_list_preamble:
            \bool_if:NTF \l__enotez_splitted_list_heading_bool
              { \exp_args:No \enotezsplitlistheading }
              {
                \tl_if_eq:VnTF \l__enotez_split_tl {section}
                  { \exp_args:NNo \subsection* }
                  { \exp_args:NNo \section* }
              }
            { \EnotezCurrentSplitTitle }% this is the argument to the sectioning command
            \enotez_split_list_postamble:
          }
      }
    \prop_get:NnN \g__enotez_endnote_split_prop {#1} \l__enotez_last_split_id_tl
  }
\cs_generate_variant:Nn \enotez_get_split_title:n {x}

% --------------------------------------------------------------------------
% the marks in the list:
\cs_new:Npn   \enmark #1 { #1 . }

% the marks in the text:
\cs_new:Npn   \enmarkstyle { }
\cs_new_eq:NN \enotezwritemark \textsuperscript

% --------------------------------------------------------------------------
% internal printendnotes:
% #1: boolean
% #2: list style
\cs_new_protected:Npn \enotez_print_endnotes:nn #1#2
  {
    \enotez_if_endnotes:T
      {
        \tl_if_blank:nTF {#2}
          { \UseInstance {enotez-list} { \l__enotez_list_instance_tl } }
          { \UseInstance {enotez-list} {#2} }
        {#1}
        \bool_if:NF \l__enotez_split_bool
          {
            \bool_if:NT \l__enotez_reset_bool
              { \setcounter {endnote} {0} }
            \int_gincr:N \g__enotez_list_printed_int
          }
        \bool_if:NT \l__enotez_reset_bool
          { \setcounter {endnote} {0} }
      }
  }

\prg_new_conditional:Npnn \enotez_if_endnotes: {p,T,F,TF}
  {
    \int_compare:nTF { \g__enotez_endnote_id_int > 0 }
      { \prg_return_true: }
      { \prg_return_false: }
  }

% the user command:
\NewDocumentCommand \printendnotes {so}
  {
    \IfNoValueTF {#2}
      {
        \bool_if:NTF \l__enotez_split_bool
          { \enotez_print_endnotes:nn { \BooleanFalse } { } }
          { \enotez_print_endnotes:nn {#1} { } }
      }
      {
        \bool_if:NTF \l__enotez_split_bool
          { \enotez_print_endnotes:nn { \BooleanFalse } {#2} }
          { \enotez_print_endnotes:nn {#1} {#2} }
      }
  }

% --------------------------------------------------------------------------
% preamble and postamble to the list:
\cs_new_protected:Npn \enotez_list_preamble:
  {
    \tl_if_empty:NTF \g__enotez_list_next_preamble_tl
      {
        \tl_if_empty:NF \g__enotez_list_every_preamble_tl
          {
            \tl_use:N \g__enotez_list_every_preamble_tl
            \par
            \skip_vertical:N \l__enotez_list_preamble_skip
          }
      }
      {
        \tl_use:N \g__enotez_list_next_preamble_tl
        \par
        \skip_vertical:N \l__enotez_list_preamble_skip
      }
    \tl_gclear:N \g__enotez_list_next_preamble_tl
  }

\cs_new_protected:Npn \enotez_list_postamble:
  {
    \tl_if_empty:NTF \g__enotez_list_next_postamble_tl
      {
        \tl_if_empty:NF \g__enotez_list_every_postamble_tl
          {
            \par
            \skip_vertical:N \l__enotez_list_postamble_skip
            \tl_use:N \g__enotez_list_every_postamble_tl
          }
      }
      {
        \par
        \skip_vertical:N \l__enotez_list_postamble_skip
        \tl_use:N \g__enotez_list_next_postamble_tl
      }
    \tl_gclear:N \g__enotez_list_next_postamble_tl
  }

\cs_new_protected:Npn \enotez_set_next_preamble:n #1
  { \tl_gset:Nn \g__enotez_list_next_preamble_tl {#1} }

\cs_new_protected:Npn \enotez_set_every_preamble:n #1
  { \tl_gset:Nn \g__enotez_list_every_preamble_tl {#1} }

\cs_new_protected:Npn \enotez_set_next_postamble:n #1
  { \tl_gset:Nn \g__enotez_list_next_postamble_tl {#1} }

\cs_new_protected:Npn \enotez_set_every_postamble:n #1
  { \tl_gset:Nn \g__enotez_list_every_postamble_tl {#1} }

\NewDocumentCommand \AtNextEndnotesList {+m}
  { \enotez_set_next_preamble:n {#1} }

\NewDocumentCommand \AtEveryEndnotesList {+m}
  { \enotez_set_every_preamble:n {#1} }

\NewDocumentCommand \AfterNextEndnotesList {+m}
  { \enotez_set_next_postamble:n {#1} }

\NewDocumentCommand \AfterEveryEndnotesList {+m}
  { \enotez_set_every_postamble:n {#1} }

% --------------------------------------------------------------------------
% preamble and postamble to the sub-headings in a splitted list:
\cs_new_protected:Npn \enotez_split_list_preamble:
  {
    \tl_if_empty:NF \g__enotez_split_list_preamble_tl
      {
        \par
        \tl_use:N \g__enotez_split_list_preamble_tl
      }
  }

\cs_new_protected:Npn \enotez_split_list_postamble:
  {
    \tl_if_empty:NF \g__enotez_split_list_postamble_tl
      {
        \tl_use:N \g__enotez_split_list_postamble_tl
        \par
      }
  }

\cs_new_protected:Npn \enotez_set_every_split_preamble:n #1
  { \tl_gset:Nn \g__enotez_split_list_preamble_tl {#1} }

\cs_new_protected:Npn \enotez_set_every_split_postamble:n #1
  { \tl_gset:Nn \g__enotez_split_list_postamble_tl {#1} }

\NewDocumentCommand \AtEveryListSplit {+m}
  { \enotez_set_every_split_preamble:n {#1} }

\NewDocumentCommand \AfterEveryListSplit {+m}
  { \enotez_set_every_split_postamble:n {#1} }

\cs_new:Npn \EnotezCurrentSplitTitle {}

% --------------------------------------------------------------------------

\AtBeginDocument
  {
    \bool_if:NT \l__enotez_split_bool
      {
        \tl_if_eq:VnTF \l__enotez_split_tl {section}
          {
            \tl_put_left:Nn \section
              {
                \int_gincr:N \g__enotez_list_printed_int
                \bool_if:NT \l__enotez_reset_bool
                  { \setcounter {endnote} {0} }
              }
          }
          {
            \tl_put_left:Nn \chapter
              {
                \int_gincr:N \g__enotez_list_printed_int
                \bool_if:NT \l__enotez_reset_bool
                  { \setcounter {endnote} {0} }
              }
          }
      }
    \@ifpackageloaded {hyperref}
      {
        \bool_set_true:N \l__enotez_hyperref_bool
        \ifHy@hyperfootnotes
          \bool_set_true:N \l__enotez_hyperfootnotes_bool
        \else
          \bool_set_false:N \l__enotez_hyperfootnotes_bool
        \fi
      }
      {
        \bool_set_false:N \l__enotez_hyperref_bool
        \bool_set_false:N \l__enotez_hyperfootnotes_bool
      }
  }

% --------------------------------------------------------------------------
% the setup command:
\NewDocumentCommand \setenotez {m}
  { \keys_set:nn {enotez} {#1} }

% --------------------------------------------------------------------------
% language support
\RequirePackage {translations}
\DeclareTranslationFallback     {enotez-title} {Notes}
\DeclareTranslation {Catalan}   {enotez-title} {Notes}
\DeclareTranslation {Croatian}  {enotez-title} {Bilje\v{s}ke}
\DeclareTranslation {English}   {enotez-title} {Notes}
\DeclareTranslation {French}    {enotez-title} {Remarques}
\DeclareTranslation {German}    {enotez-title} {Anmerkungen}
\DeclareTranslation {Hungarian} {enotez-title} {Megjegyz\'{e}sek}
\DeclareTranslation {Italian}   {enotez-title} {Note}
\DeclareTranslation {Spanish}   {enotez-title} {Notas}
\DeclareTranslation {Turkish}   {enotez-title} {Notlar}

\DeclareTranslationFallback     {enotez-splitted-title} {Notes~for~<name>~<ref>}
\DeclareTranslation {Catalan}   {enotez-splitted-title} {Notes~del~<name>~<ref>}
\DeclareTranslation {Croatian}  {enotez-splitted-title} {Bilje\v{s}ke~uz~<name>~<ref>}
\DeclareTranslation {English}   {enotez-splitted-title} {Notes~for~<name>~<ref>}
\DeclareTranslation {French}    {enotez-splitted-title} {Remarques~aux~<name>~<ref>}
\DeclareTranslation {German}    {enotez-splitted-title} {Anmerkungen~zu~<name>~<ref>}
\DeclareTranslation {Hungarian} {enotez-splitted-title} {Megjegyz\'{e}sek~a~<ref>.~<name>}
\DeclareTranslation {Italian}   {enotez-splitted-title} {Note~per~il~<name>~<ref>}
\DeclareTranslation {Spanish}   {enotez-splitted-title} {Notas~del~<name>~<ref>}
\DeclareTranslation {Turkish}   {enotez-splitted-title} {<name>~<ref>~notlar}

\DeclareTranslationFallback     {enotez-section} {section}
\DeclareTranslation {Catalan}   {enotez-section} {secci\'{o}}
\DeclareTranslation {Croatian}  {enotez-section} {odjeljak}
\DeclareTranslation {English}   {enotez-section} {section}
\DeclareTranslation {French}    {enotez-section} {section}
\DeclareTranslation {German}    {enotez-section} {Abschnitt}
\DeclareTranslation {Hungarian} {enotez-section} {szakasz}
\DeclareTranslation {Italian}   {enotez-section} {sezione}
\DeclareTranslation {Spanish}   {enotez-section} {secci\'{o}n}
\DeclareTranslation {Turkish}   {enotez-section} {B\"{o}l\"{u}m}

\DeclareTranslationFallback     {enotez-chapter} {chapter}
\DeclareTranslation {Catalan}   {enotez-chapter} {cap\'{\i}tol}
\DeclareTranslation {Croatian}  {enotez-chapter} {poglavlje}
\DeclareTranslation {English}   {enotez-chapter} {chapter}
\DeclareTranslation {French}    {enotez-chapter} {chapitre}
\DeclareTranslation {German}    {enotez-chapter} {Kapitel}
\DeclareTranslation {Hungarian} {enotez-chapter} {fejezet}
\DeclareTranslation {Italian}   {enotez-chapter} {capitolo}
\DeclareTranslation {Spanish}   {enotez-chapter} {cap\'{\i}tulo}
\DeclareTranslation {Turkish}   {enotez-chapter} {B\"{o}l\"{u}m}

\tl_set:Nn \l__enotez_splitted_title_tl { \GetTranslation {enotez-splitted-title} }
\tl_set:Nn \l__enotez_list_name_tl      { \GetTranslation {enotez-title} }
\tl_set:Nn \l__enotez_section_tl        { \GetTranslation {enotez-section} }
\tl_set:Nn \l__enotez_chapter_tl        { \GetTranslation {enotez-chapter} }

\file_input_stop:
% --------------------------------------------------------------------------
% HISTORY:
2012/07/03 v0.1   - first public version on bitbucket
2012/07/05 v0.2   - added preliminary `split' option
                  - enable endnotes in captions with KOMA classes, `memoir' and
                    the `caption' package
2012/07/06 v0.2a  - made the splitted list titles customizable
2012/07/07 v0.3   - list-building rewritten due to a design flaw
2012/07/24 v0.3a  - adapted to deprecated functions in l3kernel and l3packages,
                    removed debugging leftover
2012/12/14 v0.3b  - bug fix: works again when used with a KOMA class and an
                    endnote is used inside a caption
2012/12/30 v0.4   - new options `mark-cs' and `mark-format', redefinable
                    commands \enmarkstyle and \enotezwritemark
2012/01/18 v0.4a  - added beginnings of internationalization -- this will need
                    help from users speaking the actual languages
2013/03/12 v0.5   - \AtNextEndnotesList, \AtEveryEndnotesList
                  - use protected internal commands where appropriate
                  - fix wrong endnote marks when used with the `caption'
                    package
2013/03/18 v0.5a  - adapt to deprecated expl3 commands
2013/04/06 v0.6   - \endnote sets \@currentlabel so endnotes can be referenced
                    with \label{} and \ref{}
2013/05/01 v0.7   - new option `backref' adds links from the notes in the list
                    back to the notes in the text (needs `hyperref' loaded)
                  - new: \AtEveryListSplit, \AfterEveryListSplit,
                    \EnotezCurrentSplitTitle
                  - new option: `list-heading'
2013/08/03 v0.7a  - corrected bug: `reset=true' now works as it should
                  - added counter-format `symbols'
2013/10/31 v0.7b  - corrected bug: \acro_command_deprecated:NN should of course
                    be \enotez_command_deprecated:NN
2014/02/04 v0.7c  - added a missing \par to the `paragraph' template for the
                    list
2015/06/24 v0.8   - bug fix in typesetting the split-headings
                  - new command \NewSplitTitleTag
2015/07/29 v0.8a  - adapt to deprecated choice selection in keys
2016/01/07 v0.8b  - \prop_get:Nn => \prop_item:Nn
2016/11/08 v0.9   - fix issues #6, #7, and #8
                  - remove caption patching and add \endnotemark and \endnotetext
2017/04/24 v0.9a  - fix wrong format of number in list
2019/09/30 v0.10  - fix issus #14
                  - don't allow package options any more
                  - implement issue #17: new choices for the totoc option:
                    `auto', `subsection' and `part'
                  - fix issue #18
                  - implement issue #13
                  - implement issue #9
2019/10/12 v0.10a - remove unnecessary package dependencies
2020/01/16 v0.10b - adapt to renaming of string case changing functions
2020/12/13 v0.10c - fix issue #23