日本語 LaTeX の新常識 2021

オリジナルの TeX が誕生してから40年以上の歳月が流れ，そして日本語 LaTeX が現在主流の姿 (pLaTeX2e) になってからも25年以上が経過しました．この間 LaTeX は多くの人に使われ続けて来ましたが，その歴史の中でさまざまな変遷を辿り，明示的なドキュメントにはなっていないながらも，ユーザ間ではある意味「常識」として定着した知識が積み重なってきました．

歴史が長く，よくも悪くも「安定している」と評されるために見過ごされているかもしれませんが，日本語 LaTeX は今も開発が続く「生きた」ソフトウェアです．そのため歴史の中で培われた常識的な知識が古くなり，新しい知識が必要になる場合があります．そしてその傾向は特にこの数年顕著で，TeX コミュニティに属する人々が多く集まる TeXConf などの会議で，主に中上級者向けに新しい知識が啓蒙されてきました．本稿では，そのような日本語 LaTeX についての比較的新しい知識のうち，特に広く一般の LaTeX ユーザも知っておくべきと思われるものを「新常識」に選定し，なるべくわかりやすく紹介することを目指します．

本稿の主な想定読者は広くライトな日本語 LaTeX ユーザです．日本語 LaTeX として pLaTeX または upLaTeX を使用していて，これらのエンジンについて，旧来からの知識についてはある程度把握している方々を対象とします．したがって注記のない場合（記事の中盤で別の新しいエンジンを紹介するまでは）「日本語 LaTeX」はこの2つのエンジンのことを指すものとします．

# 新常識 (1) plautopatch は必ず読み込もう

(u)pLaTeX は日本語で文書作成を行う日本語話者にとっては極めて一般的ですが，日本語とは無縁の海外 TeX ユーザ・開発者からするとちょっと変わった存在です．そのため，海外で開発された汎用の LaTeX パッケージの中には (u)pLaTeX ではうまく動作しない（期待する出力にならなかったり，エラーが出たりする）ことがあります．例えば，hyperref を pxjahyper パッケージなしで使用すると PDF の「しおり」が文字化けするなどの問題は有名です．

こうした「非互換」な海外製パッケージを pLaTeX 互換にするための追加パッケージ（以降「パッチ」と呼びます）は主に plﾅﾝﾁｬﾗ や pxｶﾝﾁｬﾗ という名前で開発されてきましたが，今ではそうしたパッチは数十を超えています．このような状況で「パッケージ X を使う場合はパッチ Y を併用する」というパターンを全部暗記して，その度 `\usepackage` をするのはもはや困難です．

この状況への救世主として [plautopatch パッケージ](https://www.ctan.org/pkg/plautopatch)というものが開発されています．このパッケージを読み込んでおくと，(u)pLaTeX に非互換なパッケージが使われた場合には自動で検知して適切なパッチを読み込んでくれます．

注意点として，このパッケージは使い方が少し特殊です．非互換なパッケージは使用する文書クラスや他のパッケージの内部で読み込まれる場合があるので，**文書ソースの本当に最初の1行（`\documentclass` よりも前）**で `\RequirePackage{plautopatch}` によって読み込むことが推奨されています．

1つ目の新常識は**「(u)pLaTeX を使用する場合は，必ず冒頭で `\RequirePackage{plautopatch}` を宣言する」**です．これはもう (u)pLaTeX を使用する場合は思考停止でやりましょう．

# 新常識 (2) 「DVI ドライバ」はクラスオプションで明示しよう

LaTeX を使って日本語文書を作成する場合，そのプロセスで使用するプログラムにはいくつか選択肢があります．例を挙げると

* LaTeX エンジン：pLaTeX, upLaTeX
* DVI ドライバ：DVIPDFMx, dvips

などに選択の余地があります．従来から，特に `dvipdfmx` や `dvips` などの「DVI ドライバ」は `xcolor` や `graphicx` など特定のパッケージを使用する場合には，パッケージオプションとして指定しておかないと期待する出力にならないことはよく知られていました．これは**旧常識**です．

最近では LaTeX 本体自体も DVI ドライバの明示を必要とするようになりました．LaTeX 本体に DVI ドライバの情報を伝えるには `\documentclass` のオプションで与える「クラスオプション」で DVI ドライバを明示することになります．

都合のいいことにクラスオプションはグローバルオプションとも呼ばれ，その指定は必要に応じて他のパッケージにも伝達されます．したがってクラスオプションで DVI ドライバさえ指定しておけば `xcolor` や `graphicx` などを `\usepackage` する際にいちいち同じ指定を繰り返す必要はないことになります．

また，一部の日本語用の文書クラス（具体的には jsclasses や bxjscls など）は使用するエンジンについても明示することを要求もしくは推奨しています．そのような場合は，LaTeX エンジンも DVI ドライバと合わせて明示的に指定するものとして習慣化しておくといいと思います．

2つ目の新常識は**「使用する『DVI ドライバ』は必ずクラスオプションで明示する」**です．新常識 (1) と合わせると，例えばエンジンに upLaTeX，DVI ドライバに DVIPDFMx，文書クラスに jsarticle を採用した典型的な upLaTeX 文書の冒頭は次のようになるでしょう：

```tex
\RequirePackage{plautopatch}
\documentclass[uplatex,dvipdfmx]{jsarticle}
```

# 新常識 (3) 文書クラスには選択肢がある

LaTeX2e の世界において，文書の基本的なデザインを決めているのは「文書クラス」です．ご存知の通り `\documentclass` で指定するやつですね．

そして日本語文書用の文書クラスといえば，旧来は実質的に jsclasses と呼ばれる一揃い文書クラス（すなわち jsarticle, jsreport[^jsreport], jsbook）が標準的な選択肢で，もちろん特定の論文誌や学会で専用のものが用意されている場合は別ですが，そうではない「汎用」のものとなると，他にはかなり限られた選択肢しかありませんでした．

[^jsreport]: jsreport クラスが追加されたのは比較的最近（2017年）です（[参考](https://qiita.com/zr_tex8r/items/cfd853ed901f0db8011b)）．

pLaTeX にはいわゆる jclasses (jarticle, jreport, jbook, etc.) が付属していますが，これらはさまざまな点において標準的な日本語組版の満たすべき条件に合致しておらず，少なくとも**そのままの形では使用してはならない**というのが TeX 界隈では事実上のコンセンサスになっています（「知らなかった！」という方も今後は絶対に使わないようにしましょう）[^pro]．そして，さらに縦書きの場合はもっと選択肢が少なかったのではないでしょうか．

[^pro]: (La)TeX と組版の専門知識がある人が改造して使用する場合は別です．そういう人はそもそも本稿の対象読者ではないですが．

今では日本語文書作成に汎用的に使える新しい文書クラスの選択肢ができました．[jlreq クラス](https://www.ctan.org/pkg/jlreq)です．この文書クラスは，その名の通りW3C の策定する「[日本語組版の要件 (JLREQ)](https://www.w3.org/TR/jlreq/)」に準拠した文書作成を目指すもので，もちろんそのことも重要なのですが，jsclasses と比べても後発ということもあって「カスタマイズ性に優れているという」点を見逃せません．jsclasses においては他のパッケージを用いたり，ダーティハック（インターネット上に転がっている `\makeatletter` を含む謎のコードをコピペするなど）を活用したりしないと実現できなかったようなことが，クラスオプションや `\jlreqsetup` コマンドを利用して簡単に設定できるようになっています[^western]．さらに縦書きにもしっかり対応しています．

[^western]: ちなみに欧文組版用の文書クラスでも article 等の LaTeX2e 標準の文書クラスよりも後発かつ高機能な文書クラスがいくつかあります．有名なのは [KOMA-Script バンドル](https://www.ctan.org/pkg/koma-script)と [memoir クラス](https://www.ctan.org/pkg/memoir)です．

少し高級な話になりますが，さらに jlreq クラスは新しく見出しコマンドを作るための機能なども備えています．つまり，jlreq クラスには「文書クラスを作るためのメタな文書クラス」という一面もあり，これから jlreq をベースにした別の文書クラスがどんどん出てくる可能性もありそうです[^nlproceedings]．

[^nlproceedings]: 手前味噌ですが，実際に筆者が言語処理学会年次大会の予稿集向けに開発した [nlproceedings クラス](https://github.com/wtsnjp/nlproceedings)は jlreq クラスをベースにしています．ちなみに残念ながらこのクラスは jlreq をベースにしているものの，それ自体は完全には JLREQ 準拠ではありません．

3つ目の新常識は**「日本語が使える文書クラスにも，選択の余地がある」**です．汎用目的かつ実用に耐え得る文書クラスが複数あるので，紙面デザインを変えたいときや実現したいカスタマイズが旧来の文書クラスでは難しい場合には，jlreq など新しい文書クラスの採用も検討してみるのがいいでしょう．

# 新常識 (4) 日本語 LaTeX は (u)pLaTeX だけじゃない

日本語組版に必要な要件は，欧州の諸言語のそれとは大きく異なるため，LaTeX エンジンと呼ばれるものの中でも日本語ができるように拡張されたものの種類は限られていました．かつては NTT jLaTeX というものもありましたが，もう長いこと日本語ができる LaTeX エンジンの主流は pLaTeX と upLaTeX の2種類という状況が続いています．これが旧常識です．

最近は，ここにも新しい選択肢が加わってきました．LuaLaTeX です．このエンジンは海外で開発されているものですが，[LuaTeX-ja パッケージ](https://www.ctan.org/pkg/luatexja)を使用することにより高品質の日本語組版が実現できるようになっています．pLaTeX と upLaTeX 以外にも選択肢が広がりました．2021年1月現在，**まともな**日本語組版が可能とされる LaTeX エンジンは以下の3種類です．

* pLaTeX: 日本語用に拡張された LaTeX エンジン．昔ながら．
* upLaTeX: Unicode な pLaTeX の拡張．近年の主流？
* LuaLaTeX: 高機能ですごい LaTeX エンジン．ただし (u)pLaTeX よりは処理が遅い．

先に紹介した jlreq クラスは上記3エンジンをすべてサポートしています．jsclasses はこのうち pLaTeX と upLaTeX をサポートしています．ltjsclasses は jsclasses 志向の LuaLaTeX 専用クラスです．

一方で，海外では広く使われているものの，現時点では依然としてまともに日本語**できない**とされている LaTeX エンジンもあります．

* pdfLaTeX: 日本語は全然できない．将来もまともな日本語組版は実現しない可能性が高い．
* XeLaTeX: 完璧ではないが，ある程度までは日本語組版ができる[^zxjatype]．将来まともな日本語組版が実現する可能性もある？[^xelatexja]

[^zxjatype]: ZXjatype というパッケージを利用すると，そこそこの日本語文書を作成することができます．特に日本語組版に詳しい訳ではない人が一見したぐらいではフツーの日本語文書に見える程度の出来栄えに仕上がるのですが，一部の禁則処理（小書き仮名の行頭禁則）が副作用なしには実現できなかったり，一部の記号が規定では期待通りに出力されなかったりといった問題が未解決のまま残っています（[参考](https://zrbabbler.hatenablog.com/entry/2020/02/09/223244)）．

[^xelatexja]: これは本当に最新の動向なので，まだまだどうなるかはわかりませんが，極めて最近になって [XeLaTeX-ja パッケージ](https://github.com/h20y6m/xelatexja)の開発がスタートしています．もしかすると，将来的には「XeLaTeX でまともな日本語組版」が実現するかもしれません．

bxjscls を使用するとこれらのエンジンでも「日本語の文書（っぽいもの？）」を作ることはできますが，よほどの理由がない限りは，日本語文書の作成にはこれらのエンジンは使わないようにしましょう．

4つ目の新常識は**「日本語 LaTeX は (u)pLaTeX だけじゃない．LuaLaTeX もある」**です．将来的には，LaTeX エンジンについてもさらに選択肢が増えるかもしれません．

# 新常識 (5) 日本語フォントの設定を簡単にする手段もある

LaTeX 周りには色々な鬼門がありますが，一般のユーザにも特に関係の深い鬼門は「フォント設定」です．歴史的に「TeX のフォント設定は難しい」とされており，残念ながらこの点に関しては今日に至っても全面的には解決されていません．しかし，近年では**特定の条件を満たしている場合に限って**は「簡単にフォント設定を行える」場合があります．難しいフォント設定を回避する手段が出てきたということです．

条件の1つは LuaLaTeX を使うことです．前節で LuaLaTeX を日本語組版に利用できる「高機能ですごい」エンジンであると紹介しましたが，そのすごさの中でも特に一般の LaTeX ユーザへのインパクトが大きいのは「フォント設定が容易である」ことに他なりません．歴史的なエンジン[^historic]では著しく煩雑だったフォント設定も，LuaLaTeX では LaTeX 文書内ですべてシンプルに解決することができます．

[^historic]: 具体的には，本稿で登場する中では pLaTeX, upLaTeX, pdfLaTeX は原則としてフォント設定が大変です．LuaLaTeX に加えて XeLaTeX でも fontspec パッケージを使用することができますが，現状 XeLaTeX では日本語文書をまともに扱えないので，本稿ではこれ以上言及しません．

具体的には，LuaLaTeX でのフォント指定は fontspec（欧文フォント）と luatexja-fontspec（日本語フォントに対応した fontspec 拡張）を用いて行います．本稿ではそれ以上の詳細には踏み込みませんが，LuaTeX-ja の公式 Wiki に[解説](https://ja.osdn.net/projects/luatex-ja/wiki/LuaTeX-ja%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9#h3-.E3.83.95.E3.82.A9.E3.83.B3.E3.83.88.E3.81.AE.E6.8C.87.E5.AE.9A)があるので，それを読むだけでも入門できるでしょう．

上記の方法を用いることができる LuaLaTeX であれば，OS にインストールされているほとんどのフォントを容易に LaTeX で作成する PDF に埋め込むことができます．幸運にもエンジンを自由に選択できる状況で，かつさまざまなフォントを使ってみたいという場合には，まず LuaLaTeX の採用を検討すべきです．

しかし，残念ながらいつでも LuaLaTeX を採用できるというわけではありません．例えば指定の学位論文テンプレートや学会クラスが LuaLaTeX に非対応ということはありますし，その他さまざまな事情で LuaLaTeX がいつも最良の選択肢というわけにもいきません．そのような場合は pLaTeX や upLaTeX を使わざるを得ないわけですが，それでも有名な「よくあるフォント設定を使いたい」という場合には比較的簡単にフォント設定を行う手段があります．それは[日本語フォント設定ツール kanji-config-updmap](https://www.ctan.org/pkg/ptex-fontmaps) を使うことです．このツールを用いると，例えば以下に挙げるような「一般的なフォント設定」であれば，自動的に設定を適用することができます：

* ipaex: IPAex フォント[^ipaex]
* haranoaji: 原ノ味フォント[^haranoaji]
* hiragino: ヒラギノフォント[^hiragino-macos]
* kozuka-pr6n: 小塚フォント（Pr6N 版）

[^ipaex]: TeX Live 2016-2019 では IPAex フォントの埋め込みがデフォルト設定でした（[参考](https://acetaminophen.hatenablog.com/entry/texlive2016-changes)）．

[^haranoaji]: TeX Live 2020 以降は原ノ味フォントの埋め込みがデフォルト設定となっています（[参考](https://github.com/texjporg/ptex-fontmaps/issues/27)）．

[^hiragino-macos]: ただし macOS 搭載のヒラギノフォントを使用するには[別の特殊手順](https://texwiki.texjp.org/?%E3%83%92%E3%83%A9%E3%82%AE%E3%83%8E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88#macos-hiragino-setup)が必要です．

kanji-config-updmap には長いこと公式のドキュメントがなかったのですが，最近になって[公式マニュアル](http://mirrors.ctan.org/fonts/ptex-fontmaps/kanji-config-updmap.pdf)が追加されました．使用したい場合はまずこの資料に目を通すのが良いでしょう．

また DVI ドライバに DVIPDFMx を採用した場合限定ですが，[pxchfon パッケージ](https://ctan.org/pkg/pxchfon) を使用すると，(u)pLaTeX でも文書ソース内でフォント設定を完結することが可能です．この場合もやはり「よくあるフォント設定」であればプリセットが用意されているので手軽に使用することができます．今では [pxchfon 作者による解説記事 (Qiita)](https://qiita.com/zr_tex8r/items/a13c195d42b7fca69378) があるので，使ってみたい方は確認するとよいでしょう．

5つ目の新常識は**「日本語フォントの設定も LuaLaTeX であれば簡単．pLaTeX や upLaTeX でも，有名なフォント設定であれば kanji-config-updmap や pxchfon を用いて手軽にできる」**です．

# 新常識 (6) 日本語 LaTeX の「常識」は変わりゆく

ここまで紹介してきた常識はいずれも，ある意味では「旧常識」を覆すものであったはずです．このように「常識」は上書きされる場合のあるものです．こうした変化は本稿で今は「新常識」として紹介しているものに対しても訪れる可能性があります．

TeX/LaTeX は歴史が長く，よい意味でも悪い意味でも「枯れた技術」という印象を少なからずお持ちの方が多いと思います．その印象自体は必ずしも間違っていないのですが，しかし殊に近年は（日本語 LaTeX ではなく）LaTeX 本家の更新が活発に行われているということは特筆するに値します．LaTeX 本家の更新情報は [ltnews](https://ctan.org/pkg/ltnews) と呼ばれるドキュメントに要約されるのですが，その分量は1996年以降ほぼ安定的に「半年分で PDF 1ページ．多くても2ページ程度」の状況が続いていました．ところが，その ltnews に記載されるような更新情報の量がここにきて急速に増加しています．せっかくなので具体的に示すと次のようになります．

* 1996年〜2017年：各年1-2ページ程度
* 2018年：7ページ
* 2019年：4ページ
* 2020年：12ページ！

もちろん日本語 LaTeX もこうした LaTeX 本家の活発な活動の影響を受けています．というよりも，人数の少ない日本語 TeX の開発陣で必死の追随対応を行っています．

そうした事情もあるので，今後しばらくは日本語 LaTeX にも非互換な変更がいくつか入る可能性があります．一般の LaTeX ユーザにも影響が大きいような変化に対しては，開発チームの方々や，私を含む「その周辺」も周知の努力を行うことになると思いますが，各ユーザにおかれても LaTeX の「常識」は刻々と変化し得るものなのだということを，頭の片隅に入れておいてもらえるといいかと思います．

6つ目の新常識は**「日本語 LaTeX の常識はこれからも変化し得る」**です．毎日 LaTeX の最新情報を仕入れましょうとは言いませんが，1年から数年に一度，TeX Live のアップデートのついでにでも，ぜひ「日本語 LaTeX の常識のアップデート」も心がけてみてください．

## 開発バージョンのテストにご協力を

最近 LaTeX の開発が活発であるという話をしたついでに，意欲的な LaTeX ユーザの皆さんに「開発バージョンのテスト」へのご協力をお願いしたいと思います．日本語 LaTeX はかなり多くのユーザに実用的に用いられている現状を踏まえ，新機能や非互換な変更の含まれる新バージョンは，いきなり実用の LaTeX に導入される前にテスト段階を経るようになっています．締切に追われているような場合にまで無理にとは言いませんが，余裕のある場合や新機能を試してみたい場合にはこうしたテストへのご参加を検討していただけると幸いです．

開発バージョンのテスト方法はとても簡単です．安定版を利用する場合との違いは2つです．1つは普通の `ﾅﾝﾁｬﾗlatex` 等のコマンドの代わりに `ﾅﾝﾁｬﾗlatex-dev` コマンドを使用することです．具体的な読み替えを以下に示します．

* `platex` → `platex-dev`
* `uplatex` → `uplatex-dev`
* `lualatex` → `lualatex-dev`

普段使いの LaTeX コマンドの代わりにこれらを使用することで，各種最新の LaTeX を試すことができます．

さらに (u)pLaTeX の場合は `\documentclass` の前に（新常識 (1) の `\RequirePackage{plautopatch}` に加えて）`\RequirePackage{exppl2e}` とすることで (u)pLaTeX の実験的な新機能が有効になります．ぜひお試しください．

### 不具合を見つけたら

こうしたテストを行っていて不具合や期待と異なる動作を見つけた場合は，以下に挙げる開発リポジトリもしくはメーリングリストまで報告をお願いいたします．

* pLaTeX リポジトリ：<https://github.com/texjporg/platex/issues>
* upLaTeX リポジトリ：<https://github.com/texjporg/uplatex/issues>
* LuaTeX-ja リポジトリ：<https://ja.osdn.net/projects/luatex-ja/ticket/>
* メーリングリスト（共通）：<https://ml.texjp.org/mailman/listinfo/issue>

# 参考文献（資料）

* 『知ってるようで知らないTeXの世界 自分の人生より歴史あるソフトウェア開発をマネジメントする技術』．[ウェブページ（エンジニア Hub）](https://eh-career.com/engineerhub/entry/2019/07/04/103000).
* LuaTeX-ja プロジェクトチーム『LuaTeX-ja プロジェクト wiki』. [ウェブページ (OSDN)](https://ja.osdn.net/projects/luatex-ja/wiki/FrontPage).
* Noriyuki Abe『jlreq』. [リポジトリ (GitHub)](https://github.com/abenori/jlreq/).
* zr\_tex8r『LaTeX の「アレなデフォルト」 傾向と対策』. [ウェブページ (Qiita)](https://qiita.com/zr_tex8r/items/297154ca924749e62471)
* zr\_tex8r『徹底攻略！ pxchfonを使いこなそう』. [ウェブページ (Qiita)](https://qiita.com/zr_tex8r/items/a13c195d42b7fca69378)
* 日本語 TeX 開発コミュニティ『kanji-config-updmap — 日本語フォント設定ツール』. [マニュアル (PDF)](http://mirror.ctan.org/fonts/ptex-fontmaps/kanji-config-updmap.pdf).
* 八登崇之『「日本語LaTeX」が多すぎる件について』(Online.tex 2020). [発表資料 (Slideshare)](https://www.slideshare.net/zr-tex8r/latex-239371115).
* 山下弘展『最近の LaTeX は○○』(Online.tex 2020). [発表資料 (PDF)](https://aminophen.github.io/slide/hytexonline20.pdf).
* 山下弘展『日本語の LaTeX で幸せになる，かもしれない方法』(TeXConf 2018). [発表資料 (PDF)](https://aminophen.github.io/slide/hytexconf18.pdf).