LuajitTeX は LuaTeX で使用されている Lua を LuaJIT に置き換えたものです. JIT とは Just-In-Time Compiler,つまりその場で機械語へのコンパイルを行うという意味であり,これによりインタプリタ方式の通常の Lua よりも高速な動作が期待できます.
上のように現在では LuaTeX と共通のソースとなっています.
TeX Live 2020 には LuajitTeX 1.12.0, LuajitHBTeX 1.12.0 が収録されています。
TeX Live Revision 52828,W32TeX [2019/11/18] で LuajitLaTeX が削除されました。
TeX Live 2019 には LuajitTeX 1.10.0 が収録されています。
TeX Live 2018 には LuajitTeX 1.07.0 が収録されています。
TeX Live 2020 には LuaJIT 2.1.0-beta3 が収録されています。
TeX Live 2019 には LuaJIT 2.1.0-beta3 が収録されています。
TeX Live 2018 には LuaJIT 2.1.0-beta3 が収録されています。
LuajitTeX は Windows, macOS, Linux, *BSD で動作します。
LuajitTeX は TeX Live がサポートしている全ての環境で提供されているわけではありません。
x86_64-solaris では LuajitTeX は提供されていないのでこれらの環境を使用している場合は LuaTeX を使用してください。
TeX Live, W32TeX に含まれています. LuaTeX-ja は LuajitTeX にも対応しています.
基本的には通常の LuaTeX と同様に使うことができます.
LuajitTeX では,LuaJIT の追加機能である FFI library を使って簡単に C の関数を呼び出すことができます. LuaTeX でも Version 1.0.3 以降は FFI が使えます. LuaTeX では FFI が大域的なので
local ffi = require("ffi")
は不要です. LuaTeX や LuajitTeX には secure mode は無いと思っておいたほうが 良いそうですが,FFI は特に簡単に危ないことができるので,最新の場合には LuaTeX でも LuajitTeX でも
--shell-escape
オプションを使用しないと使用不可になっています.
LuajitTeX は MessageBox などの Windows API を呼び出すことが可能です.
■ MessageBoxA を使用する場合
\documentclass{article} \usepackage{luacode} \begin{document} \begin{luacode*} local ffi = require("ffi") ffi.cdef[[ typedef void* HANDLE; typedef HANDLE HWND; typedef unsigned int UINT; typedef const char* LPCSTR; int MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); ]] ffi.C.MessageBoxA(nil, "Happy LuajitLaTeXing!", "LuajitTeX", 0) \end{luacode*} \end{document}
■ MessageBoxW を使用する場合
\documentclass{article} \usepackage{luacode} \begin{document} \begin{luacode*} local ffi = require("ffi") ffi.cdef[[ typedef void* HANDLE; typedef HANDLE HWND; typedef unsigned int UINT; typedef unsigned short WORD; typedef unsigned long DWORD; typedef const char* LPCSTR; typedef wchar_t* LPWSTR; typedef const wchar_t* LPCWSTR; enum{ CP_UTF8 = 65001 }; int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar); int MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); ]] local kernel32 = ffi.load("kernel32") local user32 = ffi.load("user32") local function toWide(str) local size = kernel32.MultiByteToWideChar(ffi.C.CP_UTF8, 0, str, str:len(), nil, 0) local buffer = ffi.new("wchar_t[?]", size + 1) ffi.fill(buffer, (size + 1) * ffi.sizeof("wchar_t"), 0) if kernel32.MultiByteToWideChar(ffi.C.CP_UTF8, 0, str, str:len(), buffer, size) ~= size then return nil end return buffer end user32.MessageBoxW(nil, toWide("Happy LuajitLaTeXing!"), toWide("LuajitTeX"), 0) \end{luacode*} \end{document}
GPLv3, GPLv2