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}
これだけで
- 明朝体・細字(
\mcfamily\ltseries
) - 明朝体・中字(
\mcfamily\mdseries
) - 明朝体・太字(
\mcfamily\bfseries
) - ゴシック体・中字(
\gtfamily\mdseries
) - ゴシック体・太字(
\gtfamily\bfseries
) - ゴシック体・極太字(
\gtfamily\ebseries
) - 丸ゴシック体(
\mgfamily
)
の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
ですが、fontsize
とjafontsize
の両方を指定した場合やjafontscale
を指定した場合は適切な値にする必要があります。ところで、わざとらしい例ですがfontsize=9pt,jafontsize=12Q
の場合の適切な値がscale=0.94841
になることはみなさんは分かりますか?
jlreqクラスが使うJFM
jlreqクラスは組み方に合わせて様々なJFMを使っています。(u)pLaTeXの場合に使われるJFMの名前は以下のようになっています。
[u][b][z]jlreq[g][-v]
u
: upLaTeX用b
: ぶら下げ組用z
:open_bracket_pos=zenkakunibu_nibu
用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]
の部分はクラスオプションのfontsize
・jafontsize
・jafontscale
に応じた適切な和文スケールにする必要があります。
この方法で好きなだけフォントを増やすことが出来ます。一方でこの方法では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パッケージを使う場合に比べて以下の特徴があります。
deluxe
オプションが既定で設定されます。- そもそも多書体化が目的なのでデフォルトでONにしています。
- jlreqクラスの内部マクロを使って
prefix
やscale
オプションを自動的に設定します。 expert
オプションが利用可能です。- expert用のVF/JFMはjfmutilでは作成されません。
jis2004
オプションが既定で設定されます。- 現在のTeX Liveの和文フォントの設定がJIS2004字形になっているのでこれをデフォルトにしています。
- kanji-config-updmapの設定値を取得する方法があればよいのですが……
最後に
今年の重点テーマは「このパッケージもスゴイ!」だそうです。
というわけで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に合わせてリリースする予定です。