Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2011-09-30

dvipdfmx で OpenType する件について (5)

前回の続き)

LaTeX サポートファイルの作成

最後にフォント定義ファイルを用意する。今の例(直立と斜体がある)は「持ち込む練習」で用いた「CM Sans Serif Quotation」と同じパターンになっているので、それに倣う(つまりイタリックを斜体で代替する)ことにする。

[t1mplus1p.fd]
\DeclareFontFamily{T1}{mplus1p}{}
\DeclareFontShape{T1}{mplus1p}{el}{n}{<->mplus1p-a-t1}{}
\DeclareFontShape{T1}{mplus1p}{el}{sl}{<->mplus1p-ao-t1}{}
\DeclareFontShape{T1}{mplus1p}{el}{it}{<->ssub*mplus1p/el/sl}{}
\DeclareFontShape{T1}{mplus1p}{l}{n}{<->mplus1p-l-t1}{}
\DeclareFontShape{T1}{mplus1p}{l}{sl}{<->mplus1p-lo-t1}{}
\DeclareFontShape{T1}{mplus1p}{l}{it}{<->ssub*mplus1p/l/sl}{}
%(以下他のウェイトについて同様の記述)

全く同様にして ts1mplus1p.fd も作成する(T1/t1 を TS1/ts1 に変えるだけ)。

ファイルの配置

前に LY1 エンコーディング用のファイルを配置した場所に追加することにする。OpenFont フォントファイル自身の配置は既に済んでいるはずである。

  • *.tfm → $LOCAL/fonts/tfm/public/mplus1p/
  • *.vf → $LOCAL/fonts/vf/public/mplus1p/
  • *.enc → $LOCAL/fonts/enc/dvips/mplus1p/
  • mplus1p.map は既にある $LOCAL/fonts/map/dvips/mplus1p/mplus1p.map に追記する。このファイルは既に設定ファイルで有効化されているはず。
  • *.fd → $LOCAL/tex/latex/mplus1p/
  • 例によって「必要に応じて mk何とか」…。

そして、テスト文書を組版して正常に出力されれば完了である。

[test3.tex]
\documentclass{article}
%\pdfmapfile{+pdftex-mplus1p.map} % これは後述
\usepackage[scale=0.8]{geometry} % テキスト領域幅を大きくする
\usepackage[T1]{fontenc}         % T1 を既定にする
\usepackage{textcomp}            % TS1 の記号を使えるようにする
\begin{document}
\newcommand*\sampleText{% サンプルテキストをマクロにした
  ``Macros are \textsl{pass\'e} ---
  they're \emph{so} mid-20th-century.''
  \$1 = \texteuro 0.96 = \textyen 58} 
\fontfamily{mplus1p}
\fontseries{el}\selectfont \sampleText \par
\fontseries{l}\selectfont  \sampleText \par
\fontseries{m}\selectfont  \sampleText \par
\fontseries{sb}\selectfont \sampleText \par
\fontseries{b}\selectfont  \sampleText \par
\fontseries{eb}\selectfont \sampleText \par
\fontseries{ub}\selectfont \sampleText \par
\end{document}
f:id:zrbabbler:20110929030858p:image

(おまけ) pdfteX でも使えるようにする

ここまで OpenType を dvipdfmx で使うための作業を行ってきたが、実はこの作業を経た後なら、pdfTeX で使えるようにするのも簡単である。「手順の概略」をもう一度眺めてみると、追加で必要な作業は「pdfTeX 用のマップファイル」の作成だけであることが解る。ところで、otftotfm が出力する情報(一連の作業の中で、temp.map というファイルに保存した)は pdfTeX 用の書式であることは既に述べた。だから既に準備はできている。

[temp.map](ただし AutoEnc_... の長い識別子を省略して示した)
% Automatically maintained by otftotfm or other programs. Do not edit.

mplus1p-a-t1--base mplus-1p-thin "AutoEnc_op... ReEncodeFont" <[a_op3mbq.enc <mplus-1p-thin.ttf
mplus1p-ao-t1--base mplus-1p-thin "0.167 SlantFont AutoEnc_op... ReEncodeFont" <[a_op3mbq.enc <mplus-1p-thin.ttf
mplus1p-a-ts1--base mplus-1p-thin "AutoEnc_yh... ReEncodeFont" <[a_yh4sjf.enc <mplus-1p-thin.ttf
mplus1p-ao-ts1--base mplus-1p-thin "0.167 SlantFont AutoEnc_yh... ReEncodeFont" <[a_yh4sjf.enc <mplus-1p-thin.ttf
%(以下他のウェイトについて同様の記述)

ただし、このまま使うと一つ問題がある。現状の pdfTeX は OpenType フォントの場合には合成斜体をサポートしていないのである。これはどうしようもないので、斜体は諦めて、斜体の TFM も直立体と同じ字形で出力することで済ませる。上のマップの中で合成斜体の指示*1は「0.167 SlantFont 」の部分なので、この文字列を全て削除する。この修正を加えたファイルを pdftex-mplus1p.map とする。

[pdftex-mplus1p.map]
mplus1p-a-t1--base mplus-1p-thin "AutoEnc_op... ReEncodeFont" <[a_op3mbq.enc <mplus-1p-thin.ttf
mplus1p-ao-t1--base mplus-1p-thin "AutoEnc_op... ReEncodeFont" <[a_op3mbq.enc <mplus-1p-thin.ttf
mplus1p-a-ts1--base mplus-1p-thin "AutoEnc_yh... ReEncodeFont" <[a_yh4sjf.enc <mplus-1p-thin.ttf
mplus1p-ao-ts1--base mplus-1p-thin "AutoEnc_yh... ReEncodeFont" <[a_yh4sjf.enc <mplus-1p-thin.ttf
%(以下他のウェイトについて同様の記述)

このファイルを $LOCAL/fonts/map/pdftex/mplus1p/ に配置する。例によって(以下略)。あとは、pdftex-mplus1p.map が既定で読まれるように設定する…、のはずだがここで難題がある。pdfTeX が既定で読むマップファイルは pdftex.map であり、しかもこの動作は簡単には変えられない。*2従って、ここでは「追加のマップファイルを (La)TeX 文書中で指定する」という方法を用いる。実行コマンドが変わるわけではないのでこの方法であまり問題は生じないであろう。

LaTeX 上の設定自体は何も変わらないので、上述のテスト文書 test3.tex に先に述べた「マップファイル追加」の記述を追加する。つまり、2 行目のコメントアウトを外して有効化する。*3

\pdfmapfile{+pdftex-mplus1p.map} % pdfTeX で文書中でマップファイル読込を指定する。

そして、「pdflatex test3」を実行して、結果として上掲の dvipdfmx での結果と「斜体が効いていないこと」を除いて同じものが得られれば成功である。


これまでの作業で生成されるファイルを集めたアーカイブファイルを置いておく。

ただし、対象を広げていて、OT1/T1/TS1/LY1 のエンコーディングに対して直立体/斜体(合成;pdfTeX では未サポート)を対象としている。*4サポートする DVI ウェアは dvipdfmx と pdfTeX である。注意として、このアーカイブの中では、dvipdfmx 用のマップファイルの名前が mplus1p.map ではなく pdfm-mplus1p.map となっている。*5

※なお、ここで述べた方法が正常に動作しない環境が存在することが判明している。詳細については「できない件」を参照してほしい。

*1:Type1 フォントであればこの指示が有効になる。

*2:しかも pdftex.map は updmap に支配されているのでこれに追記を行うという方法も不適切である。実際には既定で読むファイルを追加することは可能である――pdftexconfig.tex\everyjob の設定を書き加える――が、これにはフォーマットのリビルドを要するので、少し敷居が高いように感じる。恐らくその方法が普通に用いられることは想定されていないのではないかと思う。

*3:ちなみに、\pdfmapline{+mplus1p-a-t1--base ...} のようにしてマップ行を設定することもできる。

*4:ちなみに、OT1 のエンコーディングファイルとして用いたのは fontname パッケージの 7t.enc である。

*5:私は慣習として dvipdfmx 用のマップファイルの名前を pdfm- で始めるようにしている。