diff options
author | Karl Berry <karl@freefriends.org> | 2019-01-13 23:31:16 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-01-13 23:31:16 +0000 |
commit | 231f2bfbc6deb5f053659c5062e9b5be2ed8e5c8 (patch) | |
tree | 4aefb4a44dffac03ea25bdc1ead9ccbbf787da31 /Master/texmf-dist/tex/latex/ducksay/ducksay.sty | |
parent | 45703352bcad374f3e88099a40425df3ba5c3395 (diff) |
ducksay (13jan19)
git-svn-id: svn://tug.org/texlive/trunk@49691 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/ducksay/ducksay.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/ducksay/ducksay.sty | 150 |
1 files changed, 101 insertions, 49 deletions
diff --git a/Master/texmf-dist/tex/latex/ducksay/ducksay.sty b/Master/texmf-dist/tex/latex/ducksay/ducksay.sty index 6d140038d95..98d096c4175 100644 --- a/Master/texmf-dist/tex/latex/ducksay/ducksay.sty +++ b/Master/texmf-dist/tex/latex/ducksay/ducksay.sty @@ -35,8 +35,8 @@ \NeedsTeXFormat{LaTeX2e} \RequirePackage{xparse,l3keys2e} -\def\ducksay@version{2.2.1} -\def\ducksay@date{2019-01-08} +\def\ducksay@version{2.3} +\def\ducksay@date{2019-01-13} \ProvidesExplPackage {ducksay} {\ducksay@date} @@ -44,22 +44,20 @@ \int_new:N \l_ducksay_msg_width_int \int_new:N \l_ducksay_msg_height_int +\int_new:N \l_ducksay_tail_symbol_count_int \seq_new:N \l_ducksay_msg_lines_seq -\tl_new:N \l_ducksay_say_or_think_tl \tl_new:N \l_ducksay_align_tl \tl_new:N \l_ducksay_msg_align_tl \tl_new:N \l_ducksay_animal_tl \tl_new:N \l_ducksay_body_tl \tl_new:N \l_ducksay_bubble_tl \tl_new:N \l_ducksay_tmpa_tl -\bool_new:N \l_ducksay_also_add_think_bool +\tl_new:N \l_ducksay_tail_symbol_out_one_tl +\tl_new:N \l_ducksay_tail_symbol_out_two_tl +\tl_new:N \l_ducksay_tail_symbol_in_tl \bool_new:N \l_ducksay_version_one_bool \bool_new:N \l_ducksay_version_two_bool \box_new:N \l_ducksay_tmpa_box -\regex_const:Nn \c_ducksay_first_regex { \A(.\s*)\\ } -\regex_const:Nn \c_ducksay_second_regex { \A(.[^\c{null}]*\c{null}\s*)\\ } -\regex_const:Nn \c_ducksay_third_regex { - \A(.[^\c{null}]*\c{null}[^\c{null}]*\c{null}\s*)\\ } \regex_const:Nn \c_ducksay_textcolor_regex { \cO(?:\\textcolor\{(.*?)\}\{(.*?)\}) } \regex_const:Nn \c_ducksay_color_delim_regex @@ -68,6 +66,8 @@ { \cO(?:\\color\{(.*?)\}) } \msg_new:nnn { ducksay } { load-time-only } { The~`#1`~key~is~to~be~used~only~during~package~load~time. } +\msg_new:nnn { ducksay } { deprecated-key } + { The~`\l_keys_key_tl`~key~is~deprecated.~Sorry~for~the~inconvenience. } \keys_define:nn { ducksay } { ,bubble .tl_set:N = \l_ducksay_bubble_tl @@ -91,7 +91,17 @@ ,rel-align .value_required:n = true ,ligatures .tl_set:N = \l_ducksay_ligatures_tl ,ligatures .initial:n = { `<>,'- } - ,add-think .bool_set:N = \l_ducksay_also_add_think_bool + ,tail-1 .tl_set:N = \l_ducksay_tail_symbol_out_one_tl + ,tail-1 .initial:x = \c_backslash_str + ,tail-2 .tl_set:N = \l_ducksay_tail_symbol_out_two_tl + ,tail-2 .initial:x = \c_backslash_str + ,no-tail .meta:n = { tail-1 = { ~ }, tail-2 = { ~ } } + ,think .meta:n = { tail-1 = { O }, tail-2 = { o } } + ,say .code:n = + { + \exp_args:Nx \DucksayOptions + { tail-1 = { \c_backslash_str }, tail-2 = { \c_backslash_str } } + } ,version .choice: ,version / 1 .code:n = { @@ -104,23 +114,23 @@ \bool_set_true:N \l_ducksay_version_two_bool } ,version .initial:n = 2 + ,add-think .code:n = \msg_error:nn { ducksay } { deprecated-key } } \ProcessKeysOptions { ducksay } \keys_define:nn { ducksay } { version .code:n = \msg_error:nnn { ducksay } { load-time-only } { version } } -\cs_generate_variant:Nn \tl_if_eq:nnT { VnT } -\cs_new_protected:Npn \ducksay_create_think_animal:n #1 +\keys_define:nn { ducksay / add-animal } { - \group_begin: - \tl_set_eq:Nc \l_ducksay_tmpa_tl { g_ducksay_animal_say_#1_tl } - \regex_replace_once:NnN \c_ducksay_first_regex { \1O } \l_ducksay_tmpa_tl - \regex_replace_once:NnN \c_ducksay_second_regex { \1o } \l_ducksay_tmpa_tl - \regex_replace_once:NnN \c_ducksay_third_regex { \1o } \l_ducksay_tmpa_tl - \tl_gset_eq:cN { g_ducksay_animal_think_#1_tl } \l_ducksay_tmpa_tl - \group_end: + ,tail-symbol .code:n = + \tl_set:Nx \l_ducksay_tail_symbol_in_tl { \tl_to_str:n { #1 } } + ,tail-symbol .initial:o = \c_backslash_str + ,tail-count .int_set:N = \l_ducksay_tail_symbol_count_int + ,tail-count .initial:n = 2 } +\cs_generate_variant:Nn \tl_replace_once:Nnn { NVn } +\cs_generate_variant:Nn \tl_replace_all:Nnn { NVn } \cs_new_protected:Npx \ducksay_replace_verb_newline:Nn #1 #2 { \tl_replace_all:Nnn #1 { \char_generate:nn { 13 } { 12 } } { #2 } @@ -136,25 +146,63 @@ \ducksay_replace_verb_newline_newline:Nn \ProcessedArgument { #2 } \ducksay_replace_verb_newline:Nn \ProcessedArgument { #1 } } -\cs_new_protected:Npn \ducksay_add_animal_inner:nn #1 #2 +\cs_new_protected:Npn \ducksay_add_animal_inner:nnnn #1 #2 #3 #4 { - \tl_set:Nn \l_ducksay_tmpa_tl { \ #2 } - \tl_map_inline:Nn \l_ducksay_ligatures_tl - { \tl_replace_all:Nnn \l_ducksay_tmpa_tl { ##1 } { { ##1 } } } - \ducksay_replace_verb_newline:Nn \l_ducksay_tmpa_tl { \tabularnewline\null } - \tl_gset_eq:cN { g_ducksay_animal_say_#1_tl } \l_ducksay_tmpa_tl - \keys_define:nn { ducksay } + \group_begin: + \keys_set:nn { ducksay / add-animal } { #1 } + \tl_set:Nn \l_ducksay_tmpa_tl { \ #3 } + \int_compare:nNnTF { \l_ducksay_tail_symbol_count_int } < { \c_zero_int } + { + \tl_replace_once:NVn + \l_ducksay_tmpa_tl + \l_ducksay_tail_symbol_in_tl + \l_ducksay_tail_symbol_out_one_tl + \tl_replace_all:NVn + \l_ducksay_tmpa_tl + \l_ducksay_tail_symbol_in_tl + \l_ducksay_tail_symbol_out_two_tl + } + { + \int_compare:nNnT { \l_ducksay_tail_symbol_count_int } > + { \c_zero_int } + { + \tl_replace_once:NVn + \l_ducksay_tmpa_tl + \l_ducksay_tail_symbol_in_tl + \l_ducksay_tail_symbol_out_one_tl + \int_step_inline:nnn { 2 } { \l_ducksay_tail_symbol_count_int } + { + \tl_replace_once:NVn + \l_ducksay_tmpa_tl + \l_ducksay_tail_symbol_in_tl + \l_ducksay_tail_symbol_out_two_tl + } + } + } + \tl_map_inline:Nn \l_ducksay_ligatures_tl + { \tl_replace_all:Nnn \l_ducksay_tmpa_tl { ##1 } { { ##1 } } } + \ducksay_replace_verb_newline:Nn \l_ducksay_tmpa_tl + { \tabularnewline\null } + \exp_args:NNnV + \group_end: + \tl_set:cn { l_ducksay_animal_#2_tl } \l_ducksay_tmpa_tl + \exp_args:Nnx \keys_define:nn { ducksay } { - #1 .code:n = + #2 .code:n = { - \tl_if_exist:cF - { g_ducksay_animal_ \l_ducksay_say_or_think_tl _#1_tl } - { \ducksay_create_think_animal:n { #1 } } - \tl_set_eq:Nc \l_ducksay_animal_tl - { g_ducksay_animal_ \l_ducksay_say_or_think_tl _#1_tl } + \exp_not:n { \tl_set_eq:NN \l_ducksay_animal_tl } + \exp_after:wN \exp_not:N \cs:w l_ducksay_animal_#2_tl \cs_end: + \exp_not:n { \exp_args:NV \DucksayOptions } + \exp_after:wN + \exp_not:N \cs:w l_ducksay_animal_#2_options_tl \cs_end: } } + \tl_if_exist:cF { l_ducksay_animal_#2_options_tl } + { \tl_new:c { l_ducksay_animal_#2_options_tl } } + \IfBooleanT { #4 } + { \keys_define:nn { ducksay } { default_animal .meta:n = { #2 } } } } +\cs_generate_variant:Nn \ducksay_add_animal_inner:nnnn { nnVn } \NewDocumentCommand \DefaultAnimal { m } { \keys_define:nn { ducksay } { default_animal .meta:n = { #1 } } @@ -163,30 +211,34 @@ { \keys_set:nn { ducksay } { #1 } } -\NewDocumentCommand \AddAnimal { s m +v } +\NewDocumentCommand \AddAnimal { s O{} m +v } { - \ducksay_add_animal_inner:nn { #2 } { #3 } - \bool_if:NT \l_ducksay_also_add_think_bool - { \ducksay_create_think_animal:n { #2 } } - \IfBooleanT{#1} - { \keys_define:nn { ducksay } { default_animal .meta:n = { #2 } } } + \ducksay_add_animal_inner:nnnn { #2 } { #3 } { #4 } { #1 } } -\NewDocumentCommand \AddColoredAnimal { s m +v } +\NewDocumentCommand \AddColoredAnimal { s O{} m +v } { - \ducksay_add_animal_inner:nn { #2 } { #3 } - \regex_replace_all:Nnc \c_ducksay_color_delim_regex + \tl_set:Nn \l_ducksay_tmpa_tl { #4 } + \regex_replace_all:NnN \c_ducksay_color_delim_regex { \c{bgroup}\c{color}\cB\{\1\cE\}\2\c{egroup} } - { g_ducksay_animal_say_#2_tl } - \regex_replace_all:Nnc \c_ducksay_color_regex + \l_ducksay_tmpa_tl + \regex_replace_all:NnN \c_ducksay_color_regex { \c{color}\cB\{\1\cE\} } - { g_ducksay_animal_say_#2_tl } - \regex_replace_all:Nnc \c_ducksay_textcolor_regex + \l_ducksay_tmpa_tl + \regex_replace_all:NnN \c_ducksay_textcolor_regex { \c{textcolor}\cB\{\1\cE\}\cB\{\2\cE\} } - { g_ducksay_animal_say_#2_tl } - \bool_if:NT \l_ducksay_also_add_think_bool - { \ducksay_create_think_animal:n { #2 } } - \IfBooleanT{#1} - { \keys_define:nn { ducksay } { default_animal .meta:n = { #2 } } } + \l_ducksay_tmpa_tl + \ducksay_add_animal_inner:nnVn { #2 } { #3 } \l_ducksay_tmpa_tl { #1 } + } +\NewDocumentCommand \AnimalOptions { s m m } + { + \tl_if_exist:cTF { l_ducksay_animal_#2_options_tl } + { + \IfBooleanTF { #1 } + { \tl_set:cn } + { \tl_put_right:cn } + } + { \tl_set:cn } + { l_ducksay_animal_#2_options_tl } { #3, } } \bool_if:NT \l_ducksay_version_one_bool { \file_input:n { ducksay.code.v1.tex } } |