[[dvipdfmx]] > フォントの設定

// dvipdfmx の項目が長すぎるので分離.ページ途中のタグ [#xxx] にリンクするのは
// タグを自動でなく計画的に付けないとリンク切れしやすく,どこにリンクしているか
// すぐわからなくなるので,むしろ別ページのほうがよいと思う.


*dvipdfmx におけるフォントの設定 [#tbddb566]

フォントの設定は TeX 関連プログラムを使う際に大きな困難となる部分です.
TeX とその関連プログラムがどのようにフォントを取り扱うのか,あまり理解していない場合は各ディストリビューションのデフォルト設定に従うのが賢明です.
フォント管理ツール(updmap など)が利用可能であればそれを利用しましょう.


----
#contents
----

**フォントの埋め込み設定 [#y935d97b]

dvipdfmx がフォントを埋め込むかどうかは設定によります.

まず欧文フォントですが,TeX Live および 2016/01/18 以降の W32TeX ではデフォルトで欧文フォント(URW フォント)を埋め込みます.
2016年1月17日までの W32TeX では,通常は PostScript Level 1 での基本14書体は埋め込みませんが,これを埋め込むには

  dvipdfmx -f dlbase14.map ファイル名

のようにして起動してください.
あるいはソースに

  \AtBeginDvi{\special{pdf:mapfile dlbase14.map}}

なる [[special 命令]]を書いておいてもよいです.(\specialの用法について ([[qa:55664]], [[qa:55665]], [[qa:55672]]))

和文フォントの埋め込みは,
- TeX Live においては,[[kanji-config-updmap で設定を行う>TeXとフォント#ge692ee0]]のが便利です.
- W32TeX は欧文フォントと同様に -f オプションでマップファイルを指定します.hiraginopron.map, hiraginopron04.map, ipaex.map, kozukapr6n.map, kozukapr6n04.map, morisawapr6n.map, morisawapr6n04.map, msmingoth.map, noembed.map, noembed04.map, yu.map, yu-win10.map が利用可能です.



**マップファイルの概要 [#tfa82570]

フォントの設定はマップファイルで行います.
マップファイルの役割は,TeX が認識するフォント名と実際に PDF 出力に使うべき実フォントとを対応付けることです.
このファイルの書式は

  tfm[@SFD@] enc font options

のようになります.
ここで '''tfm''' は TeX において使われるフォント名,'''enc''' は使用すべきフォントのエンコーディング,'''font''' は PDF 出力に用いられる実フォント名(通常はファイル名)で ''' options''' で様々なオプションを指定します.
[@SFD@] の項は CJK パッケージで用いられるフォントの分割方法の指定で,pLaTeX などでは通常不要です.

TeX Live や W32TeX をフルインストールすれば各 OS で利用可能なフォントのマップファイルは既にインストールされています.
TeX Live でフォントのマップファイルが存在しない場合は [[ptex-fontmaps パッケージ:http://www.ctan.org/pkg/ptex-fontmaps]] を導入します.
TeX Live でフォントのマップファイルが存在しない場合は [[ptex-fontmaps パッケージ:https://ctan.org/pkg/ptex-fontmaps]] を導入します.
使用するマップファイルの切り替えには updmap プログラムを使います.
マップファイルが用意されていないフォントを使いたい場合は自分で用意しなければなりません.

以下にマップファイルの書き方について簡単に解説します.

***TeX フォント名 [#ua7d8a2c]

マップファイルの '''tfm''' のフィールドには TeX で使用されるフォント名,あるいは Virtual font から最終的に辿り着く TeX フォントがきます.
cmr10 や rml などです.
オプションとして @ SFD@ をつけることができます.
ここで SFD は SubFont Difinition 名です.
このオプションは '''SFD''' の規則に従い分割されたサブフォントを一つのフォントにまとめあげる(復元する)ときに指定します.

  min@Unicode@  unicode  Mincho

は,Unicode.sfd の規則にしたがって分割されたサブフォント群 min00, min01, ... を逆にひとつの Unicode フォントとして復元します.
その後このひとつに束ねられた仮想的なフォントは Mincho というフォントにマップされます.

***エンコーディング [#y16b9bc3]

エンコーディング・フィールド '''enc''' を正しく指定しないと正しい出力は得られません.
dvipdfmx でサポートされているのは

-dvips の .enc 名
-PostScript CMap リソース名
-unicode

の3種類です.

dvips の .enc ファイルは 8-bit エンコーディング用のエンコーディングファイルで,どのコードポイントにどの文字(グリフ)が割り当てられているかを PostScript の書式で記述します.
例えば,8r.enc では

   /TeXBase1Encoding [
   % 0x00
     /.notdef /dotaccent /fi /fl
     /fraction /hungarumlaut /Lslash /lslash
     ...(略)...
     /udieresis /yacute /thorn /ydieresis
   ] def

のような記述が見られます.
コード 0x00 に /.notdef(未定義)文字を,0x01 に /dotaccent を,0x02 に /fi(f と i のリガチャ)を...割り振っています.
ここでは文字の識別は PostScript グリフ名で行われます.
dvipdfmx では OpenType/TrueType フォントに対して dvips enc ファイルを適用する場合は,Unicode 値を使って /uniXXXX(XXXX は 4 桁の 16 進数 Unicode 値)という形での指定も可能です.
必要な dvips enc ファイルは通常のインストールでほぼすべてインストールされています.

  foo 8r Foo

というマップエントリは TeX フォント foo を Foo に対応付けます.
その際 TeX で用いられたエンコーディングは 8r.enc に記述されてあるものとします.

PostScript CMap リソースは dvipdfmx が文字を CID (Character IDentifier) と呼ばれる文字の識別番号で識別する場合に用いられます.
PostScript CMap ファイルは一般的によく用いられるエンコーディング(Shift-JIS など)から CID への対応付けを記述したファイルです.
例えば,UniJIS-UCS2-H は Unicode の JIS サブセットの範囲で UCS2 で表現された文字列を Adobe-Japan1 で定められた文字集合の CID の並びに変換するのに用いられます.
dvipdfmx では拡張子が ".otf" の 和文 OpenType フォントに対しては通常これを使います.
pTeX/pLaTeX でよく用いられる設定は:

  rml  H Ryumin-Light
  gbm  H GothicBBB-Medium

などです.
CMap ファイルは通常は [[Adobe によって管理されたもの:https://github.com/adobe-type-tools/cmap-resources/]] が一式インストールされているはずです.

最後に unicode は OpenType/TrueType フォントに内蔵の Unicode マッピングテーブルを使って Unicode 値からフォント内の字形データを得ることを指定します.
upLaTeX や Omega など DVI ファイル内のエンコーディングが Unicode となる場合にはこれが使えます.

  uprml-h unicode ipaexm.ttf

エンコーディング unicode は PostScript Type1 フォントに対しても指定が可能です.
この場合は,Adobe グリフリストの記述に従い PostScript グリフ名と Unicode 値とを対応付けます.
ファイル "glyphlist.txt" がインストールされている必要があります.

***実フォント名 [#he05780d]

'''font''' の項には出力 PDF で使用されるフォント名がきます.
これは通常フォントファイル名です.

  ugoth10  unicode  Gothic.ttf

は TeX フォント ugoth10 を TrueType フォント Gothic.ttf に結びつけます.
また,フォントファイルが TrueType Collection の場合は

  ugoth10  unicode  :1:GothicB.ttc

のようにファイル名の前に :n: を付けることで n 番目のフォントを選べます.
実フォント名の前に "!" スイッチを付けることでフォントを非埋め込みにすることも可能です:

  ugoth10 unicode   !Gothic.ttf

フォントを非埋め込みにすることでファイルサイズをかなり小さくできますが,表示に問題が生じる場合が多々あります.
特に文書の再現性と(長期的な)保存という観点からは推奨されません.
実際,PDF を長期保存可能なフォーマットとして利用することを目標として,[[国際標準化機構(ISO) により制定された PDF/A:http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38920]] ではフォントをすべて埋め込むことを求めています.

***オプション [#d4922a30]

オプション・フィールドではフォントに対して様々なオプションを与えます.
例えば,"変形" オプション

  -s .167
  -e 1.2
  -b 1.0

のうち,"s" は斜体 (slanted) に,"e" は横に伸張 (extended) し,"b" は "太字" にするオプションです.
"b" オプションによる疑似太字の結果は酷いもので,これの利用は推奨されません.
将来削除される可能性もあります.

フォント・オプション:

  -i 2
  -w 1

"i" は TrueType Collection インデックスの指定(フォント名の前の :2: と同じ)で "w" は縦書き/横書きの指定です.
"w" はエンコーディングが unicode のときのみ有効で,値が 1 のときは縦書き用であることを示します.
オプション "w" の値が 1 のとき縦書き用の OpenType グリフ置換機能が有効になります.
エンコーディングを unicode に指定して縦組みを行う場合,"-w 1" を指定しないと括弧や句読点が正しく表示されないことに注意してください.


**フォント関連のよくあるエラーと警告 [#p3025758]

フォントとエンコーディング関連,PostScript ファイルの取り込みではエラーが多発します.
フォント関連でよくあるエラー・警告とその原因です.

  Could not locate a virtual/physical font for TFM “gbm-jis”.
  There are no valid font mapping entry for this font.
  Font file name “gbm-jis” was assumed but failed to locate that font.
  Cannot proceed without .vf or “physical” font for PDF output…

この種のエラーは mktexpk(ビットマップ・フォント生成プログラム)が実行され失敗した後表示されます.
TeX フォント "gbm-jis" にはなんら実フォントとの対応付けがなされておらず,"gbm-jis" という名のフォントを試そうとして失敗しました.
おそらくフォントの設定が適切になされていません.
類似のエラーとして

  Could not locate a virtual/physical font for TFM "hgothr-h".
  This font is mapped to a physical font "HiraKakuProN-W3.otf".
  Please check if kpathsea library can find this font: HiraKakuProN-W3.otf
  Cannot proceed without .vf or "physical" font for PDF output...

のようなメッセージが出る場合は,フォント "HiraKakuProN-W3.otf" がインストールされていないか dvipdfmx が見つけられる場所にありません.

  Could not find encoding file "H".

pTeX/pLaTeX で通常必要な PostScript CMap リソース "H" が見つかりませんでした.
これらのファイルが正しくインストールされていない可能性があります.

  No character mapping available.
  CMap name: H
  input str: <7c>

CMap "H" での文字コード変換に失敗しました.
おそらくエンコーディングの指定が誤っています.
自身が DVI への出力にどのようなエンコーディングを使っているか把握する必要があります.
H (JIS) で未定義の文字コードを使っている可能性もあります.

  Glyph missing in font. (CID=19141, code=0x4e23)

お使いのフォントには CID 19141 に対応する文字データがありません.
フォントを代えるなどの対処が必要です.

  Failed to load AGL file "glyphlist.txt"...

PostScript グリフ名と Unicode との対応を記述したファイル "glyphlist.txt" が読み込めませんでした.
(主に欧文フォントで)稀に文字が欠落したり,生成された PDF ファイルで文字列の検索やコピー & ペーストがうまくいかなくなるかもしれません.

  CMap has higher supplement number than CIDFont: Ryumin-Light
  Some characters may not be displayed or printed.

使用している CMap が新しい改訂版であるため,フォント "Ryumin-Light" に含まれない文字が使用される可能性があります.
文字が欠落する可能性があり,"Glyph missing in font." の警告が出ないか注意する必要があります.


**ファイルが見つからない場合の対処法 [#x37a3e64]

ファイルが見つからないというエラーが出た場合は,dvipdfmx が実際にどこを探していてるかを知る必要があります.
TeX 関連の多くのプログラムは kpathsea というライブラリにファイル検索を依頼しており,dvipdfmx も kpathsea ライブラリを利用しています.
kpsewhich というコマンドラインプログラムがファイルを置くべき場所を知るのに利用できます.
例えば,PostScript CMap "H" が dvipdfmx に見える場所にあるか確かめるには

  kpsewhich -progname=dvipdfmx -format=cmap H

とします.
ファイルが存在する場合はその場所が出力されます.
空行しか出力されない場合は dvipdfmx の検索パスにファイルが存在しません.
CMap ファイルがどこにインストールされているべきなのか知るには

  kpsewhich -progname=dvipdfmx -show-path=cmap

のようにします.
区切り文字(Windows では ";")で区切られたフォルダのリストが出力されます.
検索パス等は

  kpsewhich -a -format=cnf texmf.cnf

で示されるファイルで設定されています.
kpsewhich の使い方については

  kpsewhich -help

などを参照してください.


**フォント関連の重要なファイル [#d0149545]

pTeX/pLaTeX で日本語を使うために最低限必要なファイルは PostScript CMap リソース "H"(と "V")です.
TrueType フォントを利用する場合はこれに加えて "Adobe-Japan1-UCS2"  というファイルが必要となります.
"H" は JIS エンコーディングから Adobe-Japan1 の CID 値への対応付けを行う変換用のファイルで,"Adobe-Japan1-UCS2" は Adobe-Japan1 の CID を Unicode に変換するのに用いられます.
TrueType フォントを(PostScript CMap リソースとともに)利用する場合は

  JIS --> Adobe-Japan1 --> Unicode

という 2 重の(文字コード)変換を伴います.

他に Unicode に関連した重要なものとして [[Adobe グリフリスト:https://github.com/adobe-type-tools/agl-aglfn/blob/master/glyphlist.txt]]があります.
これは "glyphlist.txt" という名前でインストールされている必要があります.
このファイルは PostScript グリフ名を Unicode に対応付ける必要がある場合に利用されます.
PostScript Type1 フォントを Unicode で使う場合がそのひとつです.
生成されたPDF ファイル内の文字列の検索やコピー & ペーストを可能にするためにも重要な役割を果たします.