summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fnpct/fnpct.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/fnpct/fnpct.sty')
-rw-r--r--macros/latex/contrib/fnpct/fnpct.sty800
1 files changed, 449 insertions, 351 deletions
diff --git a/macros/latex/contrib/fnpct/fnpct.sty b/macros/latex/contrib/fnpct/fnpct.sty
index 909a9d88ce..bdd63448cd 100644
--- a/macros/latex/contrib/fnpct/fnpct.sty
+++ b/macros/latex/contrib/fnpct/fnpct.sty
@@ -8,7 +8,7 @@
% Web: https://bitbucket.org/cgnieder/fnpct/
% E-Mail: contact@mychemistry.eu
% --------------------------------------------------------------------------
-% Copyright 2012-2019 Clemens Niederberger
+% 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
@@ -28,220 +28,291 @@
% 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/09/30}
- {0.4g}
- {footnote kerning}
-
-% --------------------------------------------------------------------------
-% SETTING THINGS UP:
-% this is plain's \nobreak:
-\cs_new:Npn \fnpct_no_break: { \tex_penalty:D 10000 \scan_stop: }
-
-% messages:
-\cs_new_protected:Npn \fnpct_dont_mess_around:
+\RequirePackage {xparse,l3keys2e,scrlfile}
+\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}
+\tl_const:Nn \c_fnpct_version_subrelease_tl {}
+\tl_const:Nx \c_fnpct_version_number_tl
{
- \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 { ................................................. }
+ \c_fnpct_version_major_number_tl .
+ \c_fnpct_version_minor_number_tl
}
-
-\msg_set:nnn { fnpct } { already-adapted }
+\tl_const:Nx \c_fnpct_version_tl
{
- The~command~\token_to_str:N #1 \tl_use:N \c_space_tl has~already~been~
- adapted. \\
- I~will~do~nothing~instead.
+ \c_fnpct_version_number_tl
+ \c_fnpct_version_subrelease_tl
}
+\tl_const:Nn \c_fnpct_info_tl {footnote~ kerning}
-\bool_new:N \l__fnpct_strict_bool
+\ProvidesExplPackage
+ {fnpct}
+ {\c_fnpct_date_tl}
+ {\c_fnpct_version_tl}
+ {\c_fnpct_info_tl}
-\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 }
- }
+% --------------------------------------------------------------------------
+% this is plain's \nobreak:
+\cs_new:Npn \fnpct_no_break: { \tex_penalty:D 10000 \scan_stop: }
-% scratch variables:
+% --------------------------------------------------------------------------
+% 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:
+\seq_new:N \l__fnpct_tmpa_seq
+\seq_new:N \l__fnpct_tmpb_seq
+
\dim_new:N \l__fnpct_after_comma_dim
-\dim_set:Nn \l__fnpct_after_comma_dim { -.06em }
+\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_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_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_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_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_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_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_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 }
+\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 { , } }
+\int_new:N \l__fnpct_multiple_notes_int
-% basic booleans for punctuation order switch and multiple footnotes
+\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
+
+\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_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
+\bool_new:N \g__fnpct_only_text_bool
+\bool_new:N \l__fnpct_makepagenote_bool
+
+\seq_new:N \l__fnpct_multiple_footnotes_seq
+\seq_new:N \l__fnpct_footnote_class_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
+
+% --------------------------------------------------------------------------
+% 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}
+
+% --------------------------------------------------------------------------
+% 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. }
+ \iow_log:n { . ~ (https://www.youtube.com/results?search_query=mess+around+ray+charles) }
+ \iow_log:n { ................................................. }
+ }
+
+\msg_new:nnn {fnpct} {already-adapted}
+ {
+ The~ command~ \token_to_str:N #1 \c_space_tl has~ already~ been~
+ adapted. \\
+ I~ will~ do~ nothing~ instead.
+ }
+
+\msg_new:nnn {fnpct} {pagenote}
+ {
+ If~ you~ use~ the~ `pagenote'~ package~ with~ `fnpct'~ please~ make~ sure~
+ to~ use~ \token_to_str:N \makepagenote \c_space_tl after~ loading~
+ `fnpct'!
+ }
+
+\msg_new:nnn {fnpct} {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.
+ }
+
+\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}
+ }
+
+% --------------------------------------------------------------------------
+\prg_new_conditional:Npnn \fnpct_if_package_loaded:n #1 {p,T,F,TF}
+ {
+ \@ifpackageloaded {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
-% 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
+% --------------------------------------------------------------------------
+% 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 {,} }
+% --------------------------------------------------------------------------
% #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 } }
+ {#2}
+ { \dim_eval:n {#3} }
}
-\cs_generate_variant:Nn \fnpct_set_punctuation_dim:nnn { nV }
+\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 }
+\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_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_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 }
+ \quark_if_no_value:nTF {#2}
{
% there is no option at all
- \tl_map_inline:nn { #1 }
+ \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_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 }
+ \tl_if_blank:nTF {#1}
{
% #2 is a second option (= before space)
- \fnpct_set_punctuation_dim:nVn { before }
+ \fnpct_set_punctuation_dim:nVn {before}
\l__fnpct_last_punct_mark_tl
- { #2 }
+ {#2}
}
{
% #2 is a first option (= after space), #1 might be more than one token:
- \tl_if_single_token:nTF { #1 }
+ \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 }
+ \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_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 ) }
+ \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} {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 }
+ \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 }
+ \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 }
+ \tl_if_eq:nnF {#3} { [\q_no_value]\q_no_value }
{
- \quark_if_no_value:nF { #3 }
+ \quark_if_no_value:nF {#3}
{
- \tl_set:Nn \l__fnpct_tmpa_tl { #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 }
+\keys_define:nn {fnpct}
{
+ bigfoot-default-top .code:n =
+ \msg_warning:nnnn {fnpct} {deprecated} {option} {bigfoot-default-top} ,
strict .bool_set:N = \l__fnpct_strict_bool ,
- strict .default:n = true ,
after-comma-space .code:n =
- \fnpct_set_punctuation_dim:nnn { after } { , } { #1 } ,
+ \fnpct_set_punctuation_dim:nnn {after} {,} {#1} ,
after-dot-space .code:n =
- \fnpct_set_punctuation_dim:nnn { after } { . } { #1 } ,
+ \fnpct_set_punctuation_dim:nnn {after} {.} {#1} ,
before-comma-space .code:n =
- \fnpct_set_punctuation_dim:nnn { before } { , } { #1 } ,
+ \fnpct_set_punctuation_dim:nnn {before} {,} {#1} ,
before-dot-space .code:n =
- \fnpct_set_punctuation_dim:nnn { before } { , } { #1 } ,
+ \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 } } ,
+ { \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 } } ,
+ { \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 } }
+ { \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 } }
+ { \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
@@ -249,45 +320,41 @@
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 } ,
+ add-punct-marks .code:n = \fnpct_add_punctuation:n {#1} ,
remove-punct-marks .code:n =
- \tl_map_function:nN { #1 } \fnpct_rm_punctuation:n
+ \tl_map_function:nN {#1} \fnpct_rm_punctuation:n
}
-\ProcessKeysOptions { fnpct }
+\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 } }
+ \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 {#2}
+ { #1 {#4} }
{
- \__fnpct_no_value_or_quark_no_value:nTF { #3 }
- { #1 [ #2 ] { #4 } }
- { #1 [ #2 ] [ #3 ] { #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 } }
+ { \__fnpct_check_punctuation:nTF {0} {#1} {#2} }
\cs_new_protected:Npn \__fnpct_check_punctuation:nTF #1#2#3
{
@@ -295,17 +362,17 @@
\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 }
+ {#2}
{
- \__fnpct_check_punctuation_aux:nnn { #1 }
- { \__fnpct_check_punctuation:VTF \l__fnpct_tmpa_int { #2 } { #3 } }
- { #3 }
+ \__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_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
@@ -313,25 +380,19 @@
\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 }
+ {#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_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:
-\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 }
+ \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:
}
@@ -340,8 +401,9 @@
{
\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
+ \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_set_true:N \l__fnpct_multiple_footnotes_bool
\prop_map_break:
@@ -353,10 +415,8 @@
{ \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 }
+\prg_new_conditional:Npnn \fnpct_punct_if_after: {T,TF}
{
\bool_if:nTF
{
@@ -426,7 +486,6 @@
\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 }
@@ -446,7 +505,6 @@
#1
\bool_set_false:N \l__fnpct_reverse_switch_bool
}
- % \bool_gset_false:N \g__fnpct_after_punctuation_bool
}
}
@@ -462,12 +520,12 @@
% and then insert footnote
\bool_if:NF \l__fnpct_dont_mess_around_bool
{
- \IfBooleanT { #5 }
+ \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_note:Nnnn #1 {#2} {#3} {#4}
\fnpct_write_inner:N #1
}
}
@@ -475,9 +533,6 @@
% --------------------------------------------------------------------------
% 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
@@ -485,20 +540,19 @@
{
\bool_if:NF \l__fnpct_dont_mess_around_bool
{
- \IfBooleanT { #2 }
+ \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 }
+ {#3}
\fnpct_handle_punctuation:n
{ \fnpct_write_notes:NN #1 \l__fnpct_multiple_footnotes_seq }
}
-\cs_generate_variant:Nn \fnpct_mult_note:Nnn { cnn }
+\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
@@ -506,7 +560,7 @@
\int_zero:N \l__fnpct_multiple_notes_int
\seq_map_inline:Nn #2
{
- \__fnpct_read_note_with_option:w ##1 \q_stop { #1 }
+ \__fnpct_read_note_with_option:w ##1 \q_stop {#1}
\int_incr:N \l__fnpct_multiple_notes_int
}
}
@@ -518,7 +572,6 @@
% #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
@@ -533,40 +586,36 @@
}
}
{
- \IfBooleanTF { #1 }
+ \IfBooleanTF {#1}
{ \tex_unskip:D }
{ \textsuperscript { \l__fnpct_multiple_footnote_separator_tl } }
}
- \IfBooleanTF { #1 }
+ \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 } }
+ \IfNoValueTF {#2}
+ { \footnotetext {#4} }
+ { \footnotetext [#2] {#4} }
}
- { \fnpct_write_note:Nnnn #5 { #2 } { #3 } { #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 }
+\NewDocumentCommand \fnpct_inner_footnote:w {o+m}
{
- \IfNoValueTF { #1 }
+ \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 }
+ \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
@@ -574,28 +623,28 @@
}
}
{
- \fnpct_orig_footnotemark:w [ #1 ]
- \prop_gput:Nnn \g__fnpct_inner_footnote_prop { #1 } { #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@footnote@currentHref }
+ {#1} { \Hy@footnote@currentHref }
}
}
}
-\cs_new:Npn \fnpct_write_inner:N #1
+\cs_new_protected: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 ]
+ \footnotetext [##1]
{
\bool_if:NT \l__fnpct_hyperref_bool
{
\prop_get:NnN \g__fnpct_inner_footnote_hyperref_prop
- { ##1 } \l__fnpct_tmpa_tl
+ {##1} \l__fnpct_tmpa_tl
\Hy@raisedlink
{ \exp_args:NV \hyper@@anchor \l__fnpct_tmpa_tl }
}
@@ -659,11 +708,22 @@
}
% --------------------------------------------------------------------------
-% 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 }
-
+% LET'S MAKE IT EASIER TO ADAPT EXISTING FUNCTIONS:
% COPY, RENEW AND CREATE MULT
+
+\prg_new_conditional:Npnn \fnpct_if_adapted:N #1 {p,T,F,TF}
+ {
+ \prop_if_in:NnTF \g__fnpct_adapted_notes_prop {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \fnpct_add_to_adapted:NN #1#2
+ {
+ % \tl_show:n {1:~#1} \tl_show:n {2:~#2}
+ \prop_gput:Nnn \g__fnpct_adapted_notes_prop {#1} {#2}
+ }
+
% standard \footnote[<mark>]{<text>} like commands
% #1: old new name
% #2: internal name of old definition
@@ -672,184 +732,232 @@
% \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 }
+ \fnpct_if_adapted:NF #1
{
- \RenewDocumentCommand #1 { so+m }
- { \fnpct_handle_note:Nnnnn #2 { ##2 } { \q_no_value } { ##3 } { ##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 {so+m}
+ { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } {##3} {##1} }
+ }
}
}
-\cs_generate_variant:Nn \fnpct_renew_and_mult:NNN { ccc , NcN }
+\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 }
+ \fnpct_if_adapted:NF #1
{
- \RenewDocumentCommand #1 { s+m }
+ \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_handle_note:Nnnnn #2 { \q_no_value } { \q_no_value }
- { ##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_and_mult_no_opt:NNN { Nc, ccc }
+\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 } }
+ \fnpct_if_adapted:NF #1
+ {
+ \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} }
+ }
}
-\cs_generate_variant:Nn \fnpct_renew:NN { cc ,Nc }
+\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 } }
+ \fnpct_if_adapted:NF #1
+ {
+ \fnpct_add_to_adapted:NN #1#2
+ \NewDocumentCommand #1 {so+m}
+ { \fnpct_handle_note:Nnnnn #2 {##2} { \q_no_value } {##3} {##1} }
+ }
}
-\cs_generate_variant:Nn \fnpct_new:NN { cc , Nc }
+\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 }
+ \fnpct_if_adapted:NF #1
{
- \RenewDocumentCommand #1 { soo+m }
- { \fnpct_handle_note:Nnnnn #2 { ##2 } { ##3 } { ##4 } { ##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 {soo+m}
+ { \fnpct_handle_note:Nnnnn #2 {##2} {##3} {##4} {##1} }
+ }
}
}
-\cs_generate_variant:Nn \fnpct_renew_and_mult_opt:NNN { ccc , NcN }
+\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 } }
+ \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} }
+ }
}
-\cs_generate_variant:Nn \fnpct_renew_opt:NN { cc , Nc }
+\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 } }
+ \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} }
+ }
}
-\cs_generate_variant:Nn \fnpct_renew_no_opt:NN { cc ,Nc }
+\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 } }
+ \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} }
+ }
}
-\cs_generate_variant:Nn \fnpct_renew_no_arg:NN { cc }
+\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 } }
+ \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 } }
+ \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} }
+ }
}
-\cs_generate_variant:Nn \fnpct_renew_mark:NN { cc , Nc }
+\cs_generate_variant:Nn \fnpct_renew_mark:NN {cc,Nc}
% user commands:
-\NewDocumentCommand \AdaptNote { mm }
+\NewDocumentCommand \AdaptNote {mm}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \fnpct_message:nx {already-adapted} {#1} }
{ \fnpct_renew_and_mult:NcN #1 { fnpct_orig_ \cs_to_str:N #1 :w } #2 }
}
-\NewDocumentCommand \AdaptNoteNoMult { m }
+\NewDocumentCommand \AdaptNoteNoMult {m}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \fnpct_message:nx {already-adapted} {#1} }
{ \fnpct_renew:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
}
-\NewDocumentCommand \AdaptNoteOpt { mm }
+\NewDocumentCommand \AdaptNoteOpt {mm}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \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 }
+\NewDocumentCommand \AdaptNoteOptNoMult {m}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \fnpct_message:nx {already-adapted} {#1} }
{ \fnpct_renew_opt:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
}
-\NewDocumentCommand \AdaptNoteNoOpt { mm }
+\NewDocumentCommand \AdaptNoteNoOpt {mm}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \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 }
+\NewDocumentCommand \AdaptNoteNoOptNoMult {m}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1:w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \fnpct_message:nx {already-adapted} {#1} }
{ \fnpct_renew_no_opt:Nc #1 { fnpct_orig_ \cs_to_str:N #1:w } }
}
-\NewDocumentCommand \AdaptNoteMark { m }
+\NewDocumentCommand \AdaptNoteMark {m}
{
\cs_if_exist:cTF { fnpct_orig_ \cs_to_str:N #1 :w }
- { \fnpct_message:nx { already-adapted } { #1 } }
+ { \fnpct_message:nx {already-adapted} {#1} }
{ \fnpct_renew_mark:Nc #1 { fnpct_orig_ \cs_to_str:N #1 :w } }
}
% --------------------------------------------------------------------------
% 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 {~}
+\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
+ \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_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 }
+ \seq_remove_duplicates:N #2
+ }
+
% 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 } } }
+\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} { \AfterPackage* {#1} {#2} } }
% and now get going:
\AtBeginDocument
{
- \@ifpackageloaded { hyperref }
+ \fnpct_if_package_loaded:nTF {hyperref}
{ \bool_set_true:N \l__fnpct_hyperref_bool }
{
\cs_if_exist:NF \AfterBeginDocument
- { \cs_new:Npn \AfterBeginDocument #1 { #1 } }
+ { \cs_new:Npn \AfterBeginDocument #1 {#1} }
}
\AfterBeginDocument
{
@@ -859,48 +967,63 @@
{ \AdaptNoteNoOptNoMult \footref }
\fnpct_new:NN \innernote \fnpct_inner_footnote:w
%% the `endnotes' package:
- \fnpct_treatment:nn { endnotes }
+ \fnpct_treatment:nn {endnotes}
{
\AdaptNote \endnote \multendnote
\AdaptNoteMark \endnotemark
}
%% the `enotez' package:
- \fnpct_treatment:nn { enotez }
+ \fnpct_treatment:nn {enotez}
{ \AdaptNote \endnote \multendnote }
%% the `snotez' package:
- \fnpct_treatment:nn { snotez }
+ \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 }
+ \fnpct_treatment:nn {parnotes}
{ \AdaptNote \parnote \multparnote }
%% the `pagenote' package:
- \fnpct_treatment:nn { pagenote }
+ \fnpct_treatment:nn {pagenote}
{
- \bool_if:NT \l__fnpct_makepagenote_bool
+ \bool_if:NTF \l__fnpct_makepagenote_bool
{ \AdaptNote \pagenote \multpagenote }
+ { \msg_warning:nn {fnpct} {pagenote} }
}
%% the `tablefootnote' package:
- \fnpct_treatment:nn { tablefootnote }
+ \fnpct_treatment:nn {tablefootnote}
{ \AdaptNote \tablefootnote \multtablefootnote }
- %% the `bigfoot' package:
- \fnpct_treatment:nn { bigfoot }
+ %% the `manyfoot' package (also loaded by `bigfoot'):
+ \fnpct_treatment:nn {manyfoot}
{
- \prop_map_inline:Nn \l__fnpct_footnote_class_prop
+ \__fnpct_get_fnclasses:NN \MFL@list \l__fnpct_footnote_class_seq
+ \seq_map_inline:Nn \l__fnpct_footnote_class_seq
{
- \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 }
+ \str_if_eq:nnTF {#1} {default}
+ {
+ \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}
+ }
+ }
+ {
+ \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}
+ }
}
- \prop_if_in:NnT \l__fnpct_footnote_class_prop { default }
+ }
+ %% the `bigfoot' package:
+ \fnpct_special_treatment:nn {bigfoot}
+ {
+ \cs_if_exist:NT \footnotedefault
{
% re-set basics:
\cs_set_eq:NN \footnote \footnotedefault
@@ -909,119 +1032,91 @@
}
}
%% the `fixfoot' package:
- \fnpct_treatment:nn { fixfoot }
+ \fnpct_treatment:nn {fixfoot}
{
\prop_map_inline:Nn \l__fnpct_footnote_fixfoot_prop
- { \fnpct_renew_no_arg:cc { #2 } { fnpct_orig_fix_#2:w } }
+ { \fnpct_renew_no_arg:cc {#2} {fnpct_orig_fix_#2:w} }
}
%% the `sepfootnotes' package:
- \fnpct_treatment:nn { sepfootnotes }
+ \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 }
+ \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 }
+ \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
+% `bigfoot' package
+% \fnpct_special_treatment:nn {fixfoot}
+% {
+% \bool_if:NT \l__fnpct_bigfoot_default_top_bool
+% { \DeclareNewFootnote {default} }
+% }
-\fnpct_special_treatment:nn { fixfoot }
+% `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 }
+ \RenewDocumentCommand \DeclareFixedFootnote {smm}
{
- \prop_put:Nnx \l__fnpct_footnote_fixfoot_prop { #2 }
+ \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 } }
+ \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 }
+% `pagenote' package:
+\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 }
+% `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 }
+ \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 } }
+ \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 }
+ \RenewDocumentCommand \newendnotes {m}
{
- \prop_put:Nnn \l__fnpct_sepfootnote_end_classes_prop { #1 } { #1 }
- \fnpct_orig_new_endnotes:n { #1 }
+ \prop_put:Nnn \l__fnpct_sepfootnote_end_classes_prop {#1} {#1}
+ \fnpct_orig_new_endnotes:n {#1}
}
- \RenewDocumentCommand \newsymbolfootnotes { om }
+ \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 } }
+ \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]
+\RequirePackage{translations}
\AtBeginDocument{
\ifcurrentbaselanguage{French}
{
@@ -1040,8 +1135,8 @@
% --------------------------------------------------------------------------
% SETUP COMMAND:
-\NewDocumentCommand \setfnpct { m }
- { \keys_set:nn { fnpct } { #1 } }
+\NewDocumentCommand \setfnpct {m}
+ { \keys_set:nn {fnpct} {#1} }
\file_input_stop:
@@ -1084,7 +1179,7 @@
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
+ 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
@@ -1114,6 +1209,9 @@
2016/03/25 v0.4e - fix for issue #9
2019/02/17 v0.4f - fix for issues #13 and #19
2019/09/30 v0.4g - update for expl3 deprecations
+2019/10/05 v0.5 - fix issue 18
+ - remove option `bigfoot-default-top'
+ - support `manyfoot' package
% --------------------------------------------------------------------------
% NOTES: