LuaLaTeXで和字コマンドを操ろう（newunicodecharパッケージ）

　これは[TeX ＆ LaTeX Advent Calendar 2018](https://adventar.org/calendars/3382)の20日目の記事です。19日は[doraTeX](http://doratex.hatenablog.jp/entry/20181219/1545203395)さん、21日はtasusuさんです。

------

　こんにちは、あるいは初めまして。文系初心者でもLaTeXで美しい縦書き文書を、ということに血道を上げている者です。

　昨年のアドベントカレンダーで筆者は[TeXでつくる可能な限りWYSIWYGな文書](https://qiita.com/isari/items/26f94a9ec89803b992a6)という記事を書きました。マークアップ言語であるはずのLaTeXでWYSIWYGとは何ぞやという感じですが、これは要は「文中における`\`は少なければ少ないほどいい」という方針のことでして、できるだけコマンドを書かずに、すっきりしたマークアップで原稿を書けたら嬉しいよね、というものでした。主に日本語の散文を書いているため、文章の途中に半角のコマンドが出てくると煩わしいのです。

　その中で使ったのが**[newunicodechar](https://ctan.org/tex-archive/macros/latex/contrib/newunicodechar)**パッケージでした。これは`\newunicodechar{<文字>}{<展開する中身>}`のように記述することで、Unicodeの任意の1文字をあたかも`\newcommand{\<名前>}{<中身>}`の形で設定するLaTeXマクロであるかのように扱えるという便利なパッケージです。が、(u)pLaTeXで使う時には欠点がありました。**和文文字は命令化できない**のです。
　デフォルトで欧文扱いになっている普通のアルファベットや半角記号群は文中で使うためコマンド化するわけにはいきません。そのため筆者はコマンド化するための文字を求めて、[pxcjkcat](https://ctan.org/tex-archive/macros/latex/contrib/pxcjkcat)パッケージを使ってマイナーな記号のブロックを欧文扱いにしたりするなど、苦肉の策でお茶を濁していました。

　しかし、今年の重点テーマであるLuaLaTeXならそんな心配は無用です。欧文文字も和文文字も自由に命令化できます。というわけで、LuaLaTeX+newunicodecharパッケージでどんなことができるかを紹介したいと思います。

## 前提
- 初心者による誰向けかよく分からない記事。
- 縦書き、[jlreq](https://github.com/abenori/jlreq)クラスを使用。（今回の場合横書きにしても差異はありません）
- 使用パッケージは全て現時点のTeX Liveに標準で含まれています。
- よって初期条件は以下。

```TeX
%luaLaTeX文書
\documentclass[tate]{jlreq}
\usepackage{newunicodechar}
\begin{document}
\end{document}
```

## 倍角ダッシュ
　小説書きにとって悩ましいのがフォントによるダッシュの差異です。ダッシュ（――）は普通、`―`（Unicodeの2015、HORIZONTAL BAR）を二つ並べて使います。ところがフォントによっては二つ並べた間に隙間ができてしまいます。TeX Liveの標準であるIPA(ex)明朝や、MacのOS標準のヒラギノなどでもそうです。

![2018-12-17_14h31_54.png](https://qiita-image-store.s3.amazonaws.com/0/192482/d5988597-878f-ef02-4245-f3c433b7cc32.png)

　これを解決するためには、伝統的には

```TeX
\def\――{―\kern-.5\zw―\kern-.5\zw―}
```


として、文中で`\――`と打てばいいのでした。

　しかし筆者はこれ以上`\`を書きたくありません。そこで`―`をコマンドにしてみます。

```TeX
\makeatletter
\chardef\my@J@horizbar="2015% Unicodeの2015
\newunicodechar{―}{\x@my@dash}
\def\x@my@dash{\@ifnextchar―{%
  \my@J@horizbar\kern-.5\zw\my@J@horizbar\kern-.5\zw}{%
    \my@J@horizbar}}
% 次が―なら2回目のkernまでを、そうでないなら普通の―を出力
\makeatother
\begin{document}
――と言った。
\end{document}
```

![2018-12-17_14h41_48.png](https://qiita-image-store.s3.amazonaws.com/0/192482/62546806-351e-e173-829f-676485212f53.png)
　これで、`\`なしでもダッシュが繋がりました。

## 青空文庫風ルビ
　日本の小説をマークアップする記法は各投稿サイトごとに違ったものを採用していたりして、魑魅魍魎の様相を呈しています。
　しかしその中でも比較的共通して使えるものがあります。青空文庫で定められている、全角縦棒と二重山括弧を使った`｜振り仮名《ルビ》`というルビの振り方です。これをLuaLaTeXで実現してみましょう。
　ルビ機能そのものは[pxrubrica](https://qiita.com/zr_tex8r/items/42466cbcbeb670a3a2dc)パッケージに頼ります。

```TeX
\usepackage{pxrubrica}
\rubysetup{J}% お好みで
\makeatletter
\chardef\my@J@vertline="FF5C% 縦棒はUnicodeのFF5C
\newunicodechar{｜}{\x@my@ruby}
\def\x@my@ruby#1《#2》{\@ifnextchar[{\x@my@ruby@a#1《#2》}{\ruby{#1}{#2}}}
\def\x@my@ruby@a#1《#2》[#3]{\ruby[#3]{#1}{#2}}
\def\｜{\my@J@vertline}
\makeatother
\begin{document}
｜振り仮名《ルビ》

｜郭公《かっこう》[Jf]% pxruburicaのオプションも使えます

\｜：ルビの付く文字列の始まりを特定する記号 % エスケープすれば縦棒も普通に使えます
\end{document}
```

![2018-12-17_14h59_44.png](https://qiita-image-store.s3.amazonaws.com/0/192482/f0198e9b-ee32-aff6-0943-65399f986c10.png)
（「親文字が漢字のみの場合は縦棒を省くことができる」というルールについては、この記事の趣旨から外れるため、そして筆者の技術力不足のため考慮しませんでした）

## コマンドを省略
　`\`を書きたくないあまり筆者は去年、文中に出てくるさまざまなコマンドを無理矢理一つの記号に置き換えるという変なことをしていました。
　変（他者への可読性を低める）には変わりませんが、LuaLaTeXを使えばもうちょっと自然にそれを実現できます。
　例として、去年と同じ箇条書きの短縮を上げます。

```TeX
\usepackage{ltxcmds}% ifnextcharでスペースを使うために必要
\makeatletter
\chardef\my@J@middledot="30FB% 中黒はUnicodeの30FB
\newunicodechar{・}{\ltx@ifnextchar@nospace{ }{\item}{\my@J@middledot}}
% 中黒＋半角スペースに\itemを振っている
\makeatother
\begin{document}
持ち物
\begin{itemize}
・ お弁当
・ おやつ
・ バナナ（フィリピン・ミンダナオ島産）
\end{itemize}
\end{document}
```

![2018-12-17_15h30_47.png](https://qiita-image-store.s3.amazonaws.com/0/192482/db1418e8-0283-5ed1-5f81-b1f65a688d77.png)
　もっと半角コマンドが嫌いなら、こんなこともできます。

```TeX
\makeatletter
\chardef\my@J@numeric="6570% 「数」はUnicodeの6570
\newunicodechar{数}{\x@my@numeric}
\def\x@my@numeric{\@ifnextchar 始{%
  \begin{enumerate}\除}{\@ifnextchar 終{%
    \end{enumerate}\除}{\my@J@numeric}}}
\def\除#1{}% 「始」と「終」を除くため
\makeatother
\begin{document}
数始
・ 須ク自重スベシ
・ 唯本分ニ向カッテ猛進セヨ
・ 師ヲ敬シ友ヲ愛セ
・ 「数」モ普通ニ書ケルヨ
数終
\end{document}
```

![2018-12-17_17h31_39.png](https://qiita-image-store.s3.amazonaws.com/0/192482/b777d39b-5191-73cc-c2e5-ee3ab40ee91e.png)
　辞書にない熟語を作れば（本文中に出てくる時と区別するため）、どんな漢字でもコマンドにできます！

　いかがでしたでしょうか？皆さんも是非、newunicodecharの便利な使い方を見つけてみてください。素敵なノー半角ライフを！

## 参考
- [LaTeX： 和文を欧文扱いして和文扱いする件](https://gist.github.com/zr-tex8r/e945f3a7d3c7b775cbc3edc96d63ea8b)（exclusively thanks）
- [単独の Unicode 文字を命令として扱う（newunicodechar パッケージ） - マクロツイーター](http://d.hatena.ne.jp/zrbabbler/20171126/1511670739)
- [［改訂第6版］LaTeX2ε美文書作成入門](https://books.google.co.jp/books?isbn=4774161071)