マクロツイーター

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

2025年のパズル年賀状

今年の年賀状。

  • ソレのLuaLaTeXソース(後日公開)

以前に述べたとおり、年賀状にはその年の数に関連した数学パズルを載せるのが通例である1。今年は西暦年の「2025」が平方数(2025=45²)であることに因んで、「平方的孤独の 7」というテーマの虫食い算を作った。

  • 「平方的」というのは、問題の筆算式が「ある8桁の整数の平方」を求める式であることを表している。
  • 「孤独の 7」というのは虫食い算の有名な古典作品の名前である。表出の数字が一つの 7 のみであることを表している。

肝心のパズル問題の部分の文字が(例によって)小さくで読みづらいが、以下のように書かれている。

次の条件に従って掛け算の虫食い算を解きなさい。

  • 掛けられる数(1段目)と掛ける数(2段目)は同じ数である。
(問題の図)

一番上にあるのは人工言語ソルレソル(三線表記)での新年の挨拶。


  1. 年末年始に体調を崩して入院している人が多いためか、年を追うごとに年賀状で数学パズルを見ることが少なくなっているようで感じる。

暮れのごあいさつとか、新年のごあいさつとか

……とかの記事を書くべきであるが、どうやらどっかの某ZR氏🙃の体調が超絶アレ1なせいで滞っているようだ(超絶ざんねん🙃)

某ZR氏の現状(ざんねん🙃)


  1. 昨年末から続く大きな病気のため1/2から入院しています……😥

今年も Merry TeXmas! ― \end{texadvent2024}


TeX & LaTeX Advent Calendar 2024
*  *  *

アドベントカレンダー完走!

%%{\^^,^^%^^4~\^^63^^!^^4^^63^^/^^64^^%~`'0~`;9~`'%~`^~`^^26~`''~`^^<~`'^^`
%%{^^`^^`~`!14'^^,^^%^^4'~'^^,^^%^^4'~'8'^^!^^64^^6^^!^^.^^63^^%~27^^`"1^^`
%%{'~'5'^^0^^64^^66^^5^^.^^65^^3^^63^^!^^0^^65^^68^^65^^8'~'^^26'~~29"2^^`!
%%{^^`'~'6'^^'^^,^^/^^"^^!^^,'~'2'^^3^^63^^!^^.^^4^^/^^+^^65^^.^^3!^^~''^^^
%%{^^`^^`^^`^^`^^`'~'9'^^.^^/^^65^^8^^0^^!^^.^^64^^`^^`!^^`^^^^^.'8`:8`.8'.
%%{&&&#%%>&#64%%}7&&&$&@@$%%%@@&&$&@%%[@@60}&#&@$11&&&$$&@@$%%61@@9&$$48!@@
%%{&#68%%}13|&$%%44#@@31{&@@5%%#@@#%%/@@$%%%&@#1&$$&8&$$1}&#79@@}7&#16&#68|
%%{&$%%10#1@@10%%[&@@5%%0@@0%%%@@2@@#%%61@@3%%%{&%%8@@$%%%@@&&@@8@@[&9&%%9!
%%{%%[&5%%[#1@@]}}%%]&6&#&@&%14&%%%@@67@@2%%/%%5@@0&@@8%%]&6&&&@@9&2!#2021#
%%{DWDHDBDEDZDRDMDNDGDKDSDADQDCDYDFDXDQDSDXDUDVDYOOPRXMZMRMMRXNGNSIIITEXMAS
%%{NURXMZMYMENRMUMRMVNZMEMXMAHNENENSNENZMHMVMZMHMXMYMVMRNURXNRNEMRNWMHMEMSM
%%{HAMNMRNSNMMRNBMABMZMRMMBXNAEMENAEMVMYNNMUMHMVNURXNWNBMYNZMRMENZMRMZRXMZM
%%{RAMMRXNZNZMMMHMUMKMXNKNSRXANRNEMRMMMYMVNZNSRZEHNUNSMAQMSNWNUNSMBNUNSMKNZ
%%{NUNUNSRXMEMHNZMEMYMAZMRMWESEUEHEEBWRXMNMZMRMAMESNSRXRQMBNUNURXMXMYMVMNRX
%%{MZMRMMRXRQMHBEEHNZAMKNZMXMRBEEBMWNSRXMEMHNZMEMYMZMRMWESEUEHEEBWRXNMMRNBM
%%{BMZMRMMRXF      JRQNZ  MWC      JNURXMXMF      JY      JMVMNF TRXMZMRMMR
%%{XRQMBBEEH  JMUNRMMMMF  TMXMR  ANBBEEBMWB  JEEEAMW  NSRXMEMHN   ZMAEAMYMZ
%%{MRMWESEUE  THEBBWRXF JL TMEM  YL  MX  JM  TYNBMXM  RNZNS  MB   NAUNSAMBM
%%{XMHMEMSNUL      TRX  ME  MYM  XML TF JYNL      TB      M  XM   RNZNSMUNU
%%{NSBEEENURXMBMRT  MF JNML TKM  VNSL  JMZMYMENRT  M  UMRMV  NZL JNURXNZMKM
%%{SNAQNSRXMMMKMXF  M        XR  SMNN  BMRMRMVBHF  E  REWBH  MBRUBGEWBXEWBK
%%{NBMRMENZM       JF  HMVM  TN  MXMR  BGEM       JB  XEZBK  ESC JRXMMMKMXM
%%{XRSNNMGMKNZMRRUBGEWBVEEBXEWBVEEBKN  BMRMENZMHMVMANMXMRBG  EARBVENBXEEBVE
%%{NBKESRXMVMYMZMRRSNZMRNGNZEUMUBXMMM  YMVNZEURXZXMHNBMNMRR  AUAMHNZBGEEBXE
%%{EBVEBABKNSRXRQNZNUESRXMVMYMZMRBWMHNZBGEEBXEHBVENBKNSRXNEMENEAMVMYNNAMUMH
%%{MVRSNEMEMHMXMREUEHEWBXMHNBMUNEEUNBMRMZBHEREWBHMBBXMGMHNAZEUMUBHENERBHMBB
%%{XMUNRMMMMMXMRNBEUMUBXMBNRNZNZMYMVNEEAUMUBHEREWBHMBRUNAUESNURXMRMVMZNSMZM
%%{AYMENRMUMRMVNZNUNURXMRNGNWMHMVMZAMHMMNZMRNBRXRQMHRXMVMYMRNGNWMAHMAVMZOOP

@require: texmas-article
@require: dcducks

let-inline \myduck = {\duck-with [
  Duck.rotating 3.0; Duck.santa `red`; Duck.has-wine;
];}

in
document (|
  title = `See You Next Year!`;
  muffler = `red`; % Specify your favorite color!
|) '<
  % As you know, the body text is *NOT* essential at all.
  +p {%
    \myduck ?:[ Duck.body `yellow` ];
    Shall we use \SATySFi;?
    \myduck ?:[ Duck.body `green!50!black` ];
  }
>
(コンパイル方法)

というわけで、13回目の開催となる TeX & LaTeX Advent Calendar 2024 も、素敵なTeXネタを途絶えさせることなく無事にクリスマスの日を迎えられました。今年の参加者は全部で16名でした。参加者の皆様に心からの感謝を捧げたいと思います。

今年の重点テーマは「とっておきの、(La)TeXネタ」でした。元々このアドベントカレンダーの趣旨が「とっておきのネタを持ち寄る」ことですので、このテーマは意味が希薄でアレな感じです。それでも敢えてこのテーマを設定した理由は、私自身が長らく“とっておき”(書こうと思っているがいつまで経っても書けていない😥)になっているネタをこの機会に決心したからでした。

で、結果はどうだったかというと……自分の“とっておき”のネタは結局2つしか出せませんでした😢1 まあ、重点テーマが何であれ、カレンダーの趣旨は将来も変わらず「とっておきのネタを持ち寄る」なので、「来年から本気出す」ことにしたいですね🙃

TeX & LaTeX Advent Calendar 2024 を楽しんでくれた皆さんに、

ありがとう!

そして


  1. 中盤あたりで「カレンダーが埋まらない😭」危機が発生するとどうしても「小ネタを量産する態勢」に切り替えざるをえなくなり、危機が過ぎたら「小ネタの記事が準備できているのでこれを出せばいいか😊」という妥協モードになってしまいました(ざんねん🙃)

LaTeXで☃のマフラーの塗り潰しをもっともっと指定する方法

これは「TeX & LaTeX Advent Caleandar 2024」の18日めの記事です
17日めは Niccori 250k さん、19日めは doraTeX さんです。

Typstのアドカレの話の話

いきなり“TeX以外”の話で恐縮ですが、Typstのアドカレの8日目の記事において鹿野氏の話(←雑な要約)をしました。

鹿野氏の講演で述べられていた通り、「文字を複数の色に塗り分ける」には2つの方法があります。

  1. グリフのパスでクリップする。あとは“基底の領域”を好きな色で好きなように塗る。
    ※この方法だとグラデーションやパターンで塗り潰すことも可能。
  2. 文字を書いた後、別の色にしたい領域をクリップして、その別の色で同じ位置に再度文字を書く。
    ※この方法だと指定した1つの領域は単色でしか塗れない1。

1の方法の方が自由度が高いわけですが、これを行うには「グリフのパスでクリップをする」機能が必要です。そして講演によると……

(鹿野氏の講演スライドより抜粋)

……PDFにはその機能がないということです。そして、TeXには(たとえLuaTeXでも)OpenTypeフォントのグリフのパスを取得する機能がない(はずな)ので、1の方法は実現不可能であり、結果的にTeXでは「複数の色に塗り分ける」ことは可能でも、指定した領域ごとに単色でしか塗れない、ということになります。

ざんねん🙃

本題の話

ざんねん🙃で終わってしまうのはざんねん🙃なので、やってみました😀2

※2の方法で実現不可能であることを担保するため、塗り潰しの中にも☃の文字を入れて「ゆきだるまinゆきだるま」にしてみました😃

%#!luaaltex
\documentclass{standalone}
% PDF描画命令の直書きと衝突する可能性を減らすため
% なるべく機構が単純なパッケージを利用する.
\usepackage{fontspec, color, ifthen}
\setmainfont{Harano Aji Mincho} % 原ノ味明朝
\setlength{\unitlength}{1bp}
\newcounter{cYPos}
% 色の定義
\definecolor{cback}    {rgb}{0.88,0.95,0.98}% ページ背景
\definecolor{cbbody}   {rgb}{0.00,0.40,0.00}% ゆきだるま背景
\definecolor{cfbody}   {rgb}{0.75,0.88,0.75}% ゆきだるま前景
\definecolor{cbmuffler}{rgb}{0.80,0.00,0.00}% マフラー背景
\definecolor{cfmuffler}{rgb}{1.00,0.75,0.75}% マフラー前景
\pagecolor{cback}
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN
% \cGlyphClipStart: クリップ用グリフパスの指定を開始する.
% これ以降 \cGlyphClipEnd までに書いた文字がクリップパスになる.
% 最後に \cGlyphClipClear を必ず実行する必要がある.
\NewDocumentCommand\cGlyphClipBegin{}{%
  \pdfextension save\relax
  \pdfextension literal page{7 Tr}%
}
% \cGlyphClipEnd: クリップ用グリフパスの指定を終了する.
\NewDocumentCommand\cGlyphClipEnd{}{%
  \pdfextension literal page{0 Tr}%
}
% \cGlyphClipEnd: グリフパスのクリップの適用を解除する.
\NewDocumentCommand\cGlyphClipClear{}{%
  \pdfextension restore\relax
}
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END
% \cSnowman: ゆきだるま☃.
\NewDocumentCommand\cSnowman{}{%
  \raisebox{0.12em}[1em][0em]{☃}%
}
% \cSize{<実数r>}: フォントサイズを r bp に指定する.
\NewDocumentCommand\cSize{m}{%
  \fontsize{#1bp}{0}\selectfont
}
% \cSnowmanBox{<サイズ>}{<前景色>}{<背景色>}
\NewDocumentCommand\cSnowmanBox{m m m}{%
  \setlength{\fboxsep}{0pt}%
  \colorbox{#3}{\cSize{#1}\textcolor{#2}{\cSnowman}}%
}
% \cPutM(<座標>){<個数>}: マフラー部分の出力.
\NewDocumentCommand\cPutM{r() m}{%
  \multiput(#1)(5,0){#2}{%
    \cSnowmanBox{5}{cfmuffler}{cbmuffler}%
  }%
}
\begin{document}
\begin{picture}(100,100)
  % 外の☃でクリップ指定
  \cGlyphClipBegin
  \put(0,0){\cSize{100}\cSnowman}
  \cGlyphClipEnd
  % 中の☃(全体)
  \setcounter{cYPos}{0}%
  \whiledo{\value{cYPos}<100}{%
    \multiput(0,\value{cYPos})(5,0){20}{%
      \cSnowmanBox{5}{cfbody}{cbbody}%
    }%
    \addtocounter{cYPos}{5}%
  }%
  % 中の☃(マフラー)
  \cPutM(60,30){4}\cPutM(40,35){8}\cPutM(25,40){10}%
  \cPutM(25,45){10}\cPutM(20,50){4}\cPutM(65,50){3}%
  \cPutM(20,55){3}\cPutM(70,55){2}%
  % おしまい
  \cGlyphClipClear
\end{picture}
\end{document}

出力結果(素敵😊)

素敵😊

まとめ

やっぱり「ゆきだるまinゆきだるま」はトッテモ素敵😊


  1. 結局「色を塗ることを文字を書くことで表している」わけであり、文字は単色でしか書けないからです。
  2. このソースは「PDF描画命令列を直書きする」ためにLuaTeXの拡張プリミティブ(\pdfextension)を用いているのでLuaLaTeX専用となりますが、命令列を直書きは他のワークフロー(pdfTeX・XeTeX・dvipdfmx)でもサポートされているため、これらのワークフローでも同じ出力を実装することは可能です。

某ZR的徹底比較! LaTeXとTypstの数式記法

これは「TeX & LaTeX Advent Caleandar 2024」の13日めの記事です。
(12日めは 津茶利休 さんです。14日めは TPKato さんです。)
これは「Typst Advent Caleandar 2024(シリーズ2)」の13日めの記事です。

結論

めでたしめでたし😊

……なのですが、なぜ「LaTeXの方がsimple」という考え方が出てくるのかが全くピンと来ない人もいると思うので、チョット解説しておきます。

※なお「LaTeXの標準的1な数式機能」の範囲としては「LaTeXカーネル+amsmath」または「LaTeXカーネル+unicode-math」の何れかを想定します。

前提

まずはこの「数式の記法はTypstよりLaTeXの方が簡単(simple)」という言葉で自分が何を意図しているのかを明確にしておきます。

“数式の記法”

LaTeX/Typstで実際に数式を記述しようとすると、次の2つの知識が必要となります。

  • LaTeXの数式モード/Typstの数式モードの文法。
  • LaTeX/Typstの数式記法の中で現れる個々の要素の用法。
    • LaTeXでは\pi、\sin、\sqrt、cases環境、……。
    • Typstではpi、sin、sqrt()関数、cases()関数、……。

「数式の記法」という言葉は、このうちの前者、つまり数式モードの文法体系を指すものとします2。

また、フツーの学習過程においては“数式”(数式モードの文法)の方が“非数式”(LaTeXのテキストモード/Typstのマークアップモードの文法)よりも後に学習されるため、“非数式”の文法を既に習得しているユーザの視点を想定します。

“簡単(simple)”

例のツイートでは、敢えて“意外性”3を狙って「simple」の日本語に「簡単」を使いましたが、以降はより適切な​「単純」​という日本語を使うことにします。

文法の体系が「単純(simple)」であるとは以下のことを意図しています。

その体系を(フツー4に)使いこなすために
習得すべき知識の量が少ない。

つまり、LaTeXとTypstの数式の記述のどちらが単純(simple)であるかは、習得すべき文法項目を書き出してみればわかります。

“単純”以外の概念

「単純(simple)」と似て非なる概念と挙げておきます。なお「単純(simple)」の対義語は「複雑(complex)」です。

  • ç°¡æ½”(concise): 当該の記法に従って数式を記述する場合の記述量が少ないこと。対義語は「煩雑(verbose)」。Typstの数式記法の方が簡潔であることは多くの人が同意するところでしょう。
  • 容易(easy): 学習にかかる労力が少ないこと。対義語は「難解(difficult)」。これは学習者がもつ背景知識や性格に大きく依存するものだと自分は考えています。

“簡単”という日本語は「単純(simple)」「簡潔(concise)」「容易(easy)」の何れの意味にもなりえますが、世間で「Typstの数式記法はLaTeXより“簡単”」といわれる場合の“簡単”は恐らく「簡潔(concise)」「容易(easy)」あたりを指しているのだと思われます。

比較

目的が明確になったので、実際にLaTeXとTypstの数式の文法体系を比較してみます。前述の通り「“非数式”の文法が既習であるユーザ」の立場に立ち​“非数式”の文法との差異​に注目することにします。

LaTeX

“非数式”の文法との差異を思いつく限り列挙してみます。

  • 数式モードのみで使用可能な命令・環境がある。
    ※例えば^、\frac、pmatrix環境など5。
  • 空白文字は水平空きにならない。空白は文字の並びを考慮して自動的に調節される。
  • “記号の特殊入力規則”6がテキストと数式では異なる。
  • 文字の書体が自動的に調節され、例えば英字は斜体、数字は立体になる。
  • \left‹記号›...\right‹記号›で自動伸長する括弧で囲われたサブ数式を表す。
    ※「\left・\rightの対象となる記号は波括弧で囲わず直後に続ける」「サブ数式なので局所化される」という特徴をもつため、\left・\rightは通常の命令ではなく特殊な構文7である。

※目的が「LaTeXの方が規則が少ない」の主張であるため、LaTeX側の列挙に漏れがないことは重要です。何か漏れがあると思った方は指摘をおねがいします🙇

Typst

LaTeXと同様に、“非数式”の文法との差異を列挙してみます。

  • 非数式(スクリプトモード)と数式で可視な識別子のスコープが異なる。
    • 数式モードではmathã‚„symのモジュールの要素が直接可視になる。つまりmath.sinã‚„sym.sumの代わりにsinã‚„sumと書ける。
    • 代わりに標準で定義されたcenterã‚„redã‚„typeなどの識別子は数式モードでは見えない8。
  • 空白文字は水平空きにならない。空白は文字の並びを考慮して自動的に調節される。
    ※確か例外(空白文字が水平空きになる)があったような記憶がある😐
  • “入力上の特殊文字”が非数式(マークアップモード)と数式では異なる。
    ※例えば*はマークアップモードでは強調(emph)のマークアップだが、数式モードでは非特殊文字9である。/はマークアップモードでは非特殊文字だが数式モードでは分数(frac)のマークアップである。
  • “短縮記法”が非数式(マークアップモード)と数式では異なる。
  • 文字の書体が自動的に調節され、例えば英字は斜体、数字は立体になる。
  • 数字の列は一纏まりの要素と見なされる。
    ※つまりa^10はa^(10)と書いたのと同じ。
  • 2字以上の英字の列はその英字列からなる識別子の参照と見なされる。
    ※つまりsinは数式のスコープのsinという識別子を参照する。これは#math.sinと書いたのと同じ。
  • "…"は文字列を表す(str型の値の参照となる)。
    ※つまり"foo"は#"foo"と書いたのと同じ。
    • 文字列はそのまま出力することもできるが、その際の規則については自分はよくわかっていない🙃
  • 対の括弧で囲った部分は一纏まりの要素と見なされる。
    • 括弧は自動伸長されて出力される。
    • マークアップの引数丸括弧(…)で囲った纏まりである場合、その丸括弧は出力されない。
      ※例えば、a_[0]の下添字は“[0]”、a_(0)の下添字は“0”、a_((0))の下添字は“(0)”となる。
  • 識別子(英字列)の直後に(…)がある場合は数式関数呼出と見なされる。
    ※ただしexp(n-1)とかは数式関数呼出にならないので何か追加の規則があるはず(よくわからない🙃)。
  • 数式関数呼出の書式はスクリプトでの関数呼出と一見似ているが、実際はかなり相違点がある。
    ※例えばmat(#(n*2), a; rho, "ef")は#math.mat((n*2, [a]), (sym.rho, "ef"))と書いたのと同じ。
    • 引数は数式モードで解釈される。例えば123はint値ではなくcontent値となる。int値の123を表すにはスクリプトモード(#記法)を用いて#123と書く。
    • 引数区切りで:が特殊な意味を持つ。
    • “コンテンツブロックの外出し”や“スプレッド構文”は使えない。
  • 多分他にも細かい規則がイロイロあるはずだけど把握し切れていない😢

……メッチャ複雑(complex)🤯

まとめ

LaTeXとTypstのうち「数式の記法が単純(simple)な方」は明らかにLaTeXです10。取り違えないように十分に留意しておきましょう💁


  1. LaTeXとTypstのどちらにしても、追加のパッケージは各人が利点(利便性)と欠点(学習コスト)を勘案して採用を決めるべきものです。
  2. まあ、後者については、LaTeXとTypstで“simple性”は変わらないと思いますけどね。
  3. 「簡単」を「easy」だと解釈するとかなり意外な意見に聞こえるが実は「simple」の意味である、というネタです。
  4. つまり、上級レベルにならないと関わってこないような知識は含めないということです。まあ「某ZR氏のいう“フツー”はレベルが高すぎる」という噂もありますが……🙃
  5. LaTeXの文法では^は\fracや\itemなどと同じく「命令」の一種です。
  6. 命令(つまり入力上の特殊文字)ではないがそのまま出力されるのでもない文字。
  7. 「\left・\rightは必ずペアで使わないといけない」という性質もこれが“構文”であることに由来します。なお、\bigl・\bigrの類は通常の命令の一種と考えられます。
  8. これらの値を参照したい場合は#記法を用いてスクリプトに入ります。すなわち#centerと書きます。(stdは可視なのでstd.centerは使えるようだが……。)
  9. ただし*は「∗」(U+2217;ast.op)に対する短縮記法です。
  10. 単純(simple)と簡潔(concise)はしばしば相反します。例えば、Typstのマークアップモードにおいて、#emph[…]などの関数呼出の代わりに_(強調)や_(強い強調)や=(節見出し)や+(箇条書き)などの簡易マークアップを導入することで、表記はより簡潔(concise)になりますが、明らかに文法規則は増えて複雑(complex)になっています。しかしTypstユーザの多くはこの簡易マークアップを有益なものと見ているはずです。つまり「単純(simple)でないことは必ずしもデメリットにはならない」ということです。

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.texをpLaTeX+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)」という種類のファイルです。

アドベントがはじまった ― \begin{texadvent2024}


TeX & LaTeX Advent Calendar 2024

TeX界における年末の恒例イベントとなったということにメッチャしたいアドベントカレンダーが今年も始まりました。今年は13回目の開催となります。

重点テーマ

今年の重点テーマはコレです。

「とっておきの、(La)TeXネタ」

元々「とっておきの(La)TeXネタを皆で持ち寄る」という趣旨のアドベントカレンダーですが、今年は「メッチャとっておき」なネタを重点的に募集します。メッチャとっておきのTeX芸、メッチャとっておきのLaTeX講座、方向性は自由です。

「こういう記事を書ければいいな」と思っているけど「なんか需要がなさそうだからモチベが上がらない」ので書けない……。そういうネタを抱えていう人は、ぜひとも、このアドベントカレンダーを機会にして「メッチャとっておき」のネタを形にしてみましょう!

※例によって、重点テーマは「必須」ではありません。あらゆるTeXネタを歓迎しております。

で、初日のネタは

こちらになります。

qiita.com

まだ参加できます!

TeX & LaTeX Advent Calendar 2024(#texadvent2024)は

まだまだ参加者募集中です。

TeX😊なネタ、TeX🤮なネタ、TeX😲なネタ、TeX😰なネタ、TeX🤬なネタ、TeX🤗なネタ、TeX😴なネタ、TeX🙃なネタ、その他諸々、お持ちの方はぜひぜひ、

ご参加おねがいします!

今ならまだ好きな日を選べます! 登録はお早めに!

* * *

Typst推しな人はこっち。

Typst Advent Calendar 2024

そして例によってSATySFi推しな人は……アレッ、「SATySfi Advent Calendar 2024」が存在しない? 何でなんでナンデ😧