マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

scsnowman-libでチョット違った☃画像をつくろう

連日の猛暑の暑さが猛暑的に暑くて、まるで猛暑の暑さのような暑い猛暑になっています。特に今年の夏は猛暑が猛暑的に暑い猛暑になっていて、「暑さ暑さも猛暑まで」という猛暑的な言い伝えの通り……(中略)……ゆきだるま☃!

というわけで、夏の暑さにも負けずに今年も「ゆきだるま☃の日」がやってきました!

☃で問題解決しない話

さて、これまで「ゆきだるま☃の日」のネタでは、☃の圧倒的な問題解決能力をみてきました。いま是非とも解決したい問題といえば、もちろん「この夏の暑さ😖」ですね。さっそく☃の力を借りてスマートに解決したいところ、ですが……

ざんねん🙃

とはいっても、☃はゆきだるまなので「見ていて涼しそう」なことは確かです。いやもしかしたら「別に全然涼しそうでない」という人もいるかもしれませんが、それでも「素敵😊」なことは間違いありません。というわけで、今年は問題解決の方はチョットお休みして「素敵😊な☃画像をつくる」ことに関心を向けてみましょう。

scsnowmanでとにかく☃画像する話

さて「素敵😊な☃画像をつくる」方法といって真っ先に思い浮かぶのは、やはりLaTeXのscsnowmanパッケージですね😃

scsnowmanを利用すると簡単にイロイロな☃が描画できます。

% pdfLaTeX文書
% standaloneクラスを用いるので, tikzpicture環境の
% "中身"だけが文書として出力される.
\documentclass{standalone}
\usepackage[svgnames]{xcolor}% SVGの色名を利用する
\usepackage{tikz}
\usepackage{scsnowman}% ゆきだるま☃
\begin{document}
% 72dpiでビットマップ画像に変換した際に
% "TikZ座標の1単位=1ピクセル"
% になるように, 単位を1bpに設定する.
\begin{tikzpicture}[x=1bp, y=1bp]
% 画像の大きさを強制的に指定する(480bp×270bp)
\useasboundingbox (0,0) rectangle (480,270);
% あとは自由に \scsnowman するだけ😊
\node at ( 80,135) {\scsnowman[scale=18,
  hat, buttons, arms, muffler=Red, snow]};
\node at (240,135) {\scsnowman[scale=18,
  hat, buttons, arms, muffler=Blue, sweat, mouthshape=tight]};
\node at (400,135) {\scsnowman[scale=18,
  hat, buttons, arms, muffler=Green, snow]};
\end{tikzpicture}
\end{document}

イロイロな☃の出力結果

素敵😊

このようにscsnowmanは素晴らしいパッケージですが、チョット機能不足なところもあります。昨年の「TeX & LaTeX Advent Calendar」の記事では「背景のあるフツーの☃画像をscsnowmanでつくるのは難しい」という話をしました。そして、その解決策の1つとして拙作の​「scsnowman-lib」というライブラリの話をしました。

その記事にある「背景のあるフツーの☃画像」の例を再掲しておきます。

% pdfLaTeX文書
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}% ゆきだるま☃
% zrextraライブラリを読み込んで塗りつぶしの色を指定する
\usescsnowmanlibrary{zrextra}
\sczrextrasetup{bodyfill=White, snowfill=White}
\begin{document}
\begin{tikzpicture}[x=1bp, y=1bp]
\useasboundingbox (0,0) rectangle (480,360);
\fill[DarkGreen] (0,0) rectangle (480,40);
\fill[SkyBlue!5] (0,40) rectangle (480,360);
\shade[top color=SkyBlue!65, bottom color=SkyBlue!5]
  (0,180) rectangle (480,360);
\node at (232,248) {\scsnowman[scale=64, shape=zrextra,
  muffler=Red, hat=Green, buttons=RoyalBlue, arms=Brown, snow=SkyBlue]};
\end{tikzpicture}
\end{document}

背景のあるフツーの☃の出力結果

scsnowman-libのライブラリ群には「どっかのZR氏🙃が☃画像をつくるにあたって今まで必要になったイロイロな機能」が集められています。本記事ではscsnowman-libを利用してもっともっと多様な☃画像をつくる方法を解説していきます。

scsnowman-libでイロイロ☃画像する話

※scsnowman-libのインストール方法および“動作原理”(ゆきだるま定義ファイル)の説明はアドベントカレンダーの記事に書かれているのでそちらを参照してください。

塗りつぶした☃で画像する方法

まずは、背景のある画像で必要となる「塗りつぶした☃」を例にして、scsnowman-libの全般的な使い方を改めて説明します。

scsnowman-libは複数のライブラリ(ゆきだるま定義ファイル)の集まりですが、今回必要になるのは、その中で最も基本的なzrextraライブラリです。scsnowmanのライブラリを読み込むには\usescsnowmanlibraryという(scsnowmanパッケージの)命令を使います。

% zrextraというライブラリを読み込む
\usescsnowmanlibrary{zrextra}

ライブラリ(ゆきだるま定義ファイル)を読み込むと新しい☃の「形状」が定義されます。\scsnowman命令のオプションのパラメタの中でshapeキーを指定すると、この新しい形状をもつ☃を描画できます。zrextraの機能を有効にした☃、つまり「zrextraの形状の☃」を描画する場合はshape=zrextraを指定することになります。

% zrextraの形状の☃を描画する
\snowman[shape=zrextra,«他のパラメタ»...]

scsnowman-libのライブラリの共通仕様1として、ライブラリに特有のパラメタは\sczrextrasetupという命令で指定します2。

  • \sczrextrasetup{«キー»=«値»,...}: scsnowman-libのライブラリについて、ライブラリに特有のパラメタを設定する。
  • \sczrextrareset: パラメタの設定値を既定値に戻す。

scsnowman-libの共通仕様としては次のパラメタキーが存在します。つまり、これらのパラメタは、zrextraをはじめとするscsnowman-libの全てのライブラリで使用できます。

  • bodyfill=«色»|false: ☃の体の塗りつぶしの色を指定する。falseを指定した場合は塗りつぶしをしない。[既定値=falseï¼½
  • snowfill=«色»|false: 雪玉の塗りつぶしの色を指定する。falseを指定した場合は塗りつぶしをしない。[既定値=falseï¼½
    ※色はxcolorの色式で指定する(scsnowmanでの色指定と同じ)。
  • boldness=«実数»: 線の太さを指定する。実数の値は標準に対する倍率を表す。[既定値=1ï¼½
  • bold=«真偽値»: bold=trueはboldness=1.6と等価で、bold=false指定はboldness=1と等価。

まとめると、体や雪玉を塗りつぶした☃を描画するには以下の要領で命令を実行すればいいことになります。

% プリアンブルで
\usepackage{scsnowman} % ゆきだるま☃
\usescsnowmanlibrary{zrextra} % 拡張ゆきだるま☃
\sczrextrasetup{bodyfill=«体の塗りつぶしの色»,snowfill=«雪玉の塗りつぶしの色»}% 専用パラメタ
% 文書本体中で
\snowman[shape=zrextra,«他のパラメタ»...]% "形状"を指定する

早速、青い背景色を指定して涼しそうな☃を描いてみましょう!💁

% pdfLaTeX文書
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}
\colorlet{coolhat}{blue!80!green!75!black}
\colorlet{coolmuffler}{blue!50!green}
\colorlet{coolarms}{green!30!black!50}
\colorlet{coolsnow}{blue!80!green!40}
% zrextraライブラリを読み込む
\usescsnowmanlibrary{zrextra}
% zrextra特有のパラメタの設定
\sczrextrasetup{%
  bodyfill=white,       % 体の塗りつぶしの色
  snowfill=coolsnow!30} % 雪玉の塗りつぶしの色
\begin{document}
\begin{tikzpicture}[x=1bp, y=1bp]
\fill[blue!80!green!40, use as bounding box]
  (0,0) rectangle (320,240);
\node at (160,120) {\scsnowman[scale=24,
  shape=zrextra,% "zrextraの% pdfLaTeX文書
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}
\colorlet{coolhat}{blue!80!green!75!black}
\colorlet{coolmuffler}{blue!50!green}
\colorlet{coolarms}{green!30!black!50}
\colorlet{coolsnow}{blue!80!green!40}
% zrextraライブラリを読み込む
\usescsnowmanlibrary{zrextra}
% zrextra特有のパラメタの設定
\sczrextrasetup{%
  bodyfill=white,       % 体の塗りつぶしの色
  snowfill=coolsnow!30} % 雪玉の塗りつぶしの色
\begin{document}
\begin{tikzpicture}[x=1bp,y=1bp]
\fill[blue!80!green!40, use as bounding box]
  (0,0) rectangle (320,240);
\node at (160,120) {\scsnowman[scale=24,
  shape=zrextra,% "zrextraの☃"にしたい
  snow=coolsnow,% これは雪玉の輪郭の色
  muffler=coolmuffler, hat=coolhat, arms=coolarms]};
\end{tikzpicture}
\end{document}
"にしたい
  snow=coolsnow,% これは雪玉の輪郭の色
  muffler=coolmuffler, hat=coolhat, arms=coolarms]};
\end{tikzpicture}
\end{document}

涼しそうな☃の出力結果

トッテモ涼しそうで素敵😊

太線の☃で画像する方法

scsnowman-libのパラメタにはbodyfillとsnowfillの他にboldnessとboldがあります。これは☃を描くときの線の太さを変更するものです。

数値を表記するときに、素敵にするために「8」の代わりに☃を書くことがよくあります(ありますよね🙃)が、その場合には線を太くしておくと「8」っぽく見えやすいかもしれません。

% XeLaTeX文書; 文字コードはUTF-8
\documentclass[margin=10pt]{standalone}
\usepackage{fontspec}
\setmainfont{Harano Aji Gothic}
\usepackage{xcolor,scsnowman}
\colorlet{coolblue}{blue!80!green!75!black}
\colorlet{coolgreen}{blue!50!green}
\usescsnowmanlibrary{zrextra}% 拡張ゆきだるま☃
\sczrextrasetup{% zrextra特有のパラメタの設定
  boldness=2} % 線の太さを2倍にする
\newcommand*\mySnowman[1]{%
  \scsnowman[shape=zrextra, scale=1.35,
    adjustbaseline, muffler=#1]}
\begin{document}
\fontsize{50}{50}\selectfont\strut
\textcolor{coolblue}{2024}\,å¹´%
\mySnowman{coolblue}月\mySnowman{coolgreen}日%
\end{document}

「8」っぽい☃の出力結果

トッテモ「8」っぽくて素敵(多分🙃)

塗りつぶさない☃で画像する方法

scsnowmanのフツーの☃では帽子(hat)やボタン(buttons)は必ず塗りつぶされます。体の色の話とは逆に、帽子やボタンを塗りつぶさない☃を描きたい場合はscsnowmanでは対応できません。

zrnofillライブラリを利用すると「帽子とボタンを塗りつぶさない☃」を描画できます。zrnofillもscsnowman-libのライブラリの一種なので使い方は先ほど述べた通りです。要するにzrextraのところをzrnofillに変えると、帽子とボタンが塗りつぶされなくなります。

※zrnofillの☃でも帽子とボタン以外のもの(マフラーなど)の塗りつぶしは変わりません。

% プリアンブルで
\usepackage{scsnowman} % ゆきだるま☃
\usescsnowmanlibrary{zrnofill} % 塗りつぶさない☃
\sczrextrasetup{«特有パラメタ»...}
% 文書本体中で
\snowman[shape=zrnofill,«他のパラメタ»...]% "形状"をzrnofillに

zrnofillの使用例として、「壁に描いた落書き」のような☃の画像をつくってみます。

\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,xcolor,scsnowman}
\usetikzlibrary{patterns}
\usescsnowmanlibrary{zrnofill}% 塗りつぶさない☃
% scsnowman-libのパラメタ設定はzrnofillでも使える
\sczrextrasetup{bold}% 線を太くする
\colorlet{k}{black}
\definecolor{mybrick0}{rgb}{0.60,0.30,0.10}
\definecolor{mygray0}{rgb}{0.60,0.40,0.40}
\definecolor{mywhite0}{rgb}{1.00,0.90,0.70}
\colorlet{mybrick}{mybrick0!75!k}
\colorlet{mygray}{mygray0!75!k}
\colorlet{mywhite}{mywhite0!85!k}
\begin{document}
\begin{tikzpicture}[x=1bp, y=1bp]
\shade[top color=mybrick!80!k, bottom color=mybrick,
  shading angle=60, use as bounding box]
  (0,0) rectangle (320,180);
\pattern[pattern color=mygray, pattern=bricks]
  (0,0) rectangle (320,180);
\node[rotate=15, text=mywhite] at (160,90) {%
  \scsnowman[scale=14, shape=zrnofill,
    arms, buttons, hat]};
\end{tikzpicture}
\end{document}

落書きのような☃の出力結果

チョット違った感じで素敵😊

zrnofillの他の使い方として「ヒラギノっぽい☃をつくる」というものがあります。ヒラギノフォントの(無表情で有名な)☃は帽子が塗りつぶされていません。

「ヒラギノフォントの☃がチョット好きだけど、そのために課金するまででもない」という人は、zrnofillを使うと“それっぽいやつ”がつくれます😎

% LuaLaTeX文書; 文字コードはUTF-8
\documentclass[margin=10pt]{standalone}
\usepackage{luatexja}
\usepackage{scsnowman}
\usescsnowmanlibrary{zrnofill}% 塗りつぶさない☃
\sczrextrasetup{boldness=1.15}% 線を少し太くする
\newcommand*\mySnowman[1]{%
  \scsnowman[shape=zrextra, scale=1.35,
    adjustbaseline, muffler=#1]}
\begin{document}
\fontsize{50}{50}\selectfont\strut
ヒラギノの%
\scsnowman[shape=zrnofill, adjustbaseline,
  hat, mouthshape=tight]%
です(違う)。
\end{document}

ヒラギノフォントっぽい☃の出力結果

ヒラギノっぽくて素敵😎

チョット微笑む☃で画像する方法

ヒラギノフォントといえば、「角ゴシックW0の☃は少し微笑んでいる」という話があります。

「ヒラギノ角ゴシックW0の☃がチョット好きだけど(ry」という人は、zrslightライブラリが有用かもしれません。これは「少し微笑んでいる☃」を描くためのライブラリです。
※基本的な使い方はzrextraやzrnofillと同じなので、これ以降のライブラリ紹介では省略します。

% pdfLaTeX文書
\documentclass{standalone}
\usepackage{tikz,scsnowman}
% もちろんライブラリは複数併用可能
\usescsnowmanlibrary{zrnofill}% 塗りつぶさない☃
\usescsnowmanlibrary{zrslight}% 少し微笑んでいる☃
\sczrextrasetup{boldness=1.15}% 少し線を太くする
\usepackage{sourcesanspro}
\begin{document}
% フォントを Source Sans Pro Light にする
\sffamily\fontseries{l}\selectfont
\color{blue!90!green!50!black}% 文字の色
\begin{tikzpicture}[x=1bp, y=1bp]
\fill[green!50!cyan!20, use as bounding box]
  (0,0) rectangle (480,270);
\node[scale=6] at (90,170) {CID+};
% ヒラギノ角ゴシックのW0っぽい☃
\node at (190,147) {\scsnowman[scale=14,
  shape=zrslight, hat]};% 形状をzrslightにする
\node[scale=12] at (290,135) {21};
% ヒラギノ角ゴシックのW0以外っぽい☃
\node at (390,147) {\scsnowman[scale=14,
  shape=zrnofill, hat, mouthshape=tight]};% zrnofillにする
\end{tikzpicture}
\end{document}

ヒラギノ角ゴシックW0っぽい☃の出力結果

ヒラギノ角ゴシックW0っぽくて素敵😎😎

サンタ的な☃で画像する方法

zrsantaライブラリを利用すると「帽子がサンタ帽になっている☃」を描画できます3。

※「zrsataの形状の☃では帽子がサンタ帽である」わけなので、サンタ帽の色を指定するパラメタはhatです。

% pdfLaTeX文書
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}
\usescsnowmanlibrary{zrsanta}% サンタ的な☃
\sczrextrasetup{bodyfill=White}
\begin{document}
\begin{tikzpicture}[x=1bp, y=1bp]
\fill[DarkGreen, use as bounding box]
  (0,0) rectangle (400,400);
\node at (200,200) {\scsnowman[scale=45, shape=zrsanta,
  hat=Red, % これはサンタ帽に関する設定
  muffler=Red, arms=DarkOrange, buttons=Green]};
\end{tikzpicture}
\end{document}

クリスマスっぽい☃の出力結果

クリスマスっぽくてトッテモ素敵😍

嘆き悲しむ☃で画像する方法

zrsobbingライブラリを利用すると「嘆き悲しむ☃」を描画できます。

zrsobbingライブラリはscsnowman-libの共通のものに加えて以下のパラメタをもちます。
※bodyfillなどのscsnowman-libの共通パラメタも使用可能です。

  • sobbingmouthfill=«色»: 開けた口の中の色。

また、zrsobbingの形状の☃ではsweatで汗の代わりに涙が描かれます。

最近の「ゆきだるまの日」はネタを披露する人が少なくて☃が悲しんでいるかもしれないので、zrsobbingで嘆き悲しむ☃を描いてみましょう。

% pdfLaTeX文書
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}
\usescsnowmanlibrary{zrsobbing}% 嘆き悲しむ☃
\sczrextrasetup{bodyfill=white}
\begin{document}%
\begin{tikzpicture}[x=1bp, y=1bp]
  \fill[Yellow!10, use as bounding box]
    (0,0) rectangle (480,270);
  \node at (240,135) {\scsnowman[scale=32, shape=zrsobbing,
    sweat=SkyBlue, % これは涙に関する設定
    hat=Green, muffler=Red, buttons=RoyalBlue, arms=Brown]};
\end{tikzpicture}
\end{document}

嘆き悲しむ☃の出力結果

悲しそうだけど素敵😊

太ましい☃で画像する方法

zrmassyライブラリを利用すると「太ましい☃」を描画できます。単純に\scaleboxなどで横方向に伸長したのとは異なり、線の太さが変わらないので、自然な描画が得られます。

zrmassyライブラリはscsnowman-libの共通のものに加えて以下のパラメタをもちます。

  • massy=«実数»: 横幅の標準に対する倍率。

竜巻について解説している☃をzrmassyで描いてみましょう。

% XeLaTeX文書; 文字コードはUTF-8
\documentclass{standalone}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman}
\usepackage{fontspec}
\setmainfont{mplus-1p-bold.ttf}% M+ 1p
  [LetterSpace=-2, AutoFakeBold=6]
\usescsnowmanlibrary{zrmassy}% 太ましい☃
\sczrextrasetup{bodyfill=White,
  massyscale=1.44}% かなり太ましい
\newcommand*{\cMessage}{%
  強い竜巻だと毎秒100m近い風が\\
  吹くが これは僕が飛ぶぐらいの強さ}
\begin{document}
\begin{tikzpicture}[x=1bp, y=1bp,
  mytext/.style={xscale=1.6, yscale=2.2, align=left}]
\useasboundingbox (0,0) rectangle (480,360);
\fill[SkyBlue!5] (0,40) rectangle (480,360);
\shade[top color=SkyBlue!65, bottom color=SkyBlue!5]
  (0,200) rectangle (480,360);
\node at (240,200) {\scsnowman[scale=42, shape=zrmassy,
  muffler=Red, hat=Green, arms=Brown, buttons=RoyalBlue,
  mouthshape=tight]};
\fill[DarkGreen] (0,0) rectangle (480,60);
\node[mytext, text=Black, font={\bfseries}]     at (240,30) {\cMessage};
\node[mytext, text=Yellow!40, font={\mdseries}] at (240,30) {\cMessage};
\end{tikzpicture}
\end{document}

太ましい☃の出力結果

いかにも太ましいけど素敵(多分🙃)

まとめ

というわけで皆さん、涼しそうな☃画像でこの夏の猛暑を吹き飛ばしましょう!(無理😥) それが無理でも、素敵😊な画像をひたすら眺めて猛暑を忘れてしまいましょう!(無理😥)


  1. ただし、scsnowman-libのライブラリ群の中には“古い設計”になっているもの(例えばzrboldやzrsymmetric)があり、これらは共通仕様に従いません。この記事では共通仕様に従う“新しい設計”のライブラリだけを取り扱うものとします。
  2. ライブラリが「\scsnowman命令のパラメタ(オプション)を新しく設ける」ことはできないので、別の専用の命令を用意しています。なお、これらの命令による専用パラメタ設定は局所的(グルーピングに従う)です。
  3. zrchristmasというライブラリもありますが、これは“古い設計”のものです。