diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fnpct |
Initial commit
Diffstat (limited to 'macros/latex/contrib/fnpct')
-rw-r--r-- | macros/latex/contrib/fnpct/README | 36 | ||||
-rw-r--r-- | macros/latex/contrib/fnpct/fnpct.sty | 1130 | ||||
-rw-r--r-- | macros/latex/contrib/fnpct/fnpct_en.pdf | bin | 0 -> 580285 bytes | |||
-rw-r--r-- | macros/latex/contrib/fnpct/fnpct_en.tex | 1026 |
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 Binary files differnew file mode 100644 index 0000000000..9fc0bf7eed --- /dev/null +++ b/macros/latex/contrib/fnpct/fnpct_en.pdf 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 |