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
以上。一応platex
→dvipdfmx
前提ということに注意。あと横書きのみ。\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/フォントの設定
その他いろいろ。