2010年05月22日

Debian SqueezeでのGhostscriptフォント設定方針

リリース準備中のDebian GNU/Linux次期安定版「Squeeze」での小目標として、「defomaの廃止」というものがあります。その作業の一貫として、defomaを使用していたGhostscriptのフォント設定の新機構を実装・アップロードしました。 Lennyからのアップグレードでdefomaにいろいろと調整を加えていたユーザや、CJK(Chinese Traditional/Chinese Simplified/Japanese/Korean)フォントをGhostscriptに提供したいという開発者はこの変更に注意が必要です。

[経緯]

「defoma」(Debian Font Manager)は、2000年に日本人Debian Developerのtakeさんが開発したDebian向けのフォント管理機構です。TrueTypeやType1/CIDなどのベクタフォントパッケージにヒントファイルを持たせることで、Xフォント、TeXプレビューア、fontconfig、Ghostscriptといった各種のソフトウェアでのフォント設定およびデフォルト選出を統括しようという野心的な試みです。アプリケーションごとのフォント管理がバラバラで、それぞれの設定もわかりにくかった時代に、defomaは有効なソリューションでした。特にtakeさんの保守していたGhostscriptパッケージにとっては欠かせないコンポーネントです。

しかし、takeさんが就職後にDebian活動に時間を割けなくなり、後を引き継いだAngus Leesも2006年半ばを最後に保守が見られなくなると、Perlで記述されたdefomaソースコードのわかりにくさとバグの多さのためにDebianにとって重荷となっていきました。アプリケーションでのフォント管理も、fontconfigを使用するものが多くなり、レガシーなものはGhostscriptほかごくわずかとなりました。また少なくとも日本語についてはalternativesシステムでデフォルトの明朝/ゴシック書体を示すttf-japanese-mincho.ttf/ttf-japanese-gothic.ttfが提供されるようになったことで、defomaを使う意義はほとんどなくなっていました。

このため、Squeezeではdefomaを削除しようという運動がpkg-fonts-develチームを中心に起こり、各フォントパッケージからは次々とdefomaのヒントファイルが削除されます。しかし、GhostscriptについてはCJK方面以外にはほぼ影響がないため、誰にも顧みられていない状況でした。このままリリースされて後から品質の問題になるのを防ぐため、筆者は今年の1月に、defomaに代わってGhostscript向けのみのシンプルなヒントファイルを関連するCJKフォントパッケージのみが提供する仕組みをプロポーサルとして提出しました。

このプロポーサルはpkg-fonts-develではあまり反応を得られなかったのですが、特に大きな反対はなく、またその後Changwoo RyuやAndrew LeeなどのCJK系のDebian Developerに質問して得られた回答を受けて、5/18〜5/19にかけてパッチ提案およびNMUに踏み切りました。現在、Sidにはすべての変更が反映され、5/30にはSqueezeに反映される見込みです。

[仕組み]

Ghostscript向けの新しいフォント管理は、/etc/ghostscript/cidfmap.d/と/etc/ghostscript/fontmap.d/に置かれたヒントファイルと、ghostscriptパッケージのupdate-gsfontmapコマンドからなります。update-gsfontmapコマンドは、ヒントファイルを単にまとめてそれぞれcidfmapとFontmapという名前で/var/lib/ghostscript/fontsディレクトリに置くだけです。前者はCIDマップ(実際にはTrueTypeを含む。日本語等のCJKフォントはこちらを使います)、後者は欧文Type1マップです。

日本語用のデフォルト設定はgs-cjk-resourceパッケージが提供する/etc/ghostscript/cidfmap.d/90gs-cjk-resource-japan1.confで、PostscriptおよびAdobe Acrobatの主要フォントを定義しています。

/Japanese-Mincho-Regular << /FileType /TrueType /Path (/usr/share/fonts/truetype/ttf-japanese-mincho.ttf) /SubfontID 0 /CSI [(Japan1) 4] >> ;
/Japanese-Gothic-Regular << /FileType /TrueType /Path (/usr/share/fonts/truetype/ttf-japanese-gothic.ttf) /SubfontID 0 /CSI [(Japan1) 4] >> ;
/Ryumin-Light /Japanese-Mincho-Regular ;
/Adobe-Japan1 /Japanese-Mincho-Regular ;
/HeiseiMin-W3 /Japanese-Mincho-Regular ;
/GothicBBB-Medium /Japanese-Gothic-Regular ;
/Adobe-Japan1-Bold /Japanese-Gothic-Regular ;
/HeiseiKakuGo-W5 /Japanese-Gothic-Regular ;

ローカルの設定を定義したいときには、90よりも若い番号(10local.confなど)のファイルを同ディレクトリに作成してください(Postscriptのルール上、始め(小さい番号)に書いたものが後(大きい番号)からのものに優先されます)。例を次に示します。

/Jun101-Light << /FileType /TrueType /Path (/usr/share/fonts/opentype/A-OTF-Jun101Pro-Light.otf) /SubfontID 0 /CSI [(Japan1) 0] >> ;

フォントパッケージ提供者は、独自のヒントファイルを提供し、Ghostscriptで使用できるように登録できます。今のところ番号のポリシーは設定していませんが、50番台あたりを使うのが妥当かと思います。パッケージでは、ヒントファイルを/etc/ghostscript/cidfmap.d/または/etc/ghostscript/fontmap.d/にインストールするようにし、postinstとpostrmでそれぞれupdate-gsfontmapを起動するようにします。

postinst
#!/bin/sh
 ...
case "$1" in
  configure)
    if [ -x /usr/sbin/update-gsfontmap ]; then
      update-gsfontmap
    fi
  ...

postrm
#!/bin/sh
 ...
case "$1" in
  purge|remove)
    if [ -x /usr/sbin/update-gsfontmap ]; then
      update-gsfontmap
    fi
  ...

[ユーザは?]

特にこれまでGhostscriptに調整を加えた覚えのないユーザは、新しいghostscript、gsfonts、gs-cjk-resource、cmap-adobe-japan1のパッケージをインストールすることで、自動でttf-japanese-mincho.ttf、ttf-japanese-gothic.ttfをデフォルトの明朝/ゴシックフォントとして利用するようになります。Squeeze新規インストールの場合にはIPA明朝/ゴシックになるはずです。

ttf-japanese-mincho.ttfおよびttf-japanese-gothic.ttfのリンク先フォントを変更するには、update-alternativesコマンドをroot権限で使用します。

# update-alternatives --display ttf-japanese-mincho.ttf ←現在の状態を調べる
ttf-japanese-mincho.ttf - auto mode
  link currently points to /usr/share/fonts/opentype/ipafont/ipam.ttf
/usr/share/fonts/opentype/ipafont/ipam.ttf - 優先度 100
/usr/share/fonts/truetype/sazanami/sazanami-mincho.ttf - 優先度 50
Current 'best' version is '/usr/share/fonts/opentype/ipafont/ipam.ttf'.

# update-alternatives --config ttf-japanese-mincho.ttf ←設定を変更する
There are 2 choices for the alternative ttf-japanese-mincho.ttf (providing /usr/share/fonts/truetype/ttf-japanese-mincho.ttf).

  Selection    Path                                                    Priority   Status
------------------------------------------------------------
* 0            /usr/share/fonts/opentype/ipafont/ipam.ttf               100       auto mode
  1            /usr/share/fonts/opentype/ipafont/ipam.ttf               100       manual mode
  2            /usr/share/fonts/truetype/sazanami/sazanami-mincho.ttf   50        manual mode

Press enter to keep the current choice[*], or type selection number: ←Selection列の数字を入れる

以上、Squeeze以降でのGhostscriptのフォント設定について説明しました。ghostscriptについてはメンテナではないものの、バグの状況はウォッチしていますので、何か問題を発見したらDebianバグ追跡システムに報告してください。