如何将 Lua 函数的内容传递给 LaTeX3 标记列表 (tl)?

如何将 Lua 函数的内容传递给 LaTeX3 标记列表 (tl)?

我有一个 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}.

输出为

在此处输入图片描述

相关内容