LuajitTeX

LuajitTeX は LuaTeX で使用されている LuaLuaJIT に置き換えたものです. JIT とは Just-In-Time Compiler,つまりその場で機械語へのコンパイルを行うという意味であり,これによりインタプリタ方式の通常の Lua よりも高速な動作が期待できます.

上のように現在では LuaTeX と共通のソースとなっています.



お知らせ

TeX Live 2024 には LuajitHBTeX 1.18.0, LuajitTeX 1.18.0 が収録されています。

TeX Live 2023 Revision 66967, Revision 66994 には LuajitHBTeX 1.17.0, LuajitTeX 1.17.0 が収録されています。

TeX Live 2023 初回リリース版には LuajitHBTeX 1.16.0, LuajitTeX 1.16.0 が収録されています。

TeX Live 2022 には LuajitHBTeX 1.15.0, LuajitTeX 1.15.0 が収録されています。

TeX Live 2021 には LuajitHBTeX 1.13.2, LuajitTeX 1.13.2 が収録されています。

TeX Live 2020 には LuajitHBTeX 1.12.0, LuajitTeX 1.12.0 が収録されています。

TeX Live Revision 52828 で LuajitLaTeX が削除されました。

TeX Live 2019 には LuajitTeX 1.10.0 が収録されています。

TeX Live 2018 には LuajitTeX 1.07.0 が収録されています。

内蔵 LuaJIT 処理系のバージョン

TeX Live 2024 には LuaJIT 2.1.0-beta3 が収録されています。

TeX Live 2023 には LuaJIT 2.1.0-beta3 が収録されています。

TeX Live 2022 には LuaJIT 2.1.0-beta3 が収録されています。

TeX Live 2021 には LuaJIT 2.1.0-beta3 が収録されています。

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 に含まれています. 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

オプションを使用しないと使用不可になっています.

Windows

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}

関連リンク

License

GPLv3, GPLv2

ChangeLog

LuaTeX#changelog


Last-modified: 2024-03-16 (土) 23:26:36 (34d)