p/upLaTeX から LuaLaTeX へ移行すべき理由と方法

目次

今 pLaTeX または upLaTeX を使っているかたがたへ向けて、LuaLaTeX に移行することを勧める理由と、移行のうえで原稿について気をつけなければならないことを述べる。理由は「背景」に、手続きは「解決」にまとめた。

同じように、これから LaTeX を使おうと考えているかたがたへ向けて、古い入門書や入門記事でよく現れる pLaTeX や upLaTeX ではなく、はじめから LuaLaTeX を使うことを勧める理由を述べる。この理由は「背景」にまとめた。

他のソフトウェア(Microsoft Word や Studyaid D.B.)と LaTeX のいずれを使おうかどうかを悩んでいるかたがたへ向けては、この記事ではなく次の記事で述べる。

2023年に発表された組版ソフト typst も流行の兆しがある。まだユーザが少なく情報に乏しい欠点があるが、こちらのほうがよいと思うひともいるだろう。

背景

LaTeX はそもそも、英語(ラテンアルファベット)での組版のために作られている。 したがって、そのままでは日本語を取り扱うことができない。 さて、日本語を取り扱うためには次のような拡張がある。

  • pLaTeX / upLaTeX
  • LuaLaTeX-ja
  • XeTeX
  • etc.

今はこれだけの選択肢がある。 しかし、2000年代後半ごろまでは、pLaTeX / upLaTeX しかなかった。 また、2010年代も pLaTeX / upLaTeX が主流だったと言ってよい。

そのため、昔から web 上にある記事や古い本では、たいていが断りなく pLaTeX / upLaTeX をもとに書かれている。 今でも pLaTeX / upLaTeX がよく使われるのは、これが大きな理由だろう。 さらに、さまざまな場所で昔に作られた・決められた pLaTeX / upLaTeX の様式が変わらずに使いまわされていることも要因である。 あなたも、web 上にある記事を頼りに LaTeX を使いはじめたのであれば、よくわからないままに pLaTeX / upLaTeX を使っているかもしれない。

2022年現在、日本で最も多く使われている LaTeX は pLaTeX / upLaTeX であろう。 私も、2022年06月までは upLaTeX を使っていた。 しかしこのごろ、pLaTeX / upLaTeX については次のようなおそれがあると伝えられている。

したがって、これから使う LaTeX として pLaTeX / upLaTeX は避けるべきであろう。 残る LuaLaTeX と XeLaTeX では、LuaLaTeX がよりよい環境であると考える。 LuaLaTeX のほうが日本語向けの処理系や知見が多く開発に勢いがあること、欧文で主流となっている pdfTeX の後継となることが予定されており、将来の展望が明るいことなどがその理由である。

ほかにも、LuaLeTeX には(uplatex が苦手であった)フォントの設定が易しい・Lua のコードを書いて・読み込ませて処理させられるといった長所もある。

これらのことから、私は upLaTeX から LuaLaTeX-ja へと切り替えた。あなたが教員であれば、長期休暇のはじめに取り組むのがよいだろう。授業の準備が止まり、移行にあたってトラブルがあっても考えることができ、遊んで慣れる時間もある。

私が自身で使い・公開している数学教材作成用の LaTeX プリアンブルである the Japanese Educational Preambles も LuaLaTeX 用として開発している。

これから LaTeX を使おうとするユーザーには、ぜひ LuaLaTeX-ja を選んでもらいたい。 また、pLaTeX / upLaTeX ユーザーには、余裕のあるときを探して LuaLaTeX-ja への切り替えを勧めたい。 手間はそこまで大きくない。 TeX Live によって LaTeX を導入しているのなら、コンパイルするエンジンを変え、いくつかの命令(とくにパッケージとパッケージのオプション)を書き換えるだけで済む。 切り替えのために私が行った手続きは解決で述べる。

解決

ここからは、私が upLaTeX から LuaLaTeX に切り替えるにあたって行った作業を述べる。 あくまでも個別的・具体的な記録であることに注意されたい。

あなたがどのような機能によって文書を作ってきたかがわかっているのなら、怖がることは何もない。 ここから先を読むことなく、LuaLaTeX の説明を読み、LuaLaTeX としてのプリアンブルをはじめから作ってみることを勧めたい。 元のソースを手直ししながら切り替えようと考えるよりも、「同じことができるようにしよう」と思うほうがよいだろう。 なすべきことは執筆なのだから。

あなたがこれまで原稿を書くことで手一杯であったのなら、ここでプリアンブルを見直すことを勧めたい。 使っているパッケージのマニュアルに目を通したり、コメントアウトしてみて何が起こるかを試したりしてみればよいだろう。 それは、LaTeX への理解を深めることにつながる。

とはいえ、よくわからない・難しそうだからとりあえずこのままでよい、という気持ちになることもある。 私も、時間に追われていればそうなる。 もしも、「たやすく切り替えられるならしてもよいけれど……」と思ってもらえるのであれば、役に立てるかもしれない。 ここから先に述べる手直しを済ませて、タイプセットが通るか試してもらいたい。 上手くゆかなければ、一部のパッケージをコメントアウトしてみたり、思い切って文書の前半と後半を分けてタイプセットしてみたりすれば、何ができて何ができないのかがわかってくるだろう。

わからない点があれば、より詳しい記事を参照してもらいたい

要件

私は次の条件のもと、upLaTeX から LuaLaTeX への切り替えを行った。 異なる環境での違いについては確かめていない

  • TeX Live により LaTeX を導入している。
    • 私は TeX Live によるローカル環境を使って文書を作っている。
  • かつての文書がそのままタイプセットできないことは止むを得ない。そのときは pLaTeX / upLaTeX を用いてタイプセットする。
    • ここでは、これから作る文書について、これまで書いてきたもののどこを直せばよいのか、を考える。昔の文書をどう置換するかということではない。
    • とはいえ、これまで使ってきた pLaTeX / upLaTeX 文書をこれからも LuaLaTeX 文書として使い続けるために書きなおす参考にはしていただけるだろう。

凡例

変更は
<pLaTeX / upLaTeX>
<LuaLaTeX>
と表す。

バックスラッシュ記号と円マークは、ブラウザの読み込むフォントによる。

私が移行を諦めた点

TeXworks の設定

タイプセットの既定を LuaLaTeX に変える。

  1. [編集]/[設定]/[タイプセット]/[タイプセットの方法]下部の[デフォルト]のプルダウンから[LuaLaTeX]を探し、クリックする。
  2. [OK]をクリックする。

文字コード

LuaLaTeX ではファイルの文字コードは UTF-8 しか扱えない。 新規作成すれば既定で UTF-8 になるが、過去に作ったファイルはそうでないことがある。

Windows 付属のメモ帳で文字コードを変換できる。 BOM 付きという表現が見えるときは、「BOM 付き」ではないほう(BOM 無しと明言されるときもある)を選ぶ。 UTF-8 と UTF8-N があるときは、UTF8-N を選ぶ(このときは UTF-8 が BOM 付き、UTF-8N が BOM 無しを意味する)。

コンパイルエラーが生じ、! Text line contains an invalid character. と言われているときの原因はたいてい文字コードである。 あなたが書いたソースファイルではなく、使っているパッケージファイルの文字コードによることもある。 このときは、パッケージ(.sty ファイル)の文字コードを変換すればよい。

文書クラス

文書クラスそのものは次のように書き換える。

  • \documentclass{jsarticle}
    \documentclass{ltjsarticle}
  • \documentclass{jsreport}
    \documentclass{ltjsreport}
  • \documentclass{jsbook}
    \documentclass{ltjsbook}
  • \documentclass{jlreq}
    \documentclass{jlreq} \usepackage{luatexja}

オプションでは次のような点に気をつければよい。

  • \documentclass[dvipdfmx,A,B,C,...]{...}
    \documentclass[A,B,C,...]{...}
    • pLaTeX / upLaTeX ではグローバルに DVI 形式を指定することが推奨されてきた。LuaLaTeX では DVI 形式を経ずに PDF を作るので、DVI ドライバの指定は取り除かねばならない。
    • ほかの DVI 指定も同じである(後述)
  • \documentclass[uplatex,A,B,C,...]{...}
    \documentclass[A,B,C,...]{...}
    • LuaLaTeX は upLaTeX ではないので、uplatex オプションは取り除かねばならない。
  • \documentclass[papersize,A,B,C,...]{...}
    \documentclass[A,B,C,...]{...}
    • LuaLaTeX-ja 用 jsclasses 互換クラスは PDF のページサイズを自動で設定してくれるため、papersize オプションは取り除かれている。
    • これも実は DVI の話である

ドライバ指定が不要な点

LuaLaTeX では DVI 形式を経ずに PDF を作るので、DVI 形式のドライバ指定は要らない。不要です。ドライバ指定オプションをせねばならなかったすべてのパッケージについて、DVI ドライバの指定は取り除かねばならない。

  • 文書クラスで指定しているのみであれば、そちらで直せば終わる(前述)
  • \usepackage[dvipdfmx,...]{<package>}
    \usepackage[...]{<package>}
  • よく使われるドライバ依存パッケージは次のようなものだろう。
    • color パッケージ
    • graphicx パッケージ
    • hyperref パッケージ
  • dvipdfmx で検索し、手で書き換えるのが速いだろう。置換は [dvipdfmx] [dvipdfmx,...] [...,dvipdfmx] ですべきことが異なるので気をつけねばならない。

フォント指定が異なる点

  • もとよりフォントを指定していなければ、無視してよい。
  • TeX Live の更新をかけると、フォントは昔の既定である ipaex から今の既定である haranoaji に変わると思われる
  • \usepackage[T1]{fontenc}
    \usepackage[unicode,yu-win10]{pxchfon}
    \usepackage[no-math]{fontspec}
      \usepackage[yu-win10]{luatexja-preset}
    • pxchfon パッケージはそもそも dvipdfmx 専用である。
    • LuaLaTeX でのフォント指定は luatexja-preset パッケージが楽であろう。
    • 他のフォントを指定しているときも同じである。本来 luatexja-preset があれば fontspec は自動的に読み込まれるが、いろいろと試すにあたって設定を変えやすいように案内した。
  • 改めていろいろ試したければ luatexja-fontspec に依るのがよい(Package documentation (Japanese) 内の「3.2 luatexja-fontspec パッケージ」に説明がある)。

otf パッケージが使えない点

  • \usepackage{otf}
    \usepackage{luatexja-otf}
    • \ajMaru 類の命令を使っていなければ、取り除いても差しつかえない。
    • 私は丸囲み数字で数式番号を表すなどをしているため、luatexja-otf パッケージを使っている。

zw\zw に置き換えねばならない点

  • 自ら余白を整えた覚えがなければ、無視してよい。zw とは、pLaTeX / upLaTeX のみで使える和文スペースの単位であり、LuaLaTeX-ja では \zw と書かねばならない。
  • zw\zw に置換するのが速いだろう。
    • ただし、私は \@zwspaceなどの内部用命令を作っていたので、これらはあらかじめ \@z@w@space などに置換しておき、衝突しないようにした。
    • さらに、\zwspace などのユーザー向け命令はやむを得ないため、置換をかけたのちに \\zwspace\zwspace にふたたび置換した。
    • 本文に「zw」という文字列が含まれているかもしれないのであれば、置換に気を配らねばならない。プリアンブルのみを置換するなども手であろう。
  • 内部に zw を使っているパッケージは動かなくなる。
    • コンパイルエラーが生じ、! Illegal unit of measure (pt inserted). などと言われていればほぼこれが原因である。使っている日本語関係パッケージをすべてコメントアウトしたのち、ひとつずつ戻しながら原因のパッケージを探ることになる。

emath の対応

補足

pLaTeX / upLaTeX と LuaLaTeX-ja の挙動比較

自作のパッケージへの対応

リンクはすべて CTAN である。

  • jpnedenumerate.sty
    • [lua] オプションを加えた。
    • zw \ajRoman \ajroman を使っているためである。
  • jpnedumathsymbols.sty
    • [lua] オプションを加えた。
    • zw を使っているためである。
  • asternote.sty
    • [luajapanese] オプションを加えた。
    • zw を使っているためである。
    • 欧文ではそもそも zw を使っていないので、[japanese] オプションがなければ無関係である。
  • inlinelabel.sty
    • [luacircled] オプションを加えた。
    • \ajMaru を使っているためである。
    • オプションなしでは無関係である。
  • hideanswer.sty
    • 直すべき点はない。

参考

各種日本語 LaTeX の歴史と比較

背景(pLaTeX / upLaTeX への懸念)

LuaLaTeX の紹介と利点

LuaTeX-ja / LuaLaTeX-ja のマニュアル類

pLaTeX / upLaTeX から LuaLaTeX への移行

私が移行を諦めた点 (1) 下線に関する記事

私が移行を諦めた点 (2) 権限パスワードに関する記事

文字コード

  • https://kb.seeck.jp/archives/14904
    • ユタカ アイティー ソリューション
    • Windows 標準機能で文字コードを変換する方法
    • SEECK.JP Knowledge Base
    • 参照 2022-07-26

文書クラス

フォント指定が異なる点

emath の対応

改訂

  • 追記: 2024-10-30
    • Typst に触れた。
  • 改訂: 2024-10-18
    • 旧記事「LaTeX エンジンとして LuaLaTeX を勧める理由」と統合した。
    • 旧記事「LaTeX エンジンとして LuaLaTeX を勧める理由」のリダイレクト先とした。
    • 「「日本語LaTeX」が多すぎる件について」「続・LaTeXでシナリオ同人誌:XeLaTeXかLuaLaTeXか」「Lua-UL」へのリンクを加えた。
    • 記事の統合に伴って、大きく書き換えた。ただし、伝えたい内容は同じである。
  • 追記: 2022-08-29