%%
%% 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
%% 
%% 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.1}
\def\ducksay@date{2018/10/19}

\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'.
