SATySFi APIの宣伝

これは「SATySFi Advent Calendar 2019」の1日目の記事です。

とうとう始まりましたSATySFi Advent Calendar 2019

楽しんでいきましょう。

SATySFiを使う時に

皆さんSATySFi使ってますよね?

このSATySFiですが、使っているとき(特にパッケージを作っているとき)に「○○の機能を持つ関数やコマンドは無いかな~」と思う時ありませんか?

また、「このコマンドや関数の使い方は何だろうか?」とか「このパッケージはどんな関数やコマンドを提供してくれるのだろうか」とか思うことは無いでしょうか?

ということでこれを解決するためにSATySFi APIというサイトを作ってみました。

使い方

まずSATySFi APIにアクセスします。すると各テーマごとにリンクが貼られているのでそれぞれのページへ飛んでください。 すると、そのテーマに合うパッケージとモジュールが照会されており、そのモジュール内で提供されている関数やコマンドの型と説明が書いてあります。

使っている技術

サイトはGitHubPagesを利用しています。 内容についてはSATySFiのテキスト出力モードを利用してHTMLファイルをsatyファイルから自動生成しています。

内容の充実化

見てわかる通り、中身はお世辞にも充実しているとは言えません。

SATySFiだけを使っているのでsatyフォルダ内にページを作り、HTMLファイルをdocsフォルダに生成させることは簡単にできます。 Pull Requestを送っていただけると嬉しいです。

今後の予定

定義コードへジャンプする機能の追加や記法の追加、モバイル端末への対応などを行っていく予定です。

将来SATySFi公式サイトができた時にデータを提供できるよう頑張っていきます。

SATySFiの出力ログをチョットダケ素敵にする

本文

SATySFiでは出力ログを使っていろいろなメッセージを出すことができます。

出力ログはエラーを伝えたりするときに重要ですが、それだと味気ないので☃を出せるようにしました。

パッケージはここにあります。

let () = SnowmanLog.log

みたいな感じで使ってください。

一応使ってる技術を説明すると、string-unexplode に10だけが入っているリストを渡すと改行文字を作成してくれるのでそれを利用してstring listの中身を結合しています。 本文でembed-stringを使って表示するときには使えないテクニックですが、標準出力では使えます。

おまけ

???「今回少なくない?」

puri「今日まで合宿だったんです。許してください。」

SATySFiのコンパイル時間を調べてみた

という疑問がTwitterで出ていたので簡単に調べることにした。

実験してみた

実験方法

LuaLaTeX で和文しない速さを調べてみたという記事と同じように、

  • テスト用文書として「世界人権宣言(UDHR)の英語の全文を 50 回記したもの」を使う。レターサイズで 300 ページ程度。
  • Windows 10 + Ubuntu on WSL + TeX Live 2018 の環境においてのpdfLaTeX コンパイル所要時間と、Windows 10 + Ubuntu on WSL + SATySFI v0.0.3 で比較する。
  • 3 回予備で実行した後、9 回実行して所要時間を計測、その中間にある 5 回分の平均値を求めた。

実験結果

  • pdfLaTeX : 0.817 秒
  • SATySFi : 37.126 秒

SATySFiのほうが45.44倍遅い。

まとめ

SATySFiのほうが圧倒的に遅かったが、これは.satysfi-auxを書き出すのに時間がかかったからだと考えている(あとで検証してみます)。

--bytecompオプションを付けると若干早くなっていた。一応効果はあるようだ。

SATySFi で文書作成が容易なMarkdown用のクラスファイルを作成した(※ただし画期的)

これは「SATySFi Advent Caleandar 2018」の25日目の記事です。 (22日目は gfngfnさんでした。)

SATySFiには本質的な内容を出力する画期的な文書クラスがあります。使いこなしていきたいところですね。

ところで、SATySFiでは--markdownというオプションをつけてやることでMarkdown文書からPDFを出力することができます。これはこのSATySFi Advent Calendar 2108の12日目の記事で詳しく書いてあるとおりです。 この記事の中では

裁設定名 〈s〉 を変えることで様々な体裁のPDFを出力できるようにしており,現在のところリポジトリが提供しているのは mdja という名前の設定のみですが,ユーザ自身が設定を用意することも可能です.

と書いてあります。

そういうわけでこの画期的な文書クラスであるscarticle.satyhをMarkdown処理用に改造をしてみました。

中にはmdsc.satyhとmdsc.satysfi-mdとtest.mdの3つのファイルがあるはずです。

まずはmdsc.satysfi-mdファイルを~/.satysfi/dist/mdに移動させましょう。次にmdsc.satyhファイルを~/.satysfi/dist/packagesに移動させましょう。 これでこの文書クラスを使う準備ができました。

あとは

$ satysfi --markdown mdsc test.md

とすれば本質的な内容のPDFファイルが出力されるはずです。

12日目の記事で書いてあるとおり、Markdown文書の先頭で特殊なコメント<!-- -->を使うことによってヘッダを指定することができます。

ここで指定できるヘッダはscarticleと同じで(|title : string ; show-title = bool;|)というレコード型です。デフォルトでは(|title = ` `; show-title = false;|)です。試しに書いてみましょう。

[christmas.md]

<!-- (|
title = `Happy SATySFiing!` ;
show-title = true;
|) -->

とっても素敵な文章
$ satysfi --markdown mdsc christmas.md
 ---- ---- ---- ----
  target file: 'christmas.pdf'
  dump file: 'christmas.satysfi-aux' (will be created)
  parsing 'christmas.md' ...
  parsing 'mdsc.satyh' ...
  parsing 'pervasives.satyh' ...
  parsing 'list.satyg' ...

(省略)

 ---- ---- ---- ----
  embedding fonts ...
 ---- ---- ---- ----
  writing pages ...
 ---- ---- ---- ----
  output written on 'christmas.pdf'.

f:id:puripuri2100:20181224225753p:plain
christmas

この通り、本質的な内容を持つトッテモ素敵な文書になっています。しかも素敵な帽子まで! 今日は12月25ですからね(正確には、24日の夜から25日の朝までの間なので)。

LuaLaTeXで部誌を作った話

本稿は TeX & LaTeX Advent Calendar 2018 の2日目の記事です。1日目はZRさんでした。3日目はh-kitagawaさんです。

はじめに

私は某K校に通っているのですが、そこで「パズル研究部」なるところに所属して“編集長”という肩書をもらって活動をしています。

さて、そのパズル研究部では毎年9月中旬に行われる文化祭に団体として参加し、部誌を配るということをしています。 勿論、部誌配布以外にも色々とやっているのですがここでは割愛します。

その部誌ですが、今まではWordなどというソフトで作成していたらしいです。ですが、引き継ぎが引き継がれなかったためLuaLaTeXで作成することにしました。

ということで、LuaLaTeXで作成した部誌について少しここで話してみたいと思います。

この部誌作成の特徴は、

  • 複数人から集めた記事とパズル画像をどう管理するか
  • パズル画像を載せる際に必要な「作者」や「難易度」と言った情報をどのように書くのか
  • 来年以降も使い回せるようにどこまで簡略化するのか

といったことに気をつけながら作成していった点です。ですので、ここらへんについて話したいと思います。

LuaLaTeX要素

TeXLaTeX Advent Calendar 2018の重点テーマはは「とにかくLua(La)TeXしよう」ということらしいので少しだけLuaLaTeX要素を。

今回はLuaLaTeXを使用して部誌を作成しました。

LuaLaTeXを使用した理由はいくつかあります。

1つ目はフォントの変更が容易なことです。学校の印刷機輪転機だと、文字がかすれてしまう可能性があったため、小塚Pr6Nを使用することにしました。なので、小塚フォントへの変更が容易なluatexja-presetパッケージを使用するためにもLuaLaTeXを採用しました。

2つ目はPDFを直接出力することです。部誌の内容の関係でTikZやgraphicxパッケージなどを使用することが多く、dviwareのことを考えるのが面倒だっため、LuaLaTeXにしました。

3つ目は、たまたまLuaLaTeXを触り始めて標準のエンジンをLuaLaTeXにしていたからです。これにはとくに深い理由はありません。

大まかな作成の方法と過程

今回は、このような順番で作成しました。

  1. パズルの種類ごとにあるルールと過去の部誌から流用する記事を.texファイルに書く
  2. 部誌を作るのに必要なコマンドを作成する
  3. 例題用のPDFファイルをLaTeXで作成し、貼り付ける
  4. パズル画像が入るであろう部分に仮の画像を入れて実際に作成
  5. パズルを集めてレベル付けと別解チェックをし、流し込む
  6. 最終確認をして印刷・輪転・製本

部誌のデザイン

部誌のデザインは代々続いてきたデザインをある程度踏まえたものにしました。

内容的には、記事部分とパズル部分、解答部分になります。

パズル部分は以下のようになります。

f:id:puripuri2100:20181125101440p:plain
部誌問題

解答部分は基本このようになります。

f:id:puripuri2100:20181125101442p:plain
部誌解答

ltjsarticleクラスに、geometryパッケージを用いることで余白の調節を行いました。

部誌を作るのに必要なコマンドを作成する

画像を配置する際に、一々コマンドを書くのがめんどうだったので作成しました。

\puzzle{〈作者名〉}{〈難易度〉}{〈パズル画像のファイル名〉}というコマンドでパズルを追加できるようにしたいという気持ちだったので実際に作りました。他にも、例題用にも、解答用にも同様なコマンドを追加しました。

中身はかなり単純で、

\newcounter{toi}[syu]
\newcommand{\puzzle}[3]{%
\stepcounter{toi}
\caption{\thetoi \hspace{2\zw} 作/#1\hfill Lv.#2  }
\includegraphics[clip,width=\figurewidth]{#3}
}

という風に、\caption\includegraphicsを肩代わりさせるだけのものです。なので、実際に使う際には

\begin{figure}[ht]
 \centering
  \begin{minipage}{0.4\hsize}
  \centering
  \puzzle{ぷりにゃん}{2}{nurikabe/puri-3-toi}
  \end{minipage}
  \begin{minipage}{0.4\hsize}
  \centering
  \puzzle{ぷりにゃん}{2}{nurikabe/puri-1-toi}
  \end{minipage}
\end{figure}
\vspace{-2\zw}
\begin{figure}[ht]
 \centering
  \begin{minipage}{0.4\hsize}
  \centering
  \puzzle{ぷりにゃん}{2}{nurikabe/puri-1-toi}
  \end{minipage}
  \begin{minipage}{0.4\hsize}
  \centering
  \puzzle{ぷりにゃん}{2}{nurikabe/puri-2-toi}
  \end{minipage}
\end{figure}

のようにしなければならず、かなりわかりにくいものになってしまいました。 ただ、コマンドをある程度省略できたことは大きかったです。

例題用のPDFファイルをLaTeXで作成する

パズルというものはルールだけ読んでもわかりにくいものも多いため、我が部の部誌では例題を付けるようにしています(定石を入れておくという意味もあったり……)。

ところが、この例題の画像も引き継がれなかったため、LaTeXで作成することにしました。

描く方法はもちろんTikZです。

今回の部誌に乗るパズルは以下のようになっていました。

この内、虫食い算はmusikuiパッケージを使えば作成できるので考えませんでした。

さて、残りのパズルのうちイラストロジックだけ数字を枠の外に並べていくという特異な点があるものの、概ね似たような構造になっていたのでパッケージ化して楽に作成してしまうことにしました。そのパッケージは一応ここに上げておきます。

さて、パッケージ化にあたってはある程度パズルの描画方法を一般化しておかないと使い回せませんのでしていきます。 説明の都合上、上に上がっているパズルのうち虫食い算を除いたパズルについてのみ話します。

  1. このパズルは正方形をしていて、その中が碁盤の目のように区切られています。ただし、このとき区切られ方は様々で、線の種類も様々です。また、区切られている数も異なります。

  2. これらの内の大半では直線が引かれます。ただし、その直線の引かれ方にも種類があり、区画の中央を通っていくものと区画と区画の境目を通っていくものの2通りになります。

  3. これらにはだいたい数字や黒丸などが書かれます。これらは区画の中央に配置されます。この内、数字については時折白文字にする必要があります。

  4. 黒塗りのマスです。これは三角形もしくは四角形の集合体です。

これらを一気に実現するには座標による直接的な指定が一番良いでしょう。

ということでこのようにして要素を指定してくことにしました

  • 盤面は固定なので、各パズルごとに設定する
  • 線は、始点と終点の座標を指定させて引く
  • 数字は、\nodeコマンド等を使用して直接置く
  • 四角形の黒塗りのマスは、長方形を書く要領で座標を2つ指定して描画する
  • 三角形の黒塗りのマスは、三点指定する

あとは頑張って座標を指定していくだけです。

この作業は死ぬほど疲れました。

パズルの回収と保管

我が部では連絡をLINEで行い、実際に作ったパズルも各自作成したアルバムに入れるという方法を取っていました。

また、アルバムに入っている写真も、ノートに書いたパズルを写真で撮っただけのものから、きちんと画像化してあるものまでバラバラでした。

ここで全員にGitをインストールさせて進捗を作るという手もあったのですが、流石にみんな対応してくれないだろうということで自分が頑張ることにしました。

  1. アルバムからパズルの画像をダウンロードする
  2. もし、そのパズルの画像が、きちんとしたものになっていなかったならばぱずぷれを使って画像化してダウンロードする
  3. ダウンロードする際に、〈作成者名〉-〈そのパズルの中で、何個目のものなのか〉-〈問もしくは解〉という命名法で名前をつけて保存
  4. 保存先は、それぞれのパズルの種類ごとに作成したフォルダ
  5. GitLabに予め作成してあったリポジトリにpush
  6. アルバムに更新があったら同じことをする

以上の繰り返しです。これを3ヶ月間くらい行いました。

パズル画像が入るであろう部分に仮の画像を入れて実際に作成

パズルがすべて提出されるのを待っていたらいつまで経っても作成できないので、仮置き用の画像を使って作成しておいてあとでファイル名を変更していく方法を取りました。その仮置き用の画像がこれです。

仮置き画像

パズルを集めて別解チェックとレベル付けをし、流し込む

いくら金を取らないものであったとしても、解が複数個あるものやそもそもとして成立しないものを配布するのは良くないことなので対策をします。また、初心者がいきなり難しい問題を解こうとすると地獄なので、難易度もつけておかないといけません。

まずは別解チェックです。 これは単純に問題を解くだけです。しかし、適当に解くと別解を潰せないのでしっかりとやります。具体的には、「必ず埋められるところは埋めていき、2通り以上の可能性がある場合はその可能性を全て試して潰していく」という方法を取ります。 かなり辛いです。前に15進法の虫食い算の別解チェックをした際には5個くらいの別解が出てしまい、紙が8枚ほど溶けました。

このとき、別解が出てしまったら作成者に連絡して修正してもらいます。大概の場合は条件を少し増やすだけで乗り切れますが、それでも無理な場合は諦めます。と言う前のことですが、修正後のパズルも、もう一度最初から別解チェックをします。

別解が無いことを確認できたら難易度をつけます。4段階ですが、あまり明確な基準はありません。解かないと難易度はわからないので別解チェックをした人がレベル付けを担当します。

ちなみに人によって解けるパズルと解けないパズルがあるのでこれをうまく割り振って回収する必要があります。この作業がかなり辛く、何日か消えました。

最終確認をして印刷・輪転・製本

出来上がったPDFファイルを印刷して部の人に見てもらい、誤字脱字等を直してもらいました。「このパズル入れられないの~?」とか言った要望を急に言われたりしましたが、なんとか乗り切り輪転と製本に入ることができました。

輪転は学校の輪転機を数日間占領して行いました。その結果、毎年恒例だったらしい「文化祭準備中の輪転」を回避することができました(前日の朝に少しだけ輪転してしまったので前日輪転回避とはなりませんでしたが……)。

自分は他の団体での活動があったので製本はあまり手伝えなかったのですが、ページ数が増えたのでかなり辛い作業になっていたようです。ですが、今までより時間的余裕があったことから製本を文化祭前日に全て終わらすことができ、これもまた伝統となっていた「当日製本」を回避することにせいこうしました。

ファイル構造

その結果ファイル関係は以下のようになりました。

│  nipori.sty
│  nipori15.pdf
│  nipori15.tex
│  titlepage.tex
│
├─bijutukan
│      bijutukan-kaitou.tex
│      bijutukan.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─heyawake
│      heyawake-kaitou.tex
│      heyawake.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─iraroji
│      iraroji-kaitou.tex
│      iraroji.sty
│      iraroji.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─LITS
│      LITS-kaitou.tex
│      LITS.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─masyu
│      masyu-kaitou.tex
│      masyu.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─musikuizan
│      musikuizan-kaitou.tex
│      musikuizan.tex
│      demo.jpeg
│      puri-1-kai.pdf
│      puri-1-kai.tex
│      puri-1-toi.pdf
│      puri-1-toi.tex
│
├─norinori
│      norinori-kaitou.tex
│      norinori.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─nurikabe
│      nurikabe-kaitou.tex
│      nurikabe.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
│
├─sikakunikire
│      sikakunikire-kaitou.tex
│      sikakunikire.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─sudoku
│      sudoku-kaitou.tex
│      sudoku.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─suririn
│      suririn-kaitou.tex
│      suririn.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─syakasyaka
│      syakasyaka-kaitou.tex
│      syakasyaka.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─yajirin
│      yajirin-kaitou.tex
│      yajirin.tex
│      demo.jpeg
│      puri-1-kai.jpg
│      puri-1-toi.jpg
│      .
│      .
│      .
│
├─kaitou
│      kabe-kaitou.tex
│      kabe-toi.tex
│      kabe1.indd
│      kabe1.pdf
│      kaitou.tex
│
├─rei
│      demo-puzzle.sty
│      bijutukan1.pdf
│      bijutukan1.tex
│      bijutukan2.pdf
│      bijutukan2.tex
│      bijutukan3.pdf
│      bijutukan3.tex
│      bijutukan4.pdf
│      bijutukan4.tex
│      heyawake1.pdf
│      heyawake1.tex
│      heyawake2.pdf
│      .
│      .
│      .

ファイル関係の構成に関しては失敗したと思っています。

ファイルの読み込みは

nipori15.tex <- bijutukan.tex <- bijutukan1.pdf
                              <- bijutukan2.pdf
                              <- bijutukan3.pdf
                              <- bijutukan4.pdf
                              <- puripuri-1-toi.png

             <- heyawake.tex <- heyawake1.pdf
                             .
                             .
                             .

             .
             .
             .

             <- kaitou.tex <- bijutukan-kaitou.tex <- puripuri-1-kai.png
                                                   .
                                                   .
                                                   .

                           <- heyawake-kaitou.tex
                           .
                           .
                           .

という風になっており、かなり複雑になってしまいました。

課題

例題作成等はうまく行った思っていますが、パズルの配置とファイル関係に関しては改善の余地があると考えています。

パズルの配置に関しては、もっとコマンドを省略できるはずです。しかし、提出されるパズルの中には通常の2倍のサイズのものや、4倍のサイズのものもあるので、そこの例外をどう処理すればよいのか少し悩んでいます。

ファイル関係に関しては、流石にファイルを分割しすぎたと思っています。もっとファイルを纏めても問題ないような気がします。

何にせよ、自分が卒業したあとも後輩が問題なく部誌を作り続けられるような仕組みを今のうちに作っておきたいものです。

さいごに

いろいろと苦労しましたが部誌ができて良かったです。どうせ来年も編集長をやるので好き勝手やりたいと思っていますが、その後に後輩に引き継いでいくことを考えるとわかりやすいファイル構造や、ドキュメント作成等を考えなければなと思っています。

commit数は以下のようになっていました。

f:id:puripuri2100:20181125101444p:plain
commit数

アイコンとスマホの壁紙を作った話

はじめに

はじめまして、TwitterGitHubとかでのんびりやっているpuripuri2100です

今日は201☃年☃月☃日ですね。

ということでちょっとだけ素敵かもしれないゆきだるまネタを用意してみました。

 

可愛い可愛いゆきだるまですが、ずっとずっと一緒にいたくなりますよね。そこでTwitterGitHub等で使うアイコン、そしてスマホの壁紙を作ってみました(前にも作ってみて採用していたのですが、元データがどっかに行ってしまったり色々とあったのでこれを機に作り直すことにしました)。

アイコン

コンセプトは基本的にはワトソンさんの記事を参考にしましたが、以下のような感じです。

 

  • 正方形でも円形でも問題なく見えること
  • ゆきだるま要素を入れること
  • 茜色を頑張ってねじ込むこと(可愛い可愛いE6系新幹線の車体色ですよ!)
  • 基本の形を維持しつつ、季節によって少し変化を加えることが可能であること

さて、上の条件を満たすものを作るわけですが、ここはLaTeX(xcolorパッケージとscsnowmanパッケージも)を使うしか無いでしょう。

基本のソースコードは下のようになりました。あとは季節ごとにマフラーの色とかを変えるだけです。


    \PassOptionsToPackage{svgnames,x11names}{xcolor}
    \documentclass[tikz,margin=-1.2cm]{standalone}
    \usepackage{tikz}
    \usepackage{scsnowman}
        \definecolor{AKANE}{HTML}{b7282e}
        \definecolor{AMA}{HTML}{2ca9e1}
        \definecolor{RURIKON}{HTML}{19448e}
        \definecolor{KOKUTAN}{HTML}{16160e}
        \definecolor{TOKIWA}{HTML}{028760}
        \definecolor{KONPEKI}{HTML}{007bbb}
    \begin{document}
        \begin{tikzpicture}
            \path[fill=AKANE] (0,0) circle (3cm);
            \path[fill=white] (0,0) circle (2.8cm);
            \node[scale=18] at (0, 0) {\scsnowman[hat=RURIKON,muffler=TOKIWA,arms=KOKUTAN,snow=AMA,buttons=KONPEKI]};
        \end{tikzpicture}
    \end{document}

これをLuaLaTeXでコンパイルしてPNGファイルに変換するとこんな感じになります(なぜかTeX2imgが使えないのです……)。

アイコンの基本デザイン

周囲を茜色の円で囲い、その中にゆきだるまを入れるだけの単純なデザインです。

可愛いですね~

壁紙

自分のスマホAndroidなので特にこれと言って気にすることはありませんでした。

灰色の背景にアイコンと同じデザインを載せるだけの本当に単純なデザインにしました。ソースコードはと結果下のようになりました。


    \documentclass[a5paper]{article}
    \usepackage{bxpapersize}
    \usepackage{tikz}
    \usepackage{scsnowman}
    \usepackage[top=0truemm,bottom=0truemm,left=0truemm,right=0truemm]{geometry}
    \usepackage{xcolor}
        \definecolor{AKANE}{HTML}{b7282e}
        \definecolor{AMA}{HTML}{2ca9e1}
        \definecolor{RURIKON}{HTML}{19448e}
        \definecolor{KOKUTAN}{HTML}{16160e}
        \definecolor{TOKIWA}{HTML}{028760}
        \definecolor{KONPEKI}{HTML}{007bbb}
    \pagestyle{empty}
    \begin{document}
    \pagecolor{gray}
        \begin{center}
        \begin{tikzpicture}
            \draw (4.5,8.8) -- (4.5,-8.8) ;
            \draw (-4.5,-8.8) -- (-4.5,8.8);
            \path[fill=AKANE] (0,0) circle (3cm);
            \path[fill=white] (0,0) circle (2.8cm);
            \node[scale=18] at (0, 0) {\scsnowman[hat=RURIKON,muffler=TOKIWA,arms=KOKUTAN,snow=AMA,buttons=KONPEKI]};
        \end{tikzpicture}
        \end{center}
    \end{document}

f:id:puripuri2100:20180808010106p:plain

ゆきだるまを中央に置くための目印として線を左右においています。

最後に

なかなかうまくできて嬉しかったです。これは納涼バージョンですが、秋バージョンや春バージョンなどいくつか作りました。全てGitHubに置いてありますので責任は取りませんが使用はご自由に。