LuajitTeX

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

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



お知らせ

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

動作環境

LuajitTeX は Windows, macOS, Linux, *BSD で動作します。

LuajitTeX は TeX Live がサポートしている全ての環境で提供されているわけではありません。

sparc-solarisx86_64-solaris では LuajitTeX は提供されていないのでこれらの環境を使用している場合は LuaTeX を使用してください。

インストール

TeX Live, W32TeX に含まれています. LuaTeX-ja は LuajitTeX にも対応しています.

TeX Live の場合

TeX Live をインストールした状態では、luajittex は使えますが、luajitlatex を使用するためには、以下のような手順で設定を行う必要があります。

  1. kpsewhich fmtutil.cnf で fmtutil.cnf の path を探す。
  2. fmtutil.cnf をエディタで開き、luajitlatex を検索。該当行の行頭は #! でコメントアウトされているので、これを消して行を有効にする。
  3. fmtutil-sys --byfmt luajitlatex を実行。
  4. luajittex --fmt=luajitlatex.fmt foo.tex で latex として使用可。

Windows の場合は、この設定を行うことで luajitlatex.exe が使用できるようになります。Unix 系 OS(macOS を含む)の場合は、~/.bashrc 等に、

   alias luajitlatex='luajittex --fmt=luajitlatex.fmt'

を追加して alias として設定するとよいでしょう。

使い方

基本的には通常の 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: 2018-04-15 (日) 15:22:48 (239d)