TeXでつくるプロポーショナル組日本語文書

>   これは「[TeX ＆ LaTeX Advent Caleandar 2017](https://adventar.org/calendars/2229)」の1日目の記事です。
>   （2日目は [ワトソン](https://blog.wtsnjp.com/2017/12/02/gotoh/) さん です。）

今年も無事に「TeX & LaTeX Advent Calendar」が始まりました。今年の重点テーマは**「TeXでつくるアレ」**、ということで、**「LuaLaTeXでつくる日本語プロポーショナル組文書」**の話をします。

## 例によって前口上

（例によって[TL;DR](#まずは普通に全角組源真ゴシック)）

### LuaLaTeXって何？

簡単にいうと、**「スゴイLaTeXエンジン」**です。次のような特長をもちます。

  * Unicodeにネイティブに[^unicode-native]対応。
  * 任意のOpenTypeフォント[^opentype]を直接[^font-direct]扱える。
  * OpenTypeの高度なレイアウト機能（字体切替など）を利用できる。
  * Lua言語スクリプトでLaTeX（やTeX）を制御可能。

[^opentype]: 本記事では、“CFFグリフ”と“TrueTypeグリフ”のOpenTypeフォントの両方を単に「OpenTypeフォント」と呼びます。一般的に後者は「TrueTypeフォント」と呼ばれることがあります。
[^unicode-native]: 「ネイティブ」とは入出力だけでなく内部処理も（バイト単位やレガシー文字コードでなく）Unicodeで行うことを指します。
[^font-direct]: 従来のLaTeX（pdfLaTeXや(u)pLaTeXも含む）では、新しいフォントを導入する際に、それに呼応する“論理フォント（TFM）”のデータファイルを作成する必要がありました。そして、特に和文フォントの場合はその作成が手順が確立されていないため、一般のユーザが新しいフォントを導入することは非常に困難でした。

LuaLaTeXはそれ自身は日本語組版に対応していませんが、日本語組版の機能を提供する「[LuaTeX-ja]」というパッケージが開発されていて、これを組み合わせると**「スゴイ日本語LaTeX環境」**ができあがります。

  * LaTeX史上最高の和文組版品質を実現。
  * 前述の「LuaLaTeXのスゴイ機能」はもちろん和文にも適用できる。

[LuaTeX-ja]: https://ja.osdn.net/projects/luatex-ja/wiki/FrontPage

LuaTeXエンジンは長らくベータ版の状態[^engine-beta]でしたが、2016年9月についに正式版である“バージョン1.0”がリリースされました（TeX Live 2017に収録）。最新のTeX配布においては、スゴイLuaLaTeXを実用で使う準備は既にできあがっているのです。

[^engine-beta]: この時期には後方非互換な仕様変更が割と頻繁に行われ、これがLuaLaTeXを実用で使う上での大きな障害になっていました。

### (u)pLaTeXでのプロポーショナル組

実をいうと、(u)pLaTeXでもプロポーショナル組はできないわけではありません。(u)pLaTeXを利用したプロポーショナル組は実際に行われていて、出版物でも使われています。しかし、(u)pLaTeXでのプロポーショナル組が一般のユーザにとって“使える”機能になっていないのも事実です[^hiraprop]。

これに対して、スゴイLuaLaTeXでは、普通のLaTeXユーザでも比較的容易にプロポーショナル組が実現できます。日本語LaTeXでプロポーショナル組を使いたいという人は、スゴイLuaLaTeXの使用を検討する価値は大いにあるでしょう。

[^platex-jfm]: むしろ、(u)pLaTeXにとって、全角組かプロポーショナル組かというのは“論理フォントの作り方”の差でしかありません。
[^hiraprop]: 一般のLaTeXユーザが使えるパッケージ機能としては、japanese-otfパッケージでヒラギノフォントを使っている場合に`\propshape`命令でプロポーショナル組ができる、というものがあります。

※なお本記事では「どんな場合に日本語プロポーショナル組を使うべきか？」という議論については一切立ち入らないことにします。

### 前提知識

  * LuaLaTeX＋LuaTeX-jaによる日本語文書作成のキホン的な知識（えっ）

    この記事は特定の話題（プロポーショナル組）に関するものなので、それ以外の一般的な日本語LuaLaTeXに関する解説は敢えて避けています。残念ながら、現在は日本語LuaLaTeXの一通りのキホンについて学習できる手頃な文献が存在しませんが、取りあえず[TeX Wikiの入門記事]の程度の最初歩の内容を身につけていれば、この記事の内容の追試はできるでしょう。

[TeX Wikiの入門記事]: https://texwiki.texjp.org/?LaTeX%E5%85%A5%E9%96%80%2F%E7%99%BA%E5%B1%95%E7%B7%A8#mb665da8

## まずは普通に全角組（源真ゴシック）

プロポーショナル組の話に入る前に、LuaLaTeX＋LuaTeX-jaで「自由にフォントを指定する」方法を練習（復習）しておくとよいでしょう。そこで、まずは「[源真ゴシック]」を指定して普通に**全角組の**文書を作ってみます。

[源真ゴシック]: http://jikasei.me/font/genshin/

### フォントファイルの導入

「源真ゴシック Regular」のフォントファイル GenShinGothic-Regular.ttf をTeXで使えるように配置します。

  * [(u)pLaTeXのデフォルトの日本語フォントを好きなやつに変える方法]  
    ここの手順②（ファイルの配置）と手順⑤（mktexlsr）を実行します。他の手順はLuaLaTeXの場合には不要です。

※フォントファイルの導入方法はどのフォントでも同じなので、以降では導入の話は省略します。

[(u)pLaTeXのデフォルトの日本語フォントを好きなやつに変える方法]: https://qiita.com/zr_tex8r/items/15ec2848371ec19d45ed

### 普通にLaTeX文書を作る

フォントファイルの準備ができたら、早速「源真ゴシック」を指定したLaTeX文書を作りましょう。

```tex:test-genshin.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% 既定の欧文フォントを"源真ゴシック Regular"にする
\setmainfont{Gen Shin Gothic Regular}
% 既定の和文フォントを"源真ゴシック Regular"にする
\setmainjfont{Gen Shin Gothic Regular}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。

そしたらなんか人がめちゃくちゃいっぱいで座れないんです。
で、よく見たらなんか垂れ幕下がってて、150円引き、とか書いてあるんです。

もうね、アホかと。馬鹿かと。
お前らな、150円引き如きで普段来てない吉野家に来てんじゃねーよ、ボケが。
150円だよ、150円。
なんか親子連れとかもいるし。
一家4人で吉野家か。おめでてーな。
よーしパパ特盛頼んじゃうぞー、とか言ってるの。もう見てらんない。
お前らな、150円やるからその席空けろと。

\end{document}
```

（サンプルの文章は「[吉野家コピペ]」です。）

[吉野家コピペ]: http://dic.nicovideo.jp/a/%E5%90%89%E9%87%8E%E5%AE%B6%E3%82%B3%E3%83%94%E3%83%9A

日本語LuaLaTeX文書において使用するフォントを指定するには**luatexja-fontspecパッケージ**を利用します。このパッケージの使用法の説明はこの記事の目的ではないので省略しますが、取りあえず以下の点だけ知っておいてください[^rmfamily]。

  * `\setmainfont`命令で、その文書の既定の**欧文**フォントを指定する。
  * `\setmainjfont`命令で、その文書の既定の**和文**フォントを指定する。

[^rmfamily]: `\setmainfont`はセリフの総称ファミリ（`\rmfamily`）、`\setmainjfont`は明朝の総称ファミリ（`\mcfamily`）に対応するものであるため、サンセリフ・ゴシック系のフォントを“既定”にする場合は、それを`\setmain(j)font`で指定するのではなく、`\setsans(j)font`で一旦指定してから`\(kanji)familydefault`の再定義をするのが正統な方法かもしれません。しかし本記事では“横着をして”全て`\setmain(j)font`で指定することにします。

このLaTeX文書を`lualatex`コマンドでコンパイルすると、以下のような出力が得られます。

![test-genshin.png](https://qiita-image-store.s3.amazonaws.com/0/14550/0793db19-9bb9-be32-9747-cfb1e9433a1f.png)

これは「いつもの日本語LaTeXを組み方」ですね[^genshin-alpha]。

[^genshin-alpha]: 「源真ゴシック」は和文文字は全角の等幅ですが、欧文文字（英数字など）は全角でも半角でもなくプロポーショナル幅です。先の出力をよく見ると、欧文数字「150」が半角幅でなくプロポーショナルであることが判ります。もちろん、日本語LaTeXではそれが普通です。

## 単純なOpenTypeフォントでプロポーショナル組（源真ゴシックP）

それでは、いよいよプロポーショナル組を始めましょう。まずは、源真ゴシックのプロポーショナル版である「源真ゴシックP」を利用することにします。これは、「既定のグリフがプロポーショナル」である“単純な”OpenTypeフォントです。

「源真ゴシックP Regular」のフォントファイル[^genshinp-file] GenShinGothic-P-Regular.ttf を先ほどと同じ手順で配置します。

[^genshinp-file]: 「源真ゴシックP」のフォントファイルは「源真ゴシック」のアーカイブに一緒に含まれてます。

### うまくいかない例

先ほどの例では`\setmain(j)font`にフォント名を指定するだけで全てうまくいきました。今回も同じようにしてみましょう。

```tex:test-genshinp-1.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% フォントを"源真ゴシックP Regular"に変えた
\setmainfont{Gen Shin Gothic P Regular}
\setmainjfont{Gen Shin Gothic P Regular}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-genshinp-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/1e2462a5-ff0f-8118-056b-108f34f35b34.png)

アレアレ、ひらがなの組み方が何か気持ち悪くなっただけで、全然プロポーショナルっぽくなっていません。よく見ると、先ほどの全角組の例と改行位置が全く同じです。つまり、今回も和文文字は「全角幅で」組まれてしまったようです。

### 和文フォントメトリック（JFM）

先の失敗の原因は、LuaTeX-jaの**和文フォントメトリック（JFM）**にあります。JFMとは簡単にいうと「和文の“組み方”のパラメタのセット」のことです。`\setmainjfont`で和文のフォントを指定する際には付随してJFMが指定されるのですが、そのJFMの既定値（横組は`ujis`、縦組は`ujisv`）は「全角組用」のものになっています。そのため、プロポーショナル幅のグリフの「源真ゴシックP」を指定した時も、それで無理やり全角組をしようとしたために奇妙な組み方になってしまったわけです。

### うまくいく例

幸いなことに、LuaTeX-jaではプロポーショナルのフォントに適した`prop`という名前のJFM（横組用）を提供しているので、これを利用することにしましょう。次のように、和文用の`\setmainjfont`の方のオプションに`JFM=prop`を指定します[^yokofeatuers]。

[^yokofeatuers]: `\setmainjfont`の設定内容（オプションを含む）は通常は横組・縦組の両方のフォントに適用されます。ところが、`prop`は横組用のJFMであり縦組では指定できないため、「横組のときにのみ適用する」ことを表すために、`JFM=prop`を`YokoFeatures={...}`で囲ってしてします。

```tex:test-genshinp-2.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% フォントは"源真ゴシックP Regular"
\setmainfont{Gen Shin Gothic P Regular}
\setmainjfont[
  YokoFeatures={JFM=prop}, %JFMを指定する
]{Gen Shin Gothic P Regular}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-genshinp-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/56675208-6336-7b57-290e-64812ffe6086.png)

**プロポーショナル組になりました！** 案外簡単でしたね。

### チョット調整してみる

先の出力では、「150円」のように欧文と和文が隣接する箇所に入る空き（**和欧文間空白**）の量が0.25zw（四分）となっています。これは全角組をする場合の標準的な値ですが、プロポーショナル組においては大きすぎると感じられるかもしれません。

BXJSクラス（bxjsarticleクラスなど）の場合[^setxkanjiskip]、`\setxkanjiskip`という命令で和欧文間空白の量を設定できます。下記の例では、この値を0.1zw（全角の10％）としています。

[^setxkanjiskip]: `\setxkanjiskip`命令はBXJSクラスに特有のものです。jsclassesバンドルのクラス（jsarticleなど）、およびそのLuaTeX-ja版互換クラス（ltjsarticleなど）では大域的に和欧文間空白の量を設定する方法は用意されていません。

```tex:test-genshinp-3.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% フォントは"源真ゴシックP Regular"
\setmainfont{Gen Shin Gothic P Regular}
\setmainjfont[
  YokoFeatures={JFM=prop}, %JFMを指定する
]{Gen Shin Gothic P Regular}
% 和欧文間空白を調整する
\setxkanjiskip{0.1\zw minus 0.1\zw}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-genshinp-3.png](https://qiita-image-store.s3.amazonaws.com/0/14550/135a0765-951d-ca8e-1efc-428c02720acb.png)

※和文全角幅の単位`zw`はLuaLaTeXでは`\zw`と書く必要があります。

## Proportionalでプロポーショナル組（游明朝）

「源真ゴシックP」は“単純にプロポーショナル幅のグリフをもつ”フォントでしたので、単純に`JFM=prop`を指定するだけでした。しかし、特に高級なフォントの場合は、「一つのフォントで全角幅とプロポーショナル幅の両方のグリフをもち、OpenTypeのレイアウト設定でどちらを使うかを指定する」という仕組になっているものもあります。例として、商用フォントの「游明朝」を使ってプロポーショナル組をしてみます。

### OSバンドルの游明朝を使う方法

Windows（8.1/10）やmacOSにバンドルされた游明朝のフォントをLuaLaTeXで利用する場合の手順です。

  * Windowsの場合は最初から使える状態になっています。

  * macOSでTeX Live系（MacTeXも含む）の場合は以下の手順に従います[^macos-osfontdir]。
     1. Kpathsea変数`OSFONTDIR`が未設定（またはダミー値`/please/set/osfontdir/in/the/environment`）であることを確認します。
        ※既に有意義な値が入っている場合はここで示した手順は使えません。

        ```console
        $ kpsewhich -var-value=OSFONTDIR
        /please/set/osfontdir/in/the/environment
        ```
     2. Kpathsea変数`OSFONTDIR`を設定します。

        ```console
        $ tlmgr conf texmf OSFONTDIR '/System/Library/Assets//'
        ```
     3. LuaTeXのフォントデータベースを更新します。

        ```console
        $ luaotfload-tool -u -f
        ```

[^macos-osfontdir]: もしかしたら、ここで挙げた設定は「(u)pLaTeXでmacOS付属のフォントを使うための設定」と相性が悪いかもしれません。元に戻したい場合は、「`tlmgr conf texmf --delete OSFONTDIR`」「`luaotfload-tool -u -f`」を実行します。

### 普通に游明朝を使う

まずは試しに「Yu Mincho Regular」(Windows)／「YuMincho Medium」(macOS)を普通に指定した文書をコンパイルしてみましょう。

```tex:test-yumincho-1.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
%%------------------------------ Windowsの場合
% フォント名は"Yu Mincho Regular"
\setmainfont{Yu Mincho Regular}
\setmainjfont{Yu Mincho Regular}
%%------------------------------ macOSの場合
% フォント名は"YuMincho Medium"
%\setmainfont{YuMincho Medium}
%\setmainjfont{YuMincho Medium}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-yumincho-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/543be8a1-a494-5512-9df0-2b5aca29e22d.png)

この通り、全角組で普通に（“気持ち悪く”ならずに）組めています。つまり「游明朝」の既定の和文文字は全角幅であることが判ります。

### プロポーショナル幅を指定する

「游明朝」でプロポーショナル幅の和文文字に切り替えるには、`\setmainjfont`のオプションに`CharacterWidth=Proportional`を指定します。それに加えて、以下の指定を行うことにします。

  * 文字の組み方を変更するために、`JFM=prop`。
  * 和文のカーニングを有効にするために、`Kerning=On`。  
    ※`\setmainjfont`では既定で`Kerning=Off`が指定されている。
  * `\setmainjfont`では既定で`Script=CJK`が指定されるが、（少なくとも「游明朝」では）これではカーニングが適用されないので、`Script=Default`を指定する。

```tex:test-yumincho-2.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
%%------------------------------ Windowsの場合
% フォント名は"Yu Mincho Regular"
\setmainfont{Yu Mincho Regular}
\setmainjfont[
  Script=Default,
  YokoFeatures={JFM=prop},
  CharacterWidth=Proportional,
  Kerning=On,
]{Yu Mincho Regular}
%%------------------------------ macOSの場合
% フォント名は"YuMincho Medium"
%\setmainfont{YuMincho Medium}
%\setmainjfont[
%  Script=Default,
%  YokoFeatures={JFM=prop},
%  CharacterWidth=Proportional,
%  Kerning=On,
%]{YuMincho Medium}
%
% 和欧文間空白を調整する
\setxkanjiskip{0.1\zw minus 0.1\zw}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-yumincho-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/2a01e092-d418-a4d2-fa59-2900f0468bff.png)

プロポーショナル組になったようです。ただし、プロポーショナル幅になっているのは仮名文字だけで、句読点は全角幅のままです。（`CharacterWidth=Proportional`指定の場合はこうなるのが普通のようです。）

### なぜカーニングか

先ほどの例では和文のカーニングを有効にしました。これはプロポーショナル組をする場合にはその方が望ましいためです。

![genome.png](https://qiita-image-store.s3.amazonaws.com/0/14550/53cb9630-142e-ff23-93af-981a0efde056.png)

実は、**和文の組版においてカーニングができる**というのはLuaLaTeX＋LuaTeX-jaのもつ大きな特長です。(u)pLaTeXおよびXeLaTeX＋xeCJKによる和文組版の場合、プロポーショナル組はできたとしても、カーニングを活かすことが原理的にできないのです。

## AlternateProportionalでプロポーショナル組（源ノ明朝）

「全角幅とプロポーショナル幅をOpenTypeのレイアウト設定で切り替える」フォントのもう一つの例として、「源ノ明朝（Source Han Serif）」を使ってプロポーショナル組を行ってみます。（結論からいうと、これは現状では**あまりうまくいきません**。）

「源ノ明朝 Regular」（SourceHanSerif-Regular.otf または SourceHanSerif-Regular.ttc）を配置します。

### ProportionalかAlternateProportionalか

OpenTypeフォントでのプロポーショナル組を指定には次の2つの方式があります。

 1. `CharacterWidth=Proportional`： グリフ自体をプロポーショナル幅のものに置き換える方式（`pwid`フィーチャ）
 2. `CharacterWidth=AlternateProportional`： グリフ自体は変えずに“組み方”を変える方式（`palt`フィーチャ）

そしてフォントによってサポートされている方式が異なります。「游明朝」は両方の方式に対応しているのですが、「源ノ明朝」では後者の`AlternateProportional`の方式にしか対応していません。従って、「源ノ明朝」でプロポーショナル組をするのならば、これを利用するしかありません。

```tex:test-genmincho-1.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% フォント名は"Source Han Serif Regular"
\setmainfont{Source Han Serif Regular}
\setmainjfont[
  YokoFeatures={JFM=prop},
  CharacterWidth=AlternateProportional,
]{Source Han Serif Regular}
% 和欧文間空白を調整する
\setxkanjiskip{0.1\zw minus 0.1\zw}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-genmincho-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/37a52a22-070d-08d5-57a4-f273bd41a87d.png)

一見良さそうな出力が得られました。先の「游明朝で`Proportional`指定」の場合とは異なり、今回は句読点も狭い幅になっています。（`AlternateProportional`指定の場合はこうなるのが普通のようです。）

しかしそう思ってよく見ると、出力5行目末尾の「…るし。」の部分が奇妙です。ここは改段落ではなく成り行きの改行なので「。」は本文領域の完全に右端にあるべきところが、二分ほどの空きがあります。もし「。」が全角幅ならそれで辻褄が合ってますが、今回は「。」も狭い幅なので矛盾しています。

「吉野家コピペ」の後半部分を同じ設定で組んでみます。

![test-genmincho-1a.png](https://qiita-image-store.s3.amazonaws.com/0/14550/4acdc4a9-fa0e-c732-6296-eaaff3c2ef98.png)

括弧も狭い幅であるため、4行目頭の「（玉子）」の前に空きがあるのも変です。そしてもっと詳しく見ると、行末がきちんと揃っていないことも判ります。つまり、和文の行分割処理に異常をきたしているのです。

この不具合の原因は「LuaTeX自体の`AlternateProportional`の処理とLuaTeX-jaの和文処理が衝突している」であり、簡単に解決できそうにないことが解っています。現状では`AlternateProportional`を利用して（つまり「源ノ明朝」を利用して）段落をプロポーショナルで組むのは諦めた方がよさそうです。

### それでも使いどころはあるかも

ただしこの不具合は行分割の際に起こるものです。従って、出力が1行しかない場合には全く影響を受けないし、また改行を全て強制改行（`\\`）で行う場合も不具合の影響を受けません。

```tex:test-genmincho-2.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
% フォント名は"Source Han Serif Regular"
\setmainfont{Source Han Serif Regular}
\setmainjfont[
  Script=Default,
  YokoFeatures={JFM=prop},
  CharacterWidth=AlternateProportional,
  Kerning=On,
]{Source Han Serif Regular}
% 和欧文間空白を調整する
\setxkanjiskip{0.1\zw minus 0.1\zw}
\begin{document}
\noindent
そしたらなんか人がめちゃくちゃいっぱいで座れないんです。\\
で、よく見たらなんか垂れ幕下がってて、\\
「150円引き」\\
とか書いてあるんです。
\end{document}
```

![test-genmincho-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/7f834920-bd09-783c-b2c7-9109281f6bbf.png)

従って、「本文組は普通に全角組とするが、見出しはプロポーショナル組にする」という場合に限って、見出しテキストの改行を全て強制改行で行うことにすれば、不具合の影響を受けずに`AlternateProportional`のプロポーショナル組を実用できるかもしれません。

## JFMをカスタマイズする

結局、本文組をプロポーショナルにする場合には、現状では`Proportional`を使う選択肢しかないわけですが、句読点が全角幅になるのは少しバランスが悪い気がします。もう少し句読点の右側の空きを小さくできないでしょうか。

このように「空きを自分好みに調整したい」と思うのであれば、もう「自分用のJFMをカスタマイズして作る」しかないでしょう。以下では、LuaTeX-ja標準の`prop`をチョットだけ改造して自作のJFM`myprop`を作ってみます。

LuaTeX-jaではJFMはLuaのソースコード（一種のDSL）として表現され、そのファイル名を`jfm-<名前>.lua`とする規則になっています。`prop`を表すJFMのファイルjfm-prop.luaは次のような非常に簡単なものです。

```lua:jfm-prop.lua
luatexja.jfont.define_jfm {
   dir = 'yoko',
   zw = 1.0, zh = 1.0,

   [0] = {
      align = 'left', left = 0.0, down = 0.0,
      width = 'prop', height = 0.88, depth = 0.12, italic=0.0,
   }
}
```

これを修正して、次のようなファイルjfm-myprop.luaを作ります。これが`myprop`の定義となります。

```lua:jfm-myprop.lua
luatexja.jfont.define_jfm {
   dir = 'yoko',
   zw = 1.0, zh = 1.0,
   [0] = { -- 他の全ての文字は元来の字幅を保持
      align = 'left', left = 0.0, down = 0.0,
      width = 'prop', height = 0.88, depth = 0.12, italic = 0.0,
   },
   [1] = { -- <（>は左の空きを削って半角幅
      chars = {'（'},
      -- 0.5zwの幅に右揃えでグリフを配置
      align = 'right', left = 0.0, down = 0.0,
      width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
   },
   [2] = { -- <）>は右の空きを削って半角幅
      chars = {'）'},
      -- 0.5zwの幅に左揃えでグリフを配置
      align = 'left', left = 0.0, down = 0.0,
      width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
   },
   [3] = { -- <、>も半角幅だが右側に若干伸縮空きを入れる
      chars = {'、'},
      align = 'left', left = 0.0, down = 0.0,
      width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
      glue = {
         [0] = { 0.2, 0.0, 0.2 }, -- 直後が"その他"か<（>の場合
         [1] = { 0.2, 0.0, 0.2 }, -- 0.2zw plus 0.0zw minus 0.2zw
      }                           -- を挿入する
   },
   [4] = { -- <。>も半角幅だが右側に若干伸縮空きを入れる
      chars = {'。'},
      align = 'left', left = 0.0, down = 0.0,
      width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
      glue = {
         [0] = { 0.2, 0.1, 0.0 },
         [1] = { 0.2, 0.1, 0.0 },
      }
   },
}
```

それでは早速今作ったJFM`myprop`を適用して游明朝で組んでみましょう。

```tex:test-yumincho-3.tex
% LuaLaTeX文書; UTF-8
\documentclass[lualatex,a5paper,ja=standard]{bxjsarticle}
\usepackage{luatexja-fontspec}
%%------------------------------ Windowsの場合
\setmainfont{Yu Mincho Regular}
\setmainjfont[
  Script=Default,
  YokoFeatures={JFM=myprop}, % カスタムのJFMを指定する
  CharacterWidth=Proportional,
  Kerning=On,
]{Yu Mincho Regular}
%%------------------------------ macOSの場合
%...(省略)
% 和欧文間空白を調整する
\setxkanjiskip{0.1\zw minus 0.1\zw}
\begin{document}

昨日、近所の吉野家行ったんです。吉野家。
%……以下省略
```

![test-yumincho-3a.png](https://qiita-image-store.s3.amazonaws.com/0/14550/42d28999-4975-e12f-38c6-00dba06bc71c.png)

自分好みになってますね！

## LuaLaTeXのフォント指定は自由自在

LuaLaTeXを使うと和文のプロポーショナル組が容易に実現できることを見てきました。LuaLaTeXのフォントの扱いはかなり自由度が高いため、従来のLaTeXでは面倒な準備作業が必要だった複雑なフォント設定が、“文書中の設定”として簡単に実現できます。いくつかの実用例を挙げておきます。

* [LuaLaTeXだとかな混植が簡単にできて最高だという件](https://twitter.com/zr_tex8r/status/853502029305532416)<br>「仮名文字はIPAex明朝、（☃は源ノ角ゴシック、）それ以外はIPAexゴシック」という合成フォントを定義しています。
* [LuaLaTeXで花園明朝（AFDKO版）して遊んでみるテスト](https://twitter.com/zr_tex8r/status/878555490619240448)<br>「[花園明朝（AFDKO版）]のA（BMP用）とB（非BMP用）を1つにまとめ、さらにIPAex明朝にある文字はそちらを優先して使う」という合成フォントを定義しています。
* [LuaLaTeXで源ノアレを4ウェイト使ってみるテスト](https://twitter.com/zr_tex8r/status/878581202273222656)<br>源ノ明朝・源ノ角ゴシックの4種のウェイト（Light／Regular／Bold／Heavy）をそのままLaTeXの4種のシリーズ（l／m／b／eb）に割り当てて使っています。さらに源ノゴシックのイタリックをSource Pro Sansで代用しています。

[花園明朝（AFDKO版）]: https://github.com/kawabata/glyphwiki-afdko/releases/tag/170620

## まとめ

**スゴイLuaLaTeXでスゴイ日本語文書をつくろう！**