「インフォシーク isweb ライト」サービス終了に伴い、 本サイトは以下のURLに移転することになりました。
現在のサイトは、10月末を以て終了となります。
http://zrbabbler.sp.land.to/pxcopyfont.html

PXcopyfont パッケージ
~TeX 仮想フォントのコピー~

TeX の仮想フォント(TFM と VF の組;和文・欧文ともに可)を、 その参照関係を保ったままで、別名でコピーする。 Perl 版の他に Lua 版(W32TeX の標準インストールだけで動作可能) が用意されている。

概要

TeX における「仮想フォント」とは VF と TFM の組のことである。 ここでは VF の構造の詳細については述べないが、 VF の中にはそれが参照する TFM(「実フォント」と呼ぶことにする) の名前が、参照のために用いる番号(ID)とともに記されている。 pxcopyfont コマンドは、TeX の仮想フォントを、その参照関係の構造 (参照の出現順や ID も含む)を保ったまま、 別名でのコピーを作成するためのツールである。

仮想フォント「upjisr-h」は.tfmと.vfの組であり、upjisr-h.vfは、ID 0でuprml-h.tfmを、ID 2 でupjisr-hq.tfmを参照する。
これに対し、upjisr-h、uprml-h、upjisr-hqの名をfoo-r-jy2、r-foo-r-jy2、r-foo-r-jy2xに置き換えたコピーを作成したい。

対応環境

TeX のインストールに加えて、 以下の何れかのインタプリタを必要とする。

  • Perl 5.8.1 版以降 (この場合、kpsewhich コマンドが必要)
    (なお、ZRTeXtor 等の追加のモジュールは不要。)
  • LuaTeX 0.50 版以降(Lua インタプリタモードを用いる)

インストール

このパッケージには、Perl の pxcopyfont.pl と Lua の pxcopyfont.lua の 2 つのスクリプトが含まれていて、どちらも全く同じ動作をする。 以下の解説では、これらのスクリプトが pxcopyfont のコマンド名で実行される ことを仮定することにし、 ここで W32TeX でそれを実現するための手順を述べる。

Perl 版を使う場合

W32TeX の実行ファイルフォルダ($TEXMF/bin)にある runscr.exe を pxcopyfont.exe の名前でコピーし、実行パスの通ったフォルダに置く。 pxcopyfont.pl を同じフォルダに置く。

Lua 版を使う場合

Lua 版を用意した目的は、W32TeX において Perl インタプリタのインストールを不要にするためである。 すなわち、Lua 版のスクリプトは W32TeX の標準インストールに含まれる LuaTeX を「Lua インタプリタモード」で起動させて実行させる。 手順は Perl 版と全く同じで、 $TEXMF/bin/runscr.exe を pxcopyfont.exe の名前でコピーし、 実行パスの通ったフォルダに置いた後、 pxcopyfont.lua を同じフォルダに置く。

参考: LuaTeX を「Lua インタプリタモード」で起動する場合の標準的な コマンド名は texlua である。 従って、(runscr.exe を使わずに)Lua スクリプトを実行する場合は

texlua pxcopyfont.lua

とすればよい。 (従って、UNIX 系 OS の場合、shebang 行に texlua へのパスを書けばよいと思われる。) ただし、他のコマンド名(luatex や lualatex 等)で起動した場合も、 引数のファイルの拡張子が .lua の場合は「Lua インタプリタモード」 になるので、結局 luatex pxcopyfont.lua でもよいことになる。

注意: pxcopyfont.lua は LuaTeX に内臓されている kpse ライブラリを 利用しているので、LuaTeX でない「単独の Lua インタプリタ」では動作しない。

基本的な使い方

コマンドライン書式は以下の通り。

# 仮想フォントのコピー
pxcopyfont [<オプション>...] <入力仮想フォント> <出力仮想フォント> <出力実フォント>...
# 仮想フォントの参照先情報を表示
pxcopyfont [<オプション>...] <入力仮想フォント>

<入力/出力仮想フォント> には仮想フォント名、 すなわちファイル名から拡張子(.tfm.vf) を除いたものを指定する。 <出力実フォント> には出力仮想フォントの参照先と なる実フォントの名前(同じく拡張子抜きのファイル名) を入力仮想フォントの参照先の出現順に対応する形で並べる。 (後のサンプルを参照。)

オプションは次の通り。

  • -o / --overwrite: ファイル出力時に既に同名のものがあれば上書きする。 注意-o 無指定時は既存ファイルへの書き込みはスキップされる。
  • -v / --verbose: 詳細表示モード。
  • -D / --dry-run: 詳細表示モードにし、ファイル出力を一切行わない。(動作確認用)
  • -K / --no-kpse: Kpathsearch を使用しない。 この場合、全ての入力ファイルはカレントになければならない。 (パス指定不可。)
  • -z / --zero: VF の先頭の参照フォントの ID を 1 から 0 に変更する (1 でない場合はエラー)。 dviout のバグ対策。
  • -Z / --zrname: 「ZR命名規則」(謎)に基づきフォント名を自動生成する。 (ここでは詳細は省略。いずれ説明を追加するかも知れない。)

サンプル

例として、「概要」で用いたのケースを実行してみる。

まず、コピー元の仮想フォント upjisr-h での参照の出現順序等を確かめる ために、表示機能を利用する。

> pxcopyfont upjisr-h
VF 'upjisr-h' refers to:
000:uprml-h
002:upjisr-hq

参照先実フォントは「uprml-h に対応するもの」「upjisr-hq に対応するもの」 の順に指定する必要がある (ID の大小は関係ない)。 従って、実際にコピーを行うコマンド行は以下のようになる。

> pxcopyfont upjisr-h foo-r-jy2 r-foo-r-jy2 r-foo-r-jy2x

これにより、foo-r-jy2.tfm、r-foo-r-jy2.tfm、r-foo-r-jy2x.tfm の 3 つの TFM ファイルと foo-r-jy2.vf の VF ファイルが生成される。 TFM ファイルの中身は、コピー元の対応ファイルと全く同一であり、 VF ファイルの中身は、upjisr-h.vf とほぼ同一で、 中に含まれる参照先ファイル名だけを書き換えたものになっている。