LaTeXでフォントまわりをいじるのははっきりいってかなりつらい。ワードの100倍つらい。人によってはトラウマを抱えている人もいるでしょう。なぜならTeX/LaTeXというソフトウェアのつくりが全くもって今風じゃないので常識的に出来るだろと思う方法は全部無理。 日本語フォントに関してワード並みに簡単にフォントを変更する方法をメモしておく。説明などいらん、という方のために結論を先に書く。タイトル通り超簡単。

少しだけ更新。\special命令を使うのが最も早そう。platex+dvipdfmxチェーン前提。

\specialで日本語フォントをメイリオに置き換え

以下をプリアンブルに書く。

\special{pdf:mapline rml H meiryo.ttc}
\special{pdf:mapline gbm H meiryo.ttc}

少なくとも私の環境ではこれでメイリオに代わる。こんなに簡単に変えられるならXeLaTeXとかいらないよな。

kanjix.mapの差し替えで日本語フォントをメイリオに置き換え

作業中の.texファイルがあるフォルダを開いて次の内容のkanjix.mapというテキストファイルを置く。

rml H meiryo.ttc
gbm H meiryob.ttc

以上。一応platexdvipdfmx前提ということに注意。あと横書きのみ。\special命令による方法を見つけてしまった今としてはこの方法のメリットあるんだろうか、、、

太字が認識されない場合

本来太字になってほしい所が太字になっていないときなど、場合によっては次のような警告が出る.

Font shape `JT1/gt/regular/n' undefined(Font) using `JT1/gt/m/n' instead
Font shape `JY1/gt/regular/n' undefined(Font) using `JY1/gt/m/n' instead
Font shape `JT1/mc/bold/n' undefined(Font) using `JT1/mc/m/n' instead
Font shape `JY1/mc/bold/n' undefined(Font) using `JY1/mc/m/n' instead

この場合は.texのプリアンブルに次を書いて明示的に代替フォントシェープを定義すると警告は消える。

\DeclareFontShape{JT1}{gt}{regular}{n}{<->ssub*gt/m/n}{}
\DeclareFontShape{JY1}{gt}{regular}{n}{<->ssub*gt/m/n}{}
\DeclareFontShape{JT1}{mc}{bold}{n}{<->ssub*mc/bx/n}{}
\DeclareFontShape{JY1}{mc}{bold}{n}{<->ssub*mc/bx/n}{}

何に代替するかは好みによる。はっきり言ってメイリオの太字はかなり太い。物によっては欧文フォントと釣り合わない。いい感じに調整しよう。

フォントが置き換わる仕組み

実はこの方法はTeXの仕組み的には行儀のいい方法ではありません。参考ページにあるとおり、TeXはタイプセットの段階、platexを走らせる段階ではフォントは見ていません。フォントのサイズ(.tfmファイルで定義されるフォントメトリック)だけ参照して文字を並べています。この方法ではdvipdfmxで具体的なフォントを埋め込むときの日本語フォントをメイリオにしています。なぜうまくかというと日本語フォントはだいたいサイズが皆同じだから。普通の明朝体のつもりで文字を配置してそれをメイリオの置き換えても崩れたりしません。欧文フォントだと横幅を詰めたりする関係でそうはいかないようです。

で、.texのある場所になぜkanjix.mapを置くかというとdvipdfmxが参照する優先度がデフォルトのkanjix.mapがある場所よりも高いから。dvipdfmxはまず.cfgファイルで指定された.mapファイルを探す。kanjix.mapはデフォで指定されていてものはtexmf-dist配下にあり通常ならこれが参照される。しかし.texのあるフォルダにこの名前のファイルがあるとこちらが先に参照されて結果的に埋め込まれるフォントはメイリオに置き換わる。

これが仕組み。本当にマナーのよい方法はtexmf-dist配下のkanjix.map.texのあるフォルダにコピーしてきてそいつを編集すること。もとのkanjix.mapファイルは結構コメントが書いてあって人にやさしい。でもrmlとかgbmとかなんの略やねんというのはご愛敬(ローマン体とかゴシック体とかね、本当は、たぶん、気が向いたら調べてまとめる)。そこ、人間がいじる可能性あるんだから略するところではないでしょというのを略してしまうのがTeXの古き伝統。

さらにいうなら本当はdvipdfmx -f hogehoge.map hogehoge.texというように-fオプションでmapファイルを指定したらいいんだけども例えばTeXStudioを使っている場合はオプションをファイルごとに指定できない。かといってタイプセットのたびにコマンド叩いていたらIDE使ってる意味ないやんということで、ファイルごとに(正確にはフォルダごとに、でもそれなりにデカい文書は1つのフォルダに関連ファイル入れてるよね)フォント指定出来てTeXStudioから普通にタイプセットできるベストな方法。

\special命令を使うと本当にファイルごとになるのでkanjix.mapの書き換える行数が少ない場合はベスト。書き換える行数がバカみたいに増えてきたときはkanjix.mapすり替え戦法もまだ望みあるかな。\input\special行だけ読み込ませるというのもあるか。

所感

冒頭に書いた「常識が通用しない」話、今風のこの手のソフトウェアならフォント名を.tex内に書くだけで出来るはずだよなということ。(ここ追記、\specialで思ったようなことが出来ます。)HTML/CSSとか行けてるんなら技術的になんの苦労もないでしょう。まあでも今更TeXが今風になることはないと思われる。XeLaTeXを使えという説があるが日本語扱うならなんだかんだplatex使うのよな。なんで個別に別なのを作るかな。

参考ページ

TeXとフォント https://texwiki.texjp.org/?TeXとフォント
dvipdfmx/フォントの設定 https://texwiki.texjp.org/?dvipdfmx%2Fdvipdfmx/フォントの設定

その他いろいろ。