将空格从 expl3 传递给 Lua 的最佳做法是什么?

将空格从 expl3 传递给 Lua 的最佳做法是什么?

在 LuaTeX 中,使用\directlua原语(在标准 LaTeX2e 设置中)

\directlua{tex.print("Hello World!")}

将在输出 PDF 中生成“Hello World!”。

另一方面,在 expl3 代码中

\ExplSyntaxOn
\lua_now:e { tex.print("Hello~World!") }
\ExplSyntaxOff

将“HelloWorld!”(Hello和之间没有空格World!)留在输入流中。

从 expl3 代码将空格传递给 Lua 解释器的最佳做法是什么?

答案1

通常,我们建议将 Lua 块与(或实际上是标准 LaTeX)代码分开定义expl3,这样只需使用 即可加载它们require()。如果您确实想在 '内部' 插入一小段 Lua expl3,则使用~是正确的操作。但是,当您使用tex.print或类似方法将标记返回给 TeX 时,LuaTeX 会使用现行的 catcode 制度。因此,您的空间将被忽略。但是,有一个可选参数,tex.print()它接受类别代码表编号:这可用于应用任何喜欢的 catcode 设置。

目前,我们正在完成类别代码表支持expl3。“Lua 端”可能还不太合适,但它是可行的:

\documentclass{article}
\usepackage{expl3}
\usepackage{l3cctab}
\begin{document}
\ExplSyntaxOn
\lua_now:e { tex.print(\int_use:N \c_document_cctab, "Hello~World!") }
\ExplSyntaxOn
\end{document}

(最终l3cctab将成为expl3核心的一部分。)

目前,LaTeX 支持类别代码表通过 ltluatex:你可以l3cctab完全避免加载:

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\makeatletter
\lua_now:e { tex.print(\number\catcodetable@latex, "Hello~World!") }
\makeatother
\ExplSyntaxOn
\end{document}

答案2

正如约瑟夫所说,默认tex.print情况下将按此时的 catcode 当前进行标记,因此,~您可以使用 catcode 制度进行打印,而不是先留出空格,然后使用正常的 catcode 制度进行打印,expl3这意味着您需要打印,~因此需要避免~在将其传递给 Lua 时被标记为空格:

\documentclass{article}
\usepackage{expl3}

\begin{document}
\ExplSyntaxOn
\lua_now:e { tex.print("Hello \c_tilde_str World!") }
\ExplSyntaxOn
\end{document}

相关内容