マクロツイーター

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

dviout の欧文フォントの謎が解けた! (3)

前回の続き)

「思想」の話だけで終わるのもアレなので、ここでは実際に「dviout 流」のフォント設定を実践してみる。目的は

timesnr-r "Times New Roman"

のような「素直な dviout の欧文マップ設定」を基にして、LaTeX で新たな欧文フォントを「普通に」使えるようにすることである。なお、dviout の話なので、Windows(特に W32TeX)を前提とする。そういう訳で、例として用いる欧文フォントは、Windows Vista で新しく導入された欧文フォントの一つである「Constantia」とする。このファミリについては Berry 命名規則のファミリ名「jk4」が与えられている。*1ここでは Regular シェープのみを扱う。このフォントのファイルは C:\windows\fonts\constan.ttf にある。

なお、以下の作業で用いるデータ(.enc ファイル等)をまとめて奥底に置いておく。

TTNFSS の方法を踏襲する

まずは、TTNFSS が用いている方法をそのまま(「名前の濫用」も含めて)実行することにする。すなわち、「dviout 流の 8r」である Windows-1252 を原エンコーディングとし、「dviout 流」の T1 エンコーディングを VF で実現するという方法である。なお、NFSS のファミリ名として wconstan1 を用いる。

これを新たなフォントに適用する場合、両者のエンコーディングに対する .enc ファイルが必要であるが、dviout の配布物の中には含まれていないようである。よって、前掲の aencdviout.zip の中に win8r.enc と ecwin.enc を再現したものを含めた。この win8r.enc は基本的には Windows-1252 であるが、TTNFSS の TFM の実態と合わせて、「〈Ž〉(0x8E)〈ž〉(0x9E) を省く*2」「TeX に不要な文字(space (0x20) や soft-hyphen (0xAD) 等)を省く」という変更を加えている。ecwin.enc は前回に示した winenc.sty から導出したものである。

Berry 命名規則に従うと、「dviout 流 8r」のフォントの TFM 名は jk4r8r、「dviout 流 T1」のフォントは jk4r8t となる。従って、TFM/VF 生成のコマンドは以下のようになる。*3

ttf2tfm constan.ttf -p win8r.enc -t ecwin.enc -v jk4r8t jk4r8r
vptovf jk4r8t

dviout のマップ行で指定するのは、原エンコーディングの方、つまり jk4r8r である。

jk4r8r "Constantia"

フォント定義ファイル(.fd ファイル)は通常の T1 エンコーディングの場合と全く同様に記述する。

[t1wconstan1.fd]
\DeclareFontFamily{T1}{wconstan1}{}
\DeclareFontShape{T1}{wconstan1}{m}{n}{<->jk4r8t}{}

これらのファイルを適切に配置すれば設定は完了である。以下にテスト用の LaTeX 文書を示す。「dviout 流の T1」を使うので winenc パッケージの読込が必要になることに注意。

[test-wconstan1.tex]
\documentclass[a4paper]{article}
\usepackage{textcomp}
\usepackage{winenc} % T1 の定義を修正する!
\begin{document}
% T1/wconstan1(実際は「TTNFSS的T1」)に切替
\usefont{T1}{wconstan1}{m}{n}
Ich m\"ochte s\"u{\ss}eren K\"ase.
  % なぜか ttf2tfm が /Euro を拾ってくれない...
\$1 = \texteuro 4.2 = \textyen 53 \par
``Macros are pass\'e --- it's so mid-20th-century!'' \par
% CP1252 の範囲を超えるので一部化ける
R\'ownie dobrze mog{\l}oby to by\'c po chi\'nsku. \par
% 本物の T1 エンコーディングの使用には影響しない.
\usefont{T1}{lmr}{m}{n} % T1 の Latin Modern Roman
R\'ownie dobrze mog{\l}oby to by\'c po chi\'nsku. \par % 正常出力
% しかし textcomp とは衝突する
\$1 = \texteuro 4.2 = \textyen 53 \par
\end{document}

この出力結果を見て解るように、winenc を読んだ後でも「本物の T1」を用いた出力は正常に行える。しかし、textcomp パッケージ(TS1 エンコーディング)とは衝突してしまう。

dviout 流」を再解釈してみる

先に見た衝突は、勿論、本来 T1 でないものを T1 として扱ったところから来ている。このような細かい齟齬を別にしても、現代的な TeX システムでは「普通の」8r や T1 が厳然と存在することは否めず、結局のところ、独自の解釈は「同じ名前をもつ別のものの存在」を生み出してしまい望ましいものではない。従って、この話の締めくくりとして、「dviout 流」を継承しつつ(だから先の「単純なマップ行」が通用する)、「普通の」ものとの矛盾が生じない方法を模索して見る。

まず、「dviout の 8r」についてだが、これは表(LaTeX)から見えないので 8r と呼ばれる必然性がない。だから素直に「Windows-1252」を表す名前を用いればよい。fontname の資料を見ると、「8w」が Windows-1252(WinANSI)を指すとみて間違いない。従って、TFM のエンコーディング識別子も 8w とすればよいであろう。なお、折角新しい方式を考えているのだから、win8r.enc で削られた 〈Ž〉〈ž〉 も含める(現在の Windows-1252 に合わせる)こととし、この変更を行ったエンコーディングを bx-8w.enc に記した。

より大きな問題が「dviout の T1」である。「T1」のままでは不適当なので、このエンコーディングを使うならば、TFM と NFSS のエンコーディング名を別に与えることになるだろう。ただ、そうしてもそれが dviout 独自の産物であることに難がある。ところが、実は「dviout の T1」と同様の考えをもち、かつ TeX コミュニティにもっと受け入れられているエンコーディングが存在する――それは LY1 エンコーディングである。これも Windows-1252 の文字セットをもつフォントを可能な限り「効率的に」用いることを目的として設計されている。従って、私は、独自の winenc パッケージの代わりに LY1 エンコーディングを用いることが、「dviout 流」のより筋のよい実現方法だと考える。そこで、LY1 エンコーディングの .enc ファイル bx-ly1.enc を用意した。*4

この考えに従った方法は、「Windows-1252 を原エンコーディングとした『8w』*5の名前をもつ TFM を作り、LY1 エンコーディングをそれを参照する VF で実現する」ということになる。先の場合と類似の手順になるので、簡単に手順のみを示す。NFSS ファミリ名を wconstan2 とし、TFM 名に ZR 命名規則を用いるものとする。*6

[TFM 生成コマンド]
ttf2tfm constan.ttf -p bx-8w.enc -t bx-ly1.enc -v wconstan2-r-ly1 wconstan2-r-8w
vptovf wconstan2-r-ly1
[dviout のマップ行]
wconstan2-r-8w "Constantia"
[ly1wconstan2.fd]
\DeclareFontFamily{LY1}{wconstan2}{}
\DeclareFontShape{LY1}{wconstan2}{m}{n}{<->wconstan2-r-ly1}{}
[test-wconstan1.tex](テスト用文書)
\documentclass[a4paper]{article}
\usepackage[LY1,OT1]{fontenc}
\usepackage{textcomp}
\begin{document}
% LY1/wconstan2 に切替
\usefont{LY1}{wconstan2}{m}{n}
Ich m\"ochte s\"u{\ss}eren K\"ase.
  % やっぱり ttf2tfm が /Euro を拾ってくれない...
\$1 = \texteuro 4.2 = \textyen 53 \par
  % TeX-ligature のテスト
``Macros are pass\'e --- it's so mid-20th-century!'' \par
% \l は CP1252 にないので落ちる. \'c や \'n は合成になる.
R\'ownie dobrze mog{\l}oby to by\'c po chi\'nsku. \par
% もちろんこれも大丈夫
\usefont{T1}{lmr}{m}{n} % T1 の Latin Modern Roman
R\'ownie dobrze mog{\l}oby to by\'c po chi\'nsku. \par % 正常出力
% 今度は textcomp も大丈夫
\$1 = \texteuro 4.2 = \textyen 53 \par % 正常出力
\end{document}

*1:先頭の「j」がベンダ名(Microsoft)を表す。

*2:恐らく、TTNFSS が作られた当時の Windows-1252 にはこれらの文字が無かったのだと思われる。

*3:jk4r8r.tfm、jk4r8t.{tfm,vf,vpl} が生成される。VPL ファイルは TFM/VF への変換が終われば消して構わない。

*4:ここでは述べないが、fontname パッケージの texnansi.enc や texnansx.enc はそれぞれ欠点があるので、この bx-ly1.enc を用いたほうがよい。

*5:「8w」は Berry 規則の場合だが、それ以外の場合も、とにかく「TeXBase1」とは異なる「Windows-1252」自体を現す名前であること。

*6:「8r」や「8w」は LaTeX で直接用いられないので NFSS 名がない。そこで、ZR 規則のエンコーディング識別子はそのまま「8r」「8w」とする。