jlreqクラスの多書体化（ただしLuaLaTeXの場合）

どうやら、[とある記事][jlreq-up-deluxe]によると、「(u)pLaTeX上のjlreqクラスにおいて和文を多書体（多ウェイト）にする」のはトッテモ難しいようです。そして、その記事の結論としては、jlreqクラスを多書体（多ウェイト）にしたい場合は

>   とにかくLua(La)TeXしよう

とのこと。至極ゴモットモなので、**​「LuaLaTeX上のjlreqクラスにおいて和文を多書体（多ウェイト）にする」​**方法についてチョット解説してみることにします。

# 例題は『猫』である

この記事の解説の例示用に、LuaLaTeX＋jlreqクラスで『吾輩は猫である』の文章の一部を縦組で組んだ文書を用意しました。

```latex:sample0.tex
% LuaLaTeX 文書
% A6判縦組, 一段組, 基底サイズ9pt
\documentclass[tate,book,paper=a6,fontsize=9pt,onecolumn,
% ぶら下げ組を有効にする
  hanging_punctuation]{jlreq}
\usepackage{bxjalipsum}% "吾輩は猫である"したい
\begin{document}
%「吾輩は猫である」の4～6段落目の文章
\jalipsum[4-6]{wagahai}
\end{document}
```

出力の先頭ページは以下のようになりました。（LuaTeX-jaの既定設定[^then]に従って、フォントはIPAex明朝が用いられています。）

[^then]: 記事執筆当時の話です。現在のLuaTeX-jaの既定のフォントは「原ノ味フォント」に変更されています。

![先頭ページ](https://qiita-image-store.s3.amazonaws.com/0/14550/151ecc65-1947-cc60-506a-a5de2d000e68.png)

さて、冒頭で紹介した[「jlreqの多書体化」の記事][jlreq-up-deluxe]でも強調されているように、jlreqクラスの重要な特長が**​「[JLREQ]の規定に従った組版の実現」​**です。従って、フォント設定の変更を行う際には、「jlreqが定めている行組版のパラメタ」（LuaTeX-jaではこれを**JFM**と呼びます）が維持されるように注意を払う必要があります。

ここでは、JFMの差異が明確になるように[^why-burasage]、jlreqの側で**ぶら下げ組**（`hanging_punctuation`）を敢えて指定しました。先の出力結果をよく見ると、10行目の行末の読点がぶら下げられています。

[^why-burasage]: 決して「ぶら下げを行う方がよい」と主張する意図はありません。なお、luatexja-otfパッケージにもぶら下げ組を行う機能があります。

![拡大図](https://qiita-image-store.s3.amazonaws.com/0/14550/17160062-d591-6cc6-361d-4f6279ff2442.png)

LuaTeX-jaの既定のJFMではぶら下げが行われないため、以降の実例において、出力の10行目の行末を見ることで「jlreqの行組版が維持されているか」を判断できます。

※なお、JFMについては、以下の記事に少し詳しい解説があります。

  * [TeXでつくるプロポーショナル組日本語文書][tex-prop]

# 復習：LuaLaTeX（＋LuaTeX-ja）で和文フォントをイロイロする方法

LuaLaTeX＋LuaTeX-jaの和文フォント設定を変更する（物理フォントを変更する[^change-em]・多ウェイトにする・多書体にする）には、次の2つの方法があります（[参考記事][lualatex-quiz]）。

  * プリセットの設定を利用する → **luatexja-presetパッケージ**
  * 自力で好きなように設定する → **luatexja-fontspecパッケージ**\
    ※原則的に[^nfssonly]luatexja-presetパッケージはluatexja-fontspecを読みこんでその機能を利用するので、luatexja-presetを使う場合には同時にluatexja-fontspecの機能も使えます。

取りあえず、これらの一般的な方法をjlreqクラスに適用するとどうなるかを見てみましょう。先程の例の文書の一部の段落を太字にするため、luatexja-presetパッケージを読みこんで「源ノフォントの多ウェイト」（`sourcehan,deluxe`）の設定を適用してみます。

```latex:sample1.tex
% LuaLaTeX 文書
\documentclass[tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
% 源ノ明朝/角ゴシックの多ウェイト設定
\usepackage[sourcehan,deluxe]{luatexja-preset}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum[4]{wagahai}\par
% 途中の段落("猫"の5段落目)だけ太字で出力する
{\bfseries\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\end{document}
```

出力の「10行目の行末」を見てみましょう。

![出力(拡大図)](https://qiita-image-store.s3.amazonaws.com/0/14550/48f807bc-440b-602c-3ff1-22d440188024.png)

jlreqのJFM設定が維持されていないので**失敗**です。どうやら話はそんなに単純ではないようです。

[^change-em]: (u)pLaTeXの場合は「先に論理フォントが与えられていて、それに物理フォント（実際のOpenTypeフォント）をマップする」という方式になっているため、「使う物理フォントを変える（これを行うのがpxchfonパッケージ）」のと「フォントの個数を増やす（これを行うのがjapanese-otfパッケージ）」のが全く別の話になり、後者の実装を自力で行う（これが[例の記事][jlreq-up-deluxe]が目標としていたこと）のは非常に困難です。一方、LuaLaTeXの場合は「直接に物理フォントの使用を宣言する」という方式であるため、「使う物理フォントを変える」のも単に「フォントの個数を増やす」話の一種に過ぎない（従来のフォントを使わなくなるだけ）ことになります。
[^nfssonly]: luatexja-fontspec（やfontspec）の機能を使わずに和文プリセット設定を行うための「nfssonlyモード」というものも存在するのですが、この記事では扱いません。

# jlreqでマトモにluatexja-presetする方法

luatexja-presetパッケージでは、自身が行う設定に適用するJFMをパッケージオプションで指定できます。

```latex
\usepackage[jfm_yoko=<横組JFM名>,jfm_tate=<縦組JFM名>,...]{luatexja-preset}
```

jlreqクラスが用いているJFMの情報は[ドキュメント][jlreq-doc]中に書いてあります[^jlreq-jfmvar]。

> **LuaLaTeXの場合**
>
>   * 横書き用のJFMは`jlreq`
>   * 縦書き用のJFMは`jlreqv`

従って、「jlreqでluatexja-presetを使いたい」場合は、パッケージの読込を以下のようにすればよいはずです。

```latex
% jlreq用のJFMを指定する
\usepackage[jfm_yoko=jlreq,jfm_tate=jlreqv,...]{luatexja-preset}
```

先ほどの失敗例（sample1.tex）にこの修正を加えてみましょう。

```latex:sample2.tex
% LuaLaTeX 文書
\documentclass[tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage[sourcehan,deluxe,
  % jlreq用のJFMを指定する
  jfm_yoko=jlreq,jfm_tate=jlreqv]{luatexja-preset}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum[4]{wagahai}\par
% 途中の段落だけ太字で出力する
{\bfseries\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\end{document}
```

![出力(拡大図)](https://qiita-image-store.s3.amazonaws.com/0/14550/b2ad705c-8aaf-55d0-78b3-fb8ea8d074b9.png)

うまくいきました！

[^jlreq-jfmvar]: ちなみに、jlreqクラスでは行組版パラメタを複数の方式から（`open_bracket_pos`と`hanging_punctuation`オプションにより）選択できますが、どの方式を選んだ場合も同じ名前のJFMが使われます。

# jlreqでマトモにluatexja-fontspecする方法

luatexja-fontspecパッケージが提供する和文フォント設定用命令（`setmainjfont`、`newjfontfamily`、など）においては、以下のオプションで適用するJFMを指定できます。

```latex
  % オプションを追加する
  YokoFeatures={JFM=<横組JFM名>},TateFeatures={JFM=<縦組JFM名>}
```

例えば、jlreqのJFMを維持したまま和文フォントを「HGS創英角ﾎﾟｯﾌﾟ体」に切り替える命令`\jPoptai`を定義するための`\newjfontfamily`命令は以下のようになります。

```latex
% 素敵なフォントを使いましょう
\newjfontfamily{\jPoptai}[
  YokoFeatures={JFM=jlreq},
  TateFeatures={JFM=jlreqv},
]{HGSSoeikakupoptai}
```

念のため、完全な文書の例を挙げておきます。

```latex:sample4.tex
% LuaLaTeX 文書
\documentclass[tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage{luatexja-fontspec}
\newjfontfamily{\jPoptai}[
  YokoFeatures={JFM=jlreq},
  TateFeatures={JFM=jlreqv},
]{HGSSoeikakupoptai}% HGS創英角ﾎﾟｯﾌﾟ体
\usepackage{bxjalipsum}
\begin{document}
\jalipsum[4]{wagahai}\par
% 途中の段落だけ創英角ﾎﾟｯﾌﾟ体で出力する
{\jPoptai\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\end{document}
```

![出力(拡大図)](https://qiita-image-store.s3.amazonaws.com/0/14550/8c92bf83-d1e0-865d-398d-8d7d5bab98af.png)


さらに蛇足になりますが、「luatexja-presetパッケージを読み込んで、かつluatexja-fontspecパッケージの機能を利用する」例を挙げておきます。

```latex:sample5.tex
% LuaLaTeX 文書
\documentclass[tate,book,paper=a6,fontsize=9pt,onecolumn,
  hanging_punctuation]{jlreq}
\usepackage[ms-hg,deluxe,% MSフォント+HGフォント
  jfm_yoko=jlreq,jfm_tate=jlreqv]{luatexja-preset}
% luatexja-fontspecは自動的ｋに読み込まれる
\newjfontfamily{\jPoptai}[
  YokoFeatures={JFM=jlreq},
  TateFeatures={JFM=jlreqv},
]{HGSSoeikakupoptai}% HGS創英角ﾎﾟｯﾌﾟ体
\usepackage{bxjalipsum}
\begin{document}
% 明朝・太字→HG明朝E
{\bfseries\jalipsum[4]{wagahai}\par}
% 創英角ﾎﾟｯﾌﾟ体
{\jPoptai\jalipsum[5]{wagahai}\par}
\jalipsum[6]{wagahai}\par
\end{document}
```

![出力(拡大図)](https://qiita-image-store.s3.amazonaws.com/0/14550/71ec43d0-56cd-47dd-f952-89c974fc49c5.png)


# 結論

  * TeXの闇:skull:に突っ込みたい人:scream:は、(u)pLaTeXしましょう！
  * 欅坂46とかで盛り上がりたい人:relaxed:は、**とにかくLuaLaTeXしましょう！**

[jlreq-doc]: https://github.com/abenori/jlreq/blob/master/README-ja.md#lualatex%E3%81%AE%E5%A0%B4%E5%90%88
[jlreq-up-deluxe]: https://web.archive.org/web/20190504083426/https://yasunari.github.io/jlreq-with-typefaces.html
[jlreq]: https://www.w3.org/TR/jlreq/ja/
[lualatex-quiz]: https://qiita.com/zr_tex8r/items/ac9176e4611bf233a3e0
[tex-prop]: https://qiita.com/zr_tex8r/items/0512dd43e9806483013a