在 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}