マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

源ノアレ(Source Han Sans)で TeX してみたい話

Adobe が先日公開したフリーフォント「Source Han Sans」が話題になっている。

早速 TeX してみたいのだが…

で、OpenType の機能を色々備えた“スマート”なフォントを新たに手に入れたとなると、TeX 屋としては XeTeX あたりでちょっと遊んでみたくなるのが自然な発想だろう。ところが、このフォントはちょっとした曲者であり、既存のフォントではほとんど見られない特質を持っている。

  • 配布のフォント形式の一つは「OpenType Collection(OTC)」というもので、これは「TrueType Collection(TTC)」形式*1の CFF グリフ版に相当する形式で、この形式をもつ既存のフォントは私は知らない。
  • このフォントはヒラギノや小塚と同様の“CID-keyed”なのであるが、その文字集合は従来の Adobe-Japan1 のような規格として予め定められたものでなく、“フォント毎に独自に定義された”もので、フォントの記述の中ではこのような文字集合は「Adobe-Identity-0」(AI0)と呼ばれる。AI0 の文字集合を持つフォントは Adobe が幾つか作製されているが、まだ広く普及していない。

このため、このような珍しい特質に正しく対応できないソフトウェアでは「Source Han Sans」を正常に取り扱えないのである。今までに自分が試したところでは、“TeX する”事に関しては次のような結果になっている。

  • OTC 形式は恐らく非対応であろうから試してもいない。)
  • 多言語版のフォントを XeTeX で使おうとすると、途中でエラーが出て終了してしまう。
  • 日本語版のフォントを XeTeX で使った場合は(警告が出て)PDF が出力されるが、結果の PDF では正しいグリフが拾われてなくて完全に文字化けした状態になる。
  • dvipdfmx でフォントマップの CMap 指定を「unicode*2をにした設定でフォントを埋め込もうとすると、XeTeX と同様の現象が起こり、DVI → PDF への変換に失敗する。
  • もちろん、CMap に Adobe-Japan1 等の既存のものを指定するのは明らかに間違っている。入力の文字コードUnicode(upTeX の DVI の場合)なので Identity を指定するのも違う。

困った。これでは、「Source Han Sans で早速 TeX してみた」のネタが作れない。

CMap すればよいらしい

どうやら、フォントの文字集合に対応する(UTF-16 からの*3)CMap ファイルを作っておくと、pTeX 系 + dvipdfmx で利用する(フォントを埋め込んだ PDF を作る)ことができるようだ。ただ、XeTeX と異なり、pTeX 系を用いる場合は折角の OpenType の“スマート”な機能が全く使えない。なので残念ながら「このフォントで遊ぶ」という用途には全く向いていない。

しかし改めて冷静に考えてみると、「この新しい書体を自分の作る TeX 文書に利用したい」という実用的な用途があっても不思議ではない、ということに気が付いた。それなら pTeX での対応でも有用であろう。

tcsourcehans パッケージ

そういう人のために、かなり手抜きではあるがパッケージを作ってみた。

  • コレ(zr-tex8r/Gist)
    (上掲の doraTeX 氏作成の CMap ファイルも一緒に含まれている。)

インストール手順は以下の通り:

  • 上掲のパッケージのアーカイブを入手し、それを展開して UniSourceHanSansJP-UTF16-H と tcsourcehans.sty のファイルを得る。
  • 日本語版の Source Han Sans(源ノ角ゴシック)を入手する。
  • pxcopyfont パッケージを入手しインストールする。
  • 適当なディレクトリで以下の一連のコマンドを実行し TFM と VF ファイルを生成する。
    pxcopyfont upjpnrm-h sourcehans-j-jy2 r-sourcehans-j-jy2 r-sourcehans-j-jy2x
    pxcopyfont upjpnrm-h sourcehans-l-jy2 r-sourcehans-l-jy2 r-sourcehans-l-jy2x
    pxcopyfont upjpnrm-h sourcehans-r-jy2 r-sourcehans-r-jy2 r-sourcehans-r-jy2x
    pxcopyfont upjpnrm-h sourcehans-m-jy2 r-sourcehans-m-jy2 r-sourcehans-m-jy2x
    pxcopyfont upjpnrm-h sourcehans-d-jy2 r-sourcehans-d-jy2 r-sourcehans-d-jy2x
    pxcopyfont upjpnrm-h sourcehans-b-jy2 r-sourcehans-b-jy2 r-sourcehans-b-jy2x
    pxcopyfont upjpnrm-h sourcehans-h-jy2 r-sourcehans-h-jy2 r-sourcehans-h-jy2x
  • 以下のようにファイルを移動。
    • フォントファイル(SourceHanSansJP-*.otf)は OS にインストールする。
      または、$TEXMF/fonts/opentype/ 以下の適当な場所に置く。
    • UniSourceHanSansJP-UTF16-H → $TEXMF/fonts/cmap/sourcehans/
    • tcsourcehans.sty → $TEXMF/tex/latex/sourcehans/
    • *.tfm → $TEXMF/fonts/tfm/public/sourcehans/
    • *.vf → $TEXMF/fonts/vf/public/sourcehans/
  • 必要ならアレ。

なお、このパッケージは upLaTeX 専用である。

パッケージの使い方

パッケージを \usepackage で読み込む(オプションはない)と、「源ノ角ゴシック」の和文ファミリが「sourcehans」の名前で登録されるので、\kanjifamily 命令等でこのファミリに切り替えることができる。このファミリは el/l/m/mb/sb/b/eb の 7 つのシリーズを持ち、それぞれ ExtraLight/Light/Normal/Regular/Medium/Bold/Heavy ウェイトに対応する。シリーズの初期値である \mdseries は通常 \fontseries{m} に等価なので Normal ウェイトになる。\bfseries は通常 \fontseries{bx} と等価だが、bx シリーズは b シリーズと同じく Bold ウェイトが選ばれる。

\documentclass[a4paper,uplatex]{jsarticle}
\usepackage{tcsourcehans}
\begin{document}
\kanjifamily{sourcehans}\selectfont% 和文フォントファミリに"源ノ角ゴシック"を指定
源ノ角ゴシック: % ここはNormalウェイト
\par\LARGE
\fontseries{el}\selectfont% ExtraLight
\mdseries% Normal
\bfseries% Bold
\fontseries{eb}\selectfont% Heavy
\end{document}

*1:複数の TrueType フォントを一つのファイルに束ねたような形式。Windows の「MS 明朝」等はこの形式をもつ。

*2:「(CMap でなく)Unicode によるアクセス」を表す特殊な値。

*3:UTF-16 を使う」というのは dvipdfmx での約束事。