summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/ducksay/ducksay.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-01-13 23:31:16 +0000
committerKarl Berry <karl@freefriends.org>2019-01-13 23:31:16 +0000
commit231f2bfbc6deb5f053659c5062e9b5be2ed8e5c8 (patch)
tree4aefb4a44dffac03ea25bdc1ead9ccbbf787da31 /Master/texmf-dist/tex/latex/ducksay/ducksay.sty
parent45703352bcad374f3e88099a40425df3ba5c3395 (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.sty150
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 } }