LuaLaTeX:定义一个将数据存储到外部文件的宏

LuaLaTeX:定义一个将数据存储到外部文件的宏

我想实现一个宏,它允许我给出两个参数,并看到这两个参数保存在表中的外部文件“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)。参数namespecification是可选的,但您需要设置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}

相关内容