CTANにない欧文フォントをLaTeXにインストールする
はじめに
upLaTeXにおいて、CTANに存在する欧文フォントをインストールするのは容易だ。しかしCTANに存在しないフォントをインストールするのは難しい。
困難の原因は、二つある。第一は、tfmファイルやmapファイルを生成するのが難しいことである。第二は、フォント設定ファイルの作り方が分かりづらいことである。
そこで、備忘録を兼ね、以下にその方法を記す。
一つのウェイトをインストールしてみる
tfmとは
フォントの形式は通常、otfやttfなどであるが、TeXはそれらを直接に扱うことができない。そこでtfmファイルなどのフォントファイルを生成して介在させる必要がある(tfmは、TeX Font Metricの略)。面倒だが、フォントごとに別のtfmを生成せねばならない。
otftotfm
tfmを生成するためには「otftotfm」というソフトを使う。otftotfmはふつうTeXをインストールしたときに一緒にインストールされているはずだ。インストールされているかどうかを確認するためには、ターミナルで、
otftotfm --version
と打ち、ヴァージョン情報が返ってくるかどうかを確かめればよい。
tfmなどの生成
さて今回はGoogle Fontsに収録されているJosefin Slabというフォントをインストールしてみよう。まずは、一つのウェイト(Regular)だけをインストールしてみる。
まず作業用ディレクトリを適当に作っておき、そこにJosefinSlab-Regular.ttfを入れておく。ターミナルで作業用ディレクトリに行き、次のコマンドを実行してみよう。
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-regular JosefinSlab-Regular.ttf
すると、○○○.tfm、○○○.vf、○○○.map、○○○.encという四種類のファイルが生成されるはずである1。
一応、オプションの意味を説明しておこう。
--no-type1 --no-dotlessj
は、「Type 1フォントへの変換を行わない」ということ、らしい。あまり理解できていない。--mapfile=josefinslab.map
で、mapファイル名の指定をする。mapファイルの名前は何でもよい(自分が分かりやすいような名前にする)。-e ec.enc
は、エンコーディングファイルの指定。ec.encを指定すると、T1エンコーディングになる。ちなみにtexnansi.encを指定するとLY1エンコーディングになる。エンコーディングって何なのかいまいち分かっていないが、私はT1エンコーディングにしておいて困ったことはない。-n josefinslab-regular
は、tfm名の指定。これも、自分が分かりやすいよう適当に名前を付ければよい。
また、-fkern
とすればカーニングの、-fliga
とすればリガチャの情報を、tfmに含ませることができる。Josefin Slabにはこれらの機能がなかったから上ではこのオプションをつけていないが、この機能があればつけたほうがよい。つまり、もしJosefin Slabがカーニングやリガチャの機能を備えていた場合には、次のようにオプションをつけてコマンドを実行するほうがよい、というわけである。
otftotfm -fkern -fliga --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-regular JosefinSlab-Regular.ttf
otfinfo -f JosefinSlab-Regular.ttf
などと打てば、フォントにどのような機能が備わっているかを確認できる。
styファイルの作成
各種ファイルが生成できたならば、すかさず、josefinslab.styという名前でstyファイルを作る。
%
% josefinslab.sty
%
\AtBeginDvi{\special{pdf:mapfile josefinslab.map}}% 先程生成したmapファイルの読み込み
\DeclareFontFamily{T1}{josefinslab}{}% TeXファイル内で使うフォント名を設定
\DeclareFontShape{T1}{josefinslab}{m}{n}{<-> josefinslab-regular}{}% 上で設定したフォント名と、先程生成したtfmファイルとを結びつける
\endinput
インストールできたかを確認
ここまでできたら、ほとんどインストールは完了したと言ってよい(今のままだと、各種ファイルがディレクトリにたくさん散らばっていて、気持ち悪いかもしれないが、この問題は次の節で解決する)。
動作確認のため、作業用ディレクトリにTeXファイルを作って、フォントが埋め込まれるかをチェックしておこう。
\documentclass[uplatex,dvipdfmx]{jsarticle}
\usepackage{josefinslab}
\begin{document}
\romanfamily{josefinslab}\selectfont
This is a test.
\end{document}
「This is a test.」がJosefin Slabで表示されたら、ここまでの作業はうまくいったことになる。
すべてのウェイトをインストールする
tfmなどの生成とインストール
すべてのウェイトをインストールするには、同じことを全ウェイトで実行すればよい。
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-regular JosefinSlab-Regular.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-regular-italic JosefinSlab-RegularItalic.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-light JosefinSlab-Light.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-light-italic JosefinSlab-LightItalic.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-thin JosefinSlab-Thin.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-thin-italic JosefinSlab-ThinItalic.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-semibold JosefinSlab-SemiBold.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-semibold-italic JosefinSlab-SemiBoldItalic.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-bold JosefinSlab-Bold.ttf
otftotfm --no-type1 --no-dotlessj --mapfile=josefinslab.map -e ec.enc -n josefinslab-bold-italic JosefinSlab-BoldItalic.ttf
このままでは各種ファイルでディレクトリがごちゃごちゃする。そこで○○○.tfmはtfmフォルダ内のjosefinslabフォルダに、○○○.vfはvfフォルダ内のjosefinslabフォルダに、というような塩梅で移動させておく。
mkdir vf/
mkdir tfm/
mkdir map/
mkdir enc/
mkdir vf/josefinslab/
mkdir tfm/josefinslab/
mkdir map/josefinslab/
mkdir enc/josefinslab/
mv *.vf vf/josefinslab/
mv *.tfm tfm/josefinslab/
mv *.map map/josefinslab/
mv *.enc enc/josefinslab/
こうして、各種ファイルを収納した四つのフォルダが作られた。これらのフォルダを、$TEXMF/fonts/
へ移動させる(マージさせる)2と、tfmなどの各種ファイルがカレントディレクトリになくとも使えるようになる。こうしてtfm類のインストールは完了する。
mapファイルが読み込めずエラーが生ずる場合、
sudo mktexlsr
を実行して情報を更新する。
styファイルの生成とインストール
さらにstyファイルを作る。
%
% josefinslab.sty
%
\AtBeginDvi{\special{pdf:mapfile josefinslab.map}}
\DeclareFontShape{T1}{josefinslab}{el}{n}{<-> josefinslab-thin}{}
\DeclareFontShape{T1}{josefinslab}{el}{it}{<-> josefinslab-thin-italic}{}
\DeclareFontShape{T1}{josefinslab}{l}{n}{<-> josefinslab-light}{}
\DeclareFontShape{T1}{josefinslab}{l}{it}{<-> josefinslab-light-italic}{}
\DeclareFontShape{T1}{josefinslab}{m}{n}{<-> josefinslab-regular}{}
\DeclareFontShape{T1}{josefinslab}{m}{it}{<-> josefinslab-regular-italic}{}
\DeclareFontShape{T1}{josefinslab}{sb}{n}{<-> josefinslab-semibold}{}
\DeclareFontShape{T1}{josefinslab}{sb}{it}{<-> josefinslab-semibold-italic}{}
\DeclareFontShape{T1}{josefinslab}{bx}{n}{<-> josefinslab-bold}{}
\DeclareFontShape{T1}{josefinslab}{bx}{it}{<-> josefinslab-bold-italic}{}
\endinput
これを$TEXMF/tex/latex/
に移動させる。これでstyファイルのインストールも完了する。
本当は\DeclareFontShape……
のような情報はstyでなくfdファイルに書き込むのが正しいのかもしれないが、fdファイルを作るやり方はよく分からなかった。しかしstyに書いても動くことは動くので、動作の点からは特に問題ないものと思われる。
scaleオプションの追加
scaleオプションを追加しておくと便利である(既存の欧文フォントのパッケージには大抵scaleオプションがある)。scaleオプションとは、\usepackage[scale=0.9]{josefinslab}
などとすれば欧文が0.9倍の大きさで印字されるようなオプション機能である。
scaleオプションを実装するためには、styファイルを少しばかり書き換えるだけでよろしい。具体的には以下のようにする(煩雑になるのを避けるためウェイトは二種類のみにしてある)。
%
% josefinslab.sty
%
\ProvidesPackage{josefinslab}[2019/03/31 v0.2]
\RequirePackage{xkeyval}
\DeclareOptionX{scale}{\def\jsfnslb@scale{#1}}
\DeclareOptionX{scaled}{\def\jsfnslb@scale{#1}}
\ExecuteOptionsX{scale=1}
\ProcessOptionsX
\def\jsfnslb@@scale{s*[\jsfnslb@scale]}
\DeclareFontFamily{T1}{josefinslab}{}
\DeclareFontShape{T1}{josefinslab}{m}{n}{<-> \jsfnslb@@scale josefinslab-regular}{}
\DeclareFontShape{T1}{josefinslab}{m}{it}{<-> \jsfnslb@@scale josefinslab-regular-italic}{}
\DeclareFontShape{T1}{josefinslab}{bx}{n}{<-> \jsfnslb@@scale josefinslab-bold}{}
\DeclareFontShape{T1}{josefinslab}{bx}{it}{<-> \jsfnslb@@scale josefinslab-bold-italic}{}
\AtBeginDvi{\special{pdf:mapfile josefinslab.map}}
\endinput