我有一个 Lua 函数可以生成 LaTeX 内容(包含 LaTeX 命令的字符串,如"\\textbf{foo}"
),并且可以使用\lua_now:n
和成功输出tex.print()
。现在我打算记录内容以进行l3build
回归测试,我尝试将内容传递给标记列表,然后使用 将其写入日志文件\tl_show:N
。但是以下代码引发错误:Illegal parameter number in definition of \l__csl_bibliography_tl
。还有其他方法吗?
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function make_bibliography()
local result = "\\textbf{Foo}"
tex.print(result)
end
\end{luacode*}
\ExplSyntaxOn
\tl_new:N \l__csl_bibliography_tl
\cs_new:Npn \printbibliography
{
% \lua_now:n { make_bibliography() } % It works fine.
\tl_set:Nx \l__csl_bibliography_tl { \lua_now:n { make_bibliography() } }
\tl_show:N \l__csl_bibliography_tl
\tl_use:N \l__csl_bibliography_tl
}
\ExplSyntaxOff
\begin{document}
\printbibliography
\end{document}
答案1
您可以从 Lua 设置 tl (宏):
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function make_bibliography()
local result = "\\textbf{Foo}"
token.set_macro("l__csl_bibliography_tl",result)
end
\end{luacode*}
\ExplSyntaxOn
\tl_new:N \l__csl_bibliography_tl
\cs_new:Npn \printbibliography
{
\lua_now:n{ make_bibliography() }
\tl_show:N \l__csl_bibliography_tl
\tl_use:N \l__csl_bibliography_tl
}
\ExplSyntaxOff
\begin{document}
\printbibliography
\end{document}
请注意,token.set_macro
不处理结果包含字符~
且 catcode~
当前处于活动状态的情况。
还有使用的任何控制序列(例如\textbf
此处)必须已存在于哈希表中。请参阅lua 中的波浪线 ~ 添加了一行对此进行一些讨论。
答案2
问题是\textbf
无法在x
-expansion 中生存。你可以用 包装有问题的构造\text_expand:n
:
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function make_bibliography()
local result = "\\textbf{Foo}"
tex.print(result)
end
\end{luacode*}
\ExplSyntaxOn
\tl_new:N \l__csl_bibliography_tl
\cs_new:Npn \printbibliography
{
\tl_set:Nx \l__csl_bibliography_tl { \text_expand:n { \lua_now:n { make_bibliography() } } }
\tl_show:N \l__csl_bibliography_tl
\tl_use:N \l__csl_bibliography_tl
}
\ExplSyntaxOff
\begin{document}
\printbibliography
\end{document}
在控制台中你会看到
> \l__csl_bibliography_tl=\textbf {Foo}.
输出为