texlive[57505] Master: fnpct (23jan21)

commits+karl at tug.org commits+karl at tug.org
Sat Jan 23 23:18:40 CET 2021


Revision: 57505
          http://tug.org/svn/texlive?view=revision&revision=57505
Author:   karl
Date:     2021-01-23 23:18:39 +0100 (Sat, 23 Jan 2021)
Log Message:
-----------
fnpct (23jan21)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/fnpct/README
    trunk/Master/texmf-dist/tex/latex/fnpct/fnpct.sty
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.cls
    trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf
    trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.tex

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.pdf
    trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.tex

Modified: trunk/Master/texmf-dist/doc/latex/fnpct/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fnpct/README	2021-01-23 22:17:41 UTC (rev 57504)
+++ trunk/Master/texmf-dist/doc/latex/fnpct/README	2021-01-23 22:18:39 UTC (rev 57505)
@@ -1,23 +1,22 @@
 --------------------------------------------------------------------------
-the FNPCT package v0.5
+the FNPCT package v1.0 2021/01/21
 
   footnote kerning
 
-2019/10/05
 --------------------------------------------------------------------------
 Clemens Niederberger
-Web:    https://bitbucket.org/cgnieder/fnpct/
+Web:    https://github.com/cgnieder/fnpct/
 E-Mail: contact at mychemistry.eu
 --------------------------------------------------------------------------
-Copyright 2012--2019 Clemens Niederberger
+Copyright 2012--2021 Clemens Niederberger
 
 This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
+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.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+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'.
 

Added: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.cls
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.cls	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.cls	2021-01-23 22:18:39 UTC (rev 57505)
@@ -0,0 +1,331 @@
+% --------------------------------------------------------------------------
+% the FNPCT package
+% 
+%   footnote kerning
+% 
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web:    https://github.com/cgnieder/fnpct/
+% E-Mail: contact at mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012--2021 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.
+% --------------------------------------------------------------------------
+\RequirePackage[multiple]{fnpct}
+\ProvidesClass{fnpct-manual}[2021/01/17]
+
+\LoadClass[load-preamble,add-index]{cnltx-doc}
+\RequirePackage{imakeidx}
+
+\setcnltx{
+  package  = {fnpct} ,
+  info     = {Footnote kerning and multiple footnotes} ,
+  authors  = Clemens Niederberger ,
+  email    = contact at mychemistry.eu ,
+  url      = https://github.com/cgnieder/fnpct/ ,
+  abstract = {%
+      The \fnpct\ package basically does two things to footnotes: if footnote
+      marks are followed by a punctuation mark the order of footnote and
+      punctuation mark is reversed and the kerning gets adjusted.  As a side
+      effect mutiple footnotes and footnote ranges are easily obtained..%
+  },
+  add-cmds = {
+    AdaptNote,
+    AdaptNoteName,
+    AddPunctuation,
+    % kfc,
+    % kfp,
+    multfootnote,
+    MultVariant,
+    setfnpct
+  } ,
+  add-silent-cmds = {
+    @mpfn,
+    anote,
+    anotecontent,
+    arabic,
+    DeclareNewFootnote,
+    endnote,
+    footcite
+    footnoteB,
+    footref,
+    IfBooleanTF,
+    IfNoValueTF,
+    multendnote,
+    multfootcite,
+    multparnote,
+    multsidenote,
+    myfn,
+    newfootnotes,
+    parnote,
+    parnotes,
+    sidenote,
+    theendnotes,
+    thempfootnote
+  } ,
+  makeindex-setup = {options={-s cnltx.ist},columns=3,columnsep=1em} ,
+  index-setup = {othercode=\footnotesize,level=\addsec}
+}
+
+\RequirePackage{array,booktabs}
+
+\RequirePackage{endnotes}
+\RequirePackage{parnotes}
+\RequirePackage{sepfootnotes}
+
+\newfootnotes{a}
+
+\renewcommand\thempfootnote{\arabic{mpfootnote}}
+
+\DeclareTranslation{english}{cnltx-default}{Initial}
+
+\protected\def\@versionstar{\raisebox{-.25em}{*}}
+\newcommand\versionstar{\texorpdfstring{\@versionstar}{*}}
+
+\newcommand*\TF{\textcolor{red}{\uline{\code{\textcolor{cs}{\textit{TF}}}}}}
+
+\RequirePackage{fontawesome}
+\RequirePackage{datetime2}
+\DTMsetup{useregional=numeric,datesep=/}
+\newrobustcmd*\fnpct at add@version[2]{%
+  \csdef{ac at ver@#2}{%
+    \DTMdate{#1}%
+    \csgdef{ac at ver@#2used}{}%
+    \csdef{ac at ver@#2}{\DTMdate{#1}}%
+  }%
+}
+
+\newrobustcmd*\ac at date[1]{\ifcsdef{ac at ver@#1used}{}{ (\csuse{ac at ver@#1})}}
+\newrobustcmd*\ac at ifnew[1]{\ifcsstring{c_fnpct_version_tl}{#1}}
+\newrobustcmd*\ac at NEW{\faStarO\ New}
+
+\renewrobustcmd*\sinceversion[1]{%
+  \ac at ifnew{#1}%
+    {\cnltx at version@note{\textcolor{red}{\ac at NEW}}}%
+    {\cnltx at version@note{\GetTranslation{cnltx-introduced}~v#1\ac at date{#1}}}%
+}
+\renewrobustcmd*\changedversion[1]{%
+  \cnltx at version@note{\GetTranslation{cnltx-changed}~v#1\ac at date{#1}}%
+}
+
+\newnote*\sincechanged[2]{%
+  \GetTranslation{cnltx-introduced}~#1\ac at date{#1},
+  changed with ~v#2\ac at date{#2}\ac at ifnew{#2}{ \ac at NEW}{}%
+}
+
+\RenewDocumentEnvironment{commands}{}
+  {%
+    \cnltx at set@catcode_{12}%
+    \let\command\cnltx at command
+    \cnltxlist
+  }
+  {\endcnltxlist}
+  
+\RequirePackage{tcolorbox,xsimverb}
+\tcbuselibrary{skins,breakable}
+\tcbset{enhanced,enhanced jigsaw}
+
+\newtcolorbox{bewareofthedog}{
+  colback  = red!2!white!98 ,
+  colframe = red ,
+  underlay={%
+    \path[draw=none]
+      (interior.south west)
+      rectangle node[red]{\Huge\bfseries !}
+      ([xshift=-4mm]interior.north west);
+    }%
+}
+
+\newtcolorbox{cnltxcode}[1][]{
+  boxrule = 1pt ,
+  colback = cnltxbg ,
+  colframe = cnltx ,
+  arc = 5pt ,
+  beforeafter skip = .5\baselineskip ,%
+  #1%
+}
+
+\newcommand*\fnpctman at readoptions[1]{%
+  \catcode`\^^M=13
+  \fnpctman at read@options{#1}%
+}
+
+\begingroup
+\catcode`\^^M=13
+\gdef\fnpctman at read@options#1#2^^M{%
+  \endgroup
+  \ifblank{#2}{}{\fnpctman at read@options@#2}%
+  #1%
+  \XSIMfilewritestart*{\jobname.tmp}%
+}%
+\endgroup
+\def\fnpctman at read@options@[#1]{\pgfqkeys{/cnltx}{#1}}
+
+\RenewDocumentEnvironment{sourcecode}{}
+  {%
+    \begingroup
+    \fnpctman at readoptions{%
+      \setlength\cnltx at sidebysidewidth
+        {\dimexpr .45\columnwidth -\lst at xleftmargin -\lst at xrightmargin\relax}%
+      \expanded{%
+        \noexpand\lstset{
+          style=cnltx,
+          \ifboolexpe{ bool {cnltx at sidebyside} and not bool {cnltx at codeonly} }
+            {linewidth=\cnltx at sidebysidewidth,}{}%
+          \expandonce\cnltx at local@listings at options
+        }%
+      }%
+      \XSIMgobblechars{2}%
+    }%
+  }
+  {%
+    \XSIMfilewritestop
+    \cnltxcode[breakable]%
+    \lstinputlisting[style=cnltx]{\jobname.tmp}%
+    \endcnltxcode
+  }
+
+\RenewDocumentEnvironment{example}{}
+  {%
+    \begingroup
+    \fnpctman at readoptions{%
+      \setlength\cnltx at sidebysidewidth
+        {\dimexpr .45\columnwidth -\lst at xleftmargin -\lst at xrightmargin\relax}%
+      \expanded{%
+        \noexpand\lstset{
+          style=cnltx,
+          \ifboolexpe{ bool {cnltx at sidebyside} and not bool {cnltx at codeonly} }
+            {linewidth=\cnltx at sidebysidewidth,}{}%
+          \expandonce\cnltx at local@listings at options
+        }%
+      }%
+      \XSIMgobblechars{2}%
+    }%
+  }
+  {%
+    \XSIMfilewritestop
+    \ifbool{cnltx at sidebyside}
+      {%
+        \cnltxcode
+        \noindent
+        \minipage[c]{\cnltx at sidebysidewidth}%
+          \cnltx at pre@source at hook
+          \lstinputlisting[style=cnltx] {\jobname.tmp}%
+          \cnltx at after@source at hook
+        \endminipage\hfill
+        \minipage[c]{\cnltx at sidebysidewidth}%
+          \cnltx at pre@example at hook
+          \input {\jobname.tmp}%
+          \cnltx at after@example at hook
+        \endminipage
+      }
+      {%
+        \cnltxcode[breakable]%
+        \cnltx at pre@source at hook
+        \lstinputlisting{\jobname.tmp}%
+        \cnltx at after@source at hook
+        \ifbool{cnltx at float}{}{%
+          \tcblower
+          \cnltx at pre@example at hook
+          \input {\jobname.tmp}%
+          \cnltx at after@example at hook
+        }
+      }%
+    \endcnltxcode
+    \ifbool{cnltx at float}{%
+      \cnltx at float@start
+      \ifdefvoid\cnltx at float@caption{}{\caption{\cnltx at float@caption}}%
+      \expandafter\end\expandafter{\cnltx at float@type}%
+    }{}%
+  }
+
+\RequirePackage[
+  backend=biber,
+  style=cnltx,
+  sortlocale=en_US,
+  indexing=cite]{biblatex}
+\RequirePackage{csquotes,varioref}
+
+\defbibheading{bibliography}[\bibname]{\addsec{#1}}
+
+\RequirePackage[biblatex]{embrac}[2012/06/29]
+\ChangeEmph{[}[,.02em]{]}[.055em,-.08em]
+\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em]
+
+\NewDocumentCommand\noranges{sm}{%
+  \begin{bewareofthedog}
+    \IfBooleanTF{#1}{\pkg*}{\pkg}{#2} cannot be used together with
+    \keyis{ranges}{true}.
+  \end{bewareofthedog}
+}
+
+\RequirePackage{hyperref}
+
+% additional packages:
+\RequirePackage{longtable,array,booktabs,enumitem,amssymb}
+
+% ----------------------------------------------------------------------------
+\newrobustcmd*\pdfdisable[2]{%
+  \csdef{fnpct@@\cnltx at stripbs#1}##1{#2}%
+  \def#1##1{%
+    \csuse{fnpct_if_star_gobble:nTF}{##1}%
+      {\csuse{fnpct@@\cnltx at stripbs#1}}%
+      {\csuse{fnpct@@\cnltx at stripbs#1}{##1}}%
+  }%
+}
+
+\pdfstringdefDisableCommands{%
+  \pdfdisable\template{#1}%
+  \pdfdisable\property{#1}
+  \pdfdisable\cs{\string\\#1}%
+  \pdfdisable\cmd{\string\\#1}%
+  \pdfdisable\option{#1}%
+  \def\oarg#1{[<#1>]}%
+  \def\Oarg#1{[#1]}%
+  \def\marg#1{\{<#1>\}}%
+  \def\Marg#1{\{#1\}}%
+  \def\fnpct{fnpct}%
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+}
+% ----------------------------------------------------------------------------
+\fnpct at add@version{2012-05-22}{0.1}
+\fnpct at add@version{2012-05-23}{0.1a}
+\fnpct at add@version{2012-05-26}{0.2}
+\fnpct at add@version{2012-06-01}{0.2a}
+\fnpct at add@version{2012-06-07}{0.2b}
+\fnpct at add@version{2012-06-28}{0.2c}
+\fnpct at add@version{2012-07-07}{0.2d}
+\fnpct at add@version{2012-07-24}{0.2e}
+\fnpct at add@version{2012-08-27}{0.2f}
+\fnpct at add@version{2012-11-14}{0.2g}
+\fnpct at add@version{2013-01-18}{0.2h}
+\fnpct at add@version{2013-01-21}{0.2i}
+\fnpct at add@version{2013-02-22}{0.2j}
+\fnpct at add@version{2013-04-07}{0.2k}
+\fnpct at add@version{2013-04-16}{0.3}
+\fnpct at add@version{2013-06-14}{0.3a}
+\fnpct at add@version{2013-12-22}{0.4}
+\fnpct at add@version{2013-12-23}{0.4a}
+\fnpct at add@version{2014-03-10}{0.4b}
+\fnpct at add@version{2015-02-20}{0.4c}
+\fnpct at add@version{2015-04-23}{0.4d}
+\fnpct at add@version{2016-03-25}{0.4e}
+\fnpct at add@version{2019-02-17}{0.4f}
+\fnpct at add@version{2019-09-30}{0.4g}
+\fnpct at add@version{2019-10-05}{0.5}
+\fnpct at add@version{2020-01-12}{0.5a}
+\fnpct at add@version{2021-01-21}{1.0}
+
+\endinput


Property changes on: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.cls
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf	2021-01-23 22:17:41 UTC (rev 57504)
+++ trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf	2021-01-23 22:18:39 UTC (rev 57505)

Property changes on: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.tex	2021-01-23 22:18:39 UTC (rev 57505)
@@ -0,0 +1,615 @@
+% arara: pdflatex: { shell: on , interaction: nonstopmode }
+% !arara: biber
+% !arara: pdflatex
+% !arara: pdflatex
+% --------------------------------------------------------------------------
+% the FNPCT package
+% 
+%   footnote kerning
+% 
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web:    https://github.com/cgnieder/fnpct/
+% E-Mail: contact at mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012--2021 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.
+% --------------------------------------------------------------------------
+\documentclass{fnpct-manual}
+
+\setfnpct{
+  add-trailing-token = [0pt]:[-.05em]{colon} ,
+  after-comma-space = -0.1em ,
+  after-dot-space =  -0.1em ,
+  before-comma-space = -0.05em ,
+  before-dot-space =  -0.05em ,
+  before-footnote-space = 0.05em
+}
+
+\addbibresource{cnltx.bib}
+\addbibresource{\jobname.bib}
+\addbibresource{biblatex-examples.bib}
+\begin{filecontents*}{\jobname.bib}
+ at book{bringhurst04,
+  title     = {The Elements of Typographic Style},
+  author    = {Robert Bringhurst},
+  year      = {2004},
+  version   = {3.2},
+  isbn      = {978-0-88179-205-5},
+  publisher = {Hartley \&\ Marks, Canada}
+}
+\end{filecontents*}
+
+\AdaptNote\footcite{m}{#NOTE{#1}}
+
+\newname\bringhurst{Robert Bringhurst}
+\newname\lefloch{Bruno Le Floch}
+
+\setlength\parfillskip{0pt plus .8\textwidth}
+
+\begin{document}
+
+\section{Preface for those upgrading from version 0.x}
+
+\begin{bewareofthedog}
+  For those upgrading from versions~0 to version~1: a number of options have
+  been dropped or renamed. Please have a close look at your log file for
+  warnings.  Also, the way commands are adapted and hence the syntax of
+  \cs{AdaptNote} has changed completely. In many if not all cases leaving them
+  as they were will lead to errors. \par
+  The \cs*{mult...} variants are not defined by default anymore. They can be
+  retained through the load-time option \option{multiple} if needed.  Letting
+  the note commands behave as their \cs*{mult...} variants is not supported
+  any more. \par
+  \cs{innernote} is not provided anymore. Depending on user feedback I might
+  try to add it again to \fnpct. \par
+  Please read this manual carefully so you detect all changes. \par
+  \emph{I am sorry for the inconvenience but I am convinced that the new
+    syntax is more powerful and more flexible in the long run.}
+\end{bewareofthedog}
+
+\section{License}
+\license
+
+\section{What's it all about?}
+\subsection{Introduction}
+The purpose of this package is to offer kerning for footnote marks, \ie\ the
+superscripts. This is not appropriate for all superscripts.  Symbols must be
+handled differently than numbers.  And of course the amount depends on the
+chosen font.  \bringhurst\ says in \citetitle{bringhurst04}:
+
+\begin{cnltxquote}[\emph{\citetitle{bringhurst04}} \cite{bringhurst04}]
+  Superscripts frequently come at the ends of phrases or sentences.  If they
+  are high above the line, they can be kerned over a comma or period, but this
+  may endanger readability, especially if the text is set in a modest size.
+\end{cnltxquote}
+
+\fnpct\ can not make these decisions for you.  It sets some initial values for
+the comma and the full stop which looked good to me with the tested fonts.
+Additionally it kerns the superscripts away from words when it follows
+directly.  The amounts of the kerning can be changed using options.
+
+\fnpct\ also switches the order of the superscript and the following comma or
+full stop.  Additional punctuation marks can be added to the switching
+behavior and the amount of kerning can be set for each punctuation mark
+individually.  This behavior can also be turned off.
+
+\subsection{Basics}
+The \fnpct\ package basically does two things to footnotes:
+\begin{itemize}
+  \item if footnote marks are followed by a comma or a full stop\footnote{More
+    punctuation marks can be added through a package option.} the order of
+  footnote and punctuation mark is reversed
+\item and the kerning gets adjusted.
+\end{itemize}
+As a side effect a new method of creating multiple
+footnotes\multfootnote{like;this} is provided.
+
+In what way is the kerning adjusted?  After being placed behind the
+punctuation mark the footnote mark is moved a little bit back, namely by the
+amount specified with the option \option{after-punct-space}.  If the footnote
+mark follows a word \emph{without} being followed by a
+punctuation\footnote{Well, it does not necessarily have to follow a
+  \emph{word}.  The important point is \emph{not being followed} by a
+  punctuation mark.}, there (obviously) is no order switching and a little
+space is inserted before the footnote mark, namely the amount specified by the
+option \option{before-footnote-space}.
+
+Now, let's see some action:
+\begin{example}
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}, sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}.
+\end{example}
+
+To ensure that the kerning is set the right way the footnote \emph{must} be
+placed \emph{before} the full stop or the comma. \emph{The command can look
+  ahead but not look back}.  This means if you place the \cs{footnote} command
+after a full stop or a comma it is treated as if following a word, \ie\ a thin
+space is inserted: effectively the opposite of the desired behavior.  The
+effects are demonstrated in figure~\vref{fig:effects}.
+
+The order-switching can be prevented using the option \option{reverse} since
+not all countries and languages have the same typographic conventions.  In
+this case the full stop and the comma are moved a bit back, namely by the
+amount specified with the option \option{before-punct-space}.
+
+\begin{figure}
+  \centering
+  \begin{tabular}{>{\setfnpct{dont-mess-around}}ll}
+    \toprule
+      without \fnpct &
+      with \fnpct \\
+    \midrule
+      \strut\quad text.\footnotemark[1] &
+      \strut\quad text\footnotemark[1]. \\
+      \strut\quad text\footnotemark[1]. &
+      \setfnpct{reverse}\strut\quad text\footnotemark[1]. \\
+      \strut\quad text\footnotemark[1] &
+      \strut\quad text\footnotemark[1] \\
+    \bottomrule
+  \end{tabular}
+  \caption{The effect of \fnpct.}\label{fig:effects}
+\end{figure}
+
+\subsection{Temporarily disable (or enable) switching -- new syntax of the
+  \cs*{footnote} command}
+One maybe want to put some footnote marks \emph{before} the punctuation and
+some after, for example because the first one describes a single word but the
+second one a whole sentence.  For this purpose \fnpct\ adds a \sarg\ argument
+to \cs{footnote} and \cs{footnotemark}.  The complete new syntax now is as
+follows:
+\begin{commands}
+  \command{footnote}[\sarg\oarg{num>}\marg{footnote text}\meta{tpunct}]
+    new \sarg\ argument added.  \meta{tpunct} is the optional trailing
+    punctuation mark.
+  \command{footnotemark}[\sarg\oarg{num>}\meta{tpunct}]
+    new \sarg\ argument added.  \meta{tpunct} is the optional trailing
+    punctuation mark.
+\end{commands}
+The \sarg\ argument temporarily turns off the punctuation/footnote switching.
+In case you set \keyis{reverse}{true} the \sarg\ argument temporarily
+\emph{enables} the switching.
+
+\begin{example}
+  \begin{minipage}{.4\linewidth}
+    \noindent The three little pigs built their houses
+    out of straw\footnote*{not to be confused with hay},
+    sticks\footnote{or lumber according to some sources}
+    and bricks\footnote{probably fired clay bricks}.
+  \end{minipage}\hfil
+  \setfnpct{reverse}
+  \begin{minipage}{.4\linewidth}
+    \noindent The three little pigs built their houses
+    out of straw\footnote*{not to be confused with hay},
+    sticks\footnote{or lumber according to some sources}
+    and bricks\footnote{probably fired clay bricks}.
+  \end{minipage}
+\end{example}
+
+\section{Options}\label{sec:options}
+\begin{commands}
+  \command{setfnpct}[\marg{options}]
+    All available options are listed below. They are set with \cs{setfnpct}.
+    \default{Underlined} values are set if the option is used without value.
+\end{commands}
+\begin{options}
+  \keybool{dont-mess-around}\Default{false}
+    Switches of \fnpct's mechanism.
+  \keybool{reverse}\Default{false}
+    This option reverses the behavior of starred and un-starred footnotes.
+  \keybool{ranges}\Default{false}
+    Activates ranges for multiple footnotes.  This is not compatible with
+    \pkg{hyperref} and does not work for the marks of some packages.
+  \keylit{add-trailing-token}{\oarg{before}\meta{token}\oarg{after}\marg{name}}
+    Adds \meta{token} to \fnpct's mechanism and activates it. \meta{before}
+    sets the default value for the newly created option
+    \option{before-\meta{name}-space}. \meta{after} sets the default value for
+    the newly created option \option{after-\meta{name}-space}.
+    Instead of the option you can also use the command \cs*{AddPunctuation},
+    see section~\ref{sec:adapt}.
+  \keyval{activate-trailing-tokens}{tokenlist}\Default{.,}
+    Activates tokens that have been added with \option{add-trailing-token}.
+  \keyval{deactivate-trailing-tokens}{tokenlist}
+    Deactivates tokens that have been added with \option{add-trailing-token}.
+  \keyval{before-footnote-space}{dimension}\Default{.06em}
+    Sets the space that is inserted before a footnote that \emph{does not
+      follow a punctuation or other note} to \meta{dimension}.
+  \keyval{before-dot-space}{dimension}\Default{-.16em}
+    Sets the space that is inserted before a dot if the dot follows a footnote
+    mark to \meta{dimension}.
+  \keyval{before-comma-space}{dimension}\Default{-.16em}
+    Sets the space that is inserted before a comma if the dot follows a footnote
+    mark to \meta{dimension}.
+  \keyval{before-punct-space}{dimension}
+    Sets the space that is inserted before any punctuation mark known to
+    \fnpct\ if the punctuation mark follows a footnote mark to
+    \meta{dimension}.
+  \keyval{after-dot-space}{dimension}\Default{-.06em}
+    Sets the space that is inserted after a dot if the dot precedes a footnote
+    mark to \meta{dimension}.
+  \keyval{after-comma-space}{dimension}\Default{-.06em}
+    Sets the space that is inserted after a comma if the dot precedes a
+    footnote mark to \meta{dimension}.
+  \keyval{after-punct-space}{dimension}
+    Sets the space that is inserted after any punctuation mark known to
+    \fnpct\ if the punctuation mark precedes a footnote mark to
+    \meta{dimension}.
+  \keyval{mult-fn-delim}{code}\Default{\code{;}}
+    Sets the symbol that divides the seperate notes in the \cs*{mult...}
+    variants.
+  \keyval{separation-symbol}{value}\default{\code{,}}
+    Redefines \cs{multfootsep} to \meta{value}.  This symbol separates
+    multiple footnotes if \keyis{ranges}{false}.
+  \keyval{range-symbol}{value}\Default{\code{--}}
+    Redefines \cs{multfootrange} to \meta{value}.  This symbol separates
+    multiple footnotes if \keyis{ranges}{true}.
+  \keyval{print-separation}{code}\Default{\cs*{textsuperscript}\Marg{\cs*{multfootsep}}}
+    The actual code placed between multiple footnotes if \keyis{ranges}{false}.
+  \keyval{print-range}{code}\Default{\cs*{textsuperscript}\Marg{\cs*{multfootrange}}}
+    The actual code placed between multiple footnotes if \keyis{ranges}{true}.
+\end{options}
+
+% \subsection{Language Specific Settings}
+% Package \pkg{babel}'s~\cite{pkg:babel} French settings redefine
+% \cs*{@footnotemark}.  \fnpct\ resets this redefinition but sets the
+% \option{before-footnote-space} equal to a thin space (\code{.16667em}).
+
+% In case the automatic kerning doesn't work for whatever reason the spaces are
+% available as user commands as well:
+% \begin{commands}
+%   \command{kfp}
+%     Insert \option{after-dot-space} or (if \keyis{punct-after}{true})
+%     \option{before-dot-space}. 
+%   \command{kfc}
+%     Insert \option{after-comma-space} or (if \keyis{punct-after}{true})
+%     \option{before-comma-space}.
+% \end{commands}
+
+\section{Multiple footnotes}\label{sec:multiple}
+\subsection{Basics}
+Since multiple footnotes have to be treated differently\footnote{see these
+  footnotes}\footnote{for an example}, \fnpct\ recognizes if \cs*{footnote} is
+used multiple times in a row:
+
+\begin{example}
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}, sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}\footnote{or something else}.
+\end{example}
+
+\subsection{Ranges}
+Starting with a minimum number of three footnotes in a row \fnpct\ can also
+display the footnote marks as a range.
+\begin{example}
+  \setfnpct{ ranges = true }
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}, sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}%
+  \footnote{or something else}\footnote{what do I know}.
+\end{example}
+It is important to note that this has limits: ranges do not work well with
+\pkg{hyperref}.  For that reason \fnpct' disables ranges if it detects that
+\pkg{hyperref} has been loaded.  If you insist on using ranges together with
+\pkg{hyperref} use
+\begin{options}
+  \keybool{keep-ranges}\Default{false}
+    to enable them again.
+\end{options}
+
+\subsection{The delimiter and separator}
+Some packages or classes like the \KOMAScript\ classes define
+\cs{multfootsep}.  If it is not predefined it is defined by \fnpct:
+\begin{commands}
+  \command{multfootsep}\Default{,}
+    In its default definition this command simply expands to a comma.
+  \command{multfootrange}\Default{--}
+    In its default definition this command simply expands to an endash.
+\end{commands}
+This commands can be redefined to adapt to your needs. You can do this with
+\cs*{renewcommand} or by using these options:
+\begin{options}
+  \keyval{separation-symbol}{value}\default{\code{,}}
+    Redefines \cs{multfootsep} to \meta{value}.  This symbol separates
+    multiple footnotes if \keyis{ranges}{false}.
+  \keyval{range-symbol}{value}\Default{\code{--}}
+    Redefines \cs{multfootrange} to \meta{value}.  This symbol separates
+    multiple footnotes if \keyis{ranges}{true}.
+\end{options}
+Both symbols are placed inside \cs*{textsuperscript}. This can also be
+redefined if necessary:
+\begin{options}
+  \keyval{print-separation}{code}\Default{\cs*{textsuperscript}\Marg{\cs*{multfootsep}}}
+    The actual code placed between multiple footnotes if \keyis{ranges}{false}.
+  \keyval{print-range}{code}\Default{\cs*{textsuperscript}\Marg{\cs*{multfootrange}}}
+    The actual code placed between multiple footnotes if \keyis{ranges}{true}.
+\end{options}
+
+\subsection{\cs*{mult...} variants}
+
+\begin{bewareofthedog}
+  The commands presented in this section are defined to keep some backwards
+  compatibility to versions of \fnpct\ prior to v1.0.  In order to use them
+  you have to call the package with
+  \cs*{usepackage}\Oarg{multiple}\Marg{fnpct}.
+\end{bewareofthedog}
+In earlier versions of \fnpct\ detecting following footnotes was not as
+reliable as it is now.  For that reason it defined the following command:
+\begin{commands}
+  \command{multfootnote}[\sarg\Marg{\meta{list};\meta{of};\meta{footnotes}}\meta{tpunct}]
+    Different footnotes are separated with a semicolon.  The \sarg\ turns the
+    footnote/punctuation switching temporarily off.
+\end{commands}
+\begin{example}
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}, sticks\footnote{or lumber according to some sources}
+  and bricks\multfootnote{probably fired clay bricks;or something else}.
+\end{example}
+This command splits its content at every occurrence of \code{;} and creates a
+footnote for each.  This delimiter can be changed:
+\begin{options}
+  \keyval{mult-fn-delim}{code}\Default{;}
+    Sets the symbol that divides the seperate notes in the \cs*{mult...}
+    variants.
+\end{options}
+
+Since the semicolon might be part of the footnote text you might have some
+trouble.  Enclosing it in braces should work:
+\begin{example}
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}, sticks\footnote{or lumber according to some sources}
+  and bricks\multfootnote{probably fired clay bricks{;} or something else;what
+    do I know}.
+\end{example}
+
+\section{Extend \fnpct}
+\subsection{Additional punctuation marks}
+So if you want to extend the punctuation switching and kerning to other punctuation
+marks you can do something like this:
+\begin{sourcecode}
+  \setfnpct{ add-trailing-token = !{bang} }
+\end{sourcecode}
+\setfnpct{ add-trailing-token = !{bang} }
+After that the bang is recognized and footnotes switch position:
+\begin{example}
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}? Sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}!
+\end{example}
+
+New options have also been defined:
+\begin{example}
+  \setfnpct{ after-bang-space = .03em }
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}? Sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}!
+\end{example}
+
+And option \option{after-punct-space} is obeyed:
+\begin{example}
+  \setfnpct{ after-punct-space = 2pt }
+  The three little pigs built their houses out of straw\footnote{not to be
+    confused with hay}? Sticks\footnote{or lumber according to some sources}
+  and bricks\footnote{probably fired clay bricks}!
+\end{example}
+
+\begin{bewareofthedog}
+  Please note that you should not use \option{add-trailing-token} inside a
+  group. Ideally it is used in the document preamble only.  Using it inside of
+  a group can lead to unwanted side effects and should not be attempted.
+\end{bewareofthedog}
+
+\setfnpct{ deactivate-trailing-tokens = ! }
+
+\subsection{Make note commands known to \fnpct}\label{sec:adapt}
+If a package is not natively supported you can try and adapt commands
+yourself.  Before you do so please check section~\vref{sec:other:packages}.
+\begin{commands}
+  % \AdaptNote
+  \command{AdaptNote}[\Marg{\cs*{cs}}\marg{arguments}\oarg{counter name}\marg{code}] 
+    This redefines \cs*{cs}.  How the redefinition works is best demonstrated
+    with an example. See below for an example.  The arguments \meta{arguments}
+    are defined with the same syntax as \pkg{xparse}'s
+    \cs*{NewDocumentCommand}.  See the \pkg{xparse} manual~\cite{pkg:xparse}
+    for a complete description.  Within \meta{code} \code{\#NOTE} is replaced
+    with the original command.  If the optional argument is not used the
+    counter name \code{cs} for a note command \cs*{cs} is assumed.
+
+    In addition to the arguments specified in \meta{arguments} an optional
+    star as first argument is defined which reverses \fnpct's behavior.
+    \meta{code} is also placed inside a group.
+  % \AdaptNoteName
+  \command{AdaptNoteName}[\marg{csname}\marg{arguments}\oarg{counter name}\marg{code}]
+    Like \cs{AdaptNote} but the first argument expects a csname instead of a
+    command sequence token.
+  % \MultVariant
+  \command{MultVariant}[\Marg{\cs*{cs}}]
+    Defines a command \cs*{multcs} which splits is argument at each occurence
+    of the token set by the option \option{mult-fn-delim} and turns it into a
+    series of calls of \cs*{cs}.  \cs*{multcs} also has a starred variant in
+    order to create a series of starred calls of \cs*{cs}.
+  % \MultVariantName
+  \command{MultVariantName}[\marg{csname}]
+    Like \cs{MultVariant} but the argument expects a csname instead of a
+    command sequence token.
+  % \AddPunctuation
+  \command*{AddPunctuation}[\oarg{before}\meta{token}\oarg{after}\marg{name}]
+    Adds \meta{token} to \fnpct's mechanism and activates it. \meta{before}
+    sets the default value for the newly created option
+    \option{before-\meta{name}-space}. \meta{after} sets the default value for
+    the newly created option \option{after-\meta{name}-space}.  This is the
+    same as using option \option{add-trailing-token}.
+\end{commands}
+
+\fnpct\ adapts \LaTeX's standard footnote commands the following
+way\footnote{Using \cs*{@mpfn} as counter name is essential to make ranges
+  work in minipages.}:
+\begin{sourcecode}
+  \AdaptNote\footnote{o+m}[\@mpfn]{\IfNoValueTF{#1}{#NOTE{#2}}{#NOTE[#1]{#2}}}
+  \AdaptNote\footnotemark{o}{\IfNoValueTF{#1}{#NOTE}{#NOTE[#1]}}
+  \MultVariant\footnote
+  % KOMA-Script's or memoir's \footref:
+  \AdaptNote\footref{m}{#NOTE{#1}}
+\end{sourcecode}
+You essentially have to rebuild the syntax of the original command and place
+\code{\#NOTE} in the code where it should be called.  This may seem cumbersome
+at first but allows to adapt commands with a more or less arbitrary kind of
+syntax.
+
+The command \cs{AdaptNote} can be used multiple times on the same command in
+order to change a previous redefinition.
+
+\section{Other packages}\label{sec:other:packages}
+\fnpct\ tries its best to support other footnote and related
+packages\footnote{If you find some package missing please let me know.}.  Each
+of the following subsections is dedicated to one of these packages and if and
+how they work together with \fnpct.  Fortunately most of them do quite well.
+
+Most notably the \option{ranges} option cannot deal with some packages, often
+due to the lack of a suiting \cs*{...text} 
+
+\subsection{bigfoot}\label{sec:bigfoot}
+The package \pkg{bigfoot}~\cite{pkg:bigfoot} is supported.
+
+You need to be a bit cautious, though: \emph{verbatim material won't work
+  inside footnotes anymore}.  You might use \lefloch's \pkg{cprotect}
+package~\cite{pkg:cprotect} if you really need verbatim material in footnotes
+\emph{and} want to use \fnpct.  Since \fnpct\ does not redefine any
+\cs{footnotetext} like command it will still work inside one of them.
+
+\subsection{endnotes}\label{sec:endnotes}
+The package \pkg{endnotes}~\cite{pkg:endnotes} is supported.
+
+\subsection{enotez}\label{sec:enotez}
+The package \pkg{enotez}~\cite{pkg:enotez} is supported.
+
+\subsection{fixfoot}\label{sec:fixfoot}
+The \pkg{fixfoot}~\cite{pkg:fixfoot} package provides a possibility to create
+repeating footnotes.  \fnpct\ supports this package provided you take care of
+the following:
+
+\emph{Use \cs{DeclareFixedFootnote} only in the preamble but \emph{after}
+  loading \fnpct.}
+
+\cs*{DeclareFixedFootnote}\Marg{\cs*{cs}}\marg{footnote text} is used to store
+the \meta{footnote text} in \cs*{cs} which in turn creates a footnote mark for
+it but doesn't repeat the footnote text on the same page in the bottom.  The
+document needs several runs to get all the numbers and footnotes right.
+
+Every fixed footnote declared with \cs{DeclareFixedFootnote} gets an optional
+\sarg\ to prevent the punctuation switching.
+
+\noranges{fixfoot}
+
+\subsection{footmisc}\label{sec:footmisc}
+The \pkg{footmisc} package~\cite{pkg:footmisc} provides a range of options to
+customize footnotes, for example output them as margin notes or count
+footnotes per page.
+
+Testing showed no incompatibilities with \pkg{footmisc}.  The only thing is
+that you won't have to (and shouldn't) use its \option{multiple} option.
+
+\subsection{footnote}\label{sec:footnote}
+
+Testing showed no incompatibilities with \pkg{footnote}.  It cannot adapt its
+environment \env*{footnote}, though.
+
+\subsection{manyfoot}\label{sec:manyfoot}
+The package \pkg{manyfoot}~\cite{pkg:manyfoot} is supported.
+
+\subsection{pagenote}\label{sec:pagenote}
+The package \pkg{pagenote}~\cite{pkg:pagenote} is supported.
+
+\noranges{pagenote}
+
+\subsection{parnotes}\label{sec:parnotes}
+The package \pkg{parnotes}~\cite{pkg:parnotes} is supported.
+
+\noranges{parnotes}
+
+\subsection{sepfootnotes}\label{sec:sepfootnotes}
+The package \pkg{sepfootnotes}~\cite{pkg:sepfootnotes} is supported.  Define
+new footnote types \emph{after} \fnpct\ has been loaded.
+
+\subsection{sidenotes}\label{sec:sidenotes}
+\begin{bewareofthedog}
+  The package \pkg{sidenotes}~\cite{pkg:sidenotes} is \emph{not} supported!
+\end{bewareofthedog}
+\fnpct\ is not able to adapt \pkg{sidenotes}' commands due to the current
+implementation of \pkg{sidenotes}.
+
+\subsection{snotez}\label{sec:snotez}
+The package \pkg{snotes}~\cite{pkg:snotez} is supported.
+
+\subsection{tablefootnote}\label{sec:tablefootnote}
+The package \pkg{tablefootnote}~\cite{pkg:tablefootnote} is supported.
+
+\noranges{tablefootnote}
+
+\subsection{tufte-latex's \cs*{sidenote}}\label{sec:tufte}
+The \cs*{sidenote} command from the \pkg*{tufte-latex} classes
+\cls{tufte-book} and \cls{tufte-handout} is supported.
+
+\noranges*{tufte-latex}
+
+More precisely: the \cs*{sidenote} command from \pkg*{tufte-latex} does not
+work with \option{ranges}. But since \cs*{sidenote} is only a synonym for
+\cs*{footnote} for \pkg*{tufte-latex} you can use the latter.
+
+\subsection{biblatex's \cs*{footcite}}\label{sec:biblatex}
+If you're willing to sacrifice \cs*{footcite}'s \sarg\ argument (which it has
+in some styles) you can adapt the commands provided by
+\pkg{biblatex}~\cite{pkg:biblatex} as well:
+\begin{sourcecode}
+  \AdaptNote\footcite{oo+m}[footnote]{%
+    \setfnpct{dont-mess-around}%
+    \IfNoValueTF{#1}
+      {#NOTE{#3}}
+      {\IfNoValueTF{#2}{#NOTE[#1]{#3}}{#NOTE[#1][#2]{#3}}}%
+  }
+\end{sourcecode}
+You could use another token for the star, though, if needed:
+\begin{sourcecode}
+  \AdaptNote\footcite{t+oo+m}[footnote]{%
+    \setfnpct{dont-mess-around}%
+    \IfBooleanTF{#1}{%
+      \IfNoValueTF{#2}
+        {#NOTE{#4}}
+        {\IfNoValueTF{#3}{#NOTE[#2]{#4}}{#NOTE[#2][#3]{#4}}}%
+    }{%
+      \IfNoValueTF{#2}
+        {#NOTE*{#4}}
+        {\IfNoValueTF{#3}{#NOTE*[#2]{#4}}{#NOTE*[#2][#3]{#4}}}%
+  }
+\end{sourcecode}
+Testing showed no problems whatsoever but \fnpct\ does not adapt the command
+itself.
+
+\begin{bewareofthedog}
+  Turning \fnpct\ off inside of \cs*{footcite} is advised as shown in above
+  examples.  \cs*{footcite} calls \cs*{footnote} internally which else might
+  lead to inconsistent and unwanted spaces.
+\end{bewareofthedog}
+
+
+\appendix
+
+\printbibliography
+
+\end{document}
+TODO:
+- memoir, \mutfootsep
+- \thanks
+- French
+- nested notes and \AdaptText\footnotetext{om}{\IfNoValueTF{#1}{#NOTE{#2}}{#NOTE[#1]{#2}}}


Property changes on: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct-manual.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.pdf
===================================================================
(Binary files differ)

Deleted: trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.tex	2021-01-23 22:17:41 UTC (rev 57504)
+++ trunk/Master/texmf-dist/doc/latex/fnpct/fnpct_en.tex	2021-01-23 22:18:39 UTC (rev 57505)
@@ -1,1044 +0,0 @@
-% arara: pdflatex: { shell: on , interaction: nonstopmode }
-% !arara: biber
-% !arara: pdflatex
-% !arara: pdflatex
-% --------------------------------------------------------------------------
-% the FNPCT package
-% 
-%   footnote kerning
-% 
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/fnpct/
-% E-Mail: contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% Copyright 2012--2019 Clemens Niederberger
-% 
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% 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.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-% 
-% This work has the LPPL maintenance status `maintained'.
-% 
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% the package is inspired by the following question on TeX.SE:
-%   http://tex.stackexchange.com/q/56094/5049
-% --------------------------------------------------------------------------
-\documentclass[load-preamble+]{cnltx-doc}
-\usepackage{sepfootnotes,fnpct}
-\setcnltx{
-  package = fnpct ,
-  authors = Clemens Niederberger ,
-  email   = contact at mychemistry.eu ,
-  url     = https://bitbucket.org/cgnieder/fnpct/ ,
-  abstract = {
-      The \fnpct\ package basically does two things to footnotes: if footnote
-      marks are followed by a punctuation mark the order of footnote and
-      punctuation mark is reversed and the kerning gets adjusted.  As a side
-      effect a new method of creating multiple footnotes and some other
-      features are provided.%
-  },
-  add-cmds = {
-    AdaptNote,
-    AdaptNoteMark,
-    innernote,
-    kfc,
-    kfp,
-    multfootnote,
-    setfnpct,
-    writeinnernotes
-  } ,
-  add-silent-cmds = {
-    anote,
-    anotecontent,
-    arabic,
-    DeclareNewFootnote,
-    endnote,
-    footnoteB,
-    multendnote,
-    multfootcite,
-    multparnote,
-    multsidenote,
-    myfn,
-    newfootnotes,
-    parnote,
-    parnotes,
-    sidenote,
-    theendnotes,
-    thempfootnote,
-  },
-  makeindex-setup = {options={-s cnltx.ist},columns=3,columnsep=1em} ,
-  index-setup = {othercode=\footnotesize,level=\addsec}
-}
-
-\defbibheading{bibliography}[\bibname]{\addsec{#1}}
-
-\usepackage{array,booktabs}
-
-\setfnpct{multiple,add-punct-marks=:[0pt][-.05em]}
-
-\usepackage{endnotes}
-\usepackage{parnotes}
-
-\newfootnotes{a}
-
-\renewcommand\thempfootnote{\arabic{mpfootnote}}
-
-\addbibresource{\jobname.bib}
-\addbibresource{biblatex-examples.bib}
-\usepackage{filecontents}
-\begin{filecontents*}{\jobname.bib}
- at book{bringhurst04,
-  title     = {The Elements of Typographic Style},
-  author    = {Robert Bringhurst},
-  year      = {2004},
-  version   = {3.2},
-  isbn      = {978-0-88179-205-5},
-  publisher = {Hartley \&\ Marks, Canada}
-}
-\end{filecontents*}
-
-\AdaptNoteOpt\footcite\multfootcite
-
-\newname\bringhurst{Robert Bringhurst}
-\newname\lefloch{Bruno Le Floch}
-
-\begin{document}
-
-\section{License and Requirements}
-\license\
-
-\fnpct\ depends on the packages \bnd{l3kernel}~\cite{bnd:l3kernel},
-\pkg{xparse} and \pkg{l3keys2e} from the \bnd{l3packages}
-bundle~\cite{bnd:l3packages}, \pkg{scrlfile} from the \KOMAScript\
-bundle~\cite{bnd:koma-script}, and \pkg{translations}~\cite{pkg:translations}.
-
-\section{What's it all about?}
-\subsection{Introduction}
-The purpose of this package is to offer kerning for footnote marks, \ie\ the
-superscripts. This is not appropriate for all superscripts.  Symbols must be
-handled differently than numbers.  And of course the amount depends on the
-chosen font.  \bringhurst\ says in \citetitle{bringhurst04}:
-
-\begin{cnltxquote}[\emph{\citetitle{bringhurst04}} \cite{bringhurst04}]
-  Superscripts frequently come at the ends of phrases or sentences.  If they
-  are high above the line, they can be kerned over a comma or period, but this
-  may endanger readability, especially if the text is set in a modest size.
-\end{cnltxquote}
-
-\fnpct\ can not make these decisions for you.  It sets some initial values for
-the comma and the full stop which looked good to me with the tested fonts.
-Additionally it kerns the superscripts away from words when it follows
-directly.  The amounts of the kerning can be changed using an option.
-
-As a side effect \fnpct\ switches the order of the superscript and the
-following comma or full stop.  Additional punctuation marks can be added to
-the switching behaviour and the amount of kerning can be set for each
-punctuation mark individually.
-
-\subsection{Basics}
-The \fnpct\ package basically does two things to footnotes: if footnote marks
-are followed by a comma or a full stop\footnote{More punctuation marks can be
-  added through a package option.} the order of footnote and punctuation mark
-is reversed and the kerning gets adjusted.  As a side effect a new method of
-creating multiple footnotes\footnote{like;this} is provided, see
-section~\ref{sec:multiple} for details.
-
-In what way is the kerning adjusted?  After being placed behind the
-punctuation mark the footnote mark is moved a little bit back, namely by the
-amount specified with the option \option{after-punct-space} (see
-section~\ref{sec:options}).  If the footnote mark follows a word
-\emph{without} being followed by a punctuation\footnote{Well, it does not
-  necessarily have to follow a \emph{word}.  The important point is \emph{not
-    being followed} by a punctuation mark.}, there (obviously) is no order
-switching and a little space is inserted before the footnote mark, namely the
-amount specified by the option \option{before-footnote-space} (see
-section~\ref{sec:options}).
-
-\begin{sourcecode}
-  \renewcommand\thempfootnote{\arabic{mpfootnote}}
-\end{sourcecode}
-
-Now, let's see some action:
-\begin{example}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}.
-  \end{minipage}
-\end{example}
-
-To ensure that the kerning is set the right way the footnote \emph{must} be
-placed \emph{before} the full stop or the comma. \emph{The command can look
-  ahead but not look back}.  This means if you place the \cs{footnote} command
-after a full stop or a comma it is treated as if following a word, \ie\ a thin
-space is inserted: effectively the opposite of the desired behaviour.
-
-The order-switching can be prevented using a package option since not all
-countries and languages have the same typographic conventions. In this case
-the full stop and the comma are moved a bit back.
-
-\begin{figure}[ht]
-  \centering
-  \begin{tabular}{>{\setfnpct{dont-mess-around}}ll}
-    \toprule
-      without \fnpct &
-      with \fnpct \\
-    \midrule
-      \strut\quad text.\footnotemark[1] &
-      \strut\quad text\footnotemark[1]. \\
-      \strut\quad text\footnotemark[1]. &
-      \setfnpct{punct-after}\strut\quad text\footnotemark[1]. \\
-      \strut\quad text\footnotemark[1] &
-      \strut\quad text\footnotemark[1] \\
-    \bottomrule
-  \end{tabular}
-  \caption{The effect of \fnpct.}
-\end{figure}
-
-\begin{options}
-  \keybool{punct-after}\Default{false}
-    When \code{true} the punctuation sign will be placed \emph{after} the
-    footnote.
-\end{options}
-Like all options it can also be set using the setup command.
-\begin{commands}
-  \command{setfnpct}[\marg{options}]
-    Set up options.  Can be used anywhere in the document.  Some options can
-    only be set in the preamble, though.
-\end{commands}
-\begin{example}
-  \setfnpct{punct-after}
-    \begin{minipage}{\linewidth}
-    \noindent The three little pigs built
-    their houses out of straw\footnote{not
-      to be confused with hay},  sticks%
-    \footnote{or lumber according to some
-      sources} and bricks\footnote{probably
-      fired clay bricks}.
-  \end{minipage}
-\end{example}
-
-\subsection{Temporarily disable or enable switching}
-One maybe want to put some footnote marks \emph{before} the punctuation and
-some after, for example because the first one describes a single word but the
-second one a whole sentence.  For this purpose \fnpct\ adds a \sarg\ argument
-to \cs{footnote} and \cs{footnotemark}.  The complete new syntax now is as
-follows:
-\begin{commands}
-  \command{footnote}[\sarg\oarg{num>}\marg{footnote text}\meta{tpunct}]
-    new \sarg\ argument added.  \meta{tpunct} is the optional trailing
-    punctuation mark.
-  \command{footnotemark}[\sarg\oarg{num>}\meta{tpunct}]
-    new \sarg\ argument added.  \meta{tpunct} is the optional trailing
-    punctuation mark.
-\end{commands}
-The \sarg\ argument temporarily turns off the punctuation/footnote switching.
-In case you set \keyis{punct-after}{true} the \sarg\ argument temporarily
-\emph{enables} the switching.
-\begin{example}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote*{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}.
-  \end{minipage}\hfil
-  \setfnpct{punct-after}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote*{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}.
-  \end{minipage}
-\end{example}
-
-\subsection{Language Specific Settings}
-Package \pkg{babel}'s~\cite{pkg:babel} French settings redefine
-\cs*{@footnotemark}.  \fnpct\ resets this redefinition but sets the
-\option{before-footnote-space} equal to a thin space (\code{.16667em}).
-
-\subsection{Changes in v0.5}\label{ssec:news}
-
-\begin{itemize}
-  \item the option \option{bigfoot-default-top} has been removed
-  \item the \pkg{manyfoot} package is now supported
-\end{itemize}
-
-\section{Options}\label{sec:options}
-Most package options are listed below.  They all can be set as a package
-option or with the \cs{setfnpct} command.  Most of them are for adjusting the
-kerning.
-
-\default{Underlined} values are set if the option is used without value.
-\begin{options}
-  \keychoice{add-punct-marks}{\meta{mark}\oarg{space after}\oarg{space before}}
-    Add another punctuation mark for the position switching and spacify
-    kerning if necessary.  An existing entry will be overwritten.  This option
-    accepts a list of marks.
-  %
-  \keyval{remove-punct-marks}{mark}
-    Remove punctuation mark from the kerning/position switching behaviour.
-    This option accepts a list of marks.
-  %
-  \keyval{after-dot-space}{dim}\Default{-.06em}
-    Space to be inserted after a footnote mark and before the full stop
-    (``footnote \emph{after} dot'').  A negative space will move the full stop
-    further to the footnote mark.
-  %
-  \keyval{after-comma-space}{dim}\Default{-.06em}
-    Space to be inserted after a footnote mark and before the comma
-    (``footnote \emph{after} comma'').  A negative space will move the comma
-    further to the footnote mark.
-  %
-  \keyval{after-punct-space}{dim}
-    Set \emph{all} spaces, \ie\ also the ones for marks you've added with
-    \option{add-punct-marks}.
-  %
-  \keybool{punct-after}\Default{false}
-    When \code{true} the punctuation sign will be placed \emph{after} the
-    footnote.
-  %
-  \keyval{before-dot-space}{dim}\Default{-.16em}
-    Space to be inserted after a footnote mark and before the full stop
-    (``footnote \emph{before} dot''), \ie\ with \keyis{punct-after}{true}.
-  %
-  \keyval{before-comma-space}{dim}\Default{-.16em}
-    space to be inserted after a footnote mark and before the comma
-    (``footnote \emph{before} comma''), \ie\ with \keyis{punct-after}{true}.
-  %
-  \keyval{before-punct-space}{dim}
-    Set \emph{all} spaces, \ie\ also the ones for marks you've added with
-    \option{add-punct-marks}.
-  %
-  \keyval{before-footnote-space}{dim}\Default{.06em}
-    Space to be inserted between a word and the following footnote mark.
-  %
-  \keybool{dont-mess-around}\Default{false}
-    Sets all mentioned lengths to \code{0pt} and \keyis{punct-after}{true}.
-    Basically this should look like as if you hadn't loaded \fnpct\ except the
-    multiple footnote commands and \cs{innernote} are still available, see
-    sections~\ref{sec:multiple} and~\ref{sec:nested}, respectively.
-  %
-  \keybool{multiple}\Default{false}
-    Lets \cs{footnote} be equal to \cs{multfootnote}.
-  %
-  \keyval{mult-fn-delim}{delimiter}\Default{;}
-    Sets the delimiter for the \cs{multfootnote} command.
-  %
-  \keyval{mult-fn-sep}{separator}\Default{,}
-    Sets the separator between multiple footnote marks.
-  %
-  \keybool{normal-marks}\Default{false}\label{opt:normal-marks}
-    Sets the footnote marks in the foot not as superscripts but as normal
-    font.  If you're not using a \KOMAScript\ class this option will load
-    the package \pkg{scrextend}.  See section~\ref{sec:normal} for more
-    information.  \emph{This option can only be set in the preamble}.
-\end{options}
-
-So if you want to extend the punctuation switching and kerning to other punctuation
-marks you can do something like this:
-\begin{example}
-  \setfnpct{add-punct-marks=!?}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay}?
-    Sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}!
-  \end{minipage}
-\end{example}
-
-Or with some additional spacing:
-\begin{example}
-  \setfnpct{add-punct-marks=![.03em]?[.03em]}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay}?
-    Sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}!
-  \end{minipage}
-\end{example}
-
-Let's take a look at an example with some ridiculous settings:
-\begin{example}
-  % some ridiculous settings:
-  \setfnpct{after-punct-space=2pt,before-footnote-space=2pt}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}.
-  \end{minipage}
-\end{example}
-
-And now the same with switched order:
-\begin{example}
-  % some ridiculous settings:
-  \setfnpct{punct-after,before-punct-space=2pt,before-footnote-space=2pt}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}.
-  \end{minipage}
-\end{example}
-
-In case the automatic kerning doesn't work for whatever reason the spaces are
-available as user commands as well:
-\begin{commands}
-  \command{kfp}
-    Insert \option{after-dot-space} or (if \keyis{punct-after}{true})
-    \option{before-dot-space}. 
-  \command{kfc}
-    Insert \option{after-comma-space} or (if \keyis{punct-after}{true})
-    \option{before-comma-space}.
-\end{commands}
-
-Some of the options are explained in a bit more detail in the next sections.
-
-\section{Multiple footnotes}\label{sec:multiple}
-\subsection{Basics}
-Since multiple footnotes have to be treated differently\footnote{see these
-  footnotes;for an example}, \fnpct\ provides an extra command for that:
-\begin{commands}
-  \command{multfootnote}[\sarg\Marg{\meta{list};\meta{of};\meta{footnotes}}\meta{tpunct}]
-    Different footnotes are separated with a semicolon.  The \sarg\ turns the
-    footnote/punctuation switching temporarily off.
-\end{commands}
-\begin{example}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\multfootnote{probably fired clay bricks;or
-    something else}.
-  \end{minipage}
-\end{example}
-
-Every of the items of the list has an optional argument equivalent to the
-optional argument of \cs{footnotetext}:
-\begin{commands}
-  \command{multfootnote}[\Marg{\sarg\oarg{mark}\meta{footnote text};\ldots}]
-    The syntax of \cs{multfootnote}'s footnote text argument.
-\end{commands}
-\begin{example}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\multfootnote{probably fired clay bricks;[5]or
-    something else}.
-  \end{minipage}
-\end{example}
-
-Additionally every item has an optional \sarg\ which only invokes
-\cs{footnotetext}.  This enables for example to set nested footnotes without
-disrupting the multiple setting.  The following example is shown in
-figure~\ref{fig:nested:mult}:
-\begin{example}[compile,float,caption={Nested footnotes.\label{fig:nested:mult}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-  
-  \usepackage{fnpct}
-  
-  \begin{document}
-  \noindent The three little pigs built their houses
-  out of straw\footnote{not to be confused with hay},
-  sticks\footnote{or lumber according to some sources}
-  and bricks\multfootnote{probably fired clay bricks%
-  \footnotemark;*or something else;what do I know}.
-  \end{document}
-\end{example}
-
-\subsection{The delimiter and separator}
-Since the semicolon might be part of the footnote text you might have some
-trouble.  But there are ways around. Maybe try enclosing it in braces:
-\begin{example}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\multfootnote{probably fired clay bricks{;}
-    or something else;what do I know}.
-  \end{minipage}
-\end{example}
-
-There also are options which lets you choose the (input) delimiter and the (output)
-separator:
-\begin{options}
-  \keyval{mult-fn-delim}{delimiter}\Default{;}
-    Choose delimiter for the \cs{multfootnote}.
-  \keyval{mult-fn-sep}{separator}\Default{,}
-    Choose the separator that is put between footnote marks.
-\end{options}
-\begin{example}
-  \setfnpct{mult-fn-delim=//,mult-fn-sep=;}
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\multfootnote{probably fired clay bricks;
-    or something else//what do I know}.
-  \end{minipage}\hfil
-  \setfnpct{mult-fn-delim=;,mult-fn-sep=}
-  \renewcommand*\thempfootnote{\fnsymbol{mpfootnote}}
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\multfootnote{probably fired clay bricks;
-    or something else}.
-  \end{minipage}
-\end{example}
-
-\subsection{Automagic}
-If you want you can turn all footnotes into \cs{multfootnote}s.
-\begin{options}
-  \keybool{multiple}\Default{false}
-    Let \cs{footnote} behave like \cs{multfootnote}.  \emph{This option can
-      only be set in the preamble}.
-\end{options}
-\begin{example}
-  % in preamble: \setfnpct{multiple}
-  % or \usepackage[multiple]{fnpct}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks;or
-      something else}.
-  \end{minipage}
-\end{example}
-
-\section{Nested Footnotes}\label{sec:nested}
-\fnpct\ provides preliminary support for nested footnotes.  There are some
-restrictions, though.  The command below can be used inside \cs{footnote} and
-\cs{multfootnote}, but not inside another \cs{innernote}.  \cs{innernote}
-really is a ``inner footnote'', it doesn't work with endnotes, for example.
-\begin{commands}
-  \command{innernote}[\sarg\oarg{mark}\marg{text}\meta{tpunct}]
-    A nested footnote.
-\end{commands}
-The inner node uses a \cs{footnotemark} internally and the mark will be set
-with the definition it has at begin document.
-
-The output of the following code can be seen in figure~\ref{fig:nested:a}.
-\begin{example}[compile,float,caption={\cs*{innernote} example (a)\label{fig:nested:a}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-  
-  \usepackage{fnpct}
-  
-  \begin{document}
-  \noindent The three little pigs built their houses
-  out of straw\footnote{not to be confused with hay},
-  sticks\footnote{or lumber according to some sources}
-  and bricks\footnote{probably fired clay bricks%
-    \innernote{or not}}.
-  \end{document}
-\end{example}
-
-This is especially useful if you have more than one additional footnote inside
-a footnote, a case that can't be solved in a satisfying (\ie\ automatic) way
-with the method mentioned in section~\ref{sec:multiple}.  See
-figure~\ref{fig:nested:b} for the output of this code:
-\begin{example}[compile,float,caption={\cs*{innernote} example (b)\label{fig:nested:b}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-  
-  \usepackage{fnpct}
-  
-  \begin{document}
-  \noindent The three little pigs built their houses
-  out of straw\footnote{not to be confused with hay},
-  sticks\footnote{or lumber according to some sources}
-  and bricks\footnote{probably\innernote{just guessing}
-    fired clay bricks\innernote{or not}}.
-  \end{document}
-\end{example}
-
-\cs{innernote} can also be used to escape minipages.  In this case use
-\cs{innernote} as a replacement for \cs{footnote} and call this command later:
-\begin{commands}
-  \command{writeinnernotes}
-    Writes all \cs{footnotetext}s to the inner footnotes when invoked.  This
-    is usually done automatically by the \cs{footnote} command but there are
-    possible needs for it.
-\end{commands}
-See figure~\ref{fig:nested:c} for the output of the following code:
-\begin{example}[compile,float,caption={\cs*{innernote} example (c)\label{fig:nested:c}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-
-  \usepackage{fnpct}
-
-  \begin{document}
-  \noindent\fbox{%
-  \begin{minipage}{.9\linewidth}
-     The three little pigs built their houses
-     out of straw\innernote{not to be confused with hay},
-     sticks\innernote{or lumber according to some sources}
-     and bricks\innernote{probably}.
-  \end{minipage}}\writeinnernotes
-  \end{document}
-\end{example}
-
-\section{Normal notes}\label{sec:normal}
-The package option \option{normal-marks} (see p.\,\pageref{opt:normal-marks})
-changes the layout of the footnote marks in the foot by using \KOMAScript's
-\cs{deffootnote} command:
-\begin{commands}
-  \command{deffootnote}[\oarg{mark indent}\marg{indent}\marg{par
-    indent}\marg{format code}]
-    \KOMAScript's command to define the output of the footnote text in the
-    foot.
-\end{commands}
-
-The following code is shown in figure~\ref{fig:normal}.
-\begin{example}[compile,float,caption={Demonstration of the
-    \option*{normal-marks} option.\label{fig:normal}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-  
-  \usepackage[normal-marks]{fnpct}
-  
-  \begin{document}
-  
-  \noindent The three little pigs built their houses
-  out of straw\footnote{not to be confused with hay},
-  sticks\footnote{or lumber according to some sources}
-  and bricks\footnote{probably fired clay bricks}.
-  
-  \end{document}
-\end{example}
-
-The three indent values used by \fnpct\ can be changed with the following
-options:
-\begin{options}
-  \keyval{normal-mark-width}{dim}\Default{1em}
-    The width of the box within which the marks are set.
-  \keyval{normal-indent}{dim}\Default{1.5em}
-    The indent of each footnote line \emph{except} the first.
-  \keyval{normal-par-indent}{dim}\Default{1em}
-    Additional indent of a new paragraph inside the footnote text.
-\end{options}
-
-\section{Other packages}\label{sec:other:packages}
-\fnpct\ tries its best to support other footnote and related
-packages\footnote{If you find some package missing please let me know.}.  Each
-of the following subsections is dedicated to one of these packages and if and
-how they work together with \fnpct.  Fortunately most of them do quite well.
-
-\subsection{bigfoot and manyfoot}\label{ssec:bigfoot}
-The \pkg{bigfoot}~\cite{pkg:bigfoot} package extends the possibilities of the
-\pkg{manyfoot} package~\cite{pkg:manyfoot} (see section~\ref{ssec:manyfoot}).
-The main visible feature is to use different classes of footnotes which are
-typeset in different apparatus on the bottom of the page.
-
-\fnpct\ is compatible with \pkg{bigfoot}.
-
-You need to be a bit cautious, though: \emph{verbatim material won't work
-  inside footnotes anymore}.  You can of course use \lefloch's
-\pkg{cprotect}~\cite{pkg:cprotect} if you really need verbatim material in
-footnotes \emph{and} want to use \fnpct.  Since \fnpct\ does not redefine any
-\cs{footnotetext} like command it will still work inside one of them.
-
-For every footnote class defined with \cs*{DeclareNewFootnote} the commands
-\cs*{footnote\meta{class}} and \cs*{footnotemark\meta{class}} are redefined
-with the starred variant and a \cs*{multfootnote\meta{class}} is defined. The
-\option{multiple} option will turn all \cs*{footnote\meta{class}} commands
-into the corresponding \cs*{multfootnote\meta{class}}.
-
-Since this document cannot easily combine \emph{every} footnote package at the
-same time for demonstration purposes the following code is shown in
-figure~\ref{fig:bigfoot}:
-\begin{example}[compile,float,caption={\pkg*{bigfoot} example\label{fig:bigfoot}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.5\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-  
-  \usepackage{bigfoot}
-  \usepackage{fnpct}
-  \setfnpct{multiple}
-  \DeclareNewFootnote{default}
-  \DeclareNewFootnote[para]{B}[alph]
-  
-  \begin{document}
-  
-  \noindent The three little pigs built their houses
-  out of straw\footnote*{not to be confused with hay%
-  \footnoteB{let alone grass}}, sticks\footnote{or
-    lumber according to some sources} and bricks%
-  \footnote{probably fired clay bricks;or something}.
-  
-  \end{document}
-\end{example}
-
-\subsection{endnotes}
-The \pkg{endnotes}~\cite{pkg:endnotes} package povides the commands
-\cs{endnote} and \cs{endnotemark} which can be used to output all notes at the
-end of a chapter, say.
-
-If the package is loaded both commands are adapted\footnote*{see
-  section~\ref{sec:adapt} on manual adaption}:
-\begin{sourcecode}
-  % `fnpct' does this for you:
-  \AdaptNote\endnote\multendnote
-  \AdaptNoteMark\endnotemark
-\end{sourcecode}
-
-Everything else stays the same:
-\begin{example}
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\endnote{not to be confused with hay},
-    sticks\endnote{or lumber according to some sources}
-    and bricks\endnote{probably fired clay bricks}.
-  
-    \theendnotes
-  \end{minipage}\hfil
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\endnote*{not to be confused with hay},
-    sticks\endnote{or lumber according to some sources}
-    and bricks\multendnote{probably fired clay bricks;or
-    something else}.
-    
-    \theendnotes
-  \end{minipage}
-\end{example}
-
-\subsection{enotez}
-The \pkg{enotez}~\cite{pkg:enotez} package povides the command \cs{endnote}
-which can be used to output all notes at the end of a chapter, say.
-
-If the package is loaded the command is adapted\footnote*{see
-  section~\ref{sec:adapt} on manual adaption}:
-\begin{sourcecode}
-  % `fnpct' does this for you:
-  \AdaptNote\endnote\multendnote
-\end{sourcecode}
-
-\subsection{fixfoot}
-The \pkg{fixfoot}~\cite{pkg:fixfoot} package provides a possibility to create
-repeating footnotes.  \fnpct\ supports this package provided you take care of
-the following:
-
-\emph{Use \cs{DeclareFixedFootnote} only in the preamble but \emph{after}
-  loading \fnpct.}
-
-\cs*{DeclareFixedFootnote}\Marg{\cs*{cs}}\marg{footnote text} is used to store
-the \meta{footnote text} in \cs*{cs} which in turn creates a footnote mark for
-it but doesn't repeat the footnote text on the same page in the bottom.  The
-document needs several runs to get all the numbers and footnotes right.
-
-Every fixed footnote declared with \cs{DeclareFixedFootnote} gets an optional
-\sarg\ to prevent the punctuation switching.  \emph{There is \emph{no}
-  mult-variant of the fixed notes!}
-
-Since this document cannot easily combine \emph{every} footnote package at the
-same time for demonstration purposes the following code is shown in
-figure~\ref{fig:fixfoot}:
-\begin{example}[compile,float,caption={\pkg*{fixfoot}
-    example\label{fig:fixfoot}}]
-  \documentclass{article}
-  \usepackage[
-    paperwidth=.55\textwidth,
-    paperheight=12\baselineskip,
-    margin=5pt,
-    bottom=1.5cm]{geometry}
-    
-  \usepackage{fixfoot}
-  \usepackage{fnpct}
-  
-  \DeclareFixedFootnote{\myfn}{I'm confused: what do I want to say?}
-  
-  \begin{document}
-  
-  \noindent The three little pigs\myfn\ built their houses
-  out of straw\myfn*, sticks\footnote{or lumber according
-  to some sources} and bricks\footnote{probably fired clay
-    bricks}.
-  
-  \end{document}
-\end{example}
-
-\subsection{footmisc}\label{ssec:footmisc}
-The \pkg{footmisc} package~\cite{pkg:footmisc} provides a range of options to
-customize footnotes, for example output them as margin notes or count
-footnotes per page.
-
-Testing showed no incompatibilities with \pkg{footmisc}.  The only thing is
-that you won't have to (and shouldn't) use its \option{multiple} option.
-
-\subsection{footnote}\label{ssec:footnote}
-Unfortunately \fnpct\ is not compatible with the \pkg{footnote}
-package~\cite{pkg:footnote}.  Or more precisely it is not compatible if the
-command pair \cs*{savenotes}/\cs*{spewnotes} is invoked.  This disables
-\pkg{footnote}'s environments as well as its environment escaping mechanism
-through \cs{makesavenoteenv}.
-
-\subsection{manyfoot}\label{ssec:manyfoot}
-The package \pkg{manyfoot}~\cite{pkg:manyfoot} is supported.  See
-section~\ref{ssec:bigfoot} for more details.
-
-\subsection{pagenote}\label{ssec:pagenote}
-The package \pkg{pagenote}~\cite{pkg:pagenote} is supported and its
-\cs*{pagenote} command is treated the same way as all other note commands: it
-got an optional \sarg\ argument and an additional \cs*{multpagenote} is
-defined.
-
-\subsection{parnotes}\label{ssec:parnotes}
-The function of the package \pkg{parnotes}~\cite{pkg:parnotes} is similar to the
-\pkg{endnotes} package.  basically it allows to output the footnote text after
-a paragraph, either by using a special environment or by invoking
-\cs*{parnotes}.
-
-If \pkg{parnotes} is loaded \fnpct\ extends its functionality analogous to the
-one of \pkg{endnotes}.
-
-Again the \option{multiple} option turns all \cs*{parnote}s into
-\cs*{multparnote}s.
-\begin{example}
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\parnote{not to be confused with hay},
-    sticks\parnote{or lumber according to some sources}
-    and bricks\parnote{probably fired clay bricks}.
-    
-    \parnotes
-  \end{minipage}\hfil
-  \begin{minipage}[t]{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\parnote*{not to be confused with hay},
-    sticks\parnote{or lumber according to some sources}
-    and bricks\multparnote{probably fired clay bricks;or
-      something else}.
-    
-    \parnotes
-  \end{minipage}
-\end{example}
-
-\subsection{sepfootnotes}\label{ssec:sepfootnotes}
-\fnpct\ supports the \pkg{sepfootnotes} package~\cite{pkg:sepfootnotes}.  Each
-note type you have created with with one of the commands
-\begin{description}
-  \item \cs*{newfootnotes}\marg{prefix},
-  \item \cs*{newendnotes}\marg{prefix} or
-  \item \cs*{newsymbolfootnotes}\marg{prefix}
-\end{description}
-gets the additional optional \sarg\ to prevent punctuation switching.  Also
-the corresponding mult-variant \cs*{\meta{prefix}multnote} is defined.  The
-option \option{multiple} again turns all note commands into their
-mult-variant.
-
-You have to use the \cs*{newfootnotes} commands in the document preamble after
-loading \fnpct.
-
-\begin{example}
-  % preamble \newfootnotes{a}
-  \anotecontent{first}{not to be confused with hay}
-  \anotecontent{second}{or lumber according to some sources}
-  \anotecontent{third}{probably fired clay bricks}
-  \begin{minipage}{.4\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\anote{first}, sticks\anote{second} and
-    bricks\anote{third}.
-  \end{minipage}
-\end{example}
-
-\subsection{sidenotes}\label{ssec:sidenotes}
-The package \pkg{sidenotes}~\cite{pkg:sidenotes} is \emph{not} supported.
-For the time being users can use the following code\footnote{Since the code
-  depends on the implementation of \pkg{sidenotes} this may break with each
-  update of \pkg{sidenotes}.;Thanks to Marijn van Vliet for
-  providing it!}:
-\begin{sourcecode}
-  \ExplSyntaxOn
-  \makeatletter
-  \NewDocumentCommand \origsidenotemark {o}
-    {
-      \@sidenotes at multichecker
-      \IfNoValueOrEmptyTF {#1}
-        { \@sidenotes at thesidenotemark { \thesidenote } }
-        { \@sidenotes at thesidenotemark {#1} }
-      \@sidenotes at multimarker
-    }
-
-  \NewDocumentCommand \origsidenote {oo+m}
-    {
-      \origsidenotemark [#1]
-      \sidenotetext [#1] [#2] {#3}
-      \@sidenotes at multimarker
-    }
-
-  \fnpct_create_mult_variant:NN \multsidenote \origsidenote
-
-  \RenewDocumentCommand \sidenote {soo+m}
-    { \fnpct_handle_note:Nnnnn \origsidenote {#2} {#3} {#4} {#1} }
-
-  \RenewDocumentCommand \sidenotemark {so}
-    { \fnpct_handle_note:Nnnnn \origsidenotemark {#2} { \q_no_value } { } {#1} }
-  \makeatother
-  \ExplSyntaxOff
-\end{sourcecode}
-
-\subsection{snotez}\label{ssec:snotez}
-The package \pkg{snotez}~\cite{pkg:snotez} is supported and its commands
-\cs*{sidenote} and \cs*{sidenotemark} are treated the same way as footnotes:
-they got an optional \sarg\ argument and the additional \cs*{multsidenote} is
-created.  The option \option{multiple} turns all note commands into their
-mult-variant.
-
-\subsection{tablefootnote}\label{ssec:tablefootnote}
-The package \pkg{tablefootnote}~\cite{pkg:tablefootnote} is supported and its
-\cs*{tablefootnote} command is treated the same way as all other note
-commands: it got an optional \sarg\ argument and an additional
-\cs*{multtablefootnote} is defined.  The option \option{multiple} turns all
-note commands into their mult-variant.
-
-\subsection{yafoot}\label{ssec:yafoot}
-Currently no issues are known when using \fnpct\ with one or all of the
-packages of the \bnd{yafoot}~\cite{bnd:yafoot} bundle.  Just for reference:
-these packages are \pkg*{pfnote}, \pkg*{fnpos} and \pkg*{dblfnote}.
-
-\section{Adapting note commands}\label{sec:adapt}
-If a package is not natively supported you can try and adapt commands yourself.
-You'll need to use one of the following commands. Please be aware that if the
-adapted command does not match the required syntax it will get the required syntax
-afterwards. This can result in dummy arguments or an overwritten \code{*} argument.
-
-\begin{commands}
-  % \AdaptNote
-  \command{AdaptNote}[\Marg{\cs*{cs}}\Marg{\cs*{multcs}}]
-    This lets \cs*{cs}  adapt to the kerning behaviour and adds an optional
-    \sarg.  It also creates a corresponding mult-variant.  The package option
-    \option{multiple} will now turn \cs*{cs} into its mult-variant.  Required
-    syntax: \cs*{cs}\oarg{oarg}\marg{marg}
-  % \AdaptNoteNoMult
-  \command{AdaptNoteNoMult}[\Marg{\cs*{cs}}]
-    Like \cs{AdaptNote} but doesn't create a mult-variant and thus there is no
-    change in behaviour when the option \option{multiple} is used.  Required
-    syntax: \cs*{cs}\oarg{oarg}\marg{marg}
-  % \AdaptNoteOpt
-  \command{AdaptNoteOpt}[\Marg{\cs*{cs}}\Marg{\cs*{multcs}}]
-    This lets \cs*{cs} adapt to the kerning behaviour and adds an optional
-    \sarg.  It also creates a corresponding mult-variant.  The package option
-    \option{multiple} will now turn \cs*{cs} into its mult-variant.  Required
-    syntax: \cs*{cs}\oarg{oarg}\oarg{oarg}\marg{marg}
-  % \AdaptNoteOptNoMult
-  \command{AdaptNoteOptNoMult}[\Marg{\cs*{cs}}]
-    Like \cs{AdaptNoteOpt} but doesn't create a mult-variant and thus there is
-    no change in behaviour when the option \option{multiple} is used.
-    Required syntax: \cs*{cs}\oarg{oarg}\oarg{oarg}\marg{marg}
-  % \AdaptNoteNoOpt
-  \command{AdaptNoteNoOpt}[\Marg{\cs*{cs}}\Marg{\cs*{multcs}}]
-    \sinceversion{0.3}Like \cs{AdaptNote} but requires \cs*{cs} not to have an
-    optional argument.  If it had one it wouldn't have it any more after the
-    adaption.  The package option \option{multiple} will now turn \cs*{cs}
-    into its mult-variant.  Required syntax: \cs*{cs}\marg{marg}
-  % \AdaptNoteNoOptNoMult
-  \command{AdaptNoteNoOptNoMult}[\Marg{\cs*{cs}}]
-    \sinceversion{0.3}Like \cs{AdaptNoteNoOpt} but doesn't create a
-    mult-variant.  Required syntax: \cs*{cs}\Marg{marg}
-  % \AdaptNoteMark
-  \command{AdaptNoteMark}[\Marg{\cs*{cs}}]
-    This lets \cs*{cs} adapt to the kerning behaviour and adds an optional
-    \sarg.  Required syntax: \cs*{cs}\oarg{oarg}
-  % strict
-\end{commands}
-\begin{options}
-  \keybool{strict}\Default{false} When \code{true}
-    \cs{AdaptNote} (and the others) will issue errors if the note command in
-    question has already been adapted.
-\end{options}
-
-\subsection{tufte-latex's side notes}
-For example using the \cs{sidenote} command from the \cls*{tufte-handout}
-class is easily possible, see also figure~\ref{fig:tufte}:
-\begin{example}[compile,float,caption={Adapt
-    \bnd*{tufte-latex}.\label{fig:tufte}},graphics={trim=2.5cm 24.5cm 2cm
-    1cm,scale=.65}]
-  \documentclass{tufte-handout}
-  \usepackage[multiple]{fnpct}
-  \AdaptNote\sidenote\multsidenote
-  \begin{document}
-  Some text in the document body\sidenote{Some
-  text in a sidenote.;A second sidenote.}.
-  \end{document}
-\end{example}
-
-\subsection{Adapting \cs*{footcite} and siblings}\label{ssec:adapt:footcite}
-If you're willing to sacrifice \cs*{footcite}'s \sarg\ argument (which it has
-in some styles) you can adapt the commands provided by
-\pkg{biblatex}~\cite{pkg:biblatex} as well:
-
-\begin{example}
-  % used in preamble: \AdaptNoteOpt\footcite\multfootcite
-  \begin{minipage}{.5\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}. The
-    companion has nothing on this topic\multfootcite{[see]
-      [but there's nothing there]companion;[or see][but there's
-      also nothing]knuth:ct:a}.
-  \end{minipage}
-\end{example}
-
-The option \option{multiple} turns all \cs*{footcite}s into
-\cs*{multfootcite}s now.  Remember that the optional arguments then are inside
-the braces!
-
-\begin{example}
-  % used in preamble: \AdaptNoteOpt\footcite\multfootcite
-  % with option `multiple':
-  \begin{minipage}{.5\linewidth}
-    \noindent The three little pigs built their houses
-    out of straw\footnote{not to be confused with hay},
-    sticks\footnote{or lumber according to some sources}
-    and bricks\footnote{probably fired clay bricks}. The
-    companion has nothing on this topic\footcite{[see][but
-      there's nothing there]companion;[or see][but there's also
-      nothing]knuth:ct:a}.
-  \end{minipage}
-\end{example}
-
-
-\appendix
-
-\end{document}
-
-% TODO: update documentation and explain what happens when babel's french is
-% used

Modified: trunk/Master/texmf-dist/tex/latex/fnpct/fnpct.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/fnpct/fnpct.sty	2021-01-23 22:17:41 UTC (rev 57504)
+++ trunk/Master/texmf-dist/tex/latex/fnpct/fnpct.sty	2021-01-23 22:18:39 UTC (rev 57505)
@@ -5,35 +5,31 @@
 % 
 % --------------------------------------------------------------------------
 % Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/fnpct/
+% Web:    https://github.com/cgnieder/fnpct/
 % E-Mail: contact at mychemistry.eu
 % --------------------------------------------------------------------------
-% Copyright 2012--2019 Clemens Niederberger
+% Copyright 2012--2021 Clemens Niederberger
 % 
 % This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
+% 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.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% 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.
 % --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% the package is inspired by the following question on TeX.SE:
-%   http://tex.stackexchange.com/q/56094/5049
-% --------------------------------------------------------------------------
-\RequirePackage {xparse,l3keys2e,scrlfile}
+\RequirePackage {l3keys2e}
 \ExplSyntaxOn
 
-\tl_const:Nn \c_fnpct_date_tl                 {2019/10/05}
-\tl_const:Nn \c_fnpct_version_major_number_tl {0}
-\tl_const:Nn \c_fnpct_version_minor_number_tl {5}
+\DeclareHookRule {begindocument} {fnpct} {after} {hyperref}
+
+\tl_const:Nn \c_fnpct_date_tl                 {2021/01/21}
+\tl_const:Nn \c_fnpct_version_major_number_tl {1}
+\tl_const:Nn \c_fnpct_version_minor_number_tl {0}
 \tl_const:Nn \c_fnpct_version_subrelease_tl   {}
 \tl_const:Nx \c_fnpct_version_number_tl
   {
@@ -54,107 +50,129 @@
   {\c_fnpct_info_tl}
 
 % --------------------------------------------------------------------------
-% this is plain's \nobreak:
-\cs_new:Npn \fnpct_no_break: { \tex_penalty:D 10000 \scan_stop: }
-
-% --------------------------------------------------------------------------
-% variables:
+% scratch variables and variants of kernel functions:
 \tl_new:N  \l__fnpct_tmpa_tl
-\tl_new:N  \l__fnpct_tmpb_tl
 
-\dim_new:N \l__fnpct_tmpa_dim
-\dim_new:N \l__fnpct_tmpb_dim
+\seq_new:N \l__fnpct_tmpa_seq
 
-\int_new:N \l__fnpct_tmpa_int
+\cs_generate_variant:Nn \tl_remove_all:Nn {NV}
+\cs_generate_variant:Nn \prop_item:Nn {NV}
+\cs_generate_variant:Nn \prop_get:NnN {NV}
+\cs_generate_variant:Nn \prop_put:Nnn {Nx,Nnx,Nxx}
+\cs_generate_variant:Nn \seq_put_right:Nn {Nx}
+\cs_generate_variant:Nn \seq_set_split:Nnn {NV}
+\cs_generate_variant:Nn \regex_replace_all:nnN {nx}
+\cs_generate_variant:Nn \str_remove_once:Nn {NV}
+\cs_generate_variant:Nn \msg_warning:nnn {nnV}
+\cs_generate_variant:Nn \msg_warning:nnnn {nnV}
+\cs_generate_variant:Nn \msg_error:nnn {nnV}
 
-\seq_new:N \l__fnpct_tmpa_seq
-\seq_new:N \l__fnpct_tmpb_seq
+\prg_generate_conditional_variant:Nnn \tl_if_eq:nn {v,V} {T,F,TF}
 
-\dim_new:N  \l__fnpct_after_comma_dim
-\dim_set:Nn \l__fnpct_after_comma_dim       {-.06em}
-\dim_new:N  \l__fnpct_after_dot_dim
-\dim_set:Nn \l__fnpct_after_dot_dim         {-.06em}
-\dim_new:N  \l__fnpct_before_comma_dim
-\dim_set:Nn \l__fnpct_before_comma_dim      {-.16em}
-\dim_new:N  \l__fnpct_before_dot_dim
-\dim_set:Nn \l__fnpct_before_dot_dim        {-.16em}
-\dim_new:N  \l__fnpct_before_footnote_dim
-\dim_set:Nn \l__fnpct_before_footnote_dim   {.06em}
-\dim_new:N  \l__fnpct_normal_mark_width_dim
-\dim_set:Nn \l__fnpct_normal_mark_width_dim {1em}
-\dim_new:N  \l__fnpct_normal_indent_dim
-\dim_set:Nn \l__fnpct_normal_indent_dim     {1.5em}
-\dim_new:N  \l__fnpct_normal_parindent_dim
-\dim_set:Nn \l__fnpct_normal_parindent_dim  {1em}
-\dim_new:N  \l__fnpct_french_before_footnote_space_dim
-\dim_set:Nn \l__fnpct_french_before_footnote_space_dim {.16667em}
+% --------------------------------------------------------------------------
+% variables
+\bool_new:N \l_fnpct_trailing_action_bool
+\bool_new:N \l__fnpct_trailing_tokens_bool
+\bool_new:N \l__fnpct_dont_mess_around_bool
+\bool_new:N \l__fnpct_ranges_bool
+\bool_new:N \l__fnpct_inside_range_bool
+\bool_new:N \l__fnpct_collection_bool
+\bool_new:N \l__fnpct_switched_bool
+\bool_new:N \l__fnpct_end_collection_bool
+\bool_new:N \l__fnpct_automatic_adaption_bool
+\bool_new:N \l__fnpct_reverse_bool
+\bool_new:N \l__fnpct_keep_ranges_bool
+\bool_new:N \g__fnpct_multiple_bool
+\bool_new:N \g__fnpct_text_bool
+\bool_new:N \l__fnpct_debug_bool
 
-\int_new:N \l__fnpct_multiple_notes_int
-
-\tl_new:N  \l__fnpct_multiple_footnotes_delimiter_tl
+\tl_new:N \l_fnpct_action_tl
+\tl_new:N \l_fnpct_last_action_tl
+\tl_new:N \l_fnpct_trailing_token_tl
+\tl_new:N \l__fnpct_trailing_tokens_tl
+\tl_new:N \l__fnpct_range_tl
+\tl_new:N \l__fnpct_separate_tl
+\tl_new:N \l__fnpct_multiple_footnotes_delimiter_tl
 \tl_set:Nn \l__fnpct_multiple_footnotes_delimiter_tl {;}
-\tl_new:N  \l__fnpct_multiple_footnote_separator_tl
-\tl_new:N  \l__fnpct_last_punct_mark_tl
-\tl_new:N  \l__fnpct_punctuation_marks_tl
-\tl_set:Nn \l__fnpct_punctuation_marks_tl {.,}
-\tl_new:N  \l__fnpct_multiple_true_tl
-\tl_new:N  \l__fnpct_multiple_false_tl
+\tl_new:N \g__fnpct_this_note_tl
 
-\bool_new:N \l__fnpct_strict_bool
-\bool_new:N \l__fnpct_punct_after_bool
-\bool_new:N \l__fnpct_dont_mess_around_bool
-\bool_new:N \l__fnpct_multiple_default_bool
-\bool_new:N \l__fnpct_multiple_footnotes_bool
-\bool_new:N \l__fnpct_reverse_switch_bool
-\bool_new:N \l__fnpct_normal_marks_bool
-\bool_new:N \l__fnpct_hyperref_bool
-\bool_new:N \g__fnpct_after_punctuation_bool
-\bool_new:N \g__fnpct_only_text_bool
-\bool_new:N \l__fnpct_makepagenote_bool
+\prop_new:N \l__fnpct_trailing_tokens_prop
+\prop_new:N \l__fnpct_trailing_actions_prop
+\prop_new:N \l__fnpct_trailing_classes_prop
+\prop_new:N \g__fnpct_actions_prop
+\prop_new:N \g__fnpct_action_classes_prop
 
-\seq_new:N \l__fnpct_multiple_footnotes_seq
+\seq_new:N \l__fnpct_trailing_tokens_seq
+\seq_new:N \l__fnpct_classes_seq
+\seq_new:N \g__fnpct_actions_seq
 \seq_new:N \l__fnpct_footnote_class_seq
+\seq_new:N \l__fnpct_collection_seq
+\seq_new:N \g__fnpct_inner_seq
+\seq_new:N \l__fnpct_adapted_commands_seq
 
-\prop_new:N \l__fnpct_punctuation_marks_after_prop
-\prop_new:N \l__fnpct_punctuation_marks_before_prop
-\prop_new:N \l__fnpct_sepfootnote_foot_classes_prop
-\prop_new:N \l__fnpct_sepfootnote_end_classes_prop
-\prop_new:N \l__fnpct_sepfootnote_symbol_classes_prop
-\prop_new:N \g__fnpct_adapted_notes_prop
-\prop_new:N \g__fnpct_inner_footnote_prop
-\prop_new:N \g__fnpct_inner_footnote_hyperref_prop
-\prop_new:N \l__fnpct_footnote_fixfoot_prop
+\int_new:N \l__fnpct_collection_int
 
-% --------------------------------------------------------------------------
-% variants:
-\cs_generate_variant:Nn \str_remove_once:Nn {NV}
-\cs_generate_variant:Nn \tl_remove_all:Nn {NV}
-\cs_generate_variant:Nn \tl_put_right:Nn {NV}
-\cs_generate_variant:Nn \seq_set_split:Nnn {NnV,NV}
-\cs_generate_variant:Nn \prop_gput:Nnn {Nxn,Nxo}
-\cs_generate_variant:Nn \prop_put:Nnn {Nnx}
-\cs_generate_variant:Nn \prop_if_in:NnTF {Nx}
+\dim_new:N \l__fnpct_before_footnote_dim
 
 % --------------------------------------------------------------------------
 % messages:
-\cs_new_protected:Npn \fnpct_dont_mess_around:
+\msg_new:nnn {fnpct} {load-time-option}
   {
-    \iow_log:n { ................................................. }
-    \iow_log:n { . ~ fnpct~info: }
-    \iow_log:n { . }
-    \iow_log:n { . ~ All~right,~not~messing~around.~:( }
-    \iow_log:n { . ~ But~I'd~really~love~to. }
-    \iow_log:n { . ~ (https://www.youtube.com/results?search_query=mess+around+ray+charles) }
-    \iow_log:n { ................................................. }
+    `#1'~ is~ a~ load-time~ option! \\
+    You~ cannot~ set~ it~ with~ \token_to_str:N \setfnpct ! \\
+    You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {fnpct} .
   }
 
-\msg_new:nnn {fnpct} {already-adapted}
+\msg_new:nnn {fnpct} {unknown-option}
   {
-    The~ command~ \token_to_str:N #1 \c_space_tl has~ already~ been~
-    adapted. \\
-    I~ will~ do~ nothing~ instead.
+    Unknown~ option~ `#1'! \\
+    I~ don't~ know~ the~ option~ `#1'.~ Please~ make~ sure~ there~ is~ no~
+    typo.~ Check~ the~ manual~ for~ help.
   }
 
+\msg_new:nnn {fnpct} {dont-mess-around}
+  {
+    All~ right,~ not~ messing~ around.~ :( \\
+    I'd~ really~ love~ to,~ though! \\
+    https://www.youtube.com/results?search_query=mess+around+ray+charles
+  }
+
+\msg_new:nnn {fnpct} {class-not-defined}
+  { The~ action~ class~ `#1'~ is~ not~ defined~ \msg_line_context: }
+
+\msg_new:nnn {fnpct} {command-not-adapted}
+  { The~ command~ `#1'~ doesn't~ seem~ to~ be~ adapted,~ yet,~ \msg_line_context: }
+
+\msg_new:nnn {fnpct} {cannot-adapt}
+  {
+    Due~ to~ the~ implementation~ of~ the~ `#1'~ package~ I~ am~ not~ yet~
+    able~ to~ adapt~ its~ commands.
+  }
+
+\msg_new:nnn {fnpct} {cannot-adapt-with-ranges}
+  {
+    Due~ to~ the~ implementation~ of~ the~ `#1'~ package~ I~ am~ not~ yet~
+    able~ to~ adapt~ its~ commands~ while~ also~ using~ the~ option~ `ranges~
+    =~ true'.~ #2
+  }
+
+\msg_new:nnn {fnpct} {ranges-hyperref}
+  {
+    Using~ the~ option~ `ranges~ =~ true'~ together~ with~ package~
+    `hyperref'~ does~ not~ work~ well.~ Disabling~ ranges.~ If~ you~ insist~
+    then~ set~ `keep-ranges~ =~ true'.
+  }
+
+\msg_new:nnn {fnpct} {keep-ranges-hyperref}
+  {
+    Using~ the~ option~ `ranges~ =~ true'~ together~ with~ package~
+    `hyperref'~ does~ not~ work~ well.~ Keeping~ them~ anyway.~ But~ don't~
+    say~ you~ haven't~ been~ warned.
+  }
+
+\msg_new:nnn {fnpct} {ranges-disabled}
+  { Using~ ranges~ is~ disabled~ \msg_line_context: . }
+  
 \msg_new:nnn {fnpct} {pagenote}
   {
     If~ you~ use~ the~ `pagenote'~ package~ with~ `fnpct'~ please~ make~ sure~
@@ -162,23 +180,67 @@
     `fnpct'!
   }
 
-\msg_new:nnn {fnpct} {deprecated}
+\msg_new:nnn {fnpct} {option-deprecated}
   {
-    You've~ tried~ setting~ #1~ `#2'~ \msg_line_context: .~ However,~
-    #1~ `#2'~ is~ deprecated.~
-    \tl_if_blank:nF {#3} {Please~ use~ #1~ `#3'~ instead.~}
-    Refer~ to~ the~ manual~ for~ details.
+    The~ option~ `#1'~ is~ deprecated
+    \tl_if_blank:nF {#2}
+      { .~ Please~ use~ option~ `#2'~ instead }
+    \c_space_tl \msg_line_context: .
   }
 
-\cs_new_protected:Npn \fnpct_message:nx #1#2
+\msg_new:nnn {fnpct} {command-removed}
+  { The~ command~ #1~ has~ been~ removed~ from~ fnpct. }
+
+% --------------------------------------------------------------------------  
+\cs_new_protected:Npn \__fnpct_loadtime_error:n #1
+   { \msg_error:nnV {fnpct} {#1} \l_keys_key_str }
+
+\cs_new_protected:Npn \__fnpct_loadtime_warning:n #1
+   { \msg_warning:nnV {fnpct} {#1} \l_keys_key_str }
+
+\keys_define:nn {fnpct/package}
   {
-    \bool_if:NTF \l__fnpct_strict_bool
-      { \msg_error:nnx {fnpct} {#1} }
-      { \msg_warning:nnx {fnpct} {#1} }
-    {#2}
+    multiple                 .bool_gset:N = \g__fnpct_multiple_bool ,
+    multiple                 .initial:n = false ,
+    debug                    .bool_gset:N = \g__fnpct_debug_bool ,
+    debug                    .initial:n = false ,
+    dont-mess-around         .choice: ,
+    dont-mess-around / true  .code:n =
+      \bool_set_true:N \l__fnpct_dont_mess_around_bool
+      \msg_info:nn {fnpct} {dont-mess-around} ,
+    dont-mess-around / false .code:n =
+      \bool_set_false:N \l__fnpct_dont_mess_around_bool ,
+    dont-mess-around         .default:n = true ,
+    dont-mess-around         .initial:n = false ,
+    unknown                  .code:n =
+      \__fnpct_loadtime_warning:n {unknown-option}
   }
 
+\ProcessKeysPackageOptions {fnpct/package}
+
+\keys_define:nn {fnpct/package}
+  {
+    multiple         .code:n = \__fnpct_loadtime_error:n {load-time-option} ,
+    debug            .code:n = \__fnpct_loadtime_error:n {load-time-option} ,
+    dont-mess-around .code:n = \__fnpct_loadtime_error:n {load-time-option}
+  }
+
 % --------------------------------------------------------------------------
+\prg_new_conditional:Npnn \fnpct_if_multiple: {T,F,TF}
+  {
+    \bool_if:NTF \g__fnpct_multiple_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \fnpct_if_debug: {T,F,TF}
+  {
+    \bool_if:NTF \g__fnpct_debug_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% --------------------------------------------------------------------------
 \prg_new_conditional:Npnn \fnpct_if_package_loaded:n #1 {p,T,F,TF}
   {
     \@ifpackageloaded {#1}
@@ -186,757 +248,791 @@
       { \prg_return_false: }
   }
 
-% --------------------------------------------------------------------------
-% multiple footnote input and output variables:
-% check for KOMA-Script's \multfootsep:
-\cs_if_exist:NTF \KOMAClassName
-  { \tl_set:Nn \l__fnpct_multiple_footnote_separator_tl { \multfootsep } }
-  { \tl_set:Nn \l__fnpct_multiple_footnote_separator_tl {,} }
+\prg_new_conditional:Npnn \fnpct_if_class_loaded:n #1 {p,T,F,TF}
+  {
+    \@ifclassloaded {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
 % --------------------------------------------------------------------------
-% #1: before/after
-% #2: punctuation mark
-% #3: dimension
-\cs_new_protected:Npn \fnpct_set_punctuation_dim:nnn #1#2#3
+% #1: cs
+\prg_new_conditional:Npnn \fnpct_if_adapted:N #1 {T,F,TF}
   {
-    \prop_put:cnx { l__fnpct_punctuation_marks_#1_prop }
-      {#2}
-      { \dim_eval:n {#3} }
+    \seq_if_in:NnTF \l__fnpct_adapted_commands_seq {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
-\cs_generate_variant:Nn \fnpct_set_punctuation_dim:nnn {nV}
 
-\fnpct_set_punctuation_dim:nnn {after} {.} { \l__fnpct_after_dot_dim }
-\fnpct_set_punctuation_dim:nnn {after} {,} { \l__fnpct_after_comma_dim }
-\fnpct_set_punctuation_dim:nnn {before} {.} { \l__fnpct_before_dot_dim }
-\fnpct_set_punctuation_dim:nnn {before} {,} { \l__fnpct_before_comma_dim }
+\prg_generate_conditional_variant:Nnn \fnpct_if_adapted:N {c} {T,F,TF}
 
-\cs_new_protected:Npn \fnpct_rm_punctuation:n #1
+% --------------------------------------------------------------------------
+\cs_new_protected:Npn \fnpct_nobreak: { \tex_penalty:D 10000 \scan_stop: }
+\cs_new_protected:Npn \fnpct_skip_nobreak:N #1
   {
-    \tl_remove_all:Nn \l__fnpct_punctuation_marks_tl {#1}
-    \prop_del:Nn \l__fnpct_punctuation_marks_after_prop {#1}
-    \prop_del:Nn \l__fnpct_punctuation_marks_before_prop {#1}
+    \fnpct_nobreak:
+    \skip_horizontal:N #1
+    \fnpct_nobreak:
   }
+\cs_generate_variant:Nn \fnpct_skip_nobreak:N {c}
 
-\cs_new_protected:Npn \fnpct_add_punctuation:n #1
-  { \__fnpct_add_punctuation:w #1 [ \q_no_value ] \q_no_value \q_stop }
-\cs_generate_variant:Nn \fnpct_add_punctuation:n {V}
+% --------------------------------------------------------------------------
+% checking for trailing tokens - reuse an idea from acro
+% #1: name
+\cs_new_protected:Npn \fnpct_new_class:n #1
+  {
+    \seq_put_right:Nn \l__fnpct_classes_seq {#1}
+    \seq_new:c {g__fnpct_class_#1_seq}
+  }
 
-\cs_new_protected:Npn \__fnpct_add_punctuation:w #1[#2]#3 \q_stop
+\prg_new_conditional:Npnn \fnpct_class_if_exist:n #1 {p,T,F,TF}
   {
-    \quark_if_no_value:nTF {#2}
+    \seq_if_in:NnTF \l__fnpct_classes_seq {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+  
+% #1: name
+% #2: code
+\cs_new_protected:Npn \fnpct_do_action:nnw #1#2 \fnpct_end:
+  {
+    \prop_if_in:NnTF \g__fnpct_actions_prop {#1}
+      { \fnpct_end: \prop_item:Nn \g__fnpct_actions_prop {#1} }
+      { \fnpct_end: \use:n }
+    {#2}
+  }  
+\cs_generate_variant:Nn \fnpct_do_action:nnw {V}
+
+% #1: name
+% #2: class
+% #3: default before dim
+% #4: default after dim
+% #5: code requiring two n-type arguments (code and token)
+\cs_new_protected:Npn \fnpct_new_action:nnnnn #1#2#3#4#5
+  {
+    \fnpct_class_if_exist:nTF {#2}
       {
-        % there is no option at all
-        \tl_map_inline:nn {#1}
+        \seq_if_in:NnTF \g__fnpct_actions_seq {#1}
           {
-            \tl_put_right:Nn \l__fnpct_punctuation_marks_tl {##1}
-            \fnpct_set_punctuation_dim:nnn {after} {##1} {0pt}
-            \fnpct_set_punctuation_dim:nnn {before} {##1} {0pt}
-            \tl_set:No \l__fnpct_last_punct_mark_tl {##1}
+            \keys_set:nn {fnpct}
+              {
+                before-#1-space = #3 ,
+                after-#1-space  = #4
+              }
           }
-      }
-      {
-        \tl_if_blank:nTF {#1}
           {
-            % #2 is a second option (= before space)
-            \fnpct_set_punctuation_dim:nVn {before}
-              \l__fnpct_last_punct_mark_tl
-              {#2}
-          }
-          {
-            % #2 is a first option (= after space), #1 might be more than one token:
-            \tl_if_single_token:nTF {#1}
+            \seq_gput_right:Nn \g__fnpct_actions_seq {#1}
+            \prop_gput:Nnn \g__fnpct_action_classes_prop {#1} {#2}
+            \prop_gput:Nnn \g__fnpct_actions_prop {#1} {#5}
+            \seq_gput_right:cn {g__fnpct_class_#2_seq} {#1}
+            \dim_new:c {l__fnpct_before_#1_dim}
+            \dim_new:c {l__fnpct_after_#1_dim}
+            \keys_define:nn {fnpct}
               {
-                \tl_put_right:Nn \l__fnpct_punctuation_marks_tl {#1}
-                \fnpct_set_punctuation_dim:nnn {after} {#1} {#2}
-                \fnpct_set_punctuation_dim:nnn {before} {#1} {0pt}
-                \tl_set:No \l__fnpct_last_punct_mark_tl {#1}
+                before-#1-space      .dim_set:c = {l__fnpct_before_#1_dim} ,
+                before-#1-space      .initial:n = #3 ,
+                after-#1-space       .dim_set:c = {l__fnpct_after_#1_dim} ,
+                after-#1-space       .initial:n = #4
               }
-              {
-                \int_zero:N \l__fnpct_tmpa_int
-                \tl_map_inline:nn {#1}
-                  {
-                    \tl_put_right:Nn \l__fnpct_punctuation_marks_tl {##1}
-                    \int_compare:nTF { \l__fnpct_tmpa_int < ( \tl_count:n {#1} - 1 ) }
-                      {
-                        \fnpct_set_punctuation_dim:nnn {after} {##1} {0pt}
-                        \fnpct_set_punctuation_dim:nnn {before} {##1} {0pt}
-                      }
-                      {
-                        \fnpct_set_punctuation_dim:nnn {after} {##1} {#2}
-                        \fnpct_set_punctuation_dim:nnn {before} {##1} {0pt}
-                      }
-                    \tl_set:No \l__fnpct_last_punct_mark_tl {##1}
-                    \int_incr:N \l__fnpct_tmpa_int
-                  }
-              }
           }
       }
-    % is there more?
-    \tl_if_eq:nnF {#3} { [\q_no_value]\q_no_value }
-      {
-        \quark_if_no_value:nF {#3}
-          {
-            \tl_set:Nn \l__fnpct_tmpa_tl {#3}
-            \tl_remove_all:Nn \l__fnpct_tmpa_tl { [\q_no_value]\q_no_value }
-            \fnpct_add_punctuation:V \l__fnpct_tmpa_tl
-          }
-      }
+      { \msg_error:nnn {fnpct} {class-not-defined} {#2} }
   }
 
-% --------------------------------------------------------------------------
-% options:
-\keys_define:nn {fnpct}
+\prg_new_conditional:Npnn \fnpct_action_if_exist:n #1 {p,T,F,TF}
   {
-    bigfoot-default-top   .code:n     =
-      \msg_warning:nnnn {fnpct} {deprecated} {option} {bigfoot-default-top} ,
-    strict                .bool_set:N = \l__fnpct_strict_bool ,
-    after-comma-space     .code:n     =
-      \fnpct_set_punctuation_dim:nnn {after} {,} {#1} ,
-    after-dot-space       .code:n     =
-      \fnpct_set_punctuation_dim:nnn {after} {.} {#1} ,
-    before-comma-space    .code:n     =
-      \fnpct_set_punctuation_dim:nnn {before} {,} {#1} ,
-    before-dot-space      .code:n     =
-      \fnpct_set_punctuation_dim:nnn {before} {.} {#1} ,
-    after-punct-space     .code:n     =
-      \prop_map_inline:Nn \l__fnpct_punctuation_marks_after_prop
-        { \fnpct_set_punctuation_dim:nnn {after} {##1} {#1} } ,
-    before-punct-space    .code:n     =
-      \prop_map_inline:Nn \l__fnpct_punctuation_marks_before_prop
-        { \fnpct_set_punctuation_dim:nnn {before} {##1} {#1} } ,
-    before-footnote-space .dim_set:N  = \l__fnpct_before_footnote_dim ,
-    french-before-footnote-space .dim_set:N =
-      \l__fnpct_french_before_footnote_space_dim ,
-    punct-after           .bool_set:N = \l__fnpct_punct_after_bool ,
-    dont-mess-around      .code:n     =
-      \prop_map_inline:Nn \l__fnpct_punctuation_marks_after_prop
-        { \fnpct_set_punctuation_dim:nnn {after} {##1} {0pt} }
-      \prop_map_inline:Nn \l__fnpct_punctuation_marks_before_prop
-        { \fnpct_set_punctuation_dim:nnn {before} {##1} {0pt} }
-      \dim_zero:N \l__fnpct_before_footnote_dim
-      \bool_set_true:N \l__fnpct_punct_after_bool
-      \bool_set_true:N \l__fnpct_dont_mess_around_bool
-      \fnpct_dont_mess_around: ,
-    mult-fn-delim         .tl_set:N   = \l__fnpct_multiple_footnotes_delimiter_tl ,
-    mult-fn-sep           .tl_set:N   = \l__fnpct_multiple_footnote_separator_tl ,
-    multiple              .bool_set:N = \l__fnpct_multiple_default_bool ,
-    normal-marks          .bool_set:N = \l__fnpct_normal_marks_bool ,
-    normal-mark-width     .dim_set:N  = \l__fnpct_normal_mark_width_dim ,
-    normal-indent         .dim_set:N  = \l__fnpct_normal_indent_dim ,
-    normal-parindent      .dim_set:N  = \l__fnpct_normal_parindent_dim ,
-    verb-format           .tl_set:N   = \l__fnpct_verbatim_format_tl ,
-    add-punct-marks       .code:n     = \fnpct_add_punctuation:n {#1}  ,
-    remove-punct-marks    .code:n     =
-      \tl_map_function:nN {#1} \fnpct_rm_punctuation:n
+    \seq_if_in:NnTF \g__fnpct_actions_seq {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-\ProcessKeysOptions {fnpct}
-
-% --------------------------------------------------------------------------
-% MAIN INTERNAL FOOTNOTE FUNCTION:
-% write the notes:
-\cs_new:Npn \__fnpct_no_value_or_quark_no_value:nTF #1#2#3
+% register a new token but don't activate its action:
+% #1: token
+% #2: action
+\cs_new_protected:Npn \fnpct_new_trailing_token:Nn #1#2
   {
-    \IfNoValueTF {#1} {#2}
-      { \quark_if_no_value:nTF {#1} {#2} {#3} }
+    \prop_put:Nnn \l__fnpct_trailing_tokens_prop {#1} {#1}
+    \prop_put:Nnn \l__fnpct_trailing_actions_prop {#1} {#2}
+    \prop_put:Nnx \l__fnpct_trailing_classes_prop {#1}
+      { \prop_item:Nn \g__fnpct_action_classes_prop {#2} }
+    \seq_put_right:Nn \l__fnpct_trailing_tokens_seq {#1}
   }
 
-\cs_new:Npn \fnpct_write_note:Nnnn #1#2#3#4
+% #1: class
+% #2: code where `#1' refers to the action name
+\cs_new:Npn \fnpct_foreach_action:nn #1#2
   {
-    \__fnpct_no_value_or_quark_no_value:nTF {#2}
-      { #1 {#4} }
-      {
-        \__fnpct_no_value_or_quark_no_value:nTF {#3}
-          { #1 [#2] {#4} }
-          { #1 [#2] [#3] {#4} }
-      }
+    \fnpct_class_if_exist:nT {#1}
+      { \seq_map_inline:cn {g__fnpct_class_#1_seq} {#2} }
   }
 
-% check for punctuation:
-\cs_new_protected:Npn \fnpct_check_punctuation:TF #1#2
-  { \__fnpct_check_punctuation:nTF {0} {#1} {#2} }
+\cs_new_eq:NN \fnpct_action_break: \seq_map_break:
 
-\cs_new_protected:Npn \__fnpct_check_punctuation:nTF #1#2#3
+% #1: token
+\cs_new_protected:Npn \fnpct_remove_trailing_token:N #1
   {
-    \__fnpct_get_head:NN
-      \l__fnpct_current_punct_mark_tl
-      \l__fnpct_punctuation_marks_tl
-    \exp_args:NV \peek_meaning_remove:NTF \l__fnpct_current_punct_mark_tl
-      {#2}
-      {
-        \__fnpct_check_punctuation_aux:nnn {#1}
-          { \__fnpct_check_punctuation:VTF \l__fnpct_tmpa_int {#2} {#3} }
-          {#3}
-      }
+    \seq_remove_all:Nn \l__fnpct_trailing_tokens_seq {#1}
+    \prop_remove:Nn \l__fnpct_trailing_tokens_prop {#1}
+    \prop_remove:Nn \l__fnpct_trailing_actions_prop {#1}
+    \prop_remove:Nn \l__fnpct_trailing_classes_prop {#1}
   }
 
-\cs_new_protected:Npn \__fnpct_check_punctuation_aux:nnn #1#2#3
+\cs_new_protected:Npn \fnpct_for_all_trailing_tokens_do:n #1
+  { \seq_map_inline:Nn \l__fnpct_trailing_tokens_seq {#1} }
+
+% activate a token:
+\cs_new_protected:Npn \fnpct_activate_trailing_token:n #1
   {
-    \int_set:Nn \l__fnpct_tmpa_int {#1}
-    \int_incr:N \l__fnpct_tmpa_int
-    \tl_set:Nx \l__fnpct_tmpb_tl { \int_to_arabic:n { \l__fnpct_tmpa_int } }
-    \tl_remove_all:NV \l__fnpct_punctuation_marks_tl
-      \l__fnpct_current_punct_mark_tl
-    \tl_put_right:NV \l__fnpct_punctuation_marks_tl
-      \l__fnpct_current_punct_mark_tl
-    \int_compare:nTF { \l__fnpct_tmpa_int < \tl_count:V \l__fnpct_punctuation_marks_tl }
-      {#2}
-      {#3}
+    \prop_get:NnN \l__fnpct_trailing_tokens_prop {#1} \l__fnpct_tmpa_tl
+    \tl_put_right:NV \l__fnpct_trailing_tokens_tl \l__fnpct_tmpa_tl
   }
-\cs_generate_variant:Nn \__fnpct_check_punctuation:nTF {V}
 
-\cs_new_protected:Npn \__fnpct_get_head:NN #1#2
-  { \tl_set:Nx #1 { \tl_head:V #2 } }
-
-% check for multiple notes:
-\cs_new_protected:Npn \fnpct_check_multiple:TF #1#2
+% deactivate a token:
+\cs_new_protected:Npn \fnpct_deactivate_trailing_token:n #1
   {
-    \tl_set:Nn \l__fnpct_multiple_true_tl  {#1}
-    \tl_set:Nn \l__fnpct_multiple_false_tl {#2}
-    \bool_gset_false:N \g__fnpct_after_punctuation_bool
-    \peek_after:Nw \__fnpct_check_multiple:
+    \prop_get:NnN \l__fnpct_trailing_tokens_prop {#1} \l__fnpct_tmpa_tl
+    \tl_remove_all:NV \l__fnpct_trailing_tokens_tl \l__fnpct_tmpa_tl
   }
 
-\cs_new_protected:Npn \__fnpct_check_multiple:
+% #1: tokenlist
+\prg_new_protected_conditional:Npnn \fnpct_if_trailing_tokens:n #1 {T,F,TF}
   {
-    \prop_map_inline:Nn \g__fnpct_adapted_notes_prop
+    \bool_set_false:N \l__fnpct_trailing_tokens_bool
+    \tl_map_inline:nn {#1}
       {
-        \tl_set_rescan:Nnn \l__fnpct_tmpb_tl {} {##1}
-        \exp_args:NV
-        \token_if_eq_meaning:NNTF \l__fnpct_tmpb_tl \l_peek_token
+        \bool_if:cT {l__fnpct_trailing_##1_bool}
           {
-            \bool_set_true:N \l__fnpct_multiple_footnotes_bool
-            \prop_map_break:
+            \bool_set_true:N \l__fnpct_trailing_tokens_bool
+            \tl_map_break:
           }
-          { \bool_set_false:N \l__fnpct_multiple_footnotes_bool }
       }
-    \bool_if:NTF \l__fnpct_multiple_footnotes_bool
-      { \tl_use:N \l__fnpct_multiple_true_tl }
-      { \tl_use:N \l__fnpct_multiple_false_tl }
-  }
-
-% check which mode is active:
-\prg_new_conditional:Npnn \fnpct_punct_if_after: {T,TF}
-  {
-    \bool_if:nTF
-      {
-        \bool_xor_p:nn
-          { \l__fnpct_punct_after_bool }
-          { \l__fnpct_reverse_switch_bool }
-      }
+    \bool_if:NTF \l__fnpct_trailing_tokens_bool
       { \prg_return_true: }
       { \prg_return_false: }
   }
 
-% this is where the magic happens:
-\cs_new_protected:Npn \fnpct_handle_punctuation:n #1
+% --------------------------------------------------------------------------
+% #1: token
+\prg_new_protected_conditional:Npnn \__fnpct_check_trail:N #1 {T,F,TF}
   {
-    \fnpct_check_punctuation:TF
+    \bool_set_false:N \l_fnpct_trailing_action_bool
+    \tl_clear:N \l_fnpct_trailing_token_tl
+    \bool_if:NTF \l__fnpct_dont_mess_around_bool
+      { \prg_return_false: }
       {
-        % this is need as some commands like biblatex's \autocite may in turn
-        % call \footnote.  It then must not insert the pre-footnote-space:
-        \bool_gset_true:N \g__fnpct_after_punctuation_bool
-        % A: after=1 && reverse=0
-        %    after=0 && reverse=1
-        % B: after=1 && reverse=1
-        %    after=0 && reverse=0
-        \fnpct_punct_if_after:TF
+        \tl_if_empty:NTF \l__fnpct_trailing_tokens_tl
+          { \prg_return_false: }
           {
-            \fnpct_no_break:
-            \skip_horizontal:N \l__fnpct_before_footnote_dim
-          }
-          {
-            \tl_use:N \l__fnpct_current_punct_mark_tl
-            \prop_get:NVNT \l__fnpct_punctuation_marks_after_prop
-              \l__fnpct_current_punct_mark_tl
-              \l__fnpct_tmpa_tl
+            \tl_map_inline:Nn \l__fnpct_trailing_tokens_tl
               {
-                \dim_set:Nn \l__fnpct_tmpa_dim { \l__fnpct_tmpa_tl }
-                \fnpct_no_break:
-                \skip_horizontal:N \l__fnpct_tmpa_dim
-                \fnpct_no_break:
-                \skip_horizontal:N \c_zero_skip
-                \fnpct_no_break:
+                \token_if_eq_meaning:NNT #1 ##1
+                  {
+                    \bool_set_true:N \l_fnpct_trailing_action_bool
+                    \tl_set:Nn \l_fnpct_trailing_token_tl {##1}
+                    \tl_map_break:
+                  }
               }
+            \bool_if:NTF \l_fnpct_trailing_action_bool
+              { \prg_return_true: }
+              { \prg_return_false: }
           }
-        #1
-        \bool_gset_false:N \g__fnpct_after_punctuation_bool
-        \fnpct_punct_if_after:T
-          {
-            \fnpct_no_break:
-            \prop_get:NVNT \l__fnpct_punctuation_marks_before_prop
-              \l__fnpct_current_punct_mark_tl
-              \l__fnpct_tmpa_tl
-              {
-                \dim_set:Nn \l__fnpct_tmpa_dim { \l__fnpct_tmpa_tl }
-                \fnpct_no_break:
-                \skip_horizontal:N \l__fnpct_tmpa_dim
-                \fnpct_no_break:
-                \skip_horizontal:N \c_zero_skip
-                \fnpct_no_break:
-              }
-            \tl_use:N \l__fnpct_current_punct_mark_tl
-          }
-        \bool_set_false:N \l__fnpct_reverse_switch_bool
       }
+  }
+
+% #1: class name
+\prg_new_protected_conditional:Npnn \fnpct_if_class:n #1 {T,F,TF}
+  {
+    \bool_if:NTF \l_fnpct_trailing_action_bool
       {
-        % what about multiple footnotes? (their usage is discouraged with
-        % this package, but anyway...)
-        % this check should probably/maybe be removed (?!)
-        \fnpct_check_multiple:TF
-          {
-            \bool_set_true:N \l__fnpct_multiple_footnotes_bool
-            \fnpct_no_break:
-            \bool_if:NF \g__fnpct_after_punctuation_bool
-              { \skip_horizontal:N \l__fnpct_before_footnote_dim }
-            #1
-            \fnpct_no_break:
-            \textsuperscript { \l__fnpct_multiple_footnote_separator_tl }
-          }
-          {
-            % else insert space and then note
-            \bool_if:NTF \l__fnpct_multiple_footnotes_bool
-              { \bool_set_false:N \l__fnpct_multiple_footnotes_bool }
-              {
-                \fnpct_no_break:
-                \bool_if:NF \g__fnpct_after_punctuation_bool
-                  { \skip_horizontal:N \l__fnpct_before_footnote_dim }
-              }
-            #1
-            \bool_set_false:N \l__fnpct_reverse_switch_bool
-          }
+        \prop_get:NVN \l__fnpct_trailing_classes_prop
+          \l_fnpct_trailing_token_tl
+          \l__fnpct_tmpa_tl
+        \tl_if_eq:VnTF \l__fnpct_tmpa_tl {#1}
+          { \prg_return_true: }
+          { \prg_return_false: }
       }
+      { \prg_return_false: }
   }
- 
 
-%   #1: original command
-%   #2: optional argument of original command
-%   #3: second optional argument of original command
-%   #4: mandatory argument of original command
-%   #5: boolean flag for starred version
-\cs_new_protected:Npn \fnpct_handle_note:Nnnnn #1#2#3#4#5
+% #1: action name
+\prg_new_protected_conditional:Npnn \fnpct_if_action:n #1 {T,F,TF}
   {
-    % if a punctuation mark follows remove it, insert dot, skip back
-    % and then insert footnote
-    \bool_if:NF \l__fnpct_dont_mess_around_bool
+    \bool_if:NTF \l_fnpct_trailing_action_bool
       {
-        \IfBooleanT {#5}
-          { \bool_set_true:N \l__fnpct_reverse_switch_bool }
+        \prop_get:NVN \l__fnpct_trailing_actions_prop
+          \l_fnpct_trailing_token_tl
+          \l__fnpct_tmpa_tl
+        \tl_if_eq:VnTF \l__fnpct_tmpa_tl {#1}
+          { \prg_return_true: }
+          { \prg_return_false: }
       }
-    \fnpct_handle_punctuation:n
-      {
-        \fnpct_write_note:Nnnn #1 {#2} {#3} {#4}
-        \fnpct_write_inner:N #1
-      }
+      { \prg_return_false: }
   }
-\cs_generate_variant:Nn \fnpct_handle_note:Nnnnn { cnnnn }
 
 % --------------------------------------------------------------------------
-% MULTIPLE FOOTNOTES
-% #1: original note command
-% #2: star
-% #3: multiple notes separated by \l__fnpct_multiple_footnotes_delimiter_tl
-\cs_new_protected:Npn \fnpct_mult_note:Nnn #1#2#3 
+% saving and using the note commands:
+\cs_new:Npn \__fnpct_remove_backslash:N #1
+  { \exp_after:wN \use_none:n \token_to_str:N #1 }
+
+% this is dangerous - it relies on undocumented innards of xparse - however,
+% it should probably be rather safe, anyway:
+\cs_new_protected:Npn \fnpct_save_note_command:N #1
   {
-    \bool_if:NF \l__fnpct_dont_mess_around_bool
+    \cs_undefine:c {fnpct_original_ \__fnpct_remove_backslash:N #1 :w}
+    \cs_if_exist:cTF { \__fnpct_remove_backslash:N #1 ~ code }
+      {% xparse command
+        \cs_new_eq:cc
+          { fnpct_original_ \__fnpct_remove_backslash:N #1 :w }
+          { \__fnpct_remove_backslash:N #1 ~ code }
+      }
       {
-        \IfBooleanT {#2}
-          { \bool_set_true:N \l__fnpct_reverse_switch_bool }
+        \cs_if_exist:cTF { \__fnpct_remove_backslash:N #1 ~ }
+          {% robust command
+            \cs_new_eq:cc
+              { fnpct_original_ \__fnpct_remove_backslash:N #1 :w }
+              { \__fnpct_remove_backslash:N #1 ~ }
+          }
+          { \cs_new_eq:cN { fnpct_original_ \__fnpct_remove_backslash:N #1 :w } #1 }
       }
-    % split input:
-    \seq_set_split:NVn \l__fnpct_multiple_footnotes_seq
-      \l__fnpct_multiple_footnotes_delimiter_tl
-      {#3}
-    \fnpct_handle_punctuation:n
-      { \fnpct_write_notes:NN #1 \l__fnpct_multiple_footnotes_seq }
-
+    \seq_put_right:Nn \l__fnpct_adapted_commands_seq {#1}
+    \fnpct_set_counter_name:Nx #1 { \__fnpct_remove_backslash:N #1 }
   }
-\cs_generate_variant:Nn \fnpct_mult_note:Nnn {cnn}
 
-% #1: original note command
-% #2: sequence variable holding the note arguments
-\cs_new_protected:Npn \fnpct_write_notes:NN #1#2
+\cs_new_protected:Npn \fnpct_set_counter_name:Nn #1#2
+  { \cs_set:cpn { fnpct_ \__fnpct_remove_backslash:N #1 _counter: } {#2} }
+\cs_generate_variant:Nn \fnpct_set_counter_name:Nn {c,Nx}
+  
+\cs_new:Npn \__fnpct_counter:N #1
+  { \use:c { fnpct_ \__fnpct_remove_backslash:N #1 _counter: } }
+
+\hook_new:n {fnpct/rangesetup}
+  
+\cs_new_protected:Npn \fnpct_use_note_command:N #1
   {
-    \int_zero:N \l__fnpct_multiple_notes_int
-    \seq_map_inline:Nn #2
+    \fnpct_if_debug:T
+      { \iow_term:x { fnpct~ info:~ \exp_not:N #1  \msg_line_context:} }
+    \tl_gset:Nx \g__fnpct_this_note_tl { \__fnpct_remove_backslash:N #1 }
+    \cs_if_exist:cTF {fnpct_original_ \__fnpct_remove_backslash:N #1 :w}
       {
-        \__fnpct_read_note_with_option:w ##1 \q_stop {#1}
-        \int_incr:N \l__fnpct_multiple_notes_int
+        \fnpct_inside_range:TF
+          {
+            \refstepcounter { \__fnpct_counter:N #1 }
+            \tl_set_eq:NN \l__fnpct_current_tl #1
+            \hook_use:n {fnpct/rangesetup}
+            \use:c { \__fnpct_remove_backslash:N #1 text }
+          }
+          { \use:c {fnpct_original_ \__fnpct_remove_backslash:N #1 :w} }
       }
+      { \msg_error:nnn {fnpct} {command-not-adapted} {#1} }
   }
+\cs_generate_variant:Nn \fnpct_use_note_command:N {c}
 
-% this shouldn't be a document command but is a really easy way to make
-% biblatex's \footcite et.al. compatible with the `multiple' option
-%   #1: optional star => only invoke \footnotetext
-%   #2: optional argument to original note command
-%   #3: second optional argument to original note command
-%   #4: mandatory argument to original note command
-%   #5: original note command
-\NewDocumentCommand \__fnpct_read_note_with_option:w { soo+u{\q_stop}m }
+\prg_new_conditional:Npnn \fnpct_if_current:N #1 {T,F,TF}
   {
-    \bool_if:nT
-      {
-        \int_compare_p:n { \l__fnpct_multiple_notes_int > 0 }
-         &&
-         \int_compare_p:n
-           {
-             \l__fnpct_multiple_notes_int
-               <
-             \seq_count:N \l__fnpct_multiple_footnotes_seq
-           }
-      }
-      {
-        \IfBooleanTF {#1}
-          { \tex_unskip:D  }
-          { \textsuperscript { \l__fnpct_multiple_footnote_separator_tl } }
-      }
-    \IfBooleanTF {#1}
-      {
-        % TODO: maybe provide option to change \footnotetext? Or do it
-        % automatically?
-        \bool_gset_true:N \g__fnpct_only_text_bool
-        \IfNoValueTF {#2}
-          { \footnotetext {#4} }
-          { \footnotetext [#2] {#4} }
-      }
-      { \fnpct_write_note:Nnnn #5 {#2} {#3} {#4} }
-    \fnpct_write_inner:N #5
+    \tl_if_eq:NNTF \l__fnpct_current_tl #1
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
-
+\prg_generate_conditional_variant:Nnn \fnpct_if_current:N {c} {T}
+  
 % --------------------------------------------------------------------------
-% NESTED FOOTNOTES:
-% 1 layer of nesting...
-% this shouldn't be a document command! But for the time being I'll stick to
-% this easy solution...
-\NewDocumentCommand \fnpct_inner_footnote:w {o+m}
+% action macros
+\prg_new_conditional:Npnn \fnpct_if_collection: {p,T,F,TF}
   {
-    \IfNoValueTF {#1}
+    \bool_if:NTF \l__fnpct_collection_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \fnpct_if_ranges: {T,F,TF}
+  {
+    \bool_if:NTF \l__fnpct_ranges_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \fnpct_inside_range: {T,F,TF}
+  {
+    \bool_if:NTF \l__fnpct_inside_range_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }  
+
+% swapping:
+% #1: all the new footnote code, arguments already read
+% #2: the trailing punctuation
+\cs_new_protected:Npn \fnpct_swap:nn #1#2
+  {
+    \fnpct_if_collection:TF
       {
-        % TODO: maybe detect what type of note we're in and use the appropriate mark?
-        % Or provide a user interface to choose the appropriate mark?
-        \fnpct_orig_footnotemark:w
-        \prop_gput:Nxn \g__fnpct_inner_footnote_prop { \thefootnote } {#2}
-        \bool_if:NT \l__fnpct_hyperref_bool
+        \__fnpct_swap:nn
           {
-             \prop_gput:Nxo \g__fnpct_inner_footnote_hyperref_prop
-               { \thefootnote } { \Hy at footnote@currentHref }
+            \fnpct_before:
+            \fnpct_print_collection:
+            \fnpct_print_note:w #1
+            \fnpct_after:
           }
+          {#2}
       }
-      {
-        \fnpct_orig_footnotemark:w [#1]
-        \prop_gput:Nnn \g__fnpct_inner_footnote_prop {#1} {#2}
-          \bool_if:NT \l__fnpct_hyperref_bool
-          {
-             \prop_gput:Nno \g__fnpct_inner_footnote_hyperref_prop
-               {#1} { \Hy at footnote@currentHref }
-          }
-      }
+      { \__fnpct_swap:nn {#1} {#2} }
   }
 
-\cs_new_protected:Npn \fnpct_write_inner:N #1
+\cs_new_protected:Npn \__fnpct_swap:nn #1#2
   {
-    \token_if_eq_meaning:NNF #1 \fnpct_inner_footnote:w
+    \fnpct_if_switched:TF
       {
-        \prop_map_inline:Nn \g__fnpct_inner_footnote_prop
-          {
-            \footnotetext [##1]
-              {
-                \bool_if:NT \l__fnpct_hyperref_bool
-                  {
-                    \prop_get:NnN \g__fnpct_inner_footnote_hyperref_prop
-                      {##1} \l__fnpct_tmpa_tl
-                    \Hy at raisedlink
-                      { \exp_args:NV \hyper@@anchor \l__fnpct_tmpa_tl }
-                  }
-                ##2
-              }
-          }
-        \prop_gclear:N \g__fnpct_inner_footnote_prop
+        \use:nn
+          { \fnpct_skip_nobreak:N \l__fnpct_before_footnote_dim #1 }
+          { \fnpct_add_punctuation_space:n {before} #2 }
       }
+      { \use_ii_i:nn {#1} {#2} }
   }
 
-\NewDocumentCommand \writeinnernotes {}
-  { \fnpct_write_inner:N X }
+\cs_new:Npn \fnpct_print_note:w \fnpct_before: #1 \fnpct_after:
+{ \exp_not:n { #1 } }
 
-% --------------------------------------------------------------------------
-% MANUAL KERNING:
-\cs_new_protected:Npn \fnpct_kfp:
+% multiple footnotes and ranges:
+\cs_new_protected:Npn \__fnpct_collect:n #1
   {
-    \fnpct_no_break:
-    \prop_get:NnNT \l__fnpct_punctuation_marks_before_prop {.}
-      \l__fnpct_tmpa_tl
-      { \dim_set:Nn \l__fnpct_tmpa_dim { \l__fnpct_tmpa_tl } }
-    \prop_get:NnNT \l__fnpct_punctuation_marks_after_prop  {.}
-      \l__fnpct_tmpb_tl
-      { \dim_set:Nn \l__fnpct_tmpb_dim { \l__fnpct_tmpb_tl } }
-    \bool_if:NTF \l__fnpct_punct_after_bool
-      { \skip_horizontal:N \l__fnpct_tmpa_dim }
-      { \skip_horizontal:N \l__fnpct_tmpb_dim }
+    \int_incr:N \l__fnpct_collection_int
+    \seq_put_right:Nx \l__fnpct_collection_seq { \fnpct_print_note:w #1 }
   }
 
-\cs_new_protected:Npn \fnpct_kfc:
+% #1: all the new footnote code, arguments already read
+% #2: e.g. the token \footnote
+\cs_new_protected:Npn \fnpct_collect:nn #1#2
   {
-    \fnpct_no_break:
-    \prop_get:NnNT \l__fnpct_punctuation_marks_before_prop {,}
-      \l__fnpct_tmpa_tl
-      { \dim_set:Nn \l__fnpct_tmpa_dim { \l__fnpct_tmpa_tl } }
-    \prop_get:NnNT \l__fnpct_punctuation_marks_after_prop  {,}
-      \l__fnpct_tmpb_tl
-      { \dim_set:Nn \l__fnpct_tmpb_dim { \l__fnpct_tmpb_tl } }
-    \bool_if:NTF \l__fnpct_punct_after_bool
-      { \skip_horizontal:N \l__fnpct_tmpa_dim }
-      { \skip_horizontal:N \l__fnpct_tmpb_dim }
+    \fnpct_if_collection:F
+      {
+        % we're starting a collection
+        \seq_clear:N \l__fnpct_collection_seq
+        \int_set:Nn \l__fnpct_collection_int {1}
+        \bool_set_true:N \l__fnpct_collection_bool
+      }
+    \__fnpct_collect:n {#1}
+    #2
   }
 
-\NewDocumentCommand \kfp {} { \fnpct_kfp: }
-\NewDocumentCommand \kfc {} { \fnpct_kfc: }
-
-% --------------------------------------------------------------------------
-% NORMAL MARKS:
-\AtBeginDocument
+\cs_new_protected:Npn \fnpct_print_collection:
   {
-    \bool_if:NT \l__fnpct_normal_marks_bool
+    \bool_set_false:N \l__fnpct_collection_bool
+    \bool_set_true:N \l__fnpct_end_collection_bool
+    % DEBUG:
+    \fnpct_if_ranges:TF
       {
-        \cs_if_exist:NF \KOMAoption
-          { \RequirePackage { scrextend } }
-        \deffootnote
-          [ \l__fnpct_normal_mark_width_dim ]
-          { \l__fnpct_normal_indent_dim }
-          { \l__fnpct_normal_parindent_dim }
-          { \thefootnotemark . \enskip }
+        \seq_item:Nn \l__fnpct_collection_seq {1}
+        \seq_pop_left:NN \l__fnpct_collection_seq \l__fnpct_tmpa_tl
+        \tl_clear:N \l__fnpct_tmpa_tl
+        \bool_set_true:N \l__fnpct_inside_range_bool
+        \seq_use:Nn \l__fnpct_collection_seq { }
+        \bool_set_false:N \l__fnpct_inside_range_bool
+        \int_compare:nNnTF \l__fnpct_collection_int = {2}
+          { \__fnpct_separate: }
+          { \l__fnpct_range_tl }
       }
+      {
+        \seq_use:Nn \l__fnpct_collection_seq { \__fnpct_separate: }
+        \__fnpct_separate:
+      }
   }
 
+\cs_new_protected:Npn \__fnpct_separate:
+  {
+    \bool_if:NTF \g__fnpct_text_bool
+      { \bool_gset_false:N \g__fnpct_text_bool }
+      { \l__fnpct_separate_tl }
+  }
+
 % --------------------------------------------------------------------------
-% LET'S MAKE IT EASIER TO ADAPT EXISTING FUNCTIONS:
-% COPY, RENEW AND CREATE MULT
+% define some classes and actions:
+\fnpct_new_class:n {punctuation}
+\fnpct_new_class:n {note}
 
-\prg_new_conditional:Npnn \fnpct_if_adapted:N #1 {p,T,F,TF}
+\fnpct_new_action:nnnnn {dot}   {punctuation} {-.16em} {-0.06em} { \fnpct_swap:nn }
+\fnpct_new_action:nnnnn {comma} {punctuation} {-.16em} {-0.06em} { \fnpct_swap:nn }
+\fnpct_new_action:nnnnn {collect} {note} {0pt} {0pt} { \fnpct_collect:nn }
+
+\fnpct_new_trailing_token:Nn . {dot}
+\fnpct_new_trailing_token:Nn , {comma}
+
+% #1: default before dim
+% #2: token
+% #3: default after dim
+% #4: name
+\NewDocumentCommand \AddPunctuation {O{0pt}mO{0pt}m}
   {
-    \prop_if_in:NnTF \g__fnpct_adapted_notes_prop {#1}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \fnpct_new_action:nnnnn {#4} {punctuation} {#1} {#3} { \fnpct_swap:nn }
+    \fnpct_new_trailing_token:Nn #2 {#4}
+    \keys_set:nn {fnpct} { activate-trailing-tokens = #2 }
   }
 
-\cs_new_protected:Npn \fnpct_add_to_adapted:NN #1#2
+% --------------------------------------------------------------------------
+% build up the frame for the adapted note commands:
+
+\prg_new_conditional:Npnn \fnpct_if_switched: {p,T,F,TF}
   {
-    % \tl_show:n {1:~#1} \tl_show:n {2:~#2}
-    \prop_gput:Nnn \g__fnpct_adapted_notes_prop {#1} {#2}
+    \bool_if:NTF \l__fnpct_switched_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-% standard \footnote[<mark>]{<text>} like commands
-% #1: old new name
-% #2: internal name of old definition
-% #3: mult-variant
-%
-% \footnote[<mark>]{<text>} like:
-\cs_new_protected:Npn \fnpct_renew_and_mult:NNN #1#2#3
+\cs_new_protected:Npn \__fnpct_execute: {}
+
+% #1: boolean
+\cs_new_protected:Npn \fnpct_begin:
+  { \__fnpct_check_after_end:w }
+
+% #1: code
+\cs_new_protected:Npn \__fnpct_check_after_end:w #1 \fnpct_end:
   {
-    \fnpct_if_adapted:NF #1
+    \cs_set_protected:Npn \__fnpct_execute:
       {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \fnpct_create_mult_variant:NN #3#2
-        \bool_if:NTF \l__fnpct_multiple_default_bool
-          { \cs_set_eq:NN #1#3 }
+        \__fnpct_check_trail:NTF \l_peek_token
           {
-            \RenewDocumentCommand #1 {so+m}
-              { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } {##3} {##1} }
+            \prop_get:NVN \l__fnpct_trailing_actions_prop
+              \l_fnpct_trailing_token_tl
+              \l_fnpct_action_tl
+            \fnpct_do_action:Vnw \l_fnpct_action_tl {#1}
           }
-      }
-  }
-\cs_generate_variant:Nn \fnpct_renew_and_mult:NNN {ccc,NcN}
-
-% \footnote{<text>} like:
-\cs_new_protected:Npn \fnpct_renew_and_mult_no_opt:NNN #1#2#3
-  {
-    \fnpct_if_adapted:NF #1
-      {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \fnpct_create_mult_variant:NN #3#2
-        \bool_if:NTF \l__fnpct_multiple_default_bool
-          { \cs_set_eq:NN #1#3 }
           {
-            \RenewDocumentCommand #1 {s+m}
+            % no trailing punctuation
+            \bool_lazy_or:nnT
+              { \fnpct_if_collection_p: }
+              { \fnpct_if_switched_p: }
               {
-                \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value }
-                  {##2} {##1}
+                \fnpct_skip_nobreak:N \l__fnpct_before_footnote_dim
+                \fnpct_if_collection:T { \fnpct_print_collection: }
               }
+              #1
           }
+        \fnpct_end:
       }
+    \peek_after:Nw \__fnpct_execute:
   }
-\cs_generate_variant:Nn \fnpct_renew_and_mult_no_opt:NNN {Nc,ccc}
 
-% renew but don't create mult-variant:
-% \footnote[<mark>]{<text>} like:
-\cs_new_protected:Npn \fnpct_renew:NN #1#2
+\cs_new_protected:Npn \fnpct_end: { }
+
+\cs_new_protected:Npn \fnpct_before:
   {
-    \fnpct_if_adapted:NF #1
+    \bool_if:NF \l__fnpct_dont_mess_around_bool 
       {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \RenewDocumentCommand #1 {so+m}
-          { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } {##3} {##1} }
+        \fnpct_if_switched:F
+          { \fnpct_add_punctuation_space:n {after} }
+         \bool_if:NF \l_fnpct_trailing_action_bool
+           { % no punctiation following
+             \bool_if:NF \l__fnpct_end_collection_bool
+               { \fnpct_skip_nobreak:N \l__fnpct_before_footnote_dim }
+           }
       }
   }
-\cs_generate_variant:Nn \fnpct_renew:NN {cc,Nc}
 
-% new
-\cs_new_protected:Npn \fnpct_new:NN #1#2
+\cs_new_protected:Npn \fnpct_add_punctuation_space:n #1
   {
-    \fnpct_if_adapted:NF #1
+    \fnpct_if_class:nT {punctuation}
       {
-        \fnpct_add_to_adapted:NN #1#2
-        \NewDocumentCommand #1 {so+m}
-          { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } {##3} {##1} }
+        \fnpct_foreach_action:nn {punctuation}
+          {
+            \fnpct_if_action:nT {##1}
+              {
+                \fnpct_skip_nobreak:c {l__fnpct_#1_##1_dim}
+                \fnpct_action_break:
+              }
+          }
       }
   }
-\cs_generate_variant:Nn \fnpct_new:NN {cc,Nc}
-
-% \note[<mark>][<oarg>]{<text>} like:
-\cs_new_protected:Npn \fnpct_renew_and_mult_opt:NNN #1#2#3
+  
+\cs_new_protected:Npn \fnpct_after:
   {
-    \fnpct_if_adapted:NF #1
+    \bool_if:NF \l__fnpct_dont_mess_around_bool
       {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \fnpct_create_mult_variant:NN #3#2
-        \bool_if:NTF \l__fnpct_multiple_default_bool
-          { \cs_set_eq:NN #1#3 }
+        \fnpct_if_switched:T
           {
-            \RenewDocumentCommand #1 {soo+m}
-              { \fnpct_handle_note:Nnnnn #2 {##2} {##3} {##4} {##1} }
+            \fnpct_if_class:nT {punctuation}
+              {
+                \bool_set_false:N \l__fnpct_collection_bool
+                \fnpct_foreach_action:nn {punctuation}
+                  {
+                    \fnpct_if_action:nT {##1}
+                      {
+                        \fnpct_skip_nobreak:c {l__fnpct_before_##1_dim}
+                        \fnpct_action_break:
+                      }
+                  }
+              }
+            \bool_set_false:N \l__fnpct_end_collection_bool
+            \bool_set_false:N \l__fnpct_switched_bool
           }
       }
   }
-\cs_generate_variant:Nn \fnpct_renew_and_mult_opt:NNN {ccc,NcN}
 
-\cs_new_protected:Npn \fnpct_renew_opt:NN #1#2
+% #1: command
+% #2: argument spec
+% #3: code where #NOTE refers to the original note
+
+\cs_new_protected:Npn \fnpct_adapt_note:Nnn #1#2#3
   {
     \fnpct_if_adapted:NF #1
       {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \RenewDocumentCommand #1 {soo+m}
-          { \fnpct_handle_note:Nnnnn #2 {##2} {##3} {##4} {##1} }
+        \fnpct_save_note_command:N #1
+        \fnpct_new_trailing_token:Nn #1 {collect}
+        \keys_set:nn {fnpct} { activate-trailing-tokens = {#1} }
       }
+    \tl_set:Nn \l__fnpct_tmpa_tl {#3}
+    \regex_replace_all:nnN {\cP\#\cP\#} {$$$$} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#8} {\cP\#9} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#7} {\cP\#8} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#6} {\cP\#7} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#5} {\cP\#6} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#4} {\cP\#5} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#3} {\cP\#4} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#2} {\cP\#3} \l__fnpct_tmpa_tl
+    \regex_replace_all:nnN {\cP\#1} {\cP\#2} \l__fnpct_tmpa_tl
+    \regex_replace_all:nxN
+      {\cP\#NOTE}
+      {
+        \exp_not:N \c{fnpct_use_note_command:N}
+        \exp_not:N \c{\__fnpct_remove_backslash:N #1}
+      }
+      \l__fnpct_tmpa_tl
+    % we need to double inner arguments yet one more, so it can appear inside
+    % the replacement text of \__fnpct_execute:
+    \regex_replace_all:nnN {\$\$\$\$} {\cP\#\cP\#\cP\#\cP\#} \l__fnpct_tmpa_tl
+    \tl_put_left:Nn  \l__fnpct_tmpa_tl { \fnpct_start:w }
+    \tl_put_right:Nn \l__fnpct_tmpa_tl { \fnpct_stop: }
+    \use:x
+      {
+        \exp_not:n { \RenewDocumentCommand #1 {s#2} }
+          {
+            \exp_not:n { \fnpct_reverse:n {##1} }
+            \exp_not:V \l__fnpct_tmpa_tl
+          }
+      }
   }
-\cs_generate_variant:Nn \fnpct_renew_opt:NN {cc,Nc}
+\cs_generate_variant:Nn \fnpct_adapt_note:Nnn {c}
 
-% \note{<arg>} like
-\cs_new_protected:Npn \fnpct_renew_no_opt:NN #1#2
+\cs_new_protected:Npn \fnpct_reverse:n #1
   {
-    \fnpct_if_adapted:NF #1
-      {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \RenewDocumentCommand #1 {s+m}
-          { \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value } {##2} {##1} }
-      }
+    \bool_if:NTF \l__fnpct_reverse_bool
+      { \bool_if:nF }
+      { \bool_if:NT }
+    {#1} { \bool_set_true:N \l__fnpct_switched_bool }
   }
-\cs_generate_variant:Nn \fnpct_renew_no_opt:NN {cc,Nc}
 
-% \note like
-\cs_new_protected:Npn \fnpct_renew_no_arg:NN #1#2
+% #1: code
+\cs_new_protected:Npn \fnpct_start:w #1 \fnpct_stop:
   {
-    \fnpct_if_adapted:NF #1
-      {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \RenewDocumentCommand #1 {s}
-          { \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value } { } {##1} }
-      }
+    \fnpct_begin:
+    \fnpct_before:
+    \group_begin:
+    #1
+    \group_end:
+    \fnpct_after:
+    \fnpct_end:
   }
-\cs_generate_variant:Nn \fnpct_renew_no_arg:NN {cc}
 
-% create mult-variant
-\cs_new_protected:Npn \fnpct_create_mult_variant:NN #1#2
+\cs_new_protected:Npn \fnpct_text:
   {
-    \NewDocumentCommand #1 {s+m}
-      { \fnpct_mult_note:Nnn #2 {##1} {##2} }
+    \bool_set_false:N \l__fnpct_inside_range_bool
+    \bool_gset_true:N \g__fnpct_text_bool
   }
 
-% \footnotemark[<mark>] like commands:
-\cs_new_protected:Npn \fnpct_renew_mark:NN #1#2
+% --------------------------------------------------------------------------
+% #1: note command
+% #2: arguments
+% #3: counter name
+% #4: code
+\NewDocumentCommand \AdaptNote {mmom}
   {
-    \fnpct_if_adapted:NF #1
-      {
-        \fnpct_add_to_adapted:NN #1#2
-        \cs_new_eq:NN #2#1
-        \RenewDocumentCommand #1 {so}
-         { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } { } {##1} }
-      }
+    \fnpct_adapt_note:Nnn #1 {#2} {#4}
+    \IfNoValueF {#3}
+      { \fnpct_set_counter_name:Nn #1 {#3} }
   }
-\cs_generate_variant:Nn \fnpct_renew_mark:NN {cc,Nc}
 
-% user commands:
-\NewDocumentCommand \AdaptNote {mm}
+\NewDocumentCommand \AdaptNoteName {mmom}
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_and_mult:NcN #1 { fnpct_orig_ \cs_to_str:N #1 :w } #2 }
+    \fnpct_adapt_note:cnn {#1} {#2} {#4}
+    \IfNoValueF {#3}
+      { \fnpct_set_counter_name:cn {#1} {#3} }
   }
 
-\NewDocumentCommand \AdaptNoteNoMult {m}
+\NewDocumentCommand \AdaptText {mmm}
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
+    \fnpct_adapt_note:Nnn #1 {#2}
+      { \fnpct_text: #3 }
   }
 
-\NewDocumentCommand \AdaptNoteOpt {mm}
+\NewDocumentCommand \innernote {+m}
+  { \msg_warning:nn {fnpct} {command-removed} \use:n {#1} }
+
+\NewExpandableDocumentCommand \ifcurrentnoteTF {m}
+  { \fnpct_if_current:NTF #1 }
+
+\NewExpandableDocumentCommand \ifcurrentnoteT {m}
+  { \fnpct_if_current:NT #1 }
+
+\NewExpandableDocumentCommand \ifcurrentnoteF {m}
+  { \fnpct_if_current:NF #1 }
+
+% --------------------------------------------------------------------------
+% OPTIONS
+\NewDocumentCommand \setfnpct {m}
+  { \keys_set:nn {fnpct} {#1} }
+
+\cs_new_protected:Npn \fnpct_deprecate_option:n #1
+  { \msg_warning:nnVn {fnpct} {option-deprecated} \l_keys_key_str {#1} }
+
+\cs_new_protected:Npn \fnpct_deprecate_option:
+  { \msg_warning:nnV {fnpct} {option-deprecated} \l_keys_key_str }
+  
+\keys_define:nn {fnpct}
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_and_mult_opt:NcN #1 { fnpct_orig_ \cs_to_str:N #1 :w } #2 }
+    add-trailing-token         .code:n = \AddPunctuation #1 ,
+    activate-trailing-tokens   .code:n =
+      \tl_map_inline:nn {#1} { \fnpct_activate_trailing_token:n {##1} } ,
+    activate-trailing-tokens   .initial:n = {.,} ,
+    deactivate-trailing-tokens .code:n =
+      \tl_map_inline:nn {#1} { \fnpct_deactivate_trailing_token:n {##1} } ,
+    before-footnote-space      .dim_set:N = \l__fnpct_before_footnote_dim ,
+    before-footnote-space      .initial:n =  .06em ,
+    ranges                     .bool_set:N = \l__fnpct_ranges_bool ,
+    ranges                     .initial:n = false ,
+    keep-ranges                .bool_set:N = \l__fnpct_keep_ranges_bool ,
+    keep-ranges                .initial:n = false ,
+    dont-mess-around           .bool_set:N = \l__fnpct_dont_mess_around_bool ,
+    dont-mess-around           .initial:n = false ,
+    mult-fn-delim              .code:n =
+      \tl_set:Nn \l__fnpct_multiple_footnotes_delimiter_tl {#1} ,
+    separation-symbol          .code:n =
+      \renewcommand* \multfootsep {#1} ,
+    range-symbol               .code:n =
+      \renewcommand* \multfootrange {#1} ,
+    print-separation           .tl_set:N = \l__fnpct_separate_tl ,
+    print-separation           .initial:n = \textsuperscript { \multfootsep } ,
+    print-range                .tl_set:N = \l__fnpct_range_tl ,
+    print-range                .initial:n = \textsuperscript { \multfootrange } ,
+    reverse                    .bool_set:N = \l__fnpct_reverse_bool ,
+    after-punct-space          .code:n =
+      \fnpct_foreach_action:nn {punctuation}
+        { \keys_set:nn {fnpct} { after-##1-space = #1 } } ,
+    before-punct-space         .code:n =
+      \fnpct_foreach_action:nn {punctuation}
+        { \keys_set:nn {fnpct} { before-##1-space = #1 } }
   }
 
-\NewDocumentCommand \AdaptNoteOptNoMult {m}
+% deprecate options of earlier version unless it still exists:
+\clist_map_inline:nn
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_opt:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
+    bigfoot-default-top ,
+    strict ,
+    after-comma-space ,
+    after-dot-space ,
+    before-comma-space ,
+    before-dot-space ,
+    after-punct-space ,
+    before-punct-space ,
+    before-footnote-space ,
+    french-before-footnote-space ,
+    punct-after ,
+    dont-mess-around ,
+    mult-fn-delim ,
+    mult-fn-sep ,
+    multiple ,
+    normal-marks ,
+    normal-mark-width ,
+    normal-indent ,
+    normal-parindent ,
+    verb-format ,
+    add-punct-marks ,
+    remove-punct-marks ,
   }
+  {
+    \keys_if_exist:nnF {fnpct} {#1}
+      { \keys_define:nn {fnpct} { #1 .code:n = \fnpct_deprecate_option: } }
+  }
 
-\NewDocumentCommand \AdaptNoteNoOpt {mm}
+% --------------------------------------------------------------------------
+% define \multfootnote and friends for some transition period
+
+\cs_new_protected:Npn \fnpct_create_mult_variant:N #1
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_and_mult_no_opt:NcN #1 { fnpct_orig_ \cs_to_str:N #1 :w } #2 }
+    \exp_args:Nc \NewDocumentCommand
+      { mult \__fnpct_remove_backslash:N #1 }
+      { sm }
+      {
+        \seq_set_split:NVn \l__fnpct_tmpa_seq
+          \l__fnpct_multiple_footnotes_delimiter_tl
+          {##2}
+        \tl_clear:N \l__fnpct_tmpa_tl
+        \seq_map_inline:Nn \l__fnpct_tmpa_seq
+          {
+            \tl_put_right:Nx \l__fnpct_tmpa_tl
+              { \exp_not:n {#1} \IfBooleanT{##1}{*} \exp_not:n {{####1}} }
+          }
+        \l__fnpct_tmpa_tl
+      }
   }
+\cs_generate_variant:Nn \fnpct_create_mult_variant:N {c}
 
-\NewDocumentCommand \AdaptNoteNoOptNoMult {m}
+\NewDocumentCommand \MultVariant {m}
+  { \fnpct_create_mult_variant:N #1 }
+
+\NewDocumentCommand \MultVariantName {m}
+  { \fnpct_create_mult_variant:c {#1} }
+
+% --------------------------------------------------------------------------
+% TAKE CARE OF FRENCH SETTINGS  
+\RequirePackage {translations}
+\hook_gput_code:nnn {begindocument/end} {fnpct}
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1:w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_no_opt:Nc #1 { fnpct_orig_ \cs_to_str:N #1:w } }
+    \ifcurrentbaselanguage {French}
+      {
+        \cs_set_eq:NN \@footnotemark \@footnotemarkORI
+        \StandardFootnotes
+        \keys_set:nn {fnpct} { before-footnote-space = .16667em }
+      }
+      {}
   }
 
-\NewDocumentCommand \AdaptNoteMark {m}
+% --------------------------------------------------------------------------
+
+\hook_gput_code:nnn {begindocument} {fnpct}
   {
-    \cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
-      { \fnpct_message:nx {already-adapted} {#1} }
-      { \fnpct_renew_mark:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
+    \fnpct_if_class_loaded:nTF {memoir}
+      { \renewcommand* }
+      { \providecommand* }
+    \multfootsep {,}
+    \providecommand* \multfootrange {--}
+    \tl_set:Nn \l__fnpct_range_tl { \textsuperscript { \multfootrange } }
   }
 
 % --------------------------------------------------------------------------
 % DO THE REDEFINING:
 %
-% `bigfoot' loads `manyfoot' which saves its footnote classes in a 2e list:
-\str_const:Nn \c__fnpct_footins_str {\footins}
-\str_remove_once:Nn \c__fnpct_footins_str {~}
+% before we start make the testing more comfortable:
+\cs_new_protected:Npn \fnpct_treatment:nn #1#2
+  { \fnpct_if_package_loaded:nT {#1} {#2} }
+
+\cs_new_protected:Npn \fnpct_special_treatment:nn #1#2
+  {
+    \fnpct_if_package_loaded:nTF {#1} {#2}
+      { \hook_gput_code:nnn {package/after/#1} {fnpct} {#2} }
+  }
+
+% `manyfoot' (loaded by `bigfoot') saves its footnote classes in a 2e list:
+\str_new:N \l__fnpct_footins_str
+\str_set:Nn \l__fnpct_footins_str {\footins}
+\str_remove_once:Nn \l__fnpct_footins_str {~}
 \cs_new_protected:Npn \__fnpct_grab_second:Nnw #1#2#3 \q_stop
   {
     \str_set:Nn \l__fnpct_tmpa_str {#3}
     \str_remove_once:Nn \l__fnpct_tmpa_str {~}
-    \str_remove_once:NV \l__fnpct_tmpa_str \c__fnpct_footins_str
+    \str_remove_once:NV \l__fnpct_tmpa_str \l__fnpct_footins_str
     \seq_put_right:Nx #1 { \l__fnpct_tmpa_str }
   }
 
 \cs_new_protected:Npn \__fnpct_get_fnclasses:NN #1#2
   {
-    \seq_set_split:NnV \l__fnpct_tmpa_seq {\@elt } #1
+    \seq_set_split:NnV \l__fnpct_tmpa_seq { \@elt } #1
     \seq_pop_left:NN \l__fnpct_tmpa_seq \l__fnpct_tmpa_tl
     \seq_map_inline:Nn \l__fnpct_tmpa_seq
       { \__fnpct_grab_second:Nnw #2 ##1 \q_stop }
@@ -943,222 +1039,307 @@
     \seq_remove_duplicates:N #2
   }
 
-% before we start make the testing more comfortable:
-\cs_new_protected:Npn \fnpct_treatment:nn #1#2
-  { \fnpct_if_package_loaded:nT {#1} {#2} }
+% `fixfoot' package
+\fnpct_special_treatment:nn {fixfoot}
+  {
+    % hook into \DeclareFixedFootnote so we can redefine all fixed footnotes
+    % defined be users
+    \seq_new:N \l__fnpct_footnote_fixfoot_seq
+    \cs_new_eq:NN \fnpct_new_fixnote:w \DeclareFixedFootnote
+    \RenewDocumentCommand \DeclareFixedFootnote {smm}
+      {
+        \seq_put_right:Nn \l__fnpct_footnote_fixfoot_seq {#2}
+        \IfBooleanTF {#1}
+          { \fnpct_new_fixnote:w * {#2} {#3} }
+          { \fnpct_new_fixnote:w {#2} {#3} }
+      }
+  }
 
-\cs_new_protected:Npn \fnpct_special_treatment:nn #1#2
-  { \fnpct_if_package_loaded:nTF {#1} {#2} { \AfterPackage* {#1} {#2} } }
+% `pagenote' package:
+\fnpct_special_treatment:nn {pagenote}
+  {
+    \bool_new:N \l__fnpct_makepagenote_bool
+    \tl_put_left:Nn \makepagenote
+      { \bool_set_true:N \l__fnpct_makepagenote_bool }
+  }
 
-% and now get going:
-\AtBeginDocument
+\fnpct_special_treatment:nn {sepfootnotes}
   {
-    \fnpct_if_package_loaded:nTF {hyperref}
-      { \bool_set_true:N \l__fnpct_hyperref_bool  }
+    \cs_new_eq:NN \fnpct_sepfootnote_new:n \sep at new
+    \seq_new:N \l__fnpct_sepfootnotes_seq
+    \cs_set_protected:Npn \sep at new #1 {
+      \seq_put_right:Nn \l__fnpct_sepfootnotes_seq {#1}
+      \fnpct_sepfootnote_new:n {#1}
+    }
+  }
+  
+\hook_gput_code:nnn {begindocument} {fnpct}
+  {
+    \fnpct_if_package_loaded:nT {hyperref}
       {
-        \cs_if_exist:NF \AfterBeginDocument
-          { \cs_new:Npn \AfterBeginDocument #1 {#1} }
+        \fnpct_if_ranges:T
+          {
+            \bool_if:NTF \l__fnpct_keep_ranges_bool
+              { \msg_warning:nn {fnpct} {keep-ranges-hyperref} }
+              {
+                \msg_warning:nn {fnpct} {ranges-hyperref}
+                \bool_set_false:N \l__fnpct_ranges_bool
+                \keys_define:nn {fnpct}
+                  { ranges .code:n = \msg_warning:nn {fnpct} {ranges-disabled} }
+              }
+          }
       }
-    \AfterBeginDocument
+    %% LaTeX's defaults:
+    \fnpct_if_class_loaded:nTF {beamer}
       {
-        \AdaptNote \footnote \multfootnote
-        \AdaptNoteMark \footnotemark
-        \cs_if_exist:NT \footref
-          { \AdaptNoteNoOptNoMult \footref }
-        \fnpct_new:NN \innernote \fnpct_inner_footnote:w
-        %% the `endnotes' package:
-        \fnpct_treatment:nn {endnotes}
+        \AdaptNote \footnote{d<>o+m} [\beamer at mpfn]
           {
-            \AdaptNote \endnote \multendnote
-            \AdaptNoteMark \endnotemark
+            \IfNoValueTF{#1}
+              {\IfNoValueTF{#2}{#NOTE{#3}}{#NOTE[#2]{#3}}}
+              {\IfNoValueTF{#2}{#NOTE<#1>{#3}}{#NOTE<#1>[#2]{#3}}}
           }
-        %% the `enotez' package:
-        \fnpct_treatment:nn {enotez}
-          { \AdaptNote \endnote \multendnote }
-        %% the `snotez' package:
-        \fnpct_treatment:nn {snotez}
+        \AdaptNote \footnotemark {o} [\beamer at mpfn]
+          { \IfNoValueTF {#1} {#NOTE} {#NOTE[#1]} }
+      }
+      {
+        \AdaptNote  \footnote {o+m} [\@mpfn]
+          { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+        \AdaptNote \footnotemark {o} [\@mpfn]
+          { \IfNoValueTF {#1} {#NOTE} {#NOTE[#1]} }
+      }
+    \fnpct_if_multiple:T { \MultVariant \footnote }
+    % TODO: should we adapt \thanks? Not with memoir, though...
+    % \AdaptNote \thanks {+m} { \cs_set_eq:NN \rlap \use:n #NOTE{#1} }
+    %% KOMA-Script and memoir:
+    \cs_if_exist:NT \footref
+      { \AdaptNote \footref {m} { #NOTE{#1} } }
+    %% snotez:
+    \fnpct_treatment:nn {snotez}
+      {
+        \AdaptNote \sidenote {d()oo+m}
           {
-            \AdaptNoteOpt \sidenote \multsidenote
-            \AdaptNoteMark \sidenotemark
+            \IfNoValueTF {#1}
+              {
+                \IfNoValueTF {#2}
+                  {#NOTE{#4}}
+                  { \IfNoValueTF {#3} {#NOTE[#2]{#4}} {#NOTE[#2][#3]{#4}} }
+              }
+              { \IfNoValueTF {#2} {#NOTE(#1){#4}} {#NOTE(#1)[#2]{#4}} }
           }
-        %% the `parnotes' package:
-        \fnpct_treatment:nn {parnotes}
-          { \AdaptNote \parnote \multparnote }
-        %% the `pagenote' package:
-        \fnpct_treatment:nn {pagenote}
+        \AdaptNote \sidenotemark {o} [sidenote]
+          { \IfNoValueTF {#1} {#NOTE} {#NOTE[#1]} }
+        \fnpct_if_multiple:T { \MultVariant \sidenote }
+      }
+    % sidenotes:
+    \fnpct_treatment:nn {sidenotes}
+      {
+        % `sidenotes' implements its \sidenote in terms of the user
+        % commands \sidenotemark and \sidenotetext; this makes it quite
+        % difficult if not impossible to adapt its commands
+        \msg_warning:nnn {fnpct} {cannot-adapt} {sidenotes}
+      }
+    \bool_lazy_or:nnT
+      { \fnpct_if_class_loaded_p:n {tufte-handout} }
+      { \fnpct_if_class_loaded_p:n {tufte-book} }
+      {
+        \fnpct_if_ranges:TF
           {
-            \bool_if:NTF \l__fnpct_makepagenote_bool
-              { \AdaptNote \pagenote \multpagenote }
-              { \msg_warning:nn {fnpct} {pagenote} }
+            \msg_warning:nnnn {fnpct} {cannot-adapt-with-ranges}
+              {tufte-latex}
+              {
+                The~ command~ \sidenote~ misses~ a~ suitable~ \sidenotetext~
+                version.
+              }
           }
-        %% the `tablefootnote' package:
-        \fnpct_treatment:nn {tablefootnote}
-          { \AdaptNote \tablefootnote \multtablefootnote }
-        %% the `manyfoot' package (also loaded by `bigfoot'):
-        \fnpct_treatment:nn {manyfoot}
           {
-            \__fnpct_get_fnclasses:NN \MFL at list \l__fnpct_footnote_class_seq
-            \seq_map_inline:Nn \l__fnpct_footnote_class_seq
+            \AdaptNote \sidenote {oo+m} [\@mpfn]
               {
-                \str_if_eq:nnTF {#1} {default}
+                \IfNoValueTF {#1}
+                  {#NOTE{#3}}
+                  { \IfNoValueTF {#2} {#NOTE[#1]{#3}} {#NOTE[#1][#2]{#3}} }
+              }
+          }
+      }
+    %% endnotes:
+    \fnpct_treatment:nn {endnotes}
+      {
+        \AdaptNote \endnote {o+m}
+          { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+        \AdaptNote \endnotemark {o} [endnote]
+          { \IfNoValueTF {#1} {#NOTE} {#NOTE[#1]} }
+        \fnpct_if_multiple:T { \MultVariant \endnote }
+      }
+    % enotez:
+    \fnpct_treatment:nn {enotez}
+      {
+        \AdaptNote \endnote {o+m} { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+        \AdaptNote \endnotemark {o} [endnote] { \IfNoValueTF {#1} {#NOTE} {#NOTE{#1}} }
+        \fnpct_if_multiple:T { \MultVariant \endnote }
+        \hook_gput_code:nnn {fnpct/rangesetup} {enotez}
+          {
+             \fnpct_if_current:NT \endnote
+              { \int_gincr:N \g__enotez_endnote_id_int }
+          }
+      }
+    %% manyfoot/bigfoot
+    \fnpct_treatment:nn {manyfoot}
+      {
+        \__fnpct_get_fnclasses:NN \MFL at list \l__fnpct_footnote_class_seq
+        \seq_map_inline:Nn \l__fnpct_footnote_class_seq
+          {
+            \str_if_eq:nnTF {#1} {default}
+              {
+                \cs_if_exist:NT \footnotedefault
                   {
-                    \cs_if_exist:NT \footnotedefault
-                      {
-                        \fnpct_renew_and_mult:ccc {footnote#1}
-                          {fnpct_orig_footnote#1:w}
-                          {multfootnote#1}
-                        \fnpct_renew_mark:cc {footnotemark#1}
-                          {fnpct_orig_footnotemark#1:w}
-                      }
+                    \AdaptNoteName {footnote#1} {o+m}
+                      { \IfNoValueTF {##1} {##NOTE{##2}} {##NOTE[##1]{##2}} }
+                    \AdaptNoteName {footnotemark#1} {o} [footnote#1]
+                      { \IfNoValueTF {##1} {##NOTE} {##NOTE[##1]} }
+                    \fnpct_if_multiple:T { \MultVariantName {footnote#1} }
                   }
-                  {
-                    \fnpct_renew_and_mult:ccc {footnote#1}
-                      {fnpct_orig_footnote#1:w}
-                      {multfootnote#1}
-                    \fnpct_renew_mark:cc {footnotemark#1}
-                      {fnpct_orig_footnotemark#1:w}
-                  }
               }
+              {
+                \AdaptNoteName {footnote#1} {o+m}
+                  { \IfNoValueTF {##1} {##NOTE{##2}} {##NOTE[##1]{##2}} }
+                \AdaptNoteName {footnotemark#1} {o} [footnote#1]
+                  { \IfNoValueTF {##1} {##NOTE} {##NOTE[##1]} }
+                \fnpct_if_multiple:T { \MultVariantName {footnote#1} }
+              }
           }
-        %% the `bigfoot' package:
-        \fnpct_special_treatment:nn {bigfoot}
+      }
+    %% fixfoot
+    \fnpct_treatment:nn {fixfoot}
+      {
+        \fnpct_if_ranges:TF
           {
-            \cs_if_exist:NT \footnotedefault
+            \msg_warning:nnnn {fnpct} {cannot-adapt-with-ranges}
+              {fixfoot}
               {
-                % re-set basics:
-                \cs_set_eq:NN \footnote \footnotedefault
-                \cs_set_eq:NN \footnotemark \footnotemarkdefault
-                \cs_set_eq:NN \multfootnote \multfootnotedefault
+                There~ cannot~ be~ suitable~ \..text~ versions~ for~ the~
+                fixed~ notes.
               }
           }
-        %% the `fixfoot' package:
-        \fnpct_treatment:nn {fixfoot}
           {
-            \prop_map_inline:Nn \l__fnpct_footnote_fixfoot_prop
-              { \fnpct_renew_no_arg:cc {#2} {fnpct_orig_fix_#2:w} }
+            \seq_map_inline:Nn \l__fnpct_footnote_fixfoot_seq
+              { \AdaptNote #1 {} { ##NOTE } }
           }
-        %% the `sepfootnotes' package:
-        \fnpct_treatment:nn {sepfootnotes}
+      }
+    %% pagenote
+    \fnpct_treatment:nn {pagenote}
+      {
+        \fnpct_if_ranges:TF
           {
-            \prop_map_inline:Nn \l__fnpct_sepfootnote_foot_classes_prop
+            \msg_warning:nnnn {fnpct} {cannot-adapt-with-ranges}
+              {pagenote}
               {
-                \fnpct_renew_and_mult_no_opt:ccc {#2note}
-                  {fnpct_orig_sep_#2:w} {#2multnote}
-                \fnpct_renew_and_mult_no_opt:ccc {#2quicknote}
-                  {fnpct_orig_sep_#2_quick:w} {#2multquicknote}
-                \fnpct_renew_no_opt:cc {#2notemark} {fnpct_orig_sep_#2_mark:w}
+                The~ command~ \pagenote~ misses~ a~ suitable~ \pagenotetext~
+                version.
               }
-            \prop_map_inline:Nn \l__fnpct_sepfootnote_end_classes_prop
+          }
+          {
+            \bool_if:NTF \l__fnpct_makepagenote_bool
               {
-                \fnpct_renew_and_mult_no_opt:ccc {#2note}
-                  {fnpct_orig_sep_#2:w} {#2multnote}
-                \fnpct_renew_no_opt:cc {#2notemark} {fnpct_orig_sep_#2_mark:w}
+                \AdaptNote \pagenote {o+m}
+                  { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+                \fnpct_if_multiple:T { \MultVariant \pagenote }
               }
+              { \msg_warning:nn {fnpct} {pagenote} }
           }
       }
-  }
-
-% `bigfoot' package
-% \fnpct_special_treatment:nn {fixfoot}
-%   {
-%     \bool_if:NT \l__fnpct_bigfoot_default_top_bool
-%       { \DeclareNewFootnote {default} }
-%   }
-
-% `fixfoot' package
-\fnpct_special_treatment:nn {fixfoot}
-  {
-    % hook into \DeclareFixedFootnote so we can redefine all footnote
-    % classes defined be users
-    \cs_new_eq:NN \fnpct_new_fixnote:w \DeclareFixedFootnote
-    \RenewDocumentCommand \DeclareFixedFootnote {smm}
+    %% parnotes
+    \fnpct_treatment:nn {parnotes}
       {
-        \prop_put:Nnx \l__fnpct_footnote_fixfoot_prop {#2}
-          { \cs_to_str:N #2 }
-        \IfBooleanTF {#1}
-          { \fnpct_new_fixnote:w * {#2} {#3} }
-          { \fnpct_new_fixnote:w {#2} {#3} }
+        \fnpct_if_ranges:TF
+          {
+            \msg_warning:nnnn {fnpct} {cannot-adapt-with-ranges}
+              {parnotes}
+              {
+                The~ command~ \parnote~ misses~ a~ suitable~ \parnotetext~
+                version.
+              }
+          }
+          {
+            \AdaptNote \parnote {o+m}
+              { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+            \fnpct_if_multiple:T { \MultVariant \parnote }
+          }
       }
-  }
-
-% `pagenote' package:
-\fnpct_special_treatment:nn {pagenote}
-  {
-    \tl_put_left:Nn \makepagenote
-      { \bool_set_true:N \l__fnpct_makepagenote_bool }
-  }
-
-% `sepfootnotes' package:
-\fnpct_special_treatment:nn {sepfootnotes}
-  {
-    \cs_new_eq:NN \fnpct_orig_new_footnotes:w \newfootnotes
-    \cs_new_eq:NN \fnpct_orig_new_endnotes:n \newendnotes
-    \cs_new_eq:NN \fnpct_orig_new_symbolnotes:w \newsymbolfootnotes
-    \RenewDocumentCommand \newfootnotes {sm}
+    %% tablefootnote
+    \fnpct_treatment:nn {tablefootnote}
       {
-        \prop_put:Nnn \l__fnpct_sepfootnote_foot_classes_prop {#2} {#2}
-        \IfBooleanTF {#1}
-          { \fnpct_orig_new_footnotes:w * {#2} }
-          { \fnpct_orig_new_footnotes:w {#2} }
+        \fnpct_if_ranges:TF
+          {
+            \msg_warning:nnnn {fnpct} {cannot-adapt-with-ranges}
+              {tablefootnote}
+              {
+                The~ command~ \tablefootnote~ misses~ a~ suitable~
+                \tablefootnotetext~ version.
+              }
+          }
+          {
+            \AdaptNote \tablefootnote {o+m} [footnote]
+              { \IfNoValueTF {#1} {#NOTE{#2}} {#NOTE[#1]{#2}} }
+          }
       }
-    \RenewDocumentCommand \newendnotes {m}
-      {
-        \prop_put:Nnn \l__fnpct_sepfootnote_end_classes_prop {#1} {#1}
-        \fnpct_orig_new_endnotes:n {#1}
-      }
-    \RenewDocumentCommand \newsymbolfootnotes {om}
-      {
-        \prop_put:Nnn \l__fnpct_sepfootnote_symbol_classes_prop {#2} {#2}
-        \IfNoValueTF {#1}
-          { \fnpct_orig_new_symbolnotes:w {#2} }
-          { \fnpct_orig_new_symbolnotes:w [#1] {#2} }
-      }
-  }
-
-% --------------------------------------------------------------------------
-\RequirePackage{translations}
-\AtBeginDocument{
-  \ifcurrentbaselanguage{French}
+    %% sepfootnotes
+    \fnpct_treatment:nn {sepfootnotes}
     {
-      \AfterBeginDocument{
-        \cs_if_exist:NT \@footnotemarkORI
+        \cs_set:Nn \__fnpct_sep_mark:n {\footnotemark}
+        \seq_map_inline:Nn \l__fnpct_sepfootnotes_seq
           {
-            \let\@footnotemark\@footnotemarkORI
-            \setfnpct{
-              before-footnote-space =
-                \l__fnpct_french_before_footnote_space_dim
-            }
+            \cs_if_eq:cNTF {#1notemark} \__fnpct_sep_mark:n
+              {% defined with \newfootnotes
+                \AdaptNoteName {#1note} {m} [\@mpfn] {##NOTE{##1}}
+              }
+              {% defined with \newfootnotes* or \newendnotes
+                \AdaptNoteName {#1note} {m} {##NOTE{##1}}
+                \hook_gput_code:nnn {fnpct/rangesetup} {sepfootnotes}
+                  {
+                    \fnpct_if_current:cT {#1note}
+                      {
+                        \addtocounter {#1note} {-1}
+                        \sep at refstepcounter {#1note}
+                      }
+                  }
+              }
+            \AdaptNoteName {#1notemark} {m} {##NOTE{##1}}
+            \AdaptNoteName {#1quicknote} {m} {##NOTE{##1}}
+            \fnpct_if_multiple:T { \MultVariantName {#1note} }
+            \fnpct_if_multiple:T { \MultVariantName {#1quicknote} }
           }
       }
-    }{}
-}
+  }
+\file_input_stop:
 
 % --------------------------------------------------------------------------
-% SETUP COMMAND:
-\NewDocumentCommand \setfnpct {m}
-  { \keys_set:nn {fnpct} {#1} }
+% OTHER PACKAGES:
+# should just work:
+footnpag
+ednotes
+yafoot
 
-\file_input_stop:
+# cannot be adapted for the time being:
+sidenotes
 
+# works:
+endnotes
+snotez
+footmisc
+footnote (not the environment)
+manyfoot
+bigfoot
+enotez
+sepfootnotes
+
+# works, but not with ranges:
+fixfoot
+pagenote
+parnotes
+tablefootnote
+
 % --------------------------------------------------------------------------
 % HISTORY:
-2012/05/18 v0.1alpha  - various changes still possible without announcement
-                        until declared `v0.1'
-2012/05/19 v0.1beta   - considered ready for public use, needs feedback, though
-2012/05/20 v0.1beta-a - minor changes
-2012/05/20 v0.1beta-b - added `pagenote' support
-                      - added `tablefootnote' support
-2012/05/20 v0.1beta-c - optional star argument to \multfootnote that only invokes
-                        \footnotetext
-                      - option `dont-mess-around': disable switching and kerning
-2012/05/21 v0.1beta-d - \innernote for nesting
-                      - `hyperref' support
-                      - bugfix in \multfootnote
-2012/05/21 v0.1beta-e - `sepfootnotes' support
-2012/05/22 v0.1beta-f - reorganized code
-2012/05/22 v0.1       - a bit more cleaning up of the code
-                      - completed documentation
-                      - ready for CTAN
+2012/05/22 v0.1       - ready for CTAN
 2012/05/23 v0.1a      - \AdaptNoteNoMult, \AdaptNoteOpt, \AdaptNoteOptNoMult
                       - support `sidenotes' package
                       - better support for citing commands
@@ -1212,9 +1393,11 @@
 2019/10/05 v0.5       - fix issue 18
                       - remove option `bigfoot-default-top'
                       - support `manyfoot' package
-
-% --------------------------------------------------------------------------
-% NOTES:
-- `footnote' package => not compatible
-- `ednotes' package  => not tested; who knows?
-- `sidenotes' package => mot easily patchable, see pull request #1
+2020/01/12 v0.5a      - support `snotez' with `dblrg=false'
+2021/01/21 v1.0       - new implementation:
+                        * support footnote ranges when possible
+                        * support more packages
+                        * more flexible way to adapt unknown note commands
+                          with less commands
+                        * drop support of \innernote (maybe re-implement it in
+                          future versions, depending on user feedback)

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2021-01-23 22:17:41 UTC (rev 57504)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2021-01-23 22:18:39 UTC (rev 57505)
@@ -1927,6 +1927,7 @@
  'fjodor',      'fjodor\.sty',          # not srbook-mem.sty
  'flashmovie',  '\.swf|' . $standardtex,
  'fltpoint',    '\.sty|\.tex',
+ 'fnpct',	'\.sty',		# nor *-manual.cls
  'fntproof',    'fntproof.tex',
  'font-change', 'default-amssymbols.tex|font_.*\.tex',
  'fontawesome',	'fontawesomesymbols-.*\.tex|' . $standardtex,



More information about the tex-live-commits mailing list.