LuaTeX C API 作为 Lua C API

LuaTeX C API 作为 Lua C API

我正在为 LuaLaTeX 编写一个 Lua 模块。

LuaTeX C API 存在吗?

例如,如何将 C 版本的 tex.print 运用到我的 C 代码中?

提前致谢

答案1

我绝对是可以给你权威答案的人。正如我在给 David 的评论中所写,没有办法将 TeX 用作(共享)库。但你可以使用 LuaTeX 加载模块并执行 LuaTeX 的功能。

假设你想调用texio.write_nl("Hello world!")。你必须编写一个小的 C 程序来执行此操作:

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>


static int callprint (lua_State *L)
{
    lua_getglobal(L, "texio");
    lua_getfield(L, -1, "write_nl");
    lua_remove(L, -2);
    lua_pushstring(L, "Hello, world!");
    lua_call(L, 1, 0);
    return 0;
}


int luaopen_printfromc(lua_State *L) {
  struct luaL_Reg myfuncs[] = {
    {"callprint", callprint},
    {NULL, NULL},
  };
  lua_newtable (L);
  luaL_setfuncs (L, myfuncs, 0);
  return 1;
}

然后您可以将其编译为共享库,在我的 Mac 上它是:

cc -c  printfromc.c -I /opt/homebrew/Cellar/lua/5.2.4_1/include/
cc -flat_namespace -bundle -undefined suppress -o printfromc.so  printfromc.o 

(在 Debian GNU/Linux 及其衍生产品上,以下内容应该适用于 TeX Live 2021:

gcc -o printfromc.so -shared -fpic  printfromc.c -I/usr/include/lua5.3/ -llua5.3

并将结果复制到 TeX 目录

cp printfromc.so /some/path/to/TeX/luatex/test

您可以从 TeX 源加载此库:

\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
x = require("printfromc")
x.callprint()

\end{luacode*}
\end{document}

答案2

理论上你可以(尽管在 texlive 支持的所有平台上工作很棘手)查看 TeXlive 2016 之前的 FFI 模块,它需要 luajittex 而不是 luatex,但在 texlive 2017 预发布版中有一些支持与 luatex 一起使用。

另外,还有 swig 库作为替代链接机制。

ffi 和 swig 的链接

http://www.luatex.org/svn/trunk/source/libs/luajit/LuaJIT-src/doc/ext_ffi_semantics.html

http://www.luatex.org/swiglib.html

相关内容