我第一次尝试使用 LuaLaTex 时遇到了一些麻烦,试图从 LuaLaTex 内部生成 LaTex 代码。这需要我打印反斜杠(以获取 LaTeX 控制序列)。我想我现在找到了一个解决方案,但也许这也会引起其他人的兴趣,所以我还是尝试将其作为问题发布在这里。
(另请参阅以下问题在 LuaTeX 中打印 LaTeX 代码和如何在 LaTeX 中插入反斜杠或波浪号?)
软件包文档的luacode
第 2 页写道:
luacode* 变体更进一步,甚至将反斜杠也变成了普通字符
考虑以下代码:
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode*}
tex.sprint("\");
\end{luacode*}
\end{document}
编译这个lualatex
给出错误
! LuaTeX error <\directlua >:1: unfinished string near '"");'.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }
然后我想我只需要添加另一个反斜杠来转义第一个:
tex.sprint("\\");
但现在我收到了错误:
! Undefined control sequence.
l.1
答案1
问题在于其中涉及 3 个解释阶段。
- 第一次宏扩展(由于环境原因,在我的例子中避免了这一点
luacode*
) - 然后 Lua 解释结果字符串,其中反斜杠是转义字符
- 最后,LaTex 再次解释 Lua 打印的内容。
我忘记了最后阶段。所以解决方案是:
tex.sprint("$\\backslash$");
或者
tex.sprint("\\textbackslash");
答案2
如果你想要真实的反斜杠,您可以使用:
\documentclass{article}
\usepackage{luacode}
\usepackage{fontspec}
\setmainfont{TeX Gyre Termes}
\begin{document}
\begin{luacode*}
tex.print(-2, "\\");
\end{luacode*}
\end{document}
在 LuaTeX 参考中:
tex.print(<number> n, <string> s, ...)
如果
n
为 -2,则得到的类别代码为\the\toks
:除空格字符(类别代码为 10(空格))外,所有类别代码均为 12(其他)。