帰ってきた「しっぽのさきっちょ」

しっぽのさきっちょ: 2017-10-03 付 (2017-10-05 更新)

TeX 日本語環境で「源ノ」フォントを使ってみた

no extension

さて,TeX Live 2017 インストール後の「$\mathrm{\TeX}$ で遊ぼう」第二弾は

  • $\mathrm{\TeX}$ で「源ノ」フォントを使ってみる

である。

「源ノ」フォントとは「源ノ角ゴシック(Source Han Sans)」および「源ノ明朝(Source Han Serif)」で構成される CJK 統一デザインの書体を指す。 「源ノ」フォントは Adobe と Google が共同で開発していて,かつオープンソースで公開されている。 この成果の一部は Google により NOTO プロジェクトに取り込まれている。

いわゆる CJK 漢字圏の文字は漢字だけでも非常に数が多く ☂ や ☃ みたいな非漢字も合わせると想像するだけでも目眩がする。 開発に携われた方々には足を向けて寝られない(何処に足を向けたらいいのだろうw)。 そして勿論,世の $\mathrm{\TeX}$nician たちがこれに指を咥えて見ているはずはないのだ。 なので私もその成果に便乗することにする。

皆さん,ありがとう!

「源ノ」フォントのインストール

早速インストールをはじめるが,源ノ角ゴシックおよび源ノ明朝は GitHub で公開されている。

これらのリポジトリから最新リリース(zip または tar.gz ファイル)をダウンロードする。 1.6 から 2 GB ほどの巨大パッケージなのでダウンロードの際はご注意を。 取得したパッケージの内,今回使うのは OTF/Japanese フォルダにある以下のファイルである。

  • 源ノ角ゴシック
    1. SourceHanSans-ExtraLight.otf
    2. SourceHanSans-Light.otf
    3. SourceHanSans-Normal.otf
    4. SourceHanSans-Regular.otf
    5. SourceHanSans-Medium.otf
    6. SourceHanSans-Bold.otf
    7. SourceHanSans-Heavy.otf
  • 源ノ明朝
    1. SourceHanSerif-ExtraLight.otf
    2. SourceHanSerif-Light.otf
    3. SourceHanSerif-Regular.otf
    4. SourceHanSerif-Medium.otf
    5. SourceHanSerif-SemiBold.otf
    6. SourceHanSerif-Bold.otf
    7. SourceHanSerif-Heavy.otf

それぞれのファイルの違いはウェイトの違いで,軽いものから昇順に並べている。 さらに各パッケージ内の Resources フォルダにある以下の CMap ファイル1 も使用する。

これらのファイルを,以下のフォルダを作成して放り込む2

  • 源ノ角ゴシック{$TEXMFLOCAL}/fonts/opentype/adobe/sourcehansansjp/
  • 源ノ明朝{$TEXMFLOCAL}/fonts/opentype/adobe/sourcehanserifjp/
  • CMap ファイル: {$TEXMFLOCAL}/fonts/cmap/sourcehanjp/

ちなみに $TEXMFLOCAL の場所は kpsewhich コマンドで調べられる。 いつもの場所だね。

$ kpsewhich -var-value=TEXMFLOCAL
C:/texlive/texmf-local

コピーできたら mktexlsr コマンドを実行して ls-R を更新しておくことを忘れずに。

$ mktexlsr
mktexlsr: Updating C:/texlive/texmf-local/ls-R...
mktexlsr: Updated C:/texlive/texmf-local/ls-R.
mktexlsr: Updating C:/texlive/2017/texmf-config/ls-R...
mktexlsr: Updated C:/texlive/2017/texmf-config/ls-R.
mktexlsr: Updating C:/texlive/2017/texmf-var/ls-R...
mktexlsr: Updated C:/texlive/2017/texmf-var/ls-R.
mktexlsr: Updating C:/texlive/2017/texmf-dist/ls-R...
mktexlsr: Updated C:/texlive/2017/texmf-dist/ls-R.
mktexlsr: Done.

これで「源ノ」フォントのインストールは完了。 一応 kpsewhich コマンドでインストールできたかどうか確認しておくとよい。

$ kpsewhich SourceHanSerif-Regular.otf
c:/texlive/texmf-local/fonts/opentype/adobe/sourcehanserifjp/SourceHanSerif-Regular.otf

upLaTeX で「源ノ」フォントを使ってみる

では文書ファイルを用意しよう。 こんな感じでどうだろうか。

\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[deluxe]{otf}

\begin{document}

{\mcfamily\ltseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・細字)}\par
{\mcfamily          ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・中字)}\par
{\mcfamily\bfseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・太字)}\par

{\gtfamily          ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・中字)}\par
{\gtfamily\bfseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・太字)}\par
{\gtfamily\ebseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・極太)}

森鷗外と内田百閒が髙島屋に行った。

\UTF{845B}飾区の\UTF{20BB7}野家  % 葛飾区の𠮷野家

\end{document}

タイプセット処理は $\mathrm{up\LaTeX}$ を選択した。 $\mathrm{up\LaTeX}$ で処理したあと dvipdfmx コマンドで PDF に変換しないといけないんだけど,「源ノ」フォント用の map ファイルは TeX Live 2017 には存在しないようなので,自前で用意しないといけない。 他の書体の map ファイルを参考に自作してみた(正しいかどうかわからないが)。

% CID
otf-cjml-h    Identity-H    SourceHanSerif-Light.otf
otf-cjml-v    Identity-V    SourceHanSerif-Light.otf
otf-cjmr-h    Identity-H    SourceHanSerif-Regular.otf
otf-cjmr-v    Identity-V    SourceHanSerif-Regular.otf
otf-cjmb-h    Identity-H    SourceHanSerif-Bold.otf
otf-cjmb-v    Identity-V    SourceHanSerif-Bold.otf
otf-cjgr-h    Identity-H    SourceHanSans-Regular.otf
otf-cjgr-v    Identity-V    SourceHanSans-Regular.otf
otf-cjgb-h    Identity-H    SourceHanSans-Bold.otf
otf-cjgb-v    Identity-V    SourceHanSans-Bold.otf
otf-cjge-h    Identity-H    SourceHanSans-Heavy.otf
otf-cjge-v    Identity-V    SourceHanSans-Heavy.otf
otf-cjmgr-h   Identity-H    SourceHanSans-Heavy.otf
otf-cjmgr-v   Identity-V    SourceHanSans-Heavy.otf

% Unicode 90JIS
otf-ujml-h    UniSourceHanSerifJP-UTF16-H   SourceHanSerif-Light.otf
otf-ujml-v    UniSourceHanSerifJP-UTF16-V   SourceHanSerif-Light.otf
otf-ujmr-h    UniSourceHanSerifJP-UTF16-H   SourceHanSerif-Regular.otf
otf-ujmr-v    UniSourceHanSerifJP-UTF16-V   SourceHanSerif-Regular.otf
otf-ujmb-h    UniSourceHanSerifJP-UTF16-H   SourceHanSerif-Bold.otf
otf-ujmb-v    UniSourceHanSerifJP-UTF16-V   SourceHanSerif-Bold.otf
otf-ujgr-h    UniSourceHanSansJP-UTF16-H    SourceHanSans-Regular.otf
otf-ujgr-v    UniSourceHanSansJP-UTF16-V    SourceHanSans-Regular.otf
otf-ujgb-h    UniSourceHanSansJP-UTF16-H    SourceHanSans-Bold.otf
otf-ujgb-v    UniSourceHanSansJP-UTF16-V    SourceHanSans-Bold.otf
otf-ujge-h    UniSourceHanSansJP-UTF16-H    SourceHanSans-Heavy.otf
otf-ujge-v    UniSourceHanSansJP-UTF16-V    SourceHanSans-Heavy.otf
otf-ujmgr-h   UniSourceHanSansJP-UTF16-H    SourceHanSans-Heavy.otf
otf-ujmgr-v   UniSourceHanSansJP-UTF16-V    SourceHanSans-Heavy.otf

% Unicode JIS04
otf-ujmln-h    UniJIS2004-UTF16-H    SourceHanSerif-Light.otf
otf-ujmln-v    UniJIS2004-UTF16-V    SourceHanSerif-Light.otf
otf-ujmrn-h    UniJIS2004-UTF16-H    SourceHanSerif-Regular.otf
otf-ujmrn-v    UniJIS2004-UTF16-V    SourceHanSerif-Regular.otf
otf-ujmbn-h    UniJIS2004-UTF16-H    SourceHanSerif-Bold.otf
otf-ujmbn-v    UniJIS2004-UTF16-V    SourceHanSerif-Bold.otf
otf-ujgrn-h    UniJIS2004-UTF16-H    SourceHanSans-Regular.otf
otf-ujgrn-v    UniJIS2004-UTF16-V    SourceHanSans-Regular.otf
otf-ujgbn-h    UniJIS2004-UTF16-H    SourceHanSans-Bold.otf
otf-ujgbn-v    UniJIS2004-UTF16-V    SourceHanSans-Bold.otf
otf-ujgen-h    UniJIS2004-UTF16-H    SourceHanSans-Heavy.otf
otf-ujgen-v    UniJIS2004-UTF16-V    SourceHanSans-Heavy.otf
otf-ujmgrn-h   UniJIS2004-UTF16-H    SourceHanSans-Heavy.otf
otf-ujmgrn-v   UniJIS2004-UTF16-V    SourceHanSans-Heavy.otf

% TEXT, 90JIS
uphminl-h   UniSourceHanSerifJP-UTF16-H SourceHanSerif-Light.otf
uphminl-v   UniSourceHanSerifJP-UTF16-V SourceHanSerif-Light.otf
uphminr-h   UniSourceHanSerifJP-UTF16-H SourceHanSerif-Regular.otf
uphminr-v   UniSourceHanSerifJP-UTF16-V SourceHanSerif-Regular.otf
uphminb-h   UniSourceHanSerifJP-UTF16-H SourceHanSerif-Bold.otf
uphminb-v   UniSourceHanSerifJP-UTF16-V SourceHanSerif-Bold.otf
uphgothr-h  UniSourceHanSansJP-UTF16-H  SourceHanSans-Regular.otf
uphgothr-v  UniSourceHanSansJP-UTF16-V  SourceHanSans-Regular.otf
uphgothb-h  UniSourceHanSansJP-UTF16-H  SourceHanSans-Bold.otf
uphgothb-v  UniSourceHanSansJP-UTF16-V  SourceHanSans-Bold.otf
uphgotheb-h UniSourceHanSansJP-UTF16-H  SourceHanSans-Heavy.otf
uphgotheb-v UniSourceHanSansJP-UTF16-V  SourceHanSans-Heavy.otf
uphmgothr-h UniSourceHanSansJP-UTF16-H  SourceHanSans-Heavy.otf
uphmgothr-v UniSourceHanSansJP-UTF16-V  SourceHanSans-Heavy.otf

% TEXT, JIS04
uphminln-h  UniJIS2004-UTF16-H  SourceHanSerif-Light.otf
uphminln-v  UniJIS2004-UTF16-V  SourceHanSerif-Light.otf
uphminrn-h  UniJIS2004-UTF16-H  SourceHanSerif-Regular.otf
uphminrn-v  UniJIS2004-UTF16-V  SourceHanSerif-Regular.otf
uphminbn-h  UniJIS2004-UTF16-H  SourceHanSerif-Bold.otf
uphminbn-v  UniJIS2004-UTF16-V  SourceHanSerif-Bold.otf
uphgothrn-h UniJIS2004-UTF16-H  SourceHanSans-Regular.otf
uphgothrn-v UniJIS2004-UTF16-V  SourceHanSans-Regular.otf
uphgothbn-h UniJIS2004-UTF16-H  SourceHanSans-Bold.otf
uphgothbn-v UniJIS2004-UTF16-V  SourceHanSans-Bold.otf
uphgothebn-h    UniJIS2004-UTF16-H  SourceHanSans-Heavy.otf
uphgothebn-v    UniJIS2004-UTF16-V  SourceHanSans-Heavy.otf
uphmgothrn-h    UniJIS2004-UTF16-H  SourceHanSans-Heavy.otf
uphmgothrn-v    UniJIS2004-UTF16-V  SourceHanSans-Heavy.otf

urml    UniSourceHanSerifJP-UTF16-H SourceHanSerif-Regular.otf
urmlv   UniSourceHanSerifJP-UTF16-V SourceHanSerif-Regular.otf
ugbm    UniSourceHanSansJP-UTF16-H  SourceHanSans-Medium.otf
ugbmv   UniSourceHanSansJP-UTF16-V  SourceHanSans-Medium.otf
uprml-h UniSourceHanSerifJP-UTF16-H SourceHanSerif-Regular.otf
uprml-v UniSourceHanSerifJP-UTF16-V SourceHanSerif-Regular.otf
upgbm-h UniSourceHanSansJP-UTF16-H  SourceHanSans-Medium.otf
upgbm-v UniSourceHanSansJP-UTF16-V  SourceHanSans-Medium.otf
uprml-hq    UniJIS-UCS2-H   SourceHanSerif-Regular.otf
upgbm-hq    UniJIS-UCS2-H   SourceHanSans-Medium.otf

% TEXT, 90JIS
hminl-h     H    SourceHanSerif-Light.otf
hminl-v     V    SourceHanSerif-Light.otf
hminr-h     H    SourceHanSerif-Regular.otf
hminr-v     V    SourceHanSerif-Regular.otf
hminb-h     H    SourceHanSerif-Bold.otf
hminb-v     V    SourceHanSerif-Bold.otf
hgothr-h    H    SourceHanSans-Regular.otf
hgothr-v    V    SourceHanSans-Regular.otf
hgothb-h    H    SourceHanSans-Bold.otf
hgothb-v    V    SourceHanSans-Bold.otf
hgotheb-h   H    SourceHanSans-Heavy.otf
hgotheb-v   V    SourceHanSans-Heavy.otf
hmgothr-h   H    SourceHanSans-Heavy.otf
hmgothr-v   V    SourceHanSans-Heavy.otf

% TEXT, JIS04
hminln-h    H    SourceHanSerif-Light.otf
hminln-v    V    SourceHanSerif-Light.otf
hminrn-h    H    SourceHanSerif-Regular.otf
hminrn-v    V    SourceHanSerif-Regular.otf
hminbn-h    H    SourceHanSerif-Bold.otf
hminbn-v    V    SourceHanSerif-Bold.otf
hgothrn-h   H    SourceHanSans-Regular.otf
hgothrn-v   V    SourceHanSans-Regular.otf
hgothbn-h   H    SourceHanSans-Bold.otf
hgothbn-v   V    SourceHanSans-Bold.otf
hgothebn-h  H    SourceHanSans-Heavy.otf
hgothebn-v  V    SourceHanSans-Heavy.otf
hmgothrn-h  H    SourceHanSans-Heavy.otf
hmgothrn-v  V    SourceHanSans-Heavy.otf

分かりにくいとは思うが,フォントの選択は以下のように対応付けている。

字体とウエイト フォント名
明朝体・細字 SourceHanSerif-Light.otf
明朝体・中字 SourceHanSerif-Regular.otf
明朝体・太字 SourceHanSerif-Bold.otf
ゴシック体・中字 SourceHanSans-Regular.otf
ゴシック体・太字 SourceHanSans-Bold.otf
ゴシック体・極太 SourceHanSans-Heavy.otf

また UniSourceHanSerifJP-UTF16-VUniSourceHanSansJP-UTF16-V という CMap ファイルは存在しないが,まぁ縦書きは使わないから,私。 縦書き用の CMap ファイルはネットを探したらあるかもしれない。 UniJIS2004-UTF16-HUniJIS-UCS2-H は他のフォントの設定をそのまま流用してるけど,正しいのかどうかよく分からない。

dvipdfmx コマンドで map ファイルを直接指定する必要があるため .latexmkrc ファイルを以下のように設定した。

#!/usr/bin/env perl
$latex        = 'uplatex -synctex=1';
$latex_silent = 'uplatex -synctex=1 -interaction=batchmode';
$bibtex       = 'upbibtex';
$biber        = 'biber --bblencoding=utf8 -u -U --output_safechars';
$dvipdf       = 'dvipdfmx -z9 -V 4 -f sourcehanjp.map %O -o %D %S';
$makeindex    = 'mendex %O -o %D %S';
$max_repeat   = 5;
$pdf_mode     = 3; # generates pdf via dvipdfmx

$pvc_view_file_via_temporary = 0;

ようやく準備完了。 やっとビルドできるよ。

$ latexmk otf-sample.tex

結果はこんな感じ。

Output PDF by upLaTeX with Source Han Fonts (1)
Output PDF by upLaTeX with Source Han Fonts (1)

ちなみに埋め込まれたフォントの状態は以下の通り。

Output PDF by upLaTeX with Source Han Fonts (2)
Output PDF by upLaTeX with Source Han Fonts (2)

LuaLaTeX で「源ノ」フォントを使ってみる

さて,では同じことを $\mathrm{Lua\LaTeX}$-ja でやってみようと思う。

さきほどフォントファイルをインストールしたが, $\mathrm{Lua\LaTeX}$ で使うにはそのままではダメで,以下のコマンドを実行しておく必要がある。

$ luaotfload-tool --update

上手くいったかどうかは以下のコマンドで確認できる。

$ luaotfload-tool --fuzzy --find="sourcehanserif"
luaotfload | resolve : Font "sourcehanserif" found!
luaotfload | resolve : Resolved file name "c:/texlive/texmf-local/fonts/opentype/adobe/sourcehanserifjp/sourcehanserif-regular.otf"

では,文書ファイルを作ってみよう。

\documentclass{ltjsarticle}
\usepackage[sourcehan,deluxe]{luatexja-preset}
\usepackage{luatexja-otf}

\begin{document}

{\mcfamily\ltseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・細字)}\par
{\mcfamily          ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・中字)}\par
{\mcfamily\bfseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(明朝体・太字)}\par

{\gtfamily          ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・中字)}\par
{\gtfamily\bfseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・太字)}\par
{\gtfamily\ebseries ☂ は夜更け過ぎに ☃ へとかわるだろう。(ゴシック体・極太)}

森鷗外と内田百閒が髙島屋に行った。

\UTF{845B}飾区の\UTF{20BB7}野家  % 葛飾区の𠮷野家

\end{document}

luatexja-preset パッケージでは「源ノ」フォントを指定できる。

\usepackage[sourcehan]{luatexja-preset}

また \UTF コマンドが使えるように luatexja-otf パッケージを読み込んでいる。 いやぁ,すんごい楽ちん。

タイプセットも前準備なしで簡単にできる(だだし,めがっさ遅い)。

$ lualatex otf-sample.tex

結果は以下の通り。

Output PDF by LuaLaTeX with Source Han Fonts (1)
Output PDF by LuaLaTeX with Source Han Fonts (1)

んー。 ウェイトがさっきと違う?

Output PDF by LuaLaTeX with Source Han Fonts (2)
Output PDF by LuaLaTeX with Source Han Fonts (2)

いや,同じか。 まぁいいや。 「極太」なんてまず使わんし。

他に気になることと言えば, $\mathrm{up\LaTeX}$ + dvipdfmx のときもそうだったんだけど,「葛(U+845B)」の字形が JIS X 0213:2004 だよね。 どちらも jis2004 オプションは付けてないんだが。 やはり jis2004 オプションは相当特殊な気がする。 これからは JIS X 0213:2004 前提で考えて,むしろ jis2000 オプションを作ったほうがいいんじゃないだろうか。

ま,それはともかく

時代は $\mathrm{Lua\TeX}$ で「源ノ」フォント ってことですね!

ちなみに,前回紹介した Cloud LaTeX で同じことをしようとしたら「sourcehan なんぞ知らん!」と怒られた(笑)

/usr/local/texlive/2016/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty
line 392
! LaTeX Error: Unknown option `sourcehan' for package `fontspec-luatex'.

まぁしょうがないね。 IPAex が使えるのなら支障はないし。

ブックマーク


  1. CMap とは Unicode 等の文字集合とフォントの CID (Character IDentifier) を対応付けるマッピング情報である。 OpenType フォントのフルセットは Unicode を含む複数の文字集合の字形を包括している。たとえば JIS X 0213 では「葛(U+845B)」の字について2000年版と現行の2004年版で字形が異なるという混乱があるが(厳密には例示字体で示される字の形が異なる。異体字のことではない), OpenType フォント(のフルセット)はそういった差異も包括し CID で識別することができる。従って CMap は文字集合やそのバージョンごとに存在することになる。 [return]
  2. adobe, sourcehansansjp, sourcehanjp のフォルダ名には特に意味はなく,自分で管理しやすい名前にすればいいらしい。 [return]