我想实现一个宏,它允许我给出两个参数,并看到这两个参数保存在表中的外部文件“data_file.lua”中,类似于 data[key] = value。
谢谢
答案1
这将写入一个名为的文件outfile.lua
:
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
function myluacmd(k,v)
-- see comment section below for discussion of "w"
local out,err = io.open("outfile.lua","w")
if out then
out:write(string.format("data[%q] = %q\n",k,v))
out:close()
else
-- somehow this never prints anything...why?
print("Error:",err)
end
end
\end{luacode*}
\newcommand\mycmd[2]{%
\luadirect{myluacmd(\luastringN{#1},\luastringN{#2})}
}
\mycmd{first}{second}
\end{document}
其内容如下:
data["first"] = "second"
答案2
ConTeXt 为我们提供了很多很好的工具,其中一些在 LuaLaTeX 中也可用。要将 Lua 表序列化为文件,以便可以使用 再次在 Lua 中加载它dofile
,可以使用 函数table.tofile(filename,root,name,specification)
。参数name
和specification
是可选的,但您需要设置name
,否则默认名称将为t
。
在以下示例中,我们检查文件是否\jobname.lua
存在,如果存在,则使用 加载它dofile
。接下来,如果尚未初始化表,我们将初始化表store
。命令\setvalue
和\getvalue
对底层 Lua 表执行预期操作。要将文件写入文档末尾,我们table.tofile
调用\AtEndDocument
。
目前的实现作为 Lua 中的多通道数据,类似于标准 LaTeX.aux
文件。
\documentclass{article}
\IfFileExists{\jobname.lua}{%
\directlua{dofile("\jobname.lua")}%
}
\directlua{store = store or {}}
\newcommand\setvalue[2]{%
\directlua{
store["\luaescapestring{\unexpanded{#1}}"] =
"\luaescapestring{\unexpanded{#2}}"
}%
}
\newcommand\getvalue[1]{%
\directlua{
tex.sprint(store["\luaescapestring{\unexpanded{#1}}"])
}%
}
\AtEndDocument{%
\directlua{
table.tofile("\jobname.lua", store, "store")
}%
}
\begin{document}
\setvalue{test}{\section{abc}}
\getvalue{test}
\end{document}