pLaTeXで丸数字を埋め込むマクロをつくる

要約

pLaTeXに丸数字(①②③…㊿)をUnicode文字で埋め込むマクロをかいた。

導入

LaTeXにはLuaLatexやXeLaTex、upLaTeXなどいくつかのエンジンがありますが、未だpLaTeXを使っている・使わざるを得ないという方も多いのではないでしょうか?

pLaTeXを使っていると、本文で直接書けない文字があると思います。☃が代表的かもしれませんが、特に丸数字(①②③など)はレポートや論文を書くときにも使いたくなってしまいますよね。

検索してみると、\textcircled{\scriptsize 1} のように、半角数字の"1"に円の図形をあわせることで丸数字を実現している例が見つかります。

しかし、ちゃんと丸数字も⓪から㊿までUnicodeにあるわけですから、それを利用したいと考えるのが人情(?)というものです。

\UTF マクロ

pLaTeXでは、otfパッケージにある \UTF マクロにUnicodeのコードポイントをHEXで渡すことで、文中に任意のUnicodeにある文字を埋め込むことができます。

例:

\usepackage{otf}

\begin{document}
\UTF{2460} % ① になる
\UTF{2461} % ②
\UTF{2462} % ③
\end{document}

ラッパーマクロをつくる

毎度毎度コードポイントを指定するのはちょっと大変なので、もう少し使いやすいようにラッパーマクロを作ります。 \marunum{1}としたら①が埋め込めるようにします。

多少の試行錯誤の末に、次のような頭の悪そうなマクロになりました:

\newcommand{\marunum}[1]{%
\ifcase#1%
\UTF{24EA}\or\UTF{2460}\or\UTF{2461}\or\UTF{2462}\or\UTF{2463}\or\UTF{2464}%
\or\UTF{2465}\or\UTF{2466}\or\UTF{2467}\or\UTF{2468}\or\UTF{2469}\or\UTF{246A}%
\or\UTF{246B}\or\UTF{246C}\or\UTF{246D}\or\UTF{246E}\or\UTF{246F}\or\UTF{2470}%
\or\UTF{2471}\or\UTF{2472}\or\UTF{2473}\or\UTF{3251}\or\UTF{3252}\or\UTF{3253}%
\or\UTF{3254}\or\UTF{3255}\or\UTF{3256}\or\UTF{3257}\or\UTF{3258}\or\UTF{3259}%
\or\UTF{325A}\or\UTF{325B}\or\UTF{325C}\or\UTF{325D}\or\UTF{325E}\or\UTF{325F}%
\or\UTF{32B1}\or\UTF{32B2}\or\UTF{32B3}\or\UTF{32B4}\or\UTF{32B5}\or\UTF{32B6}%
\or\UTF{32B7}\or\UTF{32B8}\or\UTF{32B9}\or\UTF{32BA}\or\UTF{32BB}\or\UTF{32BC}%
\or\UTF{32BD}\or\UTF{32BE}\or\UTF{32BF}%
\fi%
}

LaTeX上で10進数と16進数の変換などをしようとすると依存パッケージも増えるし、丸数字のコードポイントも連続していない部分もあるので、実はこの実装が一番ミニマルなのではないかという気もしています。

\ifcaseの説明を軽くしておくと、C言語のswitch文のように(といってもbreak文相当のものは不要ですが)、与えられた値(今回の#1の部分)に応じた処理を行うことができます。 はじめが0であった場合の処理で、\orを挟んで1だった場合、また\orを挟んで2だった場合……、のように0から\or毎に1だけインクリメントされた場合の処理が記述できます。

余談

\or\UTF{}を5-6個書いたあたりで面倒になってきた筆者はスクリプトを書きましたが、どう考えても50個程度直接手で書いてしまった方が早いし、実際凝り性を発揮して無駄に時間がかかってしまったので、爆速でコードを書き下せるようになりたいですね(?)

Leave a Reply