h20y6m.github.io

2020年12月03日

(u)pLaTeXでもjlreqクラスで多書体化したい

これは「TeX & LaTeX Advent Calendar 2020」の3日目の記事として投稿した『(u)pLaTeXでもjlreqクラスで多書体化したい · GitHub』の転載です。

この記事では(u)pLaTeX上のjlreqクラスで多書体化する方法と、拙作のjlreq-deluxeパッケージの紹介をします。

otfパッケージで多書体化する方法

(u)pLaTeXで多書体化と言えば真っ先に思いつくのはotfパッケージのdeluxeオプションでしょう。

\usepackage[deluxe]{otf}

これだけで

の7書体が簡単に使えるようになります。

ではjlreqクラスではどうなるか、以下の例をタイプセットしてましょう(こちらの記事の例をpLaTeX用に改変しました)。

% pLaTeX+dvipdfmx 文書
% A6判縦組, 一段組, 基底サイズ9pt
\documentclass[dvipdfmx,tate,book,paper=a6,fontsize=9pt,onecolumn,
% ぶら下げ組を有効にする
  hanging_punctuation]{jlreq}
\usepackage{bxpapersize}% 用紙サイズを反映させる
% otfパケージで多書体化
\usepackage[deluxe,scale=1]{otf}
\usepackage{bxjalipsum}% "吾輩は猫である"したい
\begin{document}
%「吾輩は猫である」の4~6段落目の文章
\jalipsum[4-6]{wagahai}
\end{document}

出力結果を見るとhanging_punctuationを指定しているのにぶら下げ組になっていません(\usepackage[deluxe,scale=1]{otf}をコメントアウトして比べてみてください)。ぶら下げ組は分かりやすい例ですが、それ以外にも文字間のアキの入り方が変わってきます。

どうしてこのようことになるかというと、jlreqクラスは独自のJFM(文字の組み方のパラメーター)を使っているのですが、otfパケージを読み込むとJFMがotfパケージのものに置き換わってしまうために組版結果が変わってしまったのです。

jlreqクラスの組版を維持したままで多書体化するためにはjlreqのJFMを維持したままで多書体化に対応したVF/JFMを用意する必要があります。

余談:上の例ではotfパケージのオプションにscale=1を指定しています。これは和文スケール値でjsarticle等の場合は自動で適切な値が設定されますがjlreqクラスの場合は自分で指定する必要があります。jlreqクラスの規定値は1ですが、fontsizejafontsizeの両方を指定した場合やjafontscaleを指定した場合は適切な値にする必要があります。ところで、わざとらしい例ですがfontsize=9pt,jafontsize=12Qの場合の適切な値がscale=0.94841になることはみなさんは分かりますか?

jlreqクラスが使うJFM

jlreqクラスは組み方に合わせて様々なJFMを使っています。(u)pLaTeXの場合に使われるJFMの名前は以下のようになっています。

[u][b][z]jlreq[g][-v]

明朝用とゴシック用はJFM名が異なるだけなので1書体あたり16種類のJFMがあることになります。

つまりjlreqクラスで書体を1つ増やすためには16種類のVF/JFMを作成する必要があります。

(u)pLaTeXでフォントを増やす方法

jlreqのJFMを維持したまま新しいVF/JFMを作成する簡単な方法はjlreqのVF/JFMをフォント名だけ変更して複製する事でしょう。この方法はdoraTeXさんの記事「(u)pTeX における和文多書体の実現 ~Sierraの全和文フォント出力を例として~」が非常に参考になります。

例えばpLaTeXでぶら下げ組で組んでいる場合に、kyoというファミリーを追加し「UDデジタル教科書体」を割り当ててみます。

まずjfmutilを利用してVF/JFMのコピーを作成します。

> jfmutil vfcopy bjlreq   kyor-bjlreq   r-kyor-bjlreq
> jfmutil vfcopy bjlreq-v kyor-bjlreq-v r-kyor-bjlreq-v
> jfmutil vfcopy bjlreq   kyob-bjlreq   r-kyob-bjlreq
> jfmutil vfcopy bjlreq-v kyob-bjlreq-v r-kyob-bjlreq-v

次のようなソースファイルを作成します。

\documentclass[platex,dvipdfmx,tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage{bxpapersize}
\usepackage{bxjalipsum}
\DeclareFontFamily{JY1}{kyo}{}
\DeclareFontFamily{JT1}{kyo}{}
\DeclareFontShape{JY1}{kyo}{m}{n}{<->s*[1]kyor-bjlreq}{}
\DeclareFontShape{JT1}{kyo}{m}{n}{<->s*[1]kyor-bjlreq-v}{}
\DeclareFontShape{JY1}{kyo}{b}{n}{<->s*[1]kyob-bjlreq}{}
\DeclareFontShape{JT1}{kyo}{b}{n}{<->s*[1]kyob-bjlreq-v}{}
\AtBeginDvi{%
  \special{pdf:mapline r-kyor-bjlreq   H :0:UDDigiKyokashoN-R.ttc}%
  \special{pdf:mapline r-kyor-bjlreq-v V :0:UDDigiKyokashoN-R.ttc}%
  \special{pdf:mapline r-kyob-bjlreq   H :0:UDDigiKyokashoN-B.ttc}%
  \special{pdf:mapline r-kyob-bjlreq-v V :0:UDDigiKyokashoN-B.ttc}%
}
\renewcommand{\mcdefault}{kyo}% デフォルトの明朝体を教科書体にしてみる
\begin{document}
\jalipsum[4]{wagahai}\par
{\bfseries\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\end{document}

なお\DeclareFontShape[1]の部分はクラスオプションのfontsizejafontsizejafontscaleに応じた適切な和文スケールにする必要があります。

この方法で好きなだけフォントを増やすことが出来ます。一方でこの方法ではotfパケージの\CID\ajSnowmanなどの命令は使えません。

pxjodelパケージでdeluxeする

otfパケージの\CID\ajSnowmanなどの機能も使いたい場合はjlreqのJFMを維持したままotfパケージのVF/JFMの構造に合わせたVF/JFMを作成するというヤヤコシイ作業が必要になります。

このヤヤコシイ作業が簡単に出来るZRさん作成のpxjodelパケージがあります。

先ほどと同様にpLaTeXでぶら下げ組で組んでいる場合を例にしてみます。

まずjfmutilのjodelサブコマンドでVF/JFMを作成します。

> jfmutil jodel bjlreq   bjlreq
> jfmutil jodel bjlreq-v bjlreq

あとはotfパケージの代わりにpxjodelパケージをprefixオプション付きで読み込むだけです。

\documentclass[platex,dvipdfmx,tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage{bxpapersize}
% otfパケージの代わりにpxjodelパケージを読み込む
\usepackage[deluxe,scale=1,prefix=bjlreq]{pxjodel}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum[4]{wagahai}\par
{\bfseries\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\clearpage
% \CID等も使える
森\UTF{9DD7}外と内田百\UTF{9592}とが\UTF{9AD9}島屋に行くところを想像した。\par
\CID{7652}飾区の\CID{13706}野家\par
\ajSnowman は素敵\par
\end{document}

jlreq-deluxeパケージ

pxjodelパケージを使えばjlreqクラスでもotfパケージの機能を使って多書体化することがなりますが、jlreqクラスのオプションに合わせてpxjodelパッケージのオプションも調整する必要がありちょっぴり面倒です。

そこで読み込むだけでjlreqクラスを多書体化できるjlreq-deluxeパッケージを作成しました。

\documentclass[platex,dvipdfmx,tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage{bxpapersize}
% jlreq-deluxeパケージを読み込むだけ
\usepackage{jlreq-deluxe}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum[4]{wagahai}\par
{\bfseries\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\clearpage
森\UTF{9DD7}外と内田百\UTF{9592}とが\UTF{9AD9}島屋に行くところを想像した。\par
\CID{7652}飾区の\CID{13706}野家\par
\ajSnowman は素敵\par
\end{document}

pxjodelパッケージを使う場合に比べて以下の特徴があります。

最後に

今年の重点テーマは「このパッケージもスゴイ!」だそうです。

というわけでjlreq-deluxeパケージのスゴイ点を1つ紹介しておきます。

それは……「TeX Liveのパケージの中でサイズが最も大きなパケージである」ことです。

name size [MiB]
jlreq-deluxe 372
noto 198
context 170
japanese-otf 121

なんと2位のnotoパケージを2倍近く引き離すぶっちぎりの1位です。

こんなに巨大になってしまっている主な要因はVirtual Font (VF)です。パッケージサイズのうちVFが占めるのは実に99%以上でさらにそのうち90%以上がupTeX用です。

今年に入って「和文vf の fallback を dviware で」が提案されました。これを利用するとVFのサイズを大幅に削減できるようになります。

jlreq-deluxeパッケージのVFもこの機能を利用することで370 MiBから1.1 MiBまで軽量化することが出来ます。このVFを軽量化したものをTeX Live 2021に合わせてリリースする予定です。