Skip to content

Instantly share code, notes, and snippets.

@h20y6m
Last active January 7, 2021 04:57
Show Gist options
  • Save h20y6m/4f04a5b44179b80c51353832ce41bc61 to your computer and use it in GitHub Desktop.
Save h20y6m/4f04a5b44179b80c51353832ce41bc61 to your computer and use it in GitHub Desktop.
(u)pLaTeXでもjlreqクラスで多書体化したい

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

これはTeX & LaTeX Advent Calendar 2020の3日目の記事です。2日目はbd_gfngfnさんでした。4日目はwtsnjpさんです。

この記事では(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ですが、fontsizejafontsizeの両方を指定した場合や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]の部分はクラスオプションの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パッケージを使う場合に比べて以下の特徴があります。

  • deluxeオプションが既定で設定されます。
    • そもそも多書体化が目的なのでデフォルトでONにしています。
  • jlreqクラスの内部マクロを使ってprefixscaleオプションを自動的に設定します。
  • 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に合わせてリリースする予定です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment