読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

夏といえば、やっぱり「ゆきだるま」!

暑い日々が続いていますが、いかがお過ごしでしょうか。私は暑くて融けてしまいそうなのですが、今日は8月8日です。待ちに待ったナントカの日ですね!

というわけで、今日は、暑い日々にもめげずに必死で融けずにがんばっているゆきだるま☃を見て、涼むことにしましょう。

f:id:acetaminophen:20160808031038p:plain

☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃ ⛄ ⛇ ☃

 

あの画期的なパッケージ再来!

昨年末、ある画期的なパッケージを本ブログで発表しました。ゆきだるまの絵を LaTeX 文書に簡単に挿入する「scsnowman パッケージ」です。

このパッケージを使えば、Unicode に収録されている「ゆきだるま3兄弟」(U+2603, U+26C4, U+26C7) のヤヤコシイ「フォントによる字形の多用性」を、統一的なオプションで一意に表現することができるようになるのでした。フォントによる字形の多様性については、過去記事を参照してください。

さて、scsnowman パッケージの使い方を簡単に復習してみましょう。まだ入手していない方は、お手数ですが GitHub からダウンロードしてください:

pLaTeX + dvipdfmx の場合の使い方の一例です:

% pLaTeX 文書
\documentclass[dvipdfmx]{jsarticle}
\usepackage{scsnowman}
\begin{document}
ゆきだるま\scsnowman
マフラー付き\scsnowman[muffler=red]\par
帽子と雪あり\scsnowman[hat,snow]\par
大きめの黒ゆきだるま\scsnowman[scale=3,body]
\end{document}

f:id:acetaminophen:20160808005710p:plain

今回は、「ナントカの日」にちなんで新機能を追加し、パワーアップした scsnowman パッケージを徹底的に紹介しようと思います。

 

デフォルト変更機能

従来は \scsnowman をオプション引数なしで単独で使うと、必ず「プレーンのゆきだるま」が出ていました。つまり、“異体字” を出すためにはその都度 \scsnowman[hat=red,muffler=red] のようにオプション引数を与える必要がありました。これでは、たとえば前回登場していただいた「黒☃大輔さん」は、苗字の☃が登場するたびその都度オプション引数を書くか、自前の命令を定義しておく必要がありました。

\documentclass[dvipdfmx,twocolumn]{jsarticle}
\usepackage{scsnowman}
\newcommand{\mysnowman}{\scsnowman[body=true,hat,snow,muffler]}
\begin{document}
私、黒\mysnowman 大輔は、1950年に黒\mysnowman 太郎の長男として誕生しました。
その後、黒\mysnowman 家には…
\end{document}

f:id:acetaminophen:20160808010855p:plain

「自分の苗字以外に☃を書類に書くことはないので、デフォルトを変更できるとよいですね…」という黒☃さんからの要望を受けまして、新たな命令を用意しました。

\scsnowmandefault{<key>=<value>,...}:以降の文書での、オプション無指定時の☃のデフォルト字形を指定する。

引数一つを必ずとる命令です。引数書式は \scsnowman[<key>=<value>,...] のオプションと全く同じで、一度実行しておくと以降ではデフォルトとしてこの指定が使われます。もし以降の箇所で、明示的に \scsnowman のオプション引数が使われた場合は、「デフォルト指定されたオプションからの変化」として認識されます。実際の例を見てみましょう。

\documentclass[dvipdfmx,twocolumn]{jsarticle}
\usepackage{scsnowman}
\begin{document}

\scsnowmandefault{body,hat,snow,muffler}%
私、黒\scsnowman 大輔は、1950年に黒\scsnowman 太郎の長男として
誕生しました。その後、黒\scsnowman 家には…

\scsnowmandefault{hat,snow,arms}%
お隣には白\scsnowman さんが住んでいました。白\scsnowman さんは、
宛名の文字を「\scsnowman」でなく「\scsnowman[arms=false,muffler]」
と書いてしまうとお手紙を読まずに食べてしまうような変わった方でした。
ただし、\scsnowman[hat=red]のように帽子に色が付いた宛名を見ると、
白\scsnowman さんは喜んでいました。

\end{document}

f:id:acetaminophen:20160808012853p:plain

この例だと少し分かりにくいかもしれませんが、たとえば「全部の☃を大きくしたい!」という場合に\scsnowmandefault{scale=10} を予め書いておく、という使いかたができます。

 

異体字” の拡張

今回は buttons、mouthshape、sweat というキーを追加しました。buttons と sweat は true / false / 色を指定し、mouthshape は以下に示すように3通りの形から選びます。

\documentclass[dvipdfmx]{jsarticle}
\usepackage[svgnames]{xcolor}
\usepackage{scsnowman}
\begin{document}

% buttons で「ボタン」(マフラーの有無で微妙に位置が変わる)
\scsnowmandefault{scale=15,hat=Green,arms=Brown,snow=SkyBlue}
\scsnowman[buttons=RoyalBlue,muffler=Red]
\scsnowman[buttons=RoyalBlue]

% mouthshape で「口の形」
\scsnowmandefault{scale=15,hat,muffler=Red}
\scsnowman[mouthshape=smile]% にっこり
\scsnowman[mouthshape=frown]% しかめっ面
\scsnowman[mouthshape=tight]% 真一文字

% sweat で「汗」
\scsnowman[mouthshape=tight,arms,buttons,sweat]

\end{document}

f:id:acetaminophen:20160808014003p:plain

 

もっと文書に☃を!

ご存じのとおり、TeX/LaTeX はアレです。そんな LaTeX をどうしても使わなければならない、でももっと文書作成を楽しみたいという場合、真面目な文書の中にかわいらしいゆきだるま☃がたくさん出てきてくれると、なんだか愉快な気持ちになれるかもしれません。そこで、そんな需要に応えるべく、scsnowman パッケージ側でいくつかの機能を提供することにしました。

「証明終わり記号」を☃にしたい

\makeqedsnowman\makeqedother という命令で挟んだ部分の proof 環境(amsthm パッケージが提供)で、証明終わり記号が☃になります。

\documentclass[dvipdfmx,a6paper,papersize]{jsarticle}
\usepackage{scsnowman}
\newtheorem{theorem}{定義}
\newtheorem{definition}{定理}
\renewcommand{\proofname}{証明}
\begin{document}
\begin{definition}\normalfont
ゆきだるまとは,…
\end{definition}
\begin{definition}\normalfont
\TeX はDonald E. Knuthに…
\end{definition}
\begin{theorem}\normalfont
ゆきだるまはカワイイ。
\end{theorem}
\makeqedsnowman  % QED をゆきだるまに
\begin{proof}
定義により,ゆきだるまはカワイイ。
\end{proof}
\makeqedother    % 元に戻す
\begin{theorem}\normalfont
\TeX はアレ。
\end{theorem}
\begin{proof}
定義により,\TeX はアレである。
\end{proof}
\end{document}

f:id:acetaminophen:20160808021541p:plain

「箇条書き」を☃にしたい

\makeitemsnowman\makeitemother で挟んだ部分の itemize 環境で、箇条書きのラベルが☃になります。四階層でそれぞれ赤・青・緑・黄の☃が現れます。

\documentclass[dvipdfmx,a5paper,papersize]{jsarticle}
\usepackage{scsnowman}
\begin{document}
ゆきだるまで箇条書き:
\makeitemsnowman
\begin{itemize}
  \item 動物
  \begin{itemize}
    \item 哺乳類
    \item 鳥類
    \item\end{itemize}
  \item 植物
  \begin{itemize}
    \item 裸子植物
    \item 被子植物
    \begin{itemize}
      \item 単子葉類
      \item 双子葉類
      \begin{itemize}
        \item 合弁花類
        \item 離弁花類
      \end{itemize}
    \end{itemize}
  \end{itemize}
\end{itemize}
\makeitemother
\end{document}

f:id:acetaminophen:20160808020934p:plain

ちなみに QED の案は doraTeX さんのツイートから拝借しました。

コラム:命令の名前について

\makeナントカカントカ という命令は、LaTeX(というかチョットした TeX on LaTeX)に少しでも触れたことがある人なら、何となく見覚えがあるのではないでしょうか。そう、言わずと知れた \makeatletter\makeatother です。恐らく初見では誰しも「ナンジャコリャ?」で、解ってくると何だか少し TeX ができるようになったような嬉しい気分になるという沼の入り口ですね。これは勿論 make O C という第5文型ですから、これを踏襲した名称にしました。

 

もっと文書を☃に!

ここまで読んでもまだ満足しない方がいらっしゃるかもしれません。

「文書の一部だけ☃でも足りない! もっともっと☃の割合を高めるべきだ!」

という主張が考えられます。そこで、文書中に☃を入れるのではなく、文書そのものを☃にしてしまいましょう

これを実現してくれるのが、\makedocumentsnowman です(ちなみに、\makedocumentother は必要ありません。\makedocumentsnowman を実行した時点で、文書は☃だけになっているのですから、\makedocumentother を実行する余地などないのです)。

この命令は「文書を☃にする」ものですから、\begin{document} よりに書きます*1。たとえば以下のようにします:

\documentclass[dvipdfmx]{jsarticle}
\usepackage{scsnowman}
\makedocumentsnowman
\begin{document}
\TeX はアレ、ああ\TeX はアレ、\TeX はアレ
\end{document}

f:id:acetaminophen:20160808024232p:plain

あるいは、以下でも大丈夫です(ただしこの場合、クラスオプション=グローバルオプションが scsnowman パッケージ読み込み時点で指定されていないため、「ドライバ指定」が極めて難しくなります。このため、この例ではドライバ自動判定に任せられる pdflatex で処理可能な例を挙げます):

% pdflatex
\RequirePackage{scsnowman}
\makedocumentsnowman
\docomentclass{article} % コマンドが間違っていても
10 INPUT A              % もはや TeX っぽくなくても
20 INPUT B              % どうせ無視されるので
30 C=A+B                % なんでも OK!
40 PRINT C
50 END

f:id:acetaminophen:20160808024232p:plain

このように、\makedocumentsnowman さえ発行してしまえば、それ以降がどんな入力であっても処理結果は常に「ゆきだるま三兄弟」になります。どこかの誰かが似たようなことをやっていた気がしますね*2

 

終わりに

ここまで来て「ナントカの日」がわからない方へ一言:

暑い夏を、たまには「ゆきだるま☃」を眺めて涼みながら、どうにか乗り切りましょう。

*1:文書開始後に書かれていた場合は、エラーを返すようにしていますが、エラーが無視された場合は一応、その時点で「☃三兄弟」だけを出して終了するようにチョットだけ頑張ります。ただし失敗することも多いはず。

*2:今回のはアレ以上に「あまりにも下らないネタであるため、ロクにテストをしていない」状態で、実装も雑ですし、バグがある可能性が非常に高いことを断っておきます。