summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/ducksay/ducksay.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-09-27 23:06:45 +0000
committerKarl Berry <karl@freefriends.org>2017-09-27 23:06:45 +0000
commitf2d3695fec7706e81acdf340d2d6de8a67c925ac (patch)
tree5a761dc4e60fa6a06ac1c8f9b1a3156070ed4961 /Master/texmf-dist/tex/latex/ducksay/ducksay.sty
parentfddaa2393f00e1fea71a2669bd6ece044b841727 (diff)
ducksay (26sep17)
git-svn-id: svn://tug.org/texlive/trunk@45415 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.sty423
1 files changed, 423 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/ducksay/ducksay.sty b/Master/texmf-dist/tex/latex/ducksay/ducksay.sty
new file mode 100644
index 00000000000..bb4a9fe3e5e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/ducksay/ducksay.sty
@@ -0,0 +1,423 @@
+%% This package is distributed under the terms of the GPLv3 or later, or the
+%% LPPL 1.3c or later, which ever license fits your needs the best.
+%%
+%% Copyright (C) 2017 by Jonathan P. Spratte
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{xparse,l3keys2e}
+
+\def\ducksay@version{v1.1}
+\def\ducksay@date{2017/09/25}
+
+\ProvidesExplPackage
+ {ducksay} {\ducksay@date}
+ {\ducksay@version} {cowsay for LaTeX}
+
+\ExplSyntaxOn
+
+\int_new:N \l_ducksay_strlen_int
+\int_new:N \l_ducksay_lines_int
+\seq_new:N \l_ducksay_msg_lines_seq
+
+\cs_new:Npn \ducksay_longest_line:n #1 {%>>>
+ \int_incr:N \l_ducksay_lines_int
+ \exp_args:NNx \tl_set:Nn \l_tmpa_tl { #1 }
+ \regex_replace_all:nnN { \s } { \c{space} } \l_tmpa_tl
+ \int_set:Nn \l_ducksay_strlen_int {
+ \int_max:nn { \l_ducksay_strlen_int } { \tl_count:N \l_tmpa_tl } }
+}%<<<
+
+\cs_new:Npn \ducksay_open_bubble: {%>>>
+ \begin{tabular}{@{}l@{}}
+ \mbox{}\\
+ \int_compare:nNnTF {\l_ducksay_lines_int} = {1} {
+ (
+ }{
+ /
+ \int_step_inline:nnnn {3}{1} {\l_ducksay_lines_int} {\\\kern-0.5ex|}
+ \\\detokenize{\ }
+ }
+ \\[-1ex]\mbox{}
+ \end{tabular}
+ \begin{tabular}{@{}l@{}}
+ _\\
+ \int_step_inline:nnnn{2}{1}{\l_ducksay_lines_int}{\\}\\[-1ex]
+ {-}
+ \end{tabular}
+}%<<<
+
+\cs_new:Npn \ducksay_close_bubble: {%>>>
+ \begin{tabular}{@{}l@{}}
+ _\\
+ \int_step_inline:nnnn{2}{1}{\l_ducksay_lines_int}{\\}\\[-1ex]
+ {-}
+ \end{tabular}
+ \begin{tabular}{@{}r@{}}
+ \mbox{}\\
+ \int_compare:nNnTF {\l_ducksay_lines_int} = {1} {
+ )
+ }{
+ \detokenize{\ }
+ \int_step_inline:nnnn {3}{1}{\l_ducksay_lines_int} {\\|\kern-0.5ex}
+ \\/
+ }
+ \\[-1ex]\mbox{}
+ \end{tabular}
+}%<<<
+
+\cs_new:Npn \ducksay_print_msg:n #1 #2 {%>>>
+ \begin{tabular}{@{} #2 @{}}
+ \int_step_inline:nnnn{1}{1}{\l_ducksay_strlen_int}{_}\\
+ #1\\[-1ex]
+ \int_step_inline:nnnn{1}{1}{\l_ducksay_strlen_int}{{-}}
+ \end{tabular}
+}%<<<
+
+\cs_new:Npn \ducksay_print:n #1 {%>>>
+ \int_case:nnF { \l_ducksay_strlen_int }
+ { { 0 } {
+ \seq_set_split:Nnn \l_ducksay_msg_lines_seq {\\} { #1 }
+ \seq_map_function:NN \l_ducksay_msg_lines_seq \ducksay_longest_line:n
+ }}
+ {
+ \int_case:nn { \l_ducksay_lines_int }
+ { { 0 } {
+ \regex_count:nnN {\c{\\}} {#1} \l_ducksay_lines_int
+ \int_incr:N \l_ducksay_lines_int
+ }}
+ }
+ \frenchspacing
+ \group_begin:
+ \ttfamily
+ \begin{tabular}[\l_ducksay_align_tl]{@{}l@{}}
+ \ducksay_bubble:
+ \begin{tabular}{@{}l@{}}
+ \ducksay_open_bubble:
+ \exp_args:Nno \ducksay_print_msg:n {#1} { \l_ducksay_msg_align_tl }
+ \ducksay_close_bubble:
+ \end{tabular}\\
+ \ducksay_body:
+ \begin{tabular}{@{}l@{}}
+ \l_ducksay_animal_tl
+ \end{tabular}
+ \end{tabular}
+ \group_end:
+}%<<<
+
+\NewDocumentCommand{\ducksay}{ O{} m }{%>>>
+ \group_begin:
+ \int_zero:N \l_ducksay_strlen_int
+ \int_zero:N \l_ducksay_lines_int
+ \keys_set:nn { ducksay } { default_animal,#1 }
+ \ducksay_print:n { #2 }
+ \group_end:
+}%<<<
+
+% regexes for \duckthink >>>
+\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*)\\ }
+%<<<
+
+\NewDocumentCommand{\duckthink}{ O{} m }{%>>>
+ \group_begin:
+ \int_zero:N \l_ducksay_strlen_int
+ \int_zero:N \l_ducksay_lines_int
+ \keys_set:nn { ducksay } { default_animal,#1 }
+ \regex_replace_once:NnN \c_ducksay_first_regex { \1O } \l_ducksay_animal_tl
+ \regex_replace_once:NnN \c_ducksay_second_regex { \1o } \l_ducksay_animal_tl
+ \regex_replace_once:NnN \c_ducksay_third_regex { \1o } \l_ducksay_animal_tl
+ \ducksay_print:n { #2 }
+ \group_end:
+}%<<<
+
+\keys_define:nn { ducksay } {%>>>
+ ,bubble .code:n = \cs_set:Nn \ducksay_bubble: {#1}
+ ,bubble .initial:n = \relax
+ ,body .code:n = \cs_set:Nn \ducksay_body: {#1}
+ ,body .initial:n = \relax
+ ,align .tl_set:N = \l_ducksay_align_tl
+ ,align .initial:n = {}
+ ,align .value_required:n = true
+ ,wd .int_set:N = \l_ducksay_strlen_int
+ ,wd .value_required:n = true
+ ,ht .int_set:N = \l_ducksay_lines_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
+}%<<<
+
+\NewDocumentCommand{\DefaultAnimal}{ m }{%>>>
+ \keys_define:nn { ducksay } { default_animal .meta:n = {#1} }}%<<<
+
+\NewDocumentCommand{\AddAnimal}{ s m +v }{%>>>
+ \tl_set:Nn \l_tmpa_tl { \ #3 }
+ \regex_replace_all:nnN { \r } { \c{tabularnewline}\c{null} } \l_tmpa_tl
+ \cs_gset_eq:cN { g_ducksay_animal_#2_tl } \l_tmpa_tl
+ \keys_define:nn { ducksay } {
+ #2 .code:n = \cs_set_eq:Nc \l_ducksay_animal_tl { g_ducksay_animal_#2_tl }
+ }
+ \IfBooleanT{#1}{
+ \keys_define:nn { ducksay } {
+ default_animal .meta:n = {#2} }}
+}%<<<
+
+\ExplSyntaxOff
+
+% Animals:>>>
+% some of the below are from http://ascii.co.uk/art/kangaroo
+\AddAnimal{duck}%>>>
+{ \
+ \ __
+ >(' )
+ )/
+ /(
+ / `----/
+ \ ~=- /
+ ~^~^~^~^~^~^~^}%<<<
+\AddAnimal{small-duck}%>>>
+{ \
+ \
+ >()_
+ (__)__ _}%<<<
+\AddAnimal{duck-family}%>>>
+{ \
+ \ __
+ >(' )
+ )/
+ /(
+ / `----/ -()_ >()_
+ __\__~=-_/__ _(__)__(__)__ _}%<<<
+\AddAnimal{cow}%>>>
+{ \ ^__^
+ \ (oo)\_______
+ (__)\ )\/\
+ ||----w |
+ || ||}%<<<
+\AddAnimal{head-in}%>>>
+{ \
+ \ ^__^ /
+ (oo)\_______/ ________
+ (__)\ )=( ___|_ \____
+ ||----w | \ \ \____ |
+ || || || ||}%<<<
+\AddAnimal{sodomized}%>>>
+{ \ _
+ \ (_)
+ ^__^ / \
+ (oo)\_____/_\ \
+ (__)\ ) /
+ ||----w ((
+ || ||>>}%<<<
+\AddAnimal{tux}%>>>
+{ \
+ \ .--.
+ |o_o |
+ |\_/ |
+ // \ \
+ (| | )
+ /'\_ _/`\
+ \___)=(___/}%<<<
+\AddAnimal{pig}%>>>
++ \ _//| .-~~~-.
+ \ _/oo } }-@
+ ('')_ } |
+ `--'| { }--{ }
+ //_/ /_/+%<<<
+\AddAnimal{frog}%>>>
+{ \
+ \ (.)_(.)
+ _ ( _ ) _
+ / \/`-----'\/ \
+ __\ ( ( ) ) /__
+ ) /\ \._./ /\ (
+ )_/ /|\ /|\ \_(}%<<<
+\AddAnimal{snowman}%>>>
+{ \
+ \_[_]_
+ (")
+ >-( : )-<
+ (__:__)}%<<<
+\AddAnimal{hedgehog}%>>>
+{ \ .\|//||\||.
+ \ |/\/||/|//|/|
+ /. `|/\\|/||/||
+ o__,_|//|/||\||'}%<<<
+\AddAnimal{kangaroo}%>>>
+{ \
+ \ _,' ___
+ <__\__/ \
+ \_ / _\
+ \,\ / \\
+ // \\
+ ,/' `\_,}%<<<
+\AddAnimal{rabbit}%>>> http://chris.com/ascii/index.php?art=animals/rabbits
+{ \ / \`\ __
+ \ | \ `\ /`/ \
+ \ \_/`\ \-"-/` /\ \
+ | | \ |
+ (d b) \_/
+ / \
+ ,".|.'.\_/.'.|.",
+ / /\' _|_ '/\ \
+ | / '-`"`-' \ |
+ | | | |
+ | \ \ / / |
+ \ \ \ / / /
+ `"`\ : /'"`
+ `""`""`}%<<<
+\AddAnimal{bunny}%>>>
+{ \
+ \ \
+ \ /\
+ ( )
+ .( o ).}%<<<
+\AddAnimal{small-rabbit}%>>>
+{ \
+ \ _//
+ (')---.
+ _/-_( )o}%<<<
+\AddAnimal{dragon}%>>>
+{ \ / \ //\
+ \ |\___/| / \// \\
+ \ /0 0 \__ / // | \ \
+ / / \/_/ // | \ \
+ @_^_@'/ \/_ // | \ \
+ //_^_/ \/_ // | \ \
+ ( //) | \/// | \ \
+ ( / /) _|_ / ) // | \ _\
+ ( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
+ (( / / )) ,-{ _ `-.|.-~-. .~ `.
+ (( // / )) '/\ / ~-. _ .-~ .-~^-. \
+ (( /// )) `. { } / \ \
+ (( / )) .----~-.\ \-' .~ \ `. \^-.
+ ///.----..> \ _ -~ `. ^-` ^-_
+ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
+ /.-~}%<<<
+\AddAnimal{dog}%>>> http://www.ascii-art.de/ascii/def/dogs.txt
+{ \ __
+ \ .-'\/\
+ "\ '------.
+ ___/ ( .'_____
+ '-----'"""'------"""""'}%<<<
+\AddAnimal{squirrel}%>>> http://ascii.co.uk/art/squirrel
+{ \ ,;:;;,
+ \ ;;;;;
+ .=', ;:;;:,
+ /_', "=. ';:;:;
+ @=:__, \,;:;:'
+ _(\.= ;:;;'
+ `"_( _/="`
+ `"'``}%<<<
+
+% from http://www.ascii-art.de/ascii/s/starwars.txt :
+\AddAnimal{yoda}%>>>
+{ \
+ \ ____
+ \ _.' : `._
+ .-.'`. ; .'`.-.
+ __ / : ___\ ; /___ ; \ __
+ ,'_ ""--.:__;".-.";: :".-.":__;.--"" _`,
+ :' `.t""--.. '<@.`;_ ',@>` ..--""j.' `;
+ `:-.._J '-.-'L__ `-- ' L_..-;'
+ "-.__ ; .-" "-. : __.-"
+ L ' /.------.\ ' J
+ "-. "--" .-"
+ __.l"-:_JL_;-";.__
+ .-j/'.; ;"""" / .'\"-.
+ .' /:`. : : /.".''; `.
+ .-" / ;`.". : ."." : "-.
+ .+"-. : : ".".". ."." ;-._ \
+ ; \ `.; ; . "."-"." : : "+. ;
+ : ; ; ; . ."." ; : ; : \:
+ ; : ; : / / / , ;: ; :
+: \ ; : ; ; / : , : ; / ::
+; ; : ; : ; ; ; ; : ;:
+: : ; : ;. ; ' : : ; : ;
+;\ : ; : . , ; ; ; ;
+: `."-; : ; . ; : ; / ;
+ ; -: ; : , , ; : .-" :
+ :\ \ : ; , : \.-" :
+ ;`. \ ; : . , ;.'_..-- / ;
+ : "-. "-: ; , :/." .' :
+ \ \ : : ;/ __ :
+ \ .-`.\ /t-"" ":-+. :
+ `. .-" `l __/ /`. : ; ; \ ;
+ \ .-" .-"-.-" .' .'j \ / ;/
+ \ / .-" /. .'.' ;_:' ;
+ :-""-.`./-.' / `.___.'
+ \ `t ._ /
+ "-.t-._:'}%<<<
+\AddAnimal{yoda-head}%>>>
+{ \
+ \ ____
+ \ _.' : `._
+ .-.'`. ; .'`.-.
+ __ / : ___\ ; /___ ; \ __
+ ,'_ ""--.:__;".-.";: :".-.":__;.--"" _`,
+ :' `.t""--.. '<@.`;_ ',@>` ..--""j.' `;
+ `:-.._J '-.-'L__ `-- ' L_..-;'
+ "-.__ ; .-" "-. : __.-"
+ L ' /.------.\ ' J
+ "-. "--" .-"
+ __.l"-:_JL_;-";.__
+ .-j/'.; ;"""" / .'\"-.
+ .' /:`. : : /.".''; `.
+ .-" / ;`.". : ."." : "-.
+ .+"-. : : ".".". ."." ;-._ \}%<<<
+% from https://www.ascii-code.com/ascii-art/movies/star-wars.php
+\AddAnimal{small-yoda}%>>>
+{ \
+ \
+ __.-._
+ '-._"7'
+ /'.-c
+ | /T
+ _)_/LI}%<<<
+\AddAnimal{r2d2}%>>>
+{ \
+ \ ,-----.
+ ,'_/_|_\_`.
+ /<<::8[O]::>\
+ _|-----------|_
+ | | ====-=- | |
+ | | -=-==== | |
+ \ | ::::|()|| /
+ | | ....|()|| |
+ | |_________| |
+ | |\_______/| |
+ / \ / \ / \
+ `---' `---' `---'}%<<<
+\AddAnimal{vader}%>>>
+{ \ _.-'~~~~~~`-._
+ \ / || \
+ / || \
+ | || |
+ | _______||_______ |
+ |/ ----- \/ ----- \|
+ / ( ) ( ) \
+ / \ ----- () ----- / \
+ / \ /||\ / \
+ / \ /||||\ / \
+ / \ /||||||\ / \
+/_ \O========O/ _\
+ `--...__|`-._ _.-'|__...--'
+ | `' |}%<<<
+%<<<
+
+\ExplSyntaxOn
+
+\ProcessKeysOptions { ducksay }
+
+\keys_define:nn { ducksay } {
+ ,animal .undefine:
+}
+
+\ExplSyntaxOff
+
+\endinput
+% vim: fdm=marker foldmarker=>>>,<<<