マクロツイーター

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

dvipdfmx で OpenType する件について (SFD 編-3)

前回の続き)

文字範囲指定の詳細

サブフォント定義ファイル(SFD ファイル)における各サブフォントごとの定義の行

<識別子>  <符号位置範囲>

<符号位置範囲> は次のように記述する。

  • 通常は TFM の符号位置 0 から 255 に対応する実フォントの Unicode 符号位置(整数値、0x を前置すると 16 進表記になる)の列を空白区切りで書く。1 行で書くことになるが、行末に「\」を置くことで継続行を用いることができる(つまり直前に \ がある改行は無視される)。
  • <数値1>_<数値2> の形式は範囲表記で、<数値1> から <数値2> までの整数値を順に並べたのと同じ。
  • もしある TFM の符号位置が未定義にすべきときは、<数値>: の形式を書く。この場合、以降に書かれる実フォントの符号位置の列は、その数値から始まる TFM の符号位置に対応するようになる。(例えば、47: 0x21 0x966_0x96F と書くと、47 → 0x21、48 → 0x966、49 → 0x967、…… と対応付けられる。)

例えば、これまでに用いた「Unicode サブフォント」の先頭サブフォント(識別子 00)の場合、0〜255 にそのまま U+0000〜U+00FF(要するに 0〜255)を対応させるので、これに対応する SFD ファイルの行の記述は単純に以下のように書ける。

00  0x0000_0x00FF

次の識別子 01 は 0〜255 に U+0100〜U+01FF だからこれも同様に書けて、全部で 256 行の SFD となった訳である。

01  0x0100_0x01FF
02  0x0200_0x02FF
……(以下同様に ff まで続く)……

この仕組を用いると、Unicode 以外の大規模な符号化文字集合に対しても、それを表すサブフォントを作ることができる。*1例として、JIS 基本漢字(JIS X 0208)を(区点位置をそのまま用いて)表す SFD ファイルを挙げると次のようになる。*2

[SampJIS.sfd]
01  1: 0x3000_0x3002 0xFF0C 0xFF0E 0x30EB …(中略)… 0x25C7
02  1: 0x25C6 0x25A1 0x25A0 0x25B3 0x25B2 …(中略)… 0x25EF
03  16: 0xFF10_0xFF19 33: 0xFF21_0xFF3A 65: 0xFF41_0xFF5A
04  1: 0x3041_0x3093
05  1: 0x30A1_0x30F6

このサブフォント定義に従う TFM 群 sample-r-x@SamplJIS@ があったとすると、例えばこれを用いて文字〈の〉(4 区 46 点)を出力するには、「sample-r-x04 を指定して \char46 を実行すればよい」ことになる。*3

(続き)

*1:ただし、実フォントの文字は必ず Unicode で指定するので、当該の文字集合中の全ての文字に対応する Unicode 文字がなければならない。

*2:これは単なる例であり、このような形式のサブフォントが何らかのパッケージで使われている訳ではない。

*3:全く余談であるが、この JIS 基本漢字の SFD の定義を見て、NTT jTeX の和文フォントの構造を思い出した人がいるかも知れない。jTeX の和文フォントを SFD で表現することは可能で、実際、拙作の JXempt パッケージ(jLaTeX で jsclasses 類似の文書クラスを提供する)では、そのようなサブフォントを用いている。