%%
%% This is file `scsnowman.sty', part of scsnowman package.
%% Maintained on GitHub:
%%
https://github.com/aminophen/scsnowman
%%
%% Copyright (c) 2015-2023 Hironobu Yamashita
%% Email : h.y.acetaminophen[a t]gmail.com
%% GitHub :
https://github.com/aminophen
%% Blog :
http://acetaminophen.hatenablog.com/
%% Twitter : @aminophen
%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{scsnowman}[2023/02/23 v1.3c Snowman variants using TikZ]
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{sctkzsym-base}}
\ProcessOptions\relax
\RequirePackage{sctkzsym-base}[2017/08/08]
%
% make document snowman (joke)
\ifsctkzsym@document
\def\makedocumentsnowman{%
\ifx\documentclass\@notprerr
% Already after \begin{document}, throw an error
\def\sctkzsym@documentsnowman{%
\PackageError{scsnowman}{%
Use of \noexpand\makedocumentsnowman too late!\MessageBreak
Try using before \string\begin{document}}{%
I'll try to stop processing, but
this attempt can fail.\MessageBreak\@ehc}%
% If the above error is ignored, there's no way to
% exit successfully in all cases. So, try to continue
% processing by ignoring all LaTeX errors.
% TeX errors still remain; therefore, \makedocumentsnowman
% in internal vertical mode or math mode will fail.
\let\@latex@error\@gobbletwo\par
\scsnowman[init,scale=14,hat,muffler,buttons,snow]%
\scsnowman[init,scale=14,hat,muffler,buttons,arms]%
\scsnowman[init,scale=14,body,hat,muffler,buttons,snow]%
\end{document}}%
\else\ifx\documentclass\@twoclasseserror
\ifx\AtBeginDocument\@firstofone
% In preamble, inside \AtBeginDocument; avoid infinite loop
\def\sctkzsym@documentsnowman{%
\centering
\scsnowman[init,scale=14,hat,muffler,buttons,snow]%
\scsnowman[init,scale=14,hat,muffler,buttons,arms]%
\scsnowman[init,scale=14,body,hat,muffler,buttons,snow]%
\end{document}}%
\else
% In preamble; start document
\def\sctkzsym@documentsnowman{%
\pagestyle{empty}%
\begin{document}%
\centering
\scsnowman[init,scale=14,hat,muffler,buttons,snow]%
\scsnowman[init,scale=14,hat,muffler,buttons,arms]%
\scsnowman[init,scale=14,body,hat,muffler,buttons,snow]%
\end{document}}%
\fi
\else
% Before \documentclass{...}; load class and start document
\def\sctkzsym@documentsnowman{%
\documentclass{minimal}%
\begin{document}%
\centering
\scsnowman[init,scale=18,hat,muffler,buttons,snow]%
\scsnowman[init,scale=18,hat,muffler,buttons,arms]%
\scsnowman[init,scale=18,body,hat,muffler,buttons,snow]%
\end{document}}%
\fi\fi
\sctkzsym@documentsnowman
}
\fi
%
% change QED symbol (joke)
\ifsctkzsym@qed
\def\sctkzsym@snowman@qedsymbol{\scsnowman[init,hat=true,muffler=red]}
\newcommand{\makeqedsnowman}{%
\ifx\qedsymbol\sctkzsym@snowman@qedsymbol\else
\let\sctkzsym@saved@qedsymbol\qedsymbol
\let\qedsymbol\sctkzsym@snowman@qedsymbol
\fi
}
\fi
%
% change item label (joke)
\ifsctkzsym@item
\def\sctkzsym@snowman@labelitemi{\scsnowman[init,hat=true,muffler=red]}
\def\sctkzsym@snowman@labelitemii{\scsnowman[init,hat=true,muffler=blue]}
\def\sctkzsym@snowman@labelitemiii{\scsnowman[init,hat=true,muffler=green]}
\def\sctkzsym@snowman@labelitemiv{\scsnowman[init,hat=true,muffler=yellow]}
\newcommand{\makeitemsnowman}{%
\ifx\labelitemi\sctkzsym@snowman@labelitemi\else
\let\sctkzsym@saved@labelitemi\labelitemi
\let\sctkzsym@saved@labelitemii\labelitemii
\let\sctkzsym@saved@labelitemiii\labelitemiii
\let\sctkzsym@saved@labelitemiv\labelitemiv
\let\labelitemi\sctkzsym@snowman@labelitemi
\let\labelitemii\sctkzsym@snowman@labelitemii
\let\labelitemiii\sctkzsym@snowman@labelitemiii
\let\labelitemiv\sctkzsym@snowman@labelitemiv
\fi
}
\fi
%
%------------------------------- ZR something BEGIN
% change enumerate label using \scsnowmannumeral (joke)
% (this feature is `scsnowman'-specific, so the name-space
% is intentionally set to \scsnowman@...)
% unique token
\def\scsnowman@end{\scsnowman@end@}
\let\scsnowman@eight\relax
%% \scsnowman@scan@option\CScontinue{<prologue>}
\def\scsnowman@scan@option#1#2{%
\scsnowman@scan@option@a#2[]\scsnowman@end#1%
}
\def\scsnowman@scan@option@a#1[#2]#3\scsnowman@end#4{%
#4{#2}%
}
\def\enumsnowman#1#{%
\scsnowman@scan@option\scsnowman@enumsnowman{#1}%
}
\def\scsnowman@enumsnowman#1#2{%
\scsnowmanNumeral{#1}{\@nameuse{c@#2}}%
}
% For use with \pagenumbering.
\def\@enumsnowman{%
\scsnowmanNumeral{}%
}
\def\scsnowmannumeral#1#{%
\scsnowman@scan@option\scsnowmanNumeral{#1}%
}
% \scsnowmanNumeral{<option>}{<number>}
% change 8 to snowman in counters (joke)
% (this feature is `scsnowman'-specific, so the name-space
% is intentionally set to \scsnowman@...)
% internal entry point
\newcommand*\scsnowmanNumeral[2]{%
\expandafter\scsnowman@@numeral\number#2\relax\scsnowman@end{#1}%
}
\def\scsnowman@@numeral#1\relax#2\scsnowman@end#3{%
\scsnowman@numeral{#3}{#1}%
}
\DeclareRobustCommand*\scsnowman@numeral[2]{%
\begingroup
\def\scsnowman@eight{\scsnowman[#1]}%
\scsnowman@numeral@a#28\scsnowman@end
\endgroup
}
\def\scsnowman@numeral@a#18#2\scsnowman@end{%
\ifx\scsnowman@end#2\scsnowman@end
#1%
\else
#1\scsnowman@eight
\scsnowman@numeral@a#2\scsnowman@end
\fi
}
\providecommand*\pdfstringdefPreHook{}
\g@addto@macro\pdfstringdefPreHook{%
\let\scsnowman@eight\scsnowman@hy@eight
\let\scsnowman@numeral\scsnowman@hy@numeral
}
\def\scsnowman@hy@numeral#1#2{% #1 is ignored
\scsnowman@numeral@a#28\scsnowman@end
}
\DeclareTextCommand{\scsnowman@hy@eight}{PU}{\9046\003}% U+2603
\DeclareTextCommand{\scsnowman@hy@eight}{PD1}{8}%fallback
% upTeX since v0.10 has both \kchardef and \ucs.
% N.B. TL2023 uses e-upTeX (euc/sjis) as a default engine of pLaTeX.
% N.B. luatexja has \ucs, but neither \kchardef nor \kansujichar.
\ifx\kchardef\@undefined \else
\ifnum\jis"2121="3000 %upTeX
\begingroup
\kansujichar8="2603
\xdef\scsnowman@hy@eight{\kansuji8}
\endgroup
\fi
\fi
%------------------------------- ZR something END
%
% key initialization
\newcommand\sctkzsym@snowman@initkeys{%
\def\sctkzsym@snowman@init{false}%
\def\sctkzsym@snowman@scale{1}%
\def\sctkzsym@snowman@shape{normal}%
\def\sctkzsym@snowman@body{false}%
\def\sctkzsym@snowman@eyes{true}% default on
\def\sctkzsym@snowman@nose{false}%
\def\sctkzsym@snowman@mouthshape{smile}%
\def\sctkzsym@snowman@mouth{true}% default on
\def\sctkzsym@snowman@sweat{false}%
\def\sctkzsym@snowman@hat{false}%
\def\sctkzsym@snowman@arms{false}%
\def\sctkzsym@snowman@muffler{false}%
\def\sctkzsym@snowman@buttons{false}%
\def\sctkzsym@snowman@snow{false}%
\def\sctkzsym@snowman@note{false}%
\def\sctkzsym@snowman@adjustbaseline{false}%
\def\sctkzsym@snowman@mikan{false}%
\def\sctkzsym@snowman@leaf{false}%
\def\sctkzsym@snowman@broom{false}%
}
\newcommand{\sctkzsym@snowman@defaultkeys}{%
\sctkzsym@snowman@initkeys
}
\sctkzsym@snowman@defaultkeys
%
% key definitions
\sctkzsym@define@key@withbool{snowman}{init}
\sctkzsym@define@key@wodefault{snowman}{scale}
\sctkzsym@define@key@wodefault{snowman}{shape}
\sctkzsym@define@key@withbool{snowman}{body}
\sctkzsym@define@key@withbool{snowman}{eyes}
\sctkzsym@define@key@withbool{snowman}{nose}
\sctkzsym@define@key@withword{snowman}{mouthshape}{smile,frown,tight}
\sctkzsym@define@key@withbool{snowman}{mouth}
\sctkzsym@define@key@withbool{snowman}{sweat}
\sctkzsym@define@key@withbool{snowman}{hat}
\sctkzsym@define@key@withbool{snowman}{arms}
\sctkzsym@define@key@withbool{snowman}{muffler}
\sctkzsym@define@key@withbool{snowman}{buttons}
\sctkzsym@define@key@withbool{snowman}{snow}
\sctkzsym@define@key@withbool{snowman}{note}
\sctkzsym@define@key@withbool{snowman}{adjustbaseline}
\sctkzsym@define@key@withbool{snowman}{mikan}
\sctkzsym@define@key@withbool{snowman}{leaf}
\sctkzsym@define@key@withbool{snowman}{broom}
%
% definition of \scsnowman[...]
\DeclareRobustCommand\scsnowman[1][]{%
% key initialization using default
\sctkzsym@snowman@defaultkeys
% read <key>=<value>
\setkeys{sctkzsym@snowman}{#1}%
% check init; if init=true, initialize and read keys again
\sctkzsym@hndl@key@onlybool{snowman}{init}%
\ifsctkzsym@snowman@init
\sctkzsym@snowman@initkeys
\setkeys{sctkzsym@snowman}{#1,init=false}%
\fi
%
% check body; determine whether "black snowman" or "white snowman"
\sctkzsym@hndl@key@withbool{snowman}{body}%
\ifsctkzsym@snowman@body
% "black snowman"; black snow; white eyes/mouth/stroke
\def\sctkzsym@snowman@bodystroke{\sctkzsym@snowman@body}%
\def\sctkzsym@snowman@bodyfill{\sctkzsym@snowman@body}%
\def\sctkzsym@snowman@bodypath{\path[draw=\sctkzsym@snowman@bodystroke,fill=\sctkzsym@snowman@bodyfill]}%
\def\sctkzsym@snowman@snowstroke{\sctkzsym@snowman@snow}%
\def\sctkzsym@snowman@snowfill{\sctkzsym@snowman@snow}%
\def\sctkzsym@snowman@snowpath{\path[draw=\sctkzsym@snowman@snowstroke,fill=\sctkzsym@snowman@snowfill]}%
\def\sctkzsym@snowman@eyefill{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@nosestroke{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@nosefill{\sctkzsym@snowman@nose}%
\def\sctkzsym@snowman@mouthstroke{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@sweatstroke{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@sweatfill{\sctkzsym@snowman@sweat}%
\def\sctkzsym@snowman@mufflerstroke{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@mufflerfill{\sctkzsym@snowman@muffler}%
\def\sctkzsym@snowman@buttonstroke{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@buttonfill{\sctkzsym@snowman@buttons}%
\else
% "white snowman"; white snow; black eyes/mouth/stroke; bodystroke should be there
\def\sctkzsym@snowman@bodystroke{\sctkzsym@defaultcolor}%
\def\sctkzsym@snowman@bodyfill{}%
\def\sctkzsym@snowman@bodypath{\path[draw=\sctkzsym@snowman@bodystroke]}%
\def\sctkzsym@snowman@snowstroke{\sctkzsym@snowman@snow}%
\def\sctkzsym@snowman@snowfill{}%
\def\sctkzsym@snowman@snowpath{\path[draw=\sctkzsym@snowman@snowstroke]}%
\def\sctkzsym@snowman@eyefill{\sctkzsym@defaultcolor}%
\def\sctkzsym@snowman@nosestroke{\sctkzsym@snowman@nose}%
\def\sctkzsym@snowman@nosefill{\sctkzsym@snowman@nose}%
\def\sctkzsym@snowman@mouthstroke{\sctkzsym@defaultcolor}%
\def\sctkzsym@snowman@sweatstroke{\sctkzsym@snowman@sweat}%
\def\sctkzsym@snowman@sweatfill{\sctkzsym@defaultanticolor}%
\def\sctkzsym@snowman@mufflerstroke{\sctkzsym@snowman@muffler}%
\def\sctkzsym@snowman@mufflerfill{\sctkzsym@snowman@muffler}%
\def\sctkzsym@snowman@buttonstroke{\sctkzsym@snowman@buttons}%
\def\sctkzsym@snowman@buttonfill{\sctkzsym@snowman@buttons}%
\fi
% check eyes (only fill)
% [TODO] eyes=<color> unsupported; falling back to default-(anti)color)
\sctkzsym@hndl@key@withbool{snowman}{eyes}%
\def\sctkzsym@snowman@eyepath
{\path[fill=\sctkzsym@snowman@eyefill]}%
% check nose
\sctkzsym@hndl@key@withbool{snowman}{nose}%
\def\sctkzsym@snowman@nosepath
{\path[draw=\sctkzsym@snowman@nosestroke,fill=\sctkzsym@snowman@nosefill]}%
% check mouth (only stroke)
% [TODO] mouth=<color> unsupported; falling back to default-(anti)color)
\sctkzsym@hndl@key@withword{snowman}{mouthshape}%
\sctkzsym@hndl@key@withbool{snowman}{mouth}%
\def\sctkzsym@snowman@mouthpath
{\path[draw=\sctkzsym@snowman@mouthstroke]}%
% check sweat
\sctkzsym@hndl@key@withbool{snowman}{sweat}%
\def\sctkzsym@snowman@sweatpath
{\path[draw=\sctkzsym@snowman@sweatstroke,fill=\sctkzsym@snowman@sweatfill]}%
% check hat
\sctkzsym@hndl@key@withbool{snowman}{hat}%
\def\sctkzsym@snowman@hatstroke{\sctkzsym@snowman@hat}%
\def\sctkzsym@snowman@hatfill{\sctkzsym@snowman@hat}%
\def\sctkzsym@snowman@hatpath
{\path[draw=\sctkzsym@snowman@hatstroke,fill=\sctkzsym@snowman@hatfill]}%
% check arms
\sctkzsym@hndl@key@withbool{snowman}{arms}%
\def\sctkzsym@snowman@armsstroke{\sctkzsym@snowman@arms}%
\def\sctkzsym@snowman@armsfill{\sctkzsym@snowman@arms}%
\def\sctkzsym@snowman@armspath
{\path[draw=\sctkzsym@snowman@armsstroke,fill=\sctkzsym@snowman@armsfill]}%
% check muffler
\sctkzsym@hndl@key@withbool{snowman}{muffler}%
\def\sctkzsym@snowman@mufflerpath
{\path[draw=\sctkzsym@snowman@mufflerstroke,fill=\sctkzsym@snowman@mufflerfill]}%
% check buttons
\sctkzsym@hndl@key@withbool{snowman}{buttons}%
\def\sctkzsym@snowman@buttonpath
{\path[draw=\sctkzsym@snowman@buttonstroke,fill=\sctkzsym@snowman@buttonfill]}%
% check snow
\sctkzsym@hndl@key@withbool{snowman}{snow}%
% check note (only fill)
\sctkzsym@hndl@key@withbool{snowman}{note}%
\def\sctkzsym@snowman@notefill{\sctkzsym@snowman@note}%
\def\sctkzsym@snowman@notepath{\path[fill=\sctkzsym@snowman@notefill]}%
% check mikan/leaf
\sctkzsym@hndl@key@withbool{snowman}{mikan}%
\sctkzsym@hndl@key@withbool{snowman}{leaf}%
\def\sctkzsym@snowman@mikanstroke{\sctkzsym@snowman@mikan}%
\def\sctkzsym@snowman@mikanfill{\sctkzsym@snowman@mikan}%
\def\sctkzsym@snowman@mikanpath
{\path[draw=\sctkzsym@snowman@mikanstroke,fill=\sctkzsym@snowman@mikanfill]}%
\def\sctkzsym@snowman@leafstroke{\sctkzsym@snowman@leaf}%
\def\sctkzsym@snowman@leaffill{\sctkzsym@snowman@leaf}%
\def\sctkzsym@snowman@leafpath
{\path[draw=\sctkzsym@snowman@leafstroke,fill=\sctkzsym@snowman@leaffill]}%
% check broom (only stroke)
\sctkzsym@hndl@key@withbool{snowman}{broom}%
\def\sctkzsym@snowman@broomstroke{\sctkzsym@snowman@broom}%
\def\sctkzsym@snowman@broompath{\path[draw=\sctkzsym@snowman@broomstroke]}%
%
% check adjustbaseline
\sctkzsym@hndl@key@onlybool{snowman}{adjustbaseline}%
%
% drawing snowman
\set@sctkzsym@coord@scl{\sctkzsym@snowman@scale}%
\ifdim\sctkzsym@coord@scl<\z@\set@sctkzsym@coord@scl{-\sctkzsym@snowman@scale}\fi%
%
%%%%% input from def file
%
\expandafter\ifx\csname sctkzsym@snowman@shape@\sctkzsym@snowman@shape\endcsname\relax
\PackageError{scsnowman}{%
Unsupported value `\sctkzsym@snowman@shape' for shape}\@ehc
\else
\csname sctkzsym@snowman@shape@\sctkzsym@snowman@shape\endcsname
\fi
%
%%%%%
%
% key initialization using default
\sctkzsym@snowman@defaultkeys
}
%
% definition of \scsnowmandefault{...}
\newcommand{\scsnowmandefault}[1]{%
\renewcommand{\sctkzsym@snowman@defaultkeys}{%
% key initialization
\sctkzsym@snowman@initkeys
% read <key>=<value> (init=true is silently ignored)
\setkeys{sctkzsym@snowman}{#1,init=false}%
}%
\sctkzsym@snowman@defaultkeys
}
%
% definition of \usescsnowmanlibrary{...}
\newcommand{\usescsnowmanlibrary}[1]{%
\edef\@tempa{\zap@space#1 \@empty}%
\@for\@tempa:=\@tempa\do{%
\chardef\sctkzsym@catcode=\catcode`\@\relax
\makeatletter\input{scsnowman-\@tempa.def}%
\catcode`\@=\sctkzsym@catcode\relax}%
}
\@onlypreamble\usescsnowmanlibrary
%
% load shape definitions
\usescsnowmanlibrary{normal}% default
%
\endinput
%%
%% End of file `scsnowman.sty'.