最終更新:2017-08-17 (木) 14:42:20 (3d)

LuaLaTeX

LaTeX 原稿から 直接 PDF を作成するためのプログラム。

LuaTeX-ja, BXjscls, jlreq などを使用すれば日本語の組版も実現可能。

Benchmark

Issues

Usage

luaffi

以下の LaTeX 文書は Windows 環境でのみ動作する

実行するには -shell-escape オプションが必要

\documentclass{minimal}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
  local ffi = require("ffi")
  ffi.cdef[[
    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(void* window, const wchar_t* text, const wchar_t* caption, int type);
  ]]
  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 LuaLaTeXing|LuajitLaTeXing!"), toWide("LuaLaTeX|LuajitLaTeX"), 0)
\end{luacode*}
\end{document}