summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fnpct
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fnpct
Initial commit
Diffstat (limited to 'macros/latex/contrib/fnpct')
-rw-r--r--macros/latex/contrib/fnpct/README36
-rw-r--r--macros/latex/contrib/fnpct/fnpct.sty1130
-rw-r--r--macros/latex/contrib/fnpct/fnpct_en.pdfbin0 -> 580285 bytes
-rw-r--r--macros/latex/contrib/fnpct/fnpct_en.tex1026
4 files changed, 2192 insertions, 0 deletions
diff --git a/macros/latex/contrib/fnpct/README b/macros/latex/contrib/fnpct/README
new file mode 100644
index 0000000000..56c9d81000
--- /dev/null
+++ b/macros/latex/contrib/fnpct/README
@@ -0,0 +1,36 @@
+--------------------------------------------------------------------------
+the FNPCT package v0.4f
+
+ footnote kerning
+
+2019/02/17
+--------------------------------------------------------------------------
+Clemens Niederberger
+Web: https://bitbucket.org/cgnieder/fnpct/
+E-Mail: contact@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.
+--------------------------------------------------------------------------
+The fnpct package consists of the files
+ - fnpct.sty,
+ - fnpct_en.tex and fnpct_en.pdf
+ - README
+--------------------------------------------------------------------------
+the package is inspired by the following question on TeX.SE:
+ http://tex.stackexchange.com/q/56094/5049
+--------------------------------------------------------------------------
+If you have any ideas, questions, suggestions or bugs to report, please
+feel free to contact me.
+--------------------------------------------------------------------------
diff --git a/macros/latex/contrib/fnpct/fnpct.sty b/macros/latex/contrib/fnpct/fnpct.sty
new file mode 100644
index 0000000000..69b4e08ebe
--- /dev/null
+++ b/macros/latex/contrib/fnpct/fnpct.sty
@@ -0,0 +1,1130 @@
+% --------------------------------------------------------------------------
+% the FNPCT package
+%
+% footnote kerning
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/fnpct/
+% E-Mail: contact@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
+% --------------------------------------------------------------------------
+\RequirePackage { xparse , l3keys2e , scrlfile }
+\ProvidesExplPackage
+ {fnpct}
+ {2019/02/17}
+ {0.4f}
+ {footnote kerning}
+
+% --------------------------------------------------------------------------
+% SETTING THINGS UP:
+% this is plain's \nobreak:
+\cs_new:Npn \fnpct_no_break: { \tex_penalty:D \c_ten_thousand }
+
+% messages:
+\cs_new_protected:Npn \fnpct_dont_mess_around:
+ {
+ \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~(http://www.youtube.com/watch?v=Bqz876VkwwY). }
+ \iow_log:n { ................................................. }
+ }
+
+\msg_set:nnn { fnpct } { already-adapted }
+ {
+ The~command~\token_to_str:N #1 \tl_use:N \c_space_tl has~already~been~
+ adapted. \\
+ I~will~do~nothing~instead.
+ }
+
+\bool_new:N \l__fnpct_strict_bool
+
+\cs_new_protected:Npn \fnpct_message:nx #1#2
+ {
+ \bool_if:NTF \l__fnpct_strict_bool
+ { \msg_error:nnx { fnpct } { #1 } }
+ { \msg_warning:nnx { fnpct } { #1 } }
+ { #2 }
+ }
+
+% scratch variables:
+\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
+\int_new:N \l__fnpct_tmpa_int
+
+% rigid lengths:
+\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 }
+
+% multiple footnote input and output variables:
+\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
+% 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 { , } }
+
+% basic booleans for punctuation order switch and multiple footnotes
+\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_bigfoot_default_top_bool
+\bool_new:N \l__fnpct_normal_marks_bool
+\bool_new:N \l__fnpct_hyperref_bool
+
+\bool_new:N \g__fnpct_after_punctuation_bool
+
+% default punctuation marks for switching:
+\tl_new:N \l__fnpct_punctuation_marks_tl
+\tl_set:Nn \l__fnpct_punctuation_marks_tl { ., }
+\prop_new:N \l__fnpct_punctuation_marks_after_prop
+\prop_new:N \l__fnpct_punctuation_marks_before_prop
+
+% #1: before/after
+% #2: punctuation mark
+% #3: dimension
+\cs_new_protected:Npn \fnpct_set_punctuation_dim:nnn #1#2#3
+ {
+ \prop_put:cnx { l__fnpct_punctuation_marks_#1_prop }
+ { #2 }
+ { \dim_eval:n { #3 } }
+ }
+\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 }
+
+\cs_new_protected:Npn \fnpct_rm_punctuation: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 }
+ }
+
+\tl_new:N \l__fnpct_last_punct_mark_tl
+
+\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 }
+
+\cs_new_protected:Npn \__fnpct_add_punctuation:w #1[#2]#3 \q_stop
+ {
+ \quark_if_no_value:nTF { #2 }
+ {
+ % there is no option at all
+ \tl_map_inline:nn { #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 }
+ }
+ }
+ {
+ \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 }
+ {
+ \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 }
+ }
+ {
+ \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
+ }
+ }
+ }
+
+% options:
+\keys_define:nn { fnpct }
+ {
+ strict .bool_set:N = \l__fnpct_strict_bool ,
+ strict .default:n = true ,
+ 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 ,
+ punct-after .default:n = true ,
+ 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 ,
+ multiple .default:n = true ,
+ bigfoot-default-top .bool_set:N = \l__fnpct_bigfoot_default_top_bool ,
+ bigfoot-default-top .default:n = true ,
+ normal-marks .bool_set:N = \l__fnpct_normal_marks_bool ,
+ normal-marks .default:n = true ,
+ 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
+ }
+
+\ProcessKeysOptions { fnpct }
+
+% --------------------------------------------------------------------------
+% MAIN INTERNAL FOOTNOTE FUNCTION:
+% write the notes:
+\cs_new:Npn \__fnpct_no_value_or_quark_no_value:nTF #1#2#3
+ {
+ \IfNoValueTF { #1 } { #2 }
+ { \quark_if_no_value:nTF { #1 } { #2 } { #3 } }
+ }
+
+\cs_new:Npn \fnpct_write_note:Nnnn #1#2#3#4
+ {
+ \__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 } }
+ }
+ }
+
+% check for punctuation:
+\cs_new_protected:Npn \fnpct_check_punctuation:TF #1#2
+ { \__fnpct_check_punctuation:nTF { 0 } { #1 } { #2 } }
+
+\cs_new_protected:Npn \__fnpct_check_punctuation:nTF #1#2#3
+ {
+ \__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 }
+ }
+ }
+
+\cs_new_protected:Npn \__fnpct_check_punctuation_aux:nnn #1#2#3
+ {
+ \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 }
+ }
+\cs_generate_variant:Nn \__fnpct_check_punctuation:nTF { V }
+% \cs_generate_variant:Nn \peek_meaning_remove:NTF { V }
+\cs_generate_variant:Nn \tl_remove_all:Nn { NV }
+\cs_generate_variant:Nn \tl_put_right:Nn { NV }
+
+\cs_new_protected:Npn \__fnpct_get_head:NN #1#2
+ { \tl_set:Nx #1 { \tl_head:V #2 } }
+
+% check for multiple notes:
+\tl_new:N \l__fnpct_multiple_true_tl
+\tl_new:N \l__fnpct_multiple_false_tl
+
+\cs_new_protected:Npn \fnpct_check_multiple:TF #1#2
+ {
+ \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:
+ }
+
+\cs_new_protected:Npn \__fnpct_check_multiple:
+ {
+ \prop_map_inline:Nn \g__fnpct_adapted_notes_prop
+ {
+ \prop_get:NnN \g__fnpct_adapted_notes_prop { ##1 } \l__fnpct_tmpb_tl
+ \exp_args:NV \token_if_eq_meaning:NNTF \l__fnpct_tmpb_tl \l_peek_token
+ {
+ \bool_set_true:N \l__fnpct_multiple_footnotes_bool
+ \prop_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 }
+ }
+
+% \cs_generate_variant:Nn \token_if_eq_meaning:NNTF {V}
+
+% 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 }
+ }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+% this is where the magic happens:
+\cs_new_protected:Npn \fnpct_handle_punctuation:n #1
+ {
+ \fnpct_check_punctuation:TF
+ {
+ % 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
+ {
+ \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
+ {
+ \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:
+ }
+ }
+ #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
+ }
+ {
+ % 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
+ % else insert space and then note
+ \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
+ }
+ % \bool_gset_false:N \g__fnpct_after_punctuation_bool
+ }
+ }
+
+
+% #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
+ {
+ % if a punctuation mark follows remove it, insert dot, skip back
+ % and then insert footnote
+ \bool_if:NF \l__fnpct_dont_mess_around_bool
+ {
+ \IfBooleanT { #5 }
+ { \bool_set_true:N \l__fnpct_reverse_switch_bool }
+ }
+ \fnpct_handle_punctuation:n
+ {
+ \fnpct_write_note:Nnnn #1 { #2 } { #3 } { #4 }
+ \fnpct_write_inner:N #1
+ }
+ }
+\cs_generate_variant:Nn \fnpct_handle_note:Nnnnn { cnnnn }
+
+% --------------------------------------------------------------------------
+% MULTIPLE FOOTNOTES
+\seq_new:N \l__fnpct_multiple_footnotes_seq
+\cs_generate_variant:Nn \seq_set_split:Nnn { NVn }
+
+% #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
+ {
+ \bool_if:NF \l__fnpct_dont_mess_around_bool
+ {
+ \IfBooleanT { #2 }
+ { \bool_set_true:N \l__fnpct_reverse_switch_bool }
+ }
+ % 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 }
+
+ }
+\cs_generate_variant:Nn \fnpct_mult_note:Nnn { cnn }
+
+\int_new:N \l__fnpct_multiple_notes_int
+% #1: original note command
+% #2: sequence variable holding the note arguments
+\cs_new_protected:Npn \fnpct_write_notes:NN #1#2
+ {
+ \int_zero:N \l__fnpct_multiple_notes_int
+ \seq_map_inline:Nn #2
+ {
+ \__fnpct_read_note_with_option:w ##1 \q_stop { #1 }
+ \int_incr:N \l__fnpct_multiple_notes_int
+ }
+ }
+
+% 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
+\bool_new:N \g__fnpct_only_text_bool
+\NewDocumentCommand \__fnpct_read_note_with_option:w { soo+u{\q_stop}m }
+ {
+ \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
+ }
+
+% --------------------------------------------------------------------------
+% NESTED FOOTNOTES:
+% 1 layer of nesting...
+\prop_new:N \g__fnpct_inner_footnote_prop
+\prop_new:N \g__fnpct_inner_footnote_hyperref_prop
+\cs_generate_variant:Nn \prop_gput:Nnn { Nxn , Nxo }
+
+% 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 }
+ {
+ \IfNoValueTF { #1 }
+ {
+ % 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
+ {
+ \prop_gput:Nxo \g__fnpct_inner_footnote_hyperref_prop
+ { \thefootnote } { \Hy@footnote@currentHref }
+ }
+ }
+ {
+ \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@footnote@currentHref }
+ }
+ }
+ }
+
+\cs_new:Npn \fnpct_write_inner:N #1
+ {
+ \token_if_eq_meaning:NNF #1 \fnpct_inner_footnote:w
+ {
+ \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@raisedlink
+ { \exp_args:NV \hyper@@anchor \l__fnpct_tmpa_tl }
+ }
+ ##2
+ }
+ }
+ \prop_gclear:N \g__fnpct_inner_footnote_prop
+ }
+ }
+
+\NewDocumentCommand \writeinnernotes {}
+ { \fnpct_write_inner:N X }
+
+% --------------------------------------------------------------------------
+% MANUAL KERNING:
+\cs_new_protected:Npn \fnpct_kfp:
+ {
+ \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 }
+ }
+
+\cs_new_protected:Npn \fnpct_kfc:
+ {
+ \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 }
+ }
+
+\NewDocumentCommand \kfp {} { \fnpct_kfp: }
+\NewDocumentCommand \kfc {} { \fnpct_kfc: }
+
+% --------------------------------------------------------------------------
+% NORMAL MARKS:
+\AtBeginDocument
+ {
+ \bool_if:NT \l__fnpct_normal_marks_bool
+ {
+ \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 }
+ }
+ }
+
+% --------------------------------------------------------------------------
+% LET'S MAKE IT EASIER TO ADAPT EXISTIUNG FUNCTIONS:
+\prop_new:N \g__fnpct_adapted_notes_prop
+\cs_generate_variant:Nn \prop_put:Nnn { Nxn }
+
+% COPY, RENEW AND CREATE MULT
+% 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
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \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 { so+m }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { \q_no_value } { ##3 } { ##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
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \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 }
+ {
+ \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value }
+ { ##2 } { ##1 }
+ }
+ }
+ }
+\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
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \cs_new_eq:NN #2 #1
+ \RenewDocumentCommand #1 { so+m }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { \q_no_value } { ##3 } { ##1 } }
+ }
+\cs_generate_variant:Nn \fnpct_renew:NN { cc ,Nc }
+
+% new
+\cs_new_protected:Npn \fnpct_new:NN #1#2
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \NewDocumentCommand #1 { so+m }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { \q_no_value } { ##3 } { ##1 } }
+ }
+\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
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \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 { soo+m }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { ##3 } { ##4 } { ##1 } }
+ }
+ }
+\cs_generate_variant:Nn \fnpct_renew_and_mult_opt:NNN { ccc , NcN }
+
+\cs_new_protected:Npn \fnpct_renew_opt:NN #1#2
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \cs_new_eq:NN #2 #1
+ \RenewDocumentCommand #1 { soo+m }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { ##3 } { ##4 } { ##1 } }
+ }
+\cs_generate_variant:Nn \fnpct_renew_opt:NN { cc , Nc }
+
+% \note{<arg>} like
+\cs_new_protected:Npn \fnpct_renew_no_opt:NN #1#2
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \cs_new_eq:NN #2 #1
+ \RenewDocumentCommand #1 { s+m }
+ { \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value } { ##2 } { ##1 } }
+ }
+\cs_generate_variant:Nn \fnpct_renew_no_opt:NN { cc ,Nc }
+
+% \note like
+\cs_new_protected:Npn \fnpct_renew_no_arg:NN #1#2
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \cs_new_eq:NN #2 #1
+ \RenewDocumentCommand #1 { s }
+ { \fnpct_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value } { } { ##1 } }
+ }
+\cs_generate_variant:Nn \fnpct_renew_no_arg:NN { cc }
+
+% create mult-variant
+\cs_new_protected:Npn \fnpct_create_mult_variant:NN #1#2
+ {
+ \NewDocumentCommand #1 { s+m }
+ { \fnpct_mult_note:Nnn #2 { ##1 } { ##2 } }
+ }
+
+% \footnotemark[<mark>] like commands:
+\cs_new_protected:Npn \fnpct_renew_mark:NN #1#2
+ {
+ \prop_gput:Nxn \g__fnpct_adapted_notes_prop { \cs_to_str:N #2 } { #1 }
+ \cs_new_eq:NN #2 #1
+ \RenewDocumentCommand #1 { so }
+ { \fnpct_handle_note:Nnnnn #2 { ##2 } { \q_no_value } { } { ##1 } }
+ }
+\cs_generate_variant:Nn \fnpct_renew_mark:NN { cc , Nc }
+
+% user commands:
+\NewDocumentCommand \AdaptNote { mm }
+ {
+ \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 }
+ }
+
+\NewDocumentCommand \AdaptNoteNoMult { m }
+ {
+ \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 } }
+ }
+
+\NewDocumentCommand \AdaptNoteOpt { mm }
+ {
+ \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 }
+ }
+
+\NewDocumentCommand \AdaptNoteOptNoMult { m }
+ {
+ \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 } }
+ }
+
+\NewDocumentCommand \AdaptNoteNoOpt { mm }
+ {
+ \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 }
+ }
+
+\NewDocumentCommand \AdaptNoteNoOptNoMult { m }
+ {
+ \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 } }
+ }
+
+\NewDocumentCommand \AdaptNoteMark { m }
+ {
+ \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 } }
+ }
+
+% --------------------------------------------------------------------------
+% DO THE REDEFINING:
+%
+% before we start make the testing more comfortable:
+\cs_new:Npn \fnpct_treatment:nn #1#2
+ { \@ifpackageloaded { #1 } { #2 } { } }
+\cs_new:Npn \fnpct_special_treatment:nn #1#2
+ { \@ifpackageloaded { #1 } { #2 } { \AfterPackage * { #1 } { #2 } } }
+
+% and now get going:
+\AtBeginDocument
+ {
+ \@ifpackageloaded { hyperref }
+ { \bool_set_true:N \l__fnpct_hyperref_bool }
+ {
+ \cs_if_exist:NF \AfterBeginDocument
+ { \cs_new:Npn \AfterBeginDocument #1 { #1 } }
+ }
+ \AfterBeginDocument
+ {
+ \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 \endnote \multendnote
+ \AdaptNoteMark \endnotemark
+ }
+ %% the `enotez' package:
+ \fnpct_treatment:nn { enotez }
+ { \AdaptNote \endnote \multendnote }
+ %% the `snotez' package:
+ \fnpct_treatment:nn { snotez }
+ {
+ \AdaptNoteOpt \sidenote \multsidenote
+ \AdaptNoteMark \sidenotemark
+ }
+ %% the `sidenotes' package:
+ \fnpct_treatment:nn { sidenotes }
+ {
+ \AdaptNoteOpt \sidenote \multsidenote
+ \AdaptNoteMark \sidenotemark
+ }
+ %% the `parnotes' package:
+ \fnpct_treatment:nn { parnotes }
+ { \AdaptNote \parnote \multparnote }
+ %% the `pagenote' package:
+ \fnpct_treatment:nn { pagenote }
+ {
+ \bool_if:NT \l__fnpct_makepagenote_bool
+ { \AdaptNote \pagenote \multpagenote }
+ }
+ %% the `tablefootnote' package:
+ \fnpct_treatment:nn { tablefootnote }
+ { \AdaptNote \tablefootnote \multtablefootnote }
+ %% the `bigfoot' package:
+ \fnpct_treatment:nn { bigfoot }
+ {
+ \prop_map_inline:Nn \l__fnpct_footnote_class_prop
+ {
+ \fnpct_renew_and_mult:ccc { footnote#2 }
+ { fnpct_orig_footnote#2:w } { multfootnote#2 }
+ \fnpct_renew_mark:cc { footnotemark#2 } { fnpct_orig_footnotemark#2:w }
+ }
+ \prop_if_in:NnT \l__fnpct_footnote_class_prop { default }
+ {
+ % re-set basics:
+ \cs_set_eq:NN \footnote \footnotedefault
+ \cs_set_eq:NN \footnotemark \footnotemarkdefault
+ \cs_set_eq:NN \multfootnote \multfootnotedefault
+ }
+ }
+ %% 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 } }
+ }
+ %% the `sepfootnotes' package:
+ \fnpct_treatment:nn { sepfootnotes }
+ {
+ \prop_map_inline:Nn \l__fnpct_sepfootnote_foot_classes_prop
+ {
+ \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 }
+ }
+ \prop_map_inline:Nn \l__fnpct_sepfootnote_end_classes_prop
+ {
+ \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 }
+ }
+ }
+ }
+ }
+
+% the `bigfoot' package neads special treatment:
+\prop_new:N \l__fnpct_footnote_class_prop
+
+\fnpct_special_treatment:nn { bigfoot }
+ {
+ % hook into \DeclareNewFootnote so we can redefine all footnote
+ % classes defined be users
+ \cs_new_eq:NN \fnpct_new_footnote:w \DeclareNewFootnote
+ \RenewDocumentCommand \DeclareNewFootnote { omo }
+ {
+ \prop_put:Nnn \l__fnpct_footnote_class_prop { #2 } { #2 }
+ \IfNoValueTF { #1 }
+ {
+ \IfNoValueTF { #3 }
+ { \fnpct_new_footnote:w { #2 } }
+ { \fnpct_new_footnote:w { #2 } [ #3 ] }
+ }
+ {
+ \IfNoValueTF { #3 }
+ { \fnpct_new_footnote:w [ #1 ] { #2 } }
+ { \fnpct_new_footnote:w [ #1 ] { #2 } [ #3 ] }
+ }
+ }
+ \bool_if:NT \l__fnpct_bigfoot_default_top_bool
+ { \DeclareNewFootnote { default } }
+ }
+
+% as does the `fixfoot' package
+\prop_new:N \l__fnpct_footnote_fixfoot_prop
+
+\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 }
+ {
+ \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 } }
+ }
+ }
+
+% and the `pagenote' package:
+\bool_new:N \l__fnpct_makepagenote_bool
+
+\fnpct_special_treatment:nn { pagenote }
+ {
+ \tl_put_left:Nn \makepagenote
+ { \bool_set_true:N \l__fnpct_makepagenote_bool }
+ }
+
+% aaand... the `sepfootnotes' package:
+\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
+
+\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 }
+ {
+ \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 } }
+ }
+ \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}[2014/01/10]
+\AtBeginDocument{
+ \ifcurrentbaselanguage{French}
+ {
+ \AfterBeginDocument{
+ \cs_if_exist:NT \@footnotemarkORI
+ {
+ \let\@footnotemark\@footnotemarkORI
+ \setfnpct{
+ before-footnote-space =
+ \l__fnpct_french_before_footnote_space_dim
+ }
+ }
+ }
+ }{}
+}
+
+% --------------------------------------------------------------------------
+% SETUP COMMAND:
+\NewDocumentCommand \setfnpct { m }
+ { \keys_set:nn { fnpct } { #1 } }
+
+\tex_endinput:D
+
+% --------------------------------------------------------------------------
+% 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/23 v0.1a - \AdaptNoteNoMult, \AdaptNoteOpt, \AdaptNoteOptNoMult
+ - support `sidenotes' package
+ - better support for citing commands
+ - error checking in the \AdaptNote<sth> commands
+ - package option `strict'
+2012/05/26 v0.2 - added possibility to add punctuation marks to the
+ switching/kerning mechansim (or remove them)
+2012/06/01 v0.2a - * switches behaviour also with `punct-after=true'
+ - `dont-mess-around' disables *
+2012/06/07 v0.2b - bugfix: \kfp and \kfc now get the updated values if
+ add-punctuation was added. They also won't allow line
+ breaks any more
+2012/06/28 v0.2c - bugfix: works now flawless together with `bigfoot'
+2012/07/07 v0.2d - check for all sorts of following footnotes to insert
+ \l__fnpct_multiple_footnote_separator_tl
+2012/07/24 v0.2e - improved scanning ahead for punctuation marks, adapted
+ to deprecated functions in l3kernel and l3packages
+2012/08/27 v0.2f - switched to internal scratch variables
+2012/11/14 v0.2g - adapt changes in `sidenotes' package
+2013/01/18 v0.2h - bug fixed: \l__fnpct_multiple_footnote_separator_tl
+ should be { , } when `memoir' is loaded
+2013/01/21 v0.2i - adapted to changes of sepfootnotes, bug fix in reading
+ of multiple notes
+2013/02/22 v0.2j - adaption of `enotez' \endnote command
+2013/04/07 v0.2k - bug fix: suppress possible break point between footnote
+ mark and punctuation mark if `punct-after=true' has
+ been set
+2013/04/16 v0.3 - adapt \footref if it exists
+ - new: \AdaptNoteNoOpt, \AdaptNoteNoOptNoMult
+2013/06/14 v0.3a - various internal commands needed to be defined
+ protected
+2013/12/22 v0.4 - when biblatex's \autocite is adapted a fix was needed:
+ it calls \footnote eventually which inserted
+ `before-footnote-space' when it shouldn't
+ - adapt to French language settings
+ - clearer distinction between internal commands and
+ document commands
+2013/12/23 v0.4a - fix bug introcuded in v0.4 due to a typo
+2014/03/10 v0.4b - adapt to version 1.2 of package `translations'
+ - adapt to update to `tablefootnote'
+ - bug fix: add missing penalty that caused a footnote
+ marker to be placed on the following line in some
+ instances
+2015/02/20 v0.4c - adapt to update to `sepfootnotes' (quicknotes)
+ - bug fix (looking ahead for known note commands works
+ again)
+2015/04/23 v0.4d - fix for issue #7: polyglossia and french
+2016/03/25 v0.4e - fix for issue #9
+2019/02/17 v0.4f - fix for issues #13 and #19
+
+% --------------------------------------------------------------------------
+% NOTES:
+- `footnote' package => not compatible => see todo
+- `ednotes' package => not tested; who knows?
+
+% --------------------------------------------------------------------------
+% TODO:
+- localization: should there be different defaults for different languages?
+ And who might provide enough information about conventions in other
+ languages?
+- solve incompatibility with the `footnote' package
+- get this working (??) => http://tex.stackexchange.com/questions/54288/nested-endnotes
+- the `bigfoot' package provides \footnote+ and \footnote- -- let's see if we
+ can add those functionalities again
diff --git a/macros/latex/contrib/fnpct/fnpct_en.pdf b/macros/latex/contrib/fnpct/fnpct_en.pdf
new file mode 100644
index 0000000000..9fc0bf7eed
--- /dev/null
+++ b/macros/latex/contrib/fnpct/fnpct_en.pdf
Binary files differ
diff --git a/macros/latex/contrib/fnpct/fnpct_en.tex b/macros/latex/contrib/fnpct/fnpct_en.tex
new file mode 100644
index 0000000000..244bdc9732
--- /dev/null
+++ b/macros/latex/contrib/fnpct/fnpct_en.tex
@@ -0,0 +1,1026 @@
+% 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@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@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}
+@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}).
+
+\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}\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. You need to \emph{declare footnotes with \cs*{DeclareNewFootnote}
+ \emph{after} loading \fnpct\ but in the document \emph{preamble}.}
+
+\emph{Also verbatim material won't work inside footnotes anymore}. But 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}}.
+
+\fnpct\ has an additional package option which \emph{cannot} be set with
+\cs{setfnpct} and only has any effects if \pkg{bigfoot} has been loaded:
+\begin{options}
+ \keybool{bigfoot-default-top}\Default{false}
+ Sets the \code{default} footnote class as top layer.
+\end{options}
+
+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[bigfoot-default-top]{fnpct}
+ \setfnpct{multiple}
+ \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:manyfoot}
+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}
+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}
+The \pkg{manyfoot} package~\cite{pkg:manyfoot} is not and will not directly be
+supported. It is loaded by \pkg{bigfoot} (see section~\ref{ssec:bigfoot}), anyway.
+And since the latter states in its documentation
+\begin{cnltxquote}[David Kastrup~\textup{\cite{pkg:bigfoot}}]
+ Purpose of this package is to provide a one-stop solution to almost all
+ problems related to footnotes. You can use it as a drop-in replacement of
+ the `\pkg{manyfoot}' package, but without many of its shortcomings, and
+ quite a few features of its own.
+\end{cnltxquote}
+you should probably prefer it anyway.
+
+If it is \emph{really} wanted by users I might change my opinion, though \ldots
+
+\subsection{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}
+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}
+\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}
+The package \pkg{sidenotes}~\cite{pkg:sidenotes} 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{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}
+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}
+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