我正在为 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