例によって人類がアレなせいで、世界が超絶アレなことになっています。もちろん最終的にはエ~アイか何かが人類……(略)……ゆきだるま !⛄
というわけで、人類が未だに存続している情勢の中、今年も辛うじてゆきだるまの日 がやってきました!
イロイロなフォントのイロイロな☃の話
さて皆さんご存じの通り、ゆきだるま ☃️といえば、「TeXと一切関係がない 」ことで有名です。というわけで、本記事ではLaTeXでのゆきだるま ☃️出力について考えましょう。
LaTeXで☃️を出力する定番の方法といえばscsnowmanパッケージ が有名です。scsnowmanを使うと、イロイロな色のマフラーを着けた素敵な☃️が得られます(素敵😊)
いつものやつ(素敵😊)
しかし世の中には「自分はイロイロなマフラーの☃️ではなく、和文フォント のイロイロなデザインの☃︎を出力したい」という人もきっといるこどでしょう。例えば、Google Fonts で 公開されているフォントに限っても、多種多様なデザインの☃︎が用意されています。
イロイロなフォントの☃(素敵😊)
これらをLaTeXで使うにはどうすればよいでしょうか。
以下では和文文書における和文☃の使用を前提とします。
LuaLaTeXでフツーにイロイロな☃をする話
日本語のLaTeXといえば、イマドキは当然LuaLaTeX (+LuaTeX-ja)ですよね。ご存じの通り、LuaLaTeXでは新しいフォントが手軽に導入できるのでカンタン 😍にイロイロな☃が書けます。
LuaTeX-jaにおいて新しい和文 フォント1 を文書中に導入するにはluatexja-fontspecパッケージの\newjfontfamily命令を利用して「そのフォントに切り替える命令 」を定義します。
\newjfontfamily \命令{ ‹フォント›}
ここで‹フォント›の部分には「フォントファイル名」「フォントファミリ名」「フォント名」の何れか2 を指定できます。
LuaLaTeXは本記事の主題ではないので詳細は割愛します。
\newjfontfamilyを利用してLuaTeX-jaでイロイロなフォントの☃を出力する例を示します。
\documentclass [ a4paper ]{ ltjsarticle }
\usepackage {luatexja-fontspec}
\newjfontfamily\jNoto { NotoSerifJP-Regular.ttf}
\newjfontfamily\jKlee { KleeOne-Regular.ttf}
\newjfontfamily\jPlex { IBMPlexSansJP-Regular.otf}
\newjfontfamily\jSawa { SawarabiGothic-Regular.ttf}
\newjfontfamily\jKais { KaiseiDecol-Regular.ttf}
\newjfontfamily\jYuji { YujiSyuku-Regular.ttf}
\newjfontfamily\jKiwi { KiwiMaru-Regular.ttf}
\newjfontfamily\jDotg { DotGothic16-Regular.ttf}
\begin{document}
{ \jNoto ☃} は素敵。\par
{ \jKlee ☃} も素敵。\par
{ \jPlex ☃} もまた素敵。\par
{ \jSawa ☃} も同様に素敵。\par
{ \jKais ☃} もやっぱり素敵。\par
{ \jYuji ☃} もとにかく素敵。\par
{ \jKiwi ☃} も例によって素敵。\par
{ \jDotg ☃} は多分素敵。\par
\end{document}
出力結果(素敵😊)
カンタンでしたね😍
upLaTeXだがそれでもイロイロな☃をしたい話
このようにイマドキのLaTeXではフォントの扱いはカンタンです。しかし、時には深い事情があって「イマドキのフツーのLaTeX」ができずに、upLaTeX(+dvipdfmx)でイロイロな☃を書きたいこともあるでしょう。
定番の裏技
pLaTeX系でイロイロなフォントを使うための定番の方法として「japanese-otfパッケージ の多書体サポートを濫用する」というものが知られています。japanese-otfのdeluxeオプションを有効にすると、和文フォントについて、次の3ファミリ7ウェイトが利用可能になります。
明朝体(\mcfamily)の細字・中字・太字ウェイト
ゴシック体(\gtfamily)の中字・太字・極太ウェイト
丸ゴシック体(\mgfamily)の中字ウェイト
といってもこれをフツーに使うのでは結局3書体 しか使えないわけですが、実は裏技 があります。LaTeXにおいて「明朝体の3ウェイトは全て同じ書体でなければならない」「ゴシック体に割り当てる書体はゴシック体書体でなければならない」という制限は存在しません 。このため実際には利用可能な7ウェイトの枠の各々に全く別の 好きな書体を割り当てても一向にかまわないのです。
というわけで「japanese-otfの多書体設定を有効にした上で各々のウェイトにpxchfonパッケージ で別々のフォントを指定する」という方法でイロイロな☃を出力できます。
\documentclass [ uplatex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ deluxe ]{otf}
\usepackage [ noalphabet ]{pxchfon}
\setminchofont { NotoSerifJP-Regular.ttf}
\setlightminchofont { KleeOne-Regular.ttf}
\setboldminchofont { IBMPlexSansJP-Regular.otf}
\setgothicfont { SawarabiGothic-Regular.ttf}
\setboldgothicfont { KaiseiDecol-Regular.ttf}
\setxboldgothicfont { YujiSyuku-Regular.ttf}
\setmarugothicfont { KiwiMaru-Regular.ttf}
\begin{document}
{ \mcfamily \mdseries ☃} は素敵。\par
{ \mcfamily\ltseries ☃} も素敵。\par
{ \mcfamily \bfseries ☃} もまた素敵。\par
{ \gtfamily \mdseries ☃} も同様に素敵。\par
{ \gtfamily \bfseries ☃} もやっぱり素敵。\par
{ \gtfamily\ebseries ☃} もとにかく素敵。\par
{ \mgfamily \mdseries ☃} も例によって素敵。\par
\end{document}
出力結果(素敵😊)
めでたしめでたし……アレレ? 1つ足りません ね……🤔
“DotGothic16”の☃(多分素敵🤔)
そもそもjapanese-otfのdeluxeモードで使える枠の数は7個です。これではどう頑張っても高々7種類の☃しか使えないのは明らかです。
今年は令和☃年なので「☃個出力したい」というのも当然の要求としてあるでしょう。どうにかして8種類以上 の和文フォントを使うことはできないでしょうか。
もっとアレな裏技
そもそもjapanese-otfのdeluxeモードが実現できていることからわかるように、(u)pLaTeXで使える和文フォントの個数には本来は制限はありません 。問題なのは、新たな和文フォントを導入するためには「pTeX系エンジンの和文フォントの仕組み」についての知識が必要でこれを説明するのが極めて困難3 ということです。
正攻法の説明を書こうとすると永遠に終わらなくなってその結果🙃が埋められる事態 に発展するおそれが高いため、ここでは代わりにチート を駆使することにします。つまり「☃を出力する」という目的に特化して「和文フォント導入の思い切り簡略化した手順 」を示すという方針をとります。
手始めに「DotGothic16」フォントを導入してみましょう。和文フォントを導入するにはどうしてもTFMファイル が必要なので用意します。といってもTFMファイルについての知識(「TFMファイルとは何か」など)は一切要りません。既存のものをコピーする ことで済ませます。
まず、upTeXの標準のTFMファイルであるuprml-h.tfmの場所をkpsewhichコマンドを使って特定します。
kpsewhich uprml-h.tfm
パス名4 が返るので、そのファイルをカレントディレクトリにniceA-h.tfmという名前でコピーしましょう。
これでTFMファイルniceA-hが用意できたので、次にこのTFMにDotGothic16をマップ します。これにはpxchfonパッケージの\usefontmapline命令を利用します。今の場合は次のようになります。
\usepackage [ noalphabet ]{pxchfon}
\usefontmapline { niceA-h unicode DotGothic16-Regular.ttf}
今のpxchfonはオプション無しで読み込むと警告が出るので`noalphabet`を指定しています。とにかく(どんなオプション指定でも)pxchfonが読み込まれれば十分なので、pxchfonが既に読込済の状況ならそのままでかまいません。
最後に「niceA-hというTFMの和文フォントを呼び出すためのLaTeXの命令」(ここでは\jDotgとする)を定義します。bxnewfontパッケージ の\newfontx*命令5 を利用すれば簡単に実現できます。
\usepackage {bxnewfont}
\newfontjascale { *}
\newfontx *\jDotg { niceA-h}
これで\jDotgを「和文フォントをDotGothic16に切り替える命令」として定義できました。今までのコードをまとめた例を示します。
\documentclass [ uplatex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ noalphabet ]{pxchfon}
\usepackage {bxnewfont}
\newfontjascale { *}
\newfontx *\jDotg { niceA-h}
\usefontmapline { niceA-h unicode DotGothic16-Regular.ttf}
\begin{document}
{ \jDotg 本日は☃天なり}
\end{document}
出力結果(多分素敵🙃)
うまくいきました😃
ここまでできれば、あとはこの作業を繰り返していくらでも和文フォントを増やせます。とりあえず8種類の☃を出力する文書をつくりましょう。8個の和文フォントを使うにはTFMも8個必要になるので、先ほどのniceA-h.tfmをコピーしてniceB-h.tfmからniceH-h.tfmまでの7つのファイルを新たに用意します。その上で次のようなソースファイルを作りました。
\documentclass [ uplatex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ noalphabet ]{pxchfon}
\usepackage {bxnewfont}
\newfontjascale { *}
\newcommand *\NewJaFont [ 3]{
\newfontx *#1 { #2}
\usefontmapline { #2 unicode #3 }
}
\NewJaFont\jNoto { niceA-h}{ NotoSerifJP-Regular.ttf}
\NewJaFont\jKlee { niceB-h}{ KleeOne-Regular.ttf}
\NewJaFont\jPlex { niceC-h}{ IBMPlexSansJP-Regular.otf}
\NewJaFont\jSawa { niceD-h}{ SawarabiGothic-Regular.ttf}
\NewJaFont\jKais { niceE-h}{ KaiseiDecol-Regular.ttf}
\NewJaFont\jYuji { niceF-h}{ YujiSyuku-Regular.ttf}
\NewJaFont\jKiwi { niceG-h}{ KiwiMaru-Regular.ttf}
\NewJaFont\jDotg { niceH-h}{ DotGothic16-Regular.ttf}
\begin{document}
{ \jNoto ☃} は素敵。\par
{ \jKlee ☃} も素敵。\par
{ \jPlex ☃} もまた素敵。\par
{ \jSawa ☃} も同様に素敵。\par
{ \jKais ☃} もやっぱり素敵。\par
{ \jYuji ☃} もとにかく素敵。\par
{ \jKiwi ☃} も例によって素敵。\par
{ \jDotg ☃} は多分素敵。\par
\end{document}
出力結果(素敵😊)
8種類の☃が無事出力できました🙂
補足:TFMファイルの配置場所
ここではnice-*.tfmのTFMファイルをカレントに置いたまま作業しましたが、もし本記事の方法を実用したい場合はこのままでは邪魔でしょう。以下の方法でカレントに置くのを避けられます。
本記事の方法を常用 する予定がある場合は、これらのTFMファイルを通常の手順に従ってローカルのTEXMFツリー6 にインストール すればよいでしょう。
特定の文書でのみ使いたい場合はTFMFONTSという環境変数に.//;という値を設定します。これでTFMを読み込む際にサブディレクトリが探索されるようになります。(過去の記事 で用いたのと同じ原理です。)
pLaTeXだがどうにかしてイロイロな☃をしたい話
もしかしたら、やんごとなき事情があってpLaTeX(+dvipdfmx)という骨董品 でイロイロな☃を使いたいという事態が生じるかもしれません。そもそもpLaTeXでは☃の文字を出すだけで大変(japanese-otfが必要になる7 )なのですが、現在のpLaTeXでは「upLaTeXのフォントを使う」というさらなる裏技 を使って8種類の☃を出力できます。
もっともっとアレな裏技
pLaTeXとupLaTeXでは和文TFMの文字コード (エンコーディング)が異なる(pLaTeXはJISエンコーディング、upLaTeXはUnicode)ので基本的に「upLaTeXのTFMをpLaTeXで使う」ことはできません。
実際に前節の「upLaTeXの裏技」で作成したTFM(例えば“Kaisei Decol”にマップしたとする)をpLaTeXで無理やり使おうとすると、TeXのタイプセットは通りますが、その先の処理で異常 になります(dvipdfmxがエラーになるか、または出力が文字化けになる)。
そもそもpLaTeXでは“☃”は和文扱いできないので、まずは“アレ”で試すことにします。
(失敗例)
\documentclass [ platex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ noalphabet ]{pxchfon}
\usepackage {bxnewfont}
\newfontjascale { *}
\newfontx *\jKais { niceA-h}
\usefontmapline { niceA-h unicode KaiseiDecol-Regular.ttf}
\begin{document}
{ \TeX } は{ \jKais アレ} 。
\end{document}
ここでもう少し考えてみましょう。upLaTeXのTFMはUnicodeなんだから、Unicodeの符号値 を指定すればいいはずです。LaTeXには「文字コードで文字を入力する」ための\symbol命令があるので、これを使ってUnicodeの符号値8 を入力してみましょう。
(失敗例)
\documentclass [ platex,dvipdfmx,a4paper ]{ jsarticle }
\begin{document}
{ \TeX } は{ \jKais \symbol { "30A2} \symbol { "30EC}} 。
\end{document}
残念ながら、pLaTeXの文字コード関連の処理はもっともっと複雑 なので、この単純な解決策は通用しません(再びdvipdfmxがエラーになります)。しかし実はここで究極の裏技 が存在します。なんと「符号値に0x110000を加えておく 」という細工を行うことで正常な出力が得られるのです😲
\documentclass [ platex,dvipdfmx,a4paper ]{ jsarticle }
\begin{document}
{ \TeX } は{ \jKais \symbol { "1130A2} \symbol { "1130EC}} 。
\end{document}
出力結果(非素敵😐)
無事にKaisei Decolの「アレ」が出ました。ここで使っているのは符号値であるため、同じ仕組を利用してKaisei Decolの☃も出せるはずです。☃の符号値はU+2603なので0x112603を指定します。
\documentclass [ platex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ noalphabet ]{pxchfon}
\usepackage {bxnewfont}
\newfontjascale { *}
\newfontx *\jKais { niceA-h}
\usefontmapline { niceA-h unicode KaiseiDecol-Regular.ttf}
\begin{document}
吾輩は{ \jKais \symbol { "112603}} である。
\end{document}
出力結果(素敵😊)
うまくいきました! それではこの「究極の裏技」を利用して8種類の☃を出力してみましょう。
\documentclass [ platex,dvipdfmx,a4paper ]{ jsarticle }
\usepackage [ noalphabet ]{pxchfon}
\usepackage {bxnewfont}
\newfontjascale { *}
\newcommand *\myNewJaFont [ 3]{
\newfontx *#1 { #2}
\usefontmapline { #2 unicode #3 }
}
\newcommand *\mySnowman { \symbol { "112603}}
\myNewJaFont\jNoto { niceA-h}{ NotoSerifJP-Regular.ttf}
\myNewJaFont\jKlee { niceB-h}{ KleeOne-Regular.ttf}
\myNewJaFont\jPlex { niceC-h}{ IBMPlexSansJP-Regular.otf}
\myNewJaFont\jSawa { niceD-h}{ SawarabiGothic-Regular.ttf}
\myNewJaFont\jKais { niceE-h}{ KaiseiDecol-Regular.ttf}
\myNewJaFont\jYuji { niceF-h}{ YujiSyuku-Regular.ttf}
\myNewJaFont\jKiwi { niceG-h}{ KiwiMaru-Regular.ttf}
\myNewJaFont\jDotg { niceH-h}{ DotGothic16-Regular.ttf}
\begin{document}
{ \jNoto \mySnowman } は素敵。\par
{ \jKlee \mySnowman } も素敵。\par
{ \jPlex \mySnowman } もまた素敵。\par
{ \jSawa \mySnowman } も同様に素敵。\par
{ \jKais \mySnowman } もやっぱり素敵。\par
{ \jYuji \mySnowman } もとにかく素敵。\par
{ \jKiwi \mySnowman } も例によって素敵。\par
{ \jDotg \mySnowman } は多分素敵。\par
\end{document}
出力結果(素敵😊)
トッテモ素敵😊😊😊
補足:裏技の限界
本記事の手順を利用した場合、新しいフォントの文字は常に「そのまま全角幅」で出力9 されます。つまり和文組版の規則に従った調整が行われずに常に「通常の漢字」と同様の出力になるということです。
従って、この手順は☃(U+2603)に限らず、⛄︎(U+26C4)や⛇(U+26C7)等の他の本質的文字あるいは漢字や仮名などの(非本質的)文字について「特定の文字だけ他のフォントから借りる」という場面にも応用が利きます。一方で和文組版の調整の範囲外となるため、ここで定義したフォントを本文組のために使用するのは不適切となります。
さらに、いつもの(u)pLaTeXの和文フォント使用に関する制限にも注意が必要です。すなわち、正常に使用できるのは「元々全角幅である文字」に限られます。
まとめ
(ソースファイル)
というわけで、イロイロなフォントでフツーに☃したい場合はLuaLaTeXしましょう !💁(せやな🙂)