和文フォントを使う仕組み

[TODO] OTF パッケージについても含めなくては. dvipdfmx と dvips の説明順序と文章内容が合っていませんね…

pTeX, upTeX で和文を使う仕組み

pTeX レベルでは

\font\foo=jis
{\foo あいうえお}

と書くと,pTeX は jis.tfm という和文フォントメトリック(JFM)ファイルを参照して文字を並べ,その結果を dvi ファイルに書き出します.

同様に upTeX レベルでは

\font\foo=upjisr-h
{\foo あいうえお}

と書くと,upTeX は upjisr-h という和文フォントメトリック(JFM)ファイルを参照して文字を並べ,その結果を dvi ファイルに書き出します.

pTeX, upTeX は実際の文字の形を収めたファイルにはアクセスしません. dvi ファイルには jis, upjisr-h というフォント名(tfm 名)だけが入ります.

この dvi ファイルの処理はドライバに依存します.

dvipdfmx

dvipdfmx では rml, uprml-h といった名前に至るまでは dvips と同じです. ここで TeX Live では texmf-dist/dvipdfmx/dvipdfmx.cfg W32TeX では texmf-dist/dvipdfmx/config/dvipdfmx.cfg に f kanjix.map のように指定してあるマップファイルを見に行き,そこにたとえば

rml  H Ryumin-Light
uprml-h  UniJIS-UTF16-H  Ryumin-Light

とあれば,Ryumin-Light という名前だけが入ります. また,

rml  H ipaexm.ttf
uprml-h  UniJIS-UTF16-H  ipaexm.ttf

とあれば,texmf-dist/fonts/truetype/ipa 以下にある ipaexm.ttf がサブセット埋め込みされます.

何を埋め込まないかは dvipdfmx のソースツリーの src/cid_basefont.h に書いておきます(dvipdfm Japanese patch - Troubleshooting [Internet Archive] 参照).

dvips

dvips では,標準では texmf-dist/fonts/vf の下にある jis.vf (pTeX) あるいは upjisr-h.vf (upTeX) という virtual font(仮想フォント)ファイルを参照します. これはバイナリファイルですが,この中に「実フォント名は rml (あるいは uprml-h) である」という情報が書いてあると,texmf-dist/dvips/config/ の中の psfonts.map という map ファイルに rml (あるいは uprml-h) という項目がないか探します. なければ,config.ps に p +kanji-base.map といった設定があれば,kanji-base.map という map ファイルも探します. dvips に -Ppdf といったオプションを与えると,config.pdf で指定されている map ファイルも探します.

こういった map ファイルの中に

rml           Ryumin-Light-H
uprml-h       Ryumin-Light-UniJIS-UTF16-H

と書かれていれば,PostScript ファイルに Ryumin-Light-H (または Ryumin-Light-UniJIS-UTF16-H) という名前と文字コードを出力します. dvips も実際の文字の形のデータにはアクセスしません.

ps2pdf

ps2pdf は Ghostscript で pdfwrite デバイス出力をするシェルスクリプトですので,Ghostscript の設定に依存します. たとえば /usr/share/ghostscript/`gs --version`/Resource/Init/cidfmap に

/Ryumin-Light           /HeiseiMin-W3-Acro     ;
/GothicBBB-Medium       /HeiseiKakuGo-W5-Acro  ;

のように書いてあれば,dvips で作った PostScript ファイルに Ryumin-Light という名前が使ってあれば HeiseiMin-W3-Acro をサブセット埋め込みします.

pLaTeX2e で和文を使う仕組み

pLaTeX2e では,まずファミリー名を宣言します. 標準では,明朝 mc とゴシック gt が宣言されているだけです.

明朝フォントの tfm 名を変えるには次のようにします.

\DeclareFontShape{JY1}{mc}{m}{n}{<-> s * [0.961] jis}{}

これで明朝を使うと jis.tfm で指定されたフォントメトリックを 0.961 倍して使うことになります.

\DeclareFontShape の最初の引数はエンコーディング名です. JY1 は pTeX の和文横書きを意味します. upTeX の和文横書きは JY2 になります. pTeX の和文縦書きなら JT1 になります. upTeX の和文縦書は JT2 になります.

3番目の引数はシリーズ(ウェイト)名です. m は medium シリーズを意味します. 太字なら bx になります.

4番目の引数はシェイプ名です. n は normal(upright)シェイプを意味します. 他に it(イタリック),sl(斜体),sc(スモールキャップス)が指定できます.

この組合せすべてについて上記のような設定をするわけですが,実フォントがない場合は次のようにして代用させます.

\DeclareFontShape{JY1}{mc}{bx}{it}{<->ssub*gt/m/n}{}

これで横書き明朝のボールドイタリック体はゴシックの medium,normal で代用されます.

例として,「じゅん」というフォントを使ってみましょう.

「じゅん101」用の tfm ファイルはアスキーの morisawa.tar.gz に次の三つが含まれていますが,実はこれは一般的な tfm の名前を変えてコピーしただけのものです.

したがって,この段階では特に morisawa.tar.gz をダウンロードする必要はありません.

これら(のうち必要なもの)を /usr/share/texlive/texmf-dist/fonts/tfm の下あたりに置いておきます.

次に,スタイルファイルあるいは文書ファイルのプリアンブルに次のように定義します.

\DeclareKanjiFamily{JY1}{jun}{}
\DeclareKanjiFamily{JT1}{jun}{}
\DeclareFontShape{JY1}{jun}{m}{n}{<-> s * [0.961] Jun101-Light-J}{}
\DeclareFontShape{JY1}{jun}{bx}{n}{<->ssub*jun/m/n}{}
\DeclareFontShape{JT1}{jun}{m}{n}{<-> s * [0.961] Jun101-Light-V}{}
\DeclareFontShape{JT1}{jun}{bx}{n}{<->ssub*jun/m/n}{}

これで jun というファミリーが定義できました. 横書きでは Jun101-Light-J.tfm を 0.961 倍にスケールして使います.

このフォントを {\mgfamily ほげ} あるいは \textmg{ほげ} のようなコマンドで使えるようにするには,次のようにします.

\newcommand{\mgdefault}{jun}
\DeclareRobustCommand\mgfamily{%
\not@math@alphabet\mgfamily\textmg
\romanfamily\ttdefault
\kanjifamily\mgdefault
\selectfont}
\DeclareRobustCommand\ttfamily{%
\not@math@alphabet\ttfamily\mathtt
\romanfamily\ttdefault
\kanjifamily\mgdefault
\selectfont}
\DeclareTextFontCommand{\textmg}{\mgfamily}

こうして使えるようになった「じゅん」Jun101-Light-J.tfm をどの実フォントに対応づけるかは,最初に述べたように,ドライバ(dvipdfmx か dvips か)によって違います.

morisawa.sty

モリサワ5書体を使うための morisawa.sty を https://ctan.org/pkg/morisawa で配布しています.


Last-modified: 2018-06-13 (水) 21:35:37 (124d)