otfパッケージへの新規フォント追加

otfパッケージへの新規フォント追加

- yasui kaisuke の投稿
返信数: 12

otfパッケージにおいて、新規に和文フォントを追加する方法が分かりません。

和文フォントの新規追加の方法自体は、TeX wiki内の記事を読むなどして分かったのですが、この方法だとotfパッケージのburasageオプション、ルビ用仮名グリフ、\CID{...}などが使えません。そこで、次のような方法を試みました。

まずCTANからjapanese-otf-uptexをダウンロードし、この中のumakeotfを(フォント名をotfパッケージ標準のものと別にするために)書き換えて新たにtfmやvfを生成し、それからフォントを定義するためのstyファイルを作成しました。このstyファイルは、otfパッケージの中身を見て、大体同じになるように作成しました。mapファイルも併せて作成しました。

しかし、この方法だと、dvipdfmxを実行したとき以下のようなエラーが発生してしまいます。


[1
dvipdfmx:fatal: Unable to find TFM file "3-v".
Output file removed.

何も考えずumakeotfを書き換えるだけでは駄目なのだろうかと思い、umkjvfをどう使えばよいか調べました。しかし、まずルビ用仮名グリフを生成するための「-ruby」というオプションをつけたときどうすればよいのか分からず、直ちに躓きました。「-ruby」というオプションをつけた場合、「umkjvf -ruby file1 file2 file3」のように、ファイル名を3つ与えなくてはならないようですが、このうち3番目のファイルが何なのか全く検討がつかず、結局上の方法の何が悪かったのか分かりませんでした。

どうすれば正しくフォントを追加できるのでしょうか。

yasui kaisuke への返信

Re: otfパッケージへの新規フォント追加

- 和田 勇 の投稿
二つ質問があるようですが、共に人に解説できるほど理解してはいませんがデバッグの一助になればと思います。

◆「dvipdfmx で 3-v の TFM が見つからない」に関して

的外れかもしれませんが dvipdfmx -v でデバッグ情報を表示させて見てはいかがでしょうか?
このデバッグ情報の最初の方に、利用する環境での FONTMAP ファイル情報が表示されます。
例えば私の環境では以下のようなものです。

<FONTMAP:/usr/local/texlive/2016/texmf-var/fonts/map/pdftex/updmap/pdftex.map><FONTMAP:/usr/local/texlive/2016/texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map><FONTMAP:/usr/local/texlive/2016/texmf-dist/fonts/map/dvipdfmx/ckx.map>boo.dvi -> boo.pdf

この示されたファイル群の中の yasui さんが調整されている map ファイルがあれば、その中に 3-v なる記述があるかどうか調べて見てください。

もし 3-v がなければ ... 「umaskotf の書き換えた内容」や、「スタイルファイルの内容」、「作成し指定された map ファイルの内容」を提示されると答えやすくなると思います。

◆ 「umkjvf -ruby の三番目のファイルは何を指定すればいい?」

umkjvf の -help を出すところを見ると

print "Usage: umkjvf [option] <TFMfile> <PSfontTFM> [<PSfontTFM>]\n";

となっています。またダウンロードされた japanese-otf-uptex の中を覗くと以下のような記述があるので参考にしてください。

$ grep -r 'umkjvf.*ruby' japanese-otf-uptex
japanese-otf-uptex/umakeotf:./umkjvf -ucs -sp 1 -cq -ruby upruby${face}-h uph${face}-h cidj${face}
japanese-otf-uptex/umakeotf:./umkjvf -ucs -sp 1 -cm -cp -ruby upruby${face}-v uph${face}-v cidj${face}
japanese-otf-uptex/umakeotf:./umkjvf -ucs -sp 1 -cq -ruby upruby${face}-h uph${face}-h cidj${face}
japanese-otf-uptex/umakeotf:./umkjvf -ucs -sp 1 -cm -cp -ruby upruby${face}-v uph${face}-v cidj${face}
和田 勇 への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿

質問にお答えくださり、まことにありがとうございます。


◆「dvipdfmx で 3-v の TFM が見つからない」に関して


これについては自己解決しました。どうやらburasageオプション用のTFMを生成するやり方が間違っていたようです。試行錯誤の結果、正しくTFMを生成することができ、このエラーはなくなりました。そしてburasageオプションが使えるようになりました。

しかし、3-vという名前のTFMは関係なかった(ぶら下げ組みするのに3-vという文字を含んだ名前のTFMは必要なかった)のは不思議です。

(それから質問とは直接関係ないことですが、umkjvfのヘルプに表示されるオプション一覧では、「-burasage」と書いてあるにもかかわらず、実際にburasageオプション用TFMを生成するときには「umkjvf -burasage」では駄目で、「umkjvf -sage」としなければならないのはなぜでしょうか。ミスなのか、仕様なのか……?)



◆ 「umkjvf -ruby の三番目のファイルは何を指定すればいい?」


これについては、

./umkjvf -ucs -sp 1 -cq -ruby upruby${face}-h uph${face}-h cidj${face}

なる記述がumakeotfにあるのは知っていました。私が疑問だったのは、「cidj${face}」とは何なのか、ということです。


以下に私の理解しているところを書きます。


おっしゃるとおり、umakeotfには次のような記述があります。

for face in minr gothr minb gothb mgothr
do
./umkjvf -ucs -sp 1 -cq -expert upexp${face}-h uph${face}-h cidj${face}
./umkjvf -ucs -sp 1 -cm -cp -expert upexp${face}-v uph${face}-v cidj${face}
./umkjvf -ucs -sp 1 -cq -ruby upruby${face}-h uph${face}-h cidj${face}
./umkjvf -ucs -sp 1 -cm -cp -ruby upruby${face}-v uph${face}-v cidj${face}
done


これによると「cidj${face}」は、たとえば「cidjminr」という名前のファイルを指定しているということになります。しかし「cidjminr」なるファイルはumakeotfを実行しても生成されません。otfパッケージの中身を見ても、「cidjminr」という文字はありません。「cidjmr」ならあるのですが(逆に、umakeotfのほうには「cidjmr」という文字がない)。

「これはどういうことか?」と思い、umkjvfの中身を見てみると、どうやら「cidjminr」が「cidjmr」という名前に紐付け(?)されているようでした。ここから、「おそらくumkjvfも書き換えなければ、ルビ用仮名を出力することはできないらしい」と分かりました。しかし、どう書き換えればよいのか分かりません。

というより、そもそもCIDフォント関連の扱いが複雑でよく分かりません。otfパッケージの次のような記述も、普通の\DeclareFontShapeと違って複雑で、私の知識では、解読にかなり時間がかかりそうです。

%definition of normal utf/cid fonts
\DeclareKanjiFamily{\otf@JYn}{utfj}{}
\DeclareKanjiFamily{\otf@JTn}{utfj}{}
\DeclareKanjiFamily{\otf@JYn}{cidj}{}
\DeclareKanjiFamily{\otf@JTn}{cidj}{}
\Declare@FontShape{utfj}{m}{0123456789abcdefjklmnopqrstuvz}{utfjmr\nlck@sfx@}
\Declare@FontShape{cidj}{m}{012345}{cidjmr}


和田さん、あるいはどなたでもお詳しい方がいらっしゃいましたら、ご教授ください。よろしくお願いします。


yasui kaisuke への返信

Re: otfパッケージへの新規フォント追加

- 和田 勇 の投稿
latex 関連とは言え、perl スクリプト解説みたいになってしまいましたがご容赦を :-(

さて、いくつかご質問がありますが、最後の「…otfパッケージの次のような記述も、普通の\DeclareFontShapeと違って複雑…」に関しては他の方にお願いします。


◆ 3-v について

burasage の指定方法を対処したら治ったとのこと?のようですが、プログラム内に (FONTNAME $face"."3-v)\n" があるので face に取り込まれる情報をただしたのですよね。
この $face はフォント名の対応づけから決められているのですが、対応がないと空っぽなのでフォント名が 3-v として出力されてしまっていたと想像しています。

◆ -burasage vs -sage

ソースコードを見る限りGetOptions の定義を抜粋すると ['^-sage', \$burasage, 0], となっているので -help のメッセージのタイプミスですね。オプション指定するときは -sage で良いでしょう。

◆ 三番目の cidj${face} ってなぁに?

ヘルプには "Usage: umkjvf [option] <TFMfile> <PSfontTFM> [<PSfontTFM>]” とありますのでプログラムで TFMfile 以下三つの引数をどう扱っているかというと以下のようになっています。ちょっと見やすくしています。

$tfm_name = shift(@ARGV); $tfm_name =~ s/\.tfm//;
$kanji_font = shift(@ARGV); $kanji_font =~ s/\.tfm//;
$kana_font = shift(@ARGV); $kana_font =~ s/\.tfm//;

TFMfile は tfm_name に、真ん中の PSfontTFM は kanji_font に最後のは kana_font にそれぞれ取り込まれます。
tfm_name は入力ファイルで kanji_font 及び kana_font は出力ファイルとして扱っています。詳しくは open したところで判断していますが詳細は割愛。
またヘルプメッセージで [] 付きで示されている通り三番目の kana_font 相当の指定は省略可能です。

◆ 三番目の cidj云々 を指定しているのに生成されないのは?

プログラムを kana_font で検索して見ましたが -ruby あるいは -expert オプションをつけたときは kana_font には出力していませんでした。なので -ruby や -expert をつけたらプログラム的には生成されなくて正解。

◆ 「…ルビ用仮名を出力することはできないらしい…」について

どのように書き込んでいるか詳しくは解析していませんが -ruby オプション付きであれば出力しているように見受けられます。

和田 勇 への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿

早速のご解答、ありがとうございます。

どうやらperlの知識がないと厳しい感じですね……。もう少し試行錯誤してみます。

yasui kaisuke への返信

Re: otfパッケージへの新規フォント追加

- 齋藤 修三郎 の投稿
OTFパッケージのuptex拡張については、私にはわかりませんので、以下の話は、素のOTFパッケージの話です。

◆フォントの追加について
技術的なことを説明する前に、まず、何故フォントを追加したいとお考えなのか、お聞かせいただけないでしょうか。
OTFパッケージでは大雑把に言って、(明朝、ゴシック)×(標準、太)+丸ゴシック・標準の5書体に加え、明朝・細の6書体が同時に使用可能です。
フォントを追加されたいということは7書体以上を同時使用なさりたいということでしょうか。
もしそうではないのであれば、フォントマップを書き換えればよいだけです。
(例えば、明朝・標準に勘亭流を割り当ててもシステム上は問題ありません)。

7書体以上同時に使用なさりたい場合は、何書体追加したいのかによって、ファミリを追加するのか、シリーズを追加するのか、シェイプを追加するのか、何を追加するのかという方針が変わってきます。
したがって詳細をお聞きしないと、「然るべく追加しなさい」以上のアドバイスのしようがありません。

◆「-ruby」というオプションを付けた場合
この場合、漢字用のTFMと仮名用のTFMを合成したTFMを作成しているイメージです。
3つの引数の意味は、1. TeXが使うTFM名、2. 漢字部分のTFM名、3. 仮名部分のTFM名となります。ルビ用については、仮名部分はVFにおいてCIDを直接指定しています。そこでCID用のcidjmr3-hが使用されるようになっています。

◆umkjvfのburasageオプションについて
これは、もともとのmkjvfのミスですので、私のミスです。失礼いたしました。
最初は-burasageにしようとしていたのだと思いますが、生成用のスクリプトが見づらいの-sageに変更して、ヘルプファイルを書き換え忘れてしまっていただのだと思います。

◆\Declare@FontShapeについて
これは\Declare@FontShape{utfj}{m}{0123456789abcdef}{utfjmr}という記述から、
\DeclareFontShape{JY1}{utfj}{m}{0}{<->s*[]utfjmr0-h}{}
\DeclareFontShape{JT1}{utfj}{m}{0}{<->s*[]utfjmr0-v}{}
\DeclareFontShape{JY1}{utfj}{m}{1}{<->s*[]utfjmr1-h}{}
\DeclareFontShape{JT1}{utfj}{m}{1}{<->s*[]utfjmr1-v}{}
(中略)
\DeclareFontShape{JY1}{utfj}{m}{f}{<->s*[]utfjmrf-h}{}
\DeclareFontShape{JT1}{utfj}{m}{f}{<->s*[]utfjmrf-v}{}
という命令群を生成するためのマクロです。
齋藤 修三郎 への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿

丁寧にご説明くださり、ありがとうございます。大変助かります。


◆なぜフォントを追加したいか

まったく別のファミリのフォントを同時に使用したいと思ったからです。私は、複数の執筆者からなる冊子の編集をしているのですが、このとき執筆者ごとに別のファミリのフォントを使いたいのです(たとえば、執筆者Aにはヒラギノ、執筆者Bには游、執筆者Cにはヒラギノ……といったように)。

こうするためには最低でも、

・ヒラギノの明朝、太明朝、ゴシック、太ゴシック

・游書体の明朝、太明朝、ゴシック、太ゴシック

と、合計8書体を同時に使用しなければいけません。


論文ならともかく、雑誌のようなものだと「フォントの同時使用は7書体まで」という制約があると厳しいです。


◆「-ruby」というオプションを付けた場合
◆umkjvfのburasageオプションについて
◆\Declare@FontShapeについて

これらについては大変参考になりました。ありがとうございます。

yasui kaisuke への返信

Re: otfパッケージへの新規フォント追加

- 齋藤 修三郎 の投稿
本文の規定のフォントを途中で切り替えることは通常のクラスファイルでは想定していないと思います。

したがって、OTFパッケージにフォントを追加するだけでは、なさりたいことを実現させるのは難しいように思えます。

あくまでフォントを追加する方法にこだわるのであれば、OTFパッケージで作成しているフォント群と同等のものを適切に名前を変更して作成し、otf.styでフォントを宣言している部分を名前を変更しつつ追記するしかないと思います。

現実的な解としては、フォントマップを切り替えてPDFを複数作成し、必要部分切り出し、統合する方法が考えられます。

お力になれず申し訳ございません。
齋藤 修三郎 への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿
> あくまでフォントを追加する方法にこだわるのであれば、OTFパッケージで作成しているフォント群と同等のものを適切に名前を変更して作成し、otf.styでフォントを宣言している部分を名前を変更しつつ追記するしかない

まさにそれがやりたいことです。しかしCIDフォントを出力するときの仕組みが複雑で、その全容把握ができず、上述のやり方の具体的方法が分からないでいます(「適切に名前を変更」するのが思いのほか難しいです)。


たしかに、どうしてもフォント追加方法が私に理解できない場合、現実的な手段を取ったほうがよさそうですね……。アドバイスありがとうございます。
yasui kaisuke への返信

Re: otfパッケージへの新規フォント追加

- 本田 知亮 の投稿
話は終わった感じなんですが・・・

こういう場合は
・手に入れた
・作った
・失敗した
じゃ,何にもならなくって

・何を入手したか
(入手先・ファイル名など)
・作業環境
(OSとか,Win32TeXとかTeXLive2016とか
OSディストリ謹製パッケージとか)
・実際に実行したコマンドおよび
その結果生成されたもの,もしくはログ
・使用するに際して作成した,設定やらテストサンプル
・実際に設定やサンプルを用いたコマンドラインやログ
・結果何ができて,それの何が問題なのか

こういうことを明記しないと
混迷が深まるだけなんだと思います.

経験上、こういうことを自分で整理して
試行錯誤・スクラップ&ビルドすると
結構な割合で自己解決したり,切り分けたことで
ピンポイントで検索できたりするものだと思います.
本田 知亮 への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿
まったくご指摘のとおりだと思います。何が問題となっているのかが不明瞭な質問文を投げてしまい、皆さまにはご迷惑をおかけしました。問題の切り分けが全然できていませんでした。
齋藤 修三郎 への返信

Re: otfパッケージへの新規フォント追加

- t tk の投稿
OTFパッケージのuptex拡張を書いたttkです。

斎藤さんがポイントを押さえて解説されているのでフォントの構成について必要な情報は得られると思いますが、私からいくつか補足します。

\CID{} に書いた10進数番号や \UTF{} に書いた16進数番号はVFを通じてTFMに結び付けられています。
その対応関係は、斎藤さんのUTFパッケージのページの「VFの構成方法についての覚え書き(PDF)」に解説があります。

OTFパッケージのuptex拡張では、\UTF{} の文字の領域を U+2xxxx の追加漢字面(SIP)まで拡張しています。そのため、オリジナルのOTFパッケージでフォントを0,1,2,...,d,e,f の16個に分解しているところをuptex拡張ではさらに ...,x,y,z まで増やしています。
\CID{} の方はオリジナルと変わっていません。

その他、uptex拡張のオリジナルとの相違点は、本文用フォントのエンコーディングをオリジナルのJT1からJT2 (upTeX向け)に変えた点とフォントの名前を変えた点(upを追加)があります。
それ以外は、オリジナルのOTFパッケージのやり方に沿っていたはずです。

記憶に頼って書いていますので、細部で実際のものと違っていたらごめんなさい。


t tk への返信

Re: otfパッケージへの新規フォント追加

- yasui kaisuke の投稿
解説まことにありがとうございます。

皆様のおかげで現在、pLaTeXでは、otfパッケージに新規追加したフォントでも\CID{...}を使えるような環境をつくることができました。あとはttkさんの情報に従って、upLaTeXでも同じことができるようにしたいと思います。