scsnowmanを拡張してみた話

>これは「[TeX & LaTeX Advent Calendar 2020](https://adventar.org/calendars/5111)」の16日目の記事です．15日目の記事は[domperorさんの記事](http://raccho32.blog.fc2.com/blog-entry-109.html)，17日目の記事はaminophenさんの記事です．
Advent Calendarの箸休め程度に楽しんでもらえれば幸いです．

#はじめに
少し遅くなりましたが，Online.tex 2020お疲れ様でした．昨年は台風によって，今年は新型コロナウイルスの影響によって2年連続でTeXConfが開催されないという残念な結果になってしまいましたが，そのような状況の中で代替として，またLaTeX初心者でも比較的ハードル低く参加でき，自身の知識は未だ足りず理解の追いつかないことも多くありましたが日本のTeXの最前線を覗き見られるこのような場を用意してくださり大変良い経験となりました．
発表された方々，また何よりこのような場を企画してくださったワトソンさん，本当にありがとうございました．

#scsnowmanパッケージ
さて，Online.texといえば[雪だるまが回っていた](https://twitter.com/zr_tex8r/status/1330179584336273416)のは記憶に新しいかと思います．また，自己紹介で雪だるまの好きなパーツとその色を発表するというのも流行っていました．どうやら日本のTeX界と雪だるまは切っても切り離せない関係にあるようです[^1]．
[^1]: かく言う自分もTwitterアイコン等に雪だるまを多用しています．ところでどのような経緯で日本のTeX界といえば雪だるまとなったのでしょうか．

LaTeXで雪だるまといえば，おそらくこの記事を読んでいる方の多くはご存知かと思いますが，aminophenさんの作られたscsnowmanパッケージが有名かと思います．[^2]
[^2]: [TUG ニュースレター](https://tug.org/pipermail/tex-announce/2020/000171.html)でも取り上げられていたようです．
scsnowmanパッケージを使えばかわいい雪だるまを簡単に，さらにマフラーの有無や色の指定などを簡単に行うことができます．例えば以下のように記述すると

```LaTeX:sample.tex
%赤マフラー，帽子ありの雪だるま
\scsnowman[muffler=red, hat]
```
以下のような雪だるまを得ることができます．
![snowman1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923640/2ff16d5c-d0ce-ecaa-cdd3-f8e0a0c78aff.jpeg)
かわいいですね．より細かいscsnowmanパッケージ自体の使い方についてはこの記事では詳しくは触れません．マニュアルを読んでいただくか，作者である[aminophenさんの記事](http://acetaminophen.hatenablog.com/entry/2015/12/13/080226)を読んでいただきたいと思います．
さて，このパッケージを使うことを前提として，私も流行りの自己紹介をしておきたいと思います．私の好きなマフラーは，**黒縁の赤色マフラー**です．......残念ながらscsnowmanではこのような雪だるまを描くことが出来ません．

#scsnowmanでの色の指定
そもそもscsnowmanではどのように各部位の色を指定しているかを確認してみましょう．scsnowmanでは雪だるまを以下のパーツで構成しています．

+ body
+ eyes
+ mouth
+ nose
+ sweat
+ arms
+ muffler
+ buttons
+ snow
+ note
+ mikan
+ leaf
+ broom

scsnowmanではこれらのパーツをTikZで描いていますが，eyes，mouth，broom以外はfilldrawで描かれています（eyesはfillのみ，mouthとbroomはdrawのみ）．つまり，理論的には各パーツの縁取りと塗りつぶしの色を自由に指定することができるはずです．ところがscsnowmanでは任意に色を指定することができません．さらに，bodyのdrawに該当する部分やeyes，mouthの色を指定することができません．（ただし，bodyがfalseであればxcolorを使うことでbodyのdraw部分及びeyesとmouthを一括で色を指定することができます．）

```LaTeX:sample2.tex
%bodyのdrawに該当する場所，eyes，mouthの色を変更したい!!->xcolorを利用!!
%ただしそれぞれ個別の色を指定することはできない...
%また，bodyがtrueの場合にはこの手段も使えない...
\textcolor{blue}{\scsnowman}
```
![snowman1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923640/ac398eb9-f7bd-c2c4-9eca-b2fcbda4846d.jpeg)
これはscsnowmanの処理による影響で，bodyがtrueかfalseかによって一部の色が自動的に指定されてしまうためです．基本的に使っている場合には大した問題とはなりません．むしろ，自動で色を指定してくれるため便利です．しかし，例えば「お月見をしているマフラーをつけた雪だるまが描きたい!!逆光だから雪だるまもマフラーもgrayじゃなきゃダメだよな」といった場面でマフラーの縁取りが白色になってしまい浮いて見えるため，これがネックとなってしまいます．[^3]
[^3]: 自身の所属するサークルにおいて，ZRさんから[この絵](https://twitter.com/zr_tex8r/status/1303674171075883008)を描く際の裏話的に伺った話です．
やはり何らかの方法で縁取りの色と塗りつぶしの色を別個に指定する方法が欲しくなります．

#scsnowman+パッケージ
というわけで，それらのパーツの色をそれぞれ任意に指定できるように拡張してみました．

* [scsnowman+.sty](https://github.com/streamamz/scsnowman-)

このパッケージではfillに当たる部分とdrawに当たる部分の色別個に指定できるようにしているほか，fillの代わりにshadeを指定することができます．詳しい使い方はマニュアルを参照してください．

```LaTeX:sample3.tex
%\usepackage{scsnowman+}
%通常の赤マフラー雪だるま
\scsnowman[hat=black, muffler=red]
%縁が黒の赤マフラー雪だるま
\scsnowman*[hat=black, mufflerstroke=black, mufflerfill=red]
%マフラーがshadeになっている雪だるま
\scsnowman*[hat=black, mufflerstroke=black, shademuffler={left color=red, right color=red!50!}]
```
![snowman4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923640/7692e13e-86be-53d8-c202-fdcd0edca340.jpeg)
さらに，scsnowman+パッケージでは雪だるまの大きさの指定方法としてscale以外にbounding box 自体の大きさを指定するbbheight，雪だるま自体の大きさを指定するsmheightというオプションも追加しています．

```LaTeX:sample4.tex
%scale=3
\scsnowman*[scale=3]
%bbheight=1cm
\scsnowman*[bbheight=1cm]
%smheight=1cm
\scsnowman*[smheight=1cm]
```
![snowman5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923640/e059f9db-e50b-045a-5311-f3fbbfd05df3.jpeg)
これでより自由に雪だるまを描くことができますね．

##おまけ
もしかしたら「三段じゃない雪だるまは雪だるまとは言わない！！」だったり「ボタンが二つしかないなんてけしからん！！」といった意見をお持ちの方もいらっしゃるかもしれません．この問題に関してはscsnowmanパッケージのみで解消することができます．scsnowmanパッケージではどのような雪だるまを描画するかを他のdefファイルで定義しています．例えばscsnowmaで基本となる雪だるまはscsnowman-normal.defというファイルで定義され，そのファイルを```\usescsnowmanlibrary{normal}```という形で読み込んでいます．同様に，適当なdefファイルを書くことによって自分の望んだ雪だるまを描くことができます．例えばZRさんの作られた[scsnowman-zrchristmas.def](https://github.com/zr-tex8r/SC-tools/tree/master/scsnowman-lib)を使えば通常の帽子に代わってサンタ帽を雪だるまにかぶせることが出来ます．

```LaTeX:sample5.tex
%\usescsnowmanlibrary{zrchristmas}
\scsnowman[shape=zrchristmas, hat=red]
```

![snowman1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923640/9e5e4d2e-723a-9472-a4f9-560e117c2d41.jpeg)

色々なdefファイルを書いて雪だるまの種類を増やしてみましょう！！
なおscsnowman+.styではshapeオプションを実装していないので，この機能を利用することはできません．

#終わりに
本記事でscsnowman+パッケージを取り上げる前にTwitterで紹介したところ，作者であるaminophenさんから以下のようなリプライをいただきました．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おお，これはいつか対応しなければと思ってサボっていた機能でした。命令名はどうするか検討しますが，本家の方に取り込ませていただいてもよいでしょうか？</p>&mdash; aminophen (@aminophen) <a href="https://twitter.com/aminophen/status/1307070156888313856?ref_src=twsrc%5Etfw">September 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

もしかしたら近い将来に本家のscsnowmanで線の色と塗りつぶしの色を自由に指定できるようになるかもしれませんね．
Have a nice snowman life!!