こんにちは、びしょ〜じょです。アイカツ劇場版のBD発売ももうすぐですね。もちろん予約注文してあります。ソウルマリオネットコーデがあとブーツだけなので皆さんよろしくお願いします。当方トップスが被っております。


クソッタレtexluaを使う

texluaとは、LuaTeXにねじ込まれているLuaの処理系であり、クソッタレである。

\documentclass{ltjsarticle}

\begin{document}
\directlua{
for i = 1, 10 do
tex.print("$2^{" .. i  .. "}$")
end

tex.print("")

for i = 1, 10 do
tex.write("$2^{" .. i .. "}$")
end
}
\end{document}

適当なファイル名にして、lualatex tekitou.texとでもすると、こんな感じのPDFが出る。

hello

tex.printは受け取った文字列をLaTeXの入力として受け取り、コンパイル(実行)時に出力先に吐き出す。tex.writeは受け取った文字列をただの文字列として受け取る。

画像を見ると、tex.printで出力した\(2^i\)は意図通りに出力されており1tex.writeを用いた部分では"$2^-1$"とかよく分からない感じになっている。

ここで、「おっこれはLaTeXコマンドもいけるんちゃうか〜」と思った好奇心旺盛な少年が多いことは間違いない。しかし、texluaはちょっとここで少年たちを嘲笑う。


tex.print("\LaTeX")などとすると、まぁLuaを学んだ人間はわかるがバックスラッシュのところで怒られる。正しい。

ではバックスラッシュを2つ重ねるとOK、と思うだろうがそうは問屋が云々。

...
tex.print"(Hello, \\LaTeX")
...

! Undefined control seq ファーーーック だバカヤロウど畜生めが。ここで名案閃き、Luaは[[]]で文字列を囲むことでバックスラッシュも解決するのだ〜ハハハハ

...
tex.print([[Hello, \LaTeX]])
...

! Undefined control seq ファーーーック 慈悲はない。

解決法

...
tex.print(\asluastring{Hello, \LaTeX})
...

ltj{,s}articleには\asluastringというLaTeXコマンドがあり、良い感じになってくれる。

もうちょっと良い感じの例

\documentclass{ltjsarticle}

\directlua{
    tex.print(
        \asluastring{\begin{document}} ..
        \asluastring{Lua\LaTeX} ..
        \asluastring{\end{document}}
    )
}
LuaLaTeX

プレアンブルでも\directluaは使うことができ、こういった悲劇を編み出すことも可能(全然良い感じじゃないんだよなぁ…)

しかしtex.printを2個使って\begin{document}\end{document}を、環境を分けることができない。うーん、tex.printで環境をネストさせたい時は滅茶苦茶にキモくなるので、 ~~こういうことはやめておこう~~環境の中身は適当な変数に突っ込むべきだろう。

一気に話が飛んでしまった。{\texttt hoge}みたいなことをしたいときはどうするか。

...
tex.print("{" .. \asluastring{\texttt} .. "fuck}")
...

こんな感じにすることで漏れを防ぐ。\asluastring{\texttt{}みたいな感じにするとコンパイルエラーになるので注意。

luatexja-presetにdeluxeオプションを渡すと編集中のtexファイルとは無関係そうな場所を指摘され、なんだか腹が立つ。これはluatexja-fontspecのバグで、こちらを参照。これはtexluaとあまり関係はないですね、はい。

他2

LuaLaTeXはコンパイル時にTwitterのタイムラインを取得できる数少ないLaTeX処理系なので好きですよ。


今期は単位がいっぱい取れそうな予感。


  1. (jekyll + redcarpetでは意図通り2^iが出ませんね💢) (追記2015/06/04:と思ったけどMatJax使えるじゃねーか。ごめんなさい。)