%% %% This is file `ducksay.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% ducksay.dtx (with options: `pkg') %% %% -------------------------------------------------------------- %% ducksay -- cowsay for LaTeX %% E-mail: jspratte@yahoo.de %% Released under the LaTeX Project Public License v1.3c or later %% See http://www.latex-project.org/lppl.txt %% -------------------------------------------------------------- %% %% Copyright (C) 2017-2018 Jonathan P. Spratte %% %% This work may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this license or %% (at your option) any later version. The latest version of this license is in %% the file: %% %% http://www.latex-project.org/lppl.txt %% %% Alternatively you can use this work under the terms of the GNU General Public %% Licensce (GPL), version 3 or later, except that you might not redistribute it %% under the same name if you change its functionality. Choose which of these %% licenses fits your needs the best. %% %% This work is "maintained" (as per LPPL maintenance status) by %% Jonathan P. Spratte. %% %% This work consists of the file ducksay.dtx %% and the derived files ducksay.pdf %% ducksay.sty %% ducksay.code.v1.tex %% ducksay.code.v2.tex and %% ducksay.animals.tex. %% \NeedsTeXFormat{LaTeX2e} \RequirePackage{xparse,l3keys2e} \def\ducksay@version{2.0} \def\ducksay@date{2018/09/21} \ProvidesExplPackage {ducksay} {\ducksay@date} {\ducksay@version} {cowsay for LaTeX} \int_new:N \l_ducksay_msg_width_int \int_new:N \l_ducksay_msg_height_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 \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 { \cO(?:\\bgroup\\color\{(.*?)\}(.*)\\egroup) } \regex_const:Nn \c_ducksay_color_regex { \cO(?:\\color\{(.*?)\}) } \msg_new:nnn { ducksay } { load-time-only } { The~`#1`~key~is~to~be~used~only~during~package~load~time. } \keys_define:nn { ducksay } { ,bubble .tl_set:N = \l_ducksay_bubble_tl ,body .tl_set:N = \l_ducksay_body_tl ,align .tl_set:N = \l_ducksay_align_tl ,align .value_required:n = true ,wd .int_set:N = \l_ducksay_msg_width_int ,wd .initial:n = -\c_max_int ,wd .value_required:n = true ,ht .int_set:N = \l_ducksay_msg_height_int ,ht .initial:n = -\c_max_int ,ht .value_required:n = true ,animal .code:n = { \keys_define:nn { ducksay } { default_animal .meta:n = { #1 } } } ,animal .initial:n = duck ,msg-align .tl_set:N = \l_ducksay_msg_align_tl ,msg-align .initial:n = l ,msg-align .value_required:n = true ,rel-align .tl_set:N = \l_ducksay_rel_align_tl ,rel-align .initial:n = l ,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 ,version .choice: ,version / 1 .code:n = { \bool_set_false:N \l_ducksay_version_two_bool \bool_set_true:N \l_ducksay_version_one_bool } ,version / 2 .code:n = { \bool_set_false:N \l_ducksay_version_one_bool \bool_set_true:N \l_ducksay_version_two_bool } ,version .initial:n = 2 } \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 { \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: } \cs_new_protected:Npx \ducksay_replace_verb_newline:Nn #1 #2 { \tl_replace_all:Nnn #1 { \char_generate:nn { 13 } { 12 } } { #2 } } \cs_new_protected:Npx \ducksay_replace_verb_newline_newline:Nn #1 #2 { \tl_replace_all:Nnn #1 { \char_generate:nn { 13 } { 12 } \char_generate:nn { 13 } { 12 } } { #2 } } \cs_new_protected:Npn \ducksay_process_verb_newline:nnn #1 #2 #3 { \tl_set:Nn \ProcessedArgument { #3 } \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 { \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 } { #1 .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 } } } } \NewDocumentCommand \DefaultAnimal { m } { \keys_define:nn { ducksay } { default_animal .meta:n = { #1 } } } \NewDocumentCommand \DucksayOptions { m } { \keys_set:nn { ducksay } { #1 } } \NewDocumentCommand \AddAnimal { s 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 } } } } \NewDocumentCommand \AddColoredAnimal { s m +v } { \ducksay_add_animal_inner:nn { #2 } { #3 } \regex_replace_all:Nnc \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 { \c{color}\cB\{\1\cE\} } { g_ducksay_animal_say_#2_tl } \regex_replace_all:Nnc \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 } } } } \bool_if:NT \l_ducksay_version_one_bool { \file_input:n { ducksay.code.v1.tex } } \bool_if:NT \l_ducksay_version_two_bool { \file_input:n { ducksay.code.v2.tex } } \ExplSyntaxOff \input{ducksay.animals.tex} %% %% %% End of file `ducksay.sty'.