マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

LuaLaTeXを爆速にする方法(※ただし画期的)

これは「TeX & LaTeX Advent Caleandar 2024」の8日めの記事です
(7日めは CareleSmith9 さんです。9日めは CareleSmith9 さんです。)

やっぱりLuaLaTeXが遅い件について

昨年のアドベントカレンダーでは「重点解説! LuaLaTeXを遅くしない方法」と題してLuaLaTeXがフツーよりも遅くなる原因とその解決方法について解説しました。

さてこれで「LuaLaTeXが遅すぎる」問題が解決したのかというと、もちろん全くそんなことはありません。ご存じの通り、LuaLaTeXはフツーでも極めて遅いからです😥 そして当該の記事の背景解説でも述べた通り、この状況を改善する簡単な方法は見当たりません😥

さらに悪いことに近年の「タグ付PDF対応」などの機能拡張によって、LaTeXカーネル自体の動作が年を追うごとにどんどん遅くなっています😰 最も深刻なのは、LaTeXチームが「LaTeXカーネルがフルサポートする対象のエンジンをLuaTeXに限定する」という方向性を打ち出していることです😭

もはや、我々には“思い切り遅いLuaLaTeX”を使うことしか道は残されていないのでしょうか😭

LuaLaTeXの遅さを画期的に解決したい件

この「LuaLaTeXが遅すぎる」というのは明らかに困難な問題です。しかしまさに今、我々はこの問題が「LaTeXの困難な問題」であることを把握しました。それが把握できていれば、画期的な方向からの解決を検討すべきことがわかります。……そうです。

LuaLaTeXの出力を☃に変えればよい。

LuaLaTeXはunicode対応が充実しているため、さまざまな種類の文字(数式も含む)が出力できますが、一方で、そのためのOpenTypeフォント関連の処理1がLuaLaTeXの遅さの原因になっていることは確かです。日本語とか英語とか数式とかの文字を排して本質的な出力に徹することにより遅さの原因が解消されることは十分に期待できるでしょう。

LuaLaTeXの遅さを画期的に解決する件

というわけで、LuaLaTeXを高速化するための設定ファイルをつくってみました😃

使い方はとても簡単です。設定ファイル2scspeedy.luaをカレントディレクトリに置いた上で、lualatexコマンドのオプションに--lua=scspeedy.luaを追加するだけです。

lualatex --lua=scspeedy.lua ‹文書ファイル›

実際にLuaLaTeXを爆速にしてみる

例として、昨年のDockerの記事で使った文書ファイルをタイプセットしてみましょう。

[test.tex]
% LuaLaTeX文書; 文字コードはUTF-8
\documentclass[a4paper]{ltjsarticle}
\usepackage{bxjalipsum}% 例のアレ
\begin{document}
\section{吾輩は猫である}
%『吾輩は猫である』の先頭の10段落を出力
\jalipsum[1-10]{wagahai}
\end{document}

まずはこの文書をフツーのLuaLaTeXでタイプセットしてみます。

> lualatex test.tex
This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)
 restricted system commands enabled.
(./test.tex
LaTeX2e <2024-11-01> patch level 1
L3 programming layer <2024-11-02>
 (c:/texlive/2024/texmf-dist/tex/luatex/luatexja/ltjsarticle.cls
Document Class: ltjsarticle 2023/07/26 ltjsclasses
………(中略)………
Output written on test.pdf (3 pages, 166156 bytes).
Transcript written on test.log.

いつも通りの遅いLuaLaTeXです。自分の環境では大体15秒かかりました😫 出力結果(の1ページ目)は以下のような感じです。test.texはこのレイアウト(A4判)で2ページ半の分量をもっています。

フツーのLuaLaTeXの出力結果(非素敵🙁)
同じ文書を、今度はscspeedy.luaを有効にしてタイプセットしてみます。

> lualatex --lua=scspeedy.lua test.tex
This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)
 restricted system commands enabled.
(./test.tex [1])
 270 words of node memory still in use:
   1 hlist, 39 glue_spec nodes
   avail lists: 1:1,2:12,3:136,4:4,5:2,9:1
Output written on test.pdf (1 page, 1832 bytes).
Transcript written on test.log.

実際にやってみれば判りますが、LuaLaTeXなのに爆速でタイプセットが完了します😲 自分の環境では大体2.5秒でした。scspeedy.luaの効果は抜群であることがわかります。

念のため、出力のPDFも確認してみましょう。

爆速のLuaLaTeXの出力結果(素敵😊)

この通り、本質的な内容がしっかりと維持されていて、しかも素敵になっています😊

爆速のLuaLaTeXをもっと比較してみる

せっかく爆速のLuaLaTeXを手に入れたので、どれだけ速いのかをもう少し計測してみましょう。次の4つのパターンについてタイプセットのの所要時間を計測します。

  • ①フツーの(遅い)LuaLaTeXでtest.texをタイプセットする。
  • pLaTeX+dvipdfmxでtest1.texをタイプセットする。
    ※test1.texはtest.texpLaTeX+dvipdfmx用に修正したもの。
  • ③pdfLaTeXでtest2.texをタイプセットする。
    ※test2.texは「Hello, world!」だけの欧文文書🙃
  • ④爆速のLuaLaTeXでtest.texをタイプセットする。

※test1.texはtest.texの先頭の2行を以下の内容に変更したものです。

% pLaTeX+dvipdfmx
\documentclass[dvipdfmx,a4paper]{jsarticle}

※test2.texの内容は以下の通りです。

\documentclass[a4paper]{article}
\begin{document}
Hello, world!
\end{document}

結果は以下のようになりました。

パターン所要時間
フツーのLuaLaTeX15.93±0.12 秒
pLaTeX+dvipdfmx9.02±0.35 秒
③pdfLaTeX3.16±0.09 秒
爆速のLuaLaTeX2.33±0.07 秒

※環境はWindows10上のTeX Live 2024です。
※10回実行して平均と標準偏差を求めました。

なんと、「LuaLaTeXが一番速いLaTeXエンジンである」という結果になりました。やっぱり☃の力はスゴイ!😲

まとめ

もはやLuaLaTeXの遅さを気にする必要はなくなりました! 安心して本質的⛄なLuaLaTeXで素敵😊な文書をドンドン作りましょう!💁


  1. さらにいうと、その処理がLuaで実装されていること。
  2. 正確にいうと、scspeedy.luaはLuaTeXの「初期化スクリプト(initialization script)」という種類のファイルです。